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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 O!3#pRJ4rBQFaZFn_LCO? delta 42085 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. +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