WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [qemu] Update ioemu to qemu 0.8.2.

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [qemu] Update ioemu to qemu 0.8.2.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Mon, 07 Aug 2006 19:20:19 +0000
Delivery-date: Mon, 07 Aug 2006 12:23:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User chris@xxxxxxxxxxxxxxxxxxxxxxxx
# Node ID 06e2a95d33952a03c8b2d2b665b325c4d2343de0
# Parent  98fc8b05193c35147bf37bd6684a2d88f0fffd54
[qemu] Update ioemu to qemu 0.8.2.

Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxxx>
---
 tools/ioemu/pc-bios/proll.patch | 3836 ----------------------------------------
 1 files changed, 3836 deletions(-)

diff -r 98fc8b05193c -r 06e2a95d3395 tools/ioemu/pc-bios/proll.patch
--- a/tools/ioemu/pc-bios/proll.patch   Mon Aug 07 18:26:20 2006 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,4067 +0,0 @@
-diff -ruN proll_18.orig/Makefile proll-patch-15/Makefile
---- proll_18.orig/Makefile     2002-09-13 14:16:59.000000000 +0000
-+++ proll-patch-15/Makefile    2005-11-09 18:14:51.000000000 +0000
-@@ -4,6 +4,7 @@
-       make -C krups-ser    all
-       make -C espresso     all
-       make -C espresso-ser all
-+      make -C qemu all
- 
- clean:
-       make -C mrcoffee clean
-@@ -11,3 +12,4 @@
-       make -C krups-ser    clean
-       make -C espresso     clean
-       make -C espresso-ser clean
-+      make -C qemu clean
-diff -ruN proll_18.orig/qemu/Makefile proll-patch-15/qemu/Makefile
---- proll_18.orig/qemu/Makefile        1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/qemu/Makefile       2005-08-14 10:25:06.000000000 +0000
-@@ -0,0 +1,123 @@
-+#
-+# proll:
-+# qemu/Makefile - make PROLL for QEMU
-+# $Id: proll.patch,v 1.6 2005/11/11 00:24:57 bellard Exp $
-+#
-+# Copyright 1999 Pete Zaitcev
-+# This is Free Software is licensed under terms of GNU General Public License.
-+#
-+
-+CC = gcc
-+
-+#CROSS = /usr/local/sparc/bin/sparc-sun-linux-
-+CROSS = sparc-unknown-linux-gnu-
-+
-+CROSSCC = $(CROSS)gcc
-+CROSSLD = $(CROSS)ld
-+CROSSNM = $(CROSS)nm
-+
-+RM = /bin/rm -f
-+ELFTOAOUT = elftoaout
-+
-+#
-+SRC = ../src
-+
-+# Due to remapping algorithm PROLBASE should be algned on PMD.
-+# We make PROLBASE a define instead of using _start because we
-+# want to shift it to form a PGD entry. A relocatable label will not work.
-+# Linux kernel expects us to be at LINUX_OPPROM_BEGVM <asm-sparc/openprom.h>.
-+PROLBASE =   0xffd00000
-+PROLRODATA = 0xffd08000
-+PROLDATA =   0xffd0b000
-+PROLSIZE = 240*1024
-+
-+# Linux
-+# Fixed %g6 is for arch/sparc/kernel/head.S, it seems ok w/o -ffixed-g6.
-+# Kernel uses -fcall-used-g5 -fcall-used-g7, we probably do not need them.
-+# __ANSI__ is supposed to be on by default but it is not.
-+CFLAGS = -O2 -W -Wall -DPROLBASE=$(PROLBASE) -DPROLDATA=$(PROLDATA) 
-DPROLRODATA=$(PROLRODATA) -D__ANSI__=1 -I$(SRC) -mcpu=hypersparc -Wa,-xarch=v8 
-g -DQEMU -m32 -fno-builtin
-+ASFLAGS = -D__ASSEMBLY__ -I$(SRC) -DPROLRODATA=$(PROLRODATA) 
-DPROLDATA=$(PROLDATA) -DPROLSIZE=$(PROLSIZE) -g -Wa,-xarch=v8 -Wa,-32
-+# Solaris or Linux/i386 cross compilation
-+#CFLAGS = -Iinclude -O
-+
-+LDFLAGS = -N -Ttext $(PROLBASE) --section-start .rodata=$(PROLRODATA) -Tdata 
$(PROLDATA) -Tbss $(PROLDATA)
-+
-+ALL = proll.aout
-+PROLLEXE = proll.elf
-+
-+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 esp.o
-+
-+all:           $(ALL)
-+
-+$(PROLLEXE):   $(OBJS)
-+      $(CROSSLD) $(LDFLAGS) -o $(PROLLEXE) $(OBJS)
-+
-+head.o:         head.S $(SRC)/phys_jj.h \
-+  $(SRC)/asi.h $(SRC)/psr.h $(SRC)/crs.h
-+      $(CROSSCC) $(ASFLAGS) -DPROLBASE=$(PROLBASE) -o $*.o -c $*.S
-+
-+main.o:         main.c $(SRC)/asi.h $(SRC)/pgtsrmmu.h $(SRC)/iommu.h \
-+  $(SRC)/phys_jj.h $(SRC)/vconsole.h $(SRC)/version.h $(SRC)/general.h \
-+  $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arpa.h $(SRC)/system.h
-+      $(CROSSCC) $(CFLAGS) -c $*.c
-+openprom.o:   openprom.c $(SRC)/openprom.h $(SRC)/general.h $(SRC)/romlib.h \
-+  $(SRC)/vconsole.h $(SRC)/system.h $(SRC)/phys_jj.h
-+      $(CROSSCC) $(CFLAGS) -c $*.c
-+
-+system_qemu.o:       system_qemu.c $(SRC)/vconsole.h $(SRC)/pgtsrmmu.h \
-+  $(SRC)/timer.h $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/asi.h \
-+  $(SRC)/netpriv.h $(SRC)/arpa.h $(SRC)/system.h $(SRC)/crs.h
-+      $(CROSSCC) $(CFLAGS) -c $*.c
-+iommu.o:        $(SRC)/iommu.c $(SRC)/pgtsrmmu.h $(SRC)/phys_jj.h 
$(SRC)/iommu.h \
-+ $(SRC)/vconsole.h $(SRC)/general.h $(SRC)/romlib.h $(SRC)/system.h 
$(SRC)/asi.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+vconsole.o:   $(SRC)/vconsole.c $(SRC)/vconsole.h $(SRC)/hconsole.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+vcons_zs.o:   $(SRC)/vcons_zs.c $(SRC)/vconsole.h $(SRC)/system.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+hconsole.o:   $(SRC)/hconsole.c $(SRC)/hconsole.h $(SRC)/rconsole.h 
$(SRC)/phys_jj.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+rconsole.o:   $(SRC)/rconsole.c $(SRC)/rconsole.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+printf.o:       $(SRC)/printf.c
-+      $(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
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+tftp.o:               $(SRC)/tftp.c $(SRC)/general.h $(SRC)/net.h 
$(SRC)/arpa.h $(SRC)/romlib.h $(SRC)/tftp.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+udp.o:                $(SRC)/udp.c $(SRC)/general.h $(SRC)/net.h 
$(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h $(SRC)/ip.h $(SRC)/udp.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+packet.o:     $(SRC)/packet.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h 
$(SRC)/netpriv.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+sched_4m.o:   $(SRC)/sched_4m.c $(SRC)/system.h $(SRC)/general.h 
$(SRC)/romlib.h $(SRC)/phys_jj.h
-+      $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
-+bootp.o:      $(SRC)/bootp.c $(SRC)/general.h $(SRC)/net.h \
-+  $(SRC)/arpa.h $(SRC)/romlib.h $(SRC)/system.h $(SRC)/bootp.h
-+      $(CROSSCC) $(CFLAGS) -DNOBPEXT=1 -c $(SRC)/$*.c
-+
-+wuf.o:                $(SRC)/wuf.S
-+      $(CROSSCC) $(ASFLAGS) -o $*.o -c $(SRC)/$*.S
-+wof.o:                $(SRC)/wof.S
-+      $(CROSSCC) $(ASFLAGS) -o $*.o -c $(SRC)/$*.S
-+
-+#genlab.o:      genlab.c
-+#     $(CC) -c $*.c
-+#
-+#genlab:        genlab.o
-+#     $(CC) -o genlab genlab.o
-+
-+clean:
-+      $(RM) $(OBJS)
-+      $(RM) $(PROLLEXE) proll.aout
-+
-+proll.aout:   $(PROLLEXE)
-+      $(ELFTOAOUT) -o proll.aout $(PROLLEXE)
-diff -ruN proll_18.orig/qemu/head.S proll-patch-15/qemu/head.S
---- proll_18.orig/qemu/head.S  1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/qemu/head.S 2005-07-12 22:24:17.000000000 +0000
-@@ -0,0 +1,543 @@
-+/**
-+ ** Standalone startup code for Linux PROM emulator.
-+ ** Copyright 1999 Pete A. Zaitcev
-+ ** This code is licensed under GNU General Public License.
-+ **/
-+/*
-+ * $Id: proll.patch,v 1.6 2005/11/11 00:24:57 bellard Exp $
-+ */
-+
-+#include <psr.h>
-+#include <asi.h>
-+#include <crs.h>
-+/* #include <asm/head.h> */   /* Trap entries. Do not use. */
-+#include "phys_jj.h"
-+
-+#define C_LABEL(name) name
-+#define REGWIN_SZ   0x40
-+
-+#define WRITE_PAUSE    nop; nop; nop; /* Have to do this after %wim/%psr chg 
*/
-+
-+  /* 22 is 24-2, (va)>>(SRMMU_PGDIR_SHIFT-PTESIZESHFT) */
-+#define VATOPGDOFF(va) (((va)>>22)&0x3FC)
-+#define VATOPMDOFF(va) (((va)>>16)&0xFC)
-+
-+#define NOP_INSN       0x01000000     /* Used to patch sparc_save_state */
-+
-+/* Here are some trap goodies */
-+
-+#if 0
-+/* Generic trap entry. */
-+#define TRAP_ENTRY(type, label) \
-+      rd %psr, %l0; b label; rd %wim, %l3; nop;
-+#endif
-+
-+/* Data/text faults. */
-+#define SRMMU_TFAULT rd %psr, %l0; rd %wim, %l3; b C_LABEL(srmmu_fault); mov 
1, %l7;
-+#define SRMMU_DFAULT rd %psr, %l0; rd %wim, %l3; b C_LABEL(srmmu_fault); mov 
0, %l7;
-+
-+#if 0
-+/* This is for traps we should NEVER get. */
-+#define BAD_TRAP(num) \
-+        rd %psr, %l0; mov num, %l7; b bad_trap_handler; rd %wim, %l3;
-+
-+/* This is for traps when we want just skip the instruction which caused it */
-+#define SKIP_TRAP(type, name) \
-+      jmpl %l2, %g0; rett %l2 + 4; nop; nop;
-+
-+/* Notice that for the system calls we pull a trick.  We load up a
-+ * different pointer to the system call vector table in %l7, but call
-+ * the same generic system call low-level entry point.  The trap table
-+ * entry sequences are also HyperSparc pipeline friendly ;-)
-+ */
-+
-+/* Software trap for Linux system calls. */
-+#define LINUX_SYSCALL_TRAP \
-+        sethi %hi(C_LABEL(sys_call_table)), %l7; \
-+        or %l7, %lo(C_LABEL(sys_call_table)), %l7; \
-+        b linux_sparc_syscall; \
-+        rd %psr, %l0;
-+
-+/* Software trap for SunOS4.1.x system calls. */
-+#define SUNOS_SYSCALL_TRAP \
-+        rd %psr, %l0; \
-+        sethi %hi(C_LABEL(sunos_sys_table)), %l7; \
-+        b linux_sparc_syscall; \
-+        or %l7, %lo(C_LABEL(sunos_sys_table)), %l7;
-+
-+/* Software trap for Slowaris system calls. */
-+#define SOLARIS_SYSCALL_TRAP \
-+        b solaris_syscall; \
-+        rd %psr, %l0; \
-+        nop; \
-+        nop;
-+
-+#define INDIRECT_SOLARIS_SYSCALL(x) \
-+      mov x, %g1; \
-+      b solaris_syscall; \
-+      rd %psr, %l0; \
-+      nop;
-+
-+#define BREAKPOINT_TRAP \
-+      b breakpoint_trap; \
-+      rd %psr,%l0; \
-+      nop; \
-+      nop;
-+
-+/* Software trap for Sparc-netbsd system calls. */
-+#define NETBSD_SYSCALL_TRAP \
-+        sethi %hi(C_LABEL(sys_call_table)), %l7; \
-+        or %l7, %lo(C_LABEL(sys_call_table)), %l7; \
-+        b bsd_syscall; \
-+        rd %psr, %l0;
-+
-+/* The Get Condition Codes software trap for userland. */
-+#define GETCC_TRAP \
-+        b getcc_trap_handler; mov %psr, %l0; nop; nop;
-+
-+/* The Set Condition Codes software trap for userland. */
-+#define SETCC_TRAP \
-+        b setcc_trap_handler; mov %psr, %l0; nop; nop;
-+
-+/* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and
-+ * gets handled with another macro.
-+ */
-+#define TRAP_ENTRY_INTERRUPT(int_level) \
-+        mov int_level, %l7; rd %psr, %l0; b real_irq_entry; rd %wim, %l3;
-+
-+/* NMI's (Non Maskable Interrupts) are special, you can't keep them
-+ * from coming in, and basically if you get one, the shows over. ;(
-+ * On the sun4c they are usually asynchronous memory errors, on the
-+ * the sun4m they could be either due to mem errors or a software
-+ * initiated interrupt from the prom/kern on an SMP box saying "I
-+ * command you to do CPU tricks, read your mailbox for more info."
-+ */
-+#define NMI_TRAP \
-+        rd %wim, %l3; b linux_trap_nmi_sun4c; mov %psr, %l0; nop;
-+
-+#endif
-+
-+/* Window overflows/underflows are special and we need to try to be as
-+ * efficient as possible here....
-+ */
-+#define WINDOW_SPILL \
-+        rd %psr, %l0; rd %wim, %l3; b spill_window_entry; nop;
-+
-+#define WINDOW_FILL \
-+        rd %psr, %l0; rd %wim, %l3; b fill_window_entry; nop;
-+
-+#define STUB_TRAP     ba stub_trap; nop; nop; nop;
-+
-+#define TRAP_ENTRY(a,b)               STUB_TRAP
-+#define SKIP_TRAP(a,b)                STUB_TRAP
-+#define SUNOS_SYSCALL_TRAP    STUB_TRAP
-+#define SOLARIS_SYSCALL_TRAP  STUB_TRAP
-+#define NETBSD_SYSCALL_TRAP   STUB_TRAP
-+#define LINUX_SYSCALL_TRAP    STUB_TRAP
-+#define BREAKPOINT_TRAP               STUB_TRAP
-+#define NMI_TRAP              STUB_TRAP
-+#define GETCC_TRAP            STUB_TRAP
-+#define SETCC_TRAP            STUB_TRAP
-+#define BAD_TRAP(n)           STUB_TRAP
-+#define       TRAP_ENTRY_INTERRUPT(i)         STUB_TRAP
-+#define       INDIRECT_SOLARIS_SYSCALL(i)     STUB_TRAP
-+
-+      .section ".text"
-+      .globl start, _start
-+_start:
-+start:
-+      .globl spill_window_entry, fill_window_entry
-+
-+#define       EXPORT_TRAP(trap) \
-+      .globl trap; \
-+      .type trap,function; \
-+      .size trap, 16
-+
-+EXPORT_TRAP(t_zero)
-+EXPORT_TRAP(t_wovf)
-+EXPORT_TRAP(t_wunf)
-+EXPORT_TRAP(t_irq1)
-+EXPORT_TRAP(t_irq2)
-+EXPORT_TRAP(t_irq3)
-+EXPORT_TRAP(t_irq4)
-+EXPORT_TRAP(t_irq5)
-+EXPORT_TRAP(t_irq6)
-+EXPORT_TRAP(t_irq7)
-+EXPORT_TRAP(t_irq8)
-+EXPORT_TRAP(t_irq9)
-+EXPORT_TRAP(t_irq10)
-+EXPORT_TRAP(t_irq11)
-+EXPORT_TRAP(t_irq12)
-+EXPORT_TRAP(t_irq13)
-+EXPORT_TRAP(t_irq14)
-+EXPORT_TRAP(t_irq15)
-+
-+C_LABEL(trapbase):
-+t_zero:       b goprol; nop; nop; nop;
-+t_tflt:       SRMMU_TFAULT                        /* Inst. Access Exception   
     */
-+t_bins:       TRAP_ENTRY(0x2, bad_instruction)    /* Illegal Instruction      
     */
-+t_pins:       TRAP_ENTRY(0x3, priv_instruction)   /* Privileged Instruction   
     */
-+t_fpd:        TRAP_ENTRY(0x4, fpd_trap_handler)   /* Floating Point Disabled  
     */
-+t_wovf:       WINDOW_SPILL                        /* Window Overflow          
     */
-+t_wunf:       WINDOW_FILL                         /* Window Underflow         
     */
-+t_mna:        TRAP_ENTRY(0x7, mna_handler)        /* Memory Address Not 
Aligned    */
-+t_fpe:        TRAP_ENTRY(0x8, fpe_trap_handler)   /* Floating Point Exception 
     */
-+t_dflt:       SRMMU_DFAULT                        /* Data Miss Exception      
     */
-+t_tio:        TRAP_ENTRY(0xa, do_tag_overflow)    /* Tagged Instruction 
Ovrflw     */
-+t_wpt:        TRAP_ENTRY(0xb, do_watchpoint)      /* Watchpoint Detected      
     */
-+t_badc:       BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) 
BAD_TRAP(0x10)
-+t_irq1:       TRAP_ENTRY_INTERRUPT(1)             /* IRQ Software/SBUS Level 
1     */
-+t_irq2:       TRAP_ENTRY_INTERRUPT(2)             /* IRQ SBUS Level 2         
     */
-+t_irq3:       TRAP_ENTRY_INTERRUPT(3)             /* IRQ SCSI/DMA/SBUS Level 
3     */
-+t_irq4:       TRAP_ENTRY_INTERRUPT(4)             /* IRQ Software Level 4     
     */
-+t_irq5:       TRAP_ENTRY_INTERRUPT(5)             /* IRQ SBUS/Ethernet Level 
5     */
-+t_irq6:       TRAP_ENTRY_INTERRUPT(6)             /* IRQ Software Level 6     
     */
-+t_irq7:       TRAP_ENTRY_INTERRUPT(7)             /* IRQ Video/SBUS Level 5   
     */
-+t_irq8:       TRAP_ENTRY_INTERRUPT(8)             /* IRQ SBUS Level 6         
     */
-+t_irq9:       TRAP_ENTRY_INTERRUPT(9)             /* IRQ SBUS Level 7         
     */
-+t_irq10:TRAP_ENTRY_INTERRUPT(10)            /* IRQ Timer #1 (one we use)     
*/
-+t_irq11:TRAP_ENTRY_INTERRUPT(11)            /* IRQ Floppy Intr.              
*/
-+t_irq12:TRAP_ENTRY_INTERRUPT(12)            /* IRQ Zilog serial chip         
*/
-+t_irq13:TRAP_ENTRY_INTERRUPT(13)            /* IRQ Audio Intr.               
*/
-+t_irq14:TRAP_ENTRY_INTERRUPT(14)            /* IRQ Timer #2                  
*/
-+t_nmi:        NMI_TRAP                            /* Level 15 (NMI)           
     */
-+t_racc:       TRAP_ENTRY(0x20, do_reg_access)     /* General Register Access 
Error */
-+t_iacce:BAD_TRAP(0x21)                      /* Instr Access Error            
*/
-+t_bad22:BAD_TRAP(0x22) BAD_TRAP(0x23)
-+t_cpdis:TRAP_ENTRY(0x24, do_cp_disabled)    /* Co-Processor Disabled         
*/
-+t_uflsh:SKIP_TRAP(0x25, unimp_flush)        /* Unimplemented FLUSH inst.     
*/
-+t_bad26:BAD_TRAP(0x26) BAD_TRAP(0x27)
-+t_cpexc:TRAP_ENTRY(0x28, do_cp_exception)   /* Co-Processor Exception        
*/
-+t_dacce:SRMMU_DFAULT                        /* Data Access Error             
*/
-+t_hwdz:       TRAP_ENTRY(0x2a, do_hw_divzero)     /* Division by zero, you 
lose... */
-+t_dserr:BAD_TRAP(0x2b)                      /* Data Store Error              
*/
-+t_daccm:BAD_TRAP(0x2c)                      /* Data Access MMU-Miss          
*/
-+t_bad2d:               BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f)
-+        BAD_TRAP(0x30) BAD_TRAP(0x31) BAD_TRAP(0x32) BAD_TRAP(0x33)
-+        BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) BAD_TRAP(0x37)
-+        BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b)
-+t_iaccm:BAD_TRAP(0x3c)                      /* Instr Access MMU-Miss         
*/
-+ BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f)
-+ BAD_TRAP(0x40) BAD_TRAP(0x41) BAD_TRAP(0x42) BAD_TRAP(0x43)
-+ BAD_TRAP(0x44) BAD_TRAP(0x45) BAD_TRAP(0x46) BAD_TRAP(0x47)
-+ BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) BAD_TRAP(0x4b)
-+ BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f)
-+ BAD_TRAP(0x50) BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53)
-+ BAD_TRAP(0x54) BAD_TRAP(0x55) BAD_TRAP(0x56) BAD_TRAP(0x57)
-+ BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) BAD_TRAP(0x5b)
-+ BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f)
-+ BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63)
-+ BAD_TRAP(0x64) BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67)
-+ BAD_TRAP(0x68) BAD_TRAP(0x69) BAD_TRAP(0x6a) BAD_TRAP(0x6b)
-+ BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) BAD_TRAP(0x6f)
-+ BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73)
-+ BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77)
-+ BAD_TRAP(0x78) BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b)
-+ BAD_TRAP(0x7c) BAD_TRAP(0x7d) BAD_TRAP(0x7e) BAD_TRAP(0x7f)
-+t_sunos:SUNOS_SYSCALL_TRAP                  /* SunOS System Call             
*/
-+t_sbkpt:BREAKPOINT_TRAP                     /* Software Breakpoint/KGDB      
*/
-+t_divz:       BAD_TRAP(0x82)                      /* Divide by zero trap      
     */
-+t_flwin:TRAP_ENTRY(0x83, do_flush_windows)  /* Flush Windows Trap            
*/
-+t_clwin:BAD_TRAP(0x84)                      /* Clean Windows Trap            
*/
-+t_rchk:       BAD_TRAP(0x85)                      /* Range Check              
     */
-+t_funal:BAD_TRAP(0x86)                      /* Fix Unaligned Access Trap     
*/
-+t_iovf:       BAD_TRAP(0x87)                      /* Integer Overflow Trap    
     */
-+t_slowl:SOLARIS_SYSCALL_TRAP                /* Slowaris System Call          
*/
-+t_netbs:NETBSD_SYSCALL_TRAP                 /* Net-B.S. System Call          
*/
-+t_bad8a:BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) BAD_TRAP(0x8d)
-+ BAD_TRAP(0x8e) BAD_TRAP(0x8f)
-+t_linux:LINUX_SYSCALL_TRAP                  /* Linux System Call             
*/
-+t_bad91:BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93)
-+ BAD_TRAP(0x94) BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97)
-+ BAD_TRAP(0x98) BAD_TRAP(0x99) BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) 
BAD_TRAP(0x9d) BAD_TRAP(0x9e) BAD_TRAP(0x9f)
-+t_getcc:GETCC_TRAP                          /* Get Condition Codes           
*/
-+t_setcc:SETCC_TRAP                          /* Set Condition Codes           
*/
-+t_bada2:BAD_TRAP(0xa2) BAD_TRAP(0xa3)
-+ BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
-+t_slowi:INDIRECT_SOLARIS_SYSCALL(156)
-+ BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
-+ BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf)
-+ BAD_TRAP(0xb0) BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3)
-+ BAD_TRAP(0xb4) BAD_TRAP(0xb5) BAD_TRAP(0xb6) BAD_TRAP(0xb7)
-+ BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) BAD_TRAP(0xbb)
-+ BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf)
-+t_badc0:BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3)
-+ BAD_TRAP(0xc4) BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7)
-+ BAD_TRAP(0xc8) BAD_TRAP(0xc9) BAD_TRAP(0xca) BAD_TRAP(0xcb)
-+ BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) BAD_TRAP(0xcf)
-+ BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3)
-+t_badd4:BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7)
-+ BAD_TRAP(0xd8) BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb)
-+ BAD_TRAP(0xdc) BAD_TRAP(0xdd) BAD_TRAP(0xde) BAD_TRAP(0xdf)
-+ BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) BAD_TRAP(0xe3)
-+ BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7)
-+t_bade8:BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb)
-+ BAD_TRAP(0xec) BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef)
-+ BAD_TRAP(0xf0) BAD_TRAP(0xf1) BAD_TRAP(0xf2) BAD_TRAP(0xf3)
-+ BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) BAD_TRAP(0xf7)
-+ BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb)
-+t_badfc:BAD_TRAP(0xfc) BAD_TRAP(0xfd)
-+dbtrap:       BAD_TRAP(0xfe)                      /* Debugger/PROM breakpoint 
#1   */
-+dbtrap2:BAD_TRAP(0xff)                      /* Debugger/PROM breakpoint #2   
*/       
-+
-+stub_trap:
-+   set (PHYS_JJ_TCX_FB + 0xbf0), %g5  /* 2 cells from side */
-+   set 0x00ffffff, %g4
-+   sta %g4, [%g5] ASI_M_BYPASS
-+1:    ba 1b; nop
-+
-+      .section ".bss"
-+      .align 8
-+bss_start:
-+      .align  0x1000          ! PAGE_SIZE
-+      .globl C_LABEL(bootup_user_stack)
-+        .type   bootup_user_stack,#object
-+        .size   bootup_user_stack,0x2000
-+C_LABEL(bootup_user_stack):           .skip 0x2000
-+
-+      .section ".text"
-+      .register %g2, #scratch
-+      .register %g3, #scratch
-+      .register %g6, #scratch
-+      .register %g7, #scratch
-+
-+goprol:
-+      ! %g1 contains end of memory
-+      set     PHYS_JJ_EEPROM + 0x30, %g1
-+      lda     [%g1] ASI_M_BYPASS, %g1
-+      ! map PROLDATA to PROLBASE+PROLSIZE to end of ram
-+      set     PROLSIZE+0x1000-PROLDATA+PROLBASE, %g2  ! add 0x1000 for temp 
tables
-+      sub     %g1, %g2, %g2                   ! start of private memory
-+      srl     %g2, 0x4, %g7                   ! ctx table at s+0x0
-+      add     %g2, 0x400, %g3                 ! l1 table at s+0x400
-+      srl     %g3, 0x4, %g3
-+      or      %g3, 0x1, %g3
-+      sta     %g3, [%g2] ASI_M_BYPASS
-+      add     %g2, 0x400, %g2                 ! s+0x400
-+      add     %g2, 0x800, %g3                 ! l2 table for ram (00xxxxxx) 
at s+0x800
-+      srl     %g3, 0x4, %g3
-+      or      %g3, 0x1, %g3
-+      sta     %g3, [%g2] ASI_M_BYPASS
-+      add     %g2, 0x500, %g3                 ! l2 table for rom (ffxxxxxx) 
at s+0x900
-+      add     %g2, 0x3fc, %g2                 ! s+0x7fc
-+      srl     %g3, 0x4, %g3
-+      or      %g3, 0x1, %g3
-+      sta     %g3, [%g2] ASI_M_BYPASS
-+      add     %g2, 0x4, %g2                   ! s+0x800
-+      set     ((7 << 2) | 2), %g3             ! 7 = U: --- S: RWX (main 
memory)
-+      sta     %g3, [%g2] ASI_M_BYPASS
-+      add     %g2, 0x200, %g3                 ! l3 table for rom at s+0xa00
-+      add     %g2, 0x1d0, %g2                 ! s+0x9d0
-+      srl     %g3, 0x4, %g3
-+      or      %g3, 0x1, %g3
-+      sta     %g3, [%g2] ASI_M_BYPASS
-+      add     %g2, 0x30, %g2                  ! s+0xa00
-+
-+      set     PROLBASE, %g3
-+      set     0x1000, %g5
-+      set     (PROLDATA-PROLBASE)/0x1000, %g6 ! # of .text pages
-+1:    srl     %g3, 0x4, %g4
-+      or      %g4, ((7 << 2) | 2), %g4        ! 4 = U: --X S: --X (rom, 
execute only)
-+      sta     %g4, [%g2] ASI_M_BYPASS
-+      add     %g2, 4, %g2
-+      add     %g3, %g5, %g3
-+      deccc   %g6
-+      bne     1b
-+       nop
-+#if 0 
-+      set     (PROLDATA-PROLRODATA)/0x1000, %g6 ! # of .rodata pages
-+1:    srl     %g3, 0x4, %g4
-+      or      %g4, ((0 << 2) | 2), %g4        ! 0 = U: R-- S: R-- (rom, read 
only)
-+      sta     %g4, [%g2] ASI_M_BYPASS
-+      add     %g2, 4, %g2
-+      add     %g3, %g5, %g3
-+      deccc   %g6
-+      bne     1b
-+       nop
-+#endif
-+      set     (PROLBASE+PROLSIZE-PROLDATA)/0x1000, %g6 ! # of .bss pages
-+      set     0x1000, %g4
-+      sll     %g7, 0x4, %g3
-+      add     %g4, %g3, %g3
-+1:    srl     %g3, 0x4, %g4
-+      or      %g4, ((7 << 2) | 2), %g4        ! 5 = U: R-- S: RW- (data area, 
read/write)
-+      sta     %g4, [%g2] ASI_M_BYPASS
-+      add     %g2, 4, %g2
-+      add     %g3, %g5, %g3
-+      deccc   %g6
-+      bne     1b
-+       nop
-+
-+      mov     %g1, %g3
-+
-+      set     AC_M_CTPR, %g2
-+      sta     %g7, [%g2] ASI_M_MMUREGS        ! set ctx table ptr
-+      set     1, %g1
-+      sta     %g1, [%g0] ASI_M_MMUREGS        ! enable mmu
-+
-+      /*
-+       * The code which enables traps is a simplified version of
-+       * kernel head.S.
-+       *
-+       * We know number of windows as 8 so we do not calculate them.
-+       * The deadwood is here for any case.
-+       */
-+
-+      /* Turn on Supervisor, EnableFloating, and all the PIL bits.
-+       * Also puts us in register window zero with traps off.
-+       */
-+      set     (PSR_PS | PSR_S | PSR_PIL | PSR_EF), %g2
-+      wr      %g2, 0x0, %psr
-+      WRITE_PAUSE
-+
-+      /* I want a kernel stack NOW! */
-+      set     C_LABEL(bootup_user_stack), %g1
-+      set     (0x2000 - REGWIN_SZ), %g2
-+      add     %g1, %g2, %sp
-+      mov     0, %fp                  /* And for good luck */
-+
-+      /* Zero out our BSS section. */
-+      set     C_LABEL(bss_start) , %o0        ! First address of BSS
-+      set     C_LABEL(end) , %o1              ! Last address of BSS
-+      ba      2f
-+       nop
-+1:
-+      st      %g0, [%o0]
-+2:
-+      subcc   %o0, %o1, %g0
-+      bl      1b
-+       add    %o0, 0x4, %o0
-+
-+      mov     2, %g1
-+      wr      %g1, 0x0, %wim                  ! make window 1 invalid
-+      WRITE_PAUSE
-+
-+#if 0
-+      wr  %g0, 0x0, %wim
-+      WRITE_PAUSE
-+      save
-+      rd  %psr, %g3
-+      restore
-+      and  %g3, PSR_CWP, %g3
-+      add  %g3, 0x1, %g3
-+#else
-+      or      %g0, 8, %g3
-+#endif
-+
-+#if 0
-+      sethi   %hi( C_LABEL(cputyp) ), %o0
-+      st      %g7, [%o0 + %lo( C_LABEL(cputyp) )]
-+
-+      sethi   %hi( C_LABEL(nwindows) ), %g4
-+      st      %g3, [%g4 + %lo( C_LABEL(nwindows) )]
-+
-+      sub     %g3, 0x1, %g3
-+      sethi   %hi( C_LABEL(nwindowsm1) ), %g4
-+      st      %g3, [%g4 + %lo( C_LABEL(nwindowsm1) )]
-+#endif
-+
-+      /* Here we go, start using Linux's trap table... */
-+      set     C_LABEL(trapbase), %g3
-+      wr      %g3, 0x0, %tbr
-+      WRITE_PAUSE
-+
-+      /* Finally, turn on traps so that we can call c-code. */
-+      rd      %psr, %g3
-+      wr      %g3, 0x0, %psr
-+      WRITE_PAUSE
-+
-+      wr      %g3, PSR_ET, %psr
-+      WRITE_PAUSE
-+
-+      .globl prolmain
-+      call C_LABEL(prolmain)
-+       nop
-+
-+3:
-+      b       3b
-+       nop
-+
-+/*
-+ * Memory access trap handler
-+ *   %l0  program %psr from trap table entry
-+ *   %l1  program %pc from hardware
-+ *   %l2  program %npc from hardware
-+ *   %l3  program %wim from trap table entry
-+ *   %l4
-+ *   %l5
-+ *   %l6
-+ *   %l7  text flag from trap table entry
-+ */
-+
-+      .section ".text"
-+      .globl srmmu_fault
-+C_LABEL(srmmu_fault):
-+
-+      set AC_M_SFAR, %l6
-+      set AC_M_SFSR, %l5
-+      lda [%l6] ASI_M_MMUREGS, %l6
-+      lda [%l5] ASI_M_MMUREGS, %l5
-+
-+      set ignore_fault, %l5
-+      ld [%l5], %l5
-+      subcc %l5, %g0, %g0             /* NULL pointer trap faults always */
-+      be 3f
-+       nop
-+      subcc %l5, %l6, %g0
-+      be 2f
-+       nop
-+3:
-+
-+   set (PHYS_JJ_TCX_FB + 0xbf0), %g5  /* 2 cells from side */
-+   set 0x00ffffff, %g4
-+   sta %g4, [%g5] ASI_M_BYPASS
-+   add %g5, 8, %g5                    /* On right side */
-+   sta %g4, [%g5] ASI_M_BYPASS
-+1:    ba 1b; nop
-+
-+2:
-+      set C_LABEL(fault_ignored), %l5
-+      mov 1, %l6
-+      st %l6, [%l5]
-+
-+      /*
-+       * Skip the faulting instruction.
-+       * I think it works when next instruction is a branch even.
-+       */
-+      or %l2, 0, %l1
-+      add %l2, 4, %l2
-+
-+      wr %l0, 0, %psr
-+      WRITE_PAUSE
-+      jmp %l1
-+      rett %l2
-+
-+/*
-+ * Slow external versions of st_bypass and ld_bypass.
-+ * rconsole.c uses inlines. We call these in places which are not speed
-+ * critical, to avoid compiler bugs.
-+ */
-+      .globl C_LABEL(st_bypass)
-+C_LABEL(st_bypass):
-+      retl
-+       sta %o1, [%o0] ASI_M_BYPASS
-+      .globl C_LABEL(ld_bypass)
-+C_LABEL(ld_bypass):
-+      retl
-+       lda [%o0] ASI_M_BYPASS, %o0
-+      .globl C_LABEL(sth_bypass)
-+C_LABEL(sth_bypass):
-+      retl
-+       stha %o1, [%o0] ASI_M_BYPASS
-+      .globl C_LABEL(ldh_bypass)
-+C_LABEL(ldh_bypass):
-+      retl
-+       lduha [%o0] ASI_M_BYPASS, %o0
-+      .globl C_LABEL(stb_bypass)
-+C_LABEL(stb_bypass):
-+      retl
-+       stba %o1, [%o0] ASI_M_BYPASS
-+      .globl C_LABEL(ldb_bypass)
-+C_LABEL(ldb_bypass):
-+      retl
-+       lduba [%o0] ASI_M_BYPASS, %o0
-diff -ruN proll_18.orig/qemu/main.c proll-patch-15/qemu/main.c
---- proll_18.orig/qemu/main.c  1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/qemu/main.c 2005-08-14 10:07:48.000000000 +0000
-@@ -0,0 +1,185 @@
-+/**
-+ ** Proll (PROM replacement)
-+ ** Copyright 1999 Pete Zaitcev
-+ ** This code is licensed under GNU General Public License.
-+ **/
-+#include <stdarg.h>
-+
-+// #include <asm/contregs.h>
-+#include <asi.h>
-+#include "pgtsrmmu.h"
-+#include "iommu.h"            /* Typical SBus IOMMU for sun4m */
-+#include "phys_jj.h"
-+#include "vconsole.h"
-+#include "version.h"
-+#include <general.h>          /* __P() */
-+#include <net.h>              /* init_net() */
-+#include <romlib.h>           /* we are a provider for part of this. */
-+#include <netpriv.h>          /* myipaddr */
-+#include <arpa.h>
-+#include <system.h>           /* our own prototypes */
-+
-+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;
-+struct mem cmem;              /* Current memory, virtual */
-+struct mem cio;                       /* Current I/O space */
-+struct phym pmem;             /* Current phys. mem. */
-+struct iommu ciommu;          /* Our IOMMU on sun4m */
-+
-+static struct {
-+    const char id[16];
-+    unsigned int version;
-+    char pad1[0x1c]; // Pad to 0x30
-+    unsigned int ram_size;
-+    char boot_device;
-+    unsigned int load_addr, kernel_size;
-+    unsigned int cmdline, cmdline_len;
-+    char pad2[0x0c]; // Pad to 0x54
-+    unsigned short width, height, depth;
-+} *hw_idprom;
-+
-+int ignore_fault, fault_ignored;
-+void *printk_fn, *getch_fn;
-+unsigned int q_height, q_width;
-+
-+/*
-+ */
-+void prolmain()
-+{
-+      static char fname[14];
-+      static struct banks bb;
-+      unsigned int hiphybas;
-+      const void *romvec;
-+      unsigned int ram_size;
-+      char nographic, bootdev;
-+
-+      nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F);
-+      if (!nographic) {
-+          q_width = ldh_bypass(PHYS_JJ_EEPROM + 0x54);
-+          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;
-+      }
-+
-+
-+      printk("PROLL %s QEMU\n", PROLL_VERSION_STRING);
-+      ram_size = ld_bypass(PHYS_JJ_EEPROM + 0x30);
-+      printk("%d MB total\n", ram_size/(1024*1024));
-+
-+      bb.nbanks = 1;
-+      bb.bankv[0].start = 0;
-+      bb.bankv[0].length = ram_size;
-+
-+      hiphybas = ram_size - PROLSIZE;
-+
-+      mem_init(&cmem, (char *) &_end, (char *)(PROLBASE+PROLSIZE));
-+      makepages(&pmem, hiphybas);
-+      init_mmu_swift((unsigned int)pmem.pctp - PROLBASE + hiphybas);
-+
-+      mem_init(&cio, (char *)(PROLBASE+PROLSIZE),
-+          (char *)(PROLBASE+PROLSIZE+IOMAPSIZE));
-+
-+      iommu_init(&ciommu, hiphybas);
-+
-+      /*
-+       */
-+      init_idprom();
-+      printk("NVRAM: id %s version %d\n", hw_idprom->id, hw_idprom->version);
-+      if (!nographic)
-+          printk("Prom console: TCX %dx%d\n", q_width, q_height);
-+      else
-+          printk("Prom console: serial\n");
-+      sched_init();
-+      le_probe();
-+      init_net();
-+      esp_probe();
-+
-+      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
-+           * uses it to locate ourselves. If we load from boot_rec.bp_file,
-+           * we will loop reloading PROLL over and over again.
-+           * Thus we use traditional PROLL scheme HEXIPADDR.PROL (single L).
-+           */
-+          xtoa(myipaddr, fname, 8);
-+          fname[9] = '.';
-+          fname[10] = 'P';
-+          fname[11] = 'R';
-+          fname[12] = 'O';
-+          fname[13] = 'L';
-+          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,
-+                                  (void *)hw_idprom->cmdline, 
hw_idprom->boot_device, nographic);
-+
-+      printk("Memory used: virt 0x%x:0x%x[%dK] iomap 0x%x:0x%x\n",
-+          PROLBASE, (int)cmem.curp, ((unsigned) cmem.curp - PROLBASE)/1024,
-+          (int)cio.start, (int)cio.curp);
-+
-+      {
-+          void (*entry)(const void *, int, int, int, int) = (void *) 
hw_idprom->load_addr;
-+              printk("Kernel loaded at 0x%x, size %dK, command line = '%s'\n",
-+                     *entry, hw_idprom->kernel_size/1024, hw_idprom->cmdline);
-+              entry(romvec, 0, 0, 0, 0);
-+      }
-+
-+      mem_fini(&cmem);
-+      vcon_fini(&dp0);
-+}
-+
-+/*
-+ * dvma_alloc over iommu_alloc.
-+ */
-+void *dvma_alloc(int size, unsigned int *pphys)
-+{
-+      return iommu_alloc(&ciommu, size, pphys);
-+}
-+
-+/*
-+ */
-+void udelay(__attribute__((unused)) unsigned long usecs)
-+{
-+    // Qemu hardware is perfect and does not need any delays!
-+}
-+
-+static void init_idprom()
-+{
-+      void *va_prom;
-+
-+      if ((va_prom = map_io(PHYS_JJ_EEPROM, PHYS_JJ_EEPROM_SIZE)) == NULL) {
-+              printk("init_idprom: cannot map eeprom\n");
-+              fatal();
-+      }
-+      bcopy(va_prom + PHYS_JJ_IDPROM_OFF, idprom, IDPROM_SIZE);
-+      /*
-+       * hw_idprom is not used anywhere.
-+       * It's just as we hate to leave hanging pointers (I/O page here).
-+       */
-+      hw_idprom = va_prom; 
-+}
-+
-diff -ruN proll_18.orig/qemu/openprom.c proll-patch-15/qemu/openprom.c
---- proll_18.orig/qemu/openprom.c      1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/qemu/openprom.c     2005-11-07 20:11:04.000000000 +0000
-@@ -0,0 +1,910 @@
-+/*
-+ * PROM interface support
-+ * Copyright 1996 The Australian National University.
-+ * Copyright 1996 Fujitsu Laboratories Limited
-+ * Copyright 1999 Pete A. Zaitcev
-+ * This software may be distributed under the terms of the Gnu
-+ * Public License version 2 or later
-+ */
-+
-+#include <openprom.h>
-+#include <general.h>
-+#include <romlib.h>
-+#include <system.h>
-+#include <vconsole.h>
-+#include "phys_jj.h"
-+
-+//#define DEBUG_OBP
-+
-+#define PAGE_SIZE 4096
-+
-+struct property {
-+      const char *name;
-+      const char *value;
-+      int length;
-+};
-+
-+struct node {
-+      const struct property *properties;
-+      /* short */ const int sibling;
-+      /* short */ const int child;
-+};
-+
-+static int obp_nextnode(int node);
-+static int obp_child(int node);
-+static int obp_proplen(int node, char *name);
-+static int obp_getprop(int node, char *name, char *val);
-+static int obp_setprop(int node, char *name, char *val, int len);
-+static const char *obp_nextprop(int node, char *name);
-+
-+static char obp_idprom[IDPROM_SIZE];
-+static const struct property null_properties = { NULL, NULL, -1 };
-+static const int prop_true = -1;
-+
-+static struct property propv_root[7];
-+
-+static const struct property propv_root_templ[] = {
-+      {"name",        "SUNW,SparcStation-5", sizeof("SUNW,SparcStation-5") },
-+      {"idprom",      obp_idprom, IDPROM_SIZE},
-+      {"banner-name", "SparcStation", sizeof("SparcStation")},
-+      {"compatible",  "sun4m", 6},
-+};
-+
-+static const int prop_iommu_reg[] = {
-+      0x0, 0x10000000, 0x00000300,
-+};
-+static const struct property propv_iommu[] = {
-+      {"name",        "iommu", sizeof("iommu")},
-+      {"reg",         (char*)&prop_iommu_reg[0], sizeof(prop_iommu_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_sbus_ranges[] = {
-+      0x0, 0x0, 0x0, 0x30000000, 0x10000000,
-+      0x1, 0x0, 0x0, 0x40000000, 0x10000000,
-+      0x2, 0x0, 0x0, 0x50000000, 0x10000000,
-+      0x3, 0x0, 0x0, 0x60000000, 0x10000000,
-+      0x4, 0x0, 0x0, 0x70000000, 0x10000000,
-+};
-+static const struct property propv_sbus[] = {
-+      {"name",        "sbus", 5},
-+      {"ranges",      (char*)&prop_sbus_ranges[0], sizeof(prop_sbus_ranges)},
-+      {"device_type", "hierarchical", sizeof("hierarchical") },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_tcx_regs[] = {
-+      0x2, 0x00800000, 0x00100000,
-+      0x2, 0x02000000, 0x00000001,
-+      0x2, 0x04000000, 0x00800000,
-+      0x2, 0x06000000, 0x00800000,
-+      0x2, 0x0a000000, 0x00000001,
-+      0x2, 0x0c000000, 0x00000001,
-+      0x2, 0x0e000000, 0x00000001,
-+      0x2, 0x00700000, 0x00001000,
-+      0x2, 0x00200000, 0x00000004,
-+      0x2, 0x00300000, 0x0000081c,
-+      0x2, 0x00000000, 0x00010000,
-+      0x2, 0x00240000, 0x00000004,
-+      0x2, 0x00280000, 0x00000001,
-+};
-+
-+#if 1 /* Zaitcev */
-+static const int pixfreq = 0x03dfd240;
-+static const int hbporch = 0xa0;
-+static const int vfreq = 0x3c;
-+#endif
-+#if 0 /* Kevin Boone - 70Hz refresh */
-+static const int pixfreq = 0x047868C0;
-+static const int hbporch = 0x90;
-+static const int vfreq = 0x46;
-+#endif
-+
-+static const int vbporch = 0x1d;
-+static const int vsync = 0x6;
-+static const int hsync = 0x88;
-+static const int vfporch = 0x3;
-+static const int hfporch = 0x18;
-+static const int height = 0x300;
-+static const int width = 0x400;
-+static const int linebytes = 0x400;
-+static const int depth = 24;
-+static const int tcx_intr[] = { 5, 0 };
-+static const int tcx_interrupts = 5;
-+static const struct property propv_sbus_tcx[] = {
-+      {"name",        "SUNW,tcx", sizeof("SUNW,tcx")},
-+      {"vbporch",     (char*)&vbporch, sizeof(int)},
-+      {"hbporch",     (char*)&hbporch, sizeof(int)},
-+      {"vsync",       (char*)&vsync, sizeof(int)},
-+      {"hsync",       (char*)&hsync, sizeof(int)},
-+      {"vfporch",     (char*)&vfporch, sizeof(int)},
-+      {"hfporch",     (char*)&hfporch, sizeof(int)},
-+      {"pixfreq",     (char*)&pixfreq, sizeof(int)},
-+      {"vfreq",       (char*)&vfreq, sizeof(int)},
-+      {"height",      (char*)&height, sizeof(int)},
-+      {"width",       (char*)&width, sizeof(int)},
-+      {"linebytes",   (char*)&linebytes, sizeof(int)},
-+      {"depth",       (char*)&depth, sizeof(int)},
-+      {"reg",         (char*)&prop_tcx_regs[0], sizeof(prop_tcx_regs)},
-+      {"tcx-8-bit",   0, -1},
-+      {"intr",        (char*)&tcx_intr[0], sizeof(tcx_intr)},
-+      {"interrupts",  (char*)&tcx_interrupts, sizeof(tcx_interrupts)},
-+      {"device_type", "display", sizeof("display")},
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_cs4231_reg[] = {
-+      0x3, 0x0C000000, 0x00000040
-+};
-+static const int cs4231_interrupts = 5;
-+static const int cs4231_intr[] = { 5, 0 };
-+
-+static const struct property propv_sbus_cs4231[] = {
-+      {"name",        "SUNW,CS4231", sizeof("SUNW,CS4231") },
-+      {"intr",        (char*)&cs4231_intr[0], sizeof(cs4231_intr) },
-+      {"interrupts",  (char*)&cs4231_interrupts, sizeof(cs4231_interrupts) }, 
-+      {"reg",         (char*)&prop_cs4231_reg[0], sizeof(prop_cs4231_reg) },
-+      {"device_type", "serial", sizeof("serial") },
-+      {"alias",       "audio", sizeof("audio") },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int cpu_nctx = NCTX_SWIFT;
-+static const int cpu_cache_line_size = 0x20;
-+static const int cpu_cache_nlines = 0x200;
-+static const struct property propv_cpu[] = {
-+      {"name",        "STP1012PGA", sizeof("STP1012PGA") },
-+      {"device_type", "cpu", 4 },
-+      {"mmu-nctx",    (char*)&cpu_nctx, sizeof(int)},
-+      {"cache-line-size",     (char*)&cpu_cache_line_size, sizeof(int)},
-+      {"cache-nlines",        (char*)&cpu_cache_nlines, sizeof(int)},
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_obio_ranges[] = {
-+      0x0, 0x0, 0x0, 0x71000000, 0x01000000,
-+};
-+static const struct property propv_obio[] = {
-+      {"name",        "obio", 5 },
-+      {"ranges",      (char*)&prop_obio_ranges[0], sizeof(prop_obio_ranges) },
-+      {"device_type", "hierarchical", sizeof("hierarchical") },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_auxio_reg[] = {
-+      0x0, 0x00900000, 0x00000001,
-+};
-+static const struct property propv_obio_auxio[] = {
-+      {"name",        "auxio", sizeof("auxio") },
-+      {"reg",         (char*)&prop_auxio_reg[0], sizeof(prop_auxio_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_int_reg[] = {
-+      0x0, 0x00e00000, 0x00000010,
-+      0x0, 0x00e10000, 0x00000010,
-+};
-+static const struct property propv_obio_int[] = {
-+      {"name",        "interrupt", sizeof("interrupt")},
-+      {"reg",         (char*)&prop_int_reg[0], sizeof(prop_int_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_cnt_reg[] = {
-+      0x0, 0x00d00000, 0x00000010,
-+      0x0, 0x00d10000, 0x00000010,
-+};
-+static const struct property propv_obio_cnt[] = {
-+      {"name",        "counter", sizeof("counter")},
-+      {"reg",         (char*)&prop_cnt_reg[0], sizeof(prop_cnt_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_eeprom_reg[] = {
-+      0x0, 0x00200000, 0x00002000,
-+};
-+static const struct property propv_obio_eep[] = {
-+      {"name",        "eeprom", sizeof("eeprom")},
-+      {"reg",         (char*)&prop_eeprom_reg[0], sizeof(prop_eeprom_reg) },
-+      {"model",       "mk48t08", sizeof("mk48t08")},
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_su_reg[] = {
-+      0x0, 0x003002f8, 0x00000008,
-+};
-+static const struct property propv_obio_su[] = {
-+      {"name",        "su", sizeof("su")},
-+      {"reg",         (char*)&prop_su_reg[0], sizeof(prop_su_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_zs_intr[] = { 0x2c, 0x0 };
-+static const int prop_zs_reg[] = {
-+      0x0, 0x00000000, 0x00000008,
-+};
-+static void *prop_zs_addr;
-+static const int prop_zs_slave = 1;
-+static const struct property propv_obio_zs[] = {
-+      {"name",        "zs", sizeof("zs")},
-+      {"reg",         (char*)&prop_zs_reg[0], sizeof(prop_zs_reg) },
-+      {"slave",       (char*)&prop_zs_slave, sizeof(prop_zs_slave) },
-+      {"device_type", "serial", sizeof("serial") },
-+      {"intr",        (char*)&prop_zs_intr[0], sizeof(prop_zs_intr) },
-+      {"address",     (char*)&prop_zs_addr, sizeof(prop_zs_addr) },
-+      {"keyboard",    (char*)&prop_true, 0},
-+      {"mouse",       (char*)&prop_true, 0},
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_zs1_intr[] = { 0x2c, 0x0 };
-+static const int prop_zs1_reg[] = {
-+      0x0, 0x00100000, 0x00000008,
-+};
-+static void *prop_zs1_addr;
-+static const int prop_zs1_slave = 0;
-+static const struct property propv_obio_zs1[] = {
-+      {"name",        "zs", sizeof("zs")},
-+      {"reg",         (char*)&prop_zs1_reg[0], sizeof(prop_zs1_reg) },
-+      {"slave",       (char*)&prop_zs1_slave, sizeof(prop_zs1_slave) },
-+      {"device_type", "serial", sizeof("serial") },
-+      {"intr",        (char*)&prop_zs1_intr[0], sizeof(prop_zs1_intr) },
-+      {"address",     (char*)&prop_zs1_addr, sizeof(prop_zs1_addr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_ledma_reg[] = {
-+      0x4, 0x08400010, 0x00000020,
-+};
-+static const int prop_ledma_burst = 0x3f;
-+static const struct property propv_sbus_ledma[] = {
-+      {"name",        "ledma", sizeof("ledma")},
-+      {"reg",         (char*)&prop_ledma_reg[0], sizeof(prop_ledma_reg) },
-+      {"burst-sizes", (char*)&prop_ledma_burst, sizeof(int) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_le_reg[] = {
-+      0x4, 0x08c00000, 0x00000004,
-+};
-+static const int prop_le_busmaster_regval = 0x7;
-+static const int prop_le_intr[] = { 0x26, 0x0 };
-+static const struct property propv_sbus_ledma_le[] = {
-+      {"name",        "le", sizeof("le")},
-+      {"reg",         (char*)&prop_le_reg[0], sizeof(prop_le_reg) },
-+      {"busmaster-regval",    (char*)&prop_le_busmaster_regval, sizeof(int)},
-+      {"intr",        (char*)&prop_le_intr[0], sizeof(prop_le_intr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_espdma_reg[] = {
-+      0x4, 0x08400000, 0x00000010,
-+};
-+
-+static const struct property propv_sbus_espdma[] = {
-+      {"name",        "espdma", sizeof("espdma")}, 
-+      {"reg",         (char*)&prop_espdma_reg[0], sizeof(prop_espdma_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_esp_reg[] = {
-+      0x4, 0x08800000, 0x00000040,
-+};
-+static const int prop_esp_intr[] = { 0x24, 0x0 };
-+static const struct property propv_sbus_espdma_esp[] = {
-+      {"name",        "esp", sizeof("esp")},
-+      {"reg",         (char*)&prop_esp_reg[0], sizeof(prop_esp_reg) },
-+      {"intr",        (char*)&prop_esp_intr[0], sizeof(prop_esp_intr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_bpp_reg[] = {
-+      0x4, 0x0c800000, 0x0000001c,
-+};
-+static const int prop_bpp_intr[] = { 0x33, 0x0 };
-+static const struct property propv_sbus_bpp[] = {
-+      {"name",        "SUNW,bpp", sizeof("SUNW,bpp")},
-+      {"reg",         (char*)&prop_bpp_reg[0], sizeof(prop_bpp_reg) },
-+      {"intr",        (char*)&prop_bpp_intr[0], sizeof(prop_bpp_intr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_apc_reg[] = {
-+      0x4, 0x0a000000, 0x00000010,
-+};
-+static const struct property propv_sbus_apc[] = {
-+      {"name",        "xxxpower-management", sizeof("xxxpower-management")},
-+      {"reg",         (char*)&prop_apc_reg[0], sizeof(prop_apc_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_fd_intr[] = { 0x2b, 0x0 };
-+static const int prop_fd_reg[] = {
-+      0x0, 0x00400000, 0x0000000f,
-+};
-+static const struct property propv_obio_fd[] = {
-+      {"name",        "SUNW,fdtwo", sizeof("SUNW,fdtwo")},
-+      {"reg",         (char*)&prop_fd_reg[0], sizeof(prop_fd_reg) },
-+      {"device_type", "block", sizeof("block") },
-+      {"intr",        (char*)&prop_fd_intr[0], sizeof(prop_fd_intr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_pw_intr[] = { 0x22, 0x0 };
-+static const int prop_pw_reg[] = {
-+      0x0, 0x00910000, 0x00000001,
-+};
-+static const struct property propv_obio_pw[] = {
-+      {"name",        "power", sizeof("power")},
-+      {"reg",         (char*)&prop_pw_reg[0], sizeof(prop_pw_reg) },
-+      {"intr",        (char*)&prop_pw_intr[0], sizeof(prop_pw_intr) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const int prop_cf_reg[] = {
-+      0x0, 0x00800000, 0x00000001,
-+};
-+static const struct property propv_obio_cf[] = {
-+      {"name",        "slavioconfig", sizeof("slavioconfig")},
-+      {"reg",         (char*)&prop_cf_reg[0], sizeof(prop_cf_reg) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const struct property propv_options[] = {
-+      {"name",        "options", sizeof("options")},
-+      {"screen-#columns",     "80", sizeof("80")},
-+      {"screen-#rows",        "25", sizeof("25")},
-+      {"tpe-link-test?",      (char *)&prop_true, 0},
-+      {"ttya-mode",           "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
-+      {"ttya-ignore-cd",      (char *)&prop_true, 0},
-+      {"ttya-rts-dtr-off",    0, -1},
-+      {"ttyb-mode",           "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
-+      {"ttyb-ignore-cd",      (char *)&prop_true, 0},
-+      {"ttyb-rts-dtr-off",    0, -1},
-+      {NULL, NULL, -1}
-+};
-+
-+static int prop_mem_reg[3];
-+static int prop_mem_avail[3];
-+
-+static const struct property propv_memory[] = {
-+      {"name",        "memory", sizeof("memory")},
-+      {"reg",         (char*)&prop_mem_reg[0], sizeof(prop_mem_reg) },
-+      {"available",   (char*)&prop_mem_avail[0], sizeof(prop_mem_avail) },
-+      {NULL, NULL, -1}
-+};
-+
-+static int prop_vmem_avail[6];
-+
-+static const struct property propv_vmemory[] = {
-+      {"name",        "virtual-memory", sizeof("virtual-memory")},
-+      {"available",   (char*)&prop_vmem_avail[0], sizeof(prop_vmem_avail) },
-+      {NULL, NULL, -1}
-+};
-+
-+static const struct node nodes[] = {
-+      { &null_properties,      1,  0 }, /* 0 = big brother of root */
-+      { propv_root,            0,  2 }, /*  1 "/" */
-+      { propv_iommu,          12,  3 }, /*  2 "/iommu" */
-+      { propv_sbus,            0,  4 }, /*  3 "/iommu/sbus" */
-+      { propv_sbus_tcx,        5,  0 }, /*  4 "/iommu/sbus/SUNW,tcx" */
-+      { propv_sbus_ledma,      7,  6 }, /*  5 "/iommu/sbus/ledma" */
-+      { propv_sbus_ledma_le,   0,  0 }, /*  6 "/iommu/sbus/ledma/le" */
-+      { propv_sbus_cs4231,     8,  0 }, /*  7 "/iommu/sbus/SUNW,CS4231 */
-+      { propv_sbus_bpp,        9,  0 }, /*  8 "/iommu/sbus/SUNW,bpp */
-+      { propv_sbus_espdma,    11, 10 }, /*  9 "/iommu/sbus/espdma" */
-+      { propv_sbus_espdma_esp, 0,  0 }, /* 10 "/iommu/sbus/espdma/esp" */
-+      { propv_sbus_apc,        0,  0 }, /* 11 "/iommu/sbus/power-management */
-+      { propv_cpu,            13,  0 }, /* 12 "/STP1012PGA" */
-+      { propv_obio,           23, 14 }, /* 13 "/obio" */
-+      { propv_obio_int,       15,  0 }, /* 14 "/obio/interrupt" */
-+      { propv_obio_cnt,       16,  0 }, /* 15 "/obio/counter" */
-+      { propv_obio_eep,       17,  0 }, /* 16 "/obio/eeprom" */
-+      { propv_obio_auxio,     18,  0 }, /* 17 "/obio/auxio" */
-+      { propv_obio_zs1,       19,  0 }, /* 18 "/obio/zs@0,100000"
-+                                           Must be before zs@0,0! */
-+      { propv_obio_zs,        20,  0 }, /* 19 "/obio/zs@0,0" */
-+      { propv_obio_fd,        21,  0 }, /* 20 "/obio/SUNW,fdtwo" */
-+      { propv_obio_pw,        22,  0 }, /* 21 "/obio/power" */
-+      { propv_obio_cf,         0,  0 }, /* 22 "/obio/slavioconfig@0,800000" */
-+      { propv_options,        24,  0 }, /* 23 "/options" */
-+      { propv_memory,         25,  0 }, /* 24 "/memory" */
-+      { propv_vmemory,         0,  0 }, /* 25 "/virtual-memory" */
-+};
-+
-+static struct linux_mlist_v0 totphys[MAX_BANKS];
-+static struct linux_mlist_v0 totmap[1];
-+static struct linux_mlist_v0 totavail[MAX_BANKS];
-+
-+static struct linux_mlist_v0 *ptphys;
-+static struct linux_mlist_v0 *ptmap;
-+static struct linux_mlist_v0 *ptavail;
-+
-+static const struct linux_nodeops nodeops0 = {
-+        obp_nextnode, /* int (*no_nextnode)(int node); */
-+        obp_child,    /* int (*no_child)(int node); */
-+        obp_proplen,  /* int (*no_proplen)(int node, char *name); */
-+        obp_getprop,  /* int (*no_getprop)(int node,char *name,char *val); */
-+        obp_setprop,  /* int (*no_setprop)(int node, char *name,
-+                               char *val, int len); */
-+        obp_nextprop  /* char * (*no_nextprop)(int node, char *name); */
-+};
-+
-+static struct linux_arguments_v0 obp_arg;
-+static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
-+
-+static void (*synch_hook)(void);
-+static char obp_stdin, obp_stdout;
-+static int obp_fd_stdin, obp_fd_stdout;
-+
-+static int obp_nbgetchar(void);
-+static int obp_nbputchar(int ch);
-+static void obp_reboot(char *);
-+static void obp_abort(void);
-+static void obp_halt(void);
-+static int obp_devopen(char *str);
-+static int obp_devclose(int dev_desc);
-+static int obp_devread(int dev_desc, char *buf, int nbytes);
-+static int obp_devwrite(int dev_desc, char *buf, int nbytes);
-+static int obp_devseek(int dev_desc, int hi, int lo);
-+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 int obp_inst2pkg(int dev_desc);
-+
-+static void doublewalk(unsigned ptab1, unsigned va)
-+{
-+unsigned int proc_tablewalk(int ctx, unsigned int va);
-+unsigned int mem_tablewalk(unsigned int pa, unsigned int va);
-+
-+      proc_tablewalk(0, va);
-+      if (ptab1 != 0) mem_tablewalk(ptab1, va);
-+}
-+
-+static struct linux_romvec romvec0;
-+
-+struct fd {
-+    int unit, part;
-+    int offset;
-+    int (*pread)(int dev_desc, int offset, char *buf, unsigned int nbytes);
-+    int (*pwrite)(int dev_desc, int offset, char *buf, unsigned int nbytes);
-+} fd_table[16];
-+
-+static int fd_index;
-+static int con_pread(int dev_desc, int offset, char *buf, unsigned int 
nbytes);
-+static int con_pwrite(int dev_desc, int offset, char *buf, unsigned int 
nbytes);
-+
-+void *
-+init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas,
-+                 const char *cmdline, char boot_device, int nographic)
-+{
-+      int i;
-+
-+      /*
-+       * Avoid data segment allocations
-+       */
-+      ptphys = totphys;
-+      ptmap = totmap;
-+      ptavail = totavail;
-+      /*
-+       * Form memory descriptors.
-+       */
-+      for (i = 0; i < bankc; i++) {
-+              totphys[i].theres_more = &totphys[i+1];
-+              totphys[i].start_adr = (char*) bankv[i].start;
-+              totphys[i].num_bytes = bankv[i].length;
-+      }
-+      totphys[i-1].theres_more = 0;
-+
-+      /*
-+       * XXX Merged in normal PROM when full banks touch.
-+       */
-+      for (i = 0; i < bankc; i++) {
-+              unsigned bankbase = bankv[i].start;
-+              unsigned banksize = bankv[i].length;
-+              if (hiphybas > bankbase &&
-+                  hiphybas < bankbase + banksize) {
-+                      banksize = hiphybas - bankbase;
-+              }
-+              totavail[i].theres_more = &totavail[i+1];
-+              totavail[i].start_adr = (char*) bankbase;
-+              totavail[i].num_bytes = banksize;
-+      }
-+      totavail[i-1].theres_more = 0;
-+
-+      totmap[0].theres_more = 0;
-+      totmap[0].start_adr = (char*) PROLBASE;
-+      totmap[0].num_bytes = PROLSIZE;
-+      prop_mem_reg[0] = 0;
-+      prop_mem_reg[1] = 0;
-+      prop_mem_reg[2] = bankv[0].length;
-+      prop_mem_avail[0] = 0;
-+      prop_mem_avail[1] = 0;
-+      prop_mem_avail[2] = hiphybas;
-+      prop_vmem_avail[0] = 0;
-+      prop_vmem_avail[1] = 0;
-+      prop_vmem_avail[2] = PROLBASE-1;
-+      prop_vmem_avail[3] = 0;
-+      prop_vmem_avail[4] = 0xffe00000;
-+      prop_vmem_avail[5] = 0x00200000;
-+
-+      /*
-+       * idprom
-+       */
-+      bcopy(idprom, obp_idprom, IDPROM_SIZE);
-+
-+      // Linux wants a R/W romvec table
-+      romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
-+      romvec0.pv_romvers = 3;
-+      romvec0.pv_plugin_revision = 77;
-+      romvec0.pv_printrev = 0x10203;
-+      romvec0.pv_v0mem.v0_totphys = &ptphys;
-+      romvec0.pv_v0mem.v0_prommap = &ptmap;
-+      romvec0.pv_v0mem.v0_available = &ptavail;
-+      romvec0.pv_nodeops = &nodeops0;
-+      romvec0.pv_bootstr = (void *)doublewalk;
-+      romvec0.pv_v0devops.v0_devopen = &obp_devopen;
-+      romvec0.pv_v0devops.v0_devclose = &obp_devclose;
-+      romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev;
-+      romvec0.pv_stdin = &obp_stdin;
-+      romvec0.pv_stdout = &obp_stdout;
-+      romvec0.pv_getchar = obp_nbgetchar;
-+      romvec0.pv_putchar = (void (*)(int))obp_nbputchar;
-+      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_inst2pkg = obp_inst2pkg;
-+      romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;
-+      romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;
-+      romvec0.pv_v2devops.v2_dev_open = obp_devopen;
-+      romvec0.pv_v2devops.v2_dev_close = (void (*)(int))obp_devclose;
-+      romvec0.pv_v2devops.v2_dev_read = obp_devread;
-+      romvec0.pv_v2devops.v2_dev_write = obp_devwrite;
-+      romvec0.pv_v2devops.v2_dev_seek = obp_devseek;
-+      obp_arg.boot_dev_ctrl = 0;
-+      obp_arg.boot_dev_unit = '0';
-+      obp_arg.argv[0] = "sd(0,0,0):d";
-+      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';
-+          obp_arg.argv[0] = "sd(0,2,0):d";
-+          // Fall through
-+      case 'c':
-+          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;
-+      romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0];
-+      romvec0.pv_v2bootargs.bootargs = &cmdline;
-+      romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin;
-+      romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout;
-+
-+      bcopy(propv_root_templ, propv_root, sizeof(propv_root_templ));
-+      propv_root[4].name = "stdin-path";
-+      propv_root[5].name = "stdout-path";
-+      obp_fd_stdin = 0;
-+      obp_fd_stdout = 1;
-+      fd_table[0].pread = con_pread;
-+      fd_table[0].pwrite = con_pwrite;
-+      fd_table[1].pread = con_pread;
-+      fd_table[1].pwrite = con_pwrite;
-+      fd_index = 2;
-+      if (nographic) {
-+          obp_stdin = PROMDEV_TTYA;
-+          propv_root[4].value = "/obio/zs@0,100000:a";
-+          propv_root[4].length = sizeof("/obio/zs@0,100000:a");
-+          fd_table[0].unit = 18;
-+          obp_stdout = PROMDEV_TTYA;
-+          propv_root[5].value = "/obio/zs@0,100000:a";
-+          propv_root[5].length = sizeof("/obio/zs@0,100000:a");
-+          fd_table[1].unit = 18;
-+      } else {
-+          obp_stdin = PROMDEV_KBD;
-+          propv_root[4].value = "/obio/zs@0,0";
-+          propv_root[4].length = sizeof("/obio/zs@0,0");
-+          fd_table[0].unit = 19;
-+          obp_stdout = PROMDEV_SCREEN;
-+          propv_root[5].value = "/iommu/sbus/SUNW,tcx";
-+          propv_root[5].length = sizeof("/iommu/sbus/SUNW,tcx");
-+          fd_table[1].unit = 4;
-+      }
-+      prop_zs_addr = map_io(0x71000000, 8);
-+      prop_zs1_addr = map_io(0x71100000, 8);
-+      return &romvec0;
-+}
-+
-+static const struct property *find_property(int node,char *name)
-+{
-+      const struct property *prop = &nodes[node].properties[0];
-+      while (prop && prop->name) {
-+              if (bcmp(prop->name, name, 128) == 0) return prop;
-+              prop++;
-+      }
-+      return NULL;
-+}
-+
-+static int obp_nextnode(int node)
-+{
-+#ifdef DEBUG_OBP
-+        printk("obp_nextnode(%d) = %d\n", node, nodes[node].sibling);
-+#endif
-+      return nodes[node].sibling;
-+}
-+
-+static int obp_child(int node)
-+{
-+#ifdef DEBUG_OBP
-+        printk("obp_child(%d) = %d\n", node, nodes[node].child);
-+#endif
-+      return nodes[node].child;
-+}
-+
-+static int obp_proplen(int node, char *name)
-+{
-+      const struct property *prop = find_property(node,name);
-+      if (prop) {
-+#ifdef DEBUG_OBP
-+          printk("obp_proplen(%d, %s) = %d\n", node, name, prop->length);
-+#endif
-+          return prop->length;
-+      }
-+#ifdef DEBUG_OBP
-+      printk("obp_proplen(%d, %s) (no prop)\n", node, name);
-+#endif
-+      return -1;
-+}
-+
-+static int obp_getprop(int node, char *name, char *value)
-+{
-+      const struct property *prop;
-+
-+      if (!name) {
-+          // NULL name means get first property
-+#ifdef DEBUG_OBP
-+          printk("obp_getprop(%d, %x (NULL)) = %s\n", node, name,
-+                 nodes[node].properties[0].name);
-+#endif
-+          return (int)nodes[node].properties[0].name;
-+      }
-+      prop = find_property(node,name);
-+      if (prop) {
-+              memcpy(value,prop->value,prop->length);
-+#ifdef DEBUG_OBP
-+              printk("obp_getprop(%d, %s) = %s\n", node, name, value);
-+#endif
-+              return prop->length;
-+      }
-+#ifdef DEBUG_OBP
-+        printk("obp_getprop(%d, %s): not found\n", node, name);
-+#endif
-+      return -1;
-+}
-+
-+static int obp_setprop(__attribute__((unused)) int node,
-+                     __attribute__((unused)) char *name,
-+                     __attribute__((unused)) char *value,
-+                     __attribute__((unused)) int len)
-+{
-+#ifdef DEBUG_OBP
-+        printk("obp_setprop(%d, %s) = %s (%d)\n", node, name, value, len);
-+#endif
-+      return -1;
-+}
-+
-+static const char *obp_nextprop(int node,char *name)
-+{
-+      const struct property *prop;
-+      
-+      if (!name || *name == '\0') {
-+          // NULL name means get first property
-+#ifdef DEBUG_OBP
-+          printk("obp_nextprop(%d, NULL) = %s\n", node,
-+                 nodes[node].properties[0].name);
-+#endif
-+          return nodes[node].properties[0].name;
-+      }
-+      prop = find_property(node,name);
-+      if (prop && prop[1].name) {
-+#ifdef DEBUG_OBP
-+          printk("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name);
-+#endif
-+          return prop[1].name;
-+      }
-+#ifdef DEBUG_OBP
-+        printk("obp_nextprop(%d, %s): not found\n", node, name);
-+#endif
-+      return "";
-+}
-+
-+extern int (*getch_fn)(struct vconterm *v);
-+
-+static int obp_nbgetchar(void) {
-+      extern struct vconterm dp0;
-+      return getch_fn(&dp0);
-+}
-+
-+static int obp_nbputchar(int ch) {
-+      printk("%c", ch);
-+      return 0;
-+}
-+
-+static void obp_reboot(char *str) {
-+      printk("rebooting (%s)\n", str);
-+      stb_bypass(0x71f00000, 1);
-+      for (;;) {}
-+}
-+
-+static void obp_abort() {
-+      printk("abort, power off\n");
-+      stb_bypass(0x71910000, 1);
-+      for (;;) {}
-+}
-+
-+static void obp_halt() {
-+      printk("halt, power off\n");
-+      stb_bypass(0x71910000, 1);
-+      for (;;) {}
-+}
-+
-+extern void *esp_read(int unit, int part, int offset, short len);
-+
-+static int esp_pread(int dev_desc, int offset, char *buf, unsigned int nbytes)
-+{
-+    unsigned int i;
-+    void *src;
-+
-+    for(i = 0; i < nbytes; i += 512) {
-+      src = esp_read(fd_table[dev_desc].unit, fd_table[dev_desc].part, 
(offset + i) / 512, 512);
-+      memcpy(&buf[i], src, 512);
-+    }
-+    return nbytes;
-+}
-+
-+static int con_pread(__attribute__((unused)) int dev_desc, 
__attribute__((unused)) int offset, char *buf, unsigned int nbytes)
-+{
-+    unsigned int i;
-+
-+    for(i = 0; i < nbytes; i ++) {
-+      buf[i] = obp_nbgetchar();
-+    }
-+    return nbytes;
-+}
-+
-+static int con_pwrite(__attribute__((unused)) int dev_desc, 
__attribute__((unused)) int offset, char *buf, unsigned int nbytes)
-+{
-+    unsigned int i;
-+
-+    for(i = 0; i < nbytes; i ++) {
-+      obp_nbputchar(buf[i]);
-+    }
-+    return nbytes;
-+}
-+
-+#define isnum(c) ((c >= '0') && (c < '9'))
-+#define ctoi(c) (c - '0')
-+
-+static int obp_devopen(char *str) {
-+#ifdef DEBUG_OBP
-+        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;
-+          }
-+          fd_table[fd_index].unit = target;
-+          fd_table[fd_index].part = str[10] - 'a';
-+          fd_table[fd_index].pread = esp_pread;
-+          return fd_index++; // XXX
-+      }
-+      return 0;
-+}
-+
-+static int obp_devclose(__attribute__((unused)) int dev_desc) {
-+#ifdef DEBUG_OBP
-+        printk("obp_devclose %d\n", dev_desc);
-+#endif
-+      fd_index--; // XXX
-+      return 0;
-+}
-+
-+static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf)
-+{
-+#ifdef DEBUG_OBP
-+    printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", 
dev_desc, num_blks, offset, buf);
-+#endif
-+    return fd_table[dev_desc].pread(dev_desc, offset, buf, num_blks * 512);
-+}
-+
-+static char *obp_dumb_mmap(char *va, __attribute__((unused)) 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(__attribute__((unused)) char *va,
-+                          __attribute__((unused)) unsigned int size)
-+{
-+#ifdef DEBUG_OBP
-+      printk("obp_dumb_munmap: virta %x, sz %d\n", va, size);
-+#endif
-+}
-+
-+static int obp_devread(int dev_desc, char *buf, int nbytes)
-+{
-+      int ret;
-+#ifdef DEBUG_OBP
-+      printk("obp_devread: fd %d, nbytes %d\n", dev_desc, nbytes);
-+#endif
-+      ret = fd_table[dev_desc].pread(dev_desc, fd_table[dev_desc].offset, 
buf, nbytes);
-+      fd_table[dev_desc].offset += nbytes;
-+      return ret;
-+}
-+
-+static int obp_devwrite(int dev_desc, char *buf, int nbytes)
-+{
-+      int ret;
-+#ifdef DEBUG_OBP
-+      printk("obp_devwrite: fd %d, buf %s, nbytes %d\n", dev_desc, buf, 
nbytes);
-+#endif
-+      ret = fd_table[dev_desc].pwrite(dev_desc, fd_table[dev_desc].offset, 
buf, nbytes);
-+      fd_table[dev_desc].offset += nbytes;
-+      return ret;
-+}
-+
-+static int obp_devseek(int dev_desc, __attribute__((unused)) int hi, int lo)
-+{
-+#ifdef DEBUG_OBP
-+      printk("obp_devseek: fd %d, hi %d, lo %d\n", dev_desc, hi, lo);
-+#endif
-+      fd_table[dev_desc].offset = lo;
-+      return 0;
-+}
-+
-+static int obp_inst2pkg(int dev_desc)
-+{
-+#ifdef DEBUG_OBP
-+      printk("obp_inst2pkg: fd %d\n", dev_desc);
-+#endif
-+      return fd_table[dev_desc].unit;
-+}
-diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch-15/qemu/system_qemu.c
---- proll_18.orig/qemu/system_qemu.c   1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/qemu/system_qemu.c  2005-04-16 06:16:20.000000000 +0000
-@@ -0,0 +1,430 @@
-+/**
-+ ** Proll (PROM replacement)
-+ ** system.c: shared miscallenea.
-+ ** Copyright 1999 Pete Zaitcev
-+ ** This code is licensed under GNU General Public License.
-+ **/
-+#include <stdarg.h>
-+#include <asi.h>
-+#include <crs.h>
-+#ifndef NULL
-+#define       NULL ((void*)0)
-+#endif
-+
-+#include "pgtsrmmu.h"
-+
-+#include "vconsole.h"
-+#include <timer.h>            /* Local copy of 2.2 style include */
-+#include <general.h>          /* __P() */
-+#include <net.h>              /* init_net() */
-+#include <romlib.h>           /* we are a provider for part of this. */
-+#include <netpriv.h>          /* myipaddr */
-+#include <arpa.h>
-+#include <system.h>           /* our own prototypes */
-+
-+/*
-+ * We export this.
-+ */
-+char idprom[IDPROM_SIZE];
-+
-+
-+/*
-+ * Create an I/O mapping to pa[size].
-+ * Returns va of the mapping or 0 if unsuccessful.
-+ */
-+void *
-+map_io(unsigned pa, int size)
-+{
-+      void *va;
-+      unsigned int npages;
-+      unsigned int off;
-+      unsigned int mva;
-+
-+      off = pa & (PAGE_SIZE-1);
-+      npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
-+      pa &= ~(PAGE_SIZE-1);
-+
-+      va = mem_alloc(&cio, npages*PAGE_SIZE, PAGE_SIZE);
-+      if (va == 0) return va;
-+
-+      mva = (unsigned int) va;
-+    /* printk("map_io: va 0x%x pa 0x%x off 0x%x npages %d\n", va, pa, off, 
npages); */ /* P3 */
-+      while (npages-- != 0) {
-+              map_page(pmem.pl1, mva, pa, 1, pmem.pbas);
-+              mva += PAGE_SIZE;
-+              pa += PAGE_SIZE;
-+      }
-+
-+      return (void *)((unsigned int)va + off);
-+}
-+
-+/*
-+ * Tablewalk routine used for testing.
-+ * Returns PTP/PTE.
-+ */
-+unsigned int
-+proc_tablewalk(int ctx, unsigned int va)
-+{
-+      unsigned int pa1;
-+
-+      __asm__ __volatile__ ("lda [%1] %2, %0" :
-+                              "=r" (pa1) :
-+                              "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS));
-+      /* printk(" ctpr %x ctx %x\n", pa1, ctx); */ /* P3 */
-+      pa1 <<= 4;
-+      pa1 = ld_bypass(pa1 + (ctx << 2));
-+      if ((pa1 & 0x03) == 0) goto invalid;
-+      return mem_tablewalk((pa1 & 0xFFFFFFF0) << 4, va);
-+
-+invalid:
-+      printk(" invalid %x\n", pa1);
-+      return 0;
-+}
-+
-+/*
-+ * Walk the tables in memory, starting at physical address pa.
-+ */
-+unsigned int
-+mem_tablewalk(unsigned int pa, unsigned int va)
-+{
-+      unsigned int pa1;
-+
-+      printk("pa %x va %x", pa, va);
-+      pa1 = ld_bypass(pa + (((va&0xFF000000)>>24) << 2));
-+      if ((pa1 & 0x03) == 0) goto invalid;
-+      printk(" l1 %x", pa1);
-+      pa1 <<= 4;    pa1 &= 0xFFFFFF00;
-+      pa1 = ld_bypass(pa1 + (((va&0x00FC0000)>>18) << 2));
-+      if ((pa1 & 0x03) == 0) goto invalid;
-+      printk(" l2 %x", pa1);
-+      pa1 <<= 4;    pa1 &= 0xFFFFFF00;
-+      pa1 = ld_bypass(pa1 + (((va&0x0003F000)>>12) << 2));
-+      if ((pa1 & 0x03) == 0) goto invalid;
-+      printk(" l3 %x", pa1);
-+      printk(" off %x\n", va&0x00000FFF);
-+      return pa1;
-+invalid:
-+      printk(" invalid %x\n", pa1);
-+      return 0;
-+}
-+
-+/*
-+ * Make CPU page tables.
-+ * Returns pointer to context table.
-+ * Here we ignore memory allocation errors which "should not happen"
-+ * because we cannot print anything anyways if memory initialization fails.
-+ */
-+void makepages(struct phym *t, unsigned int highbase)
-+{
-+      unsigned int *ctp, *l1, pte;
-+      int i;
-+      unsigned int pa, va;
-+
-+      ctp = mem_zalloc(&cmem, NCTX_SWIFT*sizeof(int), NCTX_SWIFT*sizeof(int));
-+      l1 = mem_zalloc(&cmem, 256*sizeof(int), 256*sizeof(int));
-+
-+      pte = SRMMU_ET_PTD | (((unsigned int)l1 - PROLBASE + highbase) >> 4);
-+      for (i = 0; i < NCTX_SWIFT; i++) {
-+              ctp[i] = pte;
-+      }
-+
-+      pa = PROLBASE;
-+      for (va = PROLBASE; va < PROLDATA; va += PAGE_SIZE) {
-+              map_page(l1, va, pa, 0, highbase);
-+              pa += PAGE_SIZE;
-+      }
-+      pa = highbase + PROLDATA - PROLBASE;
-+      for (va = PROLDATA; va < PROLBASE + PROLSIZE; va += PAGE_SIZE) {
-+              map_page(l1, va, pa, 0, highbase);
-+              pa += PAGE_SIZE;
-+      }
-+
-+      /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */
-+      pa = 0;
-+      for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) {
-+              map_page(l1, va, pa, 0, highbase);
-+              pa += PAGE_SIZE;
-+      }
-+
-+      t->pctp = ctp;
-+      t->pl1 = l1;
-+      t->pbas = highbase;
-+}
-+
-+/*
-+ * Create a memory mapping from va to epa in page table pgd.
-+ * highbase is used for v2p translation.
-+ */
-+int
-+map_page(unsigned int *pgd, unsigned int va,
-+    unsigned int epa, int type, unsigned int highbase)
-+{
-+      unsigned int pte;
-+      unsigned int *p;
-+      unsigned int pa;
-+
-+      pte = pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)];
-+      if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
-+              p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD*sizeof(int),
-+                  SRMMU_PTRS_PER_PMD*sizeof(int));
-+              if (p == 0) goto drop;
-+              pte = SRMMU_ET_PTD |
-+                  (((unsigned int)p - PROLBASE + highbase) >> 4);
-+              pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)] = pte;
-+              /* barrier() */
-+      }
-+
-+      pa = ((pte & 0xFFFFFFF0) << 4);
-+      pa += (((va)>>SRMMU_PMD_SHIFT & (SRMMU_PTRS_PER_PMD-1)) << 2);
-+      pte = ld_bypass(pa);
-+      if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
-+              p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PTE*sizeof(int),
-+                  SRMMU_PTRS_PER_PTE*sizeof(int));
-+              if (p == 0) goto drop;
-+              pte = SRMMU_ET_PTD |
-+                  (((unsigned int)p - PROLBASE + highbase) >> 4);
-+              st_bypass(pa, pte);
-+      }
-+
-+      pa = ((pte & 0xFFFFFFF0) << 4);
-+      pa += (((va)>>PAGE_SHIFT & (SRMMU_PTRS_PER_PTE-1)) << 2);
-+
-+      pte = SRMMU_ET_PTE | ((epa & PAGE_MASK) >> 4);
-+      if (type) {             /* I/O */
-+              pte |= SRMMU_REF;
-+              /* SRMMU cannot make Supervisor-only, but not exectutable */
-+              pte |= SRMMU_PRIV;
-+      } else {                /* memory */
-+              pte |= SRMMU_REF|SRMMU_CACHE;
-+              pte |= SRMMU_PRIV;              /* Supervisor only access */
-+      }
-+      st_bypass(pa, pte);
-+      return 0;
-+
-+drop:
-+      return -1;
-+}
-+
-+/*
-+ * Switch page tables.
-+ */
-+void
-+init_mmu_swift(unsigned int ctp_phy)
-+{
-+      unsigned int addr;
-+
-+      /*
-+       * Flush cache
-+       */
-+      for (addr = 0; addr < 0x2000; addr += 0x10) {
-+              __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
-+                  "r" (addr), "i" (ASI_M_DATAC_TAG));
-+              __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
-+                  "r" (addr<<1), "i" (ASI_M_TXTC_TAG));
-+      }
-+
-+      /*
-+       * Switch ctx table
-+       */
-+      ctp_phy >>= 4;
-+      /* printk("done flushing, switching to %x\n", ctp_phy); */
-+      __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : :
-+          "r" (ctp_phy), "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS));
-+
-+      /*
-+       * Flush old page table references
-+       */
-+      __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
-+          "r" (0x400), "i" (ASI_M_FLUSH_PROBE) : "memory");
-+}
-+
-+/*
-+ * add_timer, del_timer
-+ * This should go into sched.c, but we have it split for different archs.
-+ */
-+struct timer_list_head {
-+      struct timer_list *head, *tail;
-+};
-+
-+static struct timer_list_head timers;         /* Anonymous heap of timers */
-+
-+void add_timer(struct timer_list *timer) {
-+      struct timer_list *p;
-+      if (timer->prev != NULL || timer->next != NULL) {
-+              printk("bug: kernel timer added twice at 0x%x.\n",
-+                  __builtin_return_address(0));
-+              return;
-+      }
-+      if ((p = timers.tail) != NULL) {
-+              timer->prev = p;
-+              p->next = timer;
-+              timers.tail = timer;
-+      } else {
-+              timers.head = timer;
-+              timers.tail = timer;
-+      }
-+      return;
-+}
-+
-+int del_timer(struct timer_list *timer) {
-+      struct timer_list *p;
-+      int ret;
-+
-+      if (timers.head == timer) timers.head = timer->next;
-+      if (timers.tail == timer) timers.tail = timer->prev;
-+      if ((p = timer->prev) != NULL) p->next = timer->next;
-+      if ((p = timer->next) != NULL) p->prev = timer->prev;
-+      ret = timer->next != 0 || timer->prev != 0;
-+      timer->next = NULL;
-+      timer->prev = NULL;
-+      return ret;
-+}
-+
-+void run_timers() {
-+      struct timer_list *p;
-+
-+      p = timers.head;
-+      while (p != NULL) {
-+              if (p->expires < jiffies) {
-+                      del_timer(p);           /* XXX make nonstatic member */
-+                      (*p->function)(p->data);
-+                      p = timers.head;
-+              } else {
-+                      p = p->next;
-+              }
-+      }
-+}
-+
-+/*
-+ * Allocate memory. This is reusable.
-+ */
-+void mem_init(struct mem *t, char *begin, char *limit)
-+{
-+      t->start = begin;
-+      t->uplim = limit;
-+      t->curp = begin;
-+}
-+
-+void mem_fini(struct mem *t)
-+{
-+      t->curp = 0;
-+}
-+
-+void *mem_alloc(struct mem *t, int size, int align)
-+{
-+      char *p;
-+
-+      p = (char *)((((unsigned int)t->curp) + (align-1)) & ~(align-1));
-+      if (p >= t->uplim || p + size > t->uplim) return 0;
-+      t->curp = p + size;
-+      return p;
-+}
-+
-+void *mem_zalloc(struct mem *t, int size, int align)
-+{
-+      char *p;
-+
-+      if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size);
-+      return p;
-+}
-+
-+/*
-+ * Library functions
-+ */
-+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;
-+              f++;
-+              t++;
-+      }
-+}
-+
-+/* Comparison is 7-bit */
-+int bcmp(const void *s1, const void *s2, int len)
-+{
-+      int i;
-+      char ch;
-+
-+      while (len--) {
-+              ch = *(char *)s1;
-+              i = ch - *(char *)s2;
-+              s1++;
-+              s2++;
-+              if (i != 0)
-+                      return i;
-+              if (ch == 0)
-+                      return 0;
-+      }
-+      return 0;
-+}
-+
-+int strlen(const char *s) {
-+      const char *p;
-+      for (p = s; *p != 0; p++) { }
-+      return p - s;
-+}
-+
-+extern void *printk_fn;
-+
-+void printk(char *fmt, ...)
-+{
-+      struct prf_fp {
-+              void *xfp;
-+              void (*write)(void *, char *, int);
-+      } prfa;
-+      extern void prf(struct prf_fp *, char *fmt, va_list adx);
-+      va_list x1;
-+
-+      va_start(x1, fmt);
-+      prfa.xfp = &dp0;
-+      prfa.write = printk_fn;
-+      prf(&prfa, fmt, x1);
-+      va_end(x1);
-+}
-+
-+void fatal()
-+{
-+      printk("fatal.");
-+loop: goto loop;
-+}
-+
-+/*
-+ * Get the highest bit number from the mask.
-+ */
-+int highc(int mask, int size)
-+{
-+      int m1;
-+
-+      m1 = 1 << size;
-+      while (size != 0) {
-+              size--;
-+              m1 >>= 1;
-+              if (m1 & mask) break;
-+      }
-+      return size;
-+}
-+
-+/*
-+ */
-+unsigned int ld_bp_swap(unsigned int ptr) {
-+      unsigned int n;
-+      n = ld_bypass(ptr);
-+      n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24);
-+      return n;
-+}
-+
-+void st_bp_swap(unsigned int ptr, unsigned int n) {
-+      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-patch-15/src/arp.c
---- proll_18.orig/src/arp.c    2001-12-24 05:12:31.000000000 +0000
-+++ proll-patch-15/src/arp.c   2005-08-14 10:10:11.000000000 +0000
-@@ -45,7 +45,7 @@
- #endif
- static struct arp_cache arp_list[ARPNUM];     /* ARP address cache    */
- static int next_arp;                          /* next table entry     */
--static t_ipaddr def_gw = IP_ANY;              /* default routing      */
-+static t_ipaddr def_gw;                               /* default routing      
*/
- 
- 
- 
-@@ -100,10 +100,7 @@
-  * 
-  * ARP receiver routine
-  */
--static int arp_recv(buf, bufsize, addr)
--unsigned char *buf;
--int            bufsize;
--unsigned char *addr;
-+static int arp_recv(unsigned char *buf, unsigned int bufsize, unsigned char 
*addr)
- {
-   register struct arphdr *ahp = (struct arphdr *)buf;
- 
-@@ -144,7 +141,7 @@
-  * 
-  * Resolve IP address and return pointer to hardware address.
-  */
--unsigned char *ip_resolve(ip)
-+const unsigned char *ip_resolve(ip)
- t_ipaddr ip;
- {
-   int i;
-@@ -230,14 +227,11 @@
-  */
- int init_arp()
- {
--  /* Set name of module for error messages */
--  net_module_name = "arp";
--
- #ifndef NOARP
-   /* Register ARP packet type and set send buffer pointer */
-   if ((arpbuf = (struct arphdr *)reg_type(htons(ETH_P_ARP), arp_recv)) == 
NULL)
-       return(FALSE);
- #endif
--
-+  def_gw = IP_ANY;
-   return(TRUE);
- }
-diff -ruN proll_18.orig/src/arp.h proll-patch-15/src/arp.h
---- proll_18.orig/src/arp.h    1999-03-18 03:39:43.000000000 +0000
-+++ proll-patch-15/src/arp.h   2004-11-13 15:50:49.000000000 +0000
-@@ -104,7 +104,7 @@
- extern int init_arp __P((void));
- 
- /* Resolve IP address and return pointer to hardware address */
--extern unsigned char *ip_resolve __P((t_ipaddr ip));
-+extern const unsigned char *ip_resolve __P((t_ipaddr ip));
- 
- /* Add a new antry to the ARP cache */
- extern void addcache __P((unsigned char *ha, t_ipaddr ip));
-diff -ruN proll_18.orig/src/bootp.c proll-patch-15/src/bootp.c
---- proll_18.orig/src/bootp.c  1999-12-15 17:20:30.000000000 +0000
-+++ proll-patch-15/src/bootp.c 2005-08-14 10:16:09.000000000 +0000
-@@ -151,7 +151,7 @@
-   while (TRUE) {
-       boot_xid = get_ticks() + random();
-       bootp_send();
--      i = udp_read((char *)(&boot_rec), BOOTP_REC_SIZE, timeout, CHR_ESC);
-+      i = udp_read((char *)(&boot_rec), BOOTP_REC_SIZE, timeout);
-       if (i < 0) {                            /* user pressed ESC */
-               printf("\nAborted\n");
-               return(1);
-diff -ruN proll_18.orig/src/esp.c proll-patch-15/src/esp.c
---- proll_18.orig/src/esp.c    1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/src/esp.c   2005-08-15 18:42:46.000000000 +0000
-@@ -0,0 +1,305 @@
-+#include <system.h>           /* == <asm/system.h> */
-+#include <general.h>          /* __P for netpriv.h */
-+#include <dma.h>              /* dmaga */
-+#include <romlib.h>
-+
-+#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;
-+      struct disk_info {
-+              unsigned int hw_sector;
-+              unsigned int part_offset[8];
-+      } disk[8];
-+};
-+
-+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_capacity(int unit)
-+{
-+      // 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 Capacity
-+      esp.buffer[0] = 0x80;
-+      esp.buffer[1] = 0x25;
-+      esp.buffer[2] = 0x00;
-+      esp.buffer[3] = 0x00;
-+      esp.buffer[4] = 0x00;
-+      esp.buffer[5] = 0x00;
-+      esp.buffer[6] = 0x00;
-+      esp.buffer[7] = 0x00;
-+      esp.buffer[8] = 0x00;
-+      esp.buffer[9] = 0x00;
-+      esp.buffer[10] = 0x00;
-+      // Set ATN, issue command
-+      stb_bypass(PHYS_JJ_ESP + 3*4, 0xc2);
-+
-+      // Set DMA length = 512 * read length
-+      stb_bypass(PHYS_JJ_ESP + 0*4, 0);
-+      stb_bypass(PHYS_JJ_ESP + 1*4, 8 & 0xff);
-+      // Set DMA direction
-+      st_bypass(PHYS_JJ_ESPDMA + 0, 0x100);
-+      // Transfer
-+      stb_bypass(PHYS_JJ_ESP + 3*4, 0x90);
-+      esp.disk[unit].hw_sector = (esp.buffer[4] << 24) | (esp.buffer[5] << 
16) | (esp.buffer[6] << 8) | esp.buffer[7];
-+}
-+
-+// offset is multiple of 512, len in bytes
-+void *esp_read(int unit, int part, int offset, short len)
-+{
-+      int pos, hw_sect, sect_offset, spb;
-+
-+      // 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);
-+      hw_sect = esp.disk[unit].hw_sector;
-+      offset += esp.disk[unit].part_offset[part];
-+      spb = hw_sect / 512;
-+      sect_offset = offset / spb;
-+      pos = (offset - sect_offset * spb) * 512;
-+      len /= 512;
-+      //printk("Read unit %d, offset %d -> offset %d, pos %d, hw_sect %d\n", 
unit, offset, sect_offset, pos, hw_sect);
-+      // Setup command = Read(10)
-+      esp.buffer[0] = 0x80;
-+      esp.buffer[1] = 0x28;
-+      esp.buffer[2] = 0x00;
-+      esp.buffer[3] = (sect_offset >> 24) & 0xff;
-+      esp.buffer[4] = (sect_offset >> 16) & 0xff;
-+      esp.buffer[5] = (sect_offset >> 8) & 0xff;
-+      esp.buffer[6] = sect_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, 0xc2);
-+
-+      // Set DMA length = sector size * read length
-+      stb_bypass(PHYS_JJ_ESP + 0*4, (len * hw_sect) & 0xff);
-+      stb_bypass(PHYS_JJ_ESP + 1*4, ((len * hw_sect) >> 8) & 0xff);
-+      // Set DMA direction
-+      st_bypass(PHYS_JJ_ESPDMA + 0, 0x100);
-+      // Transfer
-+      stb_bypass(PHYS_JJ_ESP + 3*4, 0x90);
-+      return esp.buffer + pos;
-+}
-+
-+// 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);
-+      esp_read_capacity(unit);
-+
-+      label = esp_read(unit, 0, 0, 512);
-+      printk("hw sector: %d, CHS: %d/%d/%d, partitions:\n", 
esp.disk[unit].hw_sector, 
-+             label->ncyl, label->ntrks, label->nsect);
-+      for (i = 0; i < 8; i++) {
-+          printk("%c: %d + %d, id %x, flags %x\n", 'a' + i, 
label->partitions[i].start_cylinder,
-+                 label->partitions[i].num_sectors, label->infos[i].id, 
label->infos[i].flags);
-+          esp.disk[unit].part_offset[i] = label->partitions[3].start_cylinder 
* label->ntrks * label->nsect;
-+      }
-+      offset = 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, 3, offset, 512);
-+      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, 3,  offset + i, 512);
-+          memcpy(dst, src, 512);
-+          dst += 512;
-+      }
-+      esp_close(&esp);
-+      return 0;
-+}
-diff -ruN proll_18.orig/src/hconsole.c proll-patch-15/src/hconsole.c
---- proll_18.orig/src/hconsole.c       2002-07-23 05:52:48.000000000 +0000
-+++ proll-patch-15/src/hconsole.c      2005-11-09 18:46:34.000000000 +0000
-@@ -29,6 +29,10 @@
-        struct raster r_master;        /* For a case of resize, whole fb */
-        struct raster r_0;     /* malloc() erzatz */
- 
-+#ifdef QEMU
-+extern unsigned int q_height, q_width;
-+#endif
-+
- int hcon_init(struct hconsole *t, unsigned int a0)
- {
-       struct raster *q, *r;
-@@ -42,7 +46,11 @@
-        * No probing sequence or argument passing, hardcode everything. XXX
-        */
-       raster8_cons_a(q, 768, 1024, (char *)a0);
-+#ifndef QEMU
-       raster_cons_2(r, q, 768-(24*11)-1, 1024-(8*80)-1, (24*11), (8*80));
-+#else
-+      raster_cons_2(r, q, 0, 0, q_height, q_width);
-+#endif
-       t->r_ = r;
-       t->r0_ = q;
-       t->f_ = &f_master;
-@@ -67,7 +75,7 @@
-       return 0;
- }
- 
--void hcon_fini (struct hconsole *t)
-+void hcon_fini (__attribute((unused)) struct hconsole *t)
- {
-       return;
- }
-@@ -77,12 +85,12 @@
- {
-       struct rfont *f = t->f_;
- 
--      if (sy < 0 || sy >= t->ydim_) return -1;
--      if (sx < 0 || sx >= t->xdim_) return -1;
-+      if (sy < 0 || (unsigned)sy >= t->ydim_) return -1;
-+      if (sx < 0 || (unsigned)sx >= t->xdim_) return -1;
-       if (height < 0) return -1;
--      if (sy + height > t->ydim_) height = t->ydim_ - sy;
-+      if ((unsigned)sy + (unsigned)height > t->ydim_) height = t->ydim_ - sy;
-       if (width < 0) return -1;
--      if (sx + width > t->xdim_) width = t->xdim_ - sx;
-+      if ((unsigned)sx + (unsigned)width > t->xdim_) width = t->xdim_ - sx;
- 
-       /* XXX Clear with correct background color */
-       (*t->r_->clear_)(t->r_,
-@@ -107,10 +115,10 @@
-       char c0 = c;
-       RC_color rfg, rbg;
- 
--      if (y < 0 || y >= t->ydim_) return -1;
--      if (x < 0 || x >= t->xdim_) return -1;
-+      if (y < 0 || (unsigned)y >= t->ydim_) return -1;
-+      if (x < 0 || (unsigned)x >= t->xdim_) return -1;
- 
--      if (t->curson_ && t->ypos_ == y && t->xpos_ == x) {
-+      if (t->curson_ && t->ypos_ == (unsigned)y && t->xpos_ == (unsigned)x) {
-               rfg = t->bg_;    rbg = t->fg_;
-       } else {
-               rfg = t->fg_;    rbg = t->bg_;
-@@ -126,9 +134,9 @@
- {     
-       struct rfont *f = t->f_;
- 
--      if (y < 0 || y >= t->ydim_) return -1;
--      if (x < 0 || x >= t->xdim_) return -1;
--      if (x + count >= t->xdim_) count = t->xdim_ - x;
-+      if (y < 0 || (unsigned)y >= t->ydim_) return -1;
-+      if (x < 0 || (unsigned)x >= t->xdim_) return -1;
-+      if ((unsigned)x + (unsigned)count >= t->xdim_) count = t->xdim_ - x;
- 
-       (*t->r_->render_)(t->r_, y*f->height_, x*f->width_,
-                           s, count, t->bg_, t->fg_, f);
-@@ -200,8 +208,8 @@
- 
-       rc = 0;
-       if (dir == SM_UP) {
--              if (d < 0 || d >= t->ydim_) return -1;
--              if (b <= d || b > t->ydim_) return -1;
-+              if (d < 0 || (unsigned)d >= t->ydim_) return -1;
-+              if (b <= d || (unsigned)b > t->ydim_) return -1;
-               if (d + count >= b) count = b - d;
-               if (d + count >= b) count = b - d;
-               (*t->r_->yscroll_)(t->r_,
-@@ -213,8 +221,8 @@
-                                  count*f->height_, raster_qwidth(t->r_),
-                                  t->bg_);
-       } else if (dir == SM_DOWN) {
--              if (d < 0 || d >= t->ydim_) return -1;
--              if (b <= d || b > t->ydim_) return -1;
-+              if (d < 0 || (unsigned)d >= t->ydim_) return -1;
-+              if (b <= d || (unsigned)b > t->ydim_) return -1;
-               if (d + count >= b) count = b - d;
-               (*t->r_->yscroll_)(t->r_,
-                                    d*f->height_, 0,
-diff -ruN proll_18.orig/src/hme.c proll-patch-15/src/hme.c
---- proll_18.orig/src/hme.c    2002-07-23 05:52:52.000000000 +0000
-+++ proll-patch-15/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/iommu.c proll-patch-15/src/iommu.c
---- proll_18.orig/src/iommu.c  2002-07-23 05:52:49.000000000 +0000
-+++ proll-patch-15/src/iommu.c 2005-08-14 10:08:17.000000000 +0000
-@@ -36,7 +36,7 @@
-       unsigned int pa, ba;
-       unsigned int npages;
-       unsigned int mva, mpa;
--      int i;
-+      unsigned int i;
-       unsigned int *iopte;
- 
-       npages = (size + (PAGE_SIZE-1)) / PAGE_SIZE;
-diff -ruN proll_18.orig/src/lat7_2.bm proll-patch-15/src/lat7_2.bm
---- proll_18.orig/src/lat7_2.bm        1999-02-27 05:48:54.000000000 +0000
-+++ proll-patch-15/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
--static unsigned char lat7_2_bits[] = {
-+static unsigned const char lat7_2_bits[] = {
-    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-patch-15/src/lat7_2_swapped.bm
---- proll_18.orig/src/lat7_2_swapped.bm        1970-01-01 00:00:00.000000000 
+0000
-+++ proll-patch-15/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
-+static unsigned const char lat7_2_bits[] = {
-+   0x00, 0x00, 0x18, 0x3c, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x00, 0x48, 
-+   0x48, 0x78, 0x48, 0x5f, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x78, 0x40, 
-+   0x70, 0x40, 0x4f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x30, 0x40, 0x40, 
-+   0x40, 0x3e, 0x09, 0x0e, 0x0a, 0x09, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 
-+   0x7f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x0e, 0x0a, 0x0e, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 
-+   0x7e, 0x00, 0x00, 0x00, 0x00, 0x44, 0x64, 0x54, 0x4c, 0x54, 0x10, 0x10, 
-+   0x10, 0x1f, 0x00, 0x00, 0x44, 0x44, 0x44, 0x28, 0x1f, 0x04, 0x04, 0x04, 
-+   0x04, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 
-+   0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
-+   0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0xff, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 
-+   0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 
-+   0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, 
-+   0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 
-+   0x06, 0x0c, 0x18, 0x30, 0x18, 0x6c, 0x36, 0x18, 0x0c, 0x00, 0x00, 0x60, 
-+   0x30, 0x18, 0x0c, 0x18, 0x36, 0x6c, 0x18, 0x30, 0x00, 0x00, 0x7f, 0x36, 
-+   0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x7e, 
-+   0x18, 0x7e, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x78, 
-+   0x30, 0x72, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 
-+   0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 
-+   0x00, 0x00, 0x00, 0x66, 0x66, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x36, 0x7f, 0x36, 0x36, 0x36, 0x7f, 0x36, 0x00, 0x00, 0x00, 
-+   0x00, 0x66, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 
-+   0x72, 0x56, 0x6c, 0x18, 0x36, 0x6a, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x18, 
-+   0x24, 0x28, 0x30, 0x4a, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
-+   0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x18, 
-+   0x18, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 
-+   0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0x7e, 0x3c, 
-+   0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
-+   0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
-+   0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x40, 0x00, 0x00, 0x00, 
-+   0x00, 0x3c, 0x46, 0x4e, 0x5a, 0x72, 0x62, 0x3c, 0x00, 0x00, 0x00, 0x00, 
-+   0x18, 0x38, 0x58, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 
-+   0x66, 0x06, 0x0c, 0x18, 0x32, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
-+   0x06, 0x1c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 
-+   0x66, 0x7e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x60, 0x7c, 0x66, 
-+   0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x7c, 0x66, 0x66, 
-+   0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x06, 0x0c, 0x18, 0x30, 
-+   0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x3c, 0x66, 0x66, 0x3c, 
-+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, 
-+   0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 
-+   0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
-+   0x06, 0x0c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x5e, 
-+   0x56, 0x5e, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x66, 
-+   0x7e, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x7c, 0x66, 
-+   0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 
-+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 
-+   0x00, 0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x62, 0x7e, 0x00, 
-+   0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x00, 
-+   0x00, 0x00, 0x3c, 0x66, 0x60, 0x6e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 
-+   0x00, 0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
-+   0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 
-+   0x46, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6c, 
-+   0x78, 0x70, 0x78, 0x6c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 
-+   0x60, 0x60, 0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, 0x77, 0x7f, 
-+   0x6b, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x76, 0x7e, 0x6e, 
-+   0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 
-+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 
-+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x3c, 0x02, 
-+   0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x00, 0x00, 
-+   0x00, 0x00, 0x3c, 0x66, 0x60, 0x3c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 
-+   0x00, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
-+   0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 
-+   0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 
-+   0x63, 0x6b, 0x6b, 0x7f, 0x36, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 
-+   0x18, 0x3c, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 
-+   0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x0c, 0x18, 0x30, 
-+   0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 
-+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 
-+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 
-+   0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 
-+   0x00, 0x08, 0x10, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x3c, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 
-+   0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x3c, 0x66, 0x60, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 
-+   0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
-+   0x7e, 0x60, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x78, 
-+   0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 0x66, 0x66, 
-+   0x3e, 0x06, 0x3c, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 
-+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x1c, 0x00, 
-+   0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x6c, 0x38, 
-+   0x00, 0x00, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x7c, 0x66, 0x00, 0x00, 0x00, 
-+   0x00, 0x60, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x76, 0x7f, 0x6b, 0x6b, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-+   0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 
-+   0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 
-+   0x66, 0x66, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x72, 0x60, 
-+   0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x3c, 0x06, 
-+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x78, 0x30, 0x30, 0x36, 0x1c, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3a, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x00, 0x63, 0x6b, 0x6b, 0x6b, 0x36, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x00, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 
-+   0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, 0x00, 0x00, 
-+   0x00, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 
-+   0x18, 0x30, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 
-+   0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x0c, 
-+   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-patch-15/src/le.c
---- proll_18.orig/src/le.c     2002-07-23 05:52:49.000000000 +0000
-+++ proll-patch-15/src/le.c    2005-04-16 06:16:20.000000000 +0000
-@@ -185,8 +185,6 @@
-       unsigned short rap;                     /* register address port */
- };
- 
--int sparc_lance_debug = 2;
--
- /* 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    */
-@@ -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/net.h proll-patch-15/src/net.h
---- proll_18.orig/src/net.h    1999-12-15 17:20:17.000000000 +0000
-+++ proll-patch-15/src/net.h   2005-08-14 10:17:02.000000000 +0000
-@@ -124,7 +124,7 @@
- extern int udp_open __P((t_ipaddr daddr, int source, int dest));
- 
- /* Read from a UDP socket */
--extern int udp_read __P((char *buf, int bufsize, int timeout, char abortch));
-+extern int udp_read(char *buf, unsigned int bufsize, int timeout);
- 
- /* Write to a UDP socket */
- extern int udp_write __P((char *buf, int writelen));
-diff -ruN proll_18.orig/src/netinit.c proll-patch-15/src/netinit.c
---- proll_18.orig/src/netinit.c        2002-09-13 21:53:33.000000000 +0000
-+++ proll-patch-15/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    */
-          t_ipaddr mynetmask;                  /* my own netmask       */
--         char    *net_module_name;            /* name of init module  */
-          t_ipaddr servaddr;                   /* IP of RARP&TFTP server */
- 
- /* Broadcast hardware address */
--unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-+const unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 
};
- 
- 
-+unsigned int seed;
-+
-+/* This is taken from x86 to be used in network kernel. Returns 15 bits. */
-+short int random()
-+{
-+      seed = (seed + 23968)*0x015A4E35 >> 1;
-+      return seed & 0x7FFF;
-+}
- 
- /*
-  **************************************************************************
-@@ -104,10 +111,17 @@
-  */
- void init_net()
- {
-+  /* Avoid data segment allocations */
-+  seed = 151;
-+
-   /* Initialize the different network layer modules */
-   init_packet();
--  if (!init_arp() || !init_udp()) {
--      printf("\nERROR: init_%s\n", net_module_name);
-+  if (!init_arp()) {
-+      printf("\nERROR: init_arp\n");
-+      fatal();
-+  }
-+  if (!init_udp()) {
-+      printf("\nERROR: init_udp\n");
-       fatal();
-   }
- }
-diff -ruN proll_18.orig/src/netpriv.h proll-patch-15/src/netpriv.h
---- proll_18.orig/src/netpriv.h        1999-04-27 05:39:37.000000000 +0000
-+++ proll-patch-15/src/netpriv.h       2005-08-14 10:12:20.000000000 +0000
-@@ -83,7 +83,7 @@
-        */
-       struct device *dev;
-       char *data;
--      int len;
-+      unsigned int len;
-       int protocol;
-       unsigned char ip_summed;
- };
-@@ -130,10 +130,9 @@
-  *
-  */
- extern unsigned char myhwaddr[ETH_ALEN]; /* my own hardware address   */
--extern unsigned char bcasthw[ETH_ALEN];  /* broadcast hardware addr   */
-+extern const unsigned char bcasthw[ETH_ALEN];  /* broadcast hardware addr     
*/
- extern t_ipaddr      myipaddr;           /* my own IP address         */
- extern t_ipaddr      mynetmask;                /* netmask for my network      
*/
--extern char         *net_module_name;  /* initialized module's name   */
- extern t_ipaddr      servaddr;           /* server IP address         */
- 
- 
-@@ -150,7 +149,7 @@
- extern unsigned char *reg_type __P((int typeval, int (* receive)()));
- 
- /* Write a packet to the network */
--extern int write_packet __P((int bufsize, int typeval, unsigned char *addr));
-+extern int write_packet __P((int bufsize, int typeval, const unsigned char 
*addr));
- 
- /* Empty read buffer */
- extern void empty_buf __P((void));
-diff -ruN proll_18.orig/src/openprom.h proll-patch-15/src/openprom.h
---- proll_18.orig/src/openprom.h       2002-07-14 02:26:30.000000000 +0000
-+++ proll-patch-15/src/openprom.h      2005-05-13 16:23:14.000000000 +0000
-@@ -54,29 +54,29 @@
- };
- 
- struct linux_mem_v0 {
--      struct linux_mlist_v0 **v0_totphys;
--      struct linux_mlist_v0 **v0_prommap;
--      struct linux_mlist_v0 **v0_available; /* What we can use */
-+      struct linux_mlist_v0 * const *v0_totphys;
-+      struct linux_mlist_v0 * const *v0_prommap;
-+      struct linux_mlist_v0 * const *v0_available; /* What we can use */
- };
- 
- /* Arguments sent to the kernel from the boot prompt. */
- struct linux_arguments_v0 {
--      char *argv[8];
-+      const char *argv[8];
-       char args[100];
-       char boot_dev[2];
-       int boot_dev_ctrl;
-       int boot_dev_unit;
-       int dev_partition;
--      char *kernel_file_name;
-+      const char *kernel_file_name;
-       void *aieee1;           /* XXX */
- };
- 
- /* V2 and up boot things. */
- struct linux_bootargs_v2 {
--      char **bootpath;
--      char **bootargs;
--      int *fd_stdin;
--      int *fd_stdout;
-+      const char **bootpath;
-+      const char **bootargs;
-+      const int *fd_stdin;
-+      const int *fd_stdout;
- };
- 
- /* The top level PROM vector. */
-@@ -91,13 +91,13 @@
-       struct linux_mem_v0 pv_v0mem;
- 
-       /* Node operations. */
--      struct linux_nodeops *pv_nodeops;
-+      const struct linux_nodeops *pv_nodeops;
- 
-       char **pv_bootstr;
-       struct linux_dev_v0_funcs pv_v0devops;
- 
--      char *pv_stdin;
--      char *pv_stdout;
-+      const char *pv_stdin;
-+      const char *pv_stdout;
- #define       PROMDEV_KBD     0               /* input from keyboard */
- #define       PROMDEV_SCREEN  0               /* output to screen */
- #define       PROMDEV_TTYA    1               /* in/out to ttya */
-@@ -127,7 +127,7 @@
-               void (*v2_eval)(char *str);
-       } pv_fortheval;
- 
--      struct linux_arguments_v0 **pv_v0bootargs;
-+      const struct linux_arguments_v0 * const *pv_v0bootargs;
- 
-       /* Get ether address. */
-       unsigned int (*pv_enaddr)(int d, char *enaddr);
-@@ -175,7 +175,7 @@
-       int (*no_proplen)(int node, char *name);
-       int (*no_getprop)(int node, char *name, char *val);
-       int (*no_setprop)(int node, char *name, char *val, int len);
--      char * (*no_nextprop)(int node, char *name);
-+      const char * (*no_nextprop)(int node, char *name);
- };
- 
- /* More fun PROM structures for device probing. */
-diff -ruN proll_18.orig/src/packet.c proll-patch-15/src/packet.c
---- proll_18.orig/src/packet.c 2000-02-11 04:56:45.000000000 +0000
-+++ proll-patch-15/src/packet.c        2005-08-14 10:12:49.000000000 +0000
-@@ -41,7 +41,7 @@
-       int aligner;
- } wbuf;
- static struct sk_buff *rskb;
--static int nqskb = 0;
-+static int nqskb;
- 
- 
- void init_packet()
-@@ -62,6 +62,8 @@
-       for (i = 0; i < MAXSKBS; i++) {
-               skev[i].skb.allocn = i;
-       }
-+
-+      nqskb = 0;
- }
- 
- unsigned char *reg_type(int ptype, int (*func)())
-@@ -81,7 +83,7 @@
-       return wbuf.s;
- }
- 
--int write_packet(int leng, int type, unsigned char *dst)
-+int write_packet(int leng, int type, const unsigned char *dst)
- {
-       struct sk_buff *skb;
-       unsigned char *s;
-@@ -209,12 +211,12 @@
- /*
-  */
- void
--eth_copy_and_sum(struct sk_buff *dest, unsigned char *src, int len, int base)
-+eth_copy_and_sum(struct sk_buff *dest, unsigned char *src, int len, 
__attribute__((unused)) int base)
- {
-       bcopy(src, dest->data, len);
- }
- 
--unsigned short eth_type_trans(struct sk_buff *skb, struct device *dev)
-+unsigned short eth_type_trans(struct sk_buff *skb, __attribute__((unused)) 
struct device *dev)
- {
-       unsigned char *s = skb->data + 12;
-       return s[0] << 8 | s[1];                /* Network order word */
-diff -ruN proll_18.orig/src/printf.c proll-patch-15/src/printf.c
---- proll_18.orig/src/printf.c 1999-03-19 07:03:59.000000000 +0000
-+++ proll-patch-15/src/printf.c        2005-08-14 10:07:26.000000000 +0000
-@@ -19,7 +19,7 @@
- static void printn(struct prf_fp *, unsigned long, unsigned int);
- static void putchar(char, struct prf_fp *);
- 
--static char hextab[] = "0123456789ABCDEF";
-+static const char hextab[] = "0123456789ABCDEF";
- 
- /*
-  * Scaled down version of C Library printf.
-@@ -41,7 +41,7 @@
- void
- prf(struct prf_fp *filog, char *fmt, va_list adx)
- {
--        register c;
-+        register int c;
-         char *s;
- 
-       for(;;) {
-@@ -60,7 +60,7 @@
-                       putchar(va_arg(adx,unsigned), filog);
-               } else if(c == 's') {
-                       s = va_arg(adx,char*);
--                              while(c = *s++)
-+                              while((c = *s++))
-                               putchar(c,filog);
-                       } else if (c == 'l' || c == 'O') {
-                       printn(filog, (long)va_arg(adx,long), c=='l'?10:8);
-@@ -77,10 +77,6 @@
-         char prbuf[24];
-         register char *cp;
- 
--        if (b == 10 && n < 0) {
--                putchar('-',filog);
--                n = (~n) + 1;         /* n = -n */
--        }
-         cp = prbuf;
-         do
-               *cp++ = hextab[(unsigned int)(n%b)];
-diff -ruN proll_18.orig/src/rconsole.c proll-patch-15/src/rconsole.c
---- proll_18.orig/src/rconsole.c       1999-01-16 07:16:55.000000000 +0000
-+++ proll-patch-15/src/rconsole.c      2005-08-14 10:25:53.000000000 +0000
-@@ -28,12 +28,18 @@
-  * move to California. Only plain lat7 survived. 
-  * I recreated lat7-1 changes in lat7-2.  --zaitcev
-  */
-+#ifdef ORIG
- #include "lat7_2.bm"  /* lat7_1.bm */
-+#else
-+#include "lat7_2_swapped.bm"  /* lat7_1.bm */
-+#endif
- #define LAT7_NCHARS  128
- #define LAT7_HEIGHT   11
- #define LAT7_WIDTH     8
- 
-+#ifdef ORIG
- static Rf_scan lat7_body[ LAT7_NCHARS*LAT7_HEIGHT ];
-+#endif
- 
- #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
- 
-+#ifdef ORIG
- static inline int swapbits(int w0)
- {
-   int w1 = 0;
-@@ -105,13 +112,16 @@
-   }
-   return w1;
- }
-+#endif
- 
- void font_cons_7(struct rfont *p)
- {
-+#ifdef ORIG
-   int x;
-   int col = 0;
-   int row = 0;
-   int erow = 0;
-+
-   for (x = 0; x < LAT7_NCHARS*LAT7_HEIGHT; x++ ) {
-     lat7_body[ (erow * lat7_2_width/8 + col) * LAT7_HEIGHT + row ] =
-                                             swapbits(lat7_2_bits[x]) & 0xFF;
-@@ -124,6 +134,9 @@
-     }
-   }
-   p->body_ = lat7_body;
-+#else
-+  p->body_ = lat7_2_bits;
-+#endif
-   p->nchars_ = LAT7_NCHARS;
-   p->width_ = LAT7_WIDTH;
-   p->height_ = LAT7_HEIGHT;
-@@ -175,7 +188,7 @@
-   r->render_ = p->render_;
- }
- 
--void raster_dest(struct raster *r)
-+void raster_dest(__attribute((unused)) struct raster *r)
- {
- }
- 
-diff -ruN proll_18.orig/src/rconsole.h proll-patch-15/src/rconsole.h
---- proll_18.orig/src/rconsole.h       1999-01-16 05:00:59.000000000 +0000
-+++ proll-patch-15/src/rconsole.h      2004-11-13 15:50:49.000000000 +0000
-@@ -13,10 +13,10 @@
-  */
- 
- #define RF_MAXWIDTH  16
--typedef unsigned short Rf_scan;        /*  __w16 to be used */
-+typedef unsigned char Rf_scan;        /*  __w16 to be used */
- 
- struct rfont {
--  Rf_scan *body_;
-+  const Rf_scan *body_;
-   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-patch-15/src/romlib.h
---- proll_18.orig/src/romlib.h 1999-04-20 04:26:45.000000000 +0000
-+++ proll-patch-15/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)
--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);
-+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);
-+extern int ssize(const char *s);
- 
- 
- /*
-diff -ruN proll_18.orig/src/sched_4m.c proll-patch-15/src/sched_4m.c
---- proll_18.orig/src/sched_4m.c       1999-04-27 05:48:51.000000000 +0000
-+++ proll-patch-15/src/sched_4m.c      2005-08-14 10:18:14.000000000 +0000
-@@ -108,7 +108,7 @@
- static int set_bolt;                  /* Tick counter limit */
- static struct handsc hndv[16];
- 
--static unsigned int intr_to_mask[16] = {
-+static unsigned const int intr_to_mask[16] = {
-       0,      0,      0,      0,      0,      0, SUN4M_INT_ETHERNET,  0,
-       0,      0,      0,      0,      0,      0,      0,      0,
- };
-@@ -130,7 +130,7 @@
- int   /* 0 - not expired yet; <>0 - timer expired */
- chk_timeout()
- {
--      int lim = (((1000000/HZ) + 1) << 10);
-+      unsigned int lim = (((1000000/HZ) + 1) << 10);
-       unsigned int clear;
-       unsigned int intc;
-       int n;
-@@ -182,7 +182,7 @@
-       struct handsc *hndp;
-       unsigned int mask;
- 
--      if (irq < 0 || irq >= 16) {
-+      if (irq == 0 || irq >= 16) {
-               printk("request_irq: bad irq %d\n", irq);
-               return -1;
-       }
-@@ -207,7 +207,7 @@
- {
-       struct handsc *hndp;
- 
--      if (irq < 0 || irq >= 16) {
-+      if (irq == 0 || irq >= 16) {
-               printk("free_irq: bad irq %d\n", irq);
-               return;
-       }
-diff -ruN proll_18.orig/src/swap.c proll-patch-15/src/swap.c
---- proll_18.orig/src/swap.c   1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/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
-+#include "rconsole.c"
-+
-+#include <stdio.h>
-+
-+int main()
-+{
-+    struct rfont p;
-+    int i;
-+
-+    font_cons_7(&p);
-+
-+    printf("   ");
-+    for (i = 0; i < LAT7_NCHARS*LAT7_HEIGHT; i++) {
-+      printf("0x%02x, ", p.body_[i]);
-+      if ((i % 12) == 11)
-+          printf("\n   ");
-+    }
-+    printf("\n");
-+}
-diff -ruN proll_18.orig/src/system.c proll-patch-15/src/system.c
---- proll_18.orig/src/system.c 2002-07-23 05:52:49.000000000 +0000
-+++ proll-patch-15/src/system.c        2005-04-16 06:16:20.000000000 +0000
-@@ -298,8 +298,8 @@
-       }
- 
-       /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */
--      pa = PAGE_SIZE;
--      for (va = PAGE_SIZE; va < LOWMEMSZ; va += PAGE_SIZE) {
-+      pa = 0;
-+      for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) {
-               map_page(l1, va, pa, 0, highbase);
-               pa += PAGE_SIZE;
-       }
-@@ -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;
-+              f++;
-+              t++;
-+      }
- }
- 
- /* Comparison is 7-bit */
--int bcmp(void *s1, void *s2, int len)
-+int bcmp(const void *s1, const void *s2, int len)
- {
-       int i;
-       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;
-@@ -538,8 +552,8 @@
-       return 0;
- }
- 
--int strlen(char *s) {
--      char *p;
-+int strlen(const char *s) {
-+      const char *p;
-       for (p = s; *p != 0; p++) { }
-       return p - s;
- }
-@@ -560,14 +574,6 @@
-       va_end(x1);
- }
- 
--/* This is taken from x86 to be used in network kernel. Returns 15 bits. */
--short int random()
--{
--      static unsigned int seed = 151;
--      seed = (seed + 23968)*0x015A4E35 >> 1;
--      return seed & 0x7FFF;
--}
--
- void fatal()
- {
-       printk("fatal.");
-diff -ruN proll_18.orig/src/system.h proll-patch-15/src/system.h
---- proll_18.orig/src/system.h 2002-09-13 21:53:32.000000000 +0000
-+++ proll-patch-15/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
- 
--#define MAX_BANKS      3              /* Allocation for all machines */
-+#define MAX_BANKS      8              /* Allocation for all machines */
- 
- #ifndef __ASSEMBLY__
- struct bank {
-@@ -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/tftp.c proll-patch-15/src/tftp.c
---- proll_18.orig/src/tftp.c   2002-09-13 21:53:34.000000000 +0000
-+++ proll-patch-15/src/tftp.c  2005-08-14 10:16:15.000000000 +0000
-@@ -127,7 +127,7 @@
-   int len;
- 
-   /* Read packet with timeout */
--  len = udp_read((char *)(&inpbuf), sizeof(inpbuf), TFTP_TIMEOUT, CHR_ESC);
-+  len = udp_read((char *)(&inpbuf), sizeof(inpbuf), TFTP_TIMEOUT);
-   if (len == 0) {
-       printf("TFTP: Timeout\n");
-       return(ERR_TIMEOUT);
-diff -ruN proll_18.orig/src/udp.c proll-patch-15/src/udp.c
---- proll_18.orig/src/udp.c    2001-12-24 05:12:53.000000000 +0000
-+++ proll-patch-15/src/udp.c   2005-08-14 10:17:19.000000000 +0000
-@@ -76,12 +76,9 @@
-  * 
-  * Open a new UDP socket.
-  */
--int udp_open(daddr, source, dest)
--t_ipaddr daddr;
--int      source;
--int      dest;
-+int udp_open(t_ipaddr daddr, int source, int dest)
- {
--  register unsigned char *addr;
-+  const unsigned char *addr;
- 
-   /* Set global variables */
-   usource = source;
-@@ -101,16 +98,13 @@
-  * 
-  * IP receiver routine
-  */
--static int ip_recv(buf, bufsize, addr)
--unsigned char *buf;
--int            bufsize;
--unsigned char *addr;
-+static int ip_recv(unsigned char *buf, unsigned int bufsize, unsigned char 
*addr)
- {
-   struct iphdr *ipp = ((struct iphdr *)buf);
-   struct udphdr *udpp = ((struct udphdr *)(buf + IP_MIN_HSIZE));
-   struct udp_pseudo psehdr;
- 
--  int size;
-+  unsigned int size;
-   t_ipaddr dadr;
- 
- #ifdef DEBUG
-@@ -194,13 +188,9 @@
-  * 
-  * Read one packet from a UDP socket
-  */
--int udp_read(buf, bufsize, timeout, abortch)
--char *buf;
--int   bufsize;
--int   timeout;
--char  abortch;
-+int udp_read(char *buf, unsigned int bufsize, int timeout)
- {
--  int len;
-+  unsigned int len;
- 
-   /* Wait until we get something */
-   set_timeout(timeout);
-@@ -299,9 +289,6 @@
-  */
- int init_udp()
- {
--  /* Set module name for error handling */
--  net_module_name = "udp";
--
-   /* 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/udp.h proll-patch-15/src/udp.h
---- proll_18.orig/src/udp.h    2001-12-24 05:12:34.000000000 +0000
-+++ proll-patch-15/src/udp.h   2005-08-14 10:16:40.000000000 +0000
-@@ -53,7 +53,7 @@
- extern int udp_open __P((t_ipaddr daddr, int source, int dest));
- 
- /* Read from a UDP socket */
--extern int udp_read __P((char *buf, int bufsize, int timeout, char abortch));
-+extern int udp_read(char *buf, unsigned int bufsize, int timeout);
- 
- /* Write to a UDP socket */
- extern int udp_write __P((char *buf, int writelen));
-diff -ruN proll_18.orig/src/vcons_zs.c proll-patch-15/src/vcons_zs.c
---- proll_18.orig/src/vcons_zs.c       1970-01-01 00:00:00.000000000 +0000
-+++ proll-patch-15/src/vcons_zs.c      2005-08-14 10:25:51.000000000 +0000
-@@ -0,0 +1,68 @@
-+/**
-+ ** Console over 'zs' (Zilog serial port)
-+ ** Copyright 1999 Pete Zaitcev
-+ ** This code is licensed under GNU General Public License.
-+ **/
-+
-+#include "vconsole.h"
-+#include <system.h>
-+
-+#define ZS_DATA 0x02
-+
-+int vcon_zs_init(struct vconterm *t, unsigned int a0)
-+{
-+
-+      t->impl = (void *) a0;
-+
-+      t->vc_x = 0;    t->vc_y = 0;
-+      t->backp = 0;    t->backc = 0;
-+
-+      stb_bypass(a0, 3); // reg 3
-+      stb_bypass(a0, 1); // enable rx
-+
-+      stb_bypass(a0, 5); // reg 5
-+      stb_bypass(a0, 8); // enable tx
-+
-+      return 0;
-+}
-+
-+int vcon_zs_putch(struct vconterm *t, char c)
-+{
-+      unsigned zs_ptr = (unsigned) t->impl;
-+
-+      //while ((ldb_bypass(zs_ptr + ZS_LSR) & 0x60) != 0x60) { }
-+      stb_bypass(zs_ptr + ZS_DATA, c);
-+      return 0;
-+}
-+
-+int vcon_zs_write(struct vconterm *t, char *data, int leng)
-+{
-+      while (leng != 0) {
-+              leng--;
-+              vcon_zs_putch(t, *data++);
-+      }
-+      return leng;
-+}
-+
-+int vcon_zs_read(struct vconterm *t, char *data, __attribute((unused)) int 
leng)
-+{
-+      unsigned zs_ptr = (unsigned) t->impl;
-+
-+      while ((ldb_bypass(zs_ptr) & 1) != 1) { }
-+      *data = ldb_bypass(zs_ptr + ZS_DATA);
-+      return 0;
-+}
-+
-+int vcon_zs_getch(struct vconterm *t)
-+{
-+      unsigned zs_ptr = (unsigned) t->impl;
-+
-+      while ((ldb_bypass(zs_ptr) & 1) != 1) { }
-+      return ldb_bypass(zs_ptr + ZS_DATA) & 0xff;
-+}
-+
-+void vcon_zs_fini(__attribute((unused)) struct vconterm *t)
-+{
-+      /* violent crash in the end */
-+      ;
-+}
-diff -ruN proll_18.orig/src/vconsole.c proll-patch-15/src/vconsole.c
---- proll_18.orig/src/vconsole.c       1999-11-08 03:10:28.000000000 +0000
-+++ proll-patch-15/src/vconsole.c      2005-08-14 10:24:49.000000000 +0000
-@@ -7,12 +7,17 @@
- #include "vconsole.h"
- 
- #include "hconsole.h"
-+#include <system.h>
- 
- static void vcon_i_cursfeed(struct vconterm *t);
- static void vcon_i_backflush(struct vconterm *t);
- 
- struct hconsole hcons0;
- 
-+enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
-+      EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd,
-+      ESpalette };
-+
- int vcon_init(struct vconterm *t, unsigned int a0)
- {
-       struct hconsole *hconp;
-@@ -25,11 +30,49 @@
- 
-       t->vc_x = 0;    t->vc_y = 0;
-       t->backp = 0;    t->backc = 0;
-+      t->vc_state = ESnormal;
- 
-       hcon_clear(hconp, 0, 0, hconp->ydim_, hconp->xdim_);
-       return 0;
- }
- 
-+/*
-+ * gotoxy() must verify all boundaries, because the arguments
-+ * might also be negative. If the given position is out of
-+ * bounds, the cursor is placed at the nearest margin.
-+ */
-+static void gotoxy(struct vconterm *vc, int new_x, int new_y)
-+{
-+      int max_x, max_y;
-+      struct hconsole *hconp = vc->impl;
-+
-+      max_x = hcon_qxdim(hconp);
-+      max_y = hcon_qydim(hconp);
-+
-+      if (new_x < 0)
-+              vc->vc_x = 0;
-+      else {
-+              if (new_x >= max_x)
-+                      vc->vc_x = max_x - 1;
-+              else
-+                      vc->vc_x = new_x;
-+      }
-+
-+      if (new_y < 0)
-+              vc->vc_y = 0;
-+      else if (new_y >= max_y)
-+              vc->vc_y = max_y - 1;
-+      else
-+              vc->vc_y = new_y;
-+
-+}
-+
-+/* for absolute user moves, when decom is set */
-+static void gotoxay(struct vconterm *t, int new_x, int new_y)
-+{
-+      gotoxy(t, new_x, new_y);
-+}
-+
- int vcon_write(struct vconterm *t, char *data, int leng)
- {
-       int l = leng;
-@@ -40,29 +83,101 @@
-               if (l <= 0) break;
-               c = *data++;    --l;
- 
--              switch (c) {
--              case 0x07:              /* Bell */
--                      vcon_i_backflush(t);
--                      break;
--              case 0x0A:              /* Linefeed */
--                      vcon_i_backflush(t);
--                      vcon_i_cursfeed(t);
-+              switch(t->vc_state) {
-+              case ESesc:
-+                      t->vc_state = ESnormal;
-+                      switch (c) {
-+                      case '[':
-+                              t->vc_state = ESsquare;
-+                              break;
-+                      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 */
--                      vcon_i_backflush(t);
--                      t->vc_x = 0;
-+              case ESsquare:
-+                      for(t->vc_npar = 0 ; t->vc_npar < NPAR ; t->vc_npar++)
-+                              t->vc_par[t->vc_npar] = 0;
-+                      t->vc_npar = 0;
-+                      t->vc_state = ESgetpars;
-+              case ESgetpars:
-+                      if (c==';' && t->vc_npar<NPAR-1) {
-+                              t->vc_npar++;
-+                              break;
-+                      } else if (c>='0' && c<='9') {
-+                              t->vc_par[t->vc_npar] *= 10;
-+                              t->vc_par[t->vc_npar] += c-'0';
-+                              break;
-+                      } else t->vc_state=ESgotpars;
-+              case ESgotpars:
-+                      t->vc_state = ESnormal;
-+                      switch(c) {
-+                      case 'H': case 'f':
-+                              if (t->vc_par[0]) t->vc_par[0]--;
-+                              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:
-+#if 0
-+                              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]);
-+#endif
-+                              break;
-+                      }
-                       break;
-               default:
--                      if (t->backp == 0) {
--                              t->backc = 1;
--                              t->backp = data-1;
--                      } else {
--                              t->backc++;
--                      }
--                      if (t->vc_x + t->backc >= hcon_qxdim(hconp)) {
-+                      t->vc_state = ESnormal;
-+                      switch (c) {
-+                      case 0x07:              /* Bell */
-+                              vcon_i_backflush(t);
-+                              break;
-+                      case 0x08:              /* BS */
-+                              vcon_i_backflush(t);
-+                              if (t->vc_x > 0)
-+                                      t->vc_x--;
-+                              break;
-+                      case 0x0A:              /* Linefeed */
-                               vcon_i_backflush(t);
--                              t->vc_x = 0;
-                               vcon_i_cursfeed(t);
-+                              break;
-+                      case 0x0D:              /* Return */
-+                              vcon_i_backflush(t);
-+                              t->vc_x = 0;
-+                              break;
-+                      case 24: case 26:
-+                              vcon_i_backflush(t);
-+                              t->vc_state = ESnormal;
-+                              break;
-+                      case 27:
-+                              vcon_i_backflush(t);
-+                              t->vc_state = ESesc;
-+                              break;
-+                      default:
-+                              if (t->backp == 0) {
-+                                      t->backc = 1;
-+                                      t->backp = data-1;
-+                              } else {
-+                                      t->backc++;
-+                              }
-+                              if ((unsigned int)t->vc_x + t->backc >= 
hcon_qxdim(hconp)) {
-+                                      vcon_i_backflush(t);
-+                                      t->vc_x = 0;
-+                                      vcon_i_cursfeed(t);
-+                              }
-                       }
-               }
-       }
-@@ -73,7 +188,7 @@
- static void vcon_i_cursfeed(struct vconterm *t) {
-       struct hconsole *hconp = t->impl;
- 
--      if (++t->vc_y >= hcon_qydim(hconp)) {
-+      if ((unsigned int)++t->vc_y >= hcon_qydim(hconp)) {
-               t->vc_y = hcon_qydim(hconp)-1;
-               hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1);
-       }
-@@ -90,22 +205,75 @@
-       t->backp = 0;    t->backc = 0;
- }
- 
--int vcon_putch(struct vconterm *t, char c)
-+int vcon_putch(__attribute__((unused)) struct vconterm *t, 
__attribute__((unused)) char c)
- {
-       return -1;
- }
- 
--int vcon_read(struct vconterm *t, char *data, int leng)
-+int vcon_read(__attribute__((unused)) struct vconterm *t, 
__attribute__((unused)) char *data, __attribute__((unused)) int leng)
- {
-       return 0;
- }
- 
--int vcon_getch(struct vconterm *t)
-+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(__attribute__((unused)) 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)
-+void vcon_fini(__attribute__((unused)) struct vconterm *t)
- {
-       /* violent crash in the end */
-       ;
-diff -ruN proll_18.orig/src/vconsole.h proll-patch-15/src/vconsole.h
---- proll_18.orig/src/vconsole.h       1999-11-08 00:58:13.000000000 +0000
-+++ proll-patch-15/src/vconsole.h      2005-03-02 12:40:12.000000000 +0000
-@@ -6,6 +6,8 @@
- #ifndef VCONSOLE_H
- #define VCONSOLE_H
- 
-+#define NPAR 16
-+
- struct vconterm {
-       void *impl;
- 
-@@ -13,6 +15,8 @@
-       int backc;              /* Same, count */
- 
-       int vc_x, vc_y;         /* XXX Make vcon_xxx() to use cellmap->xpos_ */
-+      int vc_state;
-+      unsigned int    vc_npar,vc_par[NPAR];   /* Parameters of current escape 
sequence */
- };
- 
- int vcon_init(struct vconterm *t, unsigned int a0);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>