Statistics
| Branch: | Revision:

root / pc-bios / proll.patch @ 6d82d04a

History | View | Annotate | Download (106.5 kB)

1
diff -ruN proll_18.orig/Makefile proll-patch10/Makefile
2
--- proll_18.orig/Makefile        2002-09-13 14:16:59.000000000 +0000
3
+++ proll-patch10/Makefile        2004-11-13 15:50:49.000000000 +0000
4
@@ -4,6 +4,7 @@
5
         make -C krups-ser    all
6
         make -C espresso     all
7
         make -C espresso-ser all
8
+        make -C qemu all
9
 
10
 clean:
11
         make -C mrcoffee clean
12
@@ -11,3 +12,4 @@
13
         make -C krups-ser    clean
14
         make -C espresso     clean
15
         make -C espresso-ser clean
16
+        make -C qemu clean
17
diff -ruN proll_18.orig/qemu/Makefile proll-patch10/qemu/Makefile
18
--- proll_18.orig/qemu/Makefile        1970-01-01 00:00:00.000000000 +0000
19
+++ proll-patch10/qemu/Makefile        2005-04-12 14:42:23.000000000 +0000
20
@@ -0,0 +1,123 @@
21
+#
22
+# proll:
23
+# qemu/Makefile - make PROLL for QEMU
24
+# $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $
25
+#
26
+# Copyright 1999 Pete Zaitcev
27
+# This is Free Software is licensed under terms of GNU General Public License.
28
+#
29
+
30
+CC = gcc
31
+
32
+#CROSS = /usr/local/sparc/bin/sparc-sun-linux-
33
+CROSS = sparc-unknown-linux-gnu-
34
+
35
+CROSSCC = $(CROSS)gcc
36
+CROSSLD = $(CROSS)ld
37
+CROSSNM = $(CROSS)nm
38
+
39
+RM = /bin/rm -f
40
+ELFTOAOUT = elftoaout
41
+
42
+#
43
+SRC = ../src
44
+
45
+# Due to remapping algorithm PROLBASE should be algned on PMD.
46
+# We make PROLBASE a define instead of using _start because we
47
+# want to shift it to form a PGD entry. A relocatable label will not work.
48
+# Linux kernel expects us to be at LINUX_OPPROM_BEGVM <asm-sparc/openprom.h>.
49
+PROLBASE =   0xffd00000
50
+PROLRODATA = 0xffd08000
51
+PROLDATA =   0xffd0b000
52
+PROLSIZE = 240*1024
53
+
54
+# Linux
55
+# Fixed %g6 is for arch/sparc/kernel/head.S, it seems ok w/o -ffixed-g6.
56
+# Kernel uses -fcall-used-g5 -fcall-used-g7, we probably do not need them.
57
+# __ANSI__ is supposed to be on by default but it is not.
58
+CFLAGS = -O2 -Wall -DPROLBASE=$(PROLBASE) -DPROLDATA=$(PROLDATA) -DPROLRODATA=$(PROLRODATA) -D__ANSI__=1 -I$(SRC) -mcpu=hypersparc -g -DQEMU
59
+ASFLAGS = -D__ASSEMBLY__ -I$(SRC) -DPROLRODATA=$(PROLRODATA) -DPROLDATA=$(PROLDATA) -DPROLSIZE=$(PROLSIZE) -g
60
+# Solaris or Linux/i386 cross compilation
61
+#CFLAGS = -Iinclude -O
62
+
63
+LDFLAGS = -N -Ttext $(PROLBASE) --section-start .rodata=$(PROLRODATA) -Tdata $(PROLDATA) -Tbss $(PROLDATA)
64
+
65
+ALL = proll.aout
66
+PROLLEXE = proll.elf
67
+
68
+OBJS = head.o wuf.o wof.o main.o $(CONSOLE) \
69
+ printf.o le.o system_qemu.o iommu.o \
70
+ arp.o netinit.o bootp.o packet.o tftp.o udp.o sched_4m.o openprom.o \
71
+ vconsole.o hconsole.o rconsole.o vcons_zs.o esp.o
72
+
73
+all:           $(ALL)
74
+
75
+$(PROLLEXE):   $(OBJS)
76
+        $(CROSSLD) $(LDFLAGS) -o $(PROLLEXE) $(OBJS)
77
+
78
+head.o:         head.S $(SRC)/phys_jj.h \
79
+  $(SRC)/asi.h $(SRC)/psr.h $(SRC)/crs.h
80
+        $(CROSSCC) $(ASFLAGS) -DPROLBASE=$(PROLBASE) -o $*.o -c $*.S
81
+
82
+main.o:         main.c $(SRC)/asi.h $(SRC)/pgtsrmmu.h $(SRC)/iommu.h \
83
+  $(SRC)/phys_jj.h $(SRC)/vconsole.h $(SRC)/version.h $(SRC)/general.h \
84
+  $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arpa.h $(SRC)/system.h
85
+        $(CROSSCC) $(CFLAGS) -c $*.c
86
+openprom.o:        openprom.c $(SRC)/openprom.h $(SRC)/general.h $(SRC)/romlib.h \
87
+  $(SRC)/vconsole.h $(SRC)/system.h $(SRC)/phys_jj.h
88
+        $(CROSSCC) $(CFLAGS) -c $*.c
89
+
90
+system_qemu.o:       system_qemu.c $(SRC)/vconsole.h $(SRC)/pgtsrmmu.h \
91
+  $(SRC)/timer.h $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/asi.h \
92
+  $(SRC)/netpriv.h $(SRC)/arpa.h $(SRC)/system.h $(SRC)/crs.h
93
+        $(CROSSCC) $(CFLAGS) -c $*.c
94
+iommu.o:        $(SRC)/iommu.c $(SRC)/pgtsrmmu.h $(SRC)/phys_jj.h $(SRC)/iommu.h \
95
+ $(SRC)/vconsole.h $(SRC)/general.h $(SRC)/romlib.h $(SRC)/system.h $(SRC)/asi.h
96
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
97
+vconsole.o:        $(SRC)/vconsole.c $(SRC)/vconsole.h $(SRC)/hconsole.h
98
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
99
+vcons_zs.o:        $(SRC)/vcons_zs.c $(SRC)/vconsole.h $(SRC)/system.h
100
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
101
+hconsole.o:        $(SRC)/hconsole.c $(SRC)/hconsole.h $(SRC)/rconsole.h $(SRC)/phys_jj.h
102
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
103
+rconsole.o:        $(SRC)/rconsole.c $(SRC)/rconsole.h
104
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
105
+printf.o:       $(SRC)/printf.c
106
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
107
+le.o:                $(SRC)/le.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/netpriv.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/net.h $(SRC)/phys_jj.h
108
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
109
+esp.o:                $(SRC)/esp.c $(SRC)/dma.h $(SRC)/system.h $(SRC)/romlib.h $(SRC)/general.h $(SRC)/phys_jj.h
110
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
111
+arp.o:                $(SRC)/arp.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h
112
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
113
+netinit.o:        $(SRC)/netinit.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h $(SRC)/arp.h $(SRC)/ip.h $(SRC)/udp.h
114
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
115
+tftp.o:                $(SRC)/tftp.c $(SRC)/general.h $(SRC)/net.h $(SRC)/arpa.h $(SRC)/romlib.h $(SRC)/tftp.h
116
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
117
+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
118
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
119
+packet.o:        $(SRC)/packet.c $(SRC)/general.h $(SRC)/net.h $(SRC)/romlib.h $(SRC)/netpriv.h
120
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
121
+sched_4m.o:        $(SRC)/sched_4m.c $(SRC)/system.h $(SRC)/general.h $(SRC)/romlib.h $(SRC)/phys_jj.h
122
+        $(CROSSCC) $(CFLAGS) -c $(SRC)/$*.c
123
+bootp.o:        $(SRC)/bootp.c $(SRC)/general.h $(SRC)/net.h \
124
+  $(SRC)/arpa.h $(SRC)/romlib.h $(SRC)/system.h $(SRC)/bootp.h
125
+        $(CROSSCC) $(CFLAGS) -DNOBPEXT=1 -c $(SRC)/$*.c
126
+
127
+wuf.o:                $(SRC)/wuf.S
128
+        $(CROSSCC) $(ASFLAGS) -o $*.o -c $(SRC)/$*.S
129
+wof.o:                $(SRC)/wof.S
130
+        $(CROSSCC) $(ASFLAGS) -o $*.o -c $(SRC)/$*.S
131
+
132
+#genlab.o:      genlab.c
133
+#        $(CC) -c $*.c
134
+#
135
+#genlab:        genlab.o
136
+#        $(CC) -o genlab genlab.o
137
+
138
+clean:
139
+        $(RM) $(OBJS)
140
+        $(RM) $(PROLLEXE) proll.aout
141
+
142
+proll.aout:        $(PROLLEXE)
143
+        $(ELFTOAOUT) -o proll.aout $(PROLLEXE)
144
diff -ruN proll_18.orig/qemu/head.S proll-patch10/qemu/head.S
145
--- proll_18.orig/qemu/head.S        1970-01-01 00:00:00.000000000 +0000
146
+++ proll-patch10/qemu/head.S        2005-03-02 15:30:47.000000000 +0000
147
@@ -0,0 +1,539 @@
148
+/**
149
+ ** Standalone startup code for Linux PROM emulator.
150
+ ** Copyright 1999 Pete A. Zaitcev
151
+ ** This code is licensed under GNU General Public License.
152
+ **/
153
+/*
154
+ * $Id: proll.patch,v 1.5 2005-04-26 21:02:48 bellard Exp $
155
+ */
156
+
157
+#include <psr.h>
158
+#include <asi.h>
159
+#include <crs.h>
160
+/* #include <asm/head.h> */        /* Trap entries. Do not use. */
161
+#include "phys_jj.h"
162
+
163
+#define C_LABEL(name)        name
164
+#define REGWIN_SZ   0x40
165
+
166
+#define WRITE_PAUSE    nop; nop; nop; /* Have to do this after %wim/%psr chg */
167
+
168
+  /* 22 is 24-2, (va)>>(SRMMU_PGDIR_SHIFT-PTESIZESHFT) */
169
+#define VATOPGDOFF(va) (((va)>>22)&0x3FC)
170
+#define VATOPMDOFF(va) (((va)>>16)&0xFC)
171
+
172
+#define NOP_INSN       0x01000000     /* Used to patch sparc_save_state */
173
+
174
+/* Here are some trap goodies */
175
+
176
+#if 0
177
+/* Generic trap entry. */
178
+#define TRAP_ENTRY(type, label) \
179
+        rd %psr, %l0; b label; rd %wim, %l3; nop;
180
+#endif
181
+
182
+/* Data/text faults. */
183
+#define SRMMU_TFAULT rd %psr, %l0; rd %wim, %l3; b C_LABEL(srmmu_fault); mov 1, %l7;
184
+#define SRMMU_DFAULT rd %psr, %l0; rd %wim, %l3; b C_LABEL(srmmu_fault); mov 0, %l7;
185
+
186
+#if 0
187
+/* This is for traps we should NEVER get. */
188
+#define BAD_TRAP(num) \
189
+        rd %psr, %l0; mov num, %l7; b bad_trap_handler; rd %wim, %l3;
190
+
191
+/* This is for traps when we want just skip the instruction which caused it */
192
+#define SKIP_TRAP(type, name) \
193
+        jmpl %l2, %g0; rett %l2 + 4; nop; nop;
194
+
195
+/* Notice that for the system calls we pull a trick.  We load up a
196
+ * different pointer to the system call vector table in %l7, but call
197
+ * the same generic system call low-level entry point.  The trap table
198
+ * entry sequences are also HyperSparc pipeline friendly ;-)
199
+ */
200
+
201
+/* Software trap for Linux system calls. */
202
+#define LINUX_SYSCALL_TRAP \
203
+        sethi %hi(C_LABEL(sys_call_table)), %l7; \
204
+        or %l7, %lo(C_LABEL(sys_call_table)), %l7; \
205
+        b linux_sparc_syscall; \
206
+        rd %psr, %l0;
207
+
208
+/* Software trap for SunOS4.1.x system calls. */
209
+#define SUNOS_SYSCALL_TRAP \
210
+        rd %psr, %l0; \
211
+        sethi %hi(C_LABEL(sunos_sys_table)), %l7; \
212
+        b linux_sparc_syscall; \
213
+        or %l7, %lo(C_LABEL(sunos_sys_table)), %l7;
214
+
215
+/* Software trap for Slowaris system calls. */
216
+#define SOLARIS_SYSCALL_TRAP \
217
+        b solaris_syscall; \
218
+        rd %psr, %l0; \
219
+        nop; \
220
+        nop;
221
+
222
+#define INDIRECT_SOLARIS_SYSCALL(x) \
223
+        mov x, %g1; \
224
+        b solaris_syscall; \
225
+        rd %psr, %l0; \
226
+        nop;
227
+
228
+#define BREAKPOINT_TRAP \
229
+        b breakpoint_trap; \
230
+        rd %psr,%l0; \
231
+        nop; \
232
+        nop;
233
+
234
+/* Software trap for Sparc-netbsd system calls. */
235
+#define NETBSD_SYSCALL_TRAP \
236
+        sethi %hi(C_LABEL(sys_call_table)), %l7; \
237
+        or %l7, %lo(C_LABEL(sys_call_table)), %l7; \
238
+        b bsd_syscall; \
239
+        rd %psr, %l0;
240
+
241
+/* The Get Condition Codes software trap for userland. */
242
+#define GETCC_TRAP \
243
+        b getcc_trap_handler; mov %psr, %l0; nop; nop;
244
+
245
+/* The Set Condition Codes software trap for userland. */
246
+#define SETCC_TRAP \
247
+        b setcc_trap_handler; mov %psr, %l0; nop; nop;
248
+
249
+/* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and
250
+ * gets handled with another macro.
251
+ */
252
+#define TRAP_ENTRY_INTERRUPT(int_level) \
253
+        mov int_level, %l7; rd %psr, %l0; b real_irq_entry; rd %wim, %l3;
254
+
255
+/* NMI's (Non Maskable Interrupts) are special, you can't keep them
256
+ * from coming in, and basically if you get one, the shows over. ;(
257
+ * On the sun4c they are usually asynchronous memory errors, on the
258
+ * the sun4m they could be either due to mem errors or a software
259
+ * initiated interrupt from the prom/kern on an SMP box saying "I
260
+ * command you to do CPU tricks, read your mailbox for more info."
261
+ */
262
+#define NMI_TRAP \
263
+        rd %wim, %l3; b linux_trap_nmi_sun4c; mov %psr, %l0; nop;
264
+
265
+#endif
266
+
267
+/* Window overflows/underflows are special and we need to try to be as
268
+ * efficient as possible here....
269
+ */
270
+#define WINDOW_SPILL \
271
+        rd %psr, %l0; rd %wim, %l3; b spill_window_entry; nop;
272
+
273
+#define WINDOW_FILL \
274
+        rd %psr, %l0; rd %wim, %l3; b fill_window_entry; nop;
275
+
276
+#define STUB_TRAP        ba stub_trap; nop; nop; nop;
277
+
278
+#define TRAP_ENTRY(a,b)                STUB_TRAP
279
+#define SKIP_TRAP(a,b)                STUB_TRAP
280
+#define SUNOS_SYSCALL_TRAP        STUB_TRAP
281
+#define SOLARIS_SYSCALL_TRAP        STUB_TRAP
282
+#define NETBSD_SYSCALL_TRAP        STUB_TRAP
283
+#define LINUX_SYSCALL_TRAP        STUB_TRAP
284
+#define BREAKPOINT_TRAP                STUB_TRAP
285
+#define NMI_TRAP                STUB_TRAP
286
+#define GETCC_TRAP                STUB_TRAP
287
+#define SETCC_TRAP                STUB_TRAP
288
+#define BAD_TRAP(n)                STUB_TRAP
289
+#define        TRAP_ENTRY_INTERRUPT(i)                STUB_TRAP
290
+#define        INDIRECT_SOLARIS_SYSCALL(i)        STUB_TRAP
291
+
292
+        .section ".text"
293
+        .globl start, _start
294
+_start:
295
+start:
296
+        .globl spill_window_entry, fill_window_entry
297
+
298
+#define        EXPORT_TRAP(trap) \
299
+        .globl trap; \
300
+        .type trap,function; \
301
+        .size trap, 16
302
+
303
+EXPORT_TRAP(t_zero)
304
+EXPORT_TRAP(t_wovf)
305
+EXPORT_TRAP(t_wunf)
306
+EXPORT_TRAP(t_irq1)
307
+EXPORT_TRAP(t_irq2)
308
+EXPORT_TRAP(t_irq3)
309
+EXPORT_TRAP(t_irq4)
310
+EXPORT_TRAP(t_irq5)
311
+EXPORT_TRAP(t_irq6)
312
+EXPORT_TRAP(t_irq7)
313
+EXPORT_TRAP(t_irq8)
314
+EXPORT_TRAP(t_irq9)
315
+EXPORT_TRAP(t_irq10)
316
+EXPORT_TRAP(t_irq11)
317
+EXPORT_TRAP(t_irq12)
318
+EXPORT_TRAP(t_irq13)
319
+EXPORT_TRAP(t_irq14)
320
+EXPORT_TRAP(t_irq15)
321
+
322
+C_LABEL(trapbase):
323
+t_zero:        b goprol; nop; nop; nop;
324
+t_tflt:        SRMMU_TFAULT                        /* Inst. Access Exception        */
325
+t_bins:        TRAP_ENTRY(0x2, bad_instruction)    /* Illegal Instruction           */
326
+t_pins:        TRAP_ENTRY(0x3, priv_instruction)   /* Privileged Instruction        */
327
+t_fpd:        TRAP_ENTRY(0x4, fpd_trap_handler)   /* Floating Point Disabled       */
328
+t_wovf:        WINDOW_SPILL                        /* Window Overflow               */
329
+t_wunf:        WINDOW_FILL                         /* Window Underflow              */
330
+t_mna:        TRAP_ENTRY(0x7, mna_handler)        /* Memory Address Not Aligned    */
331
+t_fpe:        TRAP_ENTRY(0x8, fpe_trap_handler)   /* Floating Point Exception      */
332
+t_dflt:        SRMMU_DFAULT                        /* Data Miss Exception           */
333
+t_tio:        TRAP_ENTRY(0xa, do_tag_overflow)    /* Tagged Instruction Ovrflw     */
334
+t_wpt:        TRAP_ENTRY(0xb, do_watchpoint)      /* Watchpoint Detected           */
335
+t_badc:        BAD_TRAP(0xc) BAD_TRAP(0xd) BAD_TRAP(0xe) BAD_TRAP(0xf) BAD_TRAP(0x10)
336
+t_irq1:        TRAP_ENTRY_INTERRUPT(1)             /* IRQ Software/SBUS Level 1     */
337
+t_irq2:        TRAP_ENTRY_INTERRUPT(2)             /* IRQ SBUS Level 2              */
338
+t_irq3:        TRAP_ENTRY_INTERRUPT(3)             /* IRQ SCSI/DMA/SBUS Level 3     */
339
+t_irq4:        TRAP_ENTRY_INTERRUPT(4)             /* IRQ Software Level 4          */
340
+t_irq5:        TRAP_ENTRY_INTERRUPT(5)             /* IRQ SBUS/Ethernet Level 5     */
341
+t_irq6:        TRAP_ENTRY_INTERRUPT(6)             /* IRQ Software Level 6          */
342
+t_irq7:        TRAP_ENTRY_INTERRUPT(7)             /* IRQ Video/SBUS Level 5        */
343
+t_irq8:        TRAP_ENTRY_INTERRUPT(8)             /* IRQ SBUS Level 6              */
344
+t_irq9:        TRAP_ENTRY_INTERRUPT(9)             /* IRQ SBUS Level 7              */
345
+t_irq10:TRAP_ENTRY_INTERRUPT(10)            /* IRQ Timer #1 (one we use)     */
346
+t_irq11:TRAP_ENTRY_INTERRUPT(11)            /* IRQ Floppy Intr.              */
347
+t_irq12:TRAP_ENTRY_INTERRUPT(12)            /* IRQ Zilog serial chip         */
348
+t_irq13:TRAP_ENTRY_INTERRUPT(13)            /* IRQ Audio Intr.               */
349
+t_irq14:TRAP_ENTRY_INTERRUPT(14)            /* IRQ Timer #2                  */
350
+t_nmi:        NMI_TRAP                            /* Level 15 (NMI)                */
351
+t_racc:        TRAP_ENTRY(0x20, do_reg_access)     /* General Register Access Error */
352
+t_iacce:BAD_TRAP(0x21)                      /* Instr Access Error            */
353
+t_bad22:BAD_TRAP(0x22) BAD_TRAP(0x23)
354
+t_cpdis:TRAP_ENTRY(0x24, do_cp_disabled)    /* Co-Processor Disabled         */
355
+t_uflsh:SKIP_TRAP(0x25, unimp_flush)        /* Unimplemented FLUSH inst.     */
356
+t_bad26:BAD_TRAP(0x26) BAD_TRAP(0x27)
357
+t_cpexc:TRAP_ENTRY(0x28, do_cp_exception)   /* Co-Processor Exception        */
358
+t_dacce:SRMMU_DFAULT                        /* Data Access Error             */
359
+t_hwdz:        TRAP_ENTRY(0x2a, do_hw_divzero)     /* Division by zero, you lose... */
360
+t_dserr:BAD_TRAP(0x2b)                      /* Data Store Error              */
361
+t_daccm:BAD_TRAP(0x2c)                      /* Data Access MMU-Miss          */
362
+t_bad2d:               BAD_TRAP(0x2d) BAD_TRAP(0x2e) BAD_TRAP(0x2f)
363
+        BAD_TRAP(0x30) BAD_TRAP(0x31) BAD_TRAP(0x32) BAD_TRAP(0x33)
364
+        BAD_TRAP(0x34) BAD_TRAP(0x35) BAD_TRAP(0x36) BAD_TRAP(0x37)
365
+        BAD_TRAP(0x38) BAD_TRAP(0x39) BAD_TRAP(0x3a) BAD_TRAP(0x3b)
366
+t_iaccm:BAD_TRAP(0x3c)                      /* Instr Access MMU-Miss         */
367
+ BAD_TRAP(0x3d) BAD_TRAP(0x3e) BAD_TRAP(0x3f)
368
+ BAD_TRAP(0x40) BAD_TRAP(0x41) BAD_TRAP(0x42) BAD_TRAP(0x43)
369
+ BAD_TRAP(0x44) BAD_TRAP(0x45) BAD_TRAP(0x46) BAD_TRAP(0x47)
370
+ BAD_TRAP(0x48) BAD_TRAP(0x49) BAD_TRAP(0x4a) BAD_TRAP(0x4b)
371
+ BAD_TRAP(0x4c) BAD_TRAP(0x4d) BAD_TRAP(0x4e) BAD_TRAP(0x4f)
372
+ BAD_TRAP(0x50) BAD_TRAP(0x51) BAD_TRAP(0x52) BAD_TRAP(0x53)
373
+ BAD_TRAP(0x54) BAD_TRAP(0x55) BAD_TRAP(0x56) BAD_TRAP(0x57)
374
+ BAD_TRAP(0x58) BAD_TRAP(0x59) BAD_TRAP(0x5a) BAD_TRAP(0x5b)
375
+ BAD_TRAP(0x5c) BAD_TRAP(0x5d) BAD_TRAP(0x5e) BAD_TRAP(0x5f)
376
+ BAD_TRAP(0x60) BAD_TRAP(0x61) BAD_TRAP(0x62) BAD_TRAP(0x63)
377
+ BAD_TRAP(0x64) BAD_TRAP(0x65) BAD_TRAP(0x66) BAD_TRAP(0x67)
378
+ BAD_TRAP(0x68) BAD_TRAP(0x69) BAD_TRAP(0x6a) BAD_TRAP(0x6b)
379
+ BAD_TRAP(0x6c) BAD_TRAP(0x6d) BAD_TRAP(0x6e) BAD_TRAP(0x6f)
380
+ BAD_TRAP(0x70) BAD_TRAP(0x71) BAD_TRAP(0x72) BAD_TRAP(0x73)
381
+ BAD_TRAP(0x74) BAD_TRAP(0x75) BAD_TRAP(0x76) BAD_TRAP(0x77)
382
+ BAD_TRAP(0x78) BAD_TRAP(0x79) BAD_TRAP(0x7a) BAD_TRAP(0x7b)
383
+ BAD_TRAP(0x7c) BAD_TRAP(0x7d) BAD_TRAP(0x7e) BAD_TRAP(0x7f)
384
+t_sunos:SUNOS_SYSCALL_TRAP                  /* SunOS System Call             */
385
+t_sbkpt:BREAKPOINT_TRAP                     /* Software Breakpoint/KGDB      */
386
+t_divz:        BAD_TRAP(0x82)                      /* Divide by zero trap           */
387
+t_flwin:TRAP_ENTRY(0x83, do_flush_windows)  /* Flush Windows Trap            */
388
+t_clwin:BAD_TRAP(0x84)                      /* Clean Windows Trap            */
389
+t_rchk:        BAD_TRAP(0x85)                      /* Range Check                   */
390
+t_funal:BAD_TRAP(0x86)                      /* Fix Unaligned Access Trap     */
391
+t_iovf:        BAD_TRAP(0x87)                      /* Integer Overflow Trap         */
392
+t_slowl:SOLARIS_SYSCALL_TRAP                /* Slowaris System Call          */
393
+t_netbs:NETBSD_SYSCALL_TRAP                 /* Net-B.S. System Call          */
394
+t_bad8a:BAD_TRAP(0x8a) BAD_TRAP(0x8b) BAD_TRAP(0x8c) BAD_TRAP(0x8d)
395
+ BAD_TRAP(0x8e) BAD_TRAP(0x8f)
396
+t_linux:LINUX_SYSCALL_TRAP                  /* Linux System Call             */
397
+t_bad91:BAD_TRAP(0x91) BAD_TRAP(0x92) BAD_TRAP(0x93)
398
+ BAD_TRAP(0x94) BAD_TRAP(0x95) BAD_TRAP(0x96) BAD_TRAP(0x97)
399
+ BAD_TRAP(0x98) BAD_TRAP(0x99) BAD_TRAP(0x9a) BAD_TRAP(0x9b) BAD_TRAP(0x9c) BAD_TRAP(0x9d) BAD_TRAP(0x9e) BAD_TRAP(0x9f)
400
+t_getcc:GETCC_TRAP                          /* Get Condition Codes           */
401
+t_setcc:SETCC_TRAP                          /* Set Condition Codes           */
402
+t_bada2:BAD_TRAP(0xa2) BAD_TRAP(0xa3)
403
+ BAD_TRAP(0xa4) BAD_TRAP(0xa5) BAD_TRAP(0xa6)
404
+t_slowi:INDIRECT_SOLARIS_SYSCALL(156)
405
+ BAD_TRAP(0xa8) BAD_TRAP(0xa9) BAD_TRAP(0xaa) BAD_TRAP(0xab)
406
+ BAD_TRAP(0xac) BAD_TRAP(0xad) BAD_TRAP(0xae) BAD_TRAP(0xaf)
407
+ BAD_TRAP(0xb0) BAD_TRAP(0xb1) BAD_TRAP(0xb2) BAD_TRAP(0xb3)
408
+ BAD_TRAP(0xb4) BAD_TRAP(0xb5) BAD_TRAP(0xb6) BAD_TRAP(0xb7)
409
+ BAD_TRAP(0xb8) BAD_TRAP(0xb9) BAD_TRAP(0xba) BAD_TRAP(0xbb)
410
+ BAD_TRAP(0xbc) BAD_TRAP(0xbd) BAD_TRAP(0xbe) BAD_TRAP(0xbf)
411
+t_badc0:BAD_TRAP(0xc0) BAD_TRAP(0xc1) BAD_TRAP(0xc2) BAD_TRAP(0xc3)
412
+ BAD_TRAP(0xc4) BAD_TRAP(0xc5) BAD_TRAP(0xc6) BAD_TRAP(0xc7)
413
+ BAD_TRAP(0xc8) BAD_TRAP(0xc9) BAD_TRAP(0xca) BAD_TRAP(0xcb)
414
+ BAD_TRAP(0xcc) BAD_TRAP(0xcd) BAD_TRAP(0xce) BAD_TRAP(0xcf)
415
+ BAD_TRAP(0xd0) BAD_TRAP(0xd1) BAD_TRAP(0xd2) BAD_TRAP(0xd3)
416
+t_badd4:BAD_TRAP(0xd4) BAD_TRAP(0xd5) BAD_TRAP(0xd6) BAD_TRAP(0xd7)
417
+ BAD_TRAP(0xd8) BAD_TRAP(0xd9) BAD_TRAP(0xda) BAD_TRAP(0xdb)
418
+ BAD_TRAP(0xdc) BAD_TRAP(0xdd) BAD_TRAP(0xde) BAD_TRAP(0xdf)
419
+ BAD_TRAP(0xe0) BAD_TRAP(0xe1) BAD_TRAP(0xe2) BAD_TRAP(0xe3)
420
+ BAD_TRAP(0xe4) BAD_TRAP(0xe5) BAD_TRAP(0xe6) BAD_TRAP(0xe7)
421
+t_bade8:BAD_TRAP(0xe8) BAD_TRAP(0xe9) BAD_TRAP(0xea) BAD_TRAP(0xeb)
422
+ BAD_TRAP(0xec) BAD_TRAP(0xed) BAD_TRAP(0xee) BAD_TRAP(0xef)
423
+ BAD_TRAP(0xf0) BAD_TRAP(0xf1) BAD_TRAP(0xf2) BAD_TRAP(0xf3)
424
+ BAD_TRAP(0xf4) BAD_TRAP(0xf5) BAD_TRAP(0xf6) BAD_TRAP(0xf7)
425
+ BAD_TRAP(0xf8) BAD_TRAP(0xf9) BAD_TRAP(0xfa) BAD_TRAP(0xfb)
426
+t_badfc:BAD_TRAP(0xfc) BAD_TRAP(0xfd)
427
+dbtrap:        BAD_TRAP(0xfe)                      /* Debugger/PROM breakpoint #1   */
428
+dbtrap2:BAD_TRAP(0xff)                      /* Debugger/PROM breakpoint #2   */        
429
+
430
+stub_trap:
431
+   set (PHYS_JJ_TCX_FB + 0xbf0), %g5        /* 2 cells from side */
432
+   set 0x00ffffff, %g4
433
+   sta %g4, [%g5] ASI_M_BYPASS
434
+1:        ba 1b; nop
435
+
436
+        .section ".bss"
437
+        .align 8
438
+bss_start:
439
+        .align        0x1000                ! PAGE_SIZE
440
+        .globl C_LABEL(bootup_user_stack)
441
+        .type   bootup_user_stack,#object
442
+        .size   bootup_user_stack,0x2000
443
+C_LABEL(bootup_user_stack):                .skip 0x2000
444
+
445
+        .section ".text"
446
+
447
+goprol:
448
+        ! %g1 contains end of memory
449
+        set        PHYS_JJ_EEPROM + 0x30, %g1
450
+        lda        [%g1] ASI_M_BYPASS, %g1
451
+        ! map PROLDATA to PROLBASE+PROLSIZE to end of ram
452
+        set        PROLSIZE+0x1000-PROLDATA+PROLBASE, %g2        ! add 0x1000 for temp tables
453
+        sub        %g1, %g2, %g2                        ! start of private memory
454
+        srl        %g2, 0x4, %g7                        ! ctx table at s+0x0
455
+        add        %g2, 0x400, %g3                        ! l1 table at s+0x400
456
+        srl        %g3, 0x4, %g3
457
+        or        %g3, 0x1, %g3
458
+        sta        %g3, [%g2] ASI_M_BYPASS
459
+        add        %g2, 0x400, %g2                        ! s+0x400
460
+        add        %g2, 0x800, %g3                        ! l2 table for ram (00xxxxxx) at s+0x800
461
+        srl        %g3, 0x4, %g3
462
+        or        %g3, 0x1, %g3
463
+        sta        %g3, [%g2] ASI_M_BYPASS
464
+        add        %g2, 0x500, %g3                        ! l2 table for rom (ffxxxxxx) at s+0x900
465
+        add        %g2, 0x3fc, %g2                        ! s+0x7fc
466
+        srl        %g3, 0x4, %g3
467
+        or        %g3, 0x1, %g3
468
+        sta        %g3, [%g2] ASI_M_BYPASS
469
+        add        %g2, 0x4, %g2                        ! s+0x800
470
+        set        ((7 << 2) | 2), %g3                ! 7 = U: --- S: RWX (main memory)
471
+        sta        %g3, [%g2] ASI_M_BYPASS
472
+        add        %g2, 0x200, %g3                        ! l3 table for rom at s+0xa00
473
+        add        %g2, 0x1d0, %g2                        ! s+0x9d0
474
+        srl        %g3, 0x4, %g3
475
+        or        %g3, 0x1, %g3
476
+        sta        %g3, [%g2] ASI_M_BYPASS
477
+        add        %g2, 0x30, %g2                        ! s+0xa00
478
+
479
+        set        PROLBASE, %g3
480
+        set        0x1000, %g5
481
+        set        (PROLDATA-PROLBASE)/0x1000, %g6 ! # of .text pages
482
+1:        srl        %g3, 0x4, %g4
483
+        or        %g4, ((7 << 2) | 2), %g4        ! 4 = U: --X S: --X (rom, execute only)
484
+        sta        %g4, [%g2] ASI_M_BYPASS
485
+        add        %g2, 4, %g2
486
+        add        %g3, %g5, %g3
487
+        deccc        %g6
488
+        bne        1b
489
+         nop
490
+#if 0        
491
+        set        (PROLDATA-PROLRODATA)/0x1000, %g6 ! # of .rodata pages
492
+1:        srl        %g3, 0x4, %g4
493
+        or        %g4, ((0 << 2) | 2), %g4        ! 0 = U: R-- S: R-- (rom, read only)
494
+        sta        %g4, [%g2] ASI_M_BYPASS
495
+        add        %g2, 4, %g2
496
+        add        %g3, %g5, %g3
497
+        deccc        %g6
498
+        bne        1b
499
+         nop
500
+#endif
501
+        set        (PROLBASE+PROLSIZE-PROLDATA)/0x1000, %g6 ! # of .bss pages
502
+        set        0x1000, %g4
503
+        sll        %g7, 0x4, %g3
504
+        add        %g4, %g3, %g3
505
+1:        srl        %g3, 0x4, %g4
506
+        or        %g4, ((7 << 2) | 2), %g4        ! 5 = U: R-- S: RW- (data area, read/write)
507
+        sta        %g4, [%g2] ASI_M_BYPASS
508
+        add        %g2, 4, %g2
509
+        add        %g3, %g5, %g3
510
+        deccc        %g6
511
+        bne        1b
512
+         nop
513
+
514
+        mov        %g1, %g3
515
+
516
+        set     AC_M_CTPR, %g2
517
+        sta     %g7, [%g2] ASI_M_MMUREGS        ! set ctx table ptr
518
+        set        1, %g1
519
+        sta     %g1, [%g0] ASI_M_MMUREGS        ! enable mmu
520
+
521
+        /*
522
+         * The code which enables traps is a simplified version of
523
+         * kernel head.S.
524
+         *
525
+         * We know number of windows as 8 so we do not calculate them.
526
+         * The deadwood is here for any case.
527
+         */
528
+
529
+        /* Turn on Supervisor, EnableFloating, and all the PIL bits.
530
+         * Also puts us in register window zero with traps off.
531
+         */
532
+        set        (PSR_PS | PSR_S | PSR_PIL | PSR_EF), %g2
533
+        wr        %g2, 0x0, %psr
534
+        WRITE_PAUSE
535
+
536
+        /* I want a kernel stack NOW! */
537
+        set        C_LABEL(bootup_user_stack), %g1
538
+        set        (0x2000 - REGWIN_SZ), %g2
539
+        add        %g1, %g2, %sp
540
+        mov        0, %fp                        /* And for good luck */
541
+
542
+        /* Zero out our BSS section. */
543
+        set        C_LABEL(bss_start) , %o0        ! First address of BSS
544
+        set        C_LABEL(end) , %o1                ! Last address of BSS
545
+        ba        2f
546
+         nop
547
+1:
548
+        st        %g0, [%o0]
549
+2:
550
+        subcc        %o0, %o1, %g0
551
+        bl        1b
552
+         add        %o0, 0x4, %o0
553
+
554
+        mov        2, %g1
555
+        wr        %g1, 0x0, %wim                        ! make window 1 invalid
556
+        WRITE_PAUSE
557
+
558
+#if 0
559
+        wr  %g0, 0x0, %wim
560
+        WRITE_PAUSE
561
+        save
562
+        rd  %psr, %g3
563
+        restore
564
+        and  %g3, PSR_CWP, %g3
565
+        add  %g3, 0x1, %g3
566
+#else
567
+        or        %g0, 8, %g3
568
+#endif
569
+
570
+#if 0
571
+        sethi        %hi( C_LABEL(cputyp) ), %o0
572
+        st        %g7, [%o0 + %lo( C_LABEL(cputyp) )]
573
+
574
+        sethi        %hi( C_LABEL(nwindows) ), %g4
575
+        st        %g3, [%g4 + %lo( C_LABEL(nwindows) )]
576
+
577
+        sub        %g3, 0x1, %g3
578
+        sethi        %hi( C_LABEL(nwindowsm1) ), %g4
579
+        st        %g3, [%g4 + %lo( C_LABEL(nwindowsm1) )]
580
+#endif
581
+
582
+        /* Here we go, start using Linux's trap table... */
583
+        set        C_LABEL(trapbase), %g3
584
+        wr        %g3, 0x0, %tbr
585
+        WRITE_PAUSE
586
+
587
+        /* Finally, turn on traps so that we can call c-code. */
588
+        rd        %psr, %g3
589
+        wr        %g3, 0x0, %psr
590
+        WRITE_PAUSE
591
+
592
+        wr        %g3, PSR_ET, %psr
593
+        WRITE_PAUSE
594
+
595
+        .globl prolmain
596
+        call C_LABEL(prolmain)
597
+         nop
598
+
599
+3:
600
+        b       3b
601
+         nop
602
+
603
+/*
604
+ * Memory access trap handler
605
+ *   %l0  program %psr from trap table entry
606
+ *   %l1  program %pc from hardware
607
+ *   %l2  program %npc from hardware
608
+ *   %l3  program %wim from trap table entry
609
+ *   %l4
610
+ *   %l5
611
+ *   %l6
612
+ *   %l7  text flag from trap table entry
613
+ */
614
+
615
+        .section ".text"
616
+        .globl srmmu_fault
617
+C_LABEL(srmmu_fault):
618
+
619
+        set AC_M_SFAR, %l6
620
+        set AC_M_SFSR, %l5
621
+        lda [%l6] ASI_M_MMUREGS, %l6
622
+        lda [%l5] ASI_M_MMUREGS, %l5
623
+
624
+        set ignore_fault, %l5
625
+        ld [%l5], %l5
626
+        subcc %l5, %g0, %g0                /* NULL pointer trap faults always */
627
+        be 3f
628
+         nop
629
+        subcc %l5, %l6, %g0
630
+        be 2f
631
+         nop
632
+3:
633
+
634
+   set (PHYS_JJ_TCX_FB + 0xbf0), %g5        /* 2 cells from side */
635
+   set 0x00ffffff, %g4
636
+   sta %g4, [%g5] ASI_M_BYPASS
637
+   add %g5, 8, %g5                        /* On right side */
638
+   sta %g4, [%g5] ASI_M_BYPASS
639
+1:        ba 1b; nop
640
+
641
+2:
642
+        set C_LABEL(fault_ignored), %l5
643
+        mov 1, %l6
644
+        st %l6, [%l5]
645
+
646
+        /*
647
+         * Skip the faulting instruction.
648
+         * I think it works when next instruction is a branch even.
649
+         */
650
+        or %l2, 0, %l1
651
+        add %l2, 4, %l2
652
+
653
+        wr %l0, 0, %psr
654
+        WRITE_PAUSE
655
+        jmp %l1
656
+        rett %l2
657
+
658
+/*
659
+ * Slow external versions of st_bypass and ld_bypass.
660
+ * rconsole.c uses inlines. We call these in places which are not speed
661
+ * critical, to avoid compiler bugs.
662
+ */
663
+        .globl C_LABEL(st_bypass)
664
+C_LABEL(st_bypass):
665
+        retl
666
+         sta %o1, [%o0] ASI_M_BYPASS
667
+        .globl C_LABEL(ld_bypass)
668
+C_LABEL(ld_bypass):
669
+        retl
670
+         lda [%o0] ASI_M_BYPASS, %o0
671
+        .globl C_LABEL(sth_bypass)
672
+C_LABEL(sth_bypass):
673
+        retl
674
+         stha %o1, [%o0] ASI_M_BYPASS
675
+        .globl C_LABEL(ldh_bypass)
676
+C_LABEL(ldh_bypass):
677
+        retl
678
+         lduha [%o0] ASI_M_BYPASS, %o0
679
+        .globl C_LABEL(stb_bypass)
680
+C_LABEL(stb_bypass):
681
+        retl
682
+         stba %o1, [%o0] ASI_M_BYPASS
683
+        .globl C_LABEL(ldb_bypass)
684
+C_LABEL(ldb_bypass):
685
+        retl
686
+         lduba [%o0] ASI_M_BYPASS, %o0
687
diff -ruN proll_18.orig/qemu/main.c proll-patch10/qemu/main.c
688
--- proll_18.orig/qemu/main.c        1970-01-01 00:00:00.000000000 +0000
689
+++ proll-patch10/qemu/main.c        2005-04-16 18:03:23.000000000 +0000
690
@@ -0,0 +1,185 @@
691
+/**
692
+ ** Proll (PROM replacement)
693
+ ** Copyright 1999 Pete Zaitcev
694
+ ** This code is licensed under GNU General Public License.
695
+ **/
696
+#include <stdarg.h>
697
+
698
+// #include <asm/contregs.h>
699
+#include <asi.h>
700
+#include "pgtsrmmu.h"
701
+#include "iommu.h"                /* Typical SBus IOMMU for sun4m */
702
+#include "phys_jj.h"
703
+#include "vconsole.h"
704
+#include "version.h"
705
+#include <general.h>                /* __P() */
706
+#include <net.h>                /* init_net() */
707
+#include <romlib.h>                /* we are a provider for part of this. */
708
+#include <netpriv.h>                /* myipaddr */
709
+#include <arpa.h>
710
+#include <system.h>                /* our own prototypes */
711
+
712
+void *init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, const char *cmdline, char boot_device, int nographic);
713
+int vcon_zs_init(struct vconterm *t, unsigned int a0);
714
+int vcon_zs_write(struct vconterm *t, char *data, int leng);
715
+int vcon_zs_getch(struct vconterm *t);
716
+void esp_probe();
717
+int esp_boot(int unit);
718
+static void init_idprom(void);
719
+
720
+struct vconterm dp0;
721
+struct mem cmem;                /* Current memory, virtual */
722
+struct mem cio;                        /* Current I/O space */
723
+struct phym pmem;                /* Current phys. mem. */
724
+struct iommu ciommu;                /* Our IOMMU on sun4m */
725
+
726
+static struct {
727
+    const char id[16];
728
+    unsigned int version;
729
+    char pad1[0x1c]; // Pad to 0x30
730
+    unsigned int ram_size;
731
+    char boot_device;
732
+    unsigned int load_addr, kernel_size;
733
+    unsigned int cmdline, cmdline_len;
734
+    char pad2[0x0c]; // Pad to 0x54
735
+    unsigned short width, height, depth;
736
+} *hw_idprom;
737
+
738
+int ignore_fault, fault_ignored;
739
+void *printk_fn, *getch_fn;
740
+unsigned int q_height, q_width;
741
+
742
+/*
743
+ */
744
+void prolmain()
745
+{
746
+        static char fname[14];
747
+        static struct banks bb;
748
+        unsigned int hiphybas;
749
+        const void *romvec;
750
+        unsigned int ram_size;
751
+        char nographic, bootdev;
752
+
753
+        nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F);
754
+        if (!nographic) {
755
+            q_width = ldh_bypass(PHYS_JJ_EEPROM + 0x54);
756
+            q_height = ldh_bypass(PHYS_JJ_EEPROM + 0x56);
757
+            vcon_init(&dp0, PHYS_JJ_TCX_FB);
758
+            printk_fn = vcon_write;
759
+            getch_fn = vcon_getch;
760
+        }
761
+        else {
762
+            vcon_zs_init(&dp0, 0x71100004);
763
+            printk_fn = vcon_zs_write;
764
+            getch_fn = vcon_zs_getch;
765
+        }
766
+
767
+
768
+        printk("PROLL %s QEMU\n", PROLL_VERSION_STRING);
769
+        ram_size = ld_bypass(PHYS_JJ_EEPROM + 0x30);
770
+        printk("%d MB total\n", ram_size/(1024*1024));
771
+
772
+        bb.nbanks = 1;
773
+        bb.bankv[0].start = 0;
774
+        bb.bankv[0].length = ram_size;
775
+
776
+        hiphybas = ram_size - PROLSIZE;
777
+
778
+        mem_init(&cmem, (char *) &_end, (char *)(PROLBASE+PROLSIZE));
779
+        makepages(&pmem, hiphybas);
780
+        init_mmu_swift((unsigned int)pmem.pctp - PROLBASE + hiphybas);
781
+
782
+        mem_init(&cio, (char *)(PROLBASE+PROLSIZE),
783
+            (char *)(PROLBASE+PROLSIZE+IOMAPSIZE));
784
+
785
+        iommu_init(&ciommu, hiphybas);
786
+
787
+        /*
788
+         */
789
+        init_idprom();
790
+        printk("NVRAM: id %s version %d\n", hw_idprom->id, hw_idprom->version);
791
+        if (!nographic)
792
+            printk("Prom console: TCX %dx%d\n", q_width, q_height);
793
+        else
794
+            printk("Prom console: serial\n");
795
+        sched_init();
796
+        le_probe();
797
+        init_net();
798
+        esp_probe();
799
+
800
+        bootdev = hw_idprom->boot_device;
801
+        printk("Boot device: %c\n", bootdev);
802
+        if (hw_idprom->kernel_size > 0) {
803
+            printk("Kernel already loaded\n");
804
+        } else if (bootdev == 'n') {
805
+            if (bootp() != 0) fatal();
806
+            /*
807
+             * boot_rec.bp_file cannot be used because system PROM
808
+             * uses it to locate ourselves. If we load from boot_rec.bp_file,
809
+             * we will loop reloading PROLL over and over again.
810
+             * Thus we use traditional PROLL scheme HEXIPADDR.PROL (single L).
811
+             */
812
+            xtoa(myipaddr, fname, 8);
813
+            fname[9] = '.';
814
+            fname[10] = 'P';
815
+            fname[11] = 'R';
816
+            fname[12] = 'O';
817
+            fname[13] = 'L';
818
+            fname[14] = 0;
819
+            
820
+            if (load(boot_rec.bp_siaddr, fname) != 0) fatal();
821
+        } else if (bootdev == 'c') {
822
+            if (esp_boot(0) != 0) fatal();
823
+        } else if (bootdev == 'd') {
824
+            if (esp_boot(2) != 0) fatal();
825
+        }
826
+
827
+        romvec = init_openprom_qemu(bb.nbanks, bb.bankv, hiphybas,
828
+                                    (void *)hw_idprom->cmdline, hw_idprom->boot_device, nographic);
829
+
830
+        printk("Memory used: virt 0x%x:0x%x[%dK] iomap 0x%x:0x%x\n",
831
+            PROLBASE, (int)cmem.curp, ((unsigned) cmem.curp - PROLBASE)/1024,
832
+            (int)cio.start, (int)cio.curp);
833
+
834
+        {
835
+            void (*entry)(const void *, int, int, int, int) = (void *) hw_idprom->load_addr;
836
+                printk("Kernel loaded at 0x%x, size %dK, command line = '%s'\n",
837
+                       *entry, hw_idprom->kernel_size/1024, hw_idprom->cmdline);
838
+                entry(romvec, 0, 0, 0, 0);
839
+        }
840
+
841
+        mem_fini(&cmem);
842
+        vcon_fini(&dp0);
843
+}
844
+
845
+/*
846
+ * dvma_alloc over iommu_alloc.
847
+ */
848
+void *dvma_alloc(int size, unsigned int *pphys)
849
+{
850
+        return iommu_alloc(&ciommu, size, pphys);
851
+}
852
+
853
+/*
854
+ */
855
+void udelay(unsigned long usecs)
856
+{
857
+    // Qemu hardware is perfect and does not need any delays!
858
+}
859
+
860
+static void init_idprom()
861
+{
862
+        void *va_prom;
863
+
864
+        if ((va_prom = map_io(PHYS_JJ_EEPROM, PHYS_JJ_EEPROM_SIZE)) == NULL) {
865
+                printk("init_idprom: cannot map eeprom\n");
866
+                fatal();
867
+        }
868
+        bcopy(va_prom + PHYS_JJ_IDPROM_OFF, idprom, IDPROM_SIZE);
869
+        /*
870
+         * hw_idprom is not used anywhere.
871
+         * It's just as we hate to leave hanging pointers (I/O page here).
872
+         */
873
+        hw_idprom = va_prom; 
874
+}
875
+
876
diff -ruN proll_18.orig/qemu/openprom.c proll-patch10/qemu/openprom.c
877
--- proll_18.orig/qemu/openprom.c        1970-01-01 00:00:00.000000000 +0000
878
+++ proll-patch10/qemu/openprom.c        2005-04-16 17:30:19.000000000 +0000
879
@@ -0,0 +1,741 @@
880
+/*
881
+ * PROM interface support
882
+ * Copyright 1996 The Australian National University.
883
+ * Copyright 1996 Fujitsu Laboratories Limited
884
+ * Copyright 1999 Pete A. Zaitcev
885
+ * This software may be distributed under the terms of the Gnu
886
+ * Public License version 2 or later
887
+ */
888
+
889
+#include <openprom.h>
890
+#include <general.h>
891
+#include <romlib.h>
892
+#include <system.h>
893
+#include <vconsole.h>
894
+#include "phys_jj.h"
895
+
896
+//#define DEBUG_OBP
897
+
898
+#define PAGE_SIZE 4096
899
+
900
+struct property {
901
+        const char *name;
902
+        const char *value;
903
+        const int length;
904
+};
905
+
906
+struct node {
907
+        const struct property *properties;
908
+        /* short */ const int sibling;
909
+        /* short */ const int child;
910
+};
911
+
912
+static int obp_nextnode(int node);
913
+static int obp_child(int node);
914
+static int obp_proplen(int node, char *name);
915
+static int obp_getprop(int node, char *name, char *val);
916
+static int obp_setprop(int node, char *name, char *val, int len);
917
+static const char *obp_nextprop(int node, char *name);
918
+
919
+static char obp_idprom[IDPROM_SIZE];
920
+static const struct property null_properties = { NULL, NULL, -1 };
921
+static const int prop_true = -1;
922
+
923
+static const struct property propv_root[] = {
924
+        {"name",        "SUNW,JavaStation-1", sizeof("SUNW,JavaStation-1") },
925
+        {"idprom",        obp_idprom, IDPROM_SIZE},
926
+        {"banner-name", "JavaStation", sizeof("JavaStation")},
927
+        {"compatible",        "sun4m", 6},
928
+        {NULL, NULL, -1}
929
+};
930
+
931
+static const int prop_iommu_reg[] = {
932
+        0x0, 0x10000000, 0x00000300,
933
+};
934
+static const struct property propv_iommu[] = {
935
+        {"name",        "iommu", sizeof("iommu")},
936
+        {"reg",                (char*)&prop_iommu_reg[0], sizeof(prop_iommu_reg) },
937
+        {NULL, NULL, -1}
938
+};
939
+
940
+static const int prop_sbus_ranges[] = {
941
+        0x0, 0x0, 0x0, 0x30000000, 0x10000000,
942
+        0x1, 0x0, 0x0, 0x40000000, 0x10000000,
943
+        0x2, 0x0, 0x0, 0x50000000, 0x10000000,
944
+        0x3, 0x0, 0x0, 0x60000000, 0x10000000,
945
+        0x4, 0x0, 0x0, 0x70000000, 0x10000000,
946
+};
947
+static const struct property propv_sbus[] = {
948
+        {"name",        "sbus", 5},
949
+        {"ranges",        (char*)&prop_sbus_ranges[0], sizeof(prop_sbus_ranges)},
950
+        {"device_type",        "hierarchical", sizeof("hierarchical") },
951
+        {NULL, NULL, -1}
952
+};
953
+
954
+static const int prop_tcx_regs[] = {
955
+        0x2, 0x00800000, 0x00100000,
956
+        0x2, 0x02000000, 0x00000001,
957
+        0x2, 0x04000000, 0x00800000,
958
+        0x2, 0x06000000, 0x00800000,
959
+        0x2, 0x0a000000, 0x00000001,
960
+        0x2, 0x0c000000, 0x00000001,
961
+        0x2, 0x0e000000, 0x00000001,
962
+        0x2, 0x00700000, 0x00001000,
963
+        0x2, 0x00200000, 0x00000004,
964
+        0x2, 0x00300000, 0x0000081c,
965
+        0x2, 0x00000000, 0x00010000,
966
+        0x2, 0x00240000, 0x00000004,
967
+        0x2, 0x00280000, 0x00000001,
968
+};
969
+
970
+#if 1        /* Zaitcev */
971
+static const int pixfreq = 0x03dfd240;
972
+static const int hbporch = 0xa0;
973
+static const int vfreq = 0x3c;
974
+#endif
975
+#if 0        /* Kevin Boone - 70Hz refresh */
976
+static const int pixfreq = 0x047868C0;
977
+static const int hbporch = 0x90;
978
+static const int vfreq = 0x46;
979
+#endif
980
+
981
+static const int vbporch = 0x1d;
982
+static const int vsync = 0x6;
983
+static const int hsync = 0x88;
984
+static const int vfporch = 0x3;
985
+static const int hfporch = 0x18;
986
+static const int height = 0x300;
987
+static const int width = 0x400;
988
+static const int linebytes = 0x400;
989
+static const int depth = 8;
990
+static const int tcx_intr[] = { 5, 0 };
991
+static const int tcx_interrupts = 5;
992
+static const struct property propv_sbus_tcx[] = {
993
+        {"name",        "SUNW,tcx", sizeof("SUNW,tcx")},
994
+        {"vbporch",        (char*)&vbporch, sizeof(int)},
995
+        {"hbporch",        (char*)&hbporch, sizeof(int)},
996
+        {"vsync",        (char*)&vsync, sizeof(int)},
997
+        {"hsync",        (char*)&hsync, sizeof(int)},
998
+        {"vfporch",        (char*)&vfporch, sizeof(int)},
999
+        {"hfporch",        (char*)&hfporch, sizeof(int)},
1000
+        {"pixfreq",        (char*)&pixfreq, sizeof(int)},
1001
+        {"vfreq",        (char*)&vfreq, sizeof(int)},
1002
+        {"height",        (char*)&height, sizeof(int)},
1003
+        {"width",        (char*)&width, sizeof(int)},
1004
+        {"linebytes",        (char*)&linebytes, sizeof(int)},
1005
+        {"depth",        (char*)&depth, sizeof(int)},
1006
+        {"reg",                (char*)&prop_tcx_regs[0], sizeof(prop_tcx_regs)},
1007
+        {"tcx-8-bit",        (char*)&prop_true, 0},
1008
+        {"intr",        (char*)&tcx_intr[0], sizeof(tcx_intr)},
1009
+        {"interrupts",        (char*)&tcx_interrupts, sizeof(tcx_interrupts)},
1010
+        {"device_type",        "display", sizeof("display")},
1011
+        {NULL, NULL, -1}
1012
+};
1013
+
1014
+static const int prop_cs4231_reg[] = {
1015
+        0x3, 0x0C000000, 0x00000040
1016
+};
1017
+static const int cs4231_interrupts = 5;
1018
+static const int cs4231_intr[] = { 5, 0 };
1019
+
1020
+static const struct property propv_sbus_cs4231[] = {
1021
+        {"name",        "SUNW,CS4231", sizeof("SUNW,CS4231") },
1022
+        {"intr",        (char*)&cs4231_intr[0], sizeof(cs4231_intr) },
1023
+        {"interrupts",  (char*)&cs4231_interrupts, sizeof(cs4231_interrupts) },        
1024
+        {"reg",                (char*)&prop_cs4231_reg[0], sizeof(prop_cs4231_reg) },
1025
+        {"device_type", "serial", sizeof("serial") },
1026
+        {"alias",        "audio", sizeof("audio") },
1027
+        {NULL, NULL, -1}
1028
+};
1029
+
1030
+static const int cpu_nctx = NCTX_SWIFT;
1031
+static const int cpu_cache_line_size = 0x20;
1032
+static const int cpu_cache_nlines = 0x200;
1033
+static const struct property propv_cpu[] = {
1034
+        {"name",        "STP1012PGA", sizeof("STP1012PGA") },
1035
+        {"device_type",        "cpu", 4 },
1036
+        {"mmu-nctx",        (char*)&cpu_nctx, sizeof(int)},
1037
+        {"cache-line-size",        (char*)&cpu_cache_line_size, sizeof(int)},
1038
+        {"cache-nlines",        (char*)&cpu_cache_nlines, sizeof(int)},
1039
+        {NULL, NULL, -1}
1040
+};
1041
+
1042
+static const int prop_obio_ranges[] = {
1043
+        0x0, 0x0, 0x0, 0x71000000, 0x01000000,
1044
+};
1045
+static const struct property propv_obio[] = {
1046
+        {"name",        "obio", 5 },
1047
+        {"ranges",        (char*)&prop_obio_ranges[0], sizeof(prop_obio_ranges) },
1048
+        {"device_type",        "hierarchical", sizeof("hierarchical") },
1049
+        {NULL, NULL, -1}
1050
+};
1051
+
1052
+static const int prop_auxio_reg[] = {
1053
+        0x0, 0x00900000, 0x00000001,
1054
+};
1055
+static const struct property propv_obio_auxio[] = {
1056
+        {"name",        "auxio", sizeof("auxio") },
1057
+        {"reg",                (char*)&prop_auxio_reg[0], sizeof(prop_auxio_reg) },
1058
+        {NULL, NULL, -1}
1059
+};
1060
+
1061
+static const int prop_int_reg[] = {
1062
+        0x0, 0x00e00000, 0x00000010,
1063
+        0x0, 0x00e10000, 0x00000010,
1064
+};
1065
+static const struct property propv_obio_int[] = {
1066
+        {"name",        "interrupt", sizeof("interrupt")},
1067
+        {"reg",                (char*)&prop_int_reg[0], sizeof(prop_int_reg) },
1068
+        {NULL, NULL, -1}
1069
+};
1070
+
1071
+static const int prop_cnt_reg[] = {
1072
+        0x0, 0x00d00000, 0x00000010,
1073
+        0x0, 0x00d10000, 0x00000010,
1074
+};
1075
+static const struct property propv_obio_cnt[] = {
1076
+        {"name",        "counter", sizeof("counter")},
1077
+        {"reg",                (char*)&prop_cnt_reg[0], sizeof(prop_cnt_reg) },
1078
+        {NULL, NULL, -1}
1079
+};
1080
+
1081
+static const int prop_eeprom_reg[] = {
1082
+        0x0, 0x00200000, 0x00002000,
1083
+};
1084
+static const struct property propv_obio_eep[] = {
1085
+        {"name",        "eeprom", sizeof("eeprom")},
1086
+        {"reg",                (char*)&prop_eeprom_reg[0], sizeof(prop_eeprom_reg) },
1087
+        {"model",        "mk48t08", sizeof("mk48t08")},
1088
+        {NULL, NULL, -1}
1089
+};
1090
+
1091
+static const int prop_su_reg[] = {
1092
+        0x0, 0x003002f8, 0x00000008,
1093
+};
1094
+static const struct property propv_obio_su[] = {
1095
+        {"name",        "su", sizeof("su")},
1096
+        {"reg",                (char*)&prop_su_reg[0], sizeof(prop_su_reg) },
1097
+        {NULL, NULL, -1}
1098
+};
1099
+
1100
+static const int prop_zs_intr[] = { 0x2c, 0x0 };
1101
+static const int prop_zs_reg[] = {
1102
+        0x0, 0x00000000, 0x00000008,
1103
+};
1104
+static const int prop_zs_slave[] = { 1 };
1105
+static void *prop_zs_addr;
1106
+static const struct property propv_obio_zs[] = {
1107
+        {"name",        "zs", sizeof("zs")},
1108
+        {"reg",                (char*)&prop_zs_reg[0], sizeof(prop_zs_reg) },
1109
+        {"slave",        (char*)&prop_zs_slave[0], sizeof(prop_zs_slave) },
1110
+        {"device_type", "serial", sizeof("serial") },
1111
+        {"intr",        (char*)&prop_zs_intr[0], sizeof(prop_zs_intr) },
1112
+        {"address",        (char*)&prop_zs_addr, sizeof(prop_zs_addr) },
1113
+        {NULL, NULL, -1}
1114
+};
1115
+
1116
+static const int prop_zs1_intr[] = { 0x2c, 0x0 };
1117
+static const int prop_zs1_reg[] = {
1118
+        0x0, 0x00100000, 0x00000008,
1119
+};
1120
+static void *prop_zs1_addr;
1121
+static const int prop_zs1_slave[] = { 0 };
1122
+static const struct property propv_obio_zs1[] = {
1123
+        {"name",        "zs", sizeof("zs")},
1124
+        {"reg",                (char*)&prop_zs1_reg[0], sizeof(prop_zs1_reg) },
1125
+        {"slave",        (char*)&prop_zs1_slave[0], sizeof(prop_zs1_slave) },
1126
+        {"device_type", "serial", sizeof("serial") },
1127
+        {"intr",        (char*)&prop_zs1_intr[0], sizeof(prop_zs1_intr) },
1128
+        {"address",        (char*)&prop_zs1_addr, sizeof(prop_zs1_addr) },
1129
+        {NULL, NULL, -1}
1130
+};
1131
+
1132
+static const int prop_ledma_reg[] = {
1133
+        0x4, 0x08400010, 0x00000020,
1134
+};
1135
+static const int prop_ledma_burst = 0x3f;
1136
+static const struct property propv_sbus_ledma[] = {
1137
+        {"name",        "ledma", sizeof("ledma")},
1138
+        {"reg",                (char*)&prop_ledma_reg[0], sizeof(prop_ledma_reg) },
1139
+        {"burst-sizes",        (char*)&prop_ledma_burst, sizeof(int) },
1140
+        {NULL, NULL, -1}
1141
+};
1142
+
1143
+static const int prop_le_reg[] = {
1144
+        0x4, 0x08c00000, 0x00000004,
1145
+};
1146
+static const int prop_le_busmaster_regval = 0x7;
1147
+static const int prop_le_intr[] = { 0x26, 0x0 };
1148
+static const struct property propv_sbus_ledma_le[] = {
1149
+        {"name",        "le", sizeof("le")},
1150
+        {"reg",                (char*)&prop_le_reg[0], sizeof(prop_le_reg) },
1151
+        {"busmaster-regval",        (char*)&prop_le_busmaster_regval, sizeof(int)},
1152
+        {"intr",        (char*)&prop_le_intr[0], sizeof(prop_le_intr) },
1153
+        {NULL, NULL, -1}
1154
+};
1155
+
1156
+static const int prop_espdma_reg[] = {
1157
+        0x4, 0x08400000, 0x00000010,
1158
+};
1159
+
1160
+static const struct property propv_sbus_espdma[] = {
1161
+        {"name",        "espdma", sizeof("espdma")}, 
1162
+        {"reg",                (char*)&prop_espdma_reg[0], sizeof(prop_espdma_reg) },
1163
+        {NULL, NULL, -1}
1164
+};
1165
+
1166
+static const int prop_esp_reg[] = {
1167
+        0x4, 0x08800000, 0x00000040,
1168
+};
1169
+static const int prop_esp_intr[] = { 0x24, 0x0 };
1170
+static const struct property propv_sbus_espdma_esp[] = {
1171
+        {"name",        "esp", sizeof("esp")},
1172
+        {"reg",                (char*)&prop_esp_reg[0], sizeof(prop_esp_reg) },
1173
+        {"intr",        (char*)&prop_esp_intr[0], sizeof(prop_esp_intr) },
1174
+        {NULL, NULL, -1}
1175
+};
1176
+
1177
+static const int prop_bpp_reg[] = {
1178
+        0x4, 0x0c800000, 0x0000001c,
1179
+};
1180
+static const int prop_bpp_intr[] = { 0x33, 0x0 };
1181
+static const struct property propv_sbus_bpp[] = {
1182
+        {"name",        "SUNW,bpp", sizeof("SUNW,bpp")},
1183
+        {"reg",                (char*)&prop_bpp_reg[0], sizeof(prop_bpp_reg) },
1184
+        {"intr",        (char*)&prop_bpp_intr[0], sizeof(prop_bpp_intr) },
1185
+        {NULL, NULL, -1}
1186
+};
1187
+
1188
+static const int prop_fd_intr[] = { 0x2b, 0x0 };
1189
+static const int prop_fd_reg[] = {
1190
+        0x0, 0x00400000, 0x0000000f,
1191
+};
1192
+static const struct property propv_obio_fd[] = {
1193
+        {"name",        "SUNW,fdtwo", sizeof("SUNW,fdtwo")},
1194
+        {"reg",                (char*)&prop_fd_reg[0], sizeof(prop_fd_reg) },
1195
+        {"device_type", "block", sizeof("block") },
1196
+        {"intr",        (char*)&prop_fd_intr[0], sizeof(prop_fd_intr) },
1197
+        {NULL, NULL, -1}
1198
+};
1199
+
1200
+static const int prop_pw_intr[] = { 0x22, 0x0 };
1201
+static const int prop_pw_reg[] = {
1202
+        0x0, 0x00910000, 0x00000001,
1203
+};
1204
+static const struct property propv_obio_pw[] = {
1205
+        {"name",        "power", sizeof("power")},
1206
+        {"reg",                (char*)&prop_pw_reg[0], sizeof(prop_pw_reg) },
1207
+        {"intr",        (char*)&prop_pw_intr[0], sizeof(prop_pw_intr) },
1208
+        {NULL, NULL, -1}
1209
+};
1210
+
1211
+static const int prop_cf_reg[] = {
1212
+        0x0, 0x00800000, 0x00000001,
1213
+};
1214
+static const struct property propv_obio_cf[] = {
1215
+        {"name",        "slavioconfig", sizeof("slavioconfig")},
1216
+        {"reg",                (char*)&prop_cf_reg[0], sizeof(prop_cf_reg) },
1217
+        {NULL, NULL, -1}
1218
+};
1219
+
1220
+static const struct property propv_options[] = {
1221
+        {"name",        "options", sizeof("options")},
1222
+        {"screen-#columns",        "80", sizeof("80")},
1223
+        {"screen-#rows",        "25", sizeof("25")},
1224
+        {"tpe-link-test?",        "true", sizeof("true")},
1225
+        {"ttya-mode",                "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
1226
+        {"ttya-ignore-cd",        "true", sizeof("true")},
1227
+        {"ttya-rts-dtr-off",        "false", sizeof("false")},
1228
+        {"ttyb-mode",                "9600,8,n,1,-", sizeof("9600,8,n,1,-")},
1229
+        {"ttyb-ignore-cd",        "true", sizeof("true")},
1230
+        {"ttyb-rts-dtr-off",        "false", sizeof("false")},
1231
+        {NULL, NULL, -1}
1232
+};
1233
+
1234
+static const struct node nodes[] = {
1235
+        { &null_properties,         1,  0 }, /* 0 = big brother of root */
1236
+        { propv_root,                 0,  2 }, /*  1 "/" */
1237
+        { propv_iommu,                11,  3 }, /*  2 "/iommu" */
1238
+        { propv_sbus,                 0,  4 }, /*  3 "/iommu/sbus" */
1239
+        { propv_sbus_tcx,         5,  0 }, /*  4 "/iommu/sbus/SUNW,tcx" */
1240
+        { propv_sbus_ledma,         7,  6 }, /*  5 "/iommu/sbus/ledma" */
1241
+        { propv_sbus_ledma_le,         0,  0 }, /*  6 "/iommu/sbus/ledma/le" */
1242
+        { propv_sbus_cs4231,         8,  0 }, /*  7 "/iommu/sbus/SUNW,CS4231 */
1243
+        { propv_sbus_bpp,         9,  0 }, /*  8 "/iommu/sbus/SUNW,bpp */
1244
+        { propv_sbus_espdma,         0, 10 }, /*  9 "/iommu/sbus/espdma" */
1245
+        { propv_sbus_espdma_esp, 0,  0 }, /* 10 "/iommu/sbus/espdma/esp" */
1246
+        { propv_cpu,                12,  0 }, /* 11 "/STP1012PGA" */
1247
+        { propv_obio,                22, 13 }, /* 12 "/obio" */
1248
+        { propv_obio_int,        14,  0 }, /* 13 "/obio/interrupt" */
1249
+        { propv_obio_cnt,        15,  0 }, /* 14 "/obio/counter" */
1250
+        { propv_obio_eep,        16,  0 }, /* 15 "/obio/eeprom" */
1251
+        { propv_obio_auxio,        17,  0 }, /* 16 "/obio/auxio" */
1252
+        { propv_obio_zs1,        18,  0 }, /* 17 "/obio/zs@0,100000"
1253
+                                             Must be before zs@0,0! */
1254
+        { propv_obio_zs,        19,  0 }, /* 18 "/obio/zs@0,0" */
1255
+        { propv_obio_fd,        20,  0 }, /* 19 "/obio/SUNW,fdtwo" */
1256
+        { propv_obio_pw,        21,  0 }, /* 20 "/obio/power" */
1257
+        { propv_obio_cf,         0,  0 }, /* 21 "/obio/slavioconfig@0,800000" */
1258
+        { propv_options,         0,  0 }, /* 22 "/options" */
1259
+};
1260
+
1261
+static struct linux_mlist_v0 totphys[MAX_BANKS];
1262
+static struct linux_mlist_v0 totmap[1];
1263
+static struct linux_mlist_v0 totavail[MAX_BANKS];
1264
+
1265
+static struct linux_mlist_v0 *ptphys;
1266
+static struct linux_mlist_v0 *ptmap;
1267
+static struct linux_mlist_v0 *ptavail;
1268
+
1269
+static const struct linux_nodeops nodeops0 = {
1270
+        obp_nextnode,        /* int (*no_nextnode)(int node); */
1271
+        obp_child,        /* int (*no_child)(int node); */
1272
+        obp_proplen,        /* int (*no_proplen)(int node, char *name); */
1273
+        obp_getprop,        /* int (*no_getprop)(int node,char *name,char *val); */
1274
+        obp_setprop,        /* int (*no_setprop)(int node, char *name,
1275
+                                 char *val, int len); */
1276
+        obp_nextprop        /* char * (*no_nextprop)(int node, char *name); */
1277
+};
1278
+
1279
+static struct linux_arguments_v0 obp_arg;
1280
+static const struct linux_arguments_v0 * const obp_argp = &obp_arg;
1281
+
1282
+static void (*synch_hook)(void);
1283
+static char obp_stdin, obp_stdout;
1284
+
1285
+static int obp_nbgetchar(void);
1286
+static int obp_nbputchar(int ch);
1287
+static void obp_reboot(char *);
1288
+static void obp_abort(void);
1289
+static void obp_halt(void);
1290
+static int obp_devopen(char *str);
1291
+static int obp_devclose(int dev_desc);
1292
+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf);
1293
+static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size);
1294
+static void obp_dumb_munmap(char *va, unsigned int size);
1295
+
1296
+static void doublewalk(unsigned ptab1, unsigned va)
1297
+{
1298
+unsigned int proc_tablewalk(int ctx, unsigned int va);
1299
+unsigned int mem_tablewalk(unsigned int pa, unsigned int va);
1300
+
1301
+        proc_tablewalk(0, va);
1302
+        if (ptab1 != 0) mem_tablewalk(ptab1, va);
1303
+}
1304
+
1305
+static struct linux_romvec romvec0;
1306
+
1307
+void *
1308
+init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas,
1309
+                   const char *cmdline, char boot_device, int nographic)
1310
+{
1311
+        int i;
1312
+
1313
+        /*
1314
+         * Avoid data segment allocations
1315
+         */
1316
+        ptphys = totphys;
1317
+        ptmap = totmap;
1318
+        ptavail = totavail;
1319
+        /*
1320
+         * Form memory descriptors.
1321
+         */
1322
+        for (i = 0; i < bankc; i++) {
1323
+                totphys[i].theres_more = &totphys[i+1];
1324
+                totphys[i].start_adr = (char*) bankv[i].start;
1325
+                totphys[i].num_bytes = bankv[i].length;
1326
+        }
1327
+        totphys[i-1].theres_more = 0;
1328
+
1329
+        /*
1330
+         * XXX Merged in normal PROM when full banks touch.
1331
+         */
1332
+        for (i = 0; i < bankc; i++) {
1333
+                unsigned bankbase = bankv[i].start;
1334
+                unsigned banksize = bankv[i].length;
1335
+                if (hiphybas > bankbase &&
1336
+                    hiphybas < bankbase + banksize) {
1337
+                        banksize = hiphybas - bankbase;
1338
+                }
1339
+                totavail[i].theres_more = &totavail[i+1];
1340
+                totavail[i].start_adr = (char*) bankbase;
1341
+                totavail[i].num_bytes = banksize;
1342
+        }
1343
+        totavail[i-1].theres_more = 0;
1344
+
1345
+        totmap[0].theres_more = 0;
1346
+        totmap[0].start_adr = (char*) PROLBASE;
1347
+        totmap[0].num_bytes = PROLSIZE;
1348
+
1349
+        /*
1350
+         * idprom
1351
+         */
1352
+        bcopy(idprom, obp_idprom, IDPROM_SIZE);
1353
+
1354
+        // Linux wants a R/W romvec table
1355
+        romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC;
1356
+        romvec0.pv_plugin_revision = 77;
1357
+        romvec0.pv_printrev = 0x10203;
1358
+        romvec0.pv_v0mem.v0_totphys = &ptphys;
1359
+        romvec0.pv_v0mem.v0_prommap = &ptmap;
1360
+        romvec0.pv_v0mem.v0_available = &ptavail;
1361
+        romvec0.pv_nodeops = &nodeops0;
1362
+        romvec0.pv_bootstr = (void *)doublewalk;
1363
+        romvec0.pv_v0devops.v0_devopen = &obp_devopen;
1364
+        romvec0.pv_v0devops.v0_devclose = &obp_devclose;
1365
+        romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev;
1366
+        romvec0.pv_stdin = &obp_stdin;
1367
+        romvec0.pv_stdout = &obp_stdout;
1368
+        romvec0.pv_getchar = obp_nbgetchar;
1369
+        romvec0.pv_putchar = (void (*)(int))obp_nbputchar;
1370
+        romvec0.pv_nbgetchar = obp_nbgetchar;
1371
+        romvec0.pv_nbputchar = obp_nbputchar;
1372
+        romvec0.pv_reboot = obp_reboot;
1373
+        romvec0.pv_printf = (void (*)(const char *fmt, ...))printk;
1374
+        romvec0.pv_abort = obp_abort;
1375
+        romvec0.pv_halt = obp_halt;
1376
+        romvec0.pv_synchook = &synch_hook;
1377
+        romvec0.pv_v0bootargs = &obp_argp;
1378
+        romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap;
1379
+        romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap;
1380
+        obp_arg.boot_dev_ctrl = 0;
1381
+        obp_arg.boot_dev_unit = '0';
1382
+        switch(boot_device) {
1383
+        default:
1384
+        case 'a':
1385
+            obp_arg.argv[0] = "fd()";
1386
+            obp_arg.boot_dev[0] = 'f';
1387
+            obp_arg.boot_dev[1] = 'd';
1388
+            break;
1389
+        case 'd':
1390
+            obp_arg.boot_dev_unit = '2';
1391
+            // Fall through
1392
+        case 'c':
1393
+            obp_arg.argv[0] = "sd()";
1394
+            obp_arg.boot_dev[0] = 's';
1395
+            obp_arg.boot_dev[1] = 'd';
1396
+            break;
1397
+        case 'n':
1398
+            obp_arg.argv[0] = "le()";
1399
+            obp_arg.boot_dev[0] = 'l';
1400
+            obp_arg.boot_dev[1] = 'e';
1401
+            break;
1402
+        }
1403
+        obp_arg.argv[1] = cmdline;
1404
+
1405
+        if (nographic) {
1406
+            obp_stdin = PROMDEV_TTYA;
1407
+            obp_stdout = PROMDEV_TTYA;
1408
+        } else {
1409
+            obp_stdin = PROMDEV_KBD;
1410
+            obp_stdout = PROMDEV_SCREEN;
1411
+        }
1412
+        prop_zs_addr = map_io(0x71000000, 8);
1413
+        prop_zs1_addr = map_io(0x71100000, 8);
1414
+        return &romvec0;
1415
+}
1416
+
1417
+static const struct property *find_property(int node,char *name)
1418
+{
1419
+        const struct property *prop = &nodes[node].properties[0];
1420
+        while (prop && prop->name) {
1421
+                if (bcmp(prop->name, name, 128) == 0) return prop;
1422
+                prop++;
1423
+        }
1424
+        return NULL;
1425
+}
1426
+
1427
+static int obp_nextnode(int node)
1428
+{
1429
+#ifdef DEBUG_OBP
1430
+        printk("obp_nextnode(%d) = %d\n", node, nodes[node].sibling);
1431
+#endif
1432
+        return nodes[node].sibling;
1433
+}
1434
+
1435
+static int obp_child(int node)
1436
+{
1437
+#ifdef DEBUG_OBP
1438
+        printk("obp_child(%d) = %d\n", node, nodes[node].child);
1439
+#endif
1440
+        return nodes[node].child;
1441
+}
1442
+
1443
+static int obp_proplen(int node, char *name)
1444
+{
1445
+        const struct property *prop = find_property(node,name);
1446
+        if (prop) {
1447
+#ifdef DEBUG_OBP
1448
+            printk("obp_proplen(%d, %s) = %d\n", node, name, prop->length);
1449
+#endif
1450
+            return prop->length;
1451
+        }
1452
+#ifdef DEBUG_OBP
1453
+        printk("obp_proplen(%d, %s) (no prop)\n", node, name);
1454
+#endif
1455
+        return -1;
1456
+}
1457
+
1458
+static int obp_getprop(int node, char *name, char *value)
1459
+{
1460
+        const struct property *prop;
1461
+
1462
+        if (!name) {
1463
+            // NULL name means get first property
1464
+#ifdef DEBUG_OBP
1465
+            printk("obp_getprop(%d, %x (NULL)) = %s\n", node, name,
1466
+                   nodes[node].properties[0].name);
1467
+#endif
1468
+            return (int)nodes[node].properties[0].name;
1469
+        }
1470
+        prop = find_property(node,name);
1471
+        if (prop) {
1472
+                memcpy(value,prop->value,prop->length);
1473
+#ifdef DEBUG_OBP
1474
+                printk("obp_getprop(%d, %s) = %s\n", node, name, value);
1475
+#endif
1476
+                return prop->length;
1477
+        }
1478
+#ifdef DEBUG_OBP
1479
+        printk("obp_getprop(%d, %s): not found\n", node, name);
1480
+#endif
1481
+        return -1;
1482
+}
1483
+
1484
+static int obp_setprop(int node, char *name, char *value, int len)
1485
+{
1486
+#ifdef DEBUG_OBP
1487
+        printk("obp_setprop(%d, %s) = %s (%d)\n", node, name, value, len);
1488
+#endif
1489
+        return -1;
1490
+}
1491
+
1492
+static const char *obp_nextprop(int node,char *name)
1493
+{
1494
+        const struct property *prop;
1495
+        
1496
+        if (!name || *name == '\0') {
1497
+            // NULL name means get first property
1498
+#ifdef DEBUG_OBP
1499
+            printk("obp_nextprop(%d, NULL) = %s\n", node,
1500
+                   nodes[node].properties[0].name);
1501
+#endif
1502
+            return nodes[node].properties[0].name;
1503
+        }
1504
+        prop = find_property(node,name);
1505
+        if (prop && prop[1].name) {
1506
+#ifdef DEBUG_OBP
1507
+            printk("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name);
1508
+#endif
1509
+            return prop[1].name;
1510
+        }
1511
+#ifdef DEBUG_OBP
1512
+        printk("obp_nextprop(%d, %s): not found\n", node, name);
1513
+#endif
1514
+        return (const char *)-1;
1515
+}
1516
+
1517
+extern int (*getch_fn)(struct vconterm *v);
1518
+
1519
+static int obp_nbgetchar(void) {
1520
+        extern struct vconterm dp0;
1521
+        return getch_fn(&dp0);
1522
+}
1523
+
1524
+static int obp_nbputchar(int ch) {
1525
+        printk("%c", ch);
1526
+        return 0;
1527
+}
1528
+
1529
+static void obp_reboot(char *str) {
1530
+        printk("rebooting (%s): not implemented, freezing\n", str);
1531
+        for (;;) {}
1532
+}
1533
+
1534
+static void obp_abort() {
1535
+        printk("abort, freezing\n");
1536
+        for (;;) {}
1537
+}
1538
+
1539
+static void obp_halt() {
1540
+        printk("halt, freezing\n");
1541
+        for (;;) {}
1542
+}
1543
+#define isnum(c) ((c >= '0') && (c < '9'))
1544
+#define ctoi(c) (c - '0')
1545
+static int obp_devopen(char *str) {
1546
+#ifdef DEBUG_OBP
1547
+        printk("obp_devopen(%s)\n", str);
1548
+#endif
1549
+        if (str[0] == 's' && str[1] == 'd' && str[4] == ',') {
1550
+            unsigned int target;
1551
+
1552
+            if (str[5] < 7)
1553
+                target = str[5];
1554
+            else if (isnum(str[6]) && isnum(str[5])) {
1555
+                target = (ctoi(str[5]) * 10 + ctoi(str[6])) & 7;
1556
+            }
1557
+            else {
1558
+                target = ctoi(str[5]) & 7;
1559
+            }
1560
+            return 's' + target;
1561
+        }
1562
+        return 0;
1563
+}
1564
+
1565
+static int obp_devclose(int dev_desc) {
1566
+#ifdef DEBUG_OBP
1567
+        printk("obp_devclose %d\n", dev_desc);
1568
+#endif
1569
+        return 0;
1570
+}
1571
+
1572
+extern void *esp_read(int unit, int offset, short len);
1573
+
1574
+static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf)
1575
+{
1576
+    unsigned int i;
1577
+    void *src;
1578
+
1579
+#ifdef DEBUG_OBP
1580
+    printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf);
1581
+#endif
1582
+    if (dev_desc >= 's' && dev_desc < 'v') {
1583
+        for(i = 0; i < num_blks; i++) {
1584
+            src = esp_read(dev_desc - 's', offset + i, 1);
1585
+            memcpy(&buf[i << 9], src, 512);
1586
+        }
1587
+        return num_blks;
1588
+    }
1589
+    return -1;
1590
+}
1591
+
1592
+static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size)
1593
+{
1594
+        unsigned int npages;
1595
+        unsigned int off;
1596
+        unsigned int mva;
1597
+
1598
+#ifdef DEBUG_OBP
1599
+        printk("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size);
1600
+#endif
1601
+        off = pa & (PAGE_SIZE-1);
1602
+        npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
1603
+        pa &= ~(PAGE_SIZE-1);
1604
+
1605
+        mva = (unsigned int) va;
1606
+        while (npages-- != 0) {
1607
+                map_page(pmem.pl1, mva, pa, 1, pmem.pbas);
1608
+                mva += PAGE_SIZE;
1609
+                pa += PAGE_SIZE;
1610
+        }
1611
+        return va;
1612
+}
1613
+
1614
+static void obp_dumb_munmap(char *va, unsigned int size)
1615
+{
1616
+#ifdef DEBUG_OBP
1617
+        printk("obp_dumb_munmap: virta %x, sz %d\n", va, size);
1618
+#endif
1619
+    
1620
+}
1621
diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch10/qemu/system_qemu.c
1622
--- proll_18.orig/qemu/system_qemu.c        1970-01-01 00:00:00.000000000 +0000
1623
+++ proll-patch10/qemu/system_qemu.c        2005-04-16 06:16:20.000000000 +0000
1624
@@ -0,0 +1,430 @@
1625
+/**
1626
+ ** Proll (PROM replacement)
1627
+ ** system.c: shared miscallenea.
1628
+ ** Copyright 1999 Pete Zaitcev
1629
+ ** This code is licensed under GNU General Public License.
1630
+ **/
1631
+#include <stdarg.h>
1632
+#include <asi.h>
1633
+#include <crs.h>
1634
+#ifndef NULL
1635
+#define        NULL ((void*)0)
1636
+#endif
1637
+
1638
+#include "pgtsrmmu.h"
1639
+
1640
+#include "vconsole.h"
1641
+#include <timer.h>                /* Local copy of 2.2 style include */
1642
+#include <general.h>                /* __P() */
1643
+#include <net.h>                /* init_net() */
1644
+#include <romlib.h>                /* we are a provider for part of this. */
1645
+#include <netpriv.h>                /* myipaddr */
1646
+#include <arpa.h>
1647
+#include <system.h>                /* our own prototypes */
1648
+
1649
+/*
1650
+ * We export this.
1651
+ */
1652
+char idprom[IDPROM_SIZE];
1653
+
1654
+
1655
+/*
1656
+ * Create an I/O mapping to pa[size].
1657
+ * Returns va of the mapping or 0 if unsuccessful.
1658
+ */
1659
+void *
1660
+map_io(unsigned pa, int size)
1661
+{
1662
+        void *va;
1663
+        unsigned int npages;
1664
+        unsigned int off;
1665
+        unsigned int mva;
1666
+
1667
+        off = pa & (PAGE_SIZE-1);
1668
+        npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE;
1669
+        pa &= ~(PAGE_SIZE-1);
1670
+
1671
+        va = mem_alloc(&cio, npages*PAGE_SIZE, PAGE_SIZE);
1672
+        if (va == 0) return va;
1673
+
1674
+        mva = (unsigned int) va;
1675
+    /* printk("map_io: va 0x%x pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); */ /* P3 */
1676
+        while (npages-- != 0) {
1677
+                map_page(pmem.pl1, mva, pa, 1, pmem.pbas);
1678
+                mva += PAGE_SIZE;
1679
+                pa += PAGE_SIZE;
1680
+        }
1681
+
1682
+        return (void *)((unsigned int)va + off);
1683
+}
1684
+
1685
+/*
1686
+ * Tablewalk routine used for testing.
1687
+ * Returns PTP/PTE.
1688
+ */
1689
+unsigned int
1690
+proc_tablewalk(int ctx, unsigned int va)
1691
+{
1692
+        unsigned int pa1;
1693
+
1694
+        __asm__ __volatile__ ("lda [%1] %2, %0" :
1695
+                                "=r" (pa1) :
1696
+                                "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS));
1697
+        /* printk(" ctpr %x ctx %x\n", pa1, ctx); */ /* P3 */
1698
+        pa1 <<= 4;
1699
+        pa1 = ld_bypass(pa1 + (ctx << 2));
1700
+        if ((pa1 & 0x03) == 0) goto invalid;
1701
+        return mem_tablewalk((pa1 & 0xFFFFFFF0) << 4, va);
1702
+
1703
+invalid:
1704
+        printk(" invalid %x\n", pa1);
1705
+        return 0;
1706
+}
1707
+
1708
+/*
1709
+ * Walk the tables in memory, starting at physical address pa.
1710
+ */
1711
+unsigned int
1712
+mem_tablewalk(unsigned int pa, unsigned int va)
1713
+{
1714
+        unsigned int pa1;
1715
+
1716
+        printk("pa %x va %x", pa, va);
1717
+        pa1 = ld_bypass(pa + (((va&0xFF000000)>>24) << 2));
1718
+        if ((pa1 & 0x03) == 0) goto invalid;
1719
+        printk(" l1 %x", pa1);
1720
+        pa1 <<= 4;    pa1 &= 0xFFFFFF00;
1721
+        pa1 = ld_bypass(pa1 + (((va&0x00FC0000)>>18) << 2));
1722
+        if ((pa1 & 0x03) == 0) goto invalid;
1723
+        printk(" l2 %x", pa1);
1724
+        pa1 <<= 4;    pa1 &= 0xFFFFFF00;
1725
+        pa1 = ld_bypass(pa1 + (((va&0x0003F000)>>12) << 2));
1726
+        if ((pa1 & 0x03) == 0) goto invalid;
1727
+        printk(" l3 %x", pa1);
1728
+        printk(" off %x\n", va&0x00000FFF);
1729
+        return pa1;
1730
+invalid:
1731
+        printk(" invalid %x\n", pa1);
1732
+        return 0;
1733
+}
1734
+
1735
+/*
1736
+ * Make CPU page tables.
1737
+ * Returns pointer to context table.
1738
+ * Here we ignore memory allocation errors which "should not happen"
1739
+ * because we cannot print anything anyways if memory initialization fails.
1740
+ */
1741
+void makepages(struct phym *t, unsigned int highbase)
1742
+{
1743
+        unsigned int *ctp, *l1, pte;
1744
+        int i;
1745
+        unsigned int pa, va;
1746
+
1747
+        ctp = mem_zalloc(&cmem, NCTX_SWIFT*sizeof(int), NCTX_SWIFT*sizeof(int));
1748
+        l1 = mem_zalloc(&cmem, 256*sizeof(int), 256*sizeof(int));
1749
+
1750
+        pte = SRMMU_ET_PTD | (((unsigned int)l1 - PROLBASE + highbase) >> 4);
1751
+        for (i = 0; i < NCTX_SWIFT; i++) {
1752
+                ctp[i] = pte;
1753
+        }
1754
+
1755
+        pa = PROLBASE;
1756
+        for (va = PROLBASE; va < PROLDATA; va += PAGE_SIZE) {
1757
+                map_page(l1, va, pa, 0, highbase);
1758
+                pa += PAGE_SIZE;
1759
+        }
1760
+        pa = highbase + PROLDATA - PROLBASE;
1761
+        for (va = PROLDATA; va < PROLBASE + PROLSIZE; va += PAGE_SIZE) {
1762
+                map_page(l1, va, pa, 0, highbase);
1763
+                pa += PAGE_SIZE;
1764
+        }
1765
+
1766
+        /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */
1767
+        pa = 0;
1768
+        for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) {
1769
+                map_page(l1, va, pa, 0, highbase);
1770
+                pa += PAGE_SIZE;
1771
+        }
1772
+
1773
+        t->pctp = ctp;
1774
+        t->pl1 = l1;
1775
+        t->pbas = highbase;
1776
+}
1777
+
1778
+/*
1779
+ * Create a memory mapping from va to epa in page table pgd.
1780
+ * highbase is used for v2p translation.
1781
+ */
1782
+int
1783
+map_page(unsigned int *pgd, unsigned int va,
1784
+    unsigned int epa, int type, unsigned int highbase)
1785
+{
1786
+        unsigned int pte;
1787
+        unsigned int *p;
1788
+        unsigned int pa;
1789
+
1790
+        pte = pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)];
1791
+        if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
1792
+                p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD*sizeof(int),
1793
+                    SRMMU_PTRS_PER_PMD*sizeof(int));
1794
+                if (p == 0) goto drop;
1795
+                pte = SRMMU_ET_PTD |
1796
+                    (((unsigned int)p - PROLBASE + highbase) >> 4);
1797
+                pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)] = pte;
1798
+                /* barrier() */
1799
+        }
1800
+
1801
+        pa = ((pte & 0xFFFFFFF0) << 4);
1802
+        pa += (((va)>>SRMMU_PMD_SHIFT & (SRMMU_PTRS_PER_PMD-1)) << 2);
1803
+        pte = ld_bypass(pa);
1804
+        if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) {
1805
+                p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PTE*sizeof(int),
1806
+                    SRMMU_PTRS_PER_PTE*sizeof(int));
1807
+                if (p == 0) goto drop;
1808
+                pte = SRMMU_ET_PTD |
1809
+                    (((unsigned int)p - PROLBASE + highbase) >> 4);
1810
+                st_bypass(pa, pte);
1811
+        }
1812
+
1813
+        pa = ((pte & 0xFFFFFFF0) << 4);
1814
+        pa += (((va)>>PAGE_SHIFT & (SRMMU_PTRS_PER_PTE-1)) << 2);
1815
+
1816
+        pte = SRMMU_ET_PTE | ((epa & PAGE_MASK) >> 4);
1817
+        if (type) {                /* I/O */
1818
+                pte |= SRMMU_REF;
1819
+                /* SRMMU cannot make Supervisor-only, but not exectutable */
1820
+                pte |= SRMMU_PRIV;
1821
+        } else {                /* memory */
1822
+                pte |= SRMMU_REF|SRMMU_CACHE;
1823
+                pte |= SRMMU_PRIV;                /* Supervisor only access */
1824
+        }
1825
+        st_bypass(pa, pte);
1826
+        return 0;
1827
+
1828
+drop:
1829
+        return -1;
1830
+}
1831
+
1832
+/*
1833
+ * Switch page tables.
1834
+ */
1835
+void
1836
+init_mmu_swift(unsigned int ctp_phy)
1837
+{
1838
+        unsigned int addr;
1839
+
1840
+        /*
1841
+         * Flush cache
1842
+         */
1843
+        for (addr = 0; addr < 0x2000; addr += 0x10) {
1844
+                __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
1845
+                    "r" (addr), "i" (ASI_M_DATAC_TAG));
1846
+                __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
1847
+                    "r" (addr<<1), "i" (ASI_M_TXTC_TAG));
1848
+        }
1849
+
1850
+        /*
1851
+         * Switch ctx table
1852
+         */
1853
+        ctp_phy >>= 4;
1854
+        /* printk("done flushing, switching to %x\n", ctp_phy); */
1855
+        __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : :
1856
+            "r" (ctp_phy), "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS));
1857
+
1858
+        /*
1859
+         * Flush old page table references
1860
+         */
1861
+        __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : :
1862
+            "r" (0x400), "i" (ASI_M_FLUSH_PROBE) : "memory");
1863
+}
1864
+
1865
+/*
1866
+ * add_timer, del_timer
1867
+ * This should go into sched.c, but we have it split for different archs.
1868
+ */
1869
+struct timer_list_head {
1870
+        struct timer_list *head, *tail;
1871
+};
1872
+
1873
+static struct timer_list_head timers;                /* Anonymous heap of timers */
1874
+
1875
+void add_timer(struct timer_list *timer) {
1876
+        struct timer_list *p;
1877
+        if (timer->prev != NULL || timer->next != NULL) {
1878
+                printk("bug: kernel timer added twice at 0x%x.\n",
1879
+                    __builtin_return_address(0));
1880
+                return;
1881
+        }
1882
+        if ((p = timers.tail) != NULL) {
1883
+                timer->prev = p;
1884
+                p->next = timer;
1885
+                timers.tail = timer;
1886
+        } else {
1887
+                timers.head = timer;
1888
+                timers.tail = timer;
1889
+        }
1890
+        return;
1891
+}
1892
+
1893
+int del_timer(struct timer_list *timer) {
1894
+        struct timer_list *p;
1895
+        int ret;
1896
+
1897
+        if (timers.head == timer) timers.head = timer->next;
1898
+        if (timers.tail == timer) timers.tail = timer->prev;
1899
+        if ((p = timer->prev) != NULL) p->next = timer->next;
1900
+        if ((p = timer->next) != NULL) p->prev = timer->prev;
1901
+        ret = timer->next != 0 || timer->prev != 0;
1902
+        timer->next = NULL;
1903
+        timer->prev = NULL;
1904
+        return ret;
1905
+}
1906
+
1907
+void run_timers() {
1908
+        struct timer_list *p;
1909
+
1910
+        p = timers.head;
1911
+        while (p != NULL) {
1912
+                if (p->expires < jiffies) {
1913
+                        del_timer(p);                /* XXX make nonstatic member */
1914
+                        (*p->function)(p->data);
1915
+                        p = timers.head;
1916
+                } else {
1917
+                        p = p->next;
1918
+                }
1919
+        }
1920
+}
1921
+
1922
+/*
1923
+ * Allocate memory. This is reusable.
1924
+ */
1925
+void mem_init(struct mem *t, char *begin, char *limit)
1926
+{
1927
+        t->start = begin;
1928
+        t->uplim = limit;
1929
+        t->curp = begin;
1930
+}
1931
+
1932
+void mem_fini(struct mem *t)
1933
+{
1934
+        t->curp = 0;
1935
+}
1936
+
1937
+void *mem_alloc(struct mem *t, int size, int align)
1938
+{
1939
+        char *p;
1940
+
1941
+        p = (char *)((((unsigned int)t->curp) + (align-1)) & ~(align-1));
1942
+        if (p >= t->uplim || p + size > t->uplim) return 0;
1943
+        t->curp = p + size;
1944
+        return p;
1945
+}
1946
+
1947
+void *mem_zalloc(struct mem *t, int size, int align)
1948
+{
1949
+        char *p;
1950
+
1951
+        if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size);
1952
+        return p;
1953
+}
1954
+
1955
+/*
1956
+ * Library functions
1957
+ */
1958
+void *memset(void *s, int c, size_t len)
1959
+{
1960
+        void *p = s;
1961
+
1962
+        while (len--) {
1963
+                *(char *)s = c;
1964
+                s++;
1965
+        }
1966
+        return p;
1967
+}
1968
+
1969
+void bcopy(const void *f, void *t, int len) {
1970
+        while (len--) {
1971
+                *(char *)t = *(char *)f;
1972
+                f++;
1973
+                t++;
1974
+        }
1975
+}
1976
+
1977
+/* Comparison is 7-bit */
1978
+int bcmp(const void *s1, const void *s2, int len)
1979
+{
1980
+        int i;
1981
+        char ch;
1982
+
1983
+        while (len--) {
1984
+                ch = *(char *)s1;
1985
+                i = ch - *(char *)s2;
1986
+                s1++;
1987
+                s2++;
1988
+                if (i != 0)
1989
+                        return i;
1990
+                if (ch == 0)
1991
+                        return 0;
1992
+        }
1993
+        return 0;
1994
+}
1995
+
1996
+int strlen(const char *s) {
1997
+        const char *p;
1998
+        for (p = s; *p != 0; p++) { }
1999
+        return p - s;
2000
+}
2001
+
2002
+extern void *printk_fn;
2003
+
2004
+void printk(char *fmt, ...)
2005
+{
2006
+        struct prf_fp {
2007
+                void *xfp;
2008
+                void (*write)(void *, char *, int);
2009
+        } prfa;
2010
+        extern void prf(struct prf_fp *, char *fmt, va_list adx);
2011
+        va_list x1;
2012
+
2013
+        va_start(x1, fmt);
2014
+        prfa.xfp = &dp0;
2015
+        prfa.write = printk_fn;
2016
+        prf(&prfa, fmt, x1);
2017
+        va_end(x1);
2018
+}
2019
+
2020
+void fatal()
2021
+{
2022
+        printk("fatal.");
2023
+loop: goto loop;
2024
+}
2025
+
2026
+/*
2027
+ * Get the highest bit number from the mask.
2028
+ */
2029
+int highc(int mask, int size)
2030
+{
2031
+        int m1;
2032
+
2033
+        m1 = 1 << size;
2034
+        while (size != 0) {
2035
+                size--;
2036
+                m1 >>= 1;
2037
+                if (m1 & mask) break;
2038
+        }
2039
+        return size;
2040
+}
2041
+
2042
+/*
2043
+ */
2044
+unsigned int ld_bp_swap(unsigned int ptr) {
2045
+        unsigned int n;
2046
+        n = ld_bypass(ptr);
2047
+        n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24);
2048
+        return n;
2049
+}
2050
+
2051
+void st_bp_swap(unsigned int ptr, unsigned int n) {
2052
+        n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24);
2053
+        st_bypass(ptr, n);
2054
+};
2055
diff -ruN proll_18.orig/src/arp.c proll-patch10/src/arp.c
2056
--- proll_18.orig/src/arp.c        2001-12-24 05:12:31.000000000 +0000
2057
+++ proll-patch10/src/arp.c        2004-11-13 15:50:49.000000000 +0000
2058
@@ -45,7 +45,7 @@
2059
 #endif
2060
 static struct arp_cache arp_list[ARPNUM];        /* ARP address cache        */
2061
 static int next_arp;                                /* next table entry        */
2062
-static t_ipaddr def_gw = IP_ANY;                /* default routing        */
2063
+static t_ipaddr def_gw;                                /* default routing        */
2064
 
2065
 
2066
 
2067
@@ -144,7 +144,7 @@
2068
  * 
2069
  * Resolve IP address and return pointer to hardware address.
2070
  */
2071
-unsigned char *ip_resolve(ip)
2072
+const unsigned char *ip_resolve(ip)
2073
 t_ipaddr ip;
2074
 {
2075
   int i;
2076
@@ -230,14 +230,11 @@
2077
  */
2078
 int init_arp()
2079
 {
2080
-  /* Set name of module for error messages */
2081
-  net_module_name = "arp";
2082
-
2083
 #ifndef NOARP
2084
   /* Register ARP packet type and set send buffer pointer */
2085
   if ((arpbuf = (struct arphdr *)reg_type(htons(ETH_P_ARP), arp_recv)) == NULL)
2086
         return(FALSE);
2087
 #endif
2088
-
2089
+  def_gw = IP_ANY;
2090
   return(TRUE);
2091
 }
2092
diff -ruN proll_18.orig/src/arp.h proll-patch10/src/arp.h
2093
--- proll_18.orig/src/arp.h        1999-03-18 03:39:43.000000000 +0000
2094
+++ proll-patch10/src/arp.h        2004-11-13 15:50:49.000000000 +0000
2095
@@ -104,7 +104,7 @@
2096
 extern int init_arp __P((void));
2097
 
2098
 /* Resolve IP address and return pointer to hardware address */
2099
-extern unsigned char *ip_resolve __P((t_ipaddr ip));
2100
+extern const unsigned char *ip_resolve __P((t_ipaddr ip));
2101
 
2102
 /* Add a new antry to the ARP cache */
2103
 extern void addcache __P((unsigned char *ha, t_ipaddr ip));
2104
diff -ruN proll_18.orig/src/esp.c proll-patch10/src/esp.c
2105
--- proll_18.orig/src/esp.c        1970-01-01 00:00:00.000000000 +0000
2106
+++ proll-patch10/src/esp.c        2005-04-16 06:24:23.000000000 +0000
2107
@@ -0,0 +1,252 @@
2108
+#include <system.h>                /* == <asm/system.h> */
2109
+#include <general.h>                /* __P for netpriv.h */
2110
+#include <dma.h>                /* dmaga */
2111
+#include <romlib.h>
2112
+
2113
+#define PHYS_JJ_ESPDMA  0x78400000      /* ESP DMA controller */
2114
+#define PHYS_JJ_ESP     0x78800000      /* ESP SCSI */
2115
+#define PHYS_JJ_ESP_IRQ    4
2116
+#define BUFSIZE         4096
2117
+/*
2118
+ * XXX Crude
2119
+ */
2120
+struct esp_dma {
2121
+        struct sparc_dma_registers *regs;
2122
+        enum dvma_rev revision;
2123
+};
2124
+
2125
+struct esp_regs {
2126
+    unsigned int regs[16];
2127
+};
2128
+
2129
+struct esp_private {
2130
+        int active;                        /* initialized */
2131
+        int inst;                        /* iface number */
2132
+
2133
+        volatile struct esp_regs *ll;
2134
+        __u32 buffer_dvma;
2135
+        unsigned int irq;                /* device IRQ number    */
2136
+        int interrupt;
2137
+
2138
+        struct esp_dma *espdma;         /* If set this points to espdma    */
2139
+
2140
+        unsigned char *buffer;
2141
+};
2142
+
2143
+static void esp_interrupt(void *dev_id)
2144
+{
2145
+        struct esp_private *lp = (struct esp_private *)dev_id;
2146
+
2147
+        lp->interrupt = 1;
2148
+        /* Acknowledge all the interrupt sources ASAP */
2149
+
2150
+        lp->interrupt = 0;
2151
+}
2152
+
2153
+static int esp_open (void *dev)
2154
+{
2155
+        struct esp_private *lp = (struct esp_private *)dev;
2156
+        int status = 0;
2157
+
2158
+        if (request_irq(lp->irq, &esp_interrupt, (void *)dev)) {
2159
+                printk ("Esp: Can't get irq %d\n", lp->irq);
2160
+                return -1;
2161
+        }
2162
+
2163
+        /* On the 4m, setup the espdma to provide the upper bits for buffers */
2164
+        if (lp->espdma)
2165
+                lp->espdma->regs->dma_test = ((__u32) lp->buffer_dvma) & 0xff000000;
2166
+
2167
+        return status;
2168
+}
2169
+
2170
+static int esp_close (void *dev)
2171
+{
2172
+        struct esp_private *lp = (struct esp_private *)dev;
2173
+
2174
+        free_irq (lp->irq, (void *) dev);
2175
+        return 0;
2176
+}
2177
+
2178
+static int 
2179
+esp_init(struct esp_private *esp, struct esp_dma *espdma, int irq)
2180
+{
2181
+        volatile struct esp_regs *ll;
2182
+
2183
+        /* Get the IO region */
2184
+        ll = map_io(PHYS_JJ_ESP, sizeof (struct esp_regs));
2185
+        if (ll == 0) return -1;
2186
+
2187
+        esp->buffer = dvma_alloc(BUFSIZE, &esp->buffer_dvma);
2188
+        esp->ll = ll;
2189
+        esp->espdma = espdma;
2190
+        esp->irq = irq;
2191
+
2192
+        // Chip reset
2193
+        stb_bypass((int)ll + 3*2, 2);
2194
+        return 0;
2195
+}
2196
+
2197
+static int espdma_init(struct esp_dma *espdma)
2198
+{
2199
+        void *p;
2200
+
2201
+        /* Hardcode everything for MrCoffee. */
2202
+        if ((p = map_io(PHYS_JJ_ESPDMA, 0x10)) == 0) {
2203
+                printk("espdma_init: cannot map registers\n");
2204
+                return -1;
2205
+        }
2206
+        espdma->regs = p;
2207
+
2208
+        printk("dma1: ");
2209
+
2210
+        switch((espdma->regs->cond_reg)&DMA_DEVICE_ID) {
2211
+        case DMA_VERS0:
2212
+                espdma->revision=dvmarev0;
2213
+                printk("Revision 0 ");
2214
+                break;
2215
+        case DMA_ESCV1:
2216
+                espdma->revision=dvmaesc1;
2217
+                printk("ESC Revision 1 ");
2218
+                break;
2219
+        case DMA_VERS1:
2220
+                espdma->revision=dvmarev1;
2221
+                printk("Revision 1 ");
2222
+                break;
2223
+        case DMA_VERS2:
2224
+                espdma->revision=dvmarev2;
2225
+                printk("Revision 2 ");
2226
+                break;
2227
+        case DMA_VERHME:
2228
+                espdma->revision=dvmahme;
2229
+                printk("HME DVMA gate array ");
2230
+                break;
2231
+        case DMA_VERSPLUS:
2232
+                espdma->revision=dvmarevplus;
2233
+                printk("Revision 1 PLUS ");
2234
+                break;
2235
+        default:
2236
+                printk("unknown dma version %x",
2237
+                       (espdma->regs->cond_reg)&DMA_DEVICE_ID);
2238
+                /* espdma->allocated = 1; */
2239
+                break;
2240
+        }
2241
+        printk("\n");
2242
+        return 0;
2243
+}
2244
+
2245
+static struct esp_dma espdma0;
2246
+static struct esp_private esp;
2247
+/*
2248
+ * Find all the esp cards on the system and initialize them
2249
+ */
2250
+void esp_probe ()
2251
+{
2252
+        if (espdma_init(&espdma0) != 0) {
2253
+                return;
2254
+        }
2255
+
2256
+        if (esp_init(&esp, &espdma0, PHYS_JJ_ESP_IRQ) != 0) {
2257
+                printk("esp_probe: esp0 init failed\n");
2258
+                return;
2259
+        }
2260
+        return;
2261
+}
2262
+
2263
+void *esp_read(int unit, int offset, short len)
2264
+{
2265
+        // Set SCSI target
2266
+        stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7);
2267
+        // Set DMA address
2268
+        st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma);
2269
+        // Set DMA length
2270
+        stb_bypass(PHYS_JJ_ESP + 0*4, 10);
2271
+        stb_bypass(PHYS_JJ_ESP + 1*4, 0);
2272
+        // Set DMA direction
2273
+        st_bypass(PHYS_JJ_ESPDMA + 0, 0x000);
2274
+        // Setup command = Read(10)
2275
+        esp.buffer[0] = 0x80;
2276
+        esp.buffer[1] = 0x28;
2277
+        esp.buffer[2] = 0x00;
2278
+        esp.buffer[3] = (offset >> 24) & 0xff;
2279
+        esp.buffer[4] = (offset >> 16) & 0xff;
2280
+        esp.buffer[5] = (offset >> 8) & 0xff;
2281
+        esp.buffer[6] = offset & 0xff;
2282
+        esp.buffer[7] = 0x00;
2283
+        esp.buffer[8] = (len >> 8) & 0xff;
2284
+        esp.buffer[9] = len & 0xff;
2285
+        // Set ATN, issue command
2286
+        stb_bypass(PHYS_JJ_ESP + 3*4, 0x42);
2287
+
2288
+        // Set DMA length = 512 * read length
2289
+        stb_bypass(PHYS_JJ_ESP + 0*4, 0);
2290
+        stb_bypass(PHYS_JJ_ESP + 1*4, (len << 1) & 0xff);
2291
+        // Set DMA direction
2292
+        st_bypass(PHYS_JJ_ESPDMA + 0, 0x100);
2293
+        // Transfer
2294
+        stb_bypass(PHYS_JJ_ESP + 3*4, 0x10);
2295
+        return esp.buffer;
2296
+}
2297
+
2298
+// Sparc boot sequence can be found in SILO docs,
2299
+// first-isofs/README.SILO_ISOFS
2300
+int esp_boot(int unit)
2301
+{
2302
+        struct sun_disklabel {
2303
+                unsigned char info[128];   /* Informative text string */
2304
+                unsigned char spare0[14];
2305
+                struct sun_info {
2306
+                        unsigned char spare1;
2307
+                        unsigned char id;
2308
+                        unsigned char spare2;
2309
+                        unsigned char flags;
2310
+                } infos[8];
2311
+                unsigned char spare[246];  /* Boot information etc. */
2312
+                short rspeed;     /* Disk rotational speed */
2313
+                short pcylcount;  /* Physical cylinder count */
2314
+                short sparecyl;   /* extra sects per cylinder */
2315
+                unsigned char spare2[4];   /* More magic... */
2316
+                short ilfact;     /* Interleave factor */
2317
+                short ncyl;       /* Data cylinder count */
2318
+                short nacyl;      /* Alt. cylinder count */
2319
+                short ntrks;      /* Tracks per cylinder */
2320
+                short nsect;      /* Sectors per track */
2321
+                unsigned char spare3[4];   /* Even more magic... */
2322
+                struct sun_partition {
2323
+                        int start_cylinder;
2324
+                        int num_sectors;
2325
+                } partitions[8];
2326
+                short magic;      /* Magic number */
2327
+                short csum;       /* Label xor'd checksum */
2328
+        } *label;
2329
+        unsigned int i, offset;
2330
+        void *src, *dst;
2331
+
2332
+        printk("Loading partition table from target %d:\n", unit);
2333
+        // Chip reset
2334
+        stb_bypass(PHYS_JJ_ESP + 3*4, 2);
2335
+
2336
+        esp_open(&esp);
2337
+
2338
+        label = esp_read(unit, 0, 1);
2339
+        printk("CHS: %d/%d/%d, partitions:\n", label->ncyl, label->ntrks, label->nsect);
2340
+        for (i = 0; i < 8; i++) {
2341
+            printk("%c: %d + %d\n", 'a' + i, label->partitions[i].start_cylinder,
2342
+                   label->partitions[i].num_sectors);
2343
+        }
2344
+        offset = label->partitions[4].start_cylinder * label->ntrks * label->nsect + 1;
2345
+        printk("booting sd(0,%d,0):d (offset %d)\n", unit, offset);
2346
+        // Skip a.out header (0x20)
2347
+        dst = (void *)0x4000;
2348
+        src = esp_read(unit, offset, 1);
2349
+        src = (void *)((unsigned int) src + 0x20);
2350
+        memcpy(dst, src, 512 - 0x20);
2351
+        dst = (void *)0x4000 + 512 - 0x20;
2352
+        for (i = 1; i < 7680/512; i++) {
2353
+            src = esp_read(unit, offset + i, 1);
2354
+            memcpy(dst, src, 512);
2355
+            dst += 512;
2356
+        }
2357
+        esp_close(&esp);
2358
+        return 0;
2359
+}
2360
diff -ruN proll_18.orig/src/hconsole.c proll-patch10/src/hconsole.c
2361
--- proll_18.orig/src/hconsole.c        2002-07-23 05:52:48.000000000 +0000
2362
+++ proll-patch10/src/hconsole.c        2005-03-02 17:03:09.000000000 +0000
2363
@@ -29,6 +29,10 @@
2364
        struct raster r_master;        /* For a case of resize, whole fb */
2365
        struct raster r_0;        /* malloc() erzatz */
2366
 
2367
+#ifdef QEMU
2368
+extern unsigned int q_height, q_width;
2369
+#endif
2370
+
2371
 int hcon_init(struct hconsole *t, unsigned int a0)
2372
 {
2373
         struct raster *q, *r;
2374
@@ -42,7 +46,11 @@
2375
           * No probing sequence or argument passing, hardcode everything. XXX
2376
          */
2377
         raster8_cons_a(q, 768, 1024, (char *)a0);
2378
+#ifndef QEMU
2379
         raster_cons_2(r, q, 768-(24*11)-1, 1024-(8*80)-1, (24*11), (8*80));
2380
+#else
2381
+        raster_cons_2(r, q, 0, 0, q_height, q_width);
2382
+#endif
2383
         t->r_ = r;
2384
         t->r0_ = q;
2385
         t->f_ = &f_master;
2386
diff -ruN proll_18.orig/src/hme.c proll-patch10/src/hme.c
2387
--- proll_18.orig/src/hme.c        2002-07-23 05:52:52.000000000 +0000
2388
+++ proll-patch10/src/hme.c        2005-04-16 06:16:20.000000000 +0000
2389
@@ -655,10 +655,10 @@
2390
                                     unsigned int flags,
2391
                                     unsigned int addr)
2392
 {
2393
-        __asm__ __volatile__("
2394
-        stwa        %3, [%0] %2
2395
-        stwa        %4, [%1] %2
2396
-"        : /* no outputs */
2397
+        __asm__ __volatile__(
2398
+        "stwa        %3, [%0] %2\n\t"
2399
+        "stwa        %4, [%1] %2\n\t"
2400
+        : /* no outputs */
2401
         : "r" (&rp->rx_addr), "r" (&rp->rx_flags),
2402
           "i" (ASI_PL), "r" (addr), "r" (flags));
2403
 }
2404
@@ -667,10 +667,10 @@
2405
                                     unsigned int flags,
2406
                                     unsigned int addr)
2407
 {
2408
-        __asm__ __volatile__("
2409
-        stwa        %3, [%0] %2
2410
-        stwa        %4, [%1] %2
2411
-"        : /* no outputs */
2412
+        __asm__ __volatile__(
2413
+        "stwa        %3, [%0] %2\n\t"
2414
+        "stwa        %4, [%1] %2\n\t"
2415
+        : /* no outputs */
2416
         : "r" (&tp->tx_addr), "r" (&tp->tx_flags),
2417
           "i" (ASI_PL), "r" (addr), "r" (flags));
2418
 }
2419
@@ -2404,7 +2404,7 @@
2420
                 TXD(("[%d]", elem));
2421
                 this = &txbase[elem];
2422
 #ifdef  __sparc_v9__
2423
-                __asm__ __volatile__("lduwa [%1] %2, %0"
2424
+                __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
2425
                                      : "=r" (flags)
2426
                                      : "r" (&this->tx_flags), "i" (ASI_PL));
2427
 #else
2428
@@ -2447,7 +2447,7 @@
2429
         RXD(("RX<"));
2430
         this = &rxbase[elem];
2431
 #ifdef  __sparc_v9__
2432
-        __asm__ __volatile__("lduwa [%1] %2, %0"
2433
+        __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
2434
                              : "=r" (flags)
2435
                              : "r" (&this->rx_flags), "i" (ASI_PL));
2436
 #else
2437
@@ -2530,7 +2530,7 @@
2438
                 elem = NEXT_RX(elem);
2439
                 this = &rxbase[elem];
2440
 #ifdef __sparc_v9__ 
2441
-                __asm__ __volatile__("lduwa [%1] %2, %0"
2442
+                __asm__ __volatile__("lduwa [%1] %2, %0\n\t"
2443
                                      : "=r" (flags)
2444
                                      : "r" (&this->rx_flags), "i" (ASI_PL));
2445
 #else
2446
diff -ruN proll_18.orig/src/lat7_2.bm proll-patch10/src/lat7_2.bm
2447
--- proll_18.orig/src/lat7_2.bm        1999-02-27 05:48:54.000000000 +0000
2448
+++ proll-patch10/src/lat7_2.bm        2004-11-13 15:50:49.000000000 +0000
2449
@@ -1,6 +1,6 @@
2450
 #define lat7_2_width 128
2451
 #define lat7_2_height 88
2452
-static unsigned char lat7_2_bits[] = {
2453
+static unsigned const char lat7_2_bits[] = {
2454
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2455
    0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0x1e, 0x0c, 0x02, 0x70, 0x18,
2456
    0x22, 0x22, 0x18, 0x00, 0x00, 0x18, 0x18, 0xff, 0x18, 0x00, 0x12, 0x02,
2457
diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch10/src/lat7_2_swapped.bm
2458
--- proll_18.orig/src/lat7_2_swapped.bm        1970-01-01 00:00:00.000000000 +0000
2459
+++ proll-patch10/src/lat7_2_swapped.bm        2004-11-13 15:50:49.000000000 +0000
2460
@@ -0,0 +1,121 @@
2461
+#define lat7_2_width 128
2462
+#define lat7_2_height 88
2463
+static unsigned const char lat7_2_bits[] = {
2464
+   0x00, 0x00, 0x18, 0x3c, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 
2465
+   0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x00, 0x48, 
2466
+   0x48, 0x78, 0x48, 0x5f, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x78, 0x40, 
2467
+   0x70, 0x40, 0x4f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x30, 0x40, 0x40, 
2468
+   0x40, 0x3e, 0x09, 0x0e, 0x0a, 0x09, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 
2469
+   0x7f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x0e, 0x0a, 0x0e, 0x00, 0x00, 
2470
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 
2471
+   0x7e, 0x00, 0x00, 0x00, 0x00, 0x44, 0x64, 0x54, 0x4c, 0x54, 0x10, 0x10, 
2472
+   0x10, 0x1f, 0x00, 0x00, 0x44, 0x44, 0x44, 0x28, 0x1f, 0x04, 0x04, 0x04, 
2473
+   0x04, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, 
2474
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x00, 
2475
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 
2476
+   0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
2477
+   0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, 
2478
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
2479
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2480
+   0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2481
+   0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2482
+   0x00, 0x00, 0xff, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 
2483
+   0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 
2484
+   0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, 
2485
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, 
2486
+   0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 
2487
+   0x06, 0x0c, 0x18, 0x30, 0x18, 0x6c, 0x36, 0x18, 0x0c, 0x00, 0x00, 0x60, 
2488
+   0x30, 0x18, 0x0c, 0x18, 0x36, 0x6c, 0x18, 0x30, 0x00, 0x00, 0x7f, 0x36, 
2489
+   0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x7e, 
2490
+   0x18, 0x7e, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x78, 
2491
+   0x30, 0x72, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
2492
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 
2493
+   0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2494
+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 
2495
+   0x00, 0x00, 0x00, 0x66, 0x66, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 
2496
+   0x00, 0x00, 0x36, 0x7f, 0x36, 0x36, 0x36, 0x7f, 0x36, 0x00, 0x00, 0x00, 
2497
+   0x00, 0x66, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 
2498
+   0x72, 0x56, 0x6c, 0x18, 0x36, 0x6a, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x18, 
2499
+   0x24, 0x28, 0x30, 0x4a, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
2500
+   0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x18, 
2501
+   0x18, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x18, 
2502
+   0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0x7e, 0x3c, 
2503
+   0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 
2504
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 
2505
+   0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 
2506
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 
2507
+   0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x40, 0x00, 0x00, 0x00, 
2508
+   0x00, 0x3c, 0x46, 0x4e, 0x5a, 0x72, 0x62, 0x3c, 0x00, 0x00, 0x00, 0x00, 
2509
+   0x18, 0x38, 0x58, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 
2510
+   0x66, 0x06, 0x0c, 0x18, 0x32, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
2511
+   0x06, 0x1c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 
2512
+   0x66, 0x7e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x60, 0x7c, 0x66, 
2513
+   0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x7c, 0x66, 0x66, 
2514
+   0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x06, 0x0c, 0x18, 0x30, 
2515
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x3c, 0x66, 0x66, 0x3c, 
2516
+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, 
2517
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 
2518
+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, 
2519
+   0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 
2520
+   0x00, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 
2521
+   0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
2522
+   0x06, 0x0c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x5e, 
2523
+   0x56, 0x5e, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x66, 
2524
+   0x7e, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x7c, 0x66, 
2525
+   0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, 
2526
+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 
2527
+   0x00, 0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x62, 0x7e, 0x00, 
2528
+   0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x00, 
2529
+   0x00, 0x00, 0x3c, 0x66, 0x60, 0x6e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 
2530
+   0x00, 0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 
2531
+   0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 
2532
+   0x46, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6c, 
2533
+   0x78, 0x70, 0x78, 0x6c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, 
2534
+   0x60, 0x60, 0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, 0x77, 0x7f, 
2535
+   0x6b, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x76, 0x7e, 0x6e, 
2536
+   0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, 
2537
+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 
2538
+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x3c, 0x02, 
2539
+   0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x00, 0x00, 
2540
+   0x00, 0x00, 0x3c, 0x66, 0x60, 0x3c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 
2541
+   0x00, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 
2542
+   0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 
2543
+   0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, 
2544
+   0x63, 0x6b, 0x6b, 0x7f, 0x36, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, 
2545
+   0x18, 0x3c, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 
2546
+   0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x0c, 0x18, 0x30, 
2547
+   0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 
2548
+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 
2549
+   0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, 
2550
+   0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2551
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 
2552
+   0x00, 0x08, 0x10, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2553
+   0x00, 0x3c, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 
2554
+   0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2555
+   0x3c, 0x66, 0x60, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 
2556
+   0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 
2557
+   0x7e, 0x60, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x78, 
2558
+   0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 0x66, 0x66, 
2559
+   0x3e, 0x06, 0x3c, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, 
2560
+   0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x1c, 0x00, 
2561
+   0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x6c, 0x38, 
2562
+   0x00, 0x00, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x7c, 0x66, 0x00, 0x00, 0x00, 
2563
+   0x00, 0x60, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 
2564
+   0x00, 0x00, 0x76, 0x7f, 0x6b, 0x6b, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 
2565
+   0x00, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
2566
+   0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 
2567
+   0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 
2568
+   0x66, 0x66, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x72, 0x60, 
2569
+   0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x3c, 0x06, 
2570
+   0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x78, 0x30, 0x30, 0x36, 0x1c, 
2571
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3a, 0x00, 
2572
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 
2573
+   0x00, 0x00, 0x00, 0x00, 0x63, 0x6b, 0x6b, 0x6b, 0x36, 0x00, 0x00, 0x00, 
2574
+   0x00, 0x00, 0x00, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 
2575
+   0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, 0x00, 0x00, 
2576
+   0x00, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 
2577
+   0x18, 0x30, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 
2578
+   0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x0c, 
2579
+   0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x00, 0x00, 
2580
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x00, 0x00, 0x00, 0x00, 
2581
+   0x00, 0x00, 0x00, 0x00};
2582
diff -ruN proll_18.orig/src/le.c proll-patch10/src/le.c
2583
--- proll_18.orig/src/le.c        2002-07-23 05:52:49.000000000 +0000
2584
+++ proll-patch10/src/le.c        2005-04-16 06:16:20.000000000 +0000
2585
@@ -185,8 +185,6 @@
2586
         unsigned short rap;                        /* register address port */
2587
 };
2588
 
2589
-int sparc_lance_debug = 2;
2590
-
2591
 /* The Lance uses 24 bit addresses */
2592
 /* On the Sun4c the DVMA will provide the remaining bytes for us */
2593
 /* On the Sun4m we have to instruct the ledma to provide them    */
2594
@@ -771,7 +769,7 @@
2595
         /* Clear the slack of the packet, do I need this? */
2596
         /* For a firewall its a good idea - AC */
2597
         if (len != skblen)
2598
-                bzero((char *) &ib->tx_buf [entry][skblen], len - skblen);
2599
+                memset((char *) &ib->tx_buf [entry][skblen], 0, len - skblen);
2600
     
2601
         /* Now, give the packet to the lance */
2602
         ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN);
2603
diff -ruN proll_18.orig/src/netinit.c proll-patch10/src/netinit.c
2604
--- proll_18.orig/src/netinit.c        2002-09-13 21:53:33.000000000 +0000
2605
+++ proll-patch10/src/netinit.c        2004-11-13 15:50:49.000000000 +0000
2606
@@ -49,13 +49,20 @@
2607
 unsigned char     myhwaddr[ETH_ALEN];                /* my own hardware addr        */
2608
          t_ipaddr myipaddr;                        /* my own IP address        */
2609
          t_ipaddr mynetmask;                        /* my own netmask        */
2610
-         char    *net_module_name;                /* name of init module        */
2611
          t_ipaddr servaddr;                        /* IP of RARP&TFTP server */
2612
 
2613
 /* Broadcast hardware address */
2614
-unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2615
+const unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2616
 
2617
 
2618
+unsigned int seed;
2619
+
2620
+/* This is taken from x86 to be used in network kernel. Returns 15 bits. */
2621
+short int random()
2622
+{
2623
+        seed = (seed + 23968)*0x015A4E35 >> 1;
2624
+        return seed & 0x7FFF;
2625
+}
2626
 
2627
 /*
2628
  **************************************************************************
2629
@@ -104,10 +111,17 @@
2630
  */
2631
 void init_net()
2632
 {
2633
+  /* Avoid data segment allocations */
2634
+  seed = 151;
2635
+
2636
   /* Initialize the different network layer modules */
2637
   init_packet();
2638
-  if (!init_arp() || !init_udp()) {
2639
-        printf("\nERROR: init_%s\n", net_module_name);
2640
+  if (!init_arp()) {
2641
+        printf("\nERROR: init_arp\n");
2642
+        fatal();
2643
+  }
2644
+  if (!init_udp()) {
2645
+        printf("\nERROR: init_udp\n");
2646
         fatal();
2647
   }
2648
 }
2649
diff -ruN proll_18.orig/src/netpriv.h proll-patch10/src/netpriv.h
2650
--- proll_18.orig/src/netpriv.h        1999-04-27 05:39:37.000000000 +0000
2651
+++ proll-patch10/src/netpriv.h        2004-11-13 15:50:49.000000000 +0000
2652
@@ -130,10 +130,9 @@
2653
  *
2654
  */
2655
 extern unsigned char myhwaddr[ETH_ALEN]; /* my own hardware address        */
2656
-extern unsigned char bcasthw[ETH_ALEN];  /* broadcast hardware addr        */
2657
+extern const unsigned char bcasthw[ETH_ALEN];  /* broadcast hardware addr        */
2658
 extern t_ipaddr      myipaddr;           /* my own IP address                */
2659
 extern t_ipaddr      mynetmask;                 /* netmask for my network        */
2660
-extern char         *net_module_name;         /* initialized module's name        */
2661
 extern t_ipaddr      servaddr;           /* server IP address                */
2662
 
2663
 
2664
@@ -150,7 +149,7 @@
2665
 extern unsigned char *reg_type __P((int typeval, int (* receive)()));
2666
 
2667
 /* Write a packet to the network */
2668
-extern int write_packet __P((int bufsize, int typeval, unsigned char *addr));
2669
+extern int write_packet __P((int bufsize, int typeval, const unsigned char *addr));
2670
 
2671
 /* Empty read buffer */
2672
 extern void empty_buf __P((void));
2673
diff -ruN proll_18.orig/src/openprom.h proll-patch10/src/openprom.h
2674
--- proll_18.orig/src/openprom.h        2002-07-14 02:26:30.000000000 +0000
2675
+++ proll-patch10/src/openprom.h        2004-11-13 15:50:49.000000000 +0000
2676
@@ -54,20 +54,20 @@
2677
 };
2678
 
2679
 struct linux_mem_v0 {
2680
-        struct linux_mlist_v0 **v0_totphys;
2681
-        struct linux_mlist_v0 **v0_prommap;
2682
-        struct linux_mlist_v0 **v0_available; /* What we can use */
2683
+        struct linux_mlist_v0 * const *v0_totphys;
2684
+        struct linux_mlist_v0 * const *v0_prommap;
2685
+        struct linux_mlist_v0 * const *v0_available; /* What we can use */
2686
 };
2687
 
2688
 /* Arguments sent to the kernel from the boot prompt. */
2689
 struct linux_arguments_v0 {
2690
-        char *argv[8];
2691
+        const char *argv[8];
2692
         char args[100];
2693
         char boot_dev[2];
2694
         int boot_dev_ctrl;
2695
         int boot_dev_unit;
2696
         int dev_partition;
2697
-        char *kernel_file_name;
2698
+        const char *kernel_file_name;
2699
         void *aieee1;           /* XXX */
2700
 };
2701
 
2702
@@ -91,13 +91,13 @@
2703
         struct linux_mem_v0 pv_v0mem;
2704
 
2705
         /* Node operations. */
2706
-        struct linux_nodeops *pv_nodeops;
2707
+        const struct linux_nodeops *pv_nodeops;
2708
 
2709
         char **pv_bootstr;
2710
         struct linux_dev_v0_funcs pv_v0devops;
2711
 
2712
-        char *pv_stdin;
2713
-        char *pv_stdout;
2714
+        const char *pv_stdin;
2715
+        const char *pv_stdout;
2716
 #define        PROMDEV_KBD        0                /* input from keyboard */
2717
 #define        PROMDEV_SCREEN        0                /* output to screen */
2718
 #define        PROMDEV_TTYA        1                /* in/out to ttya */
2719
@@ -127,7 +127,7 @@
2720
                 void (*v2_eval)(char *str);
2721
         } pv_fortheval;
2722
 
2723
-        struct linux_arguments_v0 **pv_v0bootargs;
2724
+        const struct linux_arguments_v0 * const *pv_v0bootargs;
2725
 
2726
         /* Get ether address. */
2727
         unsigned int (*pv_enaddr)(int d, char *enaddr);
2728
@@ -175,7 +175,7 @@
2729
         int (*no_proplen)(int node, char *name);
2730
         int (*no_getprop)(int node, char *name, char *val);
2731
         int (*no_setprop)(int node, char *name, char *val, int len);
2732
-        char * (*no_nextprop)(int node, char *name);
2733
+        const char * (*no_nextprop)(int node, char *name);
2734
 };
2735
 
2736
 /* More fun PROM structures for device probing. */
2737
diff -ruN proll_18.orig/src/packet.c proll-patch10/src/packet.c
2738
--- proll_18.orig/src/packet.c        2000-02-11 04:56:45.000000000 +0000
2739
+++ proll-patch10/src/packet.c        2004-11-13 15:50:49.000000000 +0000
2740
@@ -41,7 +41,7 @@
2741
         int aligner;
2742
 } wbuf;
2743
 static struct sk_buff *rskb;
2744
-static int nqskb = 0;
2745
+static int nqskb;
2746
 
2747
 
2748
 void init_packet()
2749
@@ -62,6 +62,8 @@
2750
         for (i = 0; i < MAXSKBS; i++) {
2751
                 skev[i].skb.allocn = i;
2752
         }
2753
+
2754
+        nqskb = 0;
2755
 }
2756
 
2757
 unsigned char *reg_type(int ptype, int (*func)())
2758
@@ -81,7 +83,7 @@
2759
         return wbuf.s;
2760
 }
2761
 
2762
-int write_packet(int leng, int type, unsigned char *dst)
2763
+int write_packet(int leng, int type, const unsigned char *dst)
2764
 {
2765
         struct sk_buff *skb;
2766
         unsigned char *s;
2767
diff -ruN proll_18.orig/src/printf.c proll-patch10/src/printf.c
2768
--- proll_18.orig/src/printf.c        1999-03-19 07:03:59.000000000 +0000
2769
+++ proll-patch10/src/printf.c        2004-11-13 15:50:49.000000000 +0000
2770
@@ -19,7 +19,7 @@
2771
 static void printn(struct prf_fp *, unsigned long, unsigned int);
2772
 static void putchar(char, struct prf_fp *);
2773
 
2774
-static char hextab[] = "0123456789ABCDEF";
2775
+static const char hextab[] = "0123456789ABCDEF";
2776
 
2777
 /*
2778
  * Scaled down version of C Library printf.
2779
@@ -41,7 +41,7 @@
2780
 void
2781
 prf(struct prf_fp *filog, char *fmt, va_list adx)
2782
 {
2783
-        register c;
2784
+        register int c;
2785
         char *s;
2786
 
2787
         for(;;) {
2788
@@ -60,7 +60,7 @@
2789
                         putchar(va_arg(adx,unsigned), filog);
2790
                 } else if(c == 's') {
2791
                         s = va_arg(adx,char*);
2792
-                               while(c = *s++)
2793
+                               while((c = *s++))
2794
                                 putchar(c,filog);
2795
                        } else if (c == 'l' || c == 'O') {
2796
                         printn(filog, (long)va_arg(adx,long), c=='l'?10:8);
2797
diff -ruN proll_18.orig/src/rconsole.c proll-patch10/src/rconsole.c
2798
--- proll_18.orig/src/rconsole.c        1999-01-16 07:16:55.000000000 +0000
2799
+++ proll-patch10/src/rconsole.c        2005-04-16 06:16:20.000000000 +0000
2800
@@ -28,12 +28,18 @@
2801
  * move to California. Only plain lat7 survived. 
2802
  * I recreated lat7-1 changes in lat7-2.  --zaitcev
2803
  */
2804
+#ifdef ORIG
2805
 #include "lat7_2.bm"        /* lat7_1.bm */
2806
+#else
2807
+#include "lat7_2_swapped.bm"        /* lat7_1.bm */
2808
+#endif
2809
 #define LAT7_NCHARS  128
2810
 #define LAT7_HEIGHT   11
2811
 #define LAT7_WIDTH     8
2812
 
2813
+#ifdef ORIG
2814
 static Rf_scan lat7_body[ LAT7_NCHARS*LAT7_HEIGHT ];
2815
+#endif
2816
 
2817
 #if 1
2818
 /*
2819
@@ -46,18 +52,18 @@
2820
 #endif
2821
 
2822
 static __inline__ void stfb_w(void *ptr, unsigned int data) {
2823
-        __asm__ __volatile__ ("sta %0, [%1] %2" : :
2824
+        __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : :
2825
                                 "r" (data), "r" (ptr), "i" (ASI_M_BYPASS));
2826
 }
2827
 
2828
 static __inline__ void stfb_b(void *ptr, unsigned int data) {
2829
-        __asm__ __volatile__ ("stba %0, [%1] %2" : :
2830
+        __asm__ __volatile__ ("stba %0, [%1] %2\n\t" : :
2831
                                 "r" (data), "r" (ptr), "i" (ASI_M_BYPASS));
2832
 }
2833
 
2834
 static __inline__ unsigned int ldfb_w(void *ptr) {
2835
         unsigned int data;
2836
-        __asm__ __volatile__ ("lda [%1] %2, %0" :
2837
+        __asm__ __volatile__ ("lda [%1] %2, %0\n\t" :
2838
                                 "=r" (data) :
2839
                                 "r" (ptr), "i" (ASI_M_BYPASS));
2840
         return data;
2841
@@ -65,7 +71,7 @@
2842
 
2843
 static __inline__ unsigned int ldfb_b(void *ptr) {
2844
         unsigned int data;
2845
-        __asm__ __volatile__ ("lduba [%1] %2, %0" :
2846
+        __asm__ __volatile__ ("lduba [%1] %2, %0\n\t" :
2847
                                 "=r" (data) :
2848
                                 "r" (ptr), "i" (ASI_M_BYPASS));
2849
         return data;
2850
@@ -94,6 +100,7 @@
2851
 
2852
 #endif
2853
 
2854
+#ifdef ORIG
2855
 static inline int swapbits(int w0)
2856
 {
2857
   int w1 = 0;
2858
@@ -105,13 +112,16 @@
2859
   }
2860
   return w1;
2861
 }
2862
+#endif
2863
 
2864
 void font_cons_7(struct rfont *p)
2865
 {
2866
+#ifdef ORIG
2867
   int x;
2868
   int col = 0;
2869
   int row = 0;
2870
   int erow = 0;
2871
+
2872
   for (x = 0; x < LAT7_NCHARS*LAT7_HEIGHT; x++ ) {
2873
     lat7_body[ (erow * lat7_2_width/8 + col) * LAT7_HEIGHT + row ] =
2874
                                             swapbits(lat7_2_bits[x]) & 0xFF;
2875
@@ -124,6 +134,9 @@
2876
     }
2877
   }
2878
   p->body_ = lat7_body;
2879
+#else
2880
+  p->body_ = lat7_2_bits;
2881
+#endif
2882
   p->nchars_ = LAT7_NCHARS;
2883
   p->width_ = LAT7_WIDTH;
2884
   p->height_ = LAT7_HEIGHT;
2885
diff -ruN proll_18.orig/src/rconsole.h proll-patch10/src/rconsole.h
2886
--- proll_18.orig/src/rconsole.h        1999-01-16 05:00:59.000000000 +0000
2887
+++ proll-patch10/src/rconsole.h        2004-11-13 15:50:49.000000000 +0000
2888
@@ -13,10 +13,10 @@
2889
  */
2890
 
2891
 #define RF_MAXWIDTH  16
2892
-typedef unsigned short Rf_scan;        /*  __w16 to be used */
2893
+typedef unsigned char Rf_scan;        /*  __w16 to be used */
2894
 
2895
 struct rfont {
2896
-  Rf_scan *body_;
2897
+  const Rf_scan *body_;
2898
   int nchars_;                 /* 128 for ASCII ...  65536 for Unicode   */
2899
   int width_;                  /* [Pixels]. Maximum size is 16.          */
2900
   int height_;                 /* [Pixels == scan lines].                */
2901
diff -ruN proll_18.orig/src/romlib.h proll-patch10/src/romlib.h
2902
--- proll_18.orig/src/romlib.h        1999-04-20 04:26:45.000000000 +0000
2903
+++ proll-patch10/src/romlib.h        2005-04-16 20:32:49.000000000 +0000
2904
@@ -72,13 +72,13 @@
2905
  */
2906
 #define memcpy(dst, src, len)        bcopy(src, dst, len)
2907
 #define memcmp(x1, x2, len)        bcmp(x1, x2, len)
2908
-#define memset(p, len, zero)        bzero(p, len)
2909
-extern void bcopy(void *b1, void *b2, int length);
2910
-extern int  bcmp(void *b1, void *b2, int length);
2911
-extern void bzero(void *b, int c);
2912
+extern void bcopy(const void *b1, void *b2, int length);
2913
+extern int  bcmp(const void *b1, const void *b2, int length);
2914
+typedef unsigned int size_t;
2915
+extern void *memset(void *p, int c, size_t len);
2916
 /* gcc complains about "conflicting types for builtin function strlen". */
2917
 #define strlen(s)                ssize(s)
2918
-extern int ssize(char *s);
2919
+extern int ssize(const char *s);
2920
 
2921
 
2922
 /*
2923
diff -ruN proll_18.orig/src/sched_4m.c proll-patch10/src/sched_4m.c
2924
--- proll_18.orig/src/sched_4m.c        1999-04-27 05:48:51.000000000 +0000
2925
+++ proll-patch10/src/sched_4m.c        2004-11-13 15:50:49.000000000 +0000
2926
@@ -108,7 +108,7 @@
2927
 static int set_bolt;                        /* Tick counter limit */
2928
 static struct handsc hndv[16];
2929
 
2930
-static unsigned int intr_to_mask[16] = {
2931
+static unsigned const int intr_to_mask[16] = {
2932
         0,        0,        0,        0,        0,        0, SUN4M_INT_ETHERNET,        0,
2933
         0,        0,        0,        0,        0,        0,        0,        0,
2934
 };
2935
diff -ruN proll_18.orig/src/swap.c proll-patch10/src/swap.c
2936
--- proll_18.orig/src/swap.c        1970-01-01 00:00:00.000000000 +0000
2937
+++ proll-patch10/src/swap.c        2004-11-13 15:50:49.000000000 +0000
2938
@@ -0,0 +1,21 @@
2939
+// Convert the lat7 font so that no conversion is needed at runtime.
2940
+#define ORIG
2941
+#include "rconsole.c"
2942
+
2943
+#include <stdio.h>
2944
+
2945
+int main()
2946
+{
2947
+    struct rfont p;
2948
+    int i;
2949
+
2950
+    font_cons_7(&p);
2951
+
2952
+    printf("   ");
2953
+    for (i = 0; i < LAT7_NCHARS*LAT7_HEIGHT; i++) {
2954
+        printf("0x%02x, ", p.body_[i]);
2955
+        if ((i % 12) == 11)
2956
+            printf("\n   ");
2957
+    }
2958
+    printf("\n");
2959
+}
2960
diff -ruN proll_18.orig/src/system.c proll-patch10/src/system.c
2961
--- proll_18.orig/src/system.c        2002-07-23 05:52:49.000000000 +0000
2962
+++ proll-patch10/src/system.c        2005-04-16 06:16:20.000000000 +0000
2963
@@ -298,8 +298,8 @@
2964
         }
2965
 
2966
         /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */
2967
-        pa = PAGE_SIZE;
2968
-        for (va = PAGE_SIZE; va < LOWMEMSZ; va += PAGE_SIZE) {
2969
+        pa = 0;
2970
+        for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) {
2971
                 map_page(l1, va, pa, 0, highbase);
2972
                 pa += PAGE_SIZE;
2973
         }
2974
@@ -507,30 +507,44 @@
2975
 {
2976
         char *p;
2977
 
2978
-        if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size);
2979
+        if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size);
2980
         return p;
2981
 }
2982
 
2983
 /*
2984
  * Library functions
2985
  */
2986
-void bzero(void *s, int len) {
2987
-        while (len--) *((char *)s)++ = 0;
2988
+void *memset(void *s, int c, size_t len)
2989
+{
2990
+        void *p = s;
2991
+
2992
+        while (len--) {
2993
+                *(char *)s = c;
2994
+                s++;
2995
+        }
2996
+        return p;
2997
 }
2998
 
2999
-void bcopy(void *f, void *t, int len) {
3000
-        while (len--) *((char *)t)++ = *((char *)f)++;
3001
+void bcopy(const void *f, void *t, int len) {
3002
+        while (len--) {
3003
+                *(char *)t = *(char *)f;
3004
+                f++;
3005
+                t++;
3006
+        }
3007
 }
3008
 
3009
 /* Comparison is 7-bit */
3010
-int bcmp(void *s1, void *s2, int len)
3011
+int bcmp(const void *s1, const void *s2, int len)
3012
 {
3013
         int i;
3014
         char ch;
3015
 
3016
         while (len--) {
3017
-                ch = *((char *)s1)++;
3018
-                if ((i = ch - *((char *)s2)++) != 0)
3019
+                ch = *(char *)s1;
3020
+                i = ch - *(char *)s2;
3021
+                s1++;
3022
+                s2++;
3023
+                if (i != 0)
3024
                         return i;
3025
                 if (ch == 0)
3026
                         return 0;
3027
@@ -538,8 +552,8 @@
3028
         return 0;
3029
 }
3030
 
3031
-int strlen(char *s) {
3032
-        char *p;
3033
+int strlen(const char *s) {
3034
+        const char *p;
3035
         for (p = s; *p != 0; p++) { }
3036
         return p - s;
3037
 }
3038
@@ -560,14 +574,6 @@
3039
         va_end(x1);
3040
 }
3041
 
3042
-/* This is taken from x86 to be used in network kernel. Returns 15 bits. */
3043
-short int random()
3044
-{
3045
-        static unsigned int seed = 151;
3046
-        seed = (seed + 23968)*0x015A4E35 >> 1;
3047
-        return seed & 0x7FFF;
3048
-}
3049
-
3050
 void fatal()
3051
 {
3052
         printk("fatal.");
3053
diff -ruN proll_18.orig/src/system.h proll-patch10/src/system.h
3054
--- proll_18.orig/src/system.h        2002-09-13 21:53:32.000000000 +0000
3055
+++ proll-patch10/src/system.h        2005-04-16 06:16:20.000000000 +0000
3056
@@ -16,7 +16,7 @@
3057
 #define IOMAPSIZE (1*1024*1024) /* 1 Meg maximum: we do not map framebuffer. */
3058
 #define NCTX_SWIFT  0x100
3059
 
3060
-#define MAX_BANKS      3                /* Allocation for all machines */
3061
+#define MAX_BANKS      8                /* Allocation for all machines */
3062
 
3063
 #ifndef __ASSEMBLY__
3064
 struct bank {
3065
@@ -164,10 +164,10 @@
3066
 
3067
 extern __inline__ void setipl(unsigned long __orig_psr)
3068
 {
3069
-        __asm__ __volatile__("
3070
-                wr        %0, 0x0, %%psr
3071
-                nop; nop; nop
3072
-"                : /* no outputs */
3073
+        __asm__ __volatile__(
3074
+                "wr        %0, 0x0, %%psr\n\t"
3075
+                "nop; nop; nop\n\t"
3076
+                : /* no outputs */
3077
                 : "r" (__orig_psr)
3078
                 : "memory", "cc");
3079
 }
3080
@@ -176,13 +176,13 @@
3081
 {
3082
         unsigned long tmp;
3083
 
3084
-        __asm__ __volatile__("
3085
-                rd        %%psr, %0
3086
-                nop; nop; nop;                /* Sun4m + Cypress + SMP bug */
3087
-                or        %0, %1, %0
3088
-                wr        %0, 0x0, %%psr
3089
-                nop; nop; nop
3090
-"                : "=r" (tmp)
3091
+        __asm__ __volatile__(
3092
+                "rd        %%psr, %0\n\t"
3093
+                "nop; nop; nop;\n\t"        /* Sun4m + Cypress + SMP bug */
3094
+                "or        %0, %1, %0\n\t"
3095
+                "wr        %0, 0x0, %%psr\n\t"
3096
+                "nop; nop; nop\n\t"
3097
+                : "=r" (tmp)
3098
                 : "i" (PSR_PIL)
3099
                 : "memory");
3100
 }
3101
@@ -191,13 +191,13 @@
3102
 {
3103
         unsigned long tmp;
3104
 
3105
-        __asm__ __volatile__("
3106
-                rd        %%psr, %0        
3107
-                nop; nop; nop;                /* Sun4m + Cypress + SMP bug */
3108
-                andn        %0, %1, %0
3109
-                wr        %0, 0x0, %%psr
3110
-                nop; nop; nop
3111
-"                : "=r" (tmp)
3112
+        __asm__ __volatile__(
3113
+                "rd        %%psr, %0\n\t"
3114
+                "nop; nop; nop;\n\t"        /* Sun4m + Cypress + SMP bug */
3115
+                "andn        %0, %1, %0\n\t"
3116
+                "wr        %0, 0x0, %%psr\n\t"
3117
+                "nop; nop; nop\n\t"
3118
+                : "=r" (tmp)
3119
                 : "i" (PSR_PIL)
3120
                 : "memory");
3121
 }
3122
@@ -214,18 +214,18 @@
3123
 {
3124
         unsigned long retval;
3125
 
3126
-        __asm__ __volatile__("
3127
-                rd        %%psr, %0
3128
-                nop; nop; nop;                /* Sun4m + Cypress + SMP bug */
3129
-                and        %0, %2, %%g1
3130
-                and        %1, %2, %%g2
3131
-                xorcc        %%g1, %%g2, %%g0
3132
-                be        1f
3133
-                 nop
3134
-                wr        %0, %2, %%psr
3135
-                nop; nop; nop;
3136
-1:
3137
-"                : "=r" (retval)
3138
+        __asm__ __volatile__(
3139
+                "rd        %%psr, %0\n\t"
3140
+                "nop; nop; nop;\n\t"        /* Sun4m + Cypress + SMP bug */
3141
+                "and        %0, %2, %%g1\n\t"
3142
+                "and        %1, %2, %%g2\n\t"
3143
+                "xorcc        %%g1, %%g2, %%g0\n\t"
3144
+                "be        1f\n\t"
3145
+                "nop\n\t"
3146
+                "wr        %0, %2, %%psr\n\t"
3147
+                "nop; nop; nop;\n\t"
3148
+                "1:\n\t"
3149
+                : "=r" (retval)
3150
                 : "r" (__new_psr), "i" (PSR_PIL)
3151
                 : "g1", "g2", "memory", "cc");
3152
 
3153
@@ -236,13 +236,13 @@
3154
 {
3155
         unsigned long retval;
3156
 
3157
-        __asm__ __volatile__("
3158
-                rd        %%psr, %0
3159
-                nop; nop; nop;                /* Sun4m + Cypress + SMP bug */
3160
-                or        %0, %1, %%g1
3161
-                wr        %%g1, 0x0, %%psr
3162
-                nop; nop; nop
3163
-"                : "=r" (retval)
3164
+        __asm__ __volatile__(
3165
+                "rd        %%psr, %0\n\t"
3166
+                "nop; nop; nop;\n\t"        /* Sun4m + Cypress + SMP bug */
3167
+                "or        %0, %1, %%g1\n\t"
3168
+                "wr        %%g1, 0x0, %%psr\n\t"
3169
+                "nop; nop; nop\n\t"
3170
+                : "=r" (retval)
3171
                 : "i" (PSR_PIL)
3172
                 : "g1", "memory");
3173
 
3174
diff -ruN proll_18.orig/src/udp.c proll-patch10/src/udp.c
3175
--- proll_18.orig/src/udp.c        2001-12-24 05:12:53.000000000 +0000
3176
+++ proll-patch10/src/udp.c        2004-11-13 15:50:49.000000000 +0000
3177
@@ -81,7 +81,7 @@
3178
 int      source;
3179
 int      dest;
3180
 {
3181
-  register unsigned char *addr;
3182
+  const register unsigned char *addr;
3183
 
3184
   /* Set global variables */
3185
   usource = source;
3186
@@ -299,9 +299,6 @@
3187
  */
3188
 int init_udp()
3189
 {
3190
-  /* Set module name for error handling */
3191
-  net_module_name = "udp";
3192
-
3193
   /* Register IP packet type and set write buffer pointer */
3194
   if ((writebuf = reg_type(htons(ETH_P_IP), ip_recv)) == NULL)
3195
         return(FALSE);
3196
diff -ruN proll_18.orig/src/vcons_zs.c proll-patch10/src/vcons_zs.c
3197
--- proll_18.orig/src/vcons_zs.c        1970-01-01 00:00:00.000000000 +0000
3198
+++ proll-patch10/src/vcons_zs.c        2005-04-10 07:01:03.000000000 +0000
3199
@@ -0,0 +1,68 @@
3200
+/**
3201
+ ** Console over 'zs' (Zilog serial port)
3202
+ ** Copyright 1999 Pete Zaitcev
3203
+ ** This code is licensed under GNU General Public License.
3204
+ **/
3205
+
3206
+#include "vconsole.h"
3207
+#include <system.h>
3208
+
3209
+#define ZS_DATA 0x02
3210
+
3211
+int vcon_zs_init(struct vconterm *t, unsigned int a0)
3212
+{
3213
+
3214
+        t->impl = (void *) a0;
3215
+
3216
+        t->vc_x = 0;    t->vc_y = 0;
3217
+        t->backp = 0;    t->backc = 0;
3218
+
3219
+        stb_bypass(a0, 3); // reg 3
3220
+        stb_bypass(a0, 1); // enable rx
3221
+
3222
+        stb_bypass(a0, 5); // reg 5
3223
+        stb_bypass(a0, 8); // enable tx
3224
+
3225
+        return 0;
3226
+}
3227
+
3228
+int vcon_zs_putch(struct vconterm *t, char c)
3229
+{
3230
+        unsigned zs_ptr = (unsigned) t->impl;
3231
+
3232
+        //while ((ldb_bypass(zs_ptr + ZS_LSR) & 0x60) != 0x60) { }
3233
+        stb_bypass(zs_ptr + ZS_DATA, c);
3234
+        return 0;
3235
+}
3236
+
3237
+int vcon_zs_write(struct vconterm *t, char *data, int leng)
3238
+{
3239
+        while (leng != 0) {
3240
+                leng--;
3241
+                vcon_zs_putch(t, *data++);
3242
+        }
3243
+        return leng;
3244
+}
3245
+
3246
+int vcon_zs_read(struct vconterm *t, char *data, int leng)
3247
+{
3248
+        unsigned zs_ptr = (unsigned) t->impl;
3249
+
3250
+        while ((ldb_bypass(zs_ptr) & 1) != 1) { }
3251
+        *data = ldb_bypass(zs_ptr + ZS_DATA);
3252
+        return 0;
3253
+}
3254
+
3255
+int vcon_zs_getch(struct vconterm *t)
3256
+{
3257
+        unsigned zs_ptr = (unsigned) t->impl;
3258
+
3259
+        while ((ldb_bypass(zs_ptr) & 1) != 1) { }
3260
+        return ldb_bypass(zs_ptr + ZS_DATA) & 0xff;
3261
+}
3262
+
3263
+void vcon_zs_fini(struct vconterm *t)
3264
+{
3265
+        /* violent crash in the end */
3266
+        ;
3267
+}
3268
diff -ruN proll_18.orig/src/vconsole.c proll-patch10/src/vconsole.c
3269
--- proll_18.orig/src/vconsole.c        1999-11-08 03:10:28.000000000 +0000
3270
+++ proll-patch10/src/vconsole.c        2005-04-17 19:23:21.000000000 +0000
3271
@@ -7,12 +7,17 @@
3272
 #include "vconsole.h"
3273
 
3274
 #include "hconsole.h"
3275
+#include <system.h>
3276
 
3277
 static void vcon_i_cursfeed(struct vconterm *t);
3278
 static void vcon_i_backflush(struct vconterm *t);
3279
 
3280
 struct hconsole hcons0;
3281
 
3282
+enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey,
3283
+        EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd,
3284
+        ESpalette };
3285
+
3286
 int vcon_init(struct vconterm *t, unsigned int a0)
3287
 {
3288
         struct hconsole *hconp;
3289
@@ -25,11 +30,49 @@
3290
 
3291
         t->vc_x = 0;    t->vc_y = 0;
3292
         t->backp = 0;    t->backc = 0;
3293
+        t->vc_state = ESnormal;
3294
 
3295
         hcon_clear(hconp, 0, 0, hconp->ydim_, hconp->xdim_);
3296
         return 0;
3297
 }
3298
 
3299
+/*
3300
+ * gotoxy() must verify all boundaries, because the arguments
3301
+ * might also be negative. If the given position is out of
3302
+ * bounds, the cursor is placed at the nearest margin.
3303
+ */
3304
+static void gotoxy(struct vconterm *vc, int new_x, int new_y)
3305
+{
3306
+        int max_x, max_y;
3307
+        struct hconsole *hconp = vc->impl;
3308
+
3309
+        max_x = hcon_qxdim(hconp);
3310
+        max_y = hcon_qydim(hconp);
3311
+
3312
+        if (new_x < 0)
3313
+                vc->vc_x = 0;
3314
+        else {
3315
+                if (new_x >= max_x)
3316
+                        vc->vc_x = max_x - 1;
3317
+                else
3318
+                        vc->vc_x = new_x;
3319
+        }
3320
+
3321
+        if (new_y < 0)
3322
+                vc->vc_y = 0;
3323
+        else if (new_y >= max_y)
3324
+                vc->vc_y = max_y - 1;
3325
+        else
3326
+                vc->vc_y = new_y;
3327
+
3328
+}
3329
+
3330
+/* for absolute user moves, when decom is set */
3331
+static void gotoxay(struct vconterm *t, int new_x, int new_y)
3332
+{
3333
+        gotoxy(t, new_x, new_y);
3334
+}
3335
+
3336
 int vcon_write(struct vconterm *t, char *data, int leng)
3337
 {
3338
         int l = leng;
3339
@@ -40,29 +83,99 @@
3340
                 if (l <= 0) break;
3341
                 c = *data++;    --l;
3342
 
3343
-                switch (c) {
3344
-                case 0x07:                /* Bell */
3345
-                        vcon_i_backflush(t);
3346
-                        break;
3347
-                case 0x0A:                /* Linefeed */
3348
-                        vcon_i_backflush(t);
3349
-                        vcon_i_cursfeed(t);
3350
+                switch(t->vc_state) {
3351
+                case ESesc:
3352
+                        t->vc_state = ESnormal;
3353
+                        switch (c) {
3354
+                        case '[':
3355
+                                t->vc_state = ESsquare;
3356
+                                break;
3357
+                        case 'M':
3358
+                                hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1);
3359
+                                break;
3360
+                        default:
3361
+                                printk("Unhandled escape code '%c'\n", c);
3362
+                                break;
3363
+                        }
3364
                         break;
3365
-                case 0x0D:                /* Return */
3366
-                        vcon_i_backflush(t);
3367
-                        t->vc_x = 0;
3368
+                case ESsquare:
3369
+                        for(t->vc_npar = 0 ; t->vc_npar < NPAR ; t->vc_npar++)
3370
+                                t->vc_par[t->vc_npar] = 0;
3371
+                        t->vc_npar = 0;
3372
+                        t->vc_state = ESgetpars;
3373
+                case ESgetpars:
3374
+                        if (c==';' && t->vc_npar<NPAR-1) {
3375
+                                t->vc_npar++;
3376
+                                break;
3377
+                        } else if (c>='0' && c<='9') {
3378
+                                t->vc_par[t->vc_npar] *= 10;
3379
+                                t->vc_par[t->vc_npar] += c-'0';
3380
+                                break;
3381
+                        } else t->vc_state=ESgotpars;
3382
+                case ESgotpars:
3383
+                        t->vc_state = ESnormal;
3384
+                        switch(c) {
3385
+                        case 'H': case 'f':
3386
+                                if (t->vc_par[0]) t->vc_par[0]--;
3387
+                                if (t->vc_par[1]) t->vc_par[1]--;
3388
+                                gotoxay(t, t->vc_par[1], t->vc_par[0]);
3389
+                                break;
3390
+                        case 'J':
3391
+                                if (t->vc_par[0] == 0) {
3392
+                                        //erase from cursor to end of display
3393
+                                        hcon_clear(hconp, t->vc_y, t->vc_x, hconp->ydim_, hconp->xdim_);
3394
+                                }
3395
+                                break;
3396
+                        case 'M':
3397
+                                hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1);
3398
+                                break;
3399
+                        case 'm':
3400
+                                break;
3401
+                        default:
3402
+                                printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n",
3403
+                                   c, t->vc_par[0], t->vc_par[1], t->vc_par[2], t->vc_par[3], t->vc_par[4]);
3404
+                                break;
3405
+                        }
3406
                         break;
3407
                 default:
3408
-                        if (t->backp == 0) {
3409
-                                t->backc = 1;
3410
-                                t->backp = data-1;
3411
-                        } else {
3412
-                                t->backc++;
3413
-                        }
3414
-                        if (t->vc_x + t->backc >= hcon_qxdim(hconp)) {
3415
+                        t->vc_state = ESnormal;
3416
+                        switch (c) {
3417
+                        case 0x07:                /* Bell */
3418
+                                vcon_i_backflush(t);
3419
+                                break;
3420
+                        case 0x08:                /* BS */
3421
+                                vcon_i_backflush(t);
3422
+                                if (t->vc_x > 0)
3423
+                                        t->vc_x--;
3424
+                                break;
3425
+                        case 0x0A:                /* Linefeed */
3426
                                 vcon_i_backflush(t);
3427
-                                t->vc_x = 0;
3428
                                 vcon_i_cursfeed(t);
3429
+                                break;
3430
+                        case 0x0D:                /* Return */
3431
+                                vcon_i_backflush(t);
3432
+                                t->vc_x = 0;
3433
+                                break;
3434
+                        case 24: case 26:
3435
+                                vcon_i_backflush(t);
3436
+                                t->vc_state = ESnormal;
3437
+                                break;
3438
+                        case 27:
3439
+                                vcon_i_backflush(t);
3440
+                                t->vc_state = ESesc;
3441
+                                break;
3442
+                        default:
3443
+                                if (t->backp == 0) {
3444
+                                        t->backc = 1;
3445
+                                        t->backp = data-1;
3446
+                                } else {
3447
+                                        t->backc++;
3448
+                                }
3449
+                                if (t->vc_x + t->backc >= hcon_qxdim(hconp)) {
3450
+                                        vcon_i_backflush(t);
3451
+                                        t->vc_x = 0;
3452
+                                        vcon_i_cursfeed(t);
3453
+                                }
3454
                         }
3455
                 }
3456
         }
3457
@@ -100,9 +213,62 @@
3458
         return 0;
3459
 }
3460
 
3461
+static const unsigned char sunkbd_keycode[128] = {
3462
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
3463
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
3464
+    '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8,
3465
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
3466
+    'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']',
3467
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3468
+    'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13,
3469
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3470
+    'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
3471
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3472
+    ' ',
3473
+};
3474
+
3475
+static const unsigned char sunkbd_keycode_shifted[128] = {
3476
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,
3477
+    0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0,
3478
+    '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8,
3479
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
3480
+    'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}',
3481
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3482
+    'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13,
3483
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3484
+    'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
3485
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3486
+    ' ',
3487
+};
3488
+
3489
+static int shiftstate;
3490
+
3491
 int vcon_getch(struct vconterm *t)
3492
 {
3493
-        return -1;
3494
+        int ch;
3495
+
3496
+        while ((ldb_bypass(0x71000004) & 1) != 1) { }
3497
+        do {
3498
+            ch = ldb_bypass(0x71000006) & 0xff;
3499
+            if (ch == 99)
3500
+                shiftstate |= 1;
3501
+            else if (ch == 110)
3502
+                shiftstate |= 2;
3503
+            else if (ch == 227)
3504
+                shiftstate &= ~1;
3505
+            else if (ch == 238)
3506
+                shiftstate &= ~2;
3507
+            //printk("getch: %d\n", ch);
3508
+        }
3509
+        while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release
3510
+        //printk("getch rel: %d\n", ch);
3511
+        ch &= 0x7f;
3512
+        if (shiftstate)
3513
+            ch = sunkbd_keycode_shifted[ch];
3514
+        else
3515
+            ch = sunkbd_keycode[ch];
3516
+        //printk("getch xlate: %d\n", ch);
3517
+        return ch;
3518
 }
3519
 
3520
 void vcon_fini(struct vconterm *t)
3521
diff -ruN proll_18.orig/src/vconsole.h proll-patch10/src/vconsole.h
3522
--- proll_18.orig/src/vconsole.h        1999-11-08 00:58:13.000000000 +0000
3523
+++ proll-patch10/src/vconsole.h        2005-03-02 12:40:12.000000000 +0000
3524
@@ -6,6 +6,8 @@
3525
 #ifndef VCONSOLE_H
3526
 #define VCONSOLE_H
3527
 
3528
+#define NPAR 16
3529
+
3530
 struct vconterm {
3531
         void *impl;
3532
 
3533
@@ -13,6 +15,8 @@
3534
         int backc;                /* Same, count */
3535
 
3536
         int vc_x, vc_y;                /* XXX Make vcon_xxx() to use cellmap->xpos_ */
3537
+        int vc_state;
3538
+        unsigned int        vc_npar,vc_par[NPAR];        /* Parameters of current escape sequence */
3539
 };
3540
 
3541
 int vcon_init(struct vconterm *t, unsigned int a0);