Commit 5b9053a5ea29f51a6058a5ce76daee6f80efb0b2
1 parent
6ea83fed
remove proll
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1965 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
0 additions
and
4067 deletions
pc-bios/proll.patch deleted
100644 → 0
1 | -diff -ruN proll_18.orig/Makefile proll-patch-15/Makefile | |
2 | ---- proll_18.orig/Makefile 2002-09-13 14:16:59.000000000 +0000 | |
3 | -+++ proll-patch-15/Makefile 2005-11-09 18:14:51.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-patch-15/qemu/Makefile | |
18 | ---- proll_18.orig/qemu/Makefile 1970-01-01 00:00:00.000000000 +0000 | |
19 | -+++ proll-patch-15/qemu/Makefile 2005-08-14 10:25:06.000000000 +0000 | |
20 | -@@ -0,0 +1,123 @@ | |
21 | -+# | |
22 | -+# proll: | |
23 | -+# qemu/Makefile - make PROLL for QEMU | |
24 | -+# $Id: proll.patch,v 1.6 2005-11-11 00:24:57 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 -W -Wall -DPROLBASE=$(PROLBASE) -DPROLDATA=$(PROLDATA) -DPROLRODATA=$(PROLRODATA) -D__ANSI__=1 -I$(SRC) -mcpu=hypersparc -Wa,-xarch=v8 -g -DQEMU -m32 -fno-builtin | |
59 | -+ASFLAGS = -D__ASSEMBLY__ -I$(SRC) -DPROLRODATA=$(PROLRODATA) -DPROLDATA=$(PROLDATA) -DPROLSIZE=$(PROLSIZE) -g -Wa,-xarch=v8 -Wa,-32 | |
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-patch-15/qemu/head.S | |
145 | ---- proll_18.orig/qemu/head.S 1970-01-01 00:00:00.000000000 +0000 | |
146 | -+++ proll-patch-15/qemu/head.S 2005-07-12 22:24:17.000000000 +0000 | |
147 | -@@ -0,0 +1,543 @@ | |
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.6 2005-11-11 00:24:57 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 | -+ .register %g2, #scratch | |
447 | -+ .register %g3, #scratch | |
448 | -+ .register %g6, #scratch | |
449 | -+ .register %g7, #scratch | |
450 | -+ | |
451 | -+goprol: | |
452 | -+ ! %g1 contains end of memory | |
453 | -+ set PHYS_JJ_EEPROM + 0x30, %g1 | |
454 | -+ lda [%g1] ASI_M_BYPASS, %g1 | |
455 | -+ ! map PROLDATA to PROLBASE+PROLSIZE to end of ram | |
456 | -+ set PROLSIZE+0x1000-PROLDATA+PROLBASE, %g2 ! add 0x1000 for temp tables | |
457 | -+ sub %g1, %g2, %g2 ! start of private memory | |
458 | -+ srl %g2, 0x4, %g7 ! ctx table at s+0x0 | |
459 | -+ add %g2, 0x400, %g3 ! l1 table at s+0x400 | |
460 | -+ srl %g3, 0x4, %g3 | |
461 | -+ or %g3, 0x1, %g3 | |
462 | -+ sta %g3, [%g2] ASI_M_BYPASS | |
463 | -+ add %g2, 0x400, %g2 ! s+0x400 | |
464 | -+ add %g2, 0x800, %g3 ! l2 table for ram (00xxxxxx) at s+0x800 | |
465 | -+ srl %g3, 0x4, %g3 | |
466 | -+ or %g3, 0x1, %g3 | |
467 | -+ sta %g3, [%g2] ASI_M_BYPASS | |
468 | -+ add %g2, 0x500, %g3 ! l2 table for rom (ffxxxxxx) at s+0x900 | |
469 | -+ add %g2, 0x3fc, %g2 ! s+0x7fc | |
470 | -+ srl %g3, 0x4, %g3 | |
471 | -+ or %g3, 0x1, %g3 | |
472 | -+ sta %g3, [%g2] ASI_M_BYPASS | |
473 | -+ add %g2, 0x4, %g2 ! s+0x800 | |
474 | -+ set ((7 << 2) | 2), %g3 ! 7 = U: --- S: RWX (main memory) | |
475 | -+ sta %g3, [%g2] ASI_M_BYPASS | |
476 | -+ add %g2, 0x200, %g3 ! l3 table for rom at s+0xa00 | |
477 | -+ add %g2, 0x1d0, %g2 ! s+0x9d0 | |
478 | -+ srl %g3, 0x4, %g3 | |
479 | -+ or %g3, 0x1, %g3 | |
480 | -+ sta %g3, [%g2] ASI_M_BYPASS | |
481 | -+ add %g2, 0x30, %g2 ! s+0xa00 | |
482 | -+ | |
483 | -+ set PROLBASE, %g3 | |
484 | -+ set 0x1000, %g5 | |
485 | -+ set (PROLDATA-PROLBASE)/0x1000, %g6 ! # of .text pages | |
486 | -+1: srl %g3, 0x4, %g4 | |
487 | -+ or %g4, ((7 << 2) | 2), %g4 ! 4 = U: --X S: --X (rom, execute only) | |
488 | -+ sta %g4, [%g2] ASI_M_BYPASS | |
489 | -+ add %g2, 4, %g2 | |
490 | -+ add %g3, %g5, %g3 | |
491 | -+ deccc %g6 | |
492 | -+ bne 1b | |
493 | -+ nop | |
494 | -+#if 0 | |
495 | -+ set (PROLDATA-PROLRODATA)/0x1000, %g6 ! # of .rodata pages | |
496 | -+1: srl %g3, 0x4, %g4 | |
497 | -+ or %g4, ((0 << 2) | 2), %g4 ! 0 = U: R-- S: R-- (rom, read only) | |
498 | -+ sta %g4, [%g2] ASI_M_BYPASS | |
499 | -+ add %g2, 4, %g2 | |
500 | -+ add %g3, %g5, %g3 | |
501 | -+ deccc %g6 | |
502 | -+ bne 1b | |
503 | -+ nop | |
504 | -+#endif | |
505 | -+ set (PROLBASE+PROLSIZE-PROLDATA)/0x1000, %g6 ! # of .bss pages | |
506 | -+ set 0x1000, %g4 | |
507 | -+ sll %g7, 0x4, %g3 | |
508 | -+ add %g4, %g3, %g3 | |
509 | -+1: srl %g3, 0x4, %g4 | |
510 | -+ or %g4, ((7 << 2) | 2), %g4 ! 5 = U: R-- S: RW- (data area, read/write) | |
511 | -+ sta %g4, [%g2] ASI_M_BYPASS | |
512 | -+ add %g2, 4, %g2 | |
513 | -+ add %g3, %g5, %g3 | |
514 | -+ deccc %g6 | |
515 | -+ bne 1b | |
516 | -+ nop | |
517 | -+ | |
518 | -+ mov %g1, %g3 | |
519 | -+ | |
520 | -+ set AC_M_CTPR, %g2 | |
521 | -+ sta %g7, [%g2] ASI_M_MMUREGS ! set ctx table ptr | |
522 | -+ set 1, %g1 | |
523 | -+ sta %g1, [%g0] ASI_M_MMUREGS ! enable mmu | |
524 | -+ | |
525 | -+ /* | |
526 | -+ * The code which enables traps is a simplified version of | |
527 | -+ * kernel head.S. | |
528 | -+ * | |
529 | -+ * We know number of windows as 8 so we do not calculate them. | |
530 | -+ * The deadwood is here for any case. | |
531 | -+ */ | |
532 | -+ | |
533 | -+ /* Turn on Supervisor, EnableFloating, and all the PIL bits. | |
534 | -+ * Also puts us in register window zero with traps off. | |
535 | -+ */ | |
536 | -+ set (PSR_PS | PSR_S | PSR_PIL | PSR_EF), %g2 | |
537 | -+ wr %g2, 0x0, %psr | |
538 | -+ WRITE_PAUSE | |
539 | -+ | |
540 | -+ /* I want a kernel stack NOW! */ | |
541 | -+ set C_LABEL(bootup_user_stack), %g1 | |
542 | -+ set (0x2000 - REGWIN_SZ), %g2 | |
543 | -+ add %g1, %g2, %sp | |
544 | -+ mov 0, %fp /* And for good luck */ | |
545 | -+ | |
546 | -+ /* Zero out our BSS section. */ | |
547 | -+ set C_LABEL(bss_start) , %o0 ! First address of BSS | |
548 | -+ set C_LABEL(end) , %o1 ! Last address of BSS | |
549 | -+ ba 2f | |
550 | -+ nop | |
551 | -+1: | |
552 | -+ st %g0, [%o0] | |
553 | -+2: | |
554 | -+ subcc %o0, %o1, %g0 | |
555 | -+ bl 1b | |
556 | -+ add %o0, 0x4, %o0 | |
557 | -+ | |
558 | -+ mov 2, %g1 | |
559 | -+ wr %g1, 0x0, %wim ! make window 1 invalid | |
560 | -+ WRITE_PAUSE | |
561 | -+ | |
562 | -+#if 0 | |
563 | -+ wr %g0, 0x0, %wim | |
564 | -+ WRITE_PAUSE | |
565 | -+ save | |
566 | -+ rd %psr, %g3 | |
567 | -+ restore | |
568 | -+ and %g3, PSR_CWP, %g3 | |
569 | -+ add %g3, 0x1, %g3 | |
570 | -+#else | |
571 | -+ or %g0, 8, %g3 | |
572 | -+#endif | |
573 | -+ | |
574 | -+#if 0 | |
575 | -+ sethi %hi( C_LABEL(cputyp) ), %o0 | |
576 | -+ st %g7, [%o0 + %lo( C_LABEL(cputyp) )] | |
577 | -+ | |
578 | -+ sethi %hi( C_LABEL(nwindows) ), %g4 | |
579 | -+ st %g3, [%g4 + %lo( C_LABEL(nwindows) )] | |
580 | -+ | |
581 | -+ sub %g3, 0x1, %g3 | |
582 | -+ sethi %hi( C_LABEL(nwindowsm1) ), %g4 | |
583 | -+ st %g3, [%g4 + %lo( C_LABEL(nwindowsm1) )] | |
584 | -+#endif | |
585 | -+ | |
586 | -+ /* Here we go, start using Linux's trap table... */ | |
587 | -+ set C_LABEL(trapbase), %g3 | |
588 | -+ wr %g3, 0x0, %tbr | |
589 | -+ WRITE_PAUSE | |
590 | -+ | |
591 | -+ /* Finally, turn on traps so that we can call c-code. */ | |
592 | -+ rd %psr, %g3 | |
593 | -+ wr %g3, 0x0, %psr | |
594 | -+ WRITE_PAUSE | |
595 | -+ | |
596 | -+ wr %g3, PSR_ET, %psr | |
597 | -+ WRITE_PAUSE | |
598 | -+ | |
599 | -+ .globl prolmain | |
600 | -+ call C_LABEL(prolmain) | |
601 | -+ nop | |
602 | -+ | |
603 | -+3: | |
604 | -+ b 3b | |
605 | -+ nop | |
606 | -+ | |
607 | -+/* | |
608 | -+ * Memory access trap handler | |
609 | -+ * %l0 program %psr from trap table entry | |
610 | -+ * %l1 program %pc from hardware | |
611 | -+ * %l2 program %npc from hardware | |
612 | -+ * %l3 program %wim from trap table entry | |
613 | -+ * %l4 | |
614 | -+ * %l5 | |
615 | -+ * %l6 | |
616 | -+ * %l7 text flag from trap table entry | |
617 | -+ */ | |
618 | -+ | |
619 | -+ .section ".text" | |
620 | -+ .globl srmmu_fault | |
621 | -+C_LABEL(srmmu_fault): | |
622 | -+ | |
623 | -+ set AC_M_SFAR, %l6 | |
624 | -+ set AC_M_SFSR, %l5 | |
625 | -+ lda [%l6] ASI_M_MMUREGS, %l6 | |
626 | -+ lda [%l5] ASI_M_MMUREGS, %l5 | |
627 | -+ | |
628 | -+ set ignore_fault, %l5 | |
629 | -+ ld [%l5], %l5 | |
630 | -+ subcc %l5, %g0, %g0 /* NULL pointer trap faults always */ | |
631 | -+ be 3f | |
632 | -+ nop | |
633 | -+ subcc %l5, %l6, %g0 | |
634 | -+ be 2f | |
635 | -+ nop | |
636 | -+3: | |
637 | -+ | |
638 | -+ set (PHYS_JJ_TCX_FB + 0xbf0), %g5 /* 2 cells from side */ | |
639 | -+ set 0x00ffffff, %g4 | |
640 | -+ sta %g4, [%g5] ASI_M_BYPASS | |
641 | -+ add %g5, 8, %g5 /* On right side */ | |
642 | -+ sta %g4, [%g5] ASI_M_BYPASS | |
643 | -+1: ba 1b; nop | |
644 | -+ | |
645 | -+2: | |
646 | -+ set C_LABEL(fault_ignored), %l5 | |
647 | -+ mov 1, %l6 | |
648 | -+ st %l6, [%l5] | |
649 | -+ | |
650 | -+ /* | |
651 | -+ * Skip the faulting instruction. | |
652 | -+ * I think it works when next instruction is a branch even. | |
653 | -+ */ | |
654 | -+ or %l2, 0, %l1 | |
655 | -+ add %l2, 4, %l2 | |
656 | -+ | |
657 | -+ wr %l0, 0, %psr | |
658 | -+ WRITE_PAUSE | |
659 | -+ jmp %l1 | |
660 | -+ rett %l2 | |
661 | -+ | |
662 | -+/* | |
663 | -+ * Slow external versions of st_bypass and ld_bypass. | |
664 | -+ * rconsole.c uses inlines. We call these in places which are not speed | |
665 | -+ * critical, to avoid compiler bugs. | |
666 | -+ */ | |
667 | -+ .globl C_LABEL(st_bypass) | |
668 | -+C_LABEL(st_bypass): | |
669 | -+ retl | |
670 | -+ sta %o1, [%o0] ASI_M_BYPASS | |
671 | -+ .globl C_LABEL(ld_bypass) | |
672 | -+C_LABEL(ld_bypass): | |
673 | -+ retl | |
674 | -+ lda [%o0] ASI_M_BYPASS, %o0 | |
675 | -+ .globl C_LABEL(sth_bypass) | |
676 | -+C_LABEL(sth_bypass): | |
677 | -+ retl | |
678 | -+ stha %o1, [%o0] ASI_M_BYPASS | |
679 | -+ .globl C_LABEL(ldh_bypass) | |
680 | -+C_LABEL(ldh_bypass): | |
681 | -+ retl | |
682 | -+ lduha [%o0] ASI_M_BYPASS, %o0 | |
683 | -+ .globl C_LABEL(stb_bypass) | |
684 | -+C_LABEL(stb_bypass): | |
685 | -+ retl | |
686 | -+ stba %o1, [%o0] ASI_M_BYPASS | |
687 | -+ .globl C_LABEL(ldb_bypass) | |
688 | -+C_LABEL(ldb_bypass): | |
689 | -+ retl | |
690 | -+ lduba [%o0] ASI_M_BYPASS, %o0 | |
691 | -diff -ruN proll_18.orig/qemu/main.c proll-patch-15/qemu/main.c | |
692 | ---- proll_18.orig/qemu/main.c 1970-01-01 00:00:00.000000000 +0000 | |
693 | -+++ proll-patch-15/qemu/main.c 2005-08-14 10:07:48.000000000 +0000 | |
694 | -@@ -0,0 +1,185 @@ | |
695 | -+/** | |
696 | -+ ** Proll (PROM replacement) | |
697 | -+ ** Copyright 1999 Pete Zaitcev | |
698 | -+ ** This code is licensed under GNU General Public License. | |
699 | -+ **/ | |
700 | -+#include <stdarg.h> | |
701 | -+ | |
702 | -+// #include <asm/contregs.h> | |
703 | -+#include <asi.h> | |
704 | -+#include "pgtsrmmu.h" | |
705 | -+#include "iommu.h" /* Typical SBus IOMMU for sun4m */ | |
706 | -+#include "phys_jj.h" | |
707 | -+#include "vconsole.h" | |
708 | -+#include "version.h" | |
709 | -+#include <general.h> /* __P() */ | |
710 | -+#include <net.h> /* init_net() */ | |
711 | -+#include <romlib.h> /* we are a provider for part of this. */ | |
712 | -+#include <netpriv.h> /* myipaddr */ | |
713 | -+#include <arpa.h> | |
714 | -+#include <system.h> /* our own prototypes */ | |
715 | -+ | |
716 | -+void *init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, const char *cmdline, char boot_device, int nographic); | |
717 | -+int vcon_zs_init(struct vconterm *t, unsigned int a0); | |
718 | -+int vcon_zs_write(struct vconterm *t, char *data, int leng); | |
719 | -+int vcon_zs_getch(struct vconterm *t); | |
720 | -+void esp_probe(); | |
721 | -+int esp_boot(int unit); | |
722 | -+static void init_idprom(void); | |
723 | -+ | |
724 | -+struct vconterm dp0; | |
725 | -+struct mem cmem; /* Current memory, virtual */ | |
726 | -+struct mem cio; /* Current I/O space */ | |
727 | -+struct phym pmem; /* Current phys. mem. */ | |
728 | -+struct iommu ciommu; /* Our IOMMU on sun4m */ | |
729 | -+ | |
730 | -+static struct { | |
731 | -+ const char id[16]; | |
732 | -+ unsigned int version; | |
733 | -+ char pad1[0x1c]; // Pad to 0x30 | |
734 | -+ unsigned int ram_size; | |
735 | -+ char boot_device; | |
736 | -+ unsigned int load_addr, kernel_size; | |
737 | -+ unsigned int cmdline, cmdline_len; | |
738 | -+ char pad2[0x0c]; // Pad to 0x54 | |
739 | -+ unsigned short width, height, depth; | |
740 | -+} *hw_idprom; | |
741 | -+ | |
742 | -+int ignore_fault, fault_ignored; | |
743 | -+void *printk_fn, *getch_fn; | |
744 | -+unsigned int q_height, q_width; | |
745 | -+ | |
746 | -+/* | |
747 | -+ */ | |
748 | -+void prolmain() | |
749 | -+{ | |
750 | -+ static char fname[14]; | |
751 | -+ static struct banks bb; | |
752 | -+ unsigned int hiphybas; | |
753 | -+ const void *romvec; | |
754 | -+ unsigned int ram_size; | |
755 | -+ char nographic, bootdev; | |
756 | -+ | |
757 | -+ nographic = ldb_bypass(PHYS_JJ_EEPROM + 0x2F); | |
758 | -+ if (!nographic) { | |
759 | -+ q_width = ldh_bypass(PHYS_JJ_EEPROM + 0x54); | |
760 | -+ q_height = ldh_bypass(PHYS_JJ_EEPROM + 0x56); | |
761 | -+ vcon_init(&dp0, PHYS_JJ_TCX_FB); | |
762 | -+ printk_fn = vcon_write; | |
763 | -+ getch_fn = vcon_getch; | |
764 | -+ } | |
765 | -+ else { | |
766 | -+ vcon_zs_init(&dp0, 0x71100004); | |
767 | -+ printk_fn = vcon_zs_write; | |
768 | -+ getch_fn = vcon_zs_getch; | |
769 | -+ } | |
770 | -+ | |
771 | -+ | |
772 | -+ printk("PROLL %s QEMU\n", PROLL_VERSION_STRING); | |
773 | -+ ram_size = ld_bypass(PHYS_JJ_EEPROM + 0x30); | |
774 | -+ printk("%d MB total\n", ram_size/(1024*1024)); | |
775 | -+ | |
776 | -+ bb.nbanks = 1; | |
777 | -+ bb.bankv[0].start = 0; | |
778 | -+ bb.bankv[0].length = ram_size; | |
779 | -+ | |
780 | -+ hiphybas = ram_size - PROLSIZE; | |
781 | -+ | |
782 | -+ mem_init(&cmem, (char *) &_end, (char *)(PROLBASE+PROLSIZE)); | |
783 | -+ makepages(&pmem, hiphybas); | |
784 | -+ init_mmu_swift((unsigned int)pmem.pctp - PROLBASE + hiphybas); | |
785 | -+ | |
786 | -+ mem_init(&cio, (char *)(PROLBASE+PROLSIZE), | |
787 | -+ (char *)(PROLBASE+PROLSIZE+IOMAPSIZE)); | |
788 | -+ | |
789 | -+ iommu_init(&ciommu, hiphybas); | |
790 | -+ | |
791 | -+ /* | |
792 | -+ */ | |
793 | -+ init_idprom(); | |
794 | -+ printk("NVRAM: id %s version %d\n", hw_idprom->id, hw_idprom->version); | |
795 | -+ if (!nographic) | |
796 | -+ printk("Prom console: TCX %dx%d\n", q_width, q_height); | |
797 | -+ else | |
798 | -+ printk("Prom console: serial\n"); | |
799 | -+ sched_init(); | |
800 | -+ le_probe(); | |
801 | -+ init_net(); | |
802 | -+ esp_probe(); | |
803 | -+ | |
804 | -+ bootdev = hw_idprom->boot_device; | |
805 | -+ printk("Boot device: %c\n", bootdev); | |
806 | -+ if (hw_idprom->kernel_size > 0) { | |
807 | -+ printk("Kernel already loaded\n"); | |
808 | -+ } else if (bootdev == 'n') { | |
809 | -+ if (bootp() != 0) fatal(); | |
810 | -+ /* | |
811 | -+ * boot_rec.bp_file cannot be used because system PROM | |
812 | -+ * uses it to locate ourselves. If we load from boot_rec.bp_file, | |
813 | -+ * we will loop reloading PROLL over and over again. | |
814 | -+ * Thus we use traditional PROLL scheme HEXIPADDR.PROL (single L). | |
815 | -+ */ | |
816 | -+ xtoa(myipaddr, fname, 8); | |
817 | -+ fname[9] = '.'; | |
818 | -+ fname[10] = 'P'; | |
819 | -+ fname[11] = 'R'; | |
820 | -+ fname[12] = 'O'; | |
821 | -+ fname[13] = 'L'; | |
822 | -+ fname[14] = 0; | |
823 | -+ | |
824 | -+ if (load(boot_rec.bp_siaddr, fname) != 0) fatal(); | |
825 | -+ } else if (bootdev == 'c') { | |
826 | -+ if (esp_boot(0) != 0) fatal(); | |
827 | -+ } else if (bootdev == 'd') { | |
828 | -+ if (esp_boot(2) != 0) fatal(); | |
829 | -+ } | |
830 | -+ | |
831 | -+ romvec = init_openprom_qemu(bb.nbanks, bb.bankv, hiphybas, | |
832 | -+ (void *)hw_idprom->cmdline, hw_idprom->boot_device, nographic); | |
833 | -+ | |
834 | -+ printk("Memory used: virt 0x%x:0x%x[%dK] iomap 0x%x:0x%x\n", | |
835 | -+ PROLBASE, (int)cmem.curp, ((unsigned) cmem.curp - PROLBASE)/1024, | |
836 | -+ (int)cio.start, (int)cio.curp); | |
837 | -+ | |
838 | -+ { | |
839 | -+ void (*entry)(const void *, int, int, int, int) = (void *) hw_idprom->load_addr; | |
840 | -+ printk("Kernel loaded at 0x%x, size %dK, command line = '%s'\n", | |
841 | -+ *entry, hw_idprom->kernel_size/1024, hw_idprom->cmdline); | |
842 | -+ entry(romvec, 0, 0, 0, 0); | |
843 | -+ } | |
844 | -+ | |
845 | -+ mem_fini(&cmem); | |
846 | -+ vcon_fini(&dp0); | |
847 | -+} | |
848 | -+ | |
849 | -+/* | |
850 | -+ * dvma_alloc over iommu_alloc. | |
851 | -+ */ | |
852 | -+void *dvma_alloc(int size, unsigned int *pphys) | |
853 | -+{ | |
854 | -+ return iommu_alloc(&ciommu, size, pphys); | |
855 | -+} | |
856 | -+ | |
857 | -+/* | |
858 | -+ */ | |
859 | -+void udelay(__attribute__((unused)) unsigned long usecs) | |
860 | -+{ | |
861 | -+ // Qemu hardware is perfect and does not need any delays! | |
862 | -+} | |
863 | -+ | |
864 | -+static void init_idprom() | |
865 | -+{ | |
866 | -+ void *va_prom; | |
867 | -+ | |
868 | -+ if ((va_prom = map_io(PHYS_JJ_EEPROM, PHYS_JJ_EEPROM_SIZE)) == NULL) { | |
869 | -+ printk("init_idprom: cannot map eeprom\n"); | |
870 | -+ fatal(); | |
871 | -+ } | |
872 | -+ bcopy(va_prom + PHYS_JJ_IDPROM_OFF, idprom, IDPROM_SIZE); | |
873 | -+ /* | |
874 | -+ * hw_idprom is not used anywhere. | |
875 | -+ * It's just as we hate to leave hanging pointers (I/O page here). | |
876 | -+ */ | |
877 | -+ hw_idprom = va_prom; | |
878 | -+} | |
879 | -+ | |
880 | -diff -ruN proll_18.orig/qemu/openprom.c proll-patch-15/qemu/openprom.c | |
881 | ---- proll_18.orig/qemu/openprom.c 1970-01-01 00:00:00.000000000 +0000 | |
882 | -+++ proll-patch-15/qemu/openprom.c 2005-11-07 20:11:04.000000000 +0000 | |
883 | -@@ -0,0 +1,910 @@ | |
884 | -+/* | |
885 | -+ * PROM interface support | |
886 | -+ * Copyright 1996 The Australian National University. | |
887 | -+ * Copyright 1996 Fujitsu Laboratories Limited | |
888 | -+ * Copyright 1999 Pete A. Zaitcev | |
889 | -+ * This software may be distributed under the terms of the Gnu | |
890 | -+ * Public License version 2 or later | |
891 | -+ */ | |
892 | -+ | |
893 | -+#include <openprom.h> | |
894 | -+#include <general.h> | |
895 | -+#include <romlib.h> | |
896 | -+#include <system.h> | |
897 | -+#include <vconsole.h> | |
898 | -+#include "phys_jj.h" | |
899 | -+ | |
900 | -+//#define DEBUG_OBP | |
901 | -+ | |
902 | -+#define PAGE_SIZE 4096 | |
903 | -+ | |
904 | -+struct property { | |
905 | -+ const char *name; | |
906 | -+ const char *value; | |
907 | -+ int length; | |
908 | -+}; | |
909 | -+ | |
910 | -+struct node { | |
911 | -+ const struct property *properties; | |
912 | -+ /* short */ const int sibling; | |
913 | -+ /* short */ const int child; | |
914 | -+}; | |
915 | -+ | |
916 | -+static int obp_nextnode(int node); | |
917 | -+static int obp_child(int node); | |
918 | -+static int obp_proplen(int node, char *name); | |
919 | -+static int obp_getprop(int node, char *name, char *val); | |
920 | -+static int obp_setprop(int node, char *name, char *val, int len); | |
921 | -+static const char *obp_nextprop(int node, char *name); | |
922 | -+ | |
923 | -+static char obp_idprom[IDPROM_SIZE]; | |
924 | -+static const struct property null_properties = { NULL, NULL, -1 }; | |
925 | -+static const int prop_true = -1; | |
926 | -+ | |
927 | -+static struct property propv_root[7]; | |
928 | -+ | |
929 | -+static const struct property propv_root_templ[] = { | |
930 | -+ {"name", "SUNW,SparcStation-5", sizeof("SUNW,SparcStation-5") }, | |
931 | -+ {"idprom", obp_idprom, IDPROM_SIZE}, | |
932 | -+ {"banner-name", "SparcStation", sizeof("SparcStation")}, | |
933 | -+ {"compatible", "sun4m", 6}, | |
934 | -+}; | |
935 | -+ | |
936 | -+static const int prop_iommu_reg[] = { | |
937 | -+ 0x0, 0x10000000, 0x00000300, | |
938 | -+}; | |
939 | -+static const struct property propv_iommu[] = { | |
940 | -+ {"name", "iommu", sizeof("iommu")}, | |
941 | -+ {"reg", (char*)&prop_iommu_reg[0], sizeof(prop_iommu_reg) }, | |
942 | -+ {NULL, NULL, -1} | |
943 | -+}; | |
944 | -+ | |
945 | -+static const int prop_sbus_ranges[] = { | |
946 | -+ 0x0, 0x0, 0x0, 0x30000000, 0x10000000, | |
947 | -+ 0x1, 0x0, 0x0, 0x40000000, 0x10000000, | |
948 | -+ 0x2, 0x0, 0x0, 0x50000000, 0x10000000, | |
949 | -+ 0x3, 0x0, 0x0, 0x60000000, 0x10000000, | |
950 | -+ 0x4, 0x0, 0x0, 0x70000000, 0x10000000, | |
951 | -+}; | |
952 | -+static const struct property propv_sbus[] = { | |
953 | -+ {"name", "sbus", 5}, | |
954 | -+ {"ranges", (char*)&prop_sbus_ranges[0], sizeof(prop_sbus_ranges)}, | |
955 | -+ {"device_type", "hierarchical", sizeof("hierarchical") }, | |
956 | -+ {NULL, NULL, -1} | |
957 | -+}; | |
958 | -+ | |
959 | -+static const int prop_tcx_regs[] = { | |
960 | -+ 0x2, 0x00800000, 0x00100000, | |
961 | -+ 0x2, 0x02000000, 0x00000001, | |
962 | -+ 0x2, 0x04000000, 0x00800000, | |
963 | -+ 0x2, 0x06000000, 0x00800000, | |
964 | -+ 0x2, 0x0a000000, 0x00000001, | |
965 | -+ 0x2, 0x0c000000, 0x00000001, | |
966 | -+ 0x2, 0x0e000000, 0x00000001, | |
967 | -+ 0x2, 0x00700000, 0x00001000, | |
968 | -+ 0x2, 0x00200000, 0x00000004, | |
969 | -+ 0x2, 0x00300000, 0x0000081c, | |
970 | -+ 0x2, 0x00000000, 0x00010000, | |
971 | -+ 0x2, 0x00240000, 0x00000004, | |
972 | -+ 0x2, 0x00280000, 0x00000001, | |
973 | -+}; | |
974 | -+ | |
975 | -+#if 1 /* Zaitcev */ | |
976 | -+static const int pixfreq = 0x03dfd240; | |
977 | -+static const int hbporch = 0xa0; | |
978 | -+static const int vfreq = 0x3c; | |
979 | -+#endif | |
980 | -+#if 0 /* Kevin Boone - 70Hz refresh */ | |
981 | -+static const int pixfreq = 0x047868C0; | |
982 | -+static const int hbporch = 0x90; | |
983 | -+static const int vfreq = 0x46; | |
984 | -+#endif | |
985 | -+ | |
986 | -+static const int vbporch = 0x1d; | |
987 | -+static const int vsync = 0x6; | |
988 | -+static const int hsync = 0x88; | |
989 | -+static const int vfporch = 0x3; | |
990 | -+static const int hfporch = 0x18; | |
991 | -+static const int height = 0x300; | |
992 | -+static const int width = 0x400; | |
993 | -+static const int linebytes = 0x400; | |
994 | -+static const int depth = 24; | |
995 | -+static const int tcx_intr[] = { 5, 0 }; | |
996 | -+static const int tcx_interrupts = 5; | |
997 | -+static const struct property propv_sbus_tcx[] = { | |
998 | -+ {"name", "SUNW,tcx", sizeof("SUNW,tcx")}, | |
999 | -+ {"vbporch", (char*)&vbporch, sizeof(int)}, | |
1000 | -+ {"hbporch", (char*)&hbporch, sizeof(int)}, | |
1001 | -+ {"vsync", (char*)&vsync, sizeof(int)}, | |
1002 | -+ {"hsync", (char*)&hsync, sizeof(int)}, | |
1003 | -+ {"vfporch", (char*)&vfporch, sizeof(int)}, | |
1004 | -+ {"hfporch", (char*)&hfporch, sizeof(int)}, | |
1005 | -+ {"pixfreq", (char*)&pixfreq, sizeof(int)}, | |
1006 | -+ {"vfreq", (char*)&vfreq, sizeof(int)}, | |
1007 | -+ {"height", (char*)&height, sizeof(int)}, | |
1008 | -+ {"width", (char*)&width, sizeof(int)}, | |
1009 | -+ {"linebytes", (char*)&linebytes, sizeof(int)}, | |
1010 | -+ {"depth", (char*)&depth, sizeof(int)}, | |
1011 | -+ {"reg", (char*)&prop_tcx_regs[0], sizeof(prop_tcx_regs)}, | |
1012 | -+ {"tcx-8-bit", 0, -1}, | |
1013 | -+ {"intr", (char*)&tcx_intr[0], sizeof(tcx_intr)}, | |
1014 | -+ {"interrupts", (char*)&tcx_interrupts, sizeof(tcx_interrupts)}, | |
1015 | -+ {"device_type", "display", sizeof("display")}, | |
1016 | -+ {NULL, NULL, -1} | |
1017 | -+}; | |
1018 | -+ | |
1019 | -+static const int prop_cs4231_reg[] = { | |
1020 | -+ 0x3, 0x0C000000, 0x00000040 | |
1021 | -+}; | |
1022 | -+static const int cs4231_interrupts = 5; | |
1023 | -+static const int cs4231_intr[] = { 5, 0 }; | |
1024 | -+ | |
1025 | -+static const struct property propv_sbus_cs4231[] = { | |
1026 | -+ {"name", "SUNW,CS4231", sizeof("SUNW,CS4231") }, | |
1027 | -+ {"intr", (char*)&cs4231_intr[0], sizeof(cs4231_intr) }, | |
1028 | -+ {"interrupts", (char*)&cs4231_interrupts, sizeof(cs4231_interrupts) }, | |
1029 | -+ {"reg", (char*)&prop_cs4231_reg[0], sizeof(prop_cs4231_reg) }, | |
1030 | -+ {"device_type", "serial", sizeof("serial") }, | |
1031 | -+ {"alias", "audio", sizeof("audio") }, | |
1032 | -+ {NULL, NULL, -1} | |
1033 | -+}; | |
1034 | -+ | |
1035 | -+static const int cpu_nctx = NCTX_SWIFT; | |
1036 | -+static const int cpu_cache_line_size = 0x20; | |
1037 | -+static const int cpu_cache_nlines = 0x200; | |
1038 | -+static const struct property propv_cpu[] = { | |
1039 | -+ {"name", "STP1012PGA", sizeof("STP1012PGA") }, | |
1040 | -+ {"device_type", "cpu", 4 }, | |
1041 | -+ {"mmu-nctx", (char*)&cpu_nctx, sizeof(int)}, | |
1042 | -+ {"cache-line-size", (char*)&cpu_cache_line_size, sizeof(int)}, | |
1043 | -+ {"cache-nlines", (char*)&cpu_cache_nlines, sizeof(int)}, | |
1044 | -+ {NULL, NULL, -1} | |
1045 | -+}; | |
1046 | -+ | |
1047 | -+static const int prop_obio_ranges[] = { | |
1048 | -+ 0x0, 0x0, 0x0, 0x71000000, 0x01000000, | |
1049 | -+}; | |
1050 | -+static const struct property propv_obio[] = { | |
1051 | -+ {"name", "obio", 5 }, | |
1052 | -+ {"ranges", (char*)&prop_obio_ranges[0], sizeof(prop_obio_ranges) }, | |
1053 | -+ {"device_type", "hierarchical", sizeof("hierarchical") }, | |
1054 | -+ {NULL, NULL, -1} | |
1055 | -+}; | |
1056 | -+ | |
1057 | -+static const int prop_auxio_reg[] = { | |
1058 | -+ 0x0, 0x00900000, 0x00000001, | |
1059 | -+}; | |
1060 | -+static const struct property propv_obio_auxio[] = { | |
1061 | -+ {"name", "auxio", sizeof("auxio") }, | |
1062 | -+ {"reg", (char*)&prop_auxio_reg[0], sizeof(prop_auxio_reg) }, | |
1063 | -+ {NULL, NULL, -1} | |
1064 | -+}; | |
1065 | -+ | |
1066 | -+static const int prop_int_reg[] = { | |
1067 | -+ 0x0, 0x00e00000, 0x00000010, | |
1068 | -+ 0x0, 0x00e10000, 0x00000010, | |
1069 | -+}; | |
1070 | -+static const struct property propv_obio_int[] = { | |
1071 | -+ {"name", "interrupt", sizeof("interrupt")}, | |
1072 | -+ {"reg", (char*)&prop_int_reg[0], sizeof(prop_int_reg) }, | |
1073 | -+ {NULL, NULL, -1} | |
1074 | -+}; | |
1075 | -+ | |
1076 | -+static const int prop_cnt_reg[] = { | |
1077 | -+ 0x0, 0x00d00000, 0x00000010, | |
1078 | -+ 0x0, 0x00d10000, 0x00000010, | |
1079 | -+}; | |
1080 | -+static const struct property propv_obio_cnt[] = { | |
1081 | -+ {"name", "counter", sizeof("counter")}, | |
1082 | -+ {"reg", (char*)&prop_cnt_reg[0], sizeof(prop_cnt_reg) }, | |
1083 | -+ {NULL, NULL, -1} | |
1084 | -+}; | |
1085 | -+ | |
1086 | -+static const int prop_eeprom_reg[] = { | |
1087 | -+ 0x0, 0x00200000, 0x00002000, | |
1088 | -+}; | |
1089 | -+static const struct property propv_obio_eep[] = { | |
1090 | -+ {"name", "eeprom", sizeof("eeprom")}, | |
1091 | -+ {"reg", (char*)&prop_eeprom_reg[0], sizeof(prop_eeprom_reg) }, | |
1092 | -+ {"model", "mk48t08", sizeof("mk48t08")}, | |
1093 | -+ {NULL, NULL, -1} | |
1094 | -+}; | |
1095 | -+ | |
1096 | -+static const int prop_su_reg[] = { | |
1097 | -+ 0x0, 0x003002f8, 0x00000008, | |
1098 | -+}; | |
1099 | -+static const struct property propv_obio_su[] = { | |
1100 | -+ {"name", "su", sizeof("su")}, | |
1101 | -+ {"reg", (char*)&prop_su_reg[0], sizeof(prop_su_reg) }, | |
1102 | -+ {NULL, NULL, -1} | |
1103 | -+}; | |
1104 | -+ | |
1105 | -+static const int prop_zs_intr[] = { 0x2c, 0x0 }; | |
1106 | -+static const int prop_zs_reg[] = { | |
1107 | -+ 0x0, 0x00000000, 0x00000008, | |
1108 | -+}; | |
1109 | -+static void *prop_zs_addr; | |
1110 | -+static const int prop_zs_slave = 1; | |
1111 | -+static const struct property propv_obio_zs[] = { | |
1112 | -+ {"name", "zs", sizeof("zs")}, | |
1113 | -+ {"reg", (char*)&prop_zs_reg[0], sizeof(prop_zs_reg) }, | |
1114 | -+ {"slave", (char*)&prop_zs_slave, sizeof(prop_zs_slave) }, | |
1115 | -+ {"device_type", "serial", sizeof("serial") }, | |
1116 | -+ {"intr", (char*)&prop_zs_intr[0], sizeof(prop_zs_intr) }, | |
1117 | -+ {"address", (char*)&prop_zs_addr, sizeof(prop_zs_addr) }, | |
1118 | -+ {"keyboard", (char*)&prop_true, 0}, | |
1119 | -+ {"mouse", (char*)&prop_true, 0}, | |
1120 | -+ {NULL, NULL, -1} | |
1121 | -+}; | |
1122 | -+ | |
1123 | -+static const int prop_zs1_intr[] = { 0x2c, 0x0 }; | |
1124 | -+static const int prop_zs1_reg[] = { | |
1125 | -+ 0x0, 0x00100000, 0x00000008, | |
1126 | -+}; | |
1127 | -+static void *prop_zs1_addr; | |
1128 | -+static const int prop_zs1_slave = 0; | |
1129 | -+static const struct property propv_obio_zs1[] = { | |
1130 | -+ {"name", "zs", sizeof("zs")}, | |
1131 | -+ {"reg", (char*)&prop_zs1_reg[0], sizeof(prop_zs1_reg) }, | |
1132 | -+ {"slave", (char*)&prop_zs1_slave, sizeof(prop_zs1_slave) }, | |
1133 | -+ {"device_type", "serial", sizeof("serial") }, | |
1134 | -+ {"intr", (char*)&prop_zs1_intr[0], sizeof(prop_zs1_intr) }, | |
1135 | -+ {"address", (char*)&prop_zs1_addr, sizeof(prop_zs1_addr) }, | |
1136 | -+ {NULL, NULL, -1} | |
1137 | -+}; | |
1138 | -+ | |
1139 | -+static const int prop_ledma_reg[] = { | |
1140 | -+ 0x4, 0x08400010, 0x00000020, | |
1141 | -+}; | |
1142 | -+static const int prop_ledma_burst = 0x3f; | |
1143 | -+static const struct property propv_sbus_ledma[] = { | |
1144 | -+ {"name", "ledma", sizeof("ledma")}, | |
1145 | -+ {"reg", (char*)&prop_ledma_reg[0], sizeof(prop_ledma_reg) }, | |
1146 | -+ {"burst-sizes", (char*)&prop_ledma_burst, sizeof(int) }, | |
1147 | -+ {NULL, NULL, -1} | |
1148 | -+}; | |
1149 | -+ | |
1150 | -+static const int prop_le_reg[] = { | |
1151 | -+ 0x4, 0x08c00000, 0x00000004, | |
1152 | -+}; | |
1153 | -+static const int prop_le_busmaster_regval = 0x7; | |
1154 | -+static const int prop_le_intr[] = { 0x26, 0x0 }; | |
1155 | -+static const struct property propv_sbus_ledma_le[] = { | |
1156 | -+ {"name", "le", sizeof("le")}, | |
1157 | -+ {"reg", (char*)&prop_le_reg[0], sizeof(prop_le_reg) }, | |
1158 | -+ {"busmaster-regval", (char*)&prop_le_busmaster_regval, sizeof(int)}, | |
1159 | -+ {"intr", (char*)&prop_le_intr[0], sizeof(prop_le_intr) }, | |
1160 | -+ {NULL, NULL, -1} | |
1161 | -+}; | |
1162 | -+ | |
1163 | -+static const int prop_espdma_reg[] = { | |
1164 | -+ 0x4, 0x08400000, 0x00000010, | |
1165 | -+}; | |
1166 | -+ | |
1167 | -+static const struct property propv_sbus_espdma[] = { | |
1168 | -+ {"name", "espdma", sizeof("espdma")}, | |
1169 | -+ {"reg", (char*)&prop_espdma_reg[0], sizeof(prop_espdma_reg) }, | |
1170 | -+ {NULL, NULL, -1} | |
1171 | -+}; | |
1172 | -+ | |
1173 | -+static const int prop_esp_reg[] = { | |
1174 | -+ 0x4, 0x08800000, 0x00000040, | |
1175 | -+}; | |
1176 | -+static const int prop_esp_intr[] = { 0x24, 0x0 }; | |
1177 | -+static const struct property propv_sbus_espdma_esp[] = { | |
1178 | -+ {"name", "esp", sizeof("esp")}, | |
1179 | -+ {"reg", (char*)&prop_esp_reg[0], sizeof(prop_esp_reg) }, | |
1180 | -+ {"intr", (char*)&prop_esp_intr[0], sizeof(prop_esp_intr) }, | |
1181 | -+ {NULL, NULL, -1} | |
1182 | -+}; | |
1183 | -+ | |
1184 | -+static const int prop_bpp_reg[] = { | |
1185 | -+ 0x4, 0x0c800000, 0x0000001c, | |
1186 | -+}; | |
1187 | -+static const int prop_bpp_intr[] = { 0x33, 0x0 }; | |
1188 | -+static const struct property propv_sbus_bpp[] = { | |
1189 | -+ {"name", "SUNW,bpp", sizeof("SUNW,bpp")}, | |
1190 | -+ {"reg", (char*)&prop_bpp_reg[0], sizeof(prop_bpp_reg) }, | |
1191 | -+ {"intr", (char*)&prop_bpp_intr[0], sizeof(prop_bpp_intr) }, | |
1192 | -+ {NULL, NULL, -1} | |
1193 | -+}; | |
1194 | -+ | |
1195 | -+static const int prop_apc_reg[] = { | |
1196 | -+ 0x4, 0x0a000000, 0x00000010, | |
1197 | -+}; | |
1198 | -+static const struct property propv_sbus_apc[] = { | |
1199 | -+ {"name", "xxxpower-management", sizeof("xxxpower-management")}, | |
1200 | -+ {"reg", (char*)&prop_apc_reg[0], sizeof(prop_apc_reg) }, | |
1201 | -+ {NULL, NULL, -1} | |
1202 | -+}; | |
1203 | -+ | |
1204 | -+static const int prop_fd_intr[] = { 0x2b, 0x0 }; | |
1205 | -+static const int prop_fd_reg[] = { | |
1206 | -+ 0x0, 0x00400000, 0x0000000f, | |
1207 | -+}; | |
1208 | -+static const struct property propv_obio_fd[] = { | |
1209 | -+ {"name", "SUNW,fdtwo", sizeof("SUNW,fdtwo")}, | |
1210 | -+ {"reg", (char*)&prop_fd_reg[0], sizeof(prop_fd_reg) }, | |
1211 | -+ {"device_type", "block", sizeof("block") }, | |
1212 | -+ {"intr", (char*)&prop_fd_intr[0], sizeof(prop_fd_intr) }, | |
1213 | -+ {NULL, NULL, -1} | |
1214 | -+}; | |
1215 | -+ | |
1216 | -+static const int prop_pw_intr[] = { 0x22, 0x0 }; | |
1217 | -+static const int prop_pw_reg[] = { | |
1218 | -+ 0x0, 0x00910000, 0x00000001, | |
1219 | -+}; | |
1220 | -+static const struct property propv_obio_pw[] = { | |
1221 | -+ {"name", "power", sizeof("power")}, | |
1222 | -+ {"reg", (char*)&prop_pw_reg[0], sizeof(prop_pw_reg) }, | |
1223 | -+ {"intr", (char*)&prop_pw_intr[0], sizeof(prop_pw_intr) }, | |
1224 | -+ {NULL, NULL, -1} | |
1225 | -+}; | |
1226 | -+ | |
1227 | -+static const int prop_cf_reg[] = { | |
1228 | -+ 0x0, 0x00800000, 0x00000001, | |
1229 | -+}; | |
1230 | -+static const struct property propv_obio_cf[] = { | |
1231 | -+ {"name", "slavioconfig", sizeof("slavioconfig")}, | |
1232 | -+ {"reg", (char*)&prop_cf_reg[0], sizeof(prop_cf_reg) }, | |
1233 | -+ {NULL, NULL, -1} | |
1234 | -+}; | |
1235 | -+ | |
1236 | -+static const struct property propv_options[] = { | |
1237 | -+ {"name", "options", sizeof("options")}, | |
1238 | -+ {"screen-#columns", "80", sizeof("80")}, | |
1239 | -+ {"screen-#rows", "25", sizeof("25")}, | |
1240 | -+ {"tpe-link-test?", (char *)&prop_true, 0}, | |
1241 | -+ {"ttya-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")}, | |
1242 | -+ {"ttya-ignore-cd", (char *)&prop_true, 0}, | |
1243 | -+ {"ttya-rts-dtr-off", 0, -1}, | |
1244 | -+ {"ttyb-mode", "9600,8,n,1,-", sizeof("9600,8,n,1,-")}, | |
1245 | -+ {"ttyb-ignore-cd", (char *)&prop_true, 0}, | |
1246 | -+ {"ttyb-rts-dtr-off", 0, -1}, | |
1247 | -+ {NULL, NULL, -1} | |
1248 | -+}; | |
1249 | -+ | |
1250 | -+static int prop_mem_reg[3]; | |
1251 | -+static int prop_mem_avail[3]; | |
1252 | -+ | |
1253 | -+static const struct property propv_memory[] = { | |
1254 | -+ {"name", "memory", sizeof("memory")}, | |
1255 | -+ {"reg", (char*)&prop_mem_reg[0], sizeof(prop_mem_reg) }, | |
1256 | -+ {"available", (char*)&prop_mem_avail[0], sizeof(prop_mem_avail) }, | |
1257 | -+ {NULL, NULL, -1} | |
1258 | -+}; | |
1259 | -+ | |
1260 | -+static int prop_vmem_avail[6]; | |
1261 | -+ | |
1262 | -+static const struct property propv_vmemory[] = { | |
1263 | -+ {"name", "virtual-memory", sizeof("virtual-memory")}, | |
1264 | -+ {"available", (char*)&prop_vmem_avail[0], sizeof(prop_vmem_avail) }, | |
1265 | -+ {NULL, NULL, -1} | |
1266 | -+}; | |
1267 | -+ | |
1268 | -+static const struct node nodes[] = { | |
1269 | -+ { &null_properties, 1, 0 }, /* 0 = big brother of root */ | |
1270 | -+ { propv_root, 0, 2 }, /* 1 "/" */ | |
1271 | -+ { propv_iommu, 12, 3 }, /* 2 "/iommu" */ | |
1272 | -+ { propv_sbus, 0, 4 }, /* 3 "/iommu/sbus" */ | |
1273 | -+ { propv_sbus_tcx, 5, 0 }, /* 4 "/iommu/sbus/SUNW,tcx" */ | |
1274 | -+ { propv_sbus_ledma, 7, 6 }, /* 5 "/iommu/sbus/ledma" */ | |
1275 | -+ { propv_sbus_ledma_le, 0, 0 }, /* 6 "/iommu/sbus/ledma/le" */ | |
1276 | -+ { propv_sbus_cs4231, 8, 0 }, /* 7 "/iommu/sbus/SUNW,CS4231 */ | |
1277 | -+ { propv_sbus_bpp, 9, 0 }, /* 8 "/iommu/sbus/SUNW,bpp */ | |
1278 | -+ { propv_sbus_espdma, 11, 10 }, /* 9 "/iommu/sbus/espdma" */ | |
1279 | -+ { propv_sbus_espdma_esp, 0, 0 }, /* 10 "/iommu/sbus/espdma/esp" */ | |
1280 | -+ { propv_sbus_apc, 0, 0 }, /* 11 "/iommu/sbus/power-management */ | |
1281 | -+ { propv_cpu, 13, 0 }, /* 12 "/STP1012PGA" */ | |
1282 | -+ { propv_obio, 23, 14 }, /* 13 "/obio" */ | |
1283 | -+ { propv_obio_int, 15, 0 }, /* 14 "/obio/interrupt" */ | |
1284 | -+ { propv_obio_cnt, 16, 0 }, /* 15 "/obio/counter" */ | |
1285 | -+ { propv_obio_eep, 17, 0 }, /* 16 "/obio/eeprom" */ | |
1286 | -+ { propv_obio_auxio, 18, 0 }, /* 17 "/obio/auxio" */ | |
1287 | -+ { propv_obio_zs1, 19, 0 }, /* 18 "/obio/zs@0,100000" | |
1288 | -+ Must be before zs@0,0! */ | |
1289 | -+ { propv_obio_zs, 20, 0 }, /* 19 "/obio/zs@0,0" */ | |
1290 | -+ { propv_obio_fd, 21, 0 }, /* 20 "/obio/SUNW,fdtwo" */ | |
1291 | -+ { propv_obio_pw, 22, 0 }, /* 21 "/obio/power" */ | |
1292 | -+ { propv_obio_cf, 0, 0 }, /* 22 "/obio/slavioconfig@0,800000" */ | |
1293 | -+ { propv_options, 24, 0 }, /* 23 "/options" */ | |
1294 | -+ { propv_memory, 25, 0 }, /* 24 "/memory" */ | |
1295 | -+ { propv_vmemory, 0, 0 }, /* 25 "/virtual-memory" */ | |
1296 | -+}; | |
1297 | -+ | |
1298 | -+static struct linux_mlist_v0 totphys[MAX_BANKS]; | |
1299 | -+static struct linux_mlist_v0 totmap[1]; | |
1300 | -+static struct linux_mlist_v0 totavail[MAX_BANKS]; | |
1301 | -+ | |
1302 | -+static struct linux_mlist_v0 *ptphys; | |
1303 | -+static struct linux_mlist_v0 *ptmap; | |
1304 | -+static struct linux_mlist_v0 *ptavail; | |
1305 | -+ | |
1306 | -+static const struct linux_nodeops nodeops0 = { | |
1307 | -+ obp_nextnode, /* int (*no_nextnode)(int node); */ | |
1308 | -+ obp_child, /* int (*no_child)(int node); */ | |
1309 | -+ obp_proplen, /* int (*no_proplen)(int node, char *name); */ | |
1310 | -+ obp_getprop, /* int (*no_getprop)(int node,char *name,char *val); */ | |
1311 | -+ obp_setprop, /* int (*no_setprop)(int node, char *name, | |
1312 | -+ char *val, int len); */ | |
1313 | -+ obp_nextprop /* char * (*no_nextprop)(int node, char *name); */ | |
1314 | -+}; | |
1315 | -+ | |
1316 | -+static struct linux_arguments_v0 obp_arg; | |
1317 | -+static const struct linux_arguments_v0 * const obp_argp = &obp_arg; | |
1318 | -+ | |
1319 | -+static void (*synch_hook)(void); | |
1320 | -+static char obp_stdin, obp_stdout; | |
1321 | -+static int obp_fd_stdin, obp_fd_stdout; | |
1322 | -+ | |
1323 | -+static int obp_nbgetchar(void); | |
1324 | -+static int obp_nbputchar(int ch); | |
1325 | -+static void obp_reboot(char *); | |
1326 | -+static void obp_abort(void); | |
1327 | -+static void obp_halt(void); | |
1328 | -+static int obp_devopen(char *str); | |
1329 | -+static int obp_devclose(int dev_desc); | |
1330 | -+static int obp_devread(int dev_desc, char *buf, int nbytes); | |
1331 | -+static int obp_devwrite(int dev_desc, char *buf, int nbytes); | |
1332 | -+static int obp_devseek(int dev_desc, int hi, int lo); | |
1333 | -+static int obp_rdblkdev(int dev_desc, int num_blks, int blk_st, char *buf); | |
1334 | -+static char *obp_dumb_mmap(char *va, int which_io, unsigned int pa, unsigned int size); | |
1335 | -+static void obp_dumb_munmap(char *va, unsigned int size); | |
1336 | -+static int obp_inst2pkg(int dev_desc); | |
1337 | -+ | |
1338 | -+static void doublewalk(unsigned ptab1, unsigned va) | |
1339 | -+{ | |
1340 | -+unsigned int proc_tablewalk(int ctx, unsigned int va); | |
1341 | -+unsigned int mem_tablewalk(unsigned int pa, unsigned int va); | |
1342 | -+ | |
1343 | -+ proc_tablewalk(0, va); | |
1344 | -+ if (ptab1 != 0) mem_tablewalk(ptab1, va); | |
1345 | -+} | |
1346 | -+ | |
1347 | -+static struct linux_romvec romvec0; | |
1348 | -+ | |
1349 | -+struct fd { | |
1350 | -+ int unit, part; | |
1351 | -+ int offset; | |
1352 | -+ int (*pread)(int dev_desc, int offset, char *buf, unsigned int nbytes); | |
1353 | -+ int (*pwrite)(int dev_desc, int offset, char *buf, unsigned int nbytes); | |
1354 | -+} fd_table[16]; | |
1355 | -+ | |
1356 | -+static int fd_index; | |
1357 | -+static int con_pread(int dev_desc, int offset, char *buf, unsigned int nbytes); | |
1358 | -+static int con_pwrite(int dev_desc, int offset, char *buf, unsigned int nbytes); | |
1359 | -+ | |
1360 | -+void * | |
1361 | -+init_openprom_qemu(int bankc, struct bank *bankv, unsigned hiphybas, | |
1362 | -+ const char *cmdline, char boot_device, int nographic) | |
1363 | -+{ | |
1364 | -+ int i; | |
1365 | -+ | |
1366 | -+ /* | |
1367 | -+ * Avoid data segment allocations | |
1368 | -+ */ | |
1369 | -+ ptphys = totphys; | |
1370 | -+ ptmap = totmap; | |
1371 | -+ ptavail = totavail; | |
1372 | -+ /* | |
1373 | -+ * Form memory descriptors. | |
1374 | -+ */ | |
1375 | -+ for (i = 0; i < bankc; i++) { | |
1376 | -+ totphys[i].theres_more = &totphys[i+1]; | |
1377 | -+ totphys[i].start_adr = (char*) bankv[i].start; | |
1378 | -+ totphys[i].num_bytes = bankv[i].length; | |
1379 | -+ } | |
1380 | -+ totphys[i-1].theres_more = 0; | |
1381 | -+ | |
1382 | -+ /* | |
1383 | -+ * XXX Merged in normal PROM when full banks touch. | |
1384 | -+ */ | |
1385 | -+ for (i = 0; i < bankc; i++) { | |
1386 | -+ unsigned bankbase = bankv[i].start; | |
1387 | -+ unsigned banksize = bankv[i].length; | |
1388 | -+ if (hiphybas > bankbase && | |
1389 | -+ hiphybas < bankbase + banksize) { | |
1390 | -+ banksize = hiphybas - bankbase; | |
1391 | -+ } | |
1392 | -+ totavail[i].theres_more = &totavail[i+1]; | |
1393 | -+ totavail[i].start_adr = (char*) bankbase; | |
1394 | -+ totavail[i].num_bytes = banksize; | |
1395 | -+ } | |
1396 | -+ totavail[i-1].theres_more = 0; | |
1397 | -+ | |
1398 | -+ totmap[0].theres_more = 0; | |
1399 | -+ totmap[0].start_adr = (char*) PROLBASE; | |
1400 | -+ totmap[0].num_bytes = PROLSIZE; | |
1401 | -+ prop_mem_reg[0] = 0; | |
1402 | -+ prop_mem_reg[1] = 0; | |
1403 | -+ prop_mem_reg[2] = bankv[0].length; | |
1404 | -+ prop_mem_avail[0] = 0; | |
1405 | -+ prop_mem_avail[1] = 0; | |
1406 | -+ prop_mem_avail[2] = hiphybas; | |
1407 | -+ prop_vmem_avail[0] = 0; | |
1408 | -+ prop_vmem_avail[1] = 0; | |
1409 | -+ prop_vmem_avail[2] = PROLBASE-1; | |
1410 | -+ prop_vmem_avail[3] = 0; | |
1411 | -+ prop_vmem_avail[4] = 0xffe00000; | |
1412 | -+ prop_vmem_avail[5] = 0x00200000; | |
1413 | -+ | |
1414 | -+ /* | |
1415 | -+ * idprom | |
1416 | -+ */ | |
1417 | -+ bcopy(idprom, obp_idprom, IDPROM_SIZE); | |
1418 | -+ | |
1419 | -+ // Linux wants a R/W romvec table | |
1420 | -+ romvec0.pv_magic_cookie = LINUX_OPPROM_MAGIC; | |
1421 | -+ romvec0.pv_romvers = 3; | |
1422 | -+ romvec0.pv_plugin_revision = 77; | |
1423 | -+ romvec0.pv_printrev = 0x10203; | |
1424 | -+ romvec0.pv_v0mem.v0_totphys = &ptphys; | |
1425 | -+ romvec0.pv_v0mem.v0_prommap = &ptmap; | |
1426 | -+ romvec0.pv_v0mem.v0_available = &ptavail; | |
1427 | -+ romvec0.pv_nodeops = &nodeops0; | |
1428 | -+ romvec0.pv_bootstr = (void *)doublewalk; | |
1429 | -+ romvec0.pv_v0devops.v0_devopen = &obp_devopen; | |
1430 | -+ romvec0.pv_v0devops.v0_devclose = &obp_devclose; | |
1431 | -+ romvec0.pv_v0devops.v0_rdblkdev = &obp_rdblkdev; | |
1432 | -+ romvec0.pv_stdin = &obp_stdin; | |
1433 | -+ romvec0.pv_stdout = &obp_stdout; | |
1434 | -+ romvec0.pv_getchar = obp_nbgetchar; | |
1435 | -+ romvec0.pv_putchar = (void (*)(int))obp_nbputchar; | |
1436 | -+ romvec0.pv_nbgetchar = obp_nbgetchar; | |
1437 | -+ romvec0.pv_nbputchar = obp_nbputchar; | |
1438 | -+ romvec0.pv_reboot = obp_reboot; | |
1439 | -+ romvec0.pv_printf = (void (*)(const char *fmt, ...))printk; | |
1440 | -+ romvec0.pv_abort = obp_abort; | |
1441 | -+ romvec0.pv_halt = obp_halt; | |
1442 | -+ romvec0.pv_synchook = &synch_hook; | |
1443 | -+ romvec0.pv_v0bootargs = &obp_argp; | |
1444 | -+ romvec0.pv_v2devops.v2_inst2pkg = obp_inst2pkg; | |
1445 | -+ romvec0.pv_v2devops.v2_dumb_mmap = obp_dumb_mmap; | |
1446 | -+ romvec0.pv_v2devops.v2_dumb_munmap = obp_dumb_munmap; | |
1447 | -+ romvec0.pv_v2devops.v2_dev_open = obp_devopen; | |
1448 | -+ romvec0.pv_v2devops.v2_dev_close = (void (*)(int))obp_devclose; | |
1449 | -+ romvec0.pv_v2devops.v2_dev_read = obp_devread; | |
1450 | -+ romvec0.pv_v2devops.v2_dev_write = obp_devwrite; | |
1451 | -+ romvec0.pv_v2devops.v2_dev_seek = obp_devseek; | |
1452 | -+ obp_arg.boot_dev_ctrl = 0; | |
1453 | -+ obp_arg.boot_dev_unit = '0'; | |
1454 | -+ obp_arg.argv[0] = "sd(0,0,0):d"; | |
1455 | -+ switch(boot_device) { | |
1456 | -+ default: | |
1457 | -+ case 'a': | |
1458 | -+ obp_arg.argv[0] = "fd()"; | |
1459 | -+ obp_arg.boot_dev[0] = 'f'; | |
1460 | -+ obp_arg.boot_dev[1] = 'd'; | |
1461 | -+ break; | |
1462 | -+ case 'd': | |
1463 | -+ obp_arg.boot_dev_unit = '2'; | |
1464 | -+ obp_arg.argv[0] = "sd(0,2,0):d"; | |
1465 | -+ // Fall through | |
1466 | -+ case 'c': | |
1467 | -+ obp_arg.boot_dev[0] = 's'; | |
1468 | -+ obp_arg.boot_dev[1] = 'd'; | |
1469 | -+ break; | |
1470 | -+ case 'n': | |
1471 | -+ obp_arg.argv[0] = "le()"; | |
1472 | -+ obp_arg.boot_dev[0] = 'l'; | |
1473 | -+ obp_arg.boot_dev[1] = 'e'; | |
1474 | -+ break; | |
1475 | -+ } | |
1476 | -+ obp_arg.argv[1] = cmdline; | |
1477 | -+ romvec0.pv_v2bootargs.bootpath = &obp_arg.argv[0]; | |
1478 | -+ romvec0.pv_v2bootargs.bootargs = &cmdline; | |
1479 | -+ romvec0.pv_v2bootargs.fd_stdin = &obp_fd_stdin; | |
1480 | -+ romvec0.pv_v2bootargs.fd_stdout = &obp_fd_stdout; | |
1481 | -+ | |
1482 | -+ bcopy(propv_root_templ, propv_root, sizeof(propv_root_templ)); | |
1483 | -+ propv_root[4].name = "stdin-path"; | |
1484 | -+ propv_root[5].name = "stdout-path"; | |
1485 | -+ obp_fd_stdin = 0; | |
1486 | -+ obp_fd_stdout = 1; | |
1487 | -+ fd_table[0].pread = con_pread; | |
1488 | -+ fd_table[0].pwrite = con_pwrite; | |
1489 | -+ fd_table[1].pread = con_pread; | |
1490 | -+ fd_table[1].pwrite = con_pwrite; | |
1491 | -+ fd_index = 2; | |
1492 | -+ if (nographic) { | |
1493 | -+ obp_stdin = PROMDEV_TTYA; | |
1494 | -+ propv_root[4].value = "/obio/zs@0,100000:a"; | |
1495 | -+ propv_root[4].length = sizeof("/obio/zs@0,100000:a"); | |
1496 | -+ fd_table[0].unit = 18; | |
1497 | -+ obp_stdout = PROMDEV_TTYA; | |
1498 | -+ propv_root[5].value = "/obio/zs@0,100000:a"; | |
1499 | -+ propv_root[5].length = sizeof("/obio/zs@0,100000:a"); | |
1500 | -+ fd_table[1].unit = 18; | |
1501 | -+ } else { | |
1502 | -+ obp_stdin = PROMDEV_KBD; | |
1503 | -+ propv_root[4].value = "/obio/zs@0,0"; | |
1504 | -+ propv_root[4].length = sizeof("/obio/zs@0,0"); | |
1505 | -+ fd_table[0].unit = 19; | |
1506 | -+ obp_stdout = PROMDEV_SCREEN; | |
1507 | -+ propv_root[5].value = "/iommu/sbus/SUNW,tcx"; | |
1508 | -+ propv_root[5].length = sizeof("/iommu/sbus/SUNW,tcx"); | |
1509 | -+ fd_table[1].unit = 4; | |
1510 | -+ } | |
1511 | -+ prop_zs_addr = map_io(0x71000000, 8); | |
1512 | -+ prop_zs1_addr = map_io(0x71100000, 8); | |
1513 | -+ return &romvec0; | |
1514 | -+} | |
1515 | -+ | |
1516 | -+static const struct property *find_property(int node,char *name) | |
1517 | -+{ | |
1518 | -+ const struct property *prop = &nodes[node].properties[0]; | |
1519 | -+ while (prop && prop->name) { | |
1520 | -+ if (bcmp(prop->name, name, 128) == 0) return prop; | |
1521 | -+ prop++; | |
1522 | -+ } | |
1523 | -+ return NULL; | |
1524 | -+} | |
1525 | -+ | |
1526 | -+static int obp_nextnode(int node) | |
1527 | -+{ | |
1528 | -+#ifdef DEBUG_OBP | |
1529 | -+ printk("obp_nextnode(%d) = %d\n", node, nodes[node].sibling); | |
1530 | -+#endif | |
1531 | -+ return nodes[node].sibling; | |
1532 | -+} | |
1533 | -+ | |
1534 | -+static int obp_child(int node) | |
1535 | -+{ | |
1536 | -+#ifdef DEBUG_OBP | |
1537 | -+ printk("obp_child(%d) = %d\n", node, nodes[node].child); | |
1538 | -+#endif | |
1539 | -+ return nodes[node].child; | |
1540 | -+} | |
1541 | -+ | |
1542 | -+static int obp_proplen(int node, char *name) | |
1543 | -+{ | |
1544 | -+ const struct property *prop = find_property(node,name); | |
1545 | -+ if (prop) { | |
1546 | -+#ifdef DEBUG_OBP | |
1547 | -+ printk("obp_proplen(%d, %s) = %d\n", node, name, prop->length); | |
1548 | -+#endif | |
1549 | -+ return prop->length; | |
1550 | -+ } | |
1551 | -+#ifdef DEBUG_OBP | |
1552 | -+ printk("obp_proplen(%d, %s) (no prop)\n", node, name); | |
1553 | -+#endif | |
1554 | -+ return -1; | |
1555 | -+} | |
1556 | -+ | |
1557 | -+static int obp_getprop(int node, char *name, char *value) | |
1558 | -+{ | |
1559 | -+ const struct property *prop; | |
1560 | -+ | |
1561 | -+ if (!name) { | |
1562 | -+ // NULL name means get first property | |
1563 | -+#ifdef DEBUG_OBP | |
1564 | -+ printk("obp_getprop(%d, %x (NULL)) = %s\n", node, name, | |
1565 | -+ nodes[node].properties[0].name); | |
1566 | -+#endif | |
1567 | -+ return (int)nodes[node].properties[0].name; | |
1568 | -+ } | |
1569 | -+ prop = find_property(node,name); | |
1570 | -+ if (prop) { | |
1571 | -+ memcpy(value,prop->value,prop->length); | |
1572 | -+#ifdef DEBUG_OBP | |
1573 | -+ printk("obp_getprop(%d, %s) = %s\n", node, name, value); | |
1574 | -+#endif | |
1575 | -+ return prop->length; | |
1576 | -+ } | |
1577 | -+#ifdef DEBUG_OBP | |
1578 | -+ printk("obp_getprop(%d, %s): not found\n", node, name); | |
1579 | -+#endif | |
1580 | -+ return -1; | |
1581 | -+} | |
1582 | -+ | |
1583 | -+static int obp_setprop(__attribute__((unused)) int node, | |
1584 | -+ __attribute__((unused)) char *name, | |
1585 | -+ __attribute__((unused)) char *value, | |
1586 | -+ __attribute__((unused)) int len) | |
1587 | -+{ | |
1588 | -+#ifdef DEBUG_OBP | |
1589 | -+ printk("obp_setprop(%d, %s) = %s (%d)\n", node, name, value, len); | |
1590 | -+#endif | |
1591 | -+ return -1; | |
1592 | -+} | |
1593 | -+ | |
1594 | -+static const char *obp_nextprop(int node,char *name) | |
1595 | -+{ | |
1596 | -+ const struct property *prop; | |
1597 | -+ | |
1598 | -+ if (!name || *name == '\0') { | |
1599 | -+ // NULL name means get first property | |
1600 | -+#ifdef DEBUG_OBP | |
1601 | -+ printk("obp_nextprop(%d, NULL) = %s\n", node, | |
1602 | -+ nodes[node].properties[0].name); | |
1603 | -+#endif | |
1604 | -+ return nodes[node].properties[0].name; | |
1605 | -+ } | |
1606 | -+ prop = find_property(node,name); | |
1607 | -+ if (prop && prop[1].name) { | |
1608 | -+#ifdef DEBUG_OBP | |
1609 | -+ printk("obp_nextprop(%d, %s) = %s\n", node, name, prop[1].name); | |
1610 | -+#endif | |
1611 | -+ return prop[1].name; | |
1612 | -+ } | |
1613 | -+#ifdef DEBUG_OBP | |
1614 | -+ printk("obp_nextprop(%d, %s): not found\n", node, name); | |
1615 | -+#endif | |
1616 | -+ return ""; | |
1617 | -+} | |
1618 | -+ | |
1619 | -+extern int (*getch_fn)(struct vconterm *v); | |
1620 | -+ | |
1621 | -+static int obp_nbgetchar(void) { | |
1622 | -+ extern struct vconterm dp0; | |
1623 | -+ return getch_fn(&dp0); | |
1624 | -+} | |
1625 | -+ | |
1626 | -+static int obp_nbputchar(int ch) { | |
1627 | -+ printk("%c", ch); | |
1628 | -+ return 0; | |
1629 | -+} | |
1630 | -+ | |
1631 | -+static void obp_reboot(char *str) { | |
1632 | -+ printk("rebooting (%s)\n", str); | |
1633 | -+ stb_bypass(0x71f00000, 1); | |
1634 | -+ for (;;) {} | |
1635 | -+} | |
1636 | -+ | |
1637 | -+static void obp_abort() { | |
1638 | -+ printk("abort, power off\n"); | |
1639 | -+ stb_bypass(0x71910000, 1); | |
1640 | -+ for (;;) {} | |
1641 | -+} | |
1642 | -+ | |
1643 | -+static void obp_halt() { | |
1644 | -+ printk("halt, power off\n"); | |
1645 | -+ stb_bypass(0x71910000, 1); | |
1646 | -+ for (;;) {} | |
1647 | -+} | |
1648 | -+ | |
1649 | -+extern void *esp_read(int unit, int part, int offset, short len); | |
1650 | -+ | |
1651 | -+static int esp_pread(int dev_desc, int offset, char *buf, unsigned int nbytes) | |
1652 | -+{ | |
1653 | -+ unsigned int i; | |
1654 | -+ void *src; | |
1655 | -+ | |
1656 | -+ for(i = 0; i < nbytes; i += 512) { | |
1657 | -+ src = esp_read(fd_table[dev_desc].unit, fd_table[dev_desc].part, (offset + i) / 512, 512); | |
1658 | -+ memcpy(&buf[i], src, 512); | |
1659 | -+ } | |
1660 | -+ return nbytes; | |
1661 | -+} | |
1662 | -+ | |
1663 | -+static int con_pread(__attribute__((unused)) int dev_desc, __attribute__((unused)) int offset, char *buf, unsigned int nbytes) | |
1664 | -+{ | |
1665 | -+ unsigned int i; | |
1666 | -+ | |
1667 | -+ for(i = 0; i < nbytes; i ++) { | |
1668 | -+ buf[i] = obp_nbgetchar(); | |
1669 | -+ } | |
1670 | -+ return nbytes; | |
1671 | -+} | |
1672 | -+ | |
1673 | -+static int con_pwrite(__attribute__((unused)) int dev_desc, __attribute__((unused)) int offset, char *buf, unsigned int nbytes) | |
1674 | -+{ | |
1675 | -+ unsigned int i; | |
1676 | -+ | |
1677 | -+ for(i = 0; i < nbytes; i ++) { | |
1678 | -+ obp_nbputchar(buf[i]); | |
1679 | -+ } | |
1680 | -+ return nbytes; | |
1681 | -+} | |
1682 | -+ | |
1683 | -+#define isnum(c) ((c >= '0') && (c < '9')) | |
1684 | -+#define ctoi(c) (c - '0') | |
1685 | -+ | |
1686 | -+static int obp_devopen(char *str) { | |
1687 | -+#ifdef DEBUG_OBP | |
1688 | -+ printk("obp_devopen(%s)\n", str); | |
1689 | -+#endif | |
1690 | -+ if (str[0] == 's' && str[1] == 'd' && str[4] == ',') { | |
1691 | -+ unsigned int target; | |
1692 | -+ | |
1693 | -+ if (str[5] < 7) | |
1694 | -+ target = str[5]; | |
1695 | -+ else if (isnum(str[6]) && isnum(str[5])) { | |
1696 | -+ target = (ctoi(str[5]) * 10 + ctoi(str[6])) & 7; | |
1697 | -+ } | |
1698 | -+ else { | |
1699 | -+ target = ctoi(str[5]) & 7; | |
1700 | -+ } | |
1701 | -+ fd_table[fd_index].unit = target; | |
1702 | -+ fd_table[fd_index].part = str[10] - 'a'; | |
1703 | -+ fd_table[fd_index].pread = esp_pread; | |
1704 | -+ return fd_index++; // XXX | |
1705 | -+ } | |
1706 | -+ return 0; | |
1707 | -+} | |
1708 | -+ | |
1709 | -+static int obp_devclose(__attribute__((unused)) int dev_desc) { | |
1710 | -+#ifdef DEBUG_OBP | |
1711 | -+ printk("obp_devclose %d\n", dev_desc); | |
1712 | -+#endif | |
1713 | -+ fd_index--; // XXX | |
1714 | -+ return 0; | |
1715 | -+} | |
1716 | -+ | |
1717 | -+static int obp_rdblkdev(int dev_desc, int num_blks, int offset, char *buf) | |
1718 | -+{ | |
1719 | -+#ifdef DEBUG_OBP | |
1720 | -+ printk("obp_rdblkdev: fd %d, num_blks %d, offset %d, buf 0x%x\n", dev_desc, num_blks, offset, buf); | |
1721 | -+#endif | |
1722 | -+ return fd_table[dev_desc].pread(dev_desc, offset, buf, num_blks * 512); | |
1723 | -+} | |
1724 | -+ | |
1725 | -+static char *obp_dumb_mmap(char *va, __attribute__((unused)) int which_io, | |
1726 | -+ unsigned int pa, unsigned int size) | |
1727 | -+{ | |
1728 | -+ unsigned int npages; | |
1729 | -+ unsigned int off; | |
1730 | -+ unsigned int mva; | |
1731 | -+ | |
1732 | -+#ifdef DEBUG_OBP | |
1733 | -+ printk("obp_dumb_mmap: virta %x, which_io %d, paddr %x, sz %d\n", va, which_io, pa, size); | |
1734 | -+#endif | |
1735 | -+ off = pa & (PAGE_SIZE-1); | |
1736 | -+ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE; | |
1737 | -+ pa &= ~(PAGE_SIZE-1); | |
1738 | -+ | |
1739 | -+ mva = (unsigned int) va; | |
1740 | -+ while (npages-- != 0) { | |
1741 | -+ map_page(pmem.pl1, mva, pa, 1, pmem.pbas); | |
1742 | -+ mva += PAGE_SIZE; | |
1743 | -+ pa += PAGE_SIZE; | |
1744 | -+ } | |
1745 | -+ return va; | |
1746 | -+} | |
1747 | -+ | |
1748 | -+static void obp_dumb_munmap(__attribute__((unused)) char *va, | |
1749 | -+ __attribute__((unused)) unsigned int size) | |
1750 | -+{ | |
1751 | -+#ifdef DEBUG_OBP | |
1752 | -+ printk("obp_dumb_munmap: virta %x, sz %d\n", va, size); | |
1753 | -+#endif | |
1754 | -+} | |
1755 | -+ | |
1756 | -+static int obp_devread(int dev_desc, char *buf, int nbytes) | |
1757 | -+{ | |
1758 | -+ int ret; | |
1759 | -+#ifdef DEBUG_OBP | |
1760 | -+ printk("obp_devread: fd %d, nbytes %d\n", dev_desc, nbytes); | |
1761 | -+#endif | |
1762 | -+ ret = fd_table[dev_desc].pread(dev_desc, fd_table[dev_desc].offset, buf, nbytes); | |
1763 | -+ fd_table[dev_desc].offset += nbytes; | |
1764 | -+ return ret; | |
1765 | -+} | |
1766 | -+ | |
1767 | -+static int obp_devwrite(int dev_desc, char *buf, int nbytes) | |
1768 | -+{ | |
1769 | -+ int ret; | |
1770 | -+#ifdef DEBUG_OBP | |
1771 | -+ printk("obp_devwrite: fd %d, buf %s, nbytes %d\n", dev_desc, buf, nbytes); | |
1772 | -+#endif | |
1773 | -+ ret = fd_table[dev_desc].pwrite(dev_desc, fd_table[dev_desc].offset, buf, nbytes); | |
1774 | -+ fd_table[dev_desc].offset += nbytes; | |
1775 | -+ return ret; | |
1776 | -+} | |
1777 | -+ | |
1778 | -+static int obp_devseek(int dev_desc, __attribute__((unused)) int hi, int lo) | |
1779 | -+{ | |
1780 | -+#ifdef DEBUG_OBP | |
1781 | -+ printk("obp_devseek: fd %d, hi %d, lo %d\n", dev_desc, hi, lo); | |
1782 | -+#endif | |
1783 | -+ fd_table[dev_desc].offset = lo; | |
1784 | -+ return 0; | |
1785 | -+} | |
1786 | -+ | |
1787 | -+static int obp_inst2pkg(int dev_desc) | |
1788 | -+{ | |
1789 | -+#ifdef DEBUG_OBP | |
1790 | -+ printk("obp_inst2pkg: fd %d\n", dev_desc); | |
1791 | -+#endif | |
1792 | -+ return fd_table[dev_desc].unit; | |
1793 | -+} | |
1794 | -diff -ruN proll_18.orig/qemu/system_qemu.c proll-patch-15/qemu/system_qemu.c | |
1795 | ---- proll_18.orig/qemu/system_qemu.c 1970-01-01 00:00:00.000000000 +0000 | |
1796 | -+++ proll-patch-15/qemu/system_qemu.c 2005-04-16 06:16:20.000000000 +0000 | |
1797 | -@@ -0,0 +1,430 @@ | |
1798 | -+/** | |
1799 | -+ ** Proll (PROM replacement) | |
1800 | -+ ** system.c: shared miscallenea. | |
1801 | -+ ** Copyright 1999 Pete Zaitcev | |
1802 | -+ ** This code is licensed under GNU General Public License. | |
1803 | -+ **/ | |
1804 | -+#include <stdarg.h> | |
1805 | -+#include <asi.h> | |
1806 | -+#include <crs.h> | |
1807 | -+#ifndef NULL | |
1808 | -+#define NULL ((void*)0) | |
1809 | -+#endif | |
1810 | -+ | |
1811 | -+#include "pgtsrmmu.h" | |
1812 | -+ | |
1813 | -+#include "vconsole.h" | |
1814 | -+#include <timer.h> /* Local copy of 2.2 style include */ | |
1815 | -+#include <general.h> /* __P() */ | |
1816 | -+#include <net.h> /* init_net() */ | |
1817 | -+#include <romlib.h> /* we are a provider for part of this. */ | |
1818 | -+#include <netpriv.h> /* myipaddr */ | |
1819 | -+#include <arpa.h> | |
1820 | -+#include <system.h> /* our own prototypes */ | |
1821 | -+ | |
1822 | -+/* | |
1823 | -+ * We export this. | |
1824 | -+ */ | |
1825 | -+char idprom[IDPROM_SIZE]; | |
1826 | -+ | |
1827 | -+ | |
1828 | -+/* | |
1829 | -+ * Create an I/O mapping to pa[size]. | |
1830 | -+ * Returns va of the mapping or 0 if unsuccessful. | |
1831 | -+ */ | |
1832 | -+void * | |
1833 | -+map_io(unsigned pa, int size) | |
1834 | -+{ | |
1835 | -+ void *va; | |
1836 | -+ unsigned int npages; | |
1837 | -+ unsigned int off; | |
1838 | -+ unsigned int mva; | |
1839 | -+ | |
1840 | -+ off = pa & (PAGE_SIZE-1); | |
1841 | -+ npages = (off + size + (PAGE_SIZE-1)) / PAGE_SIZE; | |
1842 | -+ pa &= ~(PAGE_SIZE-1); | |
1843 | -+ | |
1844 | -+ va = mem_alloc(&cio, npages*PAGE_SIZE, PAGE_SIZE); | |
1845 | -+ if (va == 0) return va; | |
1846 | -+ | |
1847 | -+ mva = (unsigned int) va; | |
1848 | -+ /* printk("map_io: va 0x%x pa 0x%x off 0x%x npages %d\n", va, pa, off, npages); */ /* P3 */ | |
1849 | -+ while (npages-- != 0) { | |
1850 | -+ map_page(pmem.pl1, mva, pa, 1, pmem.pbas); | |
1851 | -+ mva += PAGE_SIZE; | |
1852 | -+ pa += PAGE_SIZE; | |
1853 | -+ } | |
1854 | -+ | |
1855 | -+ return (void *)((unsigned int)va + off); | |
1856 | -+} | |
1857 | -+ | |
1858 | -+/* | |
1859 | -+ * Tablewalk routine used for testing. | |
1860 | -+ * Returns PTP/PTE. | |
1861 | -+ */ | |
1862 | -+unsigned int | |
1863 | -+proc_tablewalk(int ctx, unsigned int va) | |
1864 | -+{ | |
1865 | -+ unsigned int pa1; | |
1866 | -+ | |
1867 | -+ __asm__ __volatile__ ("lda [%1] %2, %0" : | |
1868 | -+ "=r" (pa1) : | |
1869 | -+ "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS)); | |
1870 | -+ /* printk(" ctpr %x ctx %x\n", pa1, ctx); */ /* P3 */ | |
1871 | -+ pa1 <<= 4; | |
1872 | -+ pa1 = ld_bypass(pa1 + (ctx << 2)); | |
1873 | -+ if ((pa1 & 0x03) == 0) goto invalid; | |
1874 | -+ return mem_tablewalk((pa1 & 0xFFFFFFF0) << 4, va); | |
1875 | -+ | |
1876 | -+invalid: | |
1877 | -+ printk(" invalid %x\n", pa1); | |
1878 | -+ return 0; | |
1879 | -+} | |
1880 | -+ | |
1881 | -+/* | |
1882 | -+ * Walk the tables in memory, starting at physical address pa. | |
1883 | -+ */ | |
1884 | -+unsigned int | |
1885 | -+mem_tablewalk(unsigned int pa, unsigned int va) | |
1886 | -+{ | |
1887 | -+ unsigned int pa1; | |
1888 | -+ | |
1889 | -+ printk("pa %x va %x", pa, va); | |
1890 | -+ pa1 = ld_bypass(pa + (((va&0xFF000000)>>24) << 2)); | |
1891 | -+ if ((pa1 & 0x03) == 0) goto invalid; | |
1892 | -+ printk(" l1 %x", pa1); | |
1893 | -+ pa1 <<= 4; pa1 &= 0xFFFFFF00; | |
1894 | -+ pa1 = ld_bypass(pa1 + (((va&0x00FC0000)>>18) << 2)); | |
1895 | -+ if ((pa1 & 0x03) == 0) goto invalid; | |
1896 | -+ printk(" l2 %x", pa1); | |
1897 | -+ pa1 <<= 4; pa1 &= 0xFFFFFF00; | |
1898 | -+ pa1 = ld_bypass(pa1 + (((va&0x0003F000)>>12) << 2)); | |
1899 | -+ if ((pa1 & 0x03) == 0) goto invalid; | |
1900 | -+ printk(" l3 %x", pa1); | |
1901 | -+ printk(" off %x\n", va&0x00000FFF); | |
1902 | -+ return pa1; | |
1903 | -+invalid: | |
1904 | -+ printk(" invalid %x\n", pa1); | |
1905 | -+ return 0; | |
1906 | -+} | |
1907 | -+ | |
1908 | -+/* | |
1909 | -+ * Make CPU page tables. | |
1910 | -+ * Returns pointer to context table. | |
1911 | -+ * Here we ignore memory allocation errors which "should not happen" | |
1912 | -+ * because we cannot print anything anyways if memory initialization fails. | |
1913 | -+ */ | |
1914 | -+void makepages(struct phym *t, unsigned int highbase) | |
1915 | -+{ | |
1916 | -+ unsigned int *ctp, *l1, pte; | |
1917 | -+ int i; | |
1918 | -+ unsigned int pa, va; | |
1919 | -+ | |
1920 | -+ ctp = mem_zalloc(&cmem, NCTX_SWIFT*sizeof(int), NCTX_SWIFT*sizeof(int)); | |
1921 | -+ l1 = mem_zalloc(&cmem, 256*sizeof(int), 256*sizeof(int)); | |
1922 | -+ | |
1923 | -+ pte = SRMMU_ET_PTD | (((unsigned int)l1 - PROLBASE + highbase) >> 4); | |
1924 | -+ for (i = 0; i < NCTX_SWIFT; i++) { | |
1925 | -+ ctp[i] = pte; | |
1926 | -+ } | |
1927 | -+ | |
1928 | -+ pa = PROLBASE; | |
1929 | -+ for (va = PROLBASE; va < PROLDATA; va += PAGE_SIZE) { | |
1930 | -+ map_page(l1, va, pa, 0, highbase); | |
1931 | -+ pa += PAGE_SIZE; | |
1932 | -+ } | |
1933 | -+ pa = highbase + PROLDATA - PROLBASE; | |
1934 | -+ for (va = PROLDATA; va < PROLBASE + PROLSIZE; va += PAGE_SIZE) { | |
1935 | -+ map_page(l1, va, pa, 0, highbase); | |
1936 | -+ pa += PAGE_SIZE; | |
1937 | -+ } | |
1938 | -+ | |
1939 | -+ /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */ | |
1940 | -+ pa = 0; | |
1941 | -+ for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) { | |
1942 | -+ map_page(l1, va, pa, 0, highbase); | |
1943 | -+ pa += PAGE_SIZE; | |
1944 | -+ } | |
1945 | -+ | |
1946 | -+ t->pctp = ctp; | |
1947 | -+ t->pl1 = l1; | |
1948 | -+ t->pbas = highbase; | |
1949 | -+} | |
1950 | -+ | |
1951 | -+/* | |
1952 | -+ * Create a memory mapping from va to epa in page table pgd. | |
1953 | -+ * highbase is used for v2p translation. | |
1954 | -+ */ | |
1955 | -+int | |
1956 | -+map_page(unsigned int *pgd, unsigned int va, | |
1957 | -+ unsigned int epa, int type, unsigned int highbase) | |
1958 | -+{ | |
1959 | -+ unsigned int pte; | |
1960 | -+ unsigned int *p; | |
1961 | -+ unsigned int pa; | |
1962 | -+ | |
1963 | -+ pte = pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)]; | |
1964 | -+ if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) { | |
1965 | -+ p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PMD*sizeof(int), | |
1966 | -+ SRMMU_PTRS_PER_PMD*sizeof(int)); | |
1967 | -+ if (p == 0) goto drop; | |
1968 | -+ pte = SRMMU_ET_PTD | | |
1969 | -+ (((unsigned int)p - PROLBASE + highbase) >> 4); | |
1970 | -+ pgd[((va)>>SRMMU_PGDIR_SHIFT) & (SRMMU_PTRS_PER_PGD-1)] = pte; | |
1971 | -+ /* barrier() */ | |
1972 | -+ } | |
1973 | -+ | |
1974 | -+ pa = ((pte & 0xFFFFFFF0) << 4); | |
1975 | -+ pa += (((va)>>SRMMU_PMD_SHIFT & (SRMMU_PTRS_PER_PMD-1)) << 2); | |
1976 | -+ pte = ld_bypass(pa); | |
1977 | -+ if ((pte & SRMMU_ET_MASK) == SRMMU_ET_INVALID) { | |
1978 | -+ p = mem_zalloc(&cmem, SRMMU_PTRS_PER_PTE*sizeof(int), | |
1979 | -+ SRMMU_PTRS_PER_PTE*sizeof(int)); | |
1980 | -+ if (p == 0) goto drop; | |
1981 | -+ pte = SRMMU_ET_PTD | | |
1982 | -+ (((unsigned int)p - PROLBASE + highbase) >> 4); | |
1983 | -+ st_bypass(pa, pte); | |
1984 | -+ } | |
1985 | -+ | |
1986 | -+ pa = ((pte & 0xFFFFFFF0) << 4); | |
1987 | -+ pa += (((va)>>PAGE_SHIFT & (SRMMU_PTRS_PER_PTE-1)) << 2); | |
1988 | -+ | |
1989 | -+ pte = SRMMU_ET_PTE | ((epa & PAGE_MASK) >> 4); | |
1990 | -+ if (type) { /* I/O */ | |
1991 | -+ pte |= SRMMU_REF; | |
1992 | -+ /* SRMMU cannot make Supervisor-only, but not exectutable */ | |
1993 | -+ pte |= SRMMU_PRIV; | |
1994 | -+ } else { /* memory */ | |
1995 | -+ pte |= SRMMU_REF|SRMMU_CACHE; | |
1996 | -+ pte |= SRMMU_PRIV; /* Supervisor only access */ | |
1997 | -+ } | |
1998 | -+ st_bypass(pa, pte); | |
1999 | -+ return 0; | |
2000 | -+ | |
2001 | -+drop: | |
2002 | -+ return -1; | |
2003 | -+} | |
2004 | -+ | |
2005 | -+/* | |
2006 | -+ * Switch page tables. | |
2007 | -+ */ | |
2008 | -+void | |
2009 | -+init_mmu_swift(unsigned int ctp_phy) | |
2010 | -+{ | |
2011 | -+ unsigned int addr; | |
2012 | -+ | |
2013 | -+ /* | |
2014 | -+ * Flush cache | |
2015 | -+ */ | |
2016 | -+ for (addr = 0; addr < 0x2000; addr += 0x10) { | |
2017 | -+ __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : : | |
2018 | -+ "r" (addr), "i" (ASI_M_DATAC_TAG)); | |
2019 | -+ __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : : | |
2020 | -+ "r" (addr<<1), "i" (ASI_M_TXTC_TAG)); | |
2021 | -+ } | |
2022 | -+ | |
2023 | -+ /* | |
2024 | -+ * Switch ctx table | |
2025 | -+ */ | |
2026 | -+ ctp_phy >>= 4; | |
2027 | -+ /* printk("done flushing, switching to %x\n", ctp_phy); */ | |
2028 | -+ __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : : | |
2029 | -+ "r" (ctp_phy), "r" (AC_M_CTPR), "i" (ASI_M_MMUREGS)); | |
2030 | -+ | |
2031 | -+ /* | |
2032 | -+ * Flush old page table references | |
2033 | -+ */ | |
2034 | -+ __asm__ __volatile__ ("sta %%g0, [%0] %1\n\t" : : | |
2035 | -+ "r" (0x400), "i" (ASI_M_FLUSH_PROBE) : "memory"); | |
2036 | -+} | |
2037 | -+ | |
2038 | -+/* | |
2039 | -+ * add_timer, del_timer | |
2040 | -+ * This should go into sched.c, but we have it split for different archs. | |
2041 | -+ */ | |
2042 | -+struct timer_list_head { | |
2043 | -+ struct timer_list *head, *tail; | |
2044 | -+}; | |
2045 | -+ | |
2046 | -+static struct timer_list_head timers; /* Anonymous heap of timers */ | |
2047 | -+ | |
2048 | -+void add_timer(struct timer_list *timer) { | |
2049 | -+ struct timer_list *p; | |
2050 | -+ if (timer->prev != NULL || timer->next != NULL) { | |
2051 | -+ printk("bug: kernel timer added twice at 0x%x.\n", | |
2052 | -+ __builtin_return_address(0)); | |
2053 | -+ return; | |
2054 | -+ } | |
2055 | -+ if ((p = timers.tail) != NULL) { | |
2056 | -+ timer->prev = p; | |
2057 | -+ p->next = timer; | |
2058 | -+ timers.tail = timer; | |
2059 | -+ } else { | |
2060 | -+ timers.head = timer; | |
2061 | -+ timers.tail = timer; | |
2062 | -+ } | |
2063 | -+ return; | |
2064 | -+} | |
2065 | -+ | |
2066 | -+int del_timer(struct timer_list *timer) { | |
2067 | -+ struct timer_list *p; | |
2068 | -+ int ret; | |
2069 | -+ | |
2070 | -+ if (timers.head == timer) timers.head = timer->next; | |
2071 | -+ if (timers.tail == timer) timers.tail = timer->prev; | |
2072 | -+ if ((p = timer->prev) != NULL) p->next = timer->next; | |
2073 | -+ if ((p = timer->next) != NULL) p->prev = timer->prev; | |
2074 | -+ ret = timer->next != 0 || timer->prev != 0; | |
2075 | -+ timer->next = NULL; | |
2076 | -+ timer->prev = NULL; | |
2077 | -+ return ret; | |
2078 | -+} | |
2079 | -+ | |
2080 | -+void run_timers() { | |
2081 | -+ struct timer_list *p; | |
2082 | -+ | |
2083 | -+ p = timers.head; | |
2084 | -+ while (p != NULL) { | |
2085 | -+ if (p->expires < jiffies) { | |
2086 | -+ del_timer(p); /* XXX make nonstatic member */ | |
2087 | -+ (*p->function)(p->data); | |
2088 | -+ p = timers.head; | |
2089 | -+ } else { | |
2090 | -+ p = p->next; | |
2091 | -+ } | |
2092 | -+ } | |
2093 | -+} | |
2094 | -+ | |
2095 | -+/* | |
2096 | -+ * Allocate memory. This is reusable. | |
2097 | -+ */ | |
2098 | -+void mem_init(struct mem *t, char *begin, char *limit) | |
2099 | -+{ | |
2100 | -+ t->start = begin; | |
2101 | -+ t->uplim = limit; | |
2102 | -+ t->curp = begin; | |
2103 | -+} | |
2104 | -+ | |
2105 | -+void mem_fini(struct mem *t) | |
2106 | -+{ | |
2107 | -+ t->curp = 0; | |
2108 | -+} | |
2109 | -+ | |
2110 | -+void *mem_alloc(struct mem *t, int size, int align) | |
2111 | -+{ | |
2112 | -+ char *p; | |
2113 | -+ | |
2114 | -+ p = (char *)((((unsigned int)t->curp) + (align-1)) & ~(align-1)); | |
2115 | -+ if (p >= t->uplim || p + size > t->uplim) return 0; | |
2116 | -+ t->curp = p + size; | |
2117 | -+ return p; | |
2118 | -+} | |
2119 | -+ | |
2120 | -+void *mem_zalloc(struct mem *t, int size, int align) | |
2121 | -+{ | |
2122 | -+ char *p; | |
2123 | -+ | |
2124 | -+ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); | |
2125 | -+ return p; | |
2126 | -+} | |
2127 | -+ | |
2128 | -+/* | |
2129 | -+ * Library functions | |
2130 | -+ */ | |
2131 | -+void *memset(void *s, int c, size_t len) | |
2132 | -+{ | |
2133 | -+ void *p = s; | |
2134 | -+ | |
2135 | -+ while (len--) { | |
2136 | -+ *(char *)s = c; | |
2137 | -+ s++; | |
2138 | -+ } | |
2139 | -+ return p; | |
2140 | -+} | |
2141 | -+ | |
2142 | -+void bcopy(const void *f, void *t, int len) { | |
2143 | -+ while (len--) { | |
2144 | -+ *(char *)t = *(char *)f; | |
2145 | -+ f++; | |
2146 | -+ t++; | |
2147 | -+ } | |
2148 | -+} | |
2149 | -+ | |
2150 | -+/* Comparison is 7-bit */ | |
2151 | -+int bcmp(const void *s1, const void *s2, int len) | |
2152 | -+{ | |
2153 | -+ int i; | |
2154 | -+ char ch; | |
2155 | -+ | |
2156 | -+ while (len--) { | |
2157 | -+ ch = *(char *)s1; | |
2158 | -+ i = ch - *(char *)s2; | |
2159 | -+ s1++; | |
2160 | -+ s2++; | |
2161 | -+ if (i != 0) | |
2162 | -+ return i; | |
2163 | -+ if (ch == 0) | |
2164 | -+ return 0; | |
2165 | -+ } | |
2166 | -+ return 0; | |
2167 | -+} | |
2168 | -+ | |
2169 | -+int strlen(const char *s) { | |
2170 | -+ const char *p; | |
2171 | -+ for (p = s; *p != 0; p++) { } | |
2172 | -+ return p - s; | |
2173 | -+} | |
2174 | -+ | |
2175 | -+extern void *printk_fn; | |
2176 | -+ | |
2177 | -+void printk(char *fmt, ...) | |
2178 | -+{ | |
2179 | -+ struct prf_fp { | |
2180 | -+ void *xfp; | |
2181 | -+ void (*write)(void *, char *, int); | |
2182 | -+ } prfa; | |
2183 | -+ extern void prf(struct prf_fp *, char *fmt, va_list adx); | |
2184 | -+ va_list x1; | |
2185 | -+ | |
2186 | -+ va_start(x1, fmt); | |
2187 | -+ prfa.xfp = &dp0; | |
2188 | -+ prfa.write = printk_fn; | |
2189 | -+ prf(&prfa, fmt, x1); | |
2190 | -+ va_end(x1); | |
2191 | -+} | |
2192 | -+ | |
2193 | -+void fatal() | |
2194 | -+{ | |
2195 | -+ printk("fatal."); | |
2196 | -+loop: goto loop; | |
2197 | -+} | |
2198 | -+ | |
2199 | -+/* | |
2200 | -+ * Get the highest bit number from the mask. | |
2201 | -+ */ | |
2202 | -+int highc(int mask, int size) | |
2203 | -+{ | |
2204 | -+ int m1; | |
2205 | -+ | |
2206 | -+ m1 = 1 << size; | |
2207 | -+ while (size != 0) { | |
2208 | -+ size--; | |
2209 | -+ m1 >>= 1; | |
2210 | -+ if (m1 & mask) break; | |
2211 | -+ } | |
2212 | -+ return size; | |
2213 | -+} | |
2214 | -+ | |
2215 | -+/* | |
2216 | -+ */ | |
2217 | -+unsigned int ld_bp_swap(unsigned int ptr) { | |
2218 | -+ unsigned int n; | |
2219 | -+ n = ld_bypass(ptr); | |
2220 | -+ n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24); | |
2221 | -+ return n; | |
2222 | -+} | |
2223 | -+ | |
2224 | -+void st_bp_swap(unsigned int ptr, unsigned int n) { | |
2225 | -+ n = (n>>24 & 0xFF) | (n>>8 & 0xFF00) | ((n&0xFF00) << 8) | (n<<24); | |
2226 | -+ st_bypass(ptr, n); | |
2227 | -+}; | |
2228 | -diff -ruN proll_18.orig/src/arp.c proll-patch-15/src/arp.c | |
2229 | ---- proll_18.orig/src/arp.c 2001-12-24 05:12:31.000000000 +0000 | |
2230 | -+++ proll-patch-15/src/arp.c 2005-08-14 10:10:11.000000000 +0000 | |
2231 | -@@ -45,7 +45,7 @@ | |
2232 | - #endif | |
2233 | - static struct arp_cache arp_list[ARPNUM]; /* ARP address cache */ | |
2234 | - static int next_arp; /* next table entry */ | |
2235 | --static t_ipaddr def_gw = IP_ANY; /* default routing */ | |
2236 | -+static t_ipaddr def_gw; /* default routing */ | |
2237 | - | |
2238 | - | |
2239 | - | |
2240 | -@@ -100,10 +100,7 @@ | |
2241 | - * | |
2242 | - * ARP receiver routine | |
2243 | - */ | |
2244 | --static int arp_recv(buf, bufsize, addr) | |
2245 | --unsigned char *buf; | |
2246 | --int bufsize; | |
2247 | --unsigned char *addr; | |
2248 | -+static int arp_recv(unsigned char *buf, unsigned int bufsize, unsigned char *addr) | |
2249 | - { | |
2250 | - register struct arphdr *ahp = (struct arphdr *)buf; | |
2251 | - | |
2252 | -@@ -144,7 +141,7 @@ | |
2253 | - * | |
2254 | - * Resolve IP address and return pointer to hardware address. | |
2255 | - */ | |
2256 | --unsigned char *ip_resolve(ip) | |
2257 | -+const unsigned char *ip_resolve(ip) | |
2258 | - t_ipaddr ip; | |
2259 | - { | |
2260 | - int i; | |
2261 | -@@ -230,14 +227,11 @@ | |
2262 | - */ | |
2263 | - int init_arp() | |
2264 | - { | |
2265 | -- /* Set name of module for error messages */ | |
2266 | -- net_module_name = "arp"; | |
2267 | -- | |
2268 | - #ifndef NOARP | |
2269 | - /* Register ARP packet type and set send buffer pointer */ | |
2270 | - if ((arpbuf = (struct arphdr *)reg_type(htons(ETH_P_ARP), arp_recv)) == NULL) | |
2271 | - return(FALSE); | |
2272 | - #endif | |
2273 | -- | |
2274 | -+ def_gw = IP_ANY; | |
2275 | - return(TRUE); | |
2276 | - } | |
2277 | -diff -ruN proll_18.orig/src/arp.h proll-patch-15/src/arp.h | |
2278 | ---- proll_18.orig/src/arp.h 1999-03-18 03:39:43.000000000 +0000 | |
2279 | -+++ proll-patch-15/src/arp.h 2004-11-13 15:50:49.000000000 +0000 | |
2280 | -@@ -104,7 +104,7 @@ | |
2281 | - extern int init_arp __P((void)); | |
2282 | - | |
2283 | - /* Resolve IP address and return pointer to hardware address */ | |
2284 | --extern unsigned char *ip_resolve __P((t_ipaddr ip)); | |
2285 | -+extern const unsigned char *ip_resolve __P((t_ipaddr ip)); | |
2286 | - | |
2287 | - /* Add a new antry to the ARP cache */ | |
2288 | - extern void addcache __P((unsigned char *ha, t_ipaddr ip)); | |
2289 | -diff -ruN proll_18.orig/src/bootp.c proll-patch-15/src/bootp.c | |
2290 | ---- proll_18.orig/src/bootp.c 1999-12-15 17:20:30.000000000 +0000 | |
2291 | -+++ proll-patch-15/src/bootp.c 2005-08-14 10:16:09.000000000 +0000 | |
2292 | -@@ -151,7 +151,7 @@ | |
2293 | - while (TRUE) { | |
2294 | - boot_xid = get_ticks() + random(); | |
2295 | - bootp_send(); | |
2296 | -- i = udp_read((char *)(&boot_rec), BOOTP_REC_SIZE, timeout, CHR_ESC); | |
2297 | -+ i = udp_read((char *)(&boot_rec), BOOTP_REC_SIZE, timeout); | |
2298 | - if (i < 0) { /* user pressed ESC */ | |
2299 | - printf("\nAborted\n"); | |
2300 | - return(1); | |
2301 | -diff -ruN proll_18.orig/src/esp.c proll-patch-15/src/esp.c | |
2302 | ---- proll_18.orig/src/esp.c 1970-01-01 00:00:00.000000000 +0000 | |
2303 | -+++ proll-patch-15/src/esp.c 2005-08-15 18:42:46.000000000 +0000 | |
2304 | -@@ -0,0 +1,305 @@ | |
2305 | -+#include <system.h> /* == <asm/system.h> */ | |
2306 | -+#include <general.h> /* __P for netpriv.h */ | |
2307 | -+#include <dma.h> /* dmaga */ | |
2308 | -+#include <romlib.h> | |
2309 | -+ | |
2310 | -+#define PHYS_JJ_ESPDMA 0x78400000 /* ESP DMA controller */ | |
2311 | -+#define PHYS_JJ_ESP 0x78800000 /* ESP SCSI */ | |
2312 | -+#define PHYS_JJ_ESP_IRQ 4 | |
2313 | -+#define BUFSIZE 4096 | |
2314 | -+/* | |
2315 | -+ * XXX Crude | |
2316 | -+ */ | |
2317 | -+struct esp_dma { | |
2318 | -+ struct sparc_dma_registers *regs; | |
2319 | -+ enum dvma_rev revision; | |
2320 | -+}; | |
2321 | -+ | |
2322 | -+struct esp_regs { | |
2323 | -+ unsigned int regs[16]; | |
2324 | -+}; | |
2325 | -+ | |
2326 | -+struct esp_private { | |
2327 | -+ int active; /* initialized */ | |
2328 | -+ int inst; /* iface number */ | |
2329 | -+ | |
2330 | -+ volatile struct esp_regs *ll; | |
2331 | -+ __u32 buffer_dvma; | |
2332 | -+ unsigned int irq; /* device IRQ number */ | |
2333 | -+ int interrupt; | |
2334 | -+ | |
2335 | -+ struct esp_dma *espdma; /* If set this points to espdma */ | |
2336 | -+ | |
2337 | -+ unsigned char *buffer; | |
2338 | -+ struct disk_info { | |
2339 | -+ unsigned int hw_sector; | |
2340 | -+ unsigned int part_offset[8]; | |
2341 | -+ } disk[8]; | |
2342 | -+}; | |
2343 | -+ | |
2344 | -+static void esp_interrupt(void *dev_id) | |
2345 | -+{ | |
2346 | -+ struct esp_private *lp = (struct esp_private *)dev_id; | |
2347 | -+ | |
2348 | -+ lp->interrupt = 1; | |
2349 | -+ /* Acknowledge all the interrupt sources ASAP */ | |
2350 | -+ | |
2351 | -+ lp->interrupt = 0; | |
2352 | -+} | |
2353 | -+ | |
2354 | -+static int esp_open (void *dev) | |
2355 | -+{ | |
2356 | -+ struct esp_private *lp = (struct esp_private *)dev; | |
2357 | -+ int status = 0; | |
2358 | -+ | |
2359 | -+ if (request_irq(lp->irq, &esp_interrupt, (void *)dev)) { | |
2360 | -+ printk ("Esp: Can't get irq %d\n", lp->irq); | |
2361 | -+ return -1; | |
2362 | -+ } | |
2363 | -+ | |
2364 | -+ /* On the 4m, setup the espdma to provide the upper bits for buffers */ | |
2365 | -+ if (lp->espdma) | |
2366 | -+ lp->espdma->regs->dma_test = ((__u32) lp->buffer_dvma) & 0xff000000; | |
2367 | -+ | |
2368 | -+ return status; | |
2369 | -+} | |
2370 | -+ | |
2371 | -+static int esp_close (void *dev) | |
2372 | -+{ | |
2373 | -+ struct esp_private *lp = (struct esp_private *)dev; | |
2374 | -+ | |
2375 | -+ free_irq (lp->irq, (void *) dev); | |
2376 | -+ return 0; | |
2377 | -+} | |
2378 | -+ | |
2379 | -+static int | |
2380 | -+esp_init(struct esp_private *esp, struct esp_dma *espdma, int irq) | |
2381 | -+{ | |
2382 | -+ volatile struct esp_regs *ll; | |
2383 | -+ | |
2384 | -+ /* Get the IO region */ | |
2385 | -+ ll = map_io(PHYS_JJ_ESP, sizeof (struct esp_regs)); | |
2386 | -+ if (ll == 0) return -1; | |
2387 | -+ | |
2388 | -+ esp->buffer = dvma_alloc(BUFSIZE, &esp->buffer_dvma); | |
2389 | -+ esp->ll = ll; | |
2390 | -+ esp->espdma = espdma; | |
2391 | -+ esp->irq = irq; | |
2392 | -+ | |
2393 | -+ // Chip reset | |
2394 | -+ stb_bypass((int)ll + 3*2, 2); | |
2395 | -+ return 0; | |
2396 | -+} | |
2397 | -+ | |
2398 | -+static int espdma_init(struct esp_dma *espdma) | |
2399 | -+{ | |
2400 | -+ void *p; | |
2401 | -+ | |
2402 | -+ /* Hardcode everything for MrCoffee. */ | |
2403 | -+ if ((p = map_io(PHYS_JJ_ESPDMA, 0x10)) == 0) { | |
2404 | -+ printk("espdma_init: cannot map registers\n"); | |
2405 | -+ return -1; | |
2406 | -+ } | |
2407 | -+ espdma->regs = p; | |
2408 | -+ | |
2409 | -+ printk("dma1: "); | |
2410 | -+ | |
2411 | -+ switch((espdma->regs->cond_reg)&DMA_DEVICE_ID) { | |
2412 | -+ case DMA_VERS0: | |
2413 | -+ espdma->revision=dvmarev0; | |
2414 | -+ printk("Revision 0 "); | |
2415 | -+ break; | |
2416 | -+ case DMA_ESCV1: | |
2417 | -+ espdma->revision=dvmaesc1; | |
2418 | -+ printk("ESC Revision 1 "); | |
2419 | -+ break; | |
2420 | -+ case DMA_VERS1: | |
2421 | -+ espdma->revision=dvmarev1; | |
2422 | -+ printk("Revision 1 "); | |
2423 | -+ break; | |
2424 | -+ case DMA_VERS2: | |
2425 | -+ espdma->revision=dvmarev2; | |
2426 | -+ printk("Revision 2 "); | |
2427 | -+ break; | |
2428 | -+ case DMA_VERHME: | |
2429 | -+ espdma->revision=dvmahme; | |
2430 | -+ printk("HME DVMA gate array "); | |
2431 | -+ break; | |
2432 | -+ case DMA_VERSPLUS: | |
2433 | -+ espdma->revision=dvmarevplus; | |
2434 | -+ printk("Revision 1 PLUS "); | |
2435 | -+ break; | |
2436 | -+ default: | |
2437 | -+ printk("unknown dma version %x", | |
2438 | -+ (espdma->regs->cond_reg)&DMA_DEVICE_ID); | |
2439 | -+ /* espdma->allocated = 1; */ | |
2440 | -+ break; | |
2441 | -+ } | |
2442 | -+ printk("\n"); | |
2443 | -+ return 0; | |
2444 | -+} | |
2445 | -+ | |
2446 | -+static struct esp_dma espdma0; | |
2447 | -+static struct esp_private esp; | |
2448 | -+/* | |
2449 | -+ * Find all the esp cards on the system and initialize them | |
2450 | -+ */ | |
2451 | -+void esp_probe () | |
2452 | -+{ | |
2453 | -+ if (espdma_init(&espdma0) != 0) { | |
2454 | -+ return; | |
2455 | -+ } | |
2456 | -+ | |
2457 | -+ if (esp_init(&esp, &espdma0, PHYS_JJ_ESP_IRQ) != 0) { | |
2458 | -+ printk("esp_probe: esp0 init failed\n"); | |
2459 | -+ return; | |
2460 | -+ } | |
2461 | -+ return; | |
2462 | -+} | |
2463 | -+ | |
2464 | -+void esp_read_capacity(int unit) | |
2465 | -+{ | |
2466 | -+ // Set SCSI target | |
2467 | -+ stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7); | |
2468 | -+ // Set DMA address | |
2469 | -+ st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma); | |
2470 | -+ // Set DMA length | |
2471 | -+ stb_bypass(PHYS_JJ_ESP + 0*4, 10); | |
2472 | -+ stb_bypass(PHYS_JJ_ESP + 1*4, 0); | |
2473 | -+ // Set DMA direction | |
2474 | -+ st_bypass(PHYS_JJ_ESPDMA + 0, 0x000); | |
2475 | -+ // Setup command = Read Capacity | |
2476 | -+ esp.buffer[0] = 0x80; | |
2477 | -+ esp.buffer[1] = 0x25; | |
2478 | -+ esp.buffer[2] = 0x00; | |
2479 | -+ esp.buffer[3] = 0x00; | |
2480 | -+ esp.buffer[4] = 0x00; | |
2481 | -+ esp.buffer[5] = 0x00; | |
2482 | -+ esp.buffer[6] = 0x00; | |
2483 | -+ esp.buffer[7] = 0x00; | |
2484 | -+ esp.buffer[8] = 0x00; | |
2485 | -+ esp.buffer[9] = 0x00; | |
2486 | -+ esp.buffer[10] = 0x00; | |
2487 | -+ // Set ATN, issue command | |
2488 | -+ stb_bypass(PHYS_JJ_ESP + 3*4, 0xc2); | |
2489 | -+ | |
2490 | -+ // Set DMA length = 512 * read length | |
2491 | -+ stb_bypass(PHYS_JJ_ESP + 0*4, 0); | |
2492 | -+ stb_bypass(PHYS_JJ_ESP + 1*4, 8 & 0xff); | |
2493 | -+ // Set DMA direction | |
2494 | -+ st_bypass(PHYS_JJ_ESPDMA + 0, 0x100); | |
2495 | -+ // Transfer | |
2496 | -+ stb_bypass(PHYS_JJ_ESP + 3*4, 0x90); | |
2497 | -+ esp.disk[unit].hw_sector = (esp.buffer[4] << 24) | (esp.buffer[5] << 16) | (esp.buffer[6] << 8) | esp.buffer[7]; | |
2498 | -+} | |
2499 | -+ | |
2500 | -+// offset is multiple of 512, len in bytes | |
2501 | -+void *esp_read(int unit, int part, int offset, short len) | |
2502 | -+{ | |
2503 | -+ int pos, hw_sect, sect_offset, spb; | |
2504 | -+ | |
2505 | -+ // Set SCSI target | |
2506 | -+ stb_bypass(PHYS_JJ_ESP + 4*4, unit & 7); | |
2507 | -+ // Set DMA address | |
2508 | -+ st_bypass(PHYS_JJ_ESPDMA + 4, esp.buffer_dvma); | |
2509 | -+ // Set DMA length | |
2510 | -+ stb_bypass(PHYS_JJ_ESP + 0*4, 10); | |
2511 | -+ stb_bypass(PHYS_JJ_ESP + 1*4, 0); | |
2512 | -+ // Set DMA direction | |
2513 | -+ st_bypass(PHYS_JJ_ESPDMA + 0, 0x000); | |
2514 | -+ hw_sect = esp.disk[unit].hw_sector; | |
2515 | -+ offset += esp.disk[unit].part_offset[part]; | |
2516 | -+ spb = hw_sect / 512; | |
2517 | -+ sect_offset = offset / spb; | |
2518 | -+ pos = (offset - sect_offset * spb) * 512; | |
2519 | -+ len /= 512; | |
2520 | -+ //printk("Read unit %d, offset %d -> offset %d, pos %d, hw_sect %d\n", unit, offset, sect_offset, pos, hw_sect); | |
2521 | -+ // Setup command = Read(10) | |
2522 | -+ esp.buffer[0] = 0x80; | |
2523 | -+ esp.buffer[1] = 0x28; | |
2524 | -+ esp.buffer[2] = 0x00; | |
2525 | -+ esp.buffer[3] = (sect_offset >> 24) & 0xff; | |
2526 | -+ esp.buffer[4] = (sect_offset >> 16) & 0xff; | |
2527 | -+ esp.buffer[5] = (sect_offset >> 8) & 0xff; | |
2528 | -+ esp.buffer[6] = sect_offset & 0xff; | |
2529 | -+ esp.buffer[7] = 0x00; | |
2530 | -+ esp.buffer[8] = (len >> 8) & 0xff; | |
2531 | -+ esp.buffer[9] = len & 0xff; | |
2532 | -+ // Set ATN, issue command | |
2533 | -+ stb_bypass(PHYS_JJ_ESP + 3*4, 0xc2); | |
2534 | -+ | |
2535 | -+ // Set DMA length = sector size * read length | |
2536 | -+ stb_bypass(PHYS_JJ_ESP + 0*4, (len * hw_sect) & 0xff); | |
2537 | -+ stb_bypass(PHYS_JJ_ESP + 1*4, ((len * hw_sect) >> 8) & 0xff); | |
2538 | -+ // Set DMA direction | |
2539 | -+ st_bypass(PHYS_JJ_ESPDMA + 0, 0x100); | |
2540 | -+ // Transfer | |
2541 | -+ stb_bypass(PHYS_JJ_ESP + 3*4, 0x90); | |
2542 | -+ return esp.buffer + pos; | |
2543 | -+} | |
2544 | -+ | |
2545 | -+// Sparc boot sequence can be found in SILO docs, | |
2546 | -+// first-isofs/README.SILO_ISOFS | |
2547 | -+int esp_boot(int unit) | |
2548 | -+{ | |
2549 | -+ struct sun_disklabel { | |
2550 | -+ unsigned char info[128]; /* Informative text string */ | |
2551 | -+ unsigned char spare0[14]; | |
2552 | -+ struct sun_info { | |
2553 | -+ unsigned char spare1; | |
2554 | -+ unsigned char id; | |
2555 | -+ unsigned char spare2; | |
2556 | -+ unsigned char flags; | |
2557 | -+ } infos[8]; | |
2558 | -+ unsigned char spare[246]; /* Boot information etc. */ | |
2559 | -+ short rspeed; /* Disk rotational speed */ | |
2560 | -+ short pcylcount; /* Physical cylinder count */ | |
2561 | -+ short sparecyl; /* extra sects per cylinder */ | |
2562 | -+ unsigned char spare2[4]; /* More magic... */ | |
2563 | -+ short ilfact; /* Interleave factor */ | |
2564 | -+ short ncyl; /* Data cylinder count */ | |
2565 | -+ short nacyl; /* Alt. cylinder count */ | |
2566 | -+ short ntrks; /* Tracks per cylinder */ | |
2567 | -+ short nsect; /* Sectors per track */ | |
2568 | -+ unsigned char spare3[4]; /* Even more magic... */ | |
2569 | -+ struct sun_partition { | |
2570 | -+ int start_cylinder; | |
2571 | -+ int num_sectors; | |
2572 | -+ } partitions[8]; | |
2573 | -+ short magic; /* Magic number */ | |
2574 | -+ short csum; /* Label xor'd checksum */ | |
2575 | -+ } *label; | |
2576 | -+ unsigned int i, offset; | |
2577 | -+ void *src, *dst; | |
2578 | -+ | |
2579 | -+ printk("Loading partition table from target %d:\n", unit); | |
2580 | -+ // Chip reset | |
2581 | -+ stb_bypass(PHYS_JJ_ESP + 3*4, 2); | |
2582 | -+ | |
2583 | -+ esp_open(&esp); | |
2584 | -+ esp_read_capacity(unit); | |
2585 | -+ | |
2586 | -+ label = esp_read(unit, 0, 0, 512); | |
2587 | -+ printk("hw sector: %d, CHS: %d/%d/%d, partitions:\n", esp.disk[unit].hw_sector, | |
2588 | -+ label->ncyl, label->ntrks, label->nsect); | |
2589 | -+ for (i = 0; i < 8; i++) { | |
2590 | -+ printk("%c: %d + %d, id %x, flags %x\n", 'a' + i, label->partitions[i].start_cylinder, | |
2591 | -+ label->partitions[i].num_sectors, label->infos[i].id, label->infos[i].flags); | |
2592 | -+ esp.disk[unit].part_offset[i] = label->partitions[3].start_cylinder * label->ntrks * label->nsect; | |
2593 | -+ } | |
2594 | -+ offset = 1; | |
2595 | -+ printk("booting sd(0,%d,0):d (offset %d)\n", unit, offset); | |
2596 | -+ // Skip a.out header (0x20) | |
2597 | -+ dst = (void *)0x4000; | |
2598 | -+ src = esp_read(unit, 3, offset, 512); | |
2599 | -+ src = (void *)((unsigned int) src + 0x20); | |
2600 | -+ memcpy(dst, src, 512 - 0x20); | |
2601 | -+ dst = (void *)0x4000 + 512 - 0x20; | |
2602 | -+ for (i = 1; i < 7680/512; i++) { | |
2603 | -+ src = esp_read(unit, 3, offset + i, 512); | |
2604 | -+ memcpy(dst, src, 512); | |
2605 | -+ dst += 512; | |
2606 | -+ } | |
2607 | -+ esp_close(&esp); | |
2608 | -+ return 0; | |
2609 | -+} | |
2610 | -diff -ruN proll_18.orig/src/hconsole.c proll-patch-15/src/hconsole.c | |
2611 | ---- proll_18.orig/src/hconsole.c 2002-07-23 05:52:48.000000000 +0000 | |
2612 | -+++ proll-patch-15/src/hconsole.c 2005-11-09 18:46:34.000000000 +0000 | |
2613 | -@@ -29,6 +29,10 @@ | |
2614 | - struct raster r_master; /* For a case of resize, whole fb */ | |
2615 | - struct raster r_0; /* malloc() erzatz */ | |
2616 | - | |
2617 | -+#ifdef QEMU | |
2618 | -+extern unsigned int q_height, q_width; | |
2619 | -+#endif | |
2620 | -+ | |
2621 | - int hcon_init(struct hconsole *t, unsigned int a0) | |
2622 | - { | |
2623 | - struct raster *q, *r; | |
2624 | -@@ -42,7 +46,11 @@ | |
2625 | - * No probing sequence or argument passing, hardcode everything. XXX | |
2626 | - */ | |
2627 | - raster8_cons_a(q, 768, 1024, (char *)a0); | |
2628 | -+#ifndef QEMU | |
2629 | - raster_cons_2(r, q, 768-(24*11)-1, 1024-(8*80)-1, (24*11), (8*80)); | |
2630 | -+#else | |
2631 | -+ raster_cons_2(r, q, 0, 0, q_height, q_width); | |
2632 | -+#endif | |
2633 | - t->r_ = r; | |
2634 | - t->r0_ = q; | |
2635 | - t->f_ = &f_master; | |
2636 | -@@ -67,7 +75,7 @@ | |
2637 | - return 0; | |
2638 | - } | |
2639 | - | |
2640 | --void hcon_fini (struct hconsole *t) | |
2641 | -+void hcon_fini (__attribute((unused)) struct hconsole *t) | |
2642 | - { | |
2643 | - return; | |
2644 | - } | |
2645 | -@@ -77,12 +85,12 @@ | |
2646 | - { | |
2647 | - struct rfont *f = t->f_; | |
2648 | - | |
2649 | -- if (sy < 0 || sy >= t->ydim_) return -1; | |
2650 | -- if (sx < 0 || sx >= t->xdim_) return -1; | |
2651 | -+ if (sy < 0 || (unsigned)sy >= t->ydim_) return -1; | |
2652 | -+ if (sx < 0 || (unsigned)sx >= t->xdim_) return -1; | |
2653 | - if (height < 0) return -1; | |
2654 | -- if (sy + height > t->ydim_) height = t->ydim_ - sy; | |
2655 | -+ if ((unsigned)sy + (unsigned)height > t->ydim_) height = t->ydim_ - sy; | |
2656 | - if (width < 0) return -1; | |
2657 | -- if (sx + width > t->xdim_) width = t->xdim_ - sx; | |
2658 | -+ if ((unsigned)sx + (unsigned)width > t->xdim_) width = t->xdim_ - sx; | |
2659 | - | |
2660 | - /* XXX Clear with correct background color */ | |
2661 | - (*t->r_->clear_)(t->r_, | |
2662 | -@@ -107,10 +115,10 @@ | |
2663 | - char c0 = c; | |
2664 | - RC_color rfg, rbg; | |
2665 | - | |
2666 | -- if (y < 0 || y >= t->ydim_) return -1; | |
2667 | -- if (x < 0 || x >= t->xdim_) return -1; | |
2668 | -+ if (y < 0 || (unsigned)y >= t->ydim_) return -1; | |
2669 | -+ if (x < 0 || (unsigned)x >= t->xdim_) return -1; | |
2670 | - | |
2671 | -- if (t->curson_ && t->ypos_ == y && t->xpos_ == x) { | |
2672 | -+ if (t->curson_ && t->ypos_ == (unsigned)y && t->xpos_ == (unsigned)x) { | |
2673 | - rfg = t->bg_; rbg = t->fg_; | |
2674 | - } else { | |
2675 | - rfg = t->fg_; rbg = t->bg_; | |
2676 | -@@ -126,9 +134,9 @@ | |
2677 | - { | |
2678 | - struct rfont *f = t->f_; | |
2679 | - | |
2680 | -- if (y < 0 || y >= t->ydim_) return -1; | |
2681 | -- if (x < 0 || x >= t->xdim_) return -1; | |
2682 | -- if (x + count >= t->xdim_) count = t->xdim_ - x; | |
2683 | -+ if (y < 0 || (unsigned)y >= t->ydim_) return -1; | |
2684 | -+ if (x < 0 || (unsigned)x >= t->xdim_) return -1; | |
2685 | -+ if ((unsigned)x + (unsigned)count >= t->xdim_) count = t->xdim_ - x; | |
2686 | - | |
2687 | - (*t->r_->render_)(t->r_, y*f->height_, x*f->width_, | |
2688 | - s, count, t->bg_, t->fg_, f); | |
2689 | -@@ -200,8 +208,8 @@ | |
2690 | - | |
2691 | - rc = 0; | |
2692 | - if (dir == SM_UP) { | |
2693 | -- if (d < 0 || d >= t->ydim_) return -1; | |
2694 | -- if (b <= d || b > t->ydim_) return -1; | |
2695 | -+ if (d < 0 || (unsigned)d >= t->ydim_) return -1; | |
2696 | -+ if (b <= d || (unsigned)b > t->ydim_) return -1; | |
2697 | - if (d + count >= b) count = b - d; | |
2698 | - if (d + count >= b) count = b - d; | |
2699 | - (*t->r_->yscroll_)(t->r_, | |
2700 | -@@ -213,8 +221,8 @@ | |
2701 | - count*f->height_, raster_qwidth(t->r_), | |
2702 | - t->bg_); | |
2703 | - } else if (dir == SM_DOWN) { | |
2704 | -- if (d < 0 || d >= t->ydim_) return -1; | |
2705 | -- if (b <= d || b > t->ydim_) return -1; | |
2706 | -+ if (d < 0 || (unsigned)d >= t->ydim_) return -1; | |
2707 | -+ if (b <= d || (unsigned)b > t->ydim_) return -1; | |
2708 | - if (d + count >= b) count = b - d; | |
2709 | - (*t->r_->yscroll_)(t->r_, | |
2710 | - d*f->height_, 0, | |
2711 | -diff -ruN proll_18.orig/src/hme.c proll-patch-15/src/hme.c | |
2712 | ---- proll_18.orig/src/hme.c 2002-07-23 05:52:52.000000000 +0000 | |
2713 | -+++ proll-patch-15/src/hme.c 2005-04-16 06:16:20.000000000 +0000 | |
2714 | -@@ -655,10 +655,10 @@ | |
2715 | - unsigned int flags, | |
2716 | - unsigned int addr) | |
2717 | - { | |
2718 | -- __asm__ __volatile__(" | |
2719 | -- stwa %3, [%0] %2 | |
2720 | -- stwa %4, [%1] %2 | |
2721 | --" : /* no outputs */ | |
2722 | -+ __asm__ __volatile__( | |
2723 | -+ "stwa %3, [%0] %2\n\t" | |
2724 | -+ "stwa %4, [%1] %2\n\t" | |
2725 | -+ : /* no outputs */ | |
2726 | - : "r" (&rp->rx_addr), "r" (&rp->rx_flags), | |
2727 | - "i" (ASI_PL), "r" (addr), "r" (flags)); | |
2728 | - } | |
2729 | -@@ -667,10 +667,10 @@ | |
2730 | - unsigned int flags, | |
2731 | - unsigned int addr) | |
2732 | - { | |
2733 | -- __asm__ __volatile__(" | |
2734 | -- stwa %3, [%0] %2 | |
2735 | -- stwa %4, [%1] %2 | |
2736 | --" : /* no outputs */ | |
2737 | -+ __asm__ __volatile__( | |
2738 | -+ "stwa %3, [%0] %2\n\t" | |
2739 | -+ "stwa %4, [%1] %2\n\t" | |
2740 | -+ : /* no outputs */ | |
2741 | - : "r" (&tp->tx_addr), "r" (&tp->tx_flags), | |
2742 | - "i" (ASI_PL), "r" (addr), "r" (flags)); | |
2743 | - } | |
2744 | -@@ -2404,7 +2404,7 @@ | |
2745 | - TXD(("[%d]", elem)); | |
2746 | - this = &txbase[elem]; | |
2747 | - #ifdef __sparc_v9__ | |
2748 | -- __asm__ __volatile__("lduwa [%1] %2, %0" | |
2749 | -+ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" | |
2750 | - : "=r" (flags) | |
2751 | - : "r" (&this->tx_flags), "i" (ASI_PL)); | |
2752 | - #else | |
2753 | -@@ -2447,7 +2447,7 @@ | |
2754 | - RXD(("RX<")); | |
2755 | - this = &rxbase[elem]; | |
2756 | - #ifdef __sparc_v9__ | |
2757 | -- __asm__ __volatile__("lduwa [%1] %2, %0" | |
2758 | -+ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" | |
2759 | - : "=r" (flags) | |
2760 | - : "r" (&this->rx_flags), "i" (ASI_PL)); | |
2761 | - #else | |
2762 | -@@ -2530,7 +2530,7 @@ | |
2763 | - elem = NEXT_RX(elem); | |
2764 | - this = &rxbase[elem]; | |
2765 | - #ifdef __sparc_v9__ | |
2766 | -- __asm__ __volatile__("lduwa [%1] %2, %0" | |
2767 | -+ __asm__ __volatile__("lduwa [%1] %2, %0\n\t" | |
2768 | - : "=r" (flags) | |
2769 | - : "r" (&this->rx_flags), "i" (ASI_PL)); | |
2770 | - #else | |
2771 | -diff -ruN proll_18.orig/src/iommu.c proll-patch-15/src/iommu.c | |
2772 | ---- proll_18.orig/src/iommu.c 2002-07-23 05:52:49.000000000 +0000 | |
2773 | -+++ proll-patch-15/src/iommu.c 2005-08-14 10:08:17.000000000 +0000 | |
2774 | -@@ -36,7 +36,7 @@ | |
2775 | - unsigned int pa, ba; | |
2776 | - unsigned int npages; | |
2777 | - unsigned int mva, mpa; | |
2778 | -- int i; | |
2779 | -+ unsigned int i; | |
2780 | - unsigned int *iopte; | |
2781 | - | |
2782 | - npages = (size + (PAGE_SIZE-1)) / PAGE_SIZE; | |
2783 | -diff -ruN proll_18.orig/src/lat7_2.bm proll-patch-15/src/lat7_2.bm | |
2784 | ---- proll_18.orig/src/lat7_2.bm 1999-02-27 05:48:54.000000000 +0000 | |
2785 | -+++ proll-patch-15/src/lat7_2.bm 2004-11-13 15:50:49.000000000 +0000 | |
2786 | -@@ -1,6 +1,6 @@ | |
2787 | - #define lat7_2_width 128 | |
2788 | - #define lat7_2_height 88 | |
2789 | --static unsigned char lat7_2_bits[] = { | |
2790 | -+static unsigned const char lat7_2_bits[] = { | |
2791 | - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2792 | - 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x12, 0x1e, 0x0c, 0x02, 0x70, 0x18, | |
2793 | - 0x22, 0x22, 0x18, 0x00, 0x00, 0x18, 0x18, 0xff, 0x18, 0x00, 0x12, 0x02, | |
2794 | -diff -ruN proll_18.orig/src/lat7_2_swapped.bm proll-patch-15/src/lat7_2_swapped.bm | |
2795 | ---- proll_18.orig/src/lat7_2_swapped.bm 1970-01-01 00:00:00.000000000 +0000 | |
2796 | -+++ proll-patch-15/src/lat7_2_swapped.bm 2004-11-13 15:50:49.000000000 +0000 | |
2797 | -@@ -0,0 +1,121 @@ | |
2798 | -+#define lat7_2_width 128 | |
2799 | -+#define lat7_2_height 88 | |
2800 | -+static unsigned const char lat7_2_bits[] = { | |
2801 | -+ 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2802 | -+ 0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x2a, 0x00, 0x55, 0x00, 0x00, 0x48, | |
2803 | -+ 0x48, 0x78, 0x48, 0x5f, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, 0x78, 0x40, | |
2804 | -+ 0x70, 0x40, 0x4f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x30, 0x40, 0x40, | |
2805 | -+ 0x40, 0x3e, 0x09, 0x0e, 0x0a, 0x09, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, | |
2806 | -+ 0x7f, 0x08, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x0e, 0x0a, 0x0e, 0x00, 0x00, | |
2807 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, | |
2808 | -+ 0x7e, 0x00, 0x00, 0x00, 0x00, 0x44, 0x64, 0x54, 0x4c, 0x54, 0x10, 0x10, | |
2809 | -+ 0x10, 0x1f, 0x00, 0x00, 0x44, 0x44, 0x44, 0x28, 0x1f, 0x04, 0x04, 0x04, | |
2810 | -+ 0x04, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00, 0x00, | |
2811 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x00, | |
2812 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, | |
2813 | -+ 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, | |
2814 | -+ 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0xff, 0x00, | |
2815 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, | |
2816 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2817 | -+ 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2818 | -+ 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2819 | -+ 0x00, 0x00, 0xff, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, | |
2820 | -+ 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, | |
2821 | -+ 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, | |
2822 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x00, | |
2823 | -+ 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, | |
2824 | -+ 0x06, 0x0c, 0x18, 0x30, 0x18, 0x6c, 0x36, 0x18, 0x0c, 0x00, 0x00, 0x60, | |
2825 | -+ 0x30, 0x18, 0x0c, 0x18, 0x36, 0x6c, 0x18, 0x30, 0x00, 0x00, 0x7f, 0x36, | |
2826 | -+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x7e, | |
2827 | -+ 0x18, 0x7e, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x78, | |
2828 | -+ 0x30, 0x72, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, | |
2829 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, | |
2830 | -+ 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2831 | -+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, | |
2832 | -+ 0x00, 0x00, 0x00, 0x66, 0x66, 0x22, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2833 | -+ 0x00, 0x00, 0x36, 0x7f, 0x36, 0x36, 0x36, 0x7f, 0x36, 0x00, 0x00, 0x00, | |
2834 | -+ 0x00, 0x66, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, | |
2835 | -+ 0x72, 0x56, 0x6c, 0x18, 0x36, 0x6a, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x18, | |
2836 | -+ 0x24, 0x28, 0x30, 0x4a, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, | |
2837 | -+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x18, | |
2838 | -+ 0x18, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x18, | |
2839 | -+ 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0x7e, 0x3c, | |
2840 | -+ 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, | |
2841 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, | |
2842 | -+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, | |
2843 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, | |
2844 | -+ 0x00, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x40, 0x00, 0x00, 0x00, | |
2845 | -+ 0x00, 0x3c, 0x46, 0x4e, 0x5a, 0x72, 0x62, 0x3c, 0x00, 0x00, 0x00, 0x00, | |
2846 | -+ 0x18, 0x38, 0x58, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, | |
2847 | -+ 0x66, 0x06, 0x0c, 0x18, 0x32, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, | |
2848 | -+ 0x06, 0x1c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, | |
2849 | -+ 0x66, 0x7e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x60, 0x7c, 0x66, | |
2850 | -+ 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x7c, 0x66, 0x66, | |
2851 | -+ 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x06, 0x0c, 0x18, 0x30, | |
2852 | -+ 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x3c, 0x66, 0x66, 0x3c, | |
2853 | -+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, | |
2854 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, | |
2855 | -+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x08, 0x10, 0x00, | |
2856 | -+ 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, | |
2857 | -+ 0x00, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, | |
2858 | -+ 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, | |
2859 | -+ 0x06, 0x0c, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x5e, | |
2860 | -+ 0x56, 0x5e, 0x40, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x66, | |
2861 | -+ 0x7e, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x7c, 0x66, | |
2862 | -+ 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x60, 0x66, | |
2863 | -+ 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, | |
2864 | -+ 0x00, 0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x62, 0x7e, 0x00, | |
2865 | -+ 0x00, 0x00, 0x00, 0x7e, 0x62, 0x60, 0x78, 0x60, 0x60, 0x60, 0x00, 0x00, | |
2866 | -+ 0x00, 0x00, 0x3c, 0x66, 0x60, 0x6e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, | |
2867 | -+ 0x00, 0x66, 0x66, 0x66, 0x7e, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, | |
2868 | -+ 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7e, | |
2869 | -+ 0x46, 0x06, 0x06, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6c, | |
2870 | -+ 0x78, 0x70, 0x78, 0x6c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x60, | |
2871 | -+ 0x60, 0x60, 0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, 0x77, 0x7f, | |
2872 | -+ 0x6b, 0x63, 0x63, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x76, 0x7e, 0x6e, | |
2873 | -+ 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x66, | |
2874 | -+ 0x3c, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, | |
2875 | -+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x6e, 0x3c, 0x02, | |
2876 | -+ 0x00, 0x00, 0x00, 0x7c, 0x66, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0x00, 0x00, | |
2877 | -+ 0x00, 0x00, 0x3c, 0x66, 0x60, 0x3c, 0x06, 0x66, 0x3c, 0x00, 0x00, 0x00, | |
2878 | -+ 0x00, 0x7e, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, | |
2879 | -+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x66, | |
2880 | -+ 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x63, 0x63, | |
2881 | -+ 0x63, 0x6b, 0x6b, 0x7f, 0x36, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x3c, | |
2882 | -+ 0x18, 0x3c, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, | |
2883 | -+ 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x46, 0x0c, 0x18, 0x30, | |
2884 | -+ 0x62, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, | |
2885 | -+ 0x3c, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, | |
2886 | -+ 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00, | |
2887 | -+ 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2888 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, | |
2889 | -+ 0x00, 0x08, 0x10, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2890 | -+ 0x00, 0x3c, 0x06, 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, | |
2891 | -+ 0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2892 | -+ 0x3c, 0x66, 0x60, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, | |
2893 | -+ 0x3e, 0x66, 0x66, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, | |
2894 | -+ 0x7e, 0x60, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x36, 0x30, 0x30, 0x78, | |
2895 | -+ 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, 0x66, 0x66, | |
2896 | -+ 0x3e, 0x06, 0x3c, 0x00, 0x00, 0x60, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x66, | |
2897 | -+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x1c, 0x00, | |
2898 | -+ 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x6c, 0x38, | |
2899 | -+ 0x00, 0x00, 0x60, 0x60, 0x66, 0x6c, 0x78, 0x7c, 0x66, 0x00, 0x00, 0x00, | |
2900 | -+ 0x00, 0x60, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, | |
2901 | -+ 0x00, 0x00, 0x76, 0x7f, 0x6b, 0x6b, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2902 | -+ 0x00, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
2903 | -+ 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, | |
2904 | -+ 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x66, | |
2905 | -+ 0x66, 0x66, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x72, 0x60, | |
2906 | -+ 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x60, 0x3c, 0x06, | |
2907 | -+ 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x78, 0x30, 0x30, 0x36, 0x1c, | |
2908 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3a, 0x00, | |
2909 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x00, 0x00, | |
2910 | -+ 0x00, 0x00, 0x00, 0x00, 0x63, 0x6b, 0x6b, 0x6b, 0x36, 0x00, 0x00, 0x00, | |
2911 | -+ 0x00, 0x00, 0x00, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, | |
2912 | -+ 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x3c, 0x00, 0x00, 0x00, | |
2913 | -+ 0x00, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, | |
2914 | -+ 0x18, 0x30, 0x18, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, | |
2915 | -+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x30, 0x18, 0x18, 0x0c, | |
2916 | -+ 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0x00, 0x00, 0x00, | |
2917 | -+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x42, 0x00, 0x00, 0x00, 0x00, | |
2918 | -+ 0x00, 0x00, 0x00, 0x00}; | |
2919 | -diff -ruN proll_18.orig/src/le.c proll-patch-15/src/le.c | |
2920 | ---- proll_18.orig/src/le.c 2002-07-23 05:52:49.000000000 +0000 | |
2921 | -+++ proll-patch-15/src/le.c 2005-04-16 06:16:20.000000000 +0000 | |
2922 | -@@ -185,8 +185,6 @@ | |
2923 | - unsigned short rap; /* register address port */ | |
2924 | - }; | |
2925 | - | |
2926 | --int sparc_lance_debug = 2; | |
2927 | -- | |
2928 | - /* The Lance uses 24 bit addresses */ | |
2929 | - /* On the Sun4c the DVMA will provide the remaining bytes for us */ | |
2930 | - /* On the Sun4m we have to instruct the ledma to provide them */ | |
2931 | -@@ -771,7 +769,7 @@ | |
2932 | - /* Clear the slack of the packet, do I need this? */ | |
2933 | - /* For a firewall its a good idea - AC */ | |
2934 | - if (len != skblen) | |
2935 | -- bzero((char *) &ib->tx_buf [entry][skblen], len - skblen); | |
2936 | -+ memset((char *) &ib->tx_buf [entry][skblen], 0, len - skblen); | |
2937 | - | |
2938 | - /* Now, give the packet to the lance */ | |
2939 | - ib->btx_ring [entry].tmd1_bits = (LE_T1_POK|LE_T1_OWN); | |
2940 | -diff -ruN proll_18.orig/src/net.h proll-patch-15/src/net.h | |
2941 | ---- proll_18.orig/src/net.h 1999-12-15 17:20:17.000000000 +0000 | |
2942 | -+++ proll-patch-15/src/net.h 2005-08-14 10:17:02.000000000 +0000 | |
2943 | -@@ -124,7 +124,7 @@ | |
2944 | - extern int udp_open __P((t_ipaddr daddr, int source, int dest)); | |
2945 | - | |
2946 | - /* Read from a UDP socket */ | |
2947 | --extern int udp_read __P((char *buf, int bufsize, int timeout, char abortch)); | |
2948 | -+extern int udp_read(char *buf, unsigned int bufsize, int timeout); | |
2949 | - | |
2950 | - /* Write to a UDP socket */ | |
2951 | - extern int udp_write __P((char *buf, int writelen)); | |
2952 | -diff -ruN proll_18.orig/src/netinit.c proll-patch-15/src/netinit.c | |
2953 | ---- proll_18.orig/src/netinit.c 2002-09-13 21:53:33.000000000 +0000 | |
2954 | -+++ proll-patch-15/src/netinit.c 2004-11-13 15:50:49.000000000 +0000 | |
2955 | -@@ -49,13 +49,20 @@ | |
2956 | - unsigned char myhwaddr[ETH_ALEN]; /* my own hardware addr */ | |
2957 | - t_ipaddr myipaddr; /* my own IP address */ | |
2958 | - t_ipaddr mynetmask; /* my own netmask */ | |
2959 | -- char *net_module_name; /* name of init module */ | |
2960 | - t_ipaddr servaddr; /* IP of RARP&TFTP server */ | |
2961 | - | |
2962 | - /* Broadcast hardware address */ | |
2963 | --unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | |
2964 | -+const unsigned char bcasthw[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | |
2965 | - | |
2966 | - | |
2967 | -+unsigned int seed; | |
2968 | -+ | |
2969 | -+/* This is taken from x86 to be used in network kernel. Returns 15 bits. */ | |
2970 | -+short int random() | |
2971 | -+{ | |
2972 | -+ seed = (seed + 23968)*0x015A4E35 >> 1; | |
2973 | -+ return seed & 0x7FFF; | |
2974 | -+} | |
2975 | - | |
2976 | - /* | |
2977 | - ************************************************************************** | |
2978 | -@@ -104,10 +111,17 @@ | |
2979 | - */ | |
2980 | - void init_net() | |
2981 | - { | |
2982 | -+ /* Avoid data segment allocations */ | |
2983 | -+ seed = 151; | |
2984 | -+ | |
2985 | - /* Initialize the different network layer modules */ | |
2986 | - init_packet(); | |
2987 | -- if (!init_arp() || !init_udp()) { | |
2988 | -- printf("\nERROR: init_%s\n", net_module_name); | |
2989 | -+ if (!init_arp()) { | |
2990 | -+ printf("\nERROR: init_arp\n"); | |
2991 | -+ fatal(); | |
2992 | -+ } | |
2993 | -+ if (!init_udp()) { | |
2994 | -+ printf("\nERROR: init_udp\n"); | |
2995 | - fatal(); | |
2996 | - } | |
2997 | - } | |
2998 | -diff -ruN proll_18.orig/src/netpriv.h proll-patch-15/src/netpriv.h | |
2999 | ---- proll_18.orig/src/netpriv.h 1999-04-27 05:39:37.000000000 +0000 | |
3000 | -+++ proll-patch-15/src/netpriv.h 2005-08-14 10:12:20.000000000 +0000 | |
3001 | -@@ -83,7 +83,7 @@ | |
3002 | - */ | |
3003 | - struct device *dev; | |
3004 | - char *data; | |
3005 | -- int len; | |
3006 | -+ unsigned int len; | |
3007 | - int protocol; | |
3008 | - unsigned char ip_summed; | |
3009 | - }; | |
3010 | -@@ -130,10 +130,9 @@ | |
3011 | - * | |
3012 | - */ | |
3013 | - extern unsigned char myhwaddr[ETH_ALEN]; /* my own hardware address */ | |
3014 | --extern unsigned char bcasthw[ETH_ALEN]; /* broadcast hardware addr */ | |
3015 | -+extern const unsigned char bcasthw[ETH_ALEN]; /* broadcast hardware addr */ | |
3016 | - extern t_ipaddr myipaddr; /* my own IP address */ | |
3017 | - extern t_ipaddr mynetmask; /* netmask for my network */ | |
3018 | --extern char *net_module_name; /* initialized module's name */ | |
3019 | - extern t_ipaddr servaddr; /* server IP address */ | |
3020 | - | |
3021 | - | |
3022 | -@@ -150,7 +149,7 @@ | |
3023 | - extern unsigned char *reg_type __P((int typeval, int (* receive)())); | |
3024 | - | |
3025 | - /* Write a packet to the network */ | |
3026 | --extern int write_packet __P((int bufsize, int typeval, unsigned char *addr)); | |
3027 | -+extern int write_packet __P((int bufsize, int typeval, const unsigned char *addr)); | |
3028 | - | |
3029 | - /* Empty read buffer */ | |
3030 | - extern void empty_buf __P((void)); | |
3031 | -diff -ruN proll_18.orig/src/openprom.h proll-patch-15/src/openprom.h | |
3032 | ---- proll_18.orig/src/openprom.h 2002-07-14 02:26:30.000000000 +0000 | |
3033 | -+++ proll-patch-15/src/openprom.h 2005-05-13 16:23:14.000000000 +0000 | |
3034 | -@@ -54,29 +54,29 @@ | |
3035 | - }; | |
3036 | - | |
3037 | - struct linux_mem_v0 { | |
3038 | -- struct linux_mlist_v0 **v0_totphys; | |
3039 | -- struct linux_mlist_v0 **v0_prommap; | |
3040 | -- struct linux_mlist_v0 **v0_available; /* What we can use */ | |
3041 | -+ struct linux_mlist_v0 * const *v0_totphys; | |
3042 | -+ struct linux_mlist_v0 * const *v0_prommap; | |
3043 | -+ struct linux_mlist_v0 * const *v0_available; /* What we can use */ | |
3044 | - }; | |
3045 | - | |
3046 | - /* Arguments sent to the kernel from the boot prompt. */ | |
3047 | - struct linux_arguments_v0 { | |
3048 | -- char *argv[8]; | |
3049 | -+ const char *argv[8]; | |
3050 | - char args[100]; | |
3051 | - char boot_dev[2]; | |
3052 | - int boot_dev_ctrl; | |
3053 | - int boot_dev_unit; | |
3054 | - int dev_partition; | |
3055 | -- char *kernel_file_name; | |
3056 | -+ const char *kernel_file_name; | |
3057 | - void *aieee1; /* XXX */ | |
3058 | - }; | |
3059 | - | |
3060 | - /* V2 and up boot things. */ | |
3061 | - struct linux_bootargs_v2 { | |
3062 | -- char **bootpath; | |
3063 | -- char **bootargs; | |
3064 | -- int *fd_stdin; | |
3065 | -- int *fd_stdout; | |
3066 | -+ const char **bootpath; | |
3067 | -+ const char **bootargs; | |
3068 | -+ const int *fd_stdin; | |
3069 | -+ const int *fd_stdout; | |
3070 | - }; | |
3071 | - | |
3072 | - /* The top level PROM vector. */ | |
3073 | -@@ -91,13 +91,13 @@ | |
3074 | - struct linux_mem_v0 pv_v0mem; | |
3075 | - | |
3076 | - /* Node operations. */ | |
3077 | -- struct linux_nodeops *pv_nodeops; | |
3078 | -+ const struct linux_nodeops *pv_nodeops; | |
3079 | - | |
3080 | - char **pv_bootstr; | |
3081 | - struct linux_dev_v0_funcs pv_v0devops; | |
3082 | - | |
3083 | -- char *pv_stdin; | |
3084 | -- char *pv_stdout; | |
3085 | -+ const char *pv_stdin; | |
3086 | -+ const char *pv_stdout; | |
3087 | - #define PROMDEV_KBD 0 /* input from keyboard */ | |
3088 | - #define PROMDEV_SCREEN 0 /* output to screen */ | |
3089 | - #define PROMDEV_TTYA 1 /* in/out to ttya */ | |
3090 | -@@ -127,7 +127,7 @@ | |
3091 | - void (*v2_eval)(char *str); | |
3092 | - } pv_fortheval; | |
3093 | - | |
3094 | -- struct linux_arguments_v0 **pv_v0bootargs; | |
3095 | -+ const struct linux_arguments_v0 * const *pv_v0bootargs; | |
3096 | - | |
3097 | - /* Get ether address. */ | |
3098 | - unsigned int (*pv_enaddr)(int d, char *enaddr); | |
3099 | -@@ -175,7 +175,7 @@ | |
3100 | - int (*no_proplen)(int node, char *name); | |
3101 | - int (*no_getprop)(int node, char *name, char *val); | |
3102 | - int (*no_setprop)(int node, char *name, char *val, int len); | |
3103 | -- char * (*no_nextprop)(int node, char *name); | |
3104 | -+ const char * (*no_nextprop)(int node, char *name); | |
3105 | - }; | |
3106 | - | |
3107 | - /* More fun PROM structures for device probing. */ | |
3108 | -diff -ruN proll_18.orig/src/packet.c proll-patch-15/src/packet.c | |
3109 | ---- proll_18.orig/src/packet.c 2000-02-11 04:56:45.000000000 +0000 | |
3110 | -+++ proll-patch-15/src/packet.c 2005-08-14 10:12:49.000000000 +0000 | |
3111 | -@@ -41,7 +41,7 @@ | |
3112 | - int aligner; | |
3113 | - } wbuf; | |
3114 | - static struct sk_buff *rskb; | |
3115 | --static int nqskb = 0; | |
3116 | -+static int nqskb; | |
3117 | - | |
3118 | - | |
3119 | - void init_packet() | |
3120 | -@@ -62,6 +62,8 @@ | |
3121 | - for (i = 0; i < MAXSKBS; i++) { | |
3122 | - skev[i].skb.allocn = i; | |
3123 | - } | |
3124 | -+ | |
3125 | -+ nqskb = 0; | |
3126 | - } | |
3127 | - | |
3128 | - unsigned char *reg_type(int ptype, int (*func)()) | |
3129 | -@@ -81,7 +83,7 @@ | |
3130 | - return wbuf.s; | |
3131 | - } | |
3132 | - | |
3133 | --int write_packet(int leng, int type, unsigned char *dst) | |
3134 | -+int write_packet(int leng, int type, const unsigned char *dst) | |
3135 | - { | |
3136 | - struct sk_buff *skb; | |
3137 | - unsigned char *s; | |
3138 | -@@ -209,12 +211,12 @@ | |
3139 | - /* | |
3140 | - */ | |
3141 | - void | |
3142 | --eth_copy_and_sum(struct sk_buff *dest, unsigned char *src, int len, int base) | |
3143 | -+eth_copy_and_sum(struct sk_buff *dest, unsigned char *src, int len, __attribute__((unused)) int base) | |
3144 | - { | |
3145 | - bcopy(src, dest->data, len); | |
3146 | - } | |
3147 | - | |
3148 | --unsigned short eth_type_trans(struct sk_buff *skb, struct device *dev) | |
3149 | -+unsigned short eth_type_trans(struct sk_buff *skb, __attribute__((unused)) struct device *dev) | |
3150 | - { | |
3151 | - unsigned char *s = skb->data + 12; | |
3152 | - return s[0] << 8 | s[1]; /* Network order word */ | |
3153 | -diff -ruN proll_18.orig/src/printf.c proll-patch-15/src/printf.c | |
3154 | ---- proll_18.orig/src/printf.c 1999-03-19 07:03:59.000000000 +0000 | |
3155 | -+++ proll-patch-15/src/printf.c 2005-08-14 10:07:26.000000000 +0000 | |
3156 | -@@ -19,7 +19,7 @@ | |
3157 | - static void printn(struct prf_fp *, unsigned long, unsigned int); | |
3158 | - static void putchar(char, struct prf_fp *); | |
3159 | - | |
3160 | --static char hextab[] = "0123456789ABCDEF"; | |
3161 | -+static const char hextab[] = "0123456789ABCDEF"; | |
3162 | - | |
3163 | - /* | |
3164 | - * Scaled down version of C Library printf. | |
3165 | -@@ -41,7 +41,7 @@ | |
3166 | - void | |
3167 | - prf(struct prf_fp *filog, char *fmt, va_list adx) | |
3168 | - { | |
3169 | -- register c; | |
3170 | -+ register int c; | |
3171 | - char *s; | |
3172 | - | |
3173 | - for(;;) { | |
3174 | -@@ -60,7 +60,7 @@ | |
3175 | - putchar(va_arg(adx,unsigned), filog); | |
3176 | - } else if(c == 's') { | |
3177 | - s = va_arg(adx,char*); | |
3178 | -- while(c = *s++) | |
3179 | -+ while((c = *s++)) | |
3180 | - putchar(c,filog); | |
3181 | - } else if (c == 'l' || c == 'O') { | |
3182 | - printn(filog, (long)va_arg(adx,long), c=='l'?10:8); | |
3183 | -@@ -77,10 +77,6 @@ | |
3184 | - char prbuf[24]; | |
3185 | - register char *cp; | |
3186 | - | |
3187 | -- if (b == 10 && n < 0) { | |
3188 | -- putchar('-',filog); | |
3189 | -- n = (~n) + 1; /* n = -n */ | |
3190 | -- } | |
3191 | - cp = prbuf; | |
3192 | - do | |
3193 | - *cp++ = hextab[(unsigned int)(n%b)]; | |
3194 | -diff -ruN proll_18.orig/src/rconsole.c proll-patch-15/src/rconsole.c | |
3195 | ---- proll_18.orig/src/rconsole.c 1999-01-16 07:16:55.000000000 +0000 | |
3196 | -+++ proll-patch-15/src/rconsole.c 2005-08-14 10:25:53.000000000 +0000 | |
3197 | -@@ -28,12 +28,18 @@ | |
3198 | - * move to California. Only plain lat7 survived. | |
3199 | - * I recreated lat7-1 changes in lat7-2. --zaitcev | |
3200 | - */ | |
3201 | -+#ifdef ORIG | |
3202 | - #include "lat7_2.bm" /* lat7_1.bm */ | |
3203 | -+#else | |
3204 | -+#include "lat7_2_swapped.bm" /* lat7_1.bm */ | |
3205 | -+#endif | |
3206 | - #define LAT7_NCHARS 128 | |
3207 | - #define LAT7_HEIGHT 11 | |
3208 | - #define LAT7_WIDTH 8 | |
3209 | - | |
3210 | -+#ifdef ORIG | |
3211 | - static Rf_scan lat7_body[ LAT7_NCHARS*LAT7_HEIGHT ]; | |
3212 | -+#endif | |
3213 | - | |
3214 | - #if 1 | |
3215 | - /* | |
3216 | -@@ -46,18 +52,18 @@ | |
3217 | - #endif | |
3218 | - | |
3219 | - static __inline__ void stfb_w(void *ptr, unsigned int data) { | |
3220 | -- __asm__ __volatile__ ("sta %0, [%1] %2" : : | |
3221 | -+ __asm__ __volatile__ ("sta %0, [%1] %2\n\t" : : | |
3222 | - "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); | |
3223 | - } | |
3224 | - | |
3225 | - static __inline__ void stfb_b(void *ptr, unsigned int data) { | |
3226 | -- __asm__ __volatile__ ("stba %0, [%1] %2" : : | |
3227 | -+ __asm__ __volatile__ ("stba %0, [%1] %2\n\t" : : | |
3228 | - "r" (data), "r" (ptr), "i" (ASI_M_BYPASS)); | |
3229 | - } | |
3230 | - | |
3231 | - static __inline__ unsigned int ldfb_w(void *ptr) { | |
3232 | - unsigned int data; | |
3233 | -- __asm__ __volatile__ ("lda [%1] %2, %0" : | |
3234 | -+ __asm__ __volatile__ ("lda [%1] %2, %0\n\t" : | |
3235 | - "=r" (data) : | |
3236 | - "r" (ptr), "i" (ASI_M_BYPASS)); | |
3237 | - return data; | |
3238 | -@@ -65,7 +71,7 @@ | |
3239 | - | |
3240 | - static __inline__ unsigned int ldfb_b(void *ptr) { | |
3241 | - unsigned int data; | |
3242 | -- __asm__ __volatile__ ("lduba [%1] %2, %0" : | |
3243 | -+ __asm__ __volatile__ ("lduba [%1] %2, %0\n\t" : | |
3244 | - "=r" (data) : | |
3245 | - "r" (ptr), "i" (ASI_M_BYPASS)); | |
3246 | - return data; | |
3247 | -@@ -94,6 +100,7 @@ | |
3248 | - | |
3249 | - #endif | |
3250 | - | |
3251 | -+#ifdef ORIG | |
3252 | - static inline int swapbits(int w0) | |
3253 | - { | |
3254 | - int w1 = 0; | |
3255 | -@@ -105,13 +112,16 @@ | |
3256 | - } | |
3257 | - return w1; | |
3258 | - } | |
3259 | -+#endif | |
3260 | - | |
3261 | - void font_cons_7(struct rfont *p) | |
3262 | - { | |
3263 | -+#ifdef ORIG | |
3264 | - int x; | |
3265 | - int col = 0; | |
3266 | - int row = 0; | |
3267 | - int erow = 0; | |
3268 | -+ | |
3269 | - for (x = 0; x < LAT7_NCHARS*LAT7_HEIGHT; x++ ) { | |
3270 | - lat7_body[ (erow * lat7_2_width/8 + col) * LAT7_HEIGHT + row ] = | |
3271 | - swapbits(lat7_2_bits[x]) & 0xFF; | |
3272 | -@@ -124,6 +134,9 @@ | |
3273 | - } | |
3274 | - } | |
3275 | - p->body_ = lat7_body; | |
3276 | -+#else | |
3277 | -+ p->body_ = lat7_2_bits; | |
3278 | -+#endif | |
3279 | - p->nchars_ = LAT7_NCHARS; | |
3280 | - p->width_ = LAT7_WIDTH; | |
3281 | - p->height_ = LAT7_HEIGHT; | |
3282 | -@@ -175,7 +188,7 @@ | |
3283 | - r->render_ = p->render_; | |
3284 | - } | |
3285 | - | |
3286 | --void raster_dest(struct raster *r) | |
3287 | -+void raster_dest(__attribute((unused)) struct raster *r) | |
3288 | - { | |
3289 | - } | |
3290 | - | |
3291 | -diff -ruN proll_18.orig/src/rconsole.h proll-patch-15/src/rconsole.h | |
3292 | ---- proll_18.orig/src/rconsole.h 1999-01-16 05:00:59.000000000 +0000 | |
3293 | -+++ proll-patch-15/src/rconsole.h 2004-11-13 15:50:49.000000000 +0000 | |
3294 | -@@ -13,10 +13,10 @@ | |
3295 | - */ | |
3296 | - | |
3297 | - #define RF_MAXWIDTH 16 | |
3298 | --typedef unsigned short Rf_scan; /* __w16 to be used */ | |
3299 | -+typedef unsigned char Rf_scan; /* __w16 to be used */ | |
3300 | - | |
3301 | - struct rfont { | |
3302 | -- Rf_scan *body_; | |
3303 | -+ const Rf_scan *body_; | |
3304 | - int nchars_; /* 128 for ASCII ... 65536 for Unicode */ | |
3305 | - int width_; /* [Pixels]. Maximum size is 16. */ | |
3306 | - int height_; /* [Pixels == scan lines]. */ | |
3307 | -diff -ruN proll_18.orig/src/romlib.h proll-patch-15/src/romlib.h | |
3308 | ---- proll_18.orig/src/romlib.h 1999-04-20 04:26:45.000000000 +0000 | |
3309 | -+++ proll-patch-15/src/romlib.h 2005-04-16 20:32:49.000000000 +0000 | |
3310 | -@@ -72,13 +72,13 @@ | |
3311 | - */ | |
3312 | - #define memcpy(dst, src, len) bcopy(src, dst, len) | |
3313 | - #define memcmp(x1, x2, len) bcmp(x1, x2, len) | |
3314 | --#define memset(p, len, zero) bzero(p, len) | |
3315 | --extern void bcopy(void *b1, void *b2, int length); | |
3316 | --extern int bcmp(void *b1, void *b2, int length); | |
3317 | --extern void bzero(void *b, int c); | |
3318 | -+extern void bcopy(const void *b1, void *b2, int length); | |
3319 | -+extern int bcmp(const void *b1, const void *b2, int length); | |
3320 | -+typedef unsigned int size_t; | |
3321 | -+extern void *memset(void *p, int c, size_t len); | |
3322 | - /* gcc complains about "conflicting types for builtin function strlen". */ | |
3323 | - #define strlen(s) ssize(s) | |
3324 | --extern int ssize(char *s); | |
3325 | -+extern int ssize(const char *s); | |
3326 | - | |
3327 | - | |
3328 | - /* | |
3329 | -diff -ruN proll_18.orig/src/sched_4m.c proll-patch-15/src/sched_4m.c | |
3330 | ---- proll_18.orig/src/sched_4m.c 1999-04-27 05:48:51.000000000 +0000 | |
3331 | -+++ proll-patch-15/src/sched_4m.c 2005-08-14 10:18:14.000000000 +0000 | |
3332 | -@@ -108,7 +108,7 @@ | |
3333 | - static int set_bolt; /* Tick counter limit */ | |
3334 | - static struct handsc hndv[16]; | |
3335 | - | |
3336 | --static unsigned int intr_to_mask[16] = { | |
3337 | -+static unsigned const int intr_to_mask[16] = { | |
3338 | - 0, 0, 0, 0, 0, 0, SUN4M_INT_ETHERNET, 0, | |
3339 | - 0, 0, 0, 0, 0, 0, 0, 0, | |
3340 | - }; | |
3341 | -@@ -130,7 +130,7 @@ | |
3342 | - int /* 0 - not expired yet; <>0 - timer expired */ | |
3343 | - chk_timeout() | |
3344 | - { | |
3345 | -- int lim = (((1000000/HZ) + 1) << 10); | |
3346 | -+ unsigned int lim = (((1000000/HZ) + 1) << 10); | |
3347 | - unsigned int clear; | |
3348 | - unsigned int intc; | |
3349 | - int n; | |
3350 | -@@ -182,7 +182,7 @@ | |
3351 | - struct handsc *hndp; | |
3352 | - unsigned int mask; | |
3353 | - | |
3354 | -- if (irq < 0 || irq >= 16) { | |
3355 | -+ if (irq == 0 || irq >= 16) { | |
3356 | - printk("request_irq: bad irq %d\n", irq); | |
3357 | - return -1; | |
3358 | - } | |
3359 | -@@ -207,7 +207,7 @@ | |
3360 | - { | |
3361 | - struct handsc *hndp; | |
3362 | - | |
3363 | -- if (irq < 0 || irq >= 16) { | |
3364 | -+ if (irq == 0 || irq >= 16) { | |
3365 | - printk("free_irq: bad irq %d\n", irq); | |
3366 | - return; | |
3367 | - } | |
3368 | -diff -ruN proll_18.orig/src/swap.c proll-patch-15/src/swap.c | |
3369 | ---- proll_18.orig/src/swap.c 1970-01-01 00:00:00.000000000 +0000 | |
3370 | -+++ proll-patch-15/src/swap.c 2004-11-13 15:50:49.000000000 +0000 | |
3371 | -@@ -0,0 +1,21 @@ | |
3372 | -+// Convert the lat7 font so that no conversion is needed at runtime. | |
3373 | -+#define ORIG | |
3374 | -+#include "rconsole.c" | |
3375 | -+ | |
3376 | -+#include <stdio.h> | |
3377 | -+ | |
3378 | -+int main() | |
3379 | -+{ | |
3380 | -+ struct rfont p; | |
3381 | -+ int i; | |
3382 | -+ | |
3383 | -+ font_cons_7(&p); | |
3384 | -+ | |
3385 | -+ printf(" "); | |
3386 | -+ for (i = 0; i < LAT7_NCHARS*LAT7_HEIGHT; i++) { | |
3387 | -+ printf("0x%02x, ", p.body_[i]); | |
3388 | -+ if ((i % 12) == 11) | |
3389 | -+ printf("\n "); | |
3390 | -+ } | |
3391 | -+ printf("\n"); | |
3392 | -+} | |
3393 | -diff -ruN proll_18.orig/src/system.c proll-patch-15/src/system.c | |
3394 | ---- proll_18.orig/src/system.c 2002-07-23 05:52:49.000000000 +0000 | |
3395 | -+++ proll-patch-15/src/system.c 2005-04-16 06:16:20.000000000 +0000 | |
3396 | -@@ -298,8 +298,8 @@ | |
3397 | - } | |
3398 | - | |
3399 | - /* We need to start from LOADBASE, but kernel wants PAGE_SIZE. */ | |
3400 | -- pa = PAGE_SIZE; | |
3401 | -- for (va = PAGE_SIZE; va < LOWMEMSZ; va += PAGE_SIZE) { | |
3402 | -+ pa = 0; | |
3403 | -+ for (va = 0; va < LOWMEMSZ; va += PAGE_SIZE) { | |
3404 | - map_page(l1, va, pa, 0, highbase); | |
3405 | - pa += PAGE_SIZE; | |
3406 | - } | |
3407 | -@@ -507,30 +507,44 @@ | |
3408 | - { | |
3409 | - char *p; | |
3410 | - | |
3411 | -- if ((p = mem_alloc(t, size, align)) != 0) bzero(p, size); | |
3412 | -+ if ((p = mem_alloc(t, size, align)) != 0) memset(p, 0, size); | |
3413 | - return p; | |
3414 | - } | |
3415 | - | |
3416 | - /* | |
3417 | - * Library functions | |
3418 | - */ | |
3419 | --void bzero(void *s, int len) { | |
3420 | -- while (len--) *((char *)s)++ = 0; | |
3421 | -+void *memset(void *s, int c, size_t len) | |
3422 | -+{ | |
3423 | -+ void *p = s; | |
3424 | -+ | |
3425 | -+ while (len--) { | |
3426 | -+ *(char *)s = c; | |
3427 | -+ s++; | |
3428 | -+ } | |
3429 | -+ return p; | |
3430 | - } | |
3431 | - | |
3432 | --void bcopy(void *f, void *t, int len) { | |
3433 | -- while (len--) *((char *)t)++ = *((char *)f)++; | |
3434 | -+void bcopy(const void *f, void *t, int len) { | |
3435 | -+ while (len--) { | |
3436 | -+ *(char *)t = *(char *)f; | |
3437 | -+ f++; | |
3438 | -+ t++; | |
3439 | -+ } | |
3440 | - } | |
3441 | - | |
3442 | - /* Comparison is 7-bit */ | |
3443 | --int bcmp(void *s1, void *s2, int len) | |
3444 | -+int bcmp(const void *s1, const void *s2, int len) | |
3445 | - { | |
3446 | - int i; | |
3447 | - char ch; | |
3448 | - | |
3449 | - while (len--) { | |
3450 | -- ch = *((char *)s1)++; | |
3451 | -- if ((i = ch - *((char *)s2)++) != 0) | |
3452 | -+ ch = *(char *)s1; | |
3453 | -+ i = ch - *(char *)s2; | |
3454 | -+ s1++; | |
3455 | -+ s2++; | |
3456 | -+ if (i != 0) | |
3457 | - return i; | |
3458 | - if (ch == 0) | |
3459 | - return 0; | |
3460 | -@@ -538,8 +552,8 @@ | |
3461 | - return 0; | |
3462 | - } | |
3463 | - | |
3464 | --int strlen(char *s) { | |
3465 | -- char *p; | |
3466 | -+int strlen(const char *s) { | |
3467 | -+ const char *p; | |
3468 | - for (p = s; *p != 0; p++) { } | |
3469 | - return p - s; | |
3470 | - } | |
3471 | -@@ -560,14 +574,6 @@ | |
3472 | - va_end(x1); | |
3473 | - } | |
3474 | - | |
3475 | --/* This is taken from x86 to be used in network kernel. Returns 15 bits. */ | |
3476 | --short int random() | |
3477 | --{ | |
3478 | -- static unsigned int seed = 151; | |
3479 | -- seed = (seed + 23968)*0x015A4E35 >> 1; | |
3480 | -- return seed & 0x7FFF; | |
3481 | --} | |
3482 | -- | |
3483 | - void fatal() | |
3484 | - { | |
3485 | - printk("fatal."); | |
3486 | -diff -ruN proll_18.orig/src/system.h proll-patch-15/src/system.h | |
3487 | ---- proll_18.orig/src/system.h 2002-09-13 21:53:32.000000000 +0000 | |
3488 | -+++ proll-patch-15/src/system.h 2005-04-16 06:16:20.000000000 +0000 | |
3489 | -@@ -16,7 +16,7 @@ | |
3490 | - #define IOMAPSIZE (1*1024*1024) /* 1 Meg maximum: we do not map framebuffer. */ | |
3491 | - #define NCTX_SWIFT 0x100 | |
3492 | - | |
3493 | --#define MAX_BANKS 3 /* Allocation for all machines */ | |
3494 | -+#define MAX_BANKS 8 /* Allocation for all machines */ | |
3495 | - | |
3496 | - #ifndef __ASSEMBLY__ | |
3497 | - struct bank { | |
3498 | -@@ -164,10 +164,10 @@ | |
3499 | - | |
3500 | - extern __inline__ void setipl(unsigned long __orig_psr) | |
3501 | - { | |
3502 | -- __asm__ __volatile__(" | |
3503 | -- wr %0, 0x0, %%psr | |
3504 | -- nop; nop; nop | |
3505 | --" : /* no outputs */ | |
3506 | -+ __asm__ __volatile__( | |
3507 | -+ "wr %0, 0x0, %%psr\n\t" | |
3508 | -+ "nop; nop; nop\n\t" | |
3509 | -+ : /* no outputs */ | |
3510 | - : "r" (__orig_psr) | |
3511 | - : "memory", "cc"); | |
3512 | - } | |
3513 | -@@ -176,13 +176,13 @@ | |
3514 | - { | |
3515 | - unsigned long tmp; | |
3516 | - | |
3517 | -- __asm__ __volatile__(" | |
3518 | -- rd %%psr, %0 | |
3519 | -- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ | |
3520 | -- or %0, %1, %0 | |
3521 | -- wr %0, 0x0, %%psr | |
3522 | -- nop; nop; nop | |
3523 | --" : "=r" (tmp) | |
3524 | -+ __asm__ __volatile__( | |
3525 | -+ "rd %%psr, %0\n\t" | |
3526 | -+ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ | |
3527 | -+ "or %0, %1, %0\n\t" | |
3528 | -+ "wr %0, 0x0, %%psr\n\t" | |
3529 | -+ "nop; nop; nop\n\t" | |
3530 | -+ : "=r" (tmp) | |
3531 | - : "i" (PSR_PIL) | |
3532 | - : "memory"); | |
3533 | - } | |
3534 | -@@ -191,13 +191,13 @@ | |
3535 | - { | |
3536 | - unsigned long tmp; | |
3537 | - | |
3538 | -- __asm__ __volatile__(" | |
3539 | -- rd %%psr, %0 | |
3540 | -- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ | |
3541 | -- andn %0, %1, %0 | |
3542 | -- wr %0, 0x0, %%psr | |
3543 | -- nop; nop; nop | |
3544 | --" : "=r" (tmp) | |
3545 | -+ __asm__ __volatile__( | |
3546 | -+ "rd %%psr, %0\n\t" | |
3547 | -+ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ | |
3548 | -+ "andn %0, %1, %0\n\t" | |
3549 | -+ "wr %0, 0x0, %%psr\n\t" | |
3550 | -+ "nop; nop; nop\n\t" | |
3551 | -+ : "=r" (tmp) | |
3552 | - : "i" (PSR_PIL) | |
3553 | - : "memory"); | |
3554 | - } | |
3555 | -@@ -214,18 +214,18 @@ | |
3556 | - { | |
3557 | - unsigned long retval; | |
3558 | - | |
3559 | -- __asm__ __volatile__(" | |
3560 | -- rd %%psr, %0 | |
3561 | -- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ | |
3562 | -- and %0, %2, %%g1 | |
3563 | -- and %1, %2, %%g2 | |
3564 | -- xorcc %%g1, %%g2, %%g0 | |
3565 | -- be 1f | |
3566 | -- nop | |
3567 | -- wr %0, %2, %%psr | |
3568 | -- nop; nop; nop; | |
3569 | --1: | |
3570 | --" : "=r" (retval) | |
3571 | -+ __asm__ __volatile__( | |
3572 | -+ "rd %%psr, %0\n\t" | |
3573 | -+ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ | |
3574 | -+ "and %0, %2, %%g1\n\t" | |
3575 | -+ "and %1, %2, %%g2\n\t" | |
3576 | -+ "xorcc %%g1, %%g2, %%g0\n\t" | |
3577 | -+ "be 1f\n\t" | |
3578 | -+ "nop\n\t" | |
3579 | -+ "wr %0, %2, %%psr\n\t" | |
3580 | -+ "nop; nop; nop;\n\t" | |
3581 | -+ "1:\n\t" | |
3582 | -+ : "=r" (retval) | |
3583 | - : "r" (__new_psr), "i" (PSR_PIL) | |
3584 | - : "g1", "g2", "memory", "cc"); | |
3585 | - | |
3586 | -@@ -236,13 +236,13 @@ | |
3587 | - { | |
3588 | - unsigned long retval; | |
3589 | - | |
3590 | -- __asm__ __volatile__(" | |
3591 | -- rd %%psr, %0 | |
3592 | -- nop; nop; nop; /* Sun4m + Cypress + SMP bug */ | |
3593 | -- or %0, %1, %%g1 | |
3594 | -- wr %%g1, 0x0, %%psr | |
3595 | -- nop; nop; nop | |
3596 | --" : "=r" (retval) | |
3597 | -+ __asm__ __volatile__( | |
3598 | -+ "rd %%psr, %0\n\t" | |
3599 | -+ "nop; nop; nop;\n\t" /* Sun4m + Cypress + SMP bug */ | |
3600 | -+ "or %0, %1, %%g1\n\t" | |
3601 | -+ "wr %%g1, 0x0, %%psr\n\t" | |
3602 | -+ "nop; nop; nop\n\t" | |
3603 | -+ : "=r" (retval) | |
3604 | - : "i" (PSR_PIL) | |
3605 | - : "g1", "memory"); | |
3606 | - | |
3607 | -diff -ruN proll_18.orig/src/tftp.c proll-patch-15/src/tftp.c | |
3608 | ---- proll_18.orig/src/tftp.c 2002-09-13 21:53:34.000000000 +0000 | |
3609 | -+++ proll-patch-15/src/tftp.c 2005-08-14 10:16:15.000000000 +0000 | |
3610 | -@@ -127,7 +127,7 @@ | |
3611 | - int len; | |
3612 | - | |
3613 | - /* Read packet with timeout */ | |
3614 | -- len = udp_read((char *)(&inpbuf), sizeof(inpbuf), TFTP_TIMEOUT, CHR_ESC); | |
3615 | -+ len = udp_read((char *)(&inpbuf), sizeof(inpbuf), TFTP_TIMEOUT); | |
3616 | - if (len == 0) { | |
3617 | - printf("TFTP: Timeout\n"); | |
3618 | - return(ERR_TIMEOUT); | |
3619 | -diff -ruN proll_18.orig/src/udp.c proll-patch-15/src/udp.c | |
3620 | ---- proll_18.orig/src/udp.c 2001-12-24 05:12:53.000000000 +0000 | |
3621 | -+++ proll-patch-15/src/udp.c 2005-08-14 10:17:19.000000000 +0000 | |
3622 | -@@ -76,12 +76,9 @@ | |
3623 | - * | |
3624 | - * Open a new UDP socket. | |
3625 | - */ | |
3626 | --int udp_open(daddr, source, dest) | |
3627 | --t_ipaddr daddr; | |
3628 | --int source; | |
3629 | --int dest; | |
3630 | -+int udp_open(t_ipaddr daddr, int source, int dest) | |
3631 | - { | |
3632 | -- register unsigned char *addr; | |
3633 | -+ const unsigned char *addr; | |
3634 | - | |
3635 | - /* Set global variables */ | |
3636 | - usource = source; | |
3637 | -@@ -101,16 +98,13 @@ | |
3638 | - * | |
3639 | - * IP receiver routine | |
3640 | - */ | |
3641 | --static int ip_recv(buf, bufsize, addr) | |
3642 | --unsigned char *buf; | |
3643 | --int bufsize; | |
3644 | --unsigned char *addr; | |
3645 | -+static int ip_recv(unsigned char *buf, unsigned int bufsize, unsigned char *addr) | |
3646 | - { | |
3647 | - struct iphdr *ipp = ((struct iphdr *)buf); | |
3648 | - struct udphdr *udpp = ((struct udphdr *)(buf + IP_MIN_HSIZE)); | |
3649 | - struct udp_pseudo psehdr; | |
3650 | - | |
3651 | -- int size; | |
3652 | -+ unsigned int size; | |
3653 | - t_ipaddr dadr; | |
3654 | - | |
3655 | - #ifdef DEBUG | |
3656 | -@@ -194,13 +188,9 @@ | |
3657 | - * | |
3658 | - * Read one packet from a UDP socket | |
3659 | - */ | |
3660 | --int udp_read(buf, bufsize, timeout, abortch) | |
3661 | --char *buf; | |
3662 | --int bufsize; | |
3663 | --int timeout; | |
3664 | --char abortch; | |
3665 | -+int udp_read(char *buf, unsigned int bufsize, int timeout) | |
3666 | - { | |
3667 | -- int len; | |
3668 | -+ unsigned int len; | |
3669 | - | |
3670 | - /* Wait until we get something */ | |
3671 | - set_timeout(timeout); | |
3672 | -@@ -299,9 +289,6 @@ | |
3673 | - */ | |
3674 | - int init_udp() | |
3675 | - { | |
3676 | -- /* Set module name for error handling */ | |
3677 | -- net_module_name = "udp"; | |
3678 | -- | |
3679 | - /* Register IP packet type and set write buffer pointer */ | |
3680 | - if ((writebuf = reg_type(htons(ETH_P_IP), ip_recv)) == NULL) | |
3681 | - return(FALSE); | |
3682 | -diff -ruN proll_18.orig/src/udp.h proll-patch-15/src/udp.h | |
3683 | ---- proll_18.orig/src/udp.h 2001-12-24 05:12:34.000000000 +0000 | |
3684 | -+++ proll-patch-15/src/udp.h 2005-08-14 10:16:40.000000000 +0000 | |
3685 | -@@ -53,7 +53,7 @@ | |
3686 | - extern int udp_open __P((t_ipaddr daddr, int source, int dest)); | |
3687 | - | |
3688 | - /* Read from a UDP socket */ | |
3689 | --extern int udp_read __P((char *buf, int bufsize, int timeout, char abortch)); | |
3690 | -+extern int udp_read(char *buf, unsigned int bufsize, int timeout); | |
3691 | - | |
3692 | - /* Write to a UDP socket */ | |
3693 | - extern int udp_write __P((char *buf, int writelen)); | |
3694 | -diff -ruN proll_18.orig/src/vcons_zs.c proll-patch-15/src/vcons_zs.c | |
3695 | ---- proll_18.orig/src/vcons_zs.c 1970-01-01 00:00:00.000000000 +0000 | |
3696 | -+++ proll-patch-15/src/vcons_zs.c 2005-08-14 10:25:51.000000000 +0000 | |
3697 | -@@ -0,0 +1,68 @@ | |
3698 | -+/** | |
3699 | -+ ** Console over 'zs' (Zilog serial port) | |
3700 | -+ ** Copyright 1999 Pete Zaitcev | |
3701 | -+ ** This code is licensed under GNU General Public License. | |
3702 | -+ **/ | |
3703 | -+ | |
3704 | -+#include "vconsole.h" | |
3705 | -+#include <system.h> | |
3706 | -+ | |
3707 | -+#define ZS_DATA 0x02 | |
3708 | -+ | |
3709 | -+int vcon_zs_init(struct vconterm *t, unsigned int a0) | |
3710 | -+{ | |
3711 | -+ | |
3712 | -+ t->impl = (void *) a0; | |
3713 | -+ | |
3714 | -+ t->vc_x = 0; t->vc_y = 0; | |
3715 | -+ t->backp = 0; t->backc = 0; | |
3716 | -+ | |
3717 | -+ stb_bypass(a0, 3); // reg 3 | |
3718 | -+ stb_bypass(a0, 1); // enable rx | |
3719 | -+ | |
3720 | -+ stb_bypass(a0, 5); // reg 5 | |
3721 | -+ stb_bypass(a0, 8); // enable tx | |
3722 | -+ | |
3723 | -+ return 0; | |
3724 | -+} | |
3725 | -+ | |
3726 | -+int vcon_zs_putch(struct vconterm *t, char c) | |
3727 | -+{ | |
3728 | -+ unsigned zs_ptr = (unsigned) t->impl; | |
3729 | -+ | |
3730 | -+ //while ((ldb_bypass(zs_ptr + ZS_LSR) & 0x60) != 0x60) { } | |
3731 | -+ stb_bypass(zs_ptr + ZS_DATA, c); | |
3732 | -+ return 0; | |
3733 | -+} | |
3734 | -+ | |
3735 | -+int vcon_zs_write(struct vconterm *t, char *data, int leng) | |
3736 | -+{ | |
3737 | -+ while (leng != 0) { | |
3738 | -+ leng--; | |
3739 | -+ vcon_zs_putch(t, *data++); | |
3740 | -+ } | |
3741 | -+ return leng; | |
3742 | -+} | |
3743 | -+ | |
3744 | -+int vcon_zs_read(struct vconterm *t, char *data, __attribute((unused)) int leng) | |
3745 | -+{ | |
3746 | -+ unsigned zs_ptr = (unsigned) t->impl; | |
3747 | -+ | |
3748 | -+ while ((ldb_bypass(zs_ptr) & 1) != 1) { } | |
3749 | -+ *data = ldb_bypass(zs_ptr + ZS_DATA); | |
3750 | -+ return 0; | |
3751 | -+} | |
3752 | -+ | |
3753 | -+int vcon_zs_getch(struct vconterm *t) | |
3754 | -+{ | |
3755 | -+ unsigned zs_ptr = (unsigned) t->impl; | |
3756 | -+ | |
3757 | -+ while ((ldb_bypass(zs_ptr) & 1) != 1) { } | |
3758 | -+ return ldb_bypass(zs_ptr + ZS_DATA) & 0xff; | |
3759 | -+} | |
3760 | -+ | |
3761 | -+void vcon_zs_fini(__attribute((unused)) struct vconterm *t) | |
3762 | -+{ | |
3763 | -+ /* violent crash in the end */ | |
3764 | -+ ; | |
3765 | -+} | |
3766 | -diff -ruN proll_18.orig/src/vconsole.c proll-patch-15/src/vconsole.c | |
3767 | ---- proll_18.orig/src/vconsole.c 1999-11-08 03:10:28.000000000 +0000 | |
3768 | -+++ proll-patch-15/src/vconsole.c 2005-08-14 10:24:49.000000000 +0000 | |
3769 | -@@ -7,12 +7,17 @@ | |
3770 | - #include "vconsole.h" | |
3771 | - | |
3772 | - #include "hconsole.h" | |
3773 | -+#include <system.h> | |
3774 | - | |
3775 | - static void vcon_i_cursfeed(struct vconterm *t); | |
3776 | - static void vcon_i_backflush(struct vconterm *t); | |
3777 | - | |
3778 | - struct hconsole hcons0; | |
3779 | - | |
3780 | -+enum { ESnormal, ESesc, ESsquare, ESgetpars, ESgotpars, ESfunckey, | |
3781 | -+ EShash, ESsetG0, ESsetG1, ESpercent, ESignore, ESnonstd, | |
3782 | -+ ESpalette }; | |
3783 | -+ | |
3784 | - int vcon_init(struct vconterm *t, unsigned int a0) | |
3785 | - { | |
3786 | - struct hconsole *hconp; | |
3787 | -@@ -25,11 +30,49 @@ | |
3788 | - | |
3789 | - t->vc_x = 0; t->vc_y = 0; | |
3790 | - t->backp = 0; t->backc = 0; | |
3791 | -+ t->vc_state = ESnormal; | |
3792 | - | |
3793 | - hcon_clear(hconp, 0, 0, hconp->ydim_, hconp->xdim_); | |
3794 | - return 0; | |
3795 | - } | |
3796 | - | |
3797 | -+/* | |
3798 | -+ * gotoxy() must verify all boundaries, because the arguments | |
3799 | -+ * might also be negative. If the given position is out of | |
3800 | -+ * bounds, the cursor is placed at the nearest margin. | |
3801 | -+ */ | |
3802 | -+static void gotoxy(struct vconterm *vc, int new_x, int new_y) | |
3803 | -+{ | |
3804 | -+ int max_x, max_y; | |
3805 | -+ struct hconsole *hconp = vc->impl; | |
3806 | -+ | |
3807 | -+ max_x = hcon_qxdim(hconp); | |
3808 | -+ max_y = hcon_qydim(hconp); | |
3809 | -+ | |
3810 | -+ if (new_x < 0) | |
3811 | -+ vc->vc_x = 0; | |
3812 | -+ else { | |
3813 | -+ if (new_x >= max_x) | |
3814 | -+ vc->vc_x = max_x - 1; | |
3815 | -+ else | |
3816 | -+ vc->vc_x = new_x; | |
3817 | -+ } | |
3818 | -+ | |
3819 | -+ if (new_y < 0) | |
3820 | -+ vc->vc_y = 0; | |
3821 | -+ else if (new_y >= max_y) | |
3822 | -+ vc->vc_y = max_y - 1; | |
3823 | -+ else | |
3824 | -+ vc->vc_y = new_y; | |
3825 | -+ | |
3826 | -+} | |
3827 | -+ | |
3828 | -+/* for absolute user moves, when decom is set */ | |
3829 | -+static void gotoxay(struct vconterm *t, int new_x, int new_y) | |
3830 | -+{ | |
3831 | -+ gotoxy(t, new_x, new_y); | |
3832 | -+} | |
3833 | -+ | |
3834 | - int vcon_write(struct vconterm *t, char *data, int leng) | |
3835 | - { | |
3836 | - int l = leng; | |
3837 | -@@ -40,29 +83,101 @@ | |
3838 | - if (l <= 0) break; | |
3839 | - c = *data++; --l; | |
3840 | - | |
3841 | -- switch (c) { | |
3842 | -- case 0x07: /* Bell */ | |
3843 | -- vcon_i_backflush(t); | |
3844 | -- break; | |
3845 | -- case 0x0A: /* Linefeed */ | |
3846 | -- vcon_i_backflush(t); | |
3847 | -- vcon_i_cursfeed(t); | |
3848 | -+ switch(t->vc_state) { | |
3849 | -+ case ESesc: | |
3850 | -+ t->vc_state = ESnormal; | |
3851 | -+ switch (c) { | |
3852 | -+ case '[': | |
3853 | -+ t->vc_state = ESsquare; | |
3854 | -+ break; | |
3855 | -+ case 'M': | |
3856 | -+ hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); | |
3857 | -+ break; | |
3858 | -+ default: | |
3859 | -+ //printk("Unhandled escape code '%c'\n", c); | |
3860 | -+ break; | |
3861 | -+ } | |
3862 | - break; | |
3863 | -- case 0x0D: /* Return */ | |
3864 | -- vcon_i_backflush(t); | |
3865 | -- t->vc_x = 0; | |
3866 | -+ case ESsquare: | |
3867 | -+ for(t->vc_npar = 0 ; t->vc_npar < NPAR ; t->vc_npar++) | |
3868 | -+ t->vc_par[t->vc_npar] = 0; | |
3869 | -+ t->vc_npar = 0; | |
3870 | -+ t->vc_state = ESgetpars; | |
3871 | -+ case ESgetpars: | |
3872 | -+ if (c==';' && t->vc_npar<NPAR-1) { | |
3873 | -+ t->vc_npar++; | |
3874 | -+ break; | |
3875 | -+ } else if (c>='0' && c<='9') { | |
3876 | -+ t->vc_par[t->vc_npar] *= 10; | |
3877 | -+ t->vc_par[t->vc_npar] += c-'0'; | |
3878 | -+ break; | |
3879 | -+ } else t->vc_state=ESgotpars; | |
3880 | -+ case ESgotpars: | |
3881 | -+ t->vc_state = ESnormal; | |
3882 | -+ switch(c) { | |
3883 | -+ case 'H': case 'f': | |
3884 | -+ if (t->vc_par[0]) t->vc_par[0]--; | |
3885 | -+ if (t->vc_par[1]) t->vc_par[1]--; | |
3886 | -+ gotoxay(t, t->vc_par[1], t->vc_par[0]); | |
3887 | -+ break; | |
3888 | -+ case 'J': | |
3889 | -+ if (t->vc_par[0] == 0) { | |
3890 | -+ //erase from cursor to end of display | |
3891 | -+ hcon_clear(hconp, t->vc_y, t->vc_x, hconp->ydim_, hconp->xdim_); | |
3892 | -+ } | |
3893 | -+ break; | |
3894 | -+ case 'M': | |
3895 | -+ hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); | |
3896 | -+ break; | |
3897 | -+ case 'm': | |
3898 | -+ break; | |
3899 | -+ default: | |
3900 | -+#if 0 | |
3901 | -+ printk("Unhandled escape code '%c', par[%d, %d, %d, %d, %d]\n", | |
3902 | -+ c, t->vc_par[0], t->vc_par[1], t->vc_par[2], t->vc_par[3], t->vc_par[4]); | |
3903 | -+#endif | |
3904 | -+ break; | |
3905 | -+ } | |
3906 | - break; | |
3907 | - default: | |
3908 | -- if (t->backp == 0) { | |
3909 | -- t->backc = 1; | |
3910 | -- t->backp = data-1; | |
3911 | -- } else { | |
3912 | -- t->backc++; | |
3913 | -- } | |
3914 | -- if (t->vc_x + t->backc >= hcon_qxdim(hconp)) { | |
3915 | -+ t->vc_state = ESnormal; | |
3916 | -+ switch (c) { | |
3917 | -+ case 0x07: /* Bell */ | |
3918 | -+ vcon_i_backflush(t); | |
3919 | -+ break; | |
3920 | -+ case 0x08: /* BS */ | |
3921 | -+ vcon_i_backflush(t); | |
3922 | -+ if (t->vc_x > 0) | |
3923 | -+ t->vc_x--; | |
3924 | -+ break; | |
3925 | -+ case 0x0A: /* Linefeed */ | |
3926 | - vcon_i_backflush(t); | |
3927 | -- t->vc_x = 0; | |
3928 | - vcon_i_cursfeed(t); | |
3929 | -+ break; | |
3930 | -+ case 0x0D: /* Return */ | |
3931 | -+ vcon_i_backflush(t); | |
3932 | -+ t->vc_x = 0; | |
3933 | -+ break; | |
3934 | -+ case 24: case 26: | |
3935 | -+ vcon_i_backflush(t); | |
3936 | -+ t->vc_state = ESnormal; | |
3937 | -+ break; | |
3938 | -+ case 27: | |
3939 | -+ vcon_i_backflush(t); | |
3940 | -+ t->vc_state = ESesc; | |
3941 | -+ break; | |
3942 | -+ default: | |
3943 | -+ if (t->backp == 0) { | |
3944 | -+ t->backc = 1; | |
3945 | -+ t->backp = data-1; | |
3946 | -+ } else { | |
3947 | -+ t->backc++; | |
3948 | -+ } | |
3949 | -+ if ((unsigned int)t->vc_x + t->backc >= hcon_qxdim(hconp)) { | |
3950 | -+ vcon_i_backflush(t); | |
3951 | -+ t->vc_x = 0; | |
3952 | -+ vcon_i_cursfeed(t); | |
3953 | -+ } | |
3954 | - } | |
3955 | - } | |
3956 | - } | |
3957 | -@@ -73,7 +188,7 @@ | |
3958 | - static void vcon_i_cursfeed(struct vconterm *t) { | |
3959 | - struct hconsole *hconp = t->impl; | |
3960 | - | |
3961 | -- if (++t->vc_y >= hcon_qydim(hconp)) { | |
3962 | -+ if ((unsigned int)++t->vc_y >= hcon_qydim(hconp)) { | |
3963 | - t->vc_y = hcon_qydim(hconp)-1; | |
3964 | - hcon_scroll(hconp, 0, hcon_qydim(hconp), SM_UP, 1); | |
3965 | - } | |
3966 | -@@ -90,22 +205,75 @@ | |
3967 | - t->backp = 0; t->backc = 0; | |
3968 | - } | |
3969 | - | |
3970 | --int vcon_putch(struct vconterm *t, char c) | |
3971 | -+int vcon_putch(__attribute__((unused)) struct vconterm *t, __attribute__((unused)) char c) | |
3972 | - { | |
3973 | - return -1; | |
3974 | - } | |
3975 | - | |
3976 | --int vcon_read(struct vconterm *t, char *data, int leng) | |
3977 | -+int vcon_read(__attribute__((unused)) struct vconterm *t, __attribute__((unused)) char *data, __attribute__((unused)) int leng) | |
3978 | - { | |
3979 | - return 0; | |
3980 | - } | |
3981 | - | |
3982 | --int vcon_getch(struct vconterm *t) | |
3983 | -+static const unsigned char sunkbd_keycode[128] = { | |
3984 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3985 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3986 | -+ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 8, | |
3987 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, | |
3988 | -+ 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', | |
3989 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3990 | -+ 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\\', 13, | |
3991 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3992 | -+ 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', | |
3993 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3994 | -+ ' ', | |
3995 | -+}; | |
3996 | -+ | |
3997 | -+static const unsigned char sunkbd_keycode_shifted[128] = { | |
3998 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
3999 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
4000 | -+ '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 0, 8, | |
4001 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, | |
4002 | -+ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', | |
4003 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
4004 | -+ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '|', 13, | |
4005 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
4006 | -+ 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', | |
4007 | -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
4008 | -+ ' ', | |
4009 | -+}; | |
4010 | -+ | |
4011 | -+static int shiftstate; | |
4012 | -+ | |
4013 | -+int vcon_getch(__attribute__((unused)) struct vconterm *t) | |
4014 | - { | |
4015 | -- return -1; | |
4016 | -+ int ch; | |
4017 | -+ | |
4018 | -+ while ((ldb_bypass(0x71000004) & 1) != 1) { } | |
4019 | -+ do { | |
4020 | -+ ch = ldb_bypass(0x71000006) & 0xff; | |
4021 | -+ if (ch == 99) | |
4022 | -+ shiftstate |= 1; | |
4023 | -+ else if (ch == 110) | |
4024 | -+ shiftstate |= 2; | |
4025 | -+ else if (ch == 227) | |
4026 | -+ shiftstate &= ~1; | |
4027 | -+ else if (ch == 238) | |
4028 | -+ shiftstate &= ~2; | |
4029 | -+ //printk("getch: %d\n", ch); | |
4030 | -+ } | |
4031 | -+ while ((ch & 0x80) == 0 || ch == 238 || ch == 227); // Wait for key release | |
4032 | -+ //printk("getch rel: %d\n", ch); | |
4033 | -+ ch &= 0x7f; | |
4034 | -+ if (shiftstate) | |
4035 | -+ ch = sunkbd_keycode_shifted[ch]; | |
4036 | -+ else | |
4037 | -+ ch = sunkbd_keycode[ch]; | |
4038 | -+ //printk("getch xlate: %d\n", ch); | |
4039 | -+ return ch; | |
4040 | - } | |
4041 | - | |
4042 | --void vcon_fini(struct vconterm *t) | |
4043 | -+void vcon_fini(__attribute__((unused)) struct vconterm *t) | |
4044 | - { | |
4045 | - /* violent crash in the end */ | |
4046 | - ; | |
4047 | -diff -ruN proll_18.orig/src/vconsole.h proll-patch-15/src/vconsole.h | |
4048 | ---- proll_18.orig/src/vconsole.h 1999-11-08 00:58:13.000000000 +0000 | |
4049 | -+++ proll-patch-15/src/vconsole.h 2005-03-02 12:40:12.000000000 +0000 | |
4050 | -@@ -6,6 +6,8 @@ | |
4051 | - #ifndef VCONSOLE_H | |
4052 | - #define VCONSOLE_H | |
4053 | - | |
4054 | -+#define NPAR 16 | |
4055 | -+ | |
4056 | - struct vconterm { | |
4057 | - void *impl; | |
4058 | - | |
4059 | -@@ -13,6 +15,8 @@ | |
4060 | - int backc; /* Same, count */ | |
4061 | - | |
4062 | - int vc_x, vc_y; /* XXX Make vcon_xxx() to use cellmap->xpos_ */ | |
4063 | -+ int vc_state; | |
4064 | -+ unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ | |
4065 | - }; | |
4066 | - | |
4067 | - int vcon_init(struct vconterm *t, unsigned int a0); |