From 6d82d04a498a7c8a74a04f6b59c623eb3c2d69b7 Mon Sep 17 00:00:00 2001 From: bellard Date: Tue, 26 Apr 2005 21:02:48 +0000 Subject: [PATCH] proll update: IDE HDD/CD support (Blue Swirl) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1405 c046a42c-6fe2-441c-8c8c-71466251a162 --- pc-bios/proll.elf | Bin 137898 -> 152807 bytes pc-bios/proll.patch | 889 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 792 insertions(+), 97 deletions(-) diff --git a/pc-bios/proll.elf b/pc-bios/proll.elf index ac93c4be99f27c2336eea62a50121d196beb6d38..f6198f4d60c4e1e47f5ac8f371b5a0c5a6ca9196 100644 GIT binary patch delta 51295 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 diff --git a/pc-bios/proll.patch b/pc-bios/proll.patch index e72e0e45e34..fb215a0c611 100644 --- a/pc-bios/proll.patch +++ b/pc-bios/proll.patch @@ -1,6 +1,6 @@ -diff -ruN proll_18.orig/Makefile proll-patch8/Makefile +diff -ruN proll_18.orig/Makefile proll-patch10/Makefile --- proll_18.orig/Makefile 2002-09-13 14:16:59.000000000 +0000 -+++ proll-patch8/Makefile 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/Makefile 2004-11-13 15:50:49.000000000 +0000 @@ -4,6 +4,7 @@ make -C krups-ser all make -C espresso all @@ -14,14 +14,14 @@ diff -ruN proll_18.orig/Makefile proll-patch8/Makefile make -C espresso clean make -C espresso-ser clean + make -C qemu clean -diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +diff -ruN proll_18.orig/qemu/Makefile proll-patch10/qemu/Makefile --- proll_18.orig/qemu/Makefile 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/Makefile 2005-03-02 16:41:50.000000000 +0000 -@@ -0,0 +1,122 @@ ++++ proll-patch10/qemu/Makefile 2005-04-12 14:42:23.000000000 +0000 +@@ -0,0 +1,123 @@ +# +# proll: +# qemu/Makefile - make PROLL for QEMU -+# $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $ ++# $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $ +# +# Copyright 1999 Pete Zaitcev +# This is Free Software is licensed under terms of GNU General Public License. @@ -47,8 +47,8 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +# want to shift it to form a PGD entry. A relocatable label will not work. +# Linux kernel expects us to be at LINUX_OPPROM_BEGVM . +PROLBASE = 0xffd00000 -+PROLRODATA = 0xffd07000 -+PROLDATA = 0xffd09000 ++PROLRODATA = 0xffd08000 ++PROLDATA = 0xffd0b000 +PROLSIZE = 240*1024 + +# Linux @@ -68,7 +68,7 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile +OBJS = head.o wuf.o wof.o main.o $(CONSOLE) \ + printf.o le.o system_qemu.o iommu.o \ + arp.o netinit.o bootp.o packet.o tftp.o udp.o sched_4m.o openprom.o \ -+ vconsole.o hconsole.o rconsole.o vcons_zs.o ++ vconsole.o hconsole.o rconsole.o vcons_zs.o esp.o + +all: $(ALL) + @@ -106,7 +106,8 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +le.o: $(SRC)/le.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/netpriv.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/net.h $(SRC)/phys_jj.h + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c -+ ++esp.o: $(SRC)/esp.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/phys_jj.h ++ $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +arp.o: $(SRC)/arp.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c +netinit.o: $(SRC)/netinit.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h $(SRC)/ip.h $(SRC)/udp.h @@ -140,9 +141,9 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile + +proll.aout: $(PROLLEXE) + $(ELFTOAOUT) -o proll.aout $(PROLLEXE) -diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S +diff -ruN proll_18.orig/qemu/head.S proll-patch10/qemu/head.S --- proll_18.orig/qemu/head.S 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/head.S 2005-03-02 15:30:47.000000000 +0000 ++++ proll-patch10/qemu/head.S 2005-03-02 15:30:47.000000000 +0000 @@ -0,0 +1,539 @@ +/** + ** Standalone startup code for Linux PROM emulator. @@ -150,7 +151,7 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S + ** This code is licensed under GNU General Public License. + **/ +/* -+ * $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $ ++ * $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $ + */ + +#include @@ -683,10 +684,10 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S +C_LABEL(ldb_bypass): + retl + lduba [%o0] ASI_M_BYPASS, %o0 -diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +diff -ruN proll_18.orig/qemu/main.c proll-patch10/qemu/main.c --- proll_18.orig/qemu/main.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/main.c 2005-04-03 11:58:46.000000000 +0000 -@@ -0,0 +1,173 @@ ++++ proll-patch10/qemu/main.c 2005-04-16 18:03:23.000000000 +0000 +@@ -0,0 +1,185 @@ +/** + ** Proll (PROM replacement) + ** Copyright 1999 Pete Zaitcev @@ -711,7 +712,9 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +void *init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, const char *cmdline, char boot_device, int nographic); +int vcon_zs_init(struct vconterm *t, unsigned int a0); +int vcon_zs_write(struct vconterm *t, char *data, int leng); -+ ++int vcon_zs_getch(struct vconterm *t); ++void esp_probe(); ++int esp_boot(int unit); +static void init_idprom(void); + +struct vconterm dp0; @@ -733,7 +736,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c +} *hw_idprom; + +int ignore_fault, fault_ignored; -+void *printk_fn; ++void *printk_fn, *getch_fn; +unsigned int q_height, q_width; + +/* @@ -745,7 +748,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + unsigned int hiphybas; + const void *romvec; + unsigned int ram_size; -+ char nographic; ++ char nographic, bootdev; + + nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F); + if (!nographic) { @@ -753,10 +756,12 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + q_height = ldh_bypass(PHYS_JJ_EEPROM + 0x56); + vcon_init(&dp0, PHYS_JJ_TCX_FB); + printk_fn = vcon_write; ++ getch_fn = vcon_getch; + } + else { + vcon_zs_init(&dp0, 0x71100004); + printk_fn = vcon_zs_write; ++ getch_fn = vcon_zs_getch; + } + + @@ -790,9 +795,13 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + sched_init(); + le_probe(); + init_net(); ++ esp_probe(); + -+ printk("Boot device: %c\n", hw_idprom->boot_device); -+ if (hw_idprom->boot_device == 'n') { ++ bootdev = hw_idprom->boot_device; ++ printk("Boot device: %c\n", bootdev); ++ if (hw_idprom->kernel_size > 0) { ++ printk("Kernel already loaded\n"); ++ } else if (bootdev == 'n') { + if (bootp() != 0) fatal(); + /* + * boot_rec.bp_file cannot be used because system PROM @@ -809,6 +818,10 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + fname[14] = 0; + + if (load(boot_rec.bp_siaddr, fname) != 0) fatal(); ++ } else if (bootdev == 'c') { ++ if (esp_boot(0) != 0) fatal(); ++ } else if (bootdev == 'd') { ++ if (esp_boot(2) != 0) fatal(); + } + + romvec = init_openprom_qemu(bb.nbanks, bb.bankv, hiphybas, @@ -860,10 +873,10 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c + hw_idprom = va_prom; +} + -diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c +diff -ruN proll_18.orig/qemu/openprom.c proll-patch10/qemu/openprom.c --- proll_18.orig/qemu/openprom.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/openprom.c 2005-04-06 16:53:31.000000000 +0000 -@@ -0,0 +1,665 @@ ++++ proll-patch10/qemu/openprom.c 2005-04-16 17:30:19.000000000 +0000 +@@ -0,0 +1,741 @@ +/* + * PROM interface support + * Copyright 1996 The Australian National University. @@ -882,6 +895,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + +//#define DEBUG_OBP + ++#define PAGE_SIZE 4096 ++ +struct property { + const char *name; + const char *value; @@ -1275,6 +1290,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c +static int obp_devopen(char *str); +static int obp_devclose(int dev_desc); +static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf); ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size); ++static void obp_dumb_munmap(char *va, unsigned int size); + +static void doublewalk(unsigned ptab1, unsigned va) +{ @@ -1353,20 +1370,34 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + romvec0.pv_nbgetchar = obp_nbgetchar; + romvec0.pv_nbputchar = obp_nbputchar; + romvec0.pv_reboot = obp_reboot; ++ romvec0.pv_printf = (void (*)(const char *fmt, ...))printk; + romvec0.pv_abort = obp_abort; + romvec0.pv_halt = obp_halt; + romvec0.pv_synchook = &synch_hook; + romvec0.pv_v0bootargs = &obp_argp; ++ romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap; ++ romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap; ++ obp_arg.boot_dev_ctrl = 0; ++ obp_arg.boot_dev_unit = '0'; + switch(boot_device) { + default: + case 'a': + obp_arg.argv[0] = "fd()"; ++ obp_arg.boot_dev[0] = 'f'; ++ obp_arg.boot_dev[1] = 'd'; + break; ++ case 'd': ++ obp_arg.boot_dev_unit = '2'; ++ // Fall through + case 'c': + obp_arg.argv[0] = "sd()"; ++ obp_arg.boot_dev[0] = 's'; ++ obp_arg.boot_dev[1] = 'd'; + break; + case 'n': + obp_arg.argv[0] = "le()"; ++ obp_arg.boot_dev[0] = 'l'; ++ obp_arg.boot_dev[1] = 'e'; + break; + } + obp_arg.argv[1] = cmdline; @@ -1483,9 +1514,11 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + return (const char *)-1; +} + ++extern int (*getch_fn)(struct vconterm *v); ++ +static int obp_nbgetchar(void) { + extern struct vconterm dp0; -+ return vcon_getch(&dp0); ++ return getch_fn(&dp0); +} + +static int obp_nbputchar(int ch) { @@ -1507,32 +1540,88 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c + printk("halt, freezing\n"); + for (;;) {} +} -+ ++#define isnum(c) ((c >= '0') && (c < '9')) ++#define ctoi(c) (c - '0') +static int obp_devopen(char *str) { +#ifdef DEBUG_OBP -+ printk("open %s\n", str); ++ printk("obp_devopen(%s)\n", str); +#endif ++ if (str[0] == 's' && str[1] == 'd' && str[4] == ',') { ++ unsigned int target; ++ ++ if (str[5] < 7) ++ target = str[5]; ++ else if (isnum(str[6]) && isnum(str[5])) { ++ target = (ctoi(str[5]) * 10 + ctoi(str[6])) & 7; ++ } ++ else { ++ target = ctoi(str[5]) & 7; ++ } ++ return 's' + target; ++ } + return 0; +} + +static int obp_devclose(int dev_desc) { +#ifdef DEBUG_OBP -+ printk("close %d\n", dev_desc); ++ printk("obp_devclose %d\n", dev_desc); +#endif + return 0; +} + -+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf) { ++extern void *esp_read(int unit, int offset, short len); ++ ++static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf) ++{ ++ unsigned int i; ++ void *src; ++ +#ifdef DEBUG_OBP -+ printk("rdblkdev: fd %d, num_blks %d, blk_st %d, buf 0x%x\n", dev_desc, num_blks, blk_st, buf); ++ printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf); +#endif -+ //buf[8] = 'L'; -+ return num_blks; ++ if (dev_desc >= 's' && dev_desc < 'v') { ++ for(i = 0; i < num_blks; i++) { ++ src = esp_read(dev_desc - 's', offset + i, 1); ++ memcpy(&buf[i << 9], src, 512); ++ } ++ return num_blks; ++ } ++ return -1; +} -diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c ++ ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size) ++{ ++ unsigned int npages; ++ unsigned int off; ++ unsigned int mva; ++ ++#ifdef DEBUG_OBP ++ printk("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size); ++#endif ++ off = pa & (PAGE_SIZE-1); ++ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE; ++ pa &= ~(PAGE_SIZE-1); ++ ++ mva = (unsigned int) va; ++ while (npages-- != 0) { ++ map_page(pmem.pl1, mva, pa, 1, pmem.pbas); ++ mva += PAGE_SIZE; ++ pa += PAGE_SIZE; ++ } ++ return va; ++} ++ ++static void obp_dumb_munmap(char *va, unsigned int size) ++{ ++#ifdef DEBUG_OBP ++ printk("obp_dumb_munmap: virta %x, sz %d\n", va, size); ++#endif ++ ++} +diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch10/qemu/system_qemu.c --- proll_18.orig/qemu/system_qemu.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/qemu/system_qemu.c 2005-03-02 16:10:20.000000000 +0000 -@@ -0,0 +1,416 @@ ++++ proll-patch10/qemu/system_qemu.c 2005-04-16 06:16:20.000000000 +0000 +@@ -0,0 +1,430 @@ +/** + ** Proll (PROM replacement) + ** system.c: shared miscallenea. @@ -1859,19 +1948,30 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c +{ + char *p; + -+ if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size); ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); + return p; +} + +/* + * Library functions + */ -+void bzero(void *s, int len) { -+ while (len--) *((char *)s)++ = 0; ++void *memset(void *s, int c, size_t len) ++{ ++ void *p = s; ++ ++ while (len--) { ++ *(char *)s = c; ++ s++; ++ } ++ return p; +} + +void bcopy(const void *f, void *t, int len) { -+ while (len--) *((char *)t)++ = *((char *)f)++; ++ while (len--) { ++ *(char *)t = *(char *)f; ++ f++; ++ t++; ++ } +} + +/* Comparison is 7-bit */ @@ -1881,8 +1981,11 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c + char ch; + + while (len--) { -+ ch = *((char *)s1)++; -+ if ((i = ch - *((char *)s2)++) != 0) ++ ch = *(char *)s1; ++ i = ch - *(char *)s2; ++ s1++; ++ s2++; ++ if (i != 0) + return i; + if (ch == 0) + return 0; @@ -1949,9 +2052,9 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c + n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24); + st_bypass(ptr, n); +}; -diff -ruN proll_18.orig/src/arp.c proll-patch8/src/arp.c +diff -ruN proll_18.orig/src/arp.c proll-patch10/src/arp.c --- proll_18.orig/src/arp.c 2001-12-24 05:12:31.000000000 +0000 -+++ proll-patch8/src/arp.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/arp.c 2004-11-13 15:50:49.000000000 +0000 @@ -45,7 +45,7 @@ #endif static struct arp_cache arp_list[ARPNUM]; /* ARP address cache */ @@ -1986,9 +2089,9 @@ diff -ruN proll_18.orig/src/arp.c proll-patch8/src/arp.c + def_gw = IP_ANY; return(TRUE); } -diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h +diff -ruN proll_18.orig/src/arp.h proll-patch10/src/arp.h --- proll_18.orig/src/arp.h 1999-03-18 03:39:43.000000000 +0000 -+++ proll-patch8/src/arp.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/arp.h 2004-11-13 15:50:49.000000000 +0000 @@ -104,7 +104,7 @@ extern int init_arp __P((void)); @@ -1998,9 +2101,265 @@ diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h /* Add a new antry to the ARP cache */ extern void addcache __P((unsigned char *ha, t_ipaddr ip)); -diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c +diff -ruN proll_18.orig/src/esp.c proll-patch10/src/esp.c +--- proll_18.orig/src/esp.c 1970-01-01 00:00:00.000000000 +0000 ++++ proll-patch10/src/esp.c 2005-04-16 06:24:23.000000000 +0000 +@@ -0,0 +1,252 @@ ++#include /* == */ ++#include /* __P for netpriv.h */ ++#include /* dmaga */ ++#include ++ ++#define PHYS_JJ_ESPDMA 0x78400000 /* ESP DMA controller */ ++#define PHYS_JJ_ESP 0x78800000 /* ESP SCSI */ ++#define PHYS_JJ_ESP_IRQ 4 ++#define BUFSIZE 4096 ++/* ++ * XXX Crude ++ */ ++struct esp_dma { ++ struct sparc_dma_registers *regs; ++ enum dvma_rev revision; ++}; ++ ++struct esp_regs { ++ unsigned int regs[16]; ++}; ++ ++struct esp_private { ++ int active; /* initialized */ ++ int inst; /* iface number */ ++ ++ volatile struct esp_regs *ll; ++ __u32 buffer_dvma; ++ unsigned int irq; /* device IRQ number */ ++ int interrupt; ++ ++ struct esp_dma *espdma; /* If set this points to espdma */ ++ ++ unsigned char *buffer; ++}; ++ ++static void esp_interrupt(void *dev_id) ++{ ++ struct esp_private *lp = (struct esp_private *)dev_id; ++ ++ lp->interrupt = 1; ++ /* Acknowledge all the interrupt sources ASAP */ ++ ++ lp->interrupt = 0; ++} ++ ++static int esp_open (void *dev) ++{ ++ struct esp_private *lp = (struct esp_private *)dev; ++ int status = 0; ++ ++ if (request_irq(lp->irq, &esp_interrupt, (void *)dev)) { ++ printk ("Esp: Can't get irq %d\n", lp->irq); ++ return -1; ++ } ++ ++ /* On the 4m, setup the espdma to provide the upper bits for buffers */ ++ if (lp->espdma) ++ lp->espdma->regs->dma_test = ((__u32) lp->buffer_dvma) & 0xff000000; ++ ++ return status; ++} ++ ++static int esp_close (void *dev) ++{ ++ struct esp_private *lp = (struct esp_private *)dev; ++ ++ free_irq (lp->irq, (void *) dev); ++ return 0; ++} ++ ++static int ++esp_init(struct esp_private *esp, struct esp_dma *espdma, int irq) ++{ ++ volatile struct esp_regs *ll; ++ ++ /* Get the IO region */ ++ ll = map_io(PHYS_JJ_ESP, sizeof (struct esp_regs)); ++ if (ll == 0) return -1; ++ ++ esp->buffer = dvma_alloc(BUFSIZE, &esp->buffer_dvma); ++ esp->ll = ll; ++ esp->espdma = espdma; ++ esp->irq = irq; ++ ++ // Chip reset ++ stb_bypass((int)ll + 3*2, 2); ++ return 0; ++} ++ ++static int espdma_init(struct esp_dma *espdma) ++{ ++ void *p; ++ ++ /* Hardcode everything for MrCoffee. */ ++ if ((p = map_io(PHYS_JJ_ESPDMA, 0x10)) == 0) { ++ printk("espdma_init: cannot map registers\n"); ++ return -1; ++ } ++ espdma->regs = p; ++ ++ printk("dma1: "); ++ ++ switch((espdma->regs->cond_reg)&DMA_DEVICE_ID) { ++ case DMA_VERS0: ++ espdma->revision=dvmarev0; ++ printk("Revision 0 "); ++ break; ++ case DMA_ESCV1: ++ espdma->revision=dvmaesc1; ++ printk("ESC Revision 1 "); ++ break; ++ case DMA_VERS1: ++ espdma->revision=dvmarev1; ++ printk("Revision 1 "); ++ break; ++ case DMA_VERS2: ++ espdma->revision=dvmarev2; ++ printk("Revision 2 "); ++ break; ++ case DMA_VERHME: ++ espdma->revision=dvmahme; ++ printk("HME DVMA gate array "); ++ break; ++ case DMA_VERSPLUS: ++ espdma->revision=dvmarevplus; ++ printk("Revision 1 PLUS "); ++ break; ++ default: ++ printk("unknown dma version %x", ++ (espdma->regs->cond_reg)&DMA_DEVICE_ID); ++ /* espdma->allocated = 1; */ ++ break; ++ } ++ printk("\n"); ++ return 0; ++} ++ ++static struct esp_dma espdma0; ++static struct esp_private esp; ++/* ++ * Find all the esp cards on the system and initialize them ++ */ ++void esp_probe () ++{ ++ if (espdma_init(&espdma0) != 0) { ++ return; ++ } ++ ++ if (esp_init(&esp, &espdma0, PHYS_JJ_ESP_IRQ) != 0) { ++ printk("esp_probe: esp0 init failed\n"); ++ return; ++ } ++ return; ++} ++ ++void *esp_read(int unit, int offset, short len) ++{ ++ // Set SCSI target ++ stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7); ++ // Set DMA address ++ st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma); ++ // Set DMA length ++ stb_bypass(PHYS_JJ_ESP + 0*4, 10); ++ stb_bypass(PHYS_JJ_ESP + 1*4, 0); ++ // Set DMA direction ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x000); ++ // Setup command = Read(10) ++ esp.buffer[0] = 0x80; ++ esp.buffer[1] = 0x28; ++ esp.buffer[2] = 0x00; ++ esp.buffer[3] = (offset >> 24) & 0xff; ++ esp.buffer[4] = (offset >> 16) & 0xff; ++ esp.buffer[5] = (offset >> 8) & 0xff; ++ esp.buffer[6] = offset & 0xff; ++ esp.buffer[7] = 0x00; ++ esp.buffer[8] = (len >> 8) & 0xff; ++ esp.buffer[9] = len & 0xff; ++ // Set ATN, issue command ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x42); ++ ++ // Set DMA length = 512 * read length ++ stb_bypass(PHYS_JJ_ESP + 0*4, 0); ++ stb_bypass(PHYS_JJ_ESP + 1*4, (len << 1) & 0xff); ++ // Set DMA direction ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x100); ++ // Transfer ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x10); ++ return esp.buffer; ++} ++ ++// Sparc boot sequence can be found in SILO docs, ++// first-isofs/README.SILO_ISOFS ++int esp_boot(int unit) ++{ ++ struct sun_disklabel { ++ unsigned char info[128]; /* Informative text string */ ++ unsigned char spare0[14]; ++ struct sun_info { ++ unsigned char spare1; ++ unsigned char id; ++ unsigned char spare2; ++ unsigned char flags; ++ } infos[8]; ++ unsigned char spare[246]; /* Boot information etc. */ ++ short rspeed; /* Disk rotational speed */ ++ short pcylcount; /* Physical cylinder count */ ++ short sparecyl; /* extra sects per cylinder */ ++ unsigned char spare2[4]; /* More magic... */ ++ short ilfact; /* Interleave factor */ ++ short ncyl; /* Data cylinder count */ ++ short nacyl; /* Alt. cylinder count */ ++ short ntrks; /* Tracks per cylinder */ ++ short nsect; /* Sectors per track */ ++ unsigned char spare3[4]; /* Even more magic... */ ++ struct sun_partition { ++ int start_cylinder; ++ int num_sectors; ++ } partitions[8]; ++ short magic; /* Magic number */ ++ short csum; /* Label xor'd checksum */ ++ } *label; ++ unsigned int i, offset; ++ void *src, *dst; ++ ++ printk("Loading partition table from target %d:\n", unit); ++ // Chip reset ++ stb_bypass(PHYS_JJ_ESP + 3*4, 2); ++ ++ esp_open(&esp); ++ ++ label = esp_read(unit, 0, 1); ++ printk("CHS: %d/%d/%d, partitions:\n", label->ncyl, label->ntrks, label->nsect); ++ for (i = 0; i < 8; i++) { ++ printk("%c: %d + %d\n", 'a' + i, label->partitions[i].start_cylinder, ++ label->partitions[i].num_sectors); ++ } ++ offset = label->partitions[4].start_cylinder * label->ntrks * label->nsect + 1; ++ printk("booting sd(0,%d,0):d (offset %d)\n", unit, offset); ++ // Skip a.out header (0x20) ++ dst = (void *)0x4000; ++ src = esp_read(unit, offset, 1); ++ src = (void *)((unsigned int) src + 0x20); ++ memcpy(dst, src, 512 - 0x20); ++ dst = (void *)0x4000 + 512 - 0x20; ++ for (i = 1; i < 7680/512; i++) { ++ src = esp_read(unit, offset + i, 1); ++ memcpy(dst, src, 512); ++ dst += 512; ++ } ++ esp_close(&esp); ++ return 0; ++} +diff -ruN proll_18.orig/src/hconsole.c proll-patch10/src/hconsole.c --- proll_18.orig/src/hconsole.c 2002-07-23 05:52:48.000000000 +0000 -+++ proll-patch8/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000 ++++ proll-patch10/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000 @@ -29,6 +29,10 @@ struct raster r_master; /* For a case of resize, whole fb */ struct raster r_0; /* malloc() erzatz */ @@ -2024,9 +2383,69 @@ diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c t->r_ = r; t->r0_ = q; t->f_ = &f_master; -diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm +diff -ruN proll_18.orig/src/hme.c proll-patch10/src/hme.c +--- proll_18.orig/src/hme.c 2002-07-23 05:52:52.000000000 +0000 ++++ proll-patch10/src/hme.c 2005-04-16 06:16:20.000000000 +0000 +@@ -655,10 +655,10 @@ + unsigned int flags, + unsigned int addr) + { +- __asm__ __volatile__(" +- stwa %3, [%0] %2 +- stwa %4, [%1] %2 +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "stwa %3, [%0] %2\n\t" ++ "stwa %4, [%1] %2\n\t" ++ : /* no outputs */ + : "r" (&rp->rx_addr), "r" (&rp->rx_flags), + "i" (ASI_PL), "r" (addr), "r" (flags)); + } +@@ -667,10 +667,10 @@ + unsigned int flags, + unsigned int addr) + { +- __asm__ __volatile__(" +- stwa %3, [%0] %2 +- stwa %4, [%1] %2 +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "stwa %3, [%0] %2\n\t" ++ "stwa %4, [%1] %2\n\t" ++ : /* no outputs */ + : "r" (&tp->tx_addr), "r" (&tp->tx_flags), + "i" (ASI_PL), "r" (addr), "r" (flags)); + } +@@ -2404,7 +2404,7 @@ + TXD(("[%d]", elem)); + this = &txbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->tx_flags), "i" (ASI_PL)); + #else +@@ -2447,7 +2447,7 @@ + RXD(("RX<")); + this = &rxbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->rx_flags), "i" (ASI_PL)); + #else +@@ -2530,7 +2530,7 @@ + elem = NEXT_RX(elem); + this = &rxbase[elem]; + #ifdef __sparc_v9__ +- __asm__ __volatile__("lduwa [%1] %2, %0" ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" + : "=r" (flags) + : "r" (&this->rx_flags), "i" (ASI_PL)); + #else +diff -ruN proll_18.orig/src/lat7_2.bm proll-patch10/src/lat7_2.bm --- proll_18.orig/src/lat7_2.bm 1999-02-27 05:48:54.000000000 +0000 -+++ proll-patch8/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000 @@ -1,6 +1,6 @@ #define lat7_2_width 128 #define lat7_2_height 88 @@ -2035,9 +2454,9 @@ diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0x1e, 0x0c, 0x02, 0x70, 0x18, 0x22, 0x22, 0x18, 0x00, 0x00, 0x18, 0x18, 0xff, 0x18, 0x00, 0x12, 0x02, -diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch8/src/lat7_2_swapped.bm +diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch10/src/lat7_2_swapped.bm --- proll_18.orig/src/lat7_2_swapped.bm 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000 @@ -0,0 +1,121 @@ +#define lat7_2_width 128 +#define lat7_2_height 88 @@ -2160,9 +2579,9 @@ diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch8/src/lat7_2_swapped.bm + 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; -diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c +diff -ruN proll_18.orig/src/le.c proll-patch10/src/le.c --- proll_18.orig/src/le.c 2002-07-23 05:52:49.000000000 +0000 -+++ proll-patch8/src/le.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/le.c 2005-04-16 06:16:20.000000000 +0000 @@ -185,8 +185,6 @@ unsigned short rap; /* register address port */ }; @@ -2172,9 +2591,18 @@ diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c /* The Lance uses 24 bit addresses */ /* On the Sun4c the DVMA will provide the remaining bytes for us */ /* On the Sun4m we have to instruct the ledma to provide them */ -diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c +@@ -771,7 +769,7 @@ + /* Clear the slack of the packet, do I need this? */ + /* For a firewall its a good idea - AC */ + if (len != skblen) +- bzero((char *) &ib->tx_buf [entry][skblen], len - skblen); ++ memset((char *) &ib->tx_buf [entry][skblen], 0, len - skblen); + + /* Now, give the packet to the lance */ + ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN); +diff -ruN proll_18.orig/src/netinit.c proll-patch10/src/netinit.c --- proll_18.orig/src/netinit.c 2002-09-13 21:53:33.000000000 +0000 -+++ proll-patch8/src/netinit.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/netinit.c 2004-11-13 15:50:49.000000000 +0000 @@ -49,13 +49,20 @@ unsigned char myhwaddr[ETH_ALEN]; /* my own hardware addr */ t_ipaddr myipaddr; /* my own IP address */ @@ -2218,9 +2646,9 @@ diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c fatal(); } } -diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h +diff -ruN proll_18.orig/src/netpriv.h proll-patch10/src/netpriv.h --- proll_18.orig/src/netpriv.h 1999-04-27 05:39:37.000000000 +0000 -+++ proll-patch8/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000 @@ -130,10 +130,9 @@ * */ @@ -2242,9 +2670,9 @@ diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h /* Empty read buffer */ extern void empty_buf __P((void)); -diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h +diff -ruN proll_18.orig/src/openprom.h proll-patch10/src/openprom.h --- proll_18.orig/src/openprom.h 2002-07-14 02:26:30.000000000 +0000 -+++ proll-patch8/src/openprom.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/openprom.h 2004-11-13 15:50:49.000000000 +0000 @@ -54,20 +54,20 @@ }; @@ -2306,9 +2734,9 @@ diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h }; /* More fun PROM structures for device probing. */ -diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c +diff -ruN proll_18.orig/src/packet.c proll-patch10/src/packet.c --- proll_18.orig/src/packet.c 2000-02-11 04:56:45.000000000 +0000 -+++ proll-patch8/src/packet.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/packet.c 2004-11-13 15:50:49.000000000 +0000 @@ -41,7 +41,7 @@ int aligner; } wbuf; @@ -2336,9 +2764,9 @@ diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c { struct sk_buff *skb; unsigned char *s; -diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c +diff -ruN proll_18.orig/src/printf.c proll-patch10/src/printf.c --- proll_18.orig/src/printf.c 1999-03-19 07:03:59.000000000 +0000 -+++ proll-patch8/src/printf.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/printf.c 2004-11-13 15:50:49.000000000 +0000 @@ -19,7 +19,7 @@ static void printn(struct prf_fp *, unsigned long, unsigned int); static void putchar(char, struct prf_fp *); @@ -2366,9 +2794,9 @@ diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c putchar(c,filog); } else if (c == 'l' || c == 'O') { printn(filog, (long)va_arg(adx,long), c=='l'?10:8); -diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c +diff -ruN proll_18.orig/src/rconsole.c proll-patch10/src/rconsole.c --- proll_18.orig/src/rconsole.c 1999-01-16 07:16:55.000000000 +0000 -+++ proll-patch8/src/rconsole.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/rconsole.c 2005-04-16 06:16:20.000000000 +0000 @@ -28,12 +28,18 @@ * move to California. Only plain lat7 survived. * I recreated lat7-1 changes in lat7-2. --zaitcev @@ -2388,6 +2816,37 @@ diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c #if 1 /* +@@ -46,18 +52,18 @@ + #endif + + static __inline__ void stfb_w(void *ptr, unsigned int data) { +- __asm__ __volatile__ ("sta %0, [%1] %2" : : ++ __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : : + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); + } + + static __inline__ void stfb_b(void *ptr, unsigned int data) { +- __asm__ __volatile__ ("stba %0, [%1] %2" : : ++ __asm__ __volatile__ ("stba %0, [%1] %2\n\t" : : + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); + } + + static __inline__ unsigned int ldfb_w(void *ptr) { + unsigned int data; +- __asm__ __volatile__ ("lda [%1] %2, %0" : ++ __asm__ __volatile__ ("lda [%1] %2, %0\n\t" : + "=r" (data) : + "r" (ptr), "i" (ASI_M_BYPASS)); + return data; +@@ -65,7 +71,7 @@ + + static __inline__ unsigned int ldfb_b(void *ptr) { + unsigned int data; +- __asm__ __volatile__ ("lduba [%1] %2, %0" : ++ __asm__ __volatile__ ("lduba [%1] %2, %0\n\t" : + "=r" (data) : + "r" (ptr), "i" (ASI_M_BYPASS)); + return data; @@ -94,6 +100,7 @@ #endif @@ -2423,9 +2882,9 @@ diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c p->nchars_ = LAT7_NCHARS; p->width_ = LAT7_WIDTH; p->height_ = LAT7_HEIGHT; -diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h +diff -ruN proll_18.orig/src/rconsole.h proll-patch10/src/rconsole.h --- proll_18.orig/src/rconsole.h 1999-01-16 05:00:59.000000000 +0000 -+++ proll-patch8/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000 @@ -13,10 +13,10 @@ */ @@ -2439,18 +2898,21 @@ diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h int nchars_; /* 128 for ASCII ... 65536 for Unicode */ int width_; /* [Pixels]. Maximum size is 16. */ int height_; /* [Pixels == scan lines]. */ -diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h +diff -ruN proll_18.orig/src/romlib.h proll-patch10/src/romlib.h --- proll_18.orig/src/romlib.h 1999-04-20 04:26:45.000000000 +0000 -+++ proll-patch8/src/romlib.h 2004-11-13 15:50:49.000000000 +0000 -@@ -73,12 +73,12 @@ ++++ proll-patch10/src/romlib.h 2005-04-16 20:32:49.000000000 +0000 +@@ -72,13 +72,13 @@ + */ #define memcpy(dst, src, len) bcopy(src, dst, len) #define memcmp(x1, x2, len) bcmp(x1, x2, len) - #define memset(p, len, zero) bzero(p, len) +-#define memset(p, len, zero) bzero(p, len) -extern void bcopy(void *b1, void *b2, int length); -extern int bcmp(void *b1, void *b2, int length); +-extern void bzero(void *b, int c); +extern void bcopy(const void *b1, void *b2, int length); +extern int bcmp(const void *b1, const void *b2, int length); - extern void bzero(void *b, int c); ++typedef unsigned int size_t; ++extern void *memset(void *p, int c, size_t len); /* gcc complains about "conflicting types for builtin function strlen". */ #define strlen(s) ssize(s) -extern int ssize(char *s); @@ -2458,9 +2920,9 @@ diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h /* -diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c +diff -ruN proll_18.orig/src/sched_4m.c proll-patch10/src/sched_4m.c --- proll_18.orig/src/sched_4m.c 1999-04-27 05:48:51.000000000 +0000 -+++ proll-patch8/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000 @@ -108,7 +108,7 @@ static int set_bolt; /* Tick counter limit */ static struct handsc hndv[16]; @@ -2470,9 +2932,9 @@ diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c 0, 0, 0, 0, 0, 0, SUN4M_INT_ETHERNET, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c +diff -ruN proll_18.orig/src/swap.c proll-patch10/src/swap.c --- proll_18.orig/src/swap.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/swap.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/swap.c 2004-11-13 15:50:49.000000000 +0000 @@ -0,0 +1,21 @@ +// Convert the lat7 font so that no conversion is needed at runtime. +#define ORIG @@ -2495,9 +2957,9 @@ diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c + } + printf("\n"); +} -diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c +diff -ruN proll_18.orig/src/system.c proll-patch10/src/system.c --- proll_18.orig/src/system.c 2002-07-23 05:52:49.000000000 +0000 -+++ proll-patch8/src/system.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/system.c 2005-04-16 06:16:20.000000000 +0000 @@ -298,8 +298,8 @@ } @@ -2509,13 +2971,39 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c map_page(l1, va, pa, 0, highbase); pa += PAGE_SIZE; } -@@ -518,12 +518,12 @@ - while (len--) *((char *)s)++ = 0; +@@ -507,30 +507,44 @@ + { + char *p; + +- if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size); ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); + return p; + } + + /* + * Library functions + */ +-void bzero(void *s, int len) { +- while (len--) *((char *)s)++ = 0; ++void *memset(void *s, int c, size_t len) ++{ ++ void *p = s; ++ ++ while (len--) { ++ *(char *)s = c; ++ s++; ++ } ++ return p; } -void bcopy(void *f, void *t, int len) { +- while (len--) *((char *)t)++ = *((char *)f)++; +void bcopy(const void *f, void *t, int len) { - while (len--) *((char *)t)++ = *((char *)f)++; ++ while (len--) { ++ *(char *)t = *(char *)f; ++ f++; ++ t++; ++ } } /* Comparison is 7-bit */ @@ -2524,7 +3012,19 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c { int i; char ch; -@@ -538,8 +538,8 @@ + + while (len--) { +- ch = *((char *)s1)++; +- if ((i = ch - *((char *)s2)++) != 0) ++ ch = *(char *)s1; ++ i = ch - *(char *)s2; ++ s1++; ++ s2++; ++ if (i != 0) + return i; + if (ch == 0) + return 0; +@@ -538,8 +552,8 @@ return 0; } @@ -2535,7 +3035,7 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c for (p = s; *p != 0; p++) { } return p - s; } -@@ -560,14 +560,6 @@ +@@ -560,14 +574,6 @@ va_end(x1); } @@ -2550,9 +3050,9 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c void fatal() { printk("fatal."); -diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h +diff -ruN proll_18.orig/src/system.h proll-patch10/src/system.h --- proll_18.orig/src/system.h 2002-09-13 21:53:32.000000000 +0000 -+++ proll-patch8/src/system.h 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/system.h 2005-04-16 06:16:20.000000000 +0000 @@ -16,7 +16,7 @@ #define IOMAPSIZE (1*1024*1024) /* 1 Meg maximum: we do not map framebuffer. */ #define NCTX_SWIFT 0x100 @@ -2562,9 +3062,118 @@ diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h #ifndef __ASSEMBLY__ struct bank { -diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c +@@ -164,10 +164,10 @@ + + extern __inline__ void setipl(unsigned long __orig_psr) + { +- __asm__ __volatile__(" +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : /* no outputs */ ++ __asm__ __volatile__( ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : /* no outputs */ + : "r" (__orig_psr) + : "memory", "cc"); + } +@@ -176,13 +176,13 @@ + { + unsigned long tmp; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- or %0, %1, %0 +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : "=r" (tmp) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "or %0, %1, %0\n\t" ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (tmp) + : "i" (PSR_PIL) + : "memory"); + } +@@ -191,13 +191,13 @@ + { + unsigned long tmp; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- andn %0, %1, %0 +- wr %0, 0x0, %%psr +- nop; nop; nop +-" : "=r" (tmp) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "andn %0, %1, %0\n\t" ++ "wr %0, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (tmp) + : "i" (PSR_PIL) + : "memory"); + } +@@ -214,18 +214,18 @@ + { + unsigned long retval; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- and %0, %2, %%g1 +- and %1, %2, %%g2 +- xorcc %%g1, %%g2, %%g0 +- be 1f +- nop +- wr %0, %2, %%psr +- nop; nop; nop; +-1: +-" : "=r" (retval) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "and %0, %2, %%g1\n\t" ++ "and %1, %2, %%g2\n\t" ++ "xorcc %%g1, %%g2, %%g0\n\t" ++ "be 1f\n\t" ++ "nop\n\t" ++ "wr %0, %2, %%psr\n\t" ++ "nop; nop; nop;\n\t" ++ "1:\n\t" ++ : "=r" (retval) + : "r" (__new_psr), "i" (PSR_PIL) + : "g1", "g2", "memory", "cc"); + +@@ -236,13 +236,13 @@ + { + unsigned long retval; + +- __asm__ __volatile__(" +- rd %%psr, %0 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ +- or %0, %1, %%g1 +- wr %%g1, 0x0, %%psr +- nop; nop; nop +-" : "=r" (retval) ++ __asm__ __volatile__( ++ "rd %%psr, %0\n\t" ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ ++ "or %0, %1, %%g1\n\t" ++ "wr %%g1, 0x0, %%psr\n\t" ++ "nop; nop; nop\n\t" ++ : "=r" (retval) + : "i" (PSR_PIL) + : "g1", "memory"); + +diff -ruN proll_18.orig/src/udp.c proll-patch10/src/udp.c --- proll_18.orig/src/udp.c 2001-12-24 05:12:53.000000000 +0000 -+++ proll-patch8/src/udp.c 2004-11-13 15:50:49.000000000 +0000 ++++ proll-patch10/src/udp.c 2004-11-13 15:50:49.000000000 +0000 @@ -81,7 +81,7 @@ int source; int dest; @@ -2584,9 +3193,9 @@ diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c /* Register IP packet type and set write buffer pointer */ if ((writebuf = reg_type(htons(ETH_P_IP), ip_recv)) == NULL) return(FALSE); -diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c +diff -ruN proll_18.orig/src/vcons_zs.c proll-patch10/src/vcons_zs.c --- proll_18.orig/src/vcons_zs.c 1970-01-01 00:00:00.000000000 +0000 -+++ proll-patch8/src/vcons_zs.c 2005-03-20 10:25:39.000000000 +0000 ++++ proll-patch10/src/vcons_zs.c 2005-04-10 07:01:03.000000000 +0000 @@ -0,0 +1,68 @@ +/** + ** Console over 'zs' (Zilog serial port) @@ -2648,7 +3257,7 @@ diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c + unsigned zs_ptr = (unsigned) t->impl; + + while ((ldb_bypass(zs_ptr) & 1) != 1) { } -+ return ldb_bypass(zs_ptr + ZS_DATA); ++ return ldb_bypass(zs_ptr + ZS_DATA) & 0xff; +} + +void vcon_zs_fini(struct vconterm *t) @@ -2656,10 +3265,17 @@ diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c + /* violent crash in the end */ + ; +} -diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c +diff -ruN proll_18.orig/src/vconsole.c proll-patch10/src/vconsole.c --- proll_18.orig/src/vconsole.c 1999-11-08 03:10:28.000000000 +0000 -+++ proll-patch8/src/vconsole.c 2005-03-02 14:29:05.000000000 +0000 -@@ -13,6 +13,10 @@ ++++ proll-patch10/src/vconsole.c 2005-04-17 19:23:21.000000000 +0000 +@@ -7,12 +7,17 @@ + #include "vconsole.h" + + #include "hconsole.h" ++#include + + static void vcon_i_cursfeed(struct vconterm *t); + static void vcon_i_backflush(struct vconterm *t); struct hconsole hcons0; @@ -2670,7 +3286,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c int vcon_init(struct vconterm *t, unsigned int a0) { struct hconsole *hconp; -@@ -25,11 +29,49 @@ +@@ -25,11 +30,49 @@ t->vc_x = 0; t->vc_y = 0; t->backp = 0; t->backc = 0; @@ -2720,7 +3336,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c int vcon_write(struct vconterm *t, char *data, int leng) { int l = leng; -@@ -40,29 +82,84 @@ +@@ -40,29 +83,99 @@ if (l <= 0) break; c = *data++; --l; @@ -2741,6 +3357,9 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c + case 'M': + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); + break; ++ default: ++ printk("Unhandled escape code '%c'\n", c); ++ break; + } break; - case 0x0D: /* Return */ @@ -2768,9 +3387,21 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c + if (t->vc_par[1]) t->vc_par[1]--; + gotoxay(t, t->vc_par[1], t->vc_par[0]); + break; ++ case 'J': ++ if (t->vc_par[0] == 0) { ++ //erase from cursor to end of display ++ hcon_clear(hconp, t->vc_y, t->vc_x, hconp->ydim_, hconp->xdim_); ++ } ++ break; + case 'M': + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); + break; ++ case 'm': ++ break; ++ default: ++ printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n", ++ c, t->vc_par[0], t->vc_par[1], t->vc_par[2], t->vc_par[3], t->vc_par[4]); ++ break; + } break; default: @@ -2823,9 +3454,73 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c } } } -diff -ruN proll_18.orig/src/vconsole.h proll-patch8/src/vconsole.h +@@ -100,9 +213,62 @@ + return 0; + } + ++static const unsigned char sunkbd_keycode[128] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ++ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ ' ', ++}; ++ ++static const unsigned char sunkbd_keycode_shifted[128] = { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, ++ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ ' ', ++}; ++ ++static int shiftstate; ++ + int vcon_getch(struct vconterm *t) + { +- return -1; ++ int ch; ++ ++ while ((ldb_bypass(0x71000004) & 1) != 1) { } ++ do { ++ ch = ldb_bypass(0x71000006) & 0xff; ++ if (ch == 99) ++ shiftstate |= 1; ++ else if (ch == 110) ++ shiftstate |= 2; ++ else if (ch == 227) ++ shiftstate &= ~1; ++ else if (ch == 238) ++ shiftstate &= ~2; ++ //printk("getch: %d\n", ch); ++ } ++ while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release ++ //printk("getch rel: %d\n", ch); ++ ch &= 0x7f; ++ if (shiftstate) ++ ch = sunkbd_keycode_shifted[ch]; ++ else ++ ch = sunkbd_keycode[ch]; ++ //printk("getch xlate: %d\n", ch); ++ return ch; + } + + void vcon_fini(struct vconterm *t) +diff -ruN proll_18.orig/src/vconsole.h proll-patch10/src/vconsole.h --- proll_18.orig/src/vconsole.h 1999-11-08 00:58:13.000000000 +0000 -+++ proll-patch8/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000 ++++ proll-patch10/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000 @@ -6,6 +6,8 @@ #ifndef VCONSOLE_H #define VCONSOLE_H -- 2.39.5