Commit 6d82d04a498a7c8a74a04f6b59c623eb3c2d69b7

Authored by bellard
1 parent ad81218e

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
No preview for this file type
pc-bios/proll.patch
1   -diff -ruN proll_18.orig/Makefile proll-patch8/Makefile
  1 +diff -ruN proll_18.orig/Makefile proll-patch10/Makefile
2 2 --- proll_18.orig/Makefile 2002-09-13 14:16:59.000000000 +0000
3   -+++ proll-patch8/Makefile 2004-11-13 15:50:49.000000000 +0000
  3 ++++ proll-patch10/Makefile 2004-11-13 15:50:49.000000000 +0000
4 4 @@ -4,6 +4,7 @@
5 5 make -C krups-ser all
6 6 make -C espresso all
... ... @@ -14,14 +14,14 @@ diff -ruN proll_18.orig/Makefile proll-patch8/Makefile
14 14 make -C espresso clean
15 15 make -C espresso-ser clean
16 16 + make -C qemu clean
17   -diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile
  17 +diff -ruN proll_18.orig/qemu/Makefile proll-patch10/qemu/Makefile
18 18 --- proll_18.orig/qemu/Makefile 1970-01-01 00:00:00.000000000 +0000
19   -+++ proll-patch8/qemu/Makefile 2005-03-02 16:41:50.000000000 +0000
20   -@@ -0,0 +1,122 @@
  19 ++++ proll-patch10/qemu/Makefile 2005-04-12 14:42:23.000000000 +0000
  20 +@@ -0,0 +1,123 @@
21 21 +#
22 22 +# proll:
23 23 +# qemu/Makefile - make PROLL for QEMU
24   -+# $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $
  24 ++# $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $
25 25 +#
26 26 +# Copyright 1999 Pete Zaitcev
27 27 +# 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
47 47 +# want to shift it to form a PGD entry. A relocatable label will not work.
48 48 +# Linux kernel expects us to be at LINUX_OPPROM_BEGVM <asm-sparc/openprom.h>.
49 49 +PROLBASE = 0xffd00000
50   -+PROLRODATA = 0xffd07000
51   -+PROLDATA = 0xffd09000
  50 ++PROLRODATA = 0xffd08000
  51 ++PROLDATA = 0xffd0b000
52 52 +PROLSIZE = 240*1024
53 53 +
54 54 +# Linux
... ... @@ -68,7 +68,7 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile
68 68 +OBJS = head.o wuf.o wof.o main.o $(CONSOLE) \
69 69 + printf.o le.o system_qemu.o iommu.o \
70 70 + arp.o netinit.o bootp.o packet.o tftp.o udp.o sched_4m.o openprom.o \
71   -+ vconsole.o hconsole.o rconsole.o vcons_zs.o
  71 ++ vconsole.o hconsole.o rconsole.o vcons_zs.o esp.o
72 72 +
73 73 +all: $(ALL)
74 74 +
... ... @@ -106,7 +106,8 @@ diff -ruN proll_18.orig/qemu/Makefile proll-patch8/qemu/Makefile
106 106 + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
107 107 +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
108 108 + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
109   -+
  109 ++esp.o: $(SRC)/esp.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/phys_jj.h
  110 ++ $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
110 111 +arp.o: $(SRC)/arp.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h
111 112 + $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
112 113 +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
140 141 +
141 142 +proll.aout: $(PROLLEXE)
142 143 + $(ELFTOAOUT) -o proll.aout $(PROLLEXE)
143   -diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S
  144 +diff -ruN proll_18.orig/qemu/head.S proll-patch10/qemu/head.S
144 145 --- proll_18.orig/qemu/head.S 1970-01-01 00:00:00.000000000 +0000
145   -+++ proll-patch8/qemu/head.S 2005-03-02 15:30:47.000000000 +0000
  146 ++++ proll-patch10/qemu/head.S 2005-03-02 15:30:47.000000000 +0000
146 147 @@ -0,0 +1,539 @@
147 148 +/**
148 149 + ** Standalone startup code for Linux PROM emulator.
... ... @@ -150,7 +151,7 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S
150 151 + ** This code is licensed under GNU General Public License.
151 152 + **/
152 153 +/*
153   -+ * $Id: proll.patch,v 1.4 2005-04-06 20:45:26 bellard Exp $
  154 ++ * $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $
154 155 + */
155 156 +
156 157 +#include <psr.h>
... ... @@ -683,10 +684,10 @@ diff -ruN proll_18.orig/qemu/head.S proll-patch8/qemu/head.S
683 684 +C_LABEL(ldb_bypass):
684 685 + retl
685 686 + lduba [%o0] ASI_M_BYPASS, %o0
686   -diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
  687 +diff -ruN proll_18.orig/qemu/main.c proll-patch10/qemu/main.c
687 688 --- proll_18.orig/qemu/main.c 1970-01-01 00:00:00.000000000 +0000
688   -+++ proll-patch8/qemu/main.c 2005-04-03 11:58:46.000000000 +0000
689   -@@ -0,0 +1,173 @@
  689 ++++ proll-patch10/qemu/main.c 2005-04-16 18:03:23.000000000 +0000
  690 +@@ -0,0 +1,185 @@
690 691 +/**
691 692 + ** Proll (PROM replacement)
692 693 + ** Copyright 1999 Pete Zaitcev
... ... @@ -711,7 +712,9 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
711 712 +void *init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, const char *cmdline, char boot_device, int nographic);
712 713 +int vcon_zs_init(struct vconterm *t, unsigned int a0);
713 714 +int vcon_zs_write(struct vconterm *t, char *data, int leng);
714   -+
  715 ++int vcon_zs_getch(struct vconterm *t);
  716 ++void esp_probe();
  717 ++int esp_boot(int unit);
715 718 +static void init_idprom(void);
716 719 +
717 720 +struct vconterm dp0;
... ... @@ -733,7 +736,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
733 736 +} *hw_idprom;
734 737 +
735 738 +int ignore_fault, fault_ignored;
736   -+void *printk_fn;
  739 ++void *printk_fn, *getch_fn;
737 740 +unsigned int q_height, q_width;
738 741 +
739 742 +/*
... ... @@ -745,7 +748,7 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
745 748 + unsigned int hiphybas;
746 749 + const void *romvec;
747 750 + unsigned int ram_size;
748   -+ char nographic;
  751 ++ char nographic, bootdev;
749 752 +
750 753 + nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F);
751 754 + if (!nographic) {
... ... @@ -753,10 +756,12 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
753 756 + q_height = ldh_bypass(PHYS_JJ_EEPROM + 0x56);
754 757 + vcon_init(&dp0, PHYS_JJ_TCX_FB);
755 758 + printk_fn = vcon_write;
  759 ++ getch_fn = vcon_getch;
756 760 + }
757 761 + else {
758 762 + vcon_zs_init(&dp0, 0x71100004);
759 763 + printk_fn = vcon_zs_write;
  764 ++ getch_fn = vcon_zs_getch;
760 765 + }
761 766 +
762 767 +
... ... @@ -790,9 +795,13 @@ diff -ruN proll_18.orig/qemu/main.c proll-patch8/qemu/main.c
790 795 + sched_init();
791 796 + le_probe();
792 797 + init_net();
  798 ++ esp_probe();
793 799 +
794   -+ printk("Boot device: %c\n", hw_idprom->boot_device);
795   -+ if (hw_idprom->boot_device == 'n') {
  800 ++ bootdev = hw_idprom->boot_device;
  801 ++ printk("Boot device: %c\n", bootdev);
  802 ++ if (hw_idprom->kernel_size > 0) {
  803 ++ printk("Kernel already loaded\n");
  804 ++ } else if (bootdev == 'n') {
796 805 + if (bootp() != 0) fatal();
797 806 + /*
798 807 + * 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
809 818 + fname[14] = 0;
810 819 +
811 820 + if (load(boot_rec.bp_siaddr, fname) != 0) fatal();
  821 ++ } else if (bootdev == 'c') {
  822 ++ if (esp_boot(0) != 0) fatal();
  823 ++ } else if (bootdev == 'd') {
  824 ++ if (esp_boot(2) != 0) fatal();
812 825 + }
813 826 +
814 827 + 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
860 873 + hw_idprom = va_prom;
861 874 +}
862 875 +
863   -diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
  876 +diff -ruN proll_18.orig/qemu/openprom.c proll-patch10/qemu/openprom.c
864 877 --- proll_18.orig/qemu/openprom.c 1970-01-01 00:00:00.000000000 +0000
865   -+++ proll-patch8/qemu/openprom.c 2005-04-06 16:53:31.000000000 +0000
866   -@@ -0,0 +1,665 @@
  878 ++++ proll-patch10/qemu/openprom.c 2005-04-16 17:30:19.000000000 +0000
  879 +@@ -0,0 +1,741 @@
867 880 +/*
868 881 + * PROM interface support
869 882 + * Copyright 1996 The Australian National University.
... ... @@ -882,6 +895,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
882 895 +
883 896 +//#define DEBUG_OBP
884 897 +
  898 ++#define PAGE_SIZE 4096
  899 ++
885 900 +struct property {
886 901 + const char *name;
887 902 + const char *value;
... ... @@ -1275,6 +1290,8 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
1275 1290 +static int obp_devopen(char *str);
1276 1291 +static int obp_devclose(int dev_desc);
1277 1292 +static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf);
  1293 ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size);
  1294 ++static void obp_dumb_munmap(char *va, unsigned int size);
1278 1295 +
1279 1296 +static void doublewalk(unsigned ptab1, unsigned va)
1280 1297 +{
... ... @@ -1353,20 +1370,34 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
1353 1370 + romvec0.pv_nbgetchar = obp_nbgetchar;
1354 1371 + romvec0.pv_nbputchar = obp_nbputchar;
1355 1372 + romvec0.pv_reboot = obp_reboot;
  1373 ++ romvec0.pv_printf = (void (*)(const char *fmt, ...))printk;
1356 1374 + romvec0.pv_abort = obp_abort;
1357 1375 + romvec0.pv_halt = obp_halt;
1358 1376 + romvec0.pv_synchook = &synch_hook;
1359 1377 + romvec0.pv_v0bootargs = &obp_argp;
  1378 ++ romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;
  1379 ++ romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;
  1380 ++ obp_arg.boot_dev_ctrl = 0;
  1381 ++ obp_arg.boot_dev_unit = '0';
1360 1382 + switch(boot_device) {
1361 1383 + default:
1362 1384 + case 'a':
1363 1385 + obp_arg.argv[0] = "fd()";
  1386 ++ obp_arg.boot_dev[0] = 'f';
  1387 ++ obp_arg.boot_dev[1] = 'd';
1364 1388 + break;
  1389 ++ case 'd':
  1390 ++ obp_arg.boot_dev_unit = '2';
  1391 ++ // Fall through
1365 1392 + case 'c':
1366 1393 + obp_arg.argv[0] = "sd()";
  1394 ++ obp_arg.boot_dev[0] = 's';
  1395 ++ obp_arg.boot_dev[1] = 'd';
1367 1396 + break;
1368 1397 + case 'n':
1369 1398 + obp_arg.argv[0] = "le()";
  1399 ++ obp_arg.boot_dev[0] = 'l';
  1400 ++ obp_arg.boot_dev[1] = 'e';
1370 1401 + break;
1371 1402 + }
1372 1403 + obp_arg.argv[1] = cmdline;
... ... @@ -1483,9 +1514,11 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
1483 1514 + return (const char *)-1;
1484 1515 +}
1485 1516 +
  1517 ++extern int (*getch_fn)(struct vconterm *v);
  1518 ++
1486 1519 +static int obp_nbgetchar(void) {
1487 1520 + extern struct vconterm dp0;
1488   -+ return vcon_getch(&dp0);
  1521 ++ return getch_fn(&dp0);
1489 1522 +}
1490 1523 +
1491 1524 +static int obp_nbputchar(int ch) {
... ... @@ -1507,32 +1540,88 @@ diff -ruN proll_18.orig/qemu/openprom.c proll-patch8/qemu/openprom.c
1507 1540 + printk("halt, freezing\n");
1508 1541 + for (;;) {}
1509 1542 +}
1510   -+
  1543 ++#define isnum(c) ((c >= '0') && (c < '9'))
  1544 ++#define ctoi(c) (c - '0')
1511 1545 +static int obp_devopen(char *str) {
1512 1546 +#ifdef DEBUG_OBP
1513   -+ printk("open %s\n", str);
  1547 ++ printk("obp_devopen(%s)\n", str);
1514 1548 +#endif
  1549 ++ if (str[0] == 's' && str[1] == 'd' && str[4] == ',') {
  1550 ++ unsigned int target;
  1551 ++
  1552 ++ if (str[5] < 7)
  1553 ++ target = str[5];
  1554 ++ else if (isnum(str[6]) && isnum(str[5])) {
  1555 ++ target = (ctoi(str[5]) * 10 + ctoi(str[6])) & 7;
  1556 ++ }
  1557 ++ else {
  1558 ++ target = ctoi(str[5]) & 7;
  1559 ++ }
  1560 ++ return 's' + target;
  1561 ++ }
1515 1562 + return 0;
1516 1563 +}
1517 1564 +
1518 1565 +static int obp_devclose(int dev_desc) {
1519 1566 +#ifdef DEBUG_OBP
1520   -+ printk("close %d\n", dev_desc);
  1567 ++ printk("obp_devclose %d\n", dev_desc);
1521 1568 +#endif
1522 1569 + return 0;
1523 1570 +}
1524 1571 +
1525   -+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf) {
  1572 ++extern void *esp_read(int unit, int offset, short len);
  1573 ++
  1574 ++static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf)
  1575 ++{
  1576 ++ unsigned int i;
  1577 ++ void *src;
  1578 ++
1526 1579 +#ifdef DEBUG_OBP
1527   -+ printk("rdblkdev: fd %d, num_blks %d, blk_st %d, buf 0x%x\n", dev_desc, num_blks, blk_st, buf);
  1580 ++ printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf);
1528 1581 +#endif
1529   -+ //buf[8] = 'L';
1530   -+ return num_blks;
  1582 ++ if (dev_desc >= 's' && dev_desc < 'v') {
  1583 ++ for(i = 0; i < num_blks; i++) {
  1584 ++ src = esp_read(dev_desc - 's', offset + i, 1);
  1585 ++ memcpy(&buf[i << 9], src, 512);
  1586 ++ }
  1587 ++ return num_blks;
  1588 ++ }
  1589 ++ return -1;
1531 1590 +}
1532   -diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c
  1591 ++
  1592 ++static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size)
  1593 ++{
  1594 ++ unsigned int npages;
  1595 ++ unsigned int off;
  1596 ++ unsigned int mva;
  1597 ++
  1598 ++#ifdef DEBUG_OBP
  1599 ++ printk("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size);
  1600 ++#endif
  1601 ++ off = pa & (PAGE_SIZE-1);
  1602 ++ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
  1603 ++ pa &= ~(PAGE_SIZE-1);
  1604 ++
  1605 ++ mva = (unsigned int) va;
  1606 ++ while (npages-- != 0) {
  1607 ++ map_page(pmem.pl1, mva, pa, 1, pmem.pbas);
  1608 ++ mva += PAGE_SIZE;
  1609 ++ pa += PAGE_SIZE;
  1610 ++ }
  1611 ++ return va;
  1612 ++}
  1613 ++
  1614 ++static void obp_dumb_munmap(char *va, unsigned int size)
  1615 ++{
  1616 ++#ifdef DEBUG_OBP
  1617 ++ printk("obp_dumb_munmap: virta %x, sz %d\n", va, size);
  1618 ++#endif
  1619 ++
  1620 ++}
  1621 +diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch10/qemu/system_qemu.c
1533 1622 --- proll_18.orig/qemu/system_qemu.c 1970-01-01 00:00:00.000000000 +0000
1534   -+++ proll-patch8/qemu/system_qemu.c 2005-03-02 16:10:20.000000000 +0000
1535   -@@ -0,0 +1,416 @@
  1623 ++++ proll-patch10/qemu/system_qemu.c 2005-04-16 06:16:20.000000000 +0000
  1624 +@@ -0,0 +1,430 @@
1536 1625 +/**
1537 1626 + ** Proll (PROM replacement)
1538 1627 + ** system.c: shared miscallenea.
... ... @@ -1859,19 +1948,30 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c
1859 1948 +{
1860 1949 + char *p;
1861 1950 +
1862   -+ if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size);
  1951 ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size);
1863 1952 + return p;
1864 1953 +}
1865 1954 +
1866 1955 +/*
1867 1956 + * Library functions
1868 1957 + */
1869   -+void bzero(void *s, int len) {
1870   -+ while (len--) *((char *)s)++ = 0;
  1958 ++void *memset(void *s, int c, size_t len)
  1959 ++{
  1960 ++ void *p = s;
  1961 ++
  1962 ++ while (len--) {
  1963 ++ *(char *)s = c;
  1964 ++ s++;
  1965 ++ }
  1966 ++ return p;
1871 1967 +}
1872 1968 +
1873 1969 +void bcopy(const void *f, void *t, int len) {
1874   -+ while (len--) *((char *)t)++ = *((char *)f)++;
  1970 ++ while (len--) {
  1971 ++ *(char *)t = *(char *)f;
  1972 ++ f++;
  1973 ++ t++;
  1974 ++ }
1875 1975 +}
1876 1976 +
1877 1977 +/* Comparison is 7-bit */
... ... @@ -1881,8 +1981,11 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c
1881 1981 + char ch;
1882 1982 +
1883 1983 + while (len--) {
1884   -+ ch = *((char *)s1)++;
1885   -+ if ((i = ch - *((char *)s2)++) != 0)
  1984 ++ ch = *(char *)s1;
  1985 ++ i = ch - *(char *)s2;
  1986 ++ s1++;
  1987 ++ s2++;
  1988 ++ if (i != 0)
1886 1989 + return i;
1887 1990 + if (ch == 0)
1888 1991 + return 0;
... ... @@ -1949,9 +2052,9 @@ diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch8/qemu/system_qemu.c
1949 2052 + n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24);
1950 2053 + st_bypass(ptr, n);
1951 2054 +};
1952   -diff -ruN proll_18.orig/src/arp.c proll-patch8/src/arp.c
  2055 +diff -ruN proll_18.orig/src/arp.c proll-patch10/src/arp.c
1953 2056 --- proll_18.orig/src/arp.c 2001-12-24 05:12:31.000000000 +0000
1954   -+++ proll-patch8/src/arp.c 2004-11-13 15:50:49.000000000 +0000
  2057 ++++ proll-patch10/src/arp.c 2004-11-13 15:50:49.000000000 +0000
1955 2058 @@ -45,7 +45,7 @@
1956 2059 #endif
1957 2060 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
1986 2089 + def_gw = IP_ANY;
1987 2090 return(TRUE);
1988 2091 }
1989   -diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h
  2092 +diff -ruN proll_18.orig/src/arp.h proll-patch10/src/arp.h
1990 2093 --- proll_18.orig/src/arp.h 1999-03-18 03:39:43.000000000 +0000
1991   -+++ proll-patch8/src/arp.h 2004-11-13 15:50:49.000000000 +0000
  2094 ++++ proll-patch10/src/arp.h 2004-11-13 15:50:49.000000000 +0000
1992 2095 @@ -104,7 +104,7 @@
1993 2096 extern int init_arp __P((void));
1994 2097  
... ... @@ -1998,9 +2101,265 @@ diff -ruN proll_18.orig/src/arp.h proll-patch8/src/arp.h
1998 2101  
1999 2102 /* Add a new antry to the ARP cache */
2000 2103 extern void addcache __P((unsigned char *ha, t_ipaddr ip));
2001   -diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c
  2104 +diff -ruN proll_18.orig/src/esp.c proll-patch10/src/esp.c
  2105 +--- proll_18.orig/src/esp.c 1970-01-01 00:00:00.000000000 +0000
  2106 ++++ proll-patch10/src/esp.c 2005-04-16 06:24:23.000000000 +0000
  2107 +@@ -0,0 +1,252 @@
  2108 ++#include <system.h> /* == <asm/system.h> */
  2109 ++#include <general.h> /* __P for netpriv.h */
  2110 ++#include <dma.h> /* dmaga */
  2111 ++#include <romlib.h>
  2112 ++
  2113 ++#define PHYS_JJ_ESPDMA 0x78400000 /* ESP DMA controller */
  2114 ++#define PHYS_JJ_ESP 0x78800000 /* ESP SCSI */
  2115 ++#define PHYS_JJ_ESP_IRQ 4
  2116 ++#define BUFSIZE 4096
  2117 ++/*
  2118 ++ * XXX Crude
  2119 ++ */
  2120 ++struct esp_dma {
  2121 ++ struct sparc_dma_registers *regs;
  2122 ++ enum dvma_rev revision;
  2123 ++};
  2124 ++
  2125 ++struct esp_regs {
  2126 ++ unsigned int regs[16];
  2127 ++};
  2128 ++
  2129 ++struct esp_private {
  2130 ++ int active; /* initialized */
  2131 ++ int inst; /* iface number */
  2132 ++
  2133 ++ volatile struct esp_regs *ll;
  2134 ++ __u32 buffer_dvma;
  2135 ++ unsigned int irq; /* device IRQ number */
  2136 ++ int interrupt;
  2137 ++
  2138 ++ struct esp_dma *espdma; /* If set this points to espdma */
  2139 ++
  2140 ++ unsigned char *buffer;
  2141 ++};
  2142 ++
  2143 ++static void esp_interrupt(void *dev_id)
  2144 ++{
  2145 ++ struct esp_private *lp = (struct esp_private *)dev_id;
  2146 ++
  2147 ++ lp->interrupt = 1;
  2148 ++ /* Acknowledge all the interrupt sources ASAP */
  2149 ++
  2150 ++ lp->interrupt = 0;
  2151 ++}
  2152 ++
  2153 ++static int esp_open (void *dev)
  2154 ++{
  2155 ++ struct esp_private *lp = (struct esp_private *)dev;
  2156 ++ int status = 0;
  2157 ++
  2158 ++ if (request_irq(lp->irq, &esp_interrupt, (void *)dev)) {
  2159 ++ printk ("Esp: Can't get irq %d\n", lp->irq);
  2160 ++ return -1;
  2161 ++ }
  2162 ++
  2163 ++ /* On the 4m, setup the espdma to provide the upper bits for buffers */
  2164 ++ if (lp->espdma)
  2165 ++ lp->espdma->regs->dma_test = ((__u32) lp->buffer_dvma) & 0xff000000;
  2166 ++
  2167 ++ return status;
  2168 ++}
  2169 ++
  2170 ++static int esp_close (void *dev)
  2171 ++{
  2172 ++ struct esp_private *lp = (struct esp_private *)dev;
  2173 ++
  2174 ++ free_irq (lp->irq, (void *) dev);
  2175 ++ return 0;
  2176 ++}
  2177 ++
  2178 ++static int
  2179 ++esp_init(struct esp_private *esp, struct esp_dma *espdma, int irq)
  2180 ++{
  2181 ++ volatile struct esp_regs *ll;
  2182 ++
  2183 ++ /* Get the IO region */
  2184 ++ ll = map_io(PHYS_JJ_ESP, sizeof (struct esp_regs));
  2185 ++ if (ll == 0) return -1;
  2186 ++
  2187 ++ esp->buffer = dvma_alloc(BUFSIZE, &esp->buffer_dvma);
  2188 ++ esp->ll = ll;
  2189 ++ esp->espdma = espdma;
  2190 ++ esp->irq = irq;
  2191 ++
  2192 ++ // Chip reset
  2193 ++ stb_bypass((int)ll + 3*2, 2);
  2194 ++ return 0;
  2195 ++}
  2196 ++
  2197 ++static int espdma_init(struct esp_dma *espdma)
  2198 ++{
  2199 ++ void *p;
  2200 ++
  2201 ++ /* Hardcode everything for MrCoffee. */
  2202 ++ if ((p = map_io(PHYS_JJ_ESPDMA, 0x10)) == 0) {
  2203 ++ printk("espdma_init: cannot map registers\n");
  2204 ++ return -1;
  2205 ++ }
  2206 ++ espdma->regs = p;
  2207 ++
  2208 ++ printk("dma1: ");
  2209 ++
  2210 ++ switch((espdma->regs->cond_reg)&DMA_DEVICE_ID) {
  2211 ++ case DMA_VERS0:
  2212 ++ espdma->revision=dvmarev0;
  2213 ++ printk("Revision 0 ");
  2214 ++ break;
  2215 ++ case DMA_ESCV1:
  2216 ++ espdma->revision=dvmaesc1;
  2217 ++ printk("ESC Revision 1 ");
  2218 ++ break;
  2219 ++ case DMA_VERS1:
  2220 ++ espdma->revision=dvmarev1;
  2221 ++ printk("Revision 1 ");
  2222 ++ break;
  2223 ++ case DMA_VERS2:
  2224 ++ espdma->revision=dvmarev2;
  2225 ++ printk("Revision 2 ");
  2226 ++ break;
  2227 ++ case DMA_VERHME:
  2228 ++ espdma->revision=dvmahme;
  2229 ++ printk("HME DVMA gate array ");
  2230 ++ break;
  2231 ++ case DMA_VERSPLUS:
  2232 ++ espdma->revision=dvmarevplus;
  2233 ++ printk("Revision 1 PLUS ");
  2234 ++ break;
  2235 ++ default:
  2236 ++ printk("unknown dma version %x",
  2237 ++ (espdma->regs->cond_reg)&DMA_DEVICE_ID);
  2238 ++ /* espdma->allocated = 1; */
  2239 ++ break;
  2240 ++ }
  2241 ++ printk("\n");
  2242 ++ return 0;
  2243 ++}
  2244 ++
  2245 ++static struct esp_dma espdma0;
  2246 ++static struct esp_private esp;
  2247 ++/*
  2248 ++ * Find all the esp cards on the system and initialize them
  2249 ++ */
  2250 ++void esp_probe ()
  2251 ++{
  2252 ++ if (espdma_init(&espdma0) != 0) {
  2253 ++ return;
  2254 ++ }
  2255 ++
  2256 ++ if (esp_init(&esp, &espdma0, PHYS_JJ_ESP_IRQ) != 0) {
  2257 ++ printk("esp_probe: esp0 init failed\n");
  2258 ++ return;
  2259 ++ }
  2260 ++ return;
  2261 ++}
  2262 ++
  2263 ++void *esp_read(int unit, int offset, short len)
  2264 ++{
  2265 ++ // Set SCSI target
  2266 ++ stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7);
  2267 ++ // Set DMA address
  2268 ++ st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma);
  2269 ++ // Set DMA length
  2270 ++ stb_bypass(PHYS_JJ_ESP + 0*4, 10);
  2271 ++ stb_bypass(PHYS_JJ_ESP + 1*4, 0);
  2272 ++ // Set DMA direction
  2273 ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x000);
  2274 ++ // Setup command = Read(10)
  2275 ++ esp.buffer[0] = 0x80;
  2276 ++ esp.buffer[1] = 0x28;
  2277 ++ esp.buffer[2] = 0x00;
  2278 ++ esp.buffer[3] = (offset >> 24) & 0xff;
  2279 ++ esp.buffer[4] = (offset >> 16) & 0xff;
  2280 ++ esp.buffer[5] = (offset >> 8) & 0xff;
  2281 ++ esp.buffer[6] = offset & 0xff;
  2282 ++ esp.buffer[7] = 0x00;
  2283 ++ esp.buffer[8] = (len >> 8) & 0xff;
  2284 ++ esp.buffer[9] = len & 0xff;
  2285 ++ // Set ATN, issue command
  2286 ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x42);
  2287 ++
  2288 ++ // Set DMA length = 512 * read length
  2289 ++ stb_bypass(PHYS_JJ_ESP + 0*4, 0);
  2290 ++ stb_bypass(PHYS_JJ_ESP + 1*4, (len << 1) & 0xff);
  2291 ++ // Set DMA direction
  2292 ++ st_bypass(PHYS_JJ_ESPDMA + 0, 0x100);
  2293 ++ // Transfer
  2294 ++ stb_bypass(PHYS_JJ_ESP + 3*4, 0x10);
  2295 ++ return esp.buffer;
  2296 ++}
  2297 ++
  2298 ++// Sparc boot sequence can be found in SILO docs,
  2299 ++// first-isofs/README.SILO_ISOFS
  2300 ++int esp_boot(int unit)
  2301 ++{
  2302 ++ struct sun_disklabel {
  2303 ++ unsigned char info[128]; /* Informative text string */
  2304 ++ unsigned char spare0[14];
  2305 ++ struct sun_info {
  2306 ++ unsigned char spare1;
  2307 ++ unsigned char id;
  2308 ++ unsigned char spare2;
  2309 ++ unsigned char flags;
  2310 ++ } infos[8];
  2311 ++ unsigned char spare[246]; /* Boot information etc. */
  2312 ++ short rspeed; /* Disk rotational speed */
  2313 ++ short pcylcount; /* Physical cylinder count */
  2314 ++ short sparecyl; /* extra sects per cylinder */
  2315 ++ unsigned char spare2[4]; /* More magic... */
  2316 ++ short ilfact; /* Interleave factor */
  2317 ++ short ncyl; /* Data cylinder count */
  2318 ++ short nacyl; /* Alt. cylinder count */
  2319 ++ short ntrks; /* Tracks per cylinder */
  2320 ++ short nsect; /* Sectors per track */
  2321 ++ unsigned char spare3[4]; /* Even more magic... */
  2322 ++ struct sun_partition {
  2323 ++ int start_cylinder;
  2324 ++ int num_sectors;
  2325 ++ } partitions[8];
  2326 ++ short magic; /* Magic number */
  2327 ++ short csum; /* Label xor'd checksum */
  2328 ++ } *label;
  2329 ++ unsigned int i, offset;
  2330 ++ void *src, *dst;
  2331 ++
  2332 ++ printk("Loading partition table from target %d:\n", unit);
  2333 ++ // Chip reset
  2334 ++ stb_bypass(PHYS_JJ_ESP + 3*4, 2);
  2335 ++
  2336 ++ esp_open(&esp);
  2337 ++
  2338 ++ label = esp_read(unit, 0, 1);
  2339 ++ printk("CHS: %d/%d/%d, partitions:\n", label->ncyl, label->ntrks, label->nsect);
  2340 ++ for (i = 0; i < 8; i++) {
  2341 ++ printk("%c: %d + %d\n", 'a' + i, label->partitions[i].start_cylinder,
  2342 ++ label->partitions[i].num_sectors);
  2343 ++ }
  2344 ++ offset = label->partitions[4].start_cylinder * label->ntrks * label->nsect + 1;
  2345 ++ printk("booting sd(0,%d,0):d (offset %d)\n", unit, offset);
  2346 ++ // Skip a.out header (0x20)
  2347 ++ dst = (void *)0x4000;
  2348 ++ src = esp_read(unit, offset, 1);
  2349 ++ src = (void *)((unsigned int) src + 0x20);
  2350 ++ memcpy(dst, src, 512 - 0x20);
  2351 ++ dst = (void *)0x4000 + 512 - 0x20;
  2352 ++ for (i = 1; i < 7680/512; i++) {
  2353 ++ src = esp_read(unit, offset + i, 1);
  2354 ++ memcpy(dst, src, 512);
  2355 ++ dst += 512;
  2356 ++ }
  2357 ++ esp_close(&esp);
  2358 ++ return 0;
  2359 ++}
  2360 +diff -ruN proll_18.orig/src/hconsole.c proll-patch10/src/hconsole.c
2002 2361 --- proll_18.orig/src/hconsole.c 2002-07-23 05:52:48.000000000 +0000
2003   -+++ proll-patch8/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000
  2362 ++++ proll-patch10/src/hconsole.c 2005-03-02 17:03:09.000000000 +0000
2004 2363 @@ -29,6 +29,10 @@
2005 2364 struct raster r_master; /* For a case of resize, whole fb */
2006 2365 struct raster r_0; /* malloc() erzatz */
... ... @@ -2024,9 +2383,69 @@ diff -ruN proll_18.orig/src/hconsole.c proll-patch8/src/hconsole.c
2024 2383 t->r_ = r;
2025 2384 t->r0_ = q;
2026 2385 t->f_ = &f_master;
2027   -diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm
  2386 +diff -ruN proll_18.orig/src/hme.c proll-patch10/src/hme.c
  2387 +--- proll_18.orig/src/hme.c 2002-07-23 05:52:52.000000000 +0000
  2388 ++++ proll-patch10/src/hme.c 2005-04-16 06:16:20.000000000 +0000
  2389 +@@ -655,10 +655,10 @@
  2390 + unsigned int flags,
  2391 + unsigned int addr)
  2392 + {
  2393 +- __asm__ __volatile__("
  2394 +- stwa %3, [%0] %2
  2395 +- stwa %4, [%1] %2
  2396 +-" : /* no outputs */
  2397 ++ __asm__ __volatile__(
  2398 ++ "stwa %3, [%0] %2\n\t"
  2399 ++ "stwa %4, [%1] %2\n\t"
  2400 ++ : /* no outputs */
  2401 + : "r" (&rp->rx_addr), "r" (&rp->rx_flags),
  2402 + "i" (ASI_PL), "r" (addr), "r" (flags));
  2403 + }
  2404 +@@ -667,10 +667,10 @@
  2405 + unsigned int flags,
  2406 + unsigned int addr)
  2407 + {
  2408 +- __asm__ __volatile__("
  2409 +- stwa %3, [%0] %2
  2410 +- stwa %4, [%1] %2
  2411 +-" : /* no outputs */
  2412 ++ __asm__ __volatile__(
  2413 ++ "stwa %3, [%0] %2\n\t"
  2414 ++ "stwa %4, [%1] %2\n\t"
  2415 ++ : /* no outputs */
  2416 + : "r" (&tp->tx_addr), "r" (&tp->tx_flags),
  2417 + "i" (ASI_PL), "r" (addr), "r" (flags));
  2418 + }
  2419 +@@ -2404,7 +2404,7 @@
  2420 + TXD(("[%d]", elem));
  2421 + this = &txbase[elem];
  2422 + #ifdef __sparc_v9__
  2423 +- __asm__ __volatile__("lduwa [%1] %2, %0"
  2424 ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
  2425 + : "=r" (flags)
  2426 + : "r" (&this->tx_flags), "i" (ASI_PL));
  2427 + #else
  2428 +@@ -2447,7 +2447,7 @@
  2429 + RXD(("RX<"));
  2430 + this = &rxbase[elem];
  2431 + #ifdef __sparc_v9__
  2432 +- __asm__ __volatile__("lduwa [%1] %2, %0"
  2433 ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
  2434 + : "=r" (flags)
  2435 + : "r" (&this->rx_flags), "i" (ASI_PL));
  2436 + #else
  2437 +@@ -2530,7 +2530,7 @@
  2438 + elem = NEXT_RX(elem);
  2439 + this = &rxbase[elem];
  2440 + #ifdef __sparc_v9__
  2441 +- __asm__ __volatile__("lduwa [%1] %2, %0"
  2442 ++ __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
  2443 + : "=r" (flags)
  2444 + : "r" (&this->rx_flags), "i" (ASI_PL));
  2445 + #else
  2446 +diff -ruN proll_18.orig/src/lat7_2.bm proll-patch10/src/lat7_2.bm
2028 2447 --- proll_18.orig/src/lat7_2.bm 1999-02-27 05:48:54.000000000 +0000
2029   -+++ proll-patch8/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000
  2448 ++++ proll-patch10/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000
2030 2449 @@ -1,6 +1,6 @@
2031 2450 #define lat7_2_width 128
2032 2451 #define lat7_2_height 88
... ... @@ -2035,9 +2454,9 @@ diff -ruN proll_18.orig/src/lat7_2.bm proll-patch8/src/lat7_2.bm
2035 2454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2036 2455 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0x1e, 0x0c, 0x02, 0x70, 0x18,
2037 2456 0x22, 0x22, 0x18, 0x00, 0x00, 0x18, 0x18, 0xff, 0x18, 0x00, 0x12, 0x02,
2038   -diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch8/src/lat7_2_swapped.bm
  2457 +diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch10/src/lat7_2_swapped.bm
2039 2458 --- proll_18.orig/src/lat7_2_swapped.bm 1970-01-01 00:00:00.000000000 +0000
2040   -+++ proll-patch8/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000
  2459 ++++ proll-patch10/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000
2041 2460 @@ -0,0 +1,121 @@
2042 2461 +#define lat7_2_width 128
2043 2462 +#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
2160 2579 + 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x00, 0x00,
2161 2580 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x00, 0x00, 0x00, 0x00,
2162 2581 + 0x00, 0x00, 0x00, 0x00};
2163   -diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c
  2582 +diff -ruN proll_18.orig/src/le.c proll-patch10/src/le.c
2164 2583 --- proll_18.orig/src/le.c 2002-07-23 05:52:49.000000000 +0000
2165   -+++ proll-patch8/src/le.c 2004-11-13 15:50:49.000000000 +0000
  2584 ++++ proll-patch10/src/le.c 2005-04-16 06:16:20.000000000 +0000
2166 2585 @@ -185,8 +185,6 @@
2167 2586 unsigned short rap; /* register address port */
2168 2587 };
... ... @@ -2172,9 +2591,18 @@ diff -ruN proll_18.orig/src/le.c proll-patch8/src/le.c
2172 2591 /* The Lance uses 24 bit addresses */
2173 2592 /* On the Sun4c the DVMA will provide the remaining bytes for us */
2174 2593 /* On the Sun4m we have to instruct the ledma to provide them */
2175   -diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c
  2594 +@@ -771,7 +769,7 @@
  2595 + /* Clear the slack of the packet, do I need this? */
  2596 + /* For a firewall its a good idea - AC */
  2597 + if (len != skblen)
  2598 +- bzero((char *) &ib->tx_buf [entry][skblen], len - skblen);
  2599 ++ memset((char *) &ib->tx_buf [entry][skblen], 0, len - skblen);
  2600 +
  2601 + /* Now, give the packet to the lance */
  2602 + ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN);
  2603 +diff -ruN proll_18.orig/src/netinit.c proll-patch10/src/netinit.c
2176 2604 --- proll_18.orig/src/netinit.c 2002-09-13 21:53:33.000000000 +0000
2177   -+++ proll-patch8/src/netinit.c 2004-11-13 15:50:49.000000000 +0000
  2605 ++++ proll-patch10/src/netinit.c 2004-11-13 15:50:49.000000000 +0000
2178 2606 @@ -49,13 +49,20 @@
2179 2607 unsigned char myhwaddr[ETH_ALEN]; /* my own hardware addr */
2180 2608 t_ipaddr myipaddr; /* my own IP address */
... ... @@ -2218,9 +2646,9 @@ diff -ruN proll_18.orig/src/netinit.c proll-patch8/src/netinit.c
2218 2646 fatal();
2219 2647 }
2220 2648 }
2221   -diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h
  2649 +diff -ruN proll_18.orig/src/netpriv.h proll-patch10/src/netpriv.h
2222 2650 --- proll_18.orig/src/netpriv.h 1999-04-27 05:39:37.000000000 +0000
2223   -+++ proll-patch8/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000
  2651 ++++ proll-patch10/src/netpriv.h 2004-11-13 15:50:49.000000000 +0000
2224 2652 @@ -130,10 +130,9 @@
2225 2653 *
2226 2654 */
... ... @@ -2242,9 +2670,9 @@ diff -ruN proll_18.orig/src/netpriv.h proll-patch8/src/netpriv.h
2242 2670  
2243 2671 /* Empty read buffer */
2244 2672 extern void empty_buf __P((void));
2245   -diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h
  2673 +diff -ruN proll_18.orig/src/openprom.h proll-patch10/src/openprom.h
2246 2674 --- proll_18.orig/src/openprom.h 2002-07-14 02:26:30.000000000 +0000
2247   -+++ proll-patch8/src/openprom.h 2004-11-13 15:50:49.000000000 +0000
  2675 ++++ proll-patch10/src/openprom.h 2004-11-13 15:50:49.000000000 +0000
2248 2676 @@ -54,20 +54,20 @@
2249 2677 };
2250 2678  
... ... @@ -2306,9 +2734,9 @@ diff -ruN proll_18.orig/src/openprom.h proll-patch8/src/openprom.h
2306 2734 };
2307 2735  
2308 2736 /* More fun PROM structures for device probing. */
2309   -diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c
  2737 +diff -ruN proll_18.orig/src/packet.c proll-patch10/src/packet.c
2310 2738 --- proll_18.orig/src/packet.c 2000-02-11 04:56:45.000000000 +0000
2311   -+++ proll-patch8/src/packet.c 2004-11-13 15:50:49.000000000 +0000
  2739 ++++ proll-patch10/src/packet.c 2004-11-13 15:50:49.000000000 +0000
2312 2740 @@ -41,7 +41,7 @@
2313 2741 int aligner;
2314 2742 } wbuf;
... ... @@ -2336,9 +2764,9 @@ diff -ruN proll_18.orig/src/packet.c proll-patch8/src/packet.c
2336 2764 {
2337 2765 struct sk_buff *skb;
2338 2766 unsigned char *s;
2339   -diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c
  2767 +diff -ruN proll_18.orig/src/printf.c proll-patch10/src/printf.c
2340 2768 --- proll_18.orig/src/printf.c 1999-03-19 07:03:59.000000000 +0000
2341   -+++ proll-patch8/src/printf.c 2004-11-13 15:50:49.000000000 +0000
  2769 ++++ proll-patch10/src/printf.c 2004-11-13 15:50:49.000000000 +0000
2342 2770 @@ -19,7 +19,7 @@
2343 2771 static void printn(struct prf_fp *, unsigned long, unsigned int);
2344 2772 static void putchar(char, struct prf_fp *);
... ... @@ -2366,9 +2794,9 @@ diff -ruN proll_18.orig/src/printf.c proll-patch8/src/printf.c
2366 2794 putchar(c,filog);
2367 2795 } else if (c == 'l' || c == 'O') {
2368 2796 printn(filog, (long)va_arg(adx,long), c=='l'?10:8);
2369   -diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c
  2797 +diff -ruN proll_18.orig/src/rconsole.c proll-patch10/src/rconsole.c
2370 2798 --- proll_18.orig/src/rconsole.c 1999-01-16 07:16:55.000000000 +0000
2371   -+++ proll-patch8/src/rconsole.c 2004-11-13 15:50:49.000000000 +0000
  2799 ++++ proll-patch10/src/rconsole.c 2005-04-16 06:16:20.000000000 +0000
2372 2800 @@ -28,12 +28,18 @@
2373 2801 * move to California. Only plain lat7 survived.
2374 2802 * 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
2388 2816  
2389 2817 #if 1
2390 2818 /*
  2819 +@@ -46,18 +52,18 @@
  2820 + #endif
  2821 +
  2822 + static __inline__ void stfb_w(void *ptr, unsigned int data) {
  2823 +- __asm__ __volatile__ ("sta %0, [%1] %2" : :
  2824 ++ __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : :
  2825 + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS));
  2826 + }
  2827 +
  2828 + static __inline__ void stfb_b(void *ptr, unsigned int data) {
  2829 +- __asm__ __volatile__ ("stba %0, [%1] %2" : :
  2830 ++ __asm__ __volatile__ ("stba %0, [%1] %2\n\t" : :
  2831 + "r" (data), "r" (ptr), "i" (ASI_M_BYPASS));
  2832 + }
  2833 +
  2834 + static __inline__ unsigned int ldfb_w(void *ptr) {
  2835 + unsigned int data;
  2836 +- __asm__ __volatile__ ("lda [%1] %2, %0" :
  2837 ++ __asm__ __volatile__ ("lda [%1] %2, %0\n\t" :
  2838 + "=r" (data) :
  2839 + "r" (ptr), "i" (ASI_M_BYPASS));
  2840 + return data;
  2841 +@@ -65,7 +71,7 @@
  2842 +
  2843 + static __inline__ unsigned int ldfb_b(void *ptr) {
  2844 + unsigned int data;
  2845 +- __asm__ __volatile__ ("lduba [%1] %2, %0" :
  2846 ++ __asm__ __volatile__ ("lduba [%1] %2, %0\n\t" :
  2847 + "=r" (data) :
  2848 + "r" (ptr), "i" (ASI_M_BYPASS));
  2849 + return data;
2391 2850 @@ -94,6 +100,7 @@
2392 2851  
2393 2852 #endif
... ... @@ -2423,9 +2882,9 @@ diff -ruN proll_18.orig/src/rconsole.c proll-patch8/src/rconsole.c
2423 2882 p->nchars_ = LAT7_NCHARS;
2424 2883 p->width_ = LAT7_WIDTH;
2425 2884 p->height_ = LAT7_HEIGHT;
2426   -diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h
  2885 +diff -ruN proll_18.orig/src/rconsole.h proll-patch10/src/rconsole.h
2427 2886 --- proll_18.orig/src/rconsole.h 1999-01-16 05:00:59.000000000 +0000
2428   -+++ proll-patch8/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000
  2887 ++++ proll-patch10/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000
2429 2888 @@ -13,10 +13,10 @@
2430 2889 */
2431 2890  
... ... @@ -2439,18 +2898,21 @@ diff -ruN proll_18.orig/src/rconsole.h proll-patch8/src/rconsole.h
2439 2898 int nchars_; /* 128 for ASCII ... 65536 for Unicode */
2440 2899 int width_; /* [Pixels]. Maximum size is 16. */
2441 2900 int height_; /* [Pixels == scan lines]. */
2442   -diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h
  2901 +diff -ruN proll_18.orig/src/romlib.h proll-patch10/src/romlib.h
2443 2902 --- proll_18.orig/src/romlib.h 1999-04-20 04:26:45.000000000 +0000
2444   -+++ proll-patch8/src/romlib.h 2004-11-13 15:50:49.000000000 +0000
2445   -@@ -73,12 +73,12 @@
  2903 ++++ proll-patch10/src/romlib.h 2005-04-16 20:32:49.000000000 +0000
  2904 +@@ -72,13 +72,13 @@
  2905 + */
2446 2906 #define memcpy(dst, src, len) bcopy(src, dst, len)
2447 2907 #define memcmp(x1, x2, len) bcmp(x1, x2, len)
2448   - #define memset(p, len, zero) bzero(p, len)
  2908 +-#define memset(p, len, zero) bzero(p, len)
2449 2909 -extern void bcopy(void *b1, void *b2, int length);
2450 2910 -extern int bcmp(void *b1, void *b2, int length);
  2911 +-extern void bzero(void *b, int c);
2451 2912 +extern void bcopy(const void *b1, void *b2, int length);
2452 2913 +extern int bcmp(const void *b1, const void *b2, int length);
2453   - extern void bzero(void *b, int c);
  2914 ++typedef unsigned int size_t;
  2915 ++extern void *memset(void *p, int c, size_t len);
2454 2916 /* gcc complains about "conflicting types for builtin function strlen". */
2455 2917 #define strlen(s) ssize(s)
2456 2918 -extern int ssize(char *s);
... ... @@ -2458,9 +2920,9 @@ diff -ruN proll_18.orig/src/romlib.h proll-patch8/src/romlib.h
2458 2920  
2459 2921  
2460 2922 /*
2461   -diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c
  2923 +diff -ruN proll_18.orig/src/sched_4m.c proll-patch10/src/sched_4m.c
2462 2924 --- proll_18.orig/src/sched_4m.c 1999-04-27 05:48:51.000000000 +0000
2463   -+++ proll-patch8/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000
  2925 ++++ proll-patch10/src/sched_4m.c 2004-11-13 15:50:49.000000000 +0000
2464 2926 @@ -108,7 +108,7 @@
2465 2927 static int set_bolt; /* Tick counter limit */
2466 2928 static struct handsc hndv[16];
... ... @@ -2470,9 +2932,9 @@ diff -ruN proll_18.orig/src/sched_4m.c proll-patch8/src/sched_4m.c
2470 2932 0, 0, 0, 0, 0, 0, SUN4M_INT_ETHERNET, 0,
2471 2933 0, 0, 0, 0, 0, 0, 0, 0,
2472 2934 };
2473   -diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c
  2935 +diff -ruN proll_18.orig/src/swap.c proll-patch10/src/swap.c
2474 2936 --- proll_18.orig/src/swap.c 1970-01-01 00:00:00.000000000 +0000
2475   -+++ proll-patch8/src/swap.c 2004-11-13 15:50:49.000000000 +0000
  2937 ++++ proll-patch10/src/swap.c 2004-11-13 15:50:49.000000000 +0000
2476 2938 @@ -0,0 +1,21 @@
2477 2939 +// Convert the lat7 font so that no conversion is needed at runtime.
2478 2940 +#define ORIG
... ... @@ -2495,9 +2957,9 @@ diff -ruN proll_18.orig/src/swap.c proll-patch8/src/swap.c
2495 2957 + }
2496 2958 + printf("\n");
2497 2959 +}
2498   -diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c
  2960 +diff -ruN proll_18.orig/src/system.c proll-patch10/src/system.c
2499 2961 --- proll_18.orig/src/system.c 2002-07-23 05:52:49.000000000 +0000
2500   -+++ proll-patch8/src/system.c 2004-11-13 15:50:49.000000000 +0000
  2962 ++++ proll-patch10/src/system.c 2005-04-16 06:16:20.000000000 +0000
2501 2963 @@ -298,8 +298,8 @@
2502 2964 }
2503 2965  
... ... @@ -2509,13 +2971,39 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c
2509 2971 map_page(l1, va, pa, 0, highbase);
2510 2972 pa += PAGE_SIZE;
2511 2973 }
2512   -@@ -518,12 +518,12 @@
2513   - while (len--) *((char *)s)++ = 0;
  2974 +@@ -507,30 +507,44 @@
  2975 + {
  2976 + char *p;
  2977 +
  2978 +- if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size);
  2979 ++ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size);
  2980 + return p;
  2981 + }
  2982 +
  2983 + /*
  2984 + * Library functions
  2985 + */
  2986 +-void bzero(void *s, int len) {
  2987 +- while (len--) *((char *)s)++ = 0;
  2988 ++void *memset(void *s, int c, size_t len)
  2989 ++{
  2990 ++ void *p = s;
  2991 ++
  2992 ++ while (len--) {
  2993 ++ *(char *)s = c;
  2994 ++ s++;
  2995 ++ }
  2996 ++ return p;
2514 2997 }
2515 2998  
2516 2999 -void bcopy(void *f, void *t, int len) {
  3000 +- while (len--) *((char *)t)++ = *((char *)f)++;
2517 3001 +void bcopy(const void *f, void *t, int len) {
2518   - while (len--) *((char *)t)++ = *((char *)f)++;
  3002 ++ while (len--) {
  3003 ++ *(char *)t = *(char *)f;
  3004 ++ f++;
  3005 ++ t++;
  3006 ++ }
2519 3007 }
2520 3008  
2521 3009 /* Comparison is 7-bit */
... ... @@ -2524,7 +3012,19 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c
2524 3012 {
2525 3013 int i;
2526 3014 char ch;
2527   -@@ -538,8 +538,8 @@
  3015 +
  3016 + while (len--) {
  3017 +- ch = *((char *)s1)++;
  3018 +- if ((i = ch - *((char *)s2)++) != 0)
  3019 ++ ch = *(char *)s1;
  3020 ++ i = ch - *(char *)s2;
  3021 ++ s1++;
  3022 ++ s2++;
  3023 ++ if (i != 0)
  3024 + return i;
  3025 + if (ch == 0)
  3026 + return 0;
  3027 +@@ -538,8 +552,8 @@
2528 3028 return 0;
2529 3029 }
2530 3030  
... ... @@ -2535,7 +3035,7 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c
2535 3035 for (p = s; *p != 0; p++) { }
2536 3036 return p - s;
2537 3037 }
2538   -@@ -560,14 +560,6 @@
  3038 +@@ -560,14 +574,6 @@
2539 3039 va_end(x1);
2540 3040 }
2541 3041  
... ... @@ -2550,9 +3050,9 @@ diff -ruN proll_18.orig/src/system.c proll-patch8/src/system.c
2550 3050 void fatal()
2551 3051 {
2552 3052 printk("fatal.");
2553   -diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h
  3053 +diff -ruN proll_18.orig/src/system.h proll-patch10/src/system.h
2554 3054 --- proll_18.orig/src/system.h 2002-09-13 21:53:32.000000000 +0000
2555   -+++ proll-patch8/src/system.h 2004-11-13 15:50:49.000000000 +0000
  3055 ++++ proll-patch10/src/system.h 2005-04-16 06:16:20.000000000 +0000
2556 3056 @@ -16,7 +16,7 @@
2557 3057 #define IOMAPSIZE (1*1024*1024) /* 1 Meg maximum: we do not map framebuffer. */
2558 3058 #define NCTX_SWIFT 0x100
... ... @@ -2562,9 +3062,118 @@ diff -ruN proll_18.orig/src/system.h proll-patch8/src/system.h
2562 3062  
2563 3063 #ifndef __ASSEMBLY__
2564 3064 struct bank {
2565   -diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c
  3065 +@@ -164,10 +164,10 @@
  3066 +
  3067 + extern __inline__ void setipl(unsigned long __orig_psr)
  3068 + {
  3069 +- __asm__ __volatile__("
  3070 +- wr %0, 0x0, %%psr
  3071 +- nop; nop; nop
  3072 +-" : /* no outputs */
  3073 ++ __asm__ __volatile__(
  3074 ++ "wr %0, 0x0, %%psr\n\t"
  3075 ++ "nop; nop; nop\n\t"
  3076 ++ : /* no outputs */
  3077 + : "r" (__orig_psr)
  3078 + : "memory", "cc");
  3079 + }
  3080 +@@ -176,13 +176,13 @@
  3081 + {
  3082 + unsigned long tmp;
  3083 +
  3084 +- __asm__ __volatile__("
  3085 +- rd %%psr, %0
  3086 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */
  3087 +- or %0, %1, %0
  3088 +- wr %0, 0x0, %%psr
  3089 +- nop; nop; nop
  3090 +-" : "=r" (tmp)
  3091 ++ __asm__ __volatile__(
  3092 ++ "rd %%psr, %0\n\t"
  3093 ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */
  3094 ++ "or %0, %1, %0\n\t"
  3095 ++ "wr %0, 0x0, %%psr\n\t"
  3096 ++ "nop; nop; nop\n\t"
  3097 ++ : "=r" (tmp)
  3098 + : "i" (PSR_PIL)
  3099 + : "memory");
  3100 + }
  3101 +@@ -191,13 +191,13 @@
  3102 + {
  3103 + unsigned long tmp;
  3104 +
  3105 +- __asm__ __volatile__("
  3106 +- rd %%psr, %0
  3107 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */
  3108 +- andn %0, %1, %0
  3109 +- wr %0, 0x0, %%psr
  3110 +- nop; nop; nop
  3111 +-" : "=r" (tmp)
  3112 ++ __asm__ __volatile__(
  3113 ++ "rd %%psr, %0\n\t"
  3114 ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */
  3115 ++ "andn %0, %1, %0\n\t"
  3116 ++ "wr %0, 0x0, %%psr\n\t"
  3117 ++ "nop; nop; nop\n\t"
  3118 ++ : "=r" (tmp)
  3119 + : "i" (PSR_PIL)
  3120 + : "memory");
  3121 + }
  3122 +@@ -214,18 +214,18 @@
  3123 + {
  3124 + unsigned long retval;
  3125 +
  3126 +- __asm__ __volatile__("
  3127 +- rd %%psr, %0
  3128 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */
  3129 +- and %0, %2, %%g1
  3130 +- and %1, %2, %%g2
  3131 +- xorcc %%g1, %%g2, %%g0
  3132 +- be 1f
  3133 +- nop
  3134 +- wr %0, %2, %%psr
  3135 +- nop; nop; nop;
  3136 +-1:
  3137 +-" : "=r" (retval)
  3138 ++ __asm__ __volatile__(
  3139 ++ "rd %%psr, %0\n\t"
  3140 ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */
  3141 ++ "and %0, %2, %%g1\n\t"
  3142 ++ "and %1, %2, %%g2\n\t"
  3143 ++ "xorcc %%g1, %%g2, %%g0\n\t"
  3144 ++ "be 1f\n\t"
  3145 ++ "nop\n\t"
  3146 ++ "wr %0, %2, %%psr\n\t"
  3147 ++ "nop; nop; nop;\n\t"
  3148 ++ "1:\n\t"
  3149 ++ : "=r" (retval)
  3150 + : "r" (__new_psr), "i" (PSR_PIL)
  3151 + : "g1", "g2", "memory", "cc");
  3152 +
  3153 +@@ -236,13 +236,13 @@
  3154 + {
  3155 + unsigned long retval;
  3156 +
  3157 +- __asm__ __volatile__("
  3158 +- rd %%psr, %0
  3159 +- nop; nop; nop; /* Sun4m + Cypress + SMP bug */
  3160 +- or %0, %1, %%g1
  3161 +- wr %%g1, 0x0, %%psr
  3162 +- nop; nop; nop
  3163 +-" : "=r" (retval)
  3164 ++ __asm__ __volatile__(
  3165 ++ "rd %%psr, %0\n\t"
  3166 ++ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */
  3167 ++ "or %0, %1, %%g1\n\t"
  3168 ++ "wr %%g1, 0x0, %%psr\n\t"
  3169 ++ "nop; nop; nop\n\t"
  3170 ++ : "=r" (retval)
  3171 + : "i" (PSR_PIL)
  3172 + : "g1", "memory");
  3173 +
  3174 +diff -ruN proll_18.orig/src/udp.c proll-patch10/src/udp.c
2566 3175 --- proll_18.orig/src/udp.c 2001-12-24 05:12:53.000000000 +0000
2567   -+++ proll-patch8/src/udp.c 2004-11-13 15:50:49.000000000 +0000
  3176 ++++ proll-patch10/src/udp.c 2004-11-13 15:50:49.000000000 +0000
2568 3177 @@ -81,7 +81,7 @@
2569 3178 int source;
2570 3179 int dest;
... ... @@ -2584,9 +3193,9 @@ diff -ruN proll_18.orig/src/udp.c proll-patch8/src/udp.c
2584 3193 /* Register IP packet type and set write buffer pointer */
2585 3194 if ((writebuf = reg_type(htons(ETH_P_IP), ip_recv)) == NULL)
2586 3195 return(FALSE);
2587   -diff -ruN proll_18.orig/src/vcons_zs.c proll-patch8/src/vcons_zs.c
  3196 +diff -ruN proll_18.orig/src/vcons_zs.c proll-patch10/src/vcons_zs.c
2588 3197 --- proll_18.orig/src/vcons_zs.c 1970-01-01 00:00:00.000000000 +0000
2589   -+++ proll-patch8/src/vcons_zs.c 2005-03-20 10:25:39.000000000 +0000
  3198 ++++ proll-patch10/src/vcons_zs.c 2005-04-10 07:01:03.000000000 +0000
2590 3199 @@ -0,0 +1,68 @@
2591 3200 +/**
2592 3201 + ** 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
2648 3257 + unsigned zs_ptr = (unsigned) t->impl;
2649 3258 +
2650 3259 + while ((ldb_bypass(zs_ptr) & 1) != 1) { }
2651   -+ return ldb_bypass(zs_ptr + ZS_DATA);
  3260 ++ return ldb_bypass(zs_ptr + ZS_DATA) & 0xff;
2652 3261 +}
2653 3262 +
2654 3263 +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
2656 3265 + /* violent crash in the end */
2657 3266 + ;
2658 3267 +}
2659   -diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
  3268 +diff -ruN proll_18.orig/src/vconsole.c proll-patch10/src/vconsole.c
2660 3269 --- proll_18.orig/src/vconsole.c 1999-11-08 03:10:28.000000000 +0000
2661   -+++ proll-patch8/src/vconsole.c 2005-03-02 14:29:05.000000000 +0000
2662   -@@ -13,6 +13,10 @@
  3270 ++++ proll-patch10/src/vconsole.c 2005-04-17 19:23:21.000000000 +0000
  3271 +@@ -7,12 +7,17 @@
  3272 + #include "vconsole.h"
  3273 +
  3274 + #include "hconsole.h"
  3275 ++#include <system.h>
  3276 +
  3277 + static void vcon_i_cursfeed(struct vconterm *t);
  3278 + static void vcon_i_backflush(struct vconterm *t);
2663 3279  
2664 3280 struct hconsole hcons0;
2665 3281  
... ... @@ -2670,7 +3286,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
2670 3286 int vcon_init(struct vconterm *t, unsigned int a0)
2671 3287 {
2672 3288 struct hconsole *hconp;
2673   -@@ -25,11 +29,49 @@
  3289 +@@ -25,11 +30,49 @@
2674 3290  
2675 3291 t->vc_x = 0; t->vc_y = 0;
2676 3292 t->backp = 0; t->backc = 0;
... ... @@ -2720,7 +3336,7 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
2720 3336 int vcon_write(struct vconterm *t, char *data, int leng)
2721 3337 {
2722 3338 int l = leng;
2723   -@@ -40,29 +82,84 @@
  3339 +@@ -40,29 +83,99 @@
2724 3340 if (l <= 0) break;
2725 3341 c = *data++; --l;
2726 3342  
... ... @@ -2741,6 +3357,9 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
2741 3357 + case 'M':
2742 3358 + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1);
2743 3359 + break;
  3360 ++ default:
  3361 ++ printk("Unhandled escape code '%c'\n", c);
  3362 ++ break;
2744 3363 + }
2745 3364 break;
2746 3365 - case 0x0D: /* Return */
... ... @@ -2768,9 +3387,21 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
2768 3387 + if (t->vc_par[1]) t->vc_par[1]--;
2769 3388 + gotoxay(t, t->vc_par[1], t->vc_par[0]);
2770 3389 + break;
  3390 ++ case 'J':
  3391 ++ if (t->vc_par[0] == 0) {
  3392 ++ //erase from cursor to end of display
  3393 ++ hcon_clear(hconp, t->vc_y, t->vc_x, hconp->ydim_, hconp->xdim_);
  3394 ++ }
  3395 ++ break;
2771 3396 + case 'M':
2772 3397 + hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1);
2773 3398 + break;
  3399 ++ case 'm':
  3400 ++ break;
  3401 ++ default:
  3402 ++ printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n",
  3403 ++ c, t->vc_par[0], t->vc_par[1], t->vc_par[2], t->vc_par[3], t->vc_par[4]);
  3404 ++ break;
2774 3405 + }
2775 3406 break;
2776 3407 default:
... ... @@ -2823,9 +3454,73 @@ diff -ruN proll_18.orig/src/vconsole.c proll-patch8/src/vconsole.c
2823 3454 }
2824 3455 }
2825 3456 }
2826   -diff -ruN proll_18.orig/src/vconsole.h proll-patch8/src/vconsole.h
  3457 +@@ -100,9 +213,62 @@
  3458 + return 0;
  3459 + }
  3460 +
  3461 ++static const unsigned char sunkbd_keycode[128] = {
  3462 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3463 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3464 ++ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8,
  3465 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
  3466 ++ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']',
  3467 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3468 ++ 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13,
  3469 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3470 ++ 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
  3471 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3472 ++ ' ',
  3473 ++};
  3474 ++
  3475 ++static const unsigned char sunkbd_keycode_shifted[128] = {
  3476 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3477 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3478 ++ '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8,
  3479 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
  3480 ++ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',
  3481 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3482 ++ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13,
  3483 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3484 ++ 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
  3485 ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3486 ++ ' ',
  3487 ++};
  3488 ++
  3489 ++static int shiftstate;
  3490 ++
  3491 + int vcon_getch(struct vconterm *t)
  3492 + {
  3493 +- return -1;
  3494 ++ int ch;
  3495 ++
  3496 ++ while ((ldb_bypass(0x71000004) & 1) != 1) { }
  3497 ++ do {
  3498 ++ ch = ldb_bypass(0x71000006) & 0xff;
  3499 ++ if (ch == 99)
  3500 ++ shiftstate |= 1;
  3501 ++ else if (ch == 110)
  3502 ++ shiftstate |= 2;
  3503 ++ else if (ch == 227)
  3504 ++ shiftstate &= ~1;
  3505 ++ else if (ch == 238)
  3506 ++ shiftstate &= ~2;
  3507 ++ //printk("getch: %d\n", ch);
  3508 ++ }
  3509 ++ while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release
  3510 ++ //printk("getch rel: %d\n", ch);
  3511 ++ ch &= 0x7f;
  3512 ++ if (shiftstate)
  3513 ++ ch = sunkbd_keycode_shifted[ch];
  3514 ++ else
  3515 ++ ch = sunkbd_keycode[ch];
  3516 ++ //printk("getch xlate: %d\n", ch);
  3517 ++ return ch;
  3518 + }
  3519 +
  3520 + void vcon_fini(struct vconterm *t)
  3521 +diff -ruN proll_18.orig/src/vconsole.h proll-patch10/src/vconsole.h
2827 3522 --- proll_18.orig/src/vconsole.h 1999-11-08 00:58:13.000000000 +0000
2828   -+++ proll-patch8/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000
  3523 ++++ proll-patch10/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000
2829 3524 @@ -6,6 +6,8 @@
2830 3525 #ifndef VCONSOLE_H
2831 3526 #define VCONSOLE_H
... ...