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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 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 -- 2.50.1