1 | /**************************************************************************** |
---|
2 | |
---|
3 | THIS SOFTWARE IS NOT COPYRIGHTED |
---|
4 | |
---|
5 | HP offers the following for use in the public domain. HP makes no |
---|
6 | warranty with regard to the software or it's performance and the |
---|
7 | user accepts the software "AS IS" with all faults. |
---|
8 | |
---|
9 | HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD |
---|
10 | TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
---|
11 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
---|
12 | |
---|
13 | ****************************************************************************/ |
---|
14 | |
---|
15 | .space $TEXT$ |
---|
16 | .subspa $CODE$,access=0x2c |
---|
17 | |
---|
18 | #include "diagnose.h" |
---|
19 | #if 0 |
---|
20 | #include "iva_table.h" |
---|
21 | #endif |
---|
22 | |
---|
23 | R_gr0 .equ 0 |
---|
24 | R_gr1 .equ 4 |
---|
25 | R_gr2 .equ 8 |
---|
26 | R_gr3 .equ 12 |
---|
27 | R_gr4 .equ 16 |
---|
28 | R_gr5 .equ 20 |
---|
29 | R_gr6 .equ 24 |
---|
30 | R_gr7 .equ 28 |
---|
31 | R_gr8 .equ 32 |
---|
32 | R_gr9 .equ 36 |
---|
33 | R_gr10 .equ 40 |
---|
34 | R_gr11 .equ 44 |
---|
35 | R_gr12 .equ 48 |
---|
36 | R_gr13 .equ 52 |
---|
37 | R_gr14 .equ 56 |
---|
38 | R_gr15 .equ 60 |
---|
39 | R_gr16 .equ 64 |
---|
40 | R_gr17 .equ 68 |
---|
41 | R_gr18 .equ 72 |
---|
42 | R_gr19 .equ 76 |
---|
43 | R_gr20 .equ 80 |
---|
44 | R_gr21 .equ 84 |
---|
45 | R_gr22 .equ 88 |
---|
46 | R_gr23 .equ 92 |
---|
47 | R_gr24 .equ 96 |
---|
48 | R_gr25 .equ 100 |
---|
49 | R_gr26 .equ 104 |
---|
50 | R_gr27 .equ 108 |
---|
51 | R_gr28 .equ 112 |
---|
52 | R_gr29 .equ 116 |
---|
53 | R_gr30 .equ 120 |
---|
54 | R_gr31 .equ 124 |
---|
55 | R_rctr .equ 160 |
---|
56 | R_cpu0 .equ 164 |
---|
57 | R_pidr1 .equ 168 |
---|
58 | R_pidr2 .equ 172 |
---|
59 | R_ccr .equ 176 |
---|
60 | R_sar .equ 180 |
---|
61 | R_pidr3 .equ 184 |
---|
62 | R_pidr4 .equ 188 |
---|
63 | R_iva .equ 192 |
---|
64 | R_eiem .equ 196 |
---|
65 | |
---|
66 | R_itmr .equ 200 |
---|
67 | R_pcsqH .equ 204 |
---|
68 | R_pcoqH .equ 208 |
---|
69 | R_iir .equ 212 |
---|
70 | R_pcsqT .equ 216 |
---|
71 | R_pcoqT .equ 220 |
---|
72 | R_isr .equ 224 |
---|
73 | R_ior .equ 228 |
---|
74 | R_ipsw .equ 232 |
---|
75 | R_eirr .equ 236 |
---|
76 | R_tr0 .equ 240 |
---|
77 | R_tr1 .equ 244 |
---|
78 | R_tr2 .equ 248 |
---|
79 | R_tr3 .equ 252 |
---|
80 | R_tr4 .equ 256 |
---|
81 | R_tr5 .equ 260 |
---|
82 | R_tr6 .equ 264 |
---|
83 | R_tr7 .equ 268 |
---|
84 | |
---|
85 | R_SIZE .equ 300 |
---|
86 | |
---|
87 | .import putc,code |
---|
88 | .import puts,code |
---|
89 | .import putnum,code |
---|
90 | .import put_led,code |
---|
91 | .import save_regs,code |
---|
92 | .import STUB_RESTORE,code |
---|
93 | .import RegBlk,data |
---|
94 | .export iva_table,data |
---|
95 | .IMPORT led_putnum,code |
---|
96 | .IMPORT delay,code |
---|
97 | .IMPORT putnum,code |
---|
98 | .IMPORT outbyte,code |
---|
99 | .IMPORT print,code |
---|
100 | |
---|
101 | .align 2048 |
---|
102 | iva_table |
---|
103 | .blockz 32 ; entry 0 is reserved |
---|
104 | |
---|
105 | .align 32 |
---|
106 | hpmc |
---|
107 | nop |
---|
108 | b,n hpmc_handler |
---|
109 | nop |
---|
110 | .word 0 |
---|
111 | .word 0 |
---|
112 | .word 0 |
---|
113 | .word hpmc_handler |
---|
114 | .word 0 |
---|
115 | |
---|
116 | .align 32 |
---|
117 | power_fail |
---|
118 | ; PrintString Str02,0x2 |
---|
119 | ldi 1,%r26 |
---|
120 | bl,n putnum,%r2 |
---|
121 | nop |
---|
122 | |
---|
123 | .align 32 |
---|
124 | recovery |
---|
125 | ;; PrintString Str03,0x3 |
---|
126 | ldi 2,%r26 |
---|
127 | bl,n putnum,%r2 |
---|
128 | nop |
---|
129 | ldi 3,%r1 |
---|
130 | b,n handle_rcc |
---|
131 | nop |
---|
132 | |
---|
133 | .align 32 |
---|
134 | external |
---|
135 | ; PrintString Str04,0x4 |
---|
136 | ldi 3,%r26 |
---|
137 | bl,n putnum,%r2 |
---|
138 | nop |
---|
139 | |
---|
140 | .align 32 |
---|
141 | lpmc |
---|
142 | ; PrintString Str05,0x5 |
---|
143 | ldi 4,%r26 |
---|
144 | bl,n putnum,%r2 |
---|
145 | nop |
---|
146 | |
---|
147 | .align 32 |
---|
148 | itlb_miss |
---|
149 | ; PrintString Str06,0x6 |
---|
150 | ldi 5,%r26 |
---|
151 | bl,n putnum,%r2 |
---|
152 | nop |
---|
153 | |
---|
154 | .align 32 |
---|
155 | imem_protection |
---|
156 | ; PrintString Str07,0x7 |
---|
157 | ldi 6,%r26 |
---|
158 | bl,n putnum,%r2 |
---|
159 | nop |
---|
160 | |
---|
161 | .align 32 |
---|
162 | illegal_inst |
---|
163 | ; PrintString Str08,0x8 |
---|
164 | ldi 7,%r26 |
---|
165 | bl,n putnum,%r2 |
---|
166 | nop |
---|
167 | |
---|
168 | .align 32 |
---|
169 | break |
---|
170 | b,n break_handler |
---|
171 | nop |
---|
172 | |
---|
173 | .align 32 |
---|
174 | privileged_op |
---|
175 | ; PrintString Str0a,0xa |
---|
176 | ldi 8,%r26 |
---|
177 | bl,n putnum,%r2 |
---|
178 | nop |
---|
179 | |
---|
180 | .align 32 |
---|
181 | privileged_reg |
---|
182 | ; PrintString Str0b,0xb |
---|
183 | ldi 9,%r26 |
---|
184 | bl,n putnum,%r2 |
---|
185 | nop |
---|
186 | |
---|
187 | .align 32 |
---|
188 | overflow |
---|
189 | ; PrintString Str0c,0xc |
---|
190 | ldi 32,%r26 |
---|
191 | bl,n putnum,%r2 |
---|
192 | nop |
---|
193 | |
---|
194 | .align 32 |
---|
195 | conditional |
---|
196 | ; PrintString Str0d,0xd |
---|
197 | ldi 32,%r26 |
---|
198 | bl,n putnum,%r2 |
---|
199 | nop |
---|
200 | |
---|
201 | .align 32 |
---|
202 | assist_excep |
---|
203 | ; PrintString Str0e,0xe |
---|
204 | ldi 32,%r26 |
---|
205 | bl,n putnum,%r2 |
---|
206 | nop |
---|
207 | |
---|
208 | .align 32 |
---|
209 | dtlb_miss |
---|
210 | ; PrintString Str0f,0xf |
---|
211 | ldi 32,%r26 |
---|
212 | bl,n putnum,%r2 |
---|
213 | nop |
---|
214 | |
---|
215 | .align 32 |
---|
216 | na_itlb |
---|
217 | ; PrintString Str10,0x10 |
---|
218 | ldi 32,%r26 |
---|
219 | bl,n putnum,%r2 |
---|
220 | nop |
---|
221 | |
---|
222 | .align 32 |
---|
223 | na_dtlb |
---|
224 | ; PrintString Str11,0x11 |
---|
225 | ldi 32,%r26 |
---|
226 | bl,n putnum,%r2 |
---|
227 | nop |
---|
228 | |
---|
229 | .align 32 |
---|
230 | dmem_protection |
---|
231 | ; PrintString Str12,0x12 |
---|
232 | ldi 32,%r26 |
---|
233 | bl,n putnum,%r2 |
---|
234 | nop |
---|
235 | |
---|
236 | .align 32 |
---|
237 | dmem_break |
---|
238 | ; PrintString Str13,0x13 |
---|
239 | ldi 32,%r26 |
---|
240 | bl,n putnum,%r2 |
---|
241 | nop |
---|
242 | |
---|
243 | .align 32 |
---|
244 | tlb_dirty |
---|
245 | ; PrintString Str14,0x14 |
---|
246 | ldi 32,%r26 |
---|
247 | bl,n putnum,%r2 |
---|
248 | nop |
---|
249 | |
---|
250 | .align 32 |
---|
251 | page_ref |
---|
252 | ; PrintString Str15,0x15 |
---|
253 | ldi 32,%r26 |
---|
254 | bl,n putnum,%r2 |
---|
255 | nop |
---|
256 | |
---|
257 | .align 32 |
---|
258 | assist_emul |
---|
259 | ; PrintString Str16,0x16 |
---|
260 | ldi 32,%r26 |
---|
261 | bl,n putnum,%r2 |
---|
262 | nop |
---|
263 | |
---|
264 | .align 32 |
---|
265 | high_priv |
---|
266 | ; PrintString Str17,0x17 |
---|
267 | ldi 32,%r26 |
---|
268 | bl,n putnum,%r2 |
---|
269 | nop |
---|
270 | |
---|
271 | .align 32 |
---|
272 | low_priv |
---|
273 | ; PrintString Str18,0x18 |
---|
274 | ldi 32,%r26 |
---|
275 | bl,n putnum,%r2 |
---|
276 | nop |
---|
277 | |
---|
278 | .align 32 |
---|
279 | branch_taken |
---|
280 | ; PrintString Str19,0x19 |
---|
281 | ldi 32,%r26 |
---|
282 | bl,n putnum,%r2 |
---|
283 | nop |
---|
284 | |
---|
285 | /* |
---|
286 | * foobar -- debug procedure calling between C and assembler |
---|
287 | */ |
---|
288 | .EXPORT foobar,ENTRY,ARGW0=GR,RTNVAL=GR |
---|
289 | foobar |
---|
290 | .PROC |
---|
291 | .CALLINFO CALLER,FRAME=128,SAVE_RP |
---|
292 | .ENTRY |
---|
293 | |
---|
294 | stw %r2,-20(0,%r30) ; stash the return pointer |
---|
295 | ldo 128(%r30),%r30 ; push up the stack pointer |
---|
296 | |
---|
297 | ldi 8, %r26 |
---|
298 | bl,n led_putnum,%r2 |
---|
299 | nop |
---|
300 | ldil L'900000,%r26 |
---|
301 | ldo R'900000(%r26),%r26 |
---|
302 | bl,n delay,%r2 |
---|
303 | nop |
---|
304 | ldi 8, %r26 |
---|
305 | bl,n led_putnum,%r2 |
---|
306 | nop |
---|
307 | ldil L'900000,%r26 |
---|
308 | ldo R'900000(%r26),%r26 |
---|
309 | bl,n delay,%r2 |
---|
310 | nop |
---|
311 | ;; copy %r26,%r26 |
---|
312 | ;; bl,n putnum,%r2 |
---|
313 | nop |
---|
314 | |
---|
315 | ldw -148(0,%r30),%r2 ; retrieve the return pointer |
---|
316 | ldo -128(%r30),%r30 ; reset the stack pointer |
---|
317 | bv,n 0(%r2) |
---|
318 | nop |
---|
319 | |
---|
320 | .EXIT |
---|
321 | .PROCEND |
---|
322 | |
---|
323 | /* |
---|
324 | * setup_vectors -- add vectors for GDB to the vector table. |
---|
325 | * %r3 - current vector table |
---|
326 | * %r4 - new vector table |
---|
327 | */ |
---|
328 | .EXPORT setup_vectors,ENTRY,ARGW0=GR,RTNVAL=GR |
---|
329 | setup_vectors |
---|
330 | .PROC |
---|
331 | .CALLINFO CALLER,FRAME=128,SAVE_RP |
---|
332 | .ENTRY |
---|
333 | stw %r2,-20(0,%r30) ; stash the return pointer |
---|
334 | ldo 128(%r30),%r30 ; push up the stack pointer |
---|
335 | |
---|
336 | mfctl %iva,%r3 |
---|
337 | |
---|
338 | ldil L%iva_table,%r4 ; Get the new vector table |
---|
339 | ldo R%iva_table(%r4),%r4 ; address |
---|
340 | |
---|
341 | ldil L%break_handler,%r5 ; Get the breakpoint |
---|
342 | ldo R%break_handler(%r5),%r5 ; handler vector |
---|
343 | |
---|
344 | ldil L%break_default,%r6 ; Get the default handler |
---|
345 | ldo R%break_default(%r6),%r6 ; vector |
---|
346 | |
---|
347 | stw %r6,4(%r4) ; ad the default vector |
---|
348 | stw %r5,36(%r4) ; add the break vector |
---|
349 | |
---|
350 | mtctl %r4,%iva |
---|
351 | |
---|
352 | ldw -148(0,%r30),%r2 ; retrieve the return pointer |
---|
353 | ldo -128(%r30),%r30 ; reset the stack pointer |
---|
354 | bv,n 0(%r2) |
---|
355 | nop |
---|
356 | |
---|
357 | .EXIT |
---|
358 | .PROCEND |
---|
359 | |
---|
360 | ;------------------------------------------------------------------------------- |
---|
361 | hpmc_handler |
---|
362 | bl,n save_state,%r25 |
---|
363 | nop |
---|
364 | bl print_intr,%rp |
---|
365 | ldi Str01-Str01,%arg0 |
---|
366 | bl print_state,%rp |
---|
367 | nop |
---|
368 | ldil L%0xf0000000,%r1 |
---|
369 | ldw (%r1),%r1 ; read from ROM to reset HPMC |
---|
370 | |
---|
371 | mfcpu_c 0,%r1 |
---|
372 | mfcpu_c 0,%r1 |
---|
373 | depi 0,CPU_DIAG_0_PREV_HPMC_PREP_BIT,1,%r1 ; clear Prev HPMC bit |
---|
374 | |
---|
375 | #ifdef PCXL |
---|
376 | depi 0,CPU_DIAG_0_L2DHPMC_BIT,1,%r1 |
---|
377 | depi 0,CPU_DIAG_0_L2IHPMC_BIT,1,%r1 |
---|
378 | depi 0,CPU_DIAG_0_L1IHPMC_BIT,1,%r1 |
---|
379 | depi 0,CPU_DIAG_0_L2PARERR_BIT,4,%r1 |
---|
380 | #else /* PCXT */ |
---|
381 | depi 0,CPU_DIAG_0_DHPMC_BIT,1,%r1 ; don't clear DHPMC |
---|
382 | depi 0,CPU_DIAG_0_ILPMC_BIT,1,%r1 ; don't clear ILPMC |
---|
383 | depi 0,CPU_DIAG_0_HTOC_BIT,1,%r1 ; don't clear HTOC |
---|
384 | #endif |
---|
385 | |
---|
386 | mtcpu %r1,0 |
---|
387 | mtcpu %r1,0 |
---|
388 | |
---|
389 | b,n restore_to_STUB |
---|
390 | ldi 0x1,%r1 |
---|
391 | |
---|
392 | /* |
---|
393 | * break_handler -- this is the main entry point for an exception |
---|
394 | */ |
---|
395 | .ALIGN 2048 |
---|
396 | break_handler |
---|
397 | |
---|
398 | mfctl %iir,%r1 ; r1 = break instruction |
---|
399 | extru %r1,18,13,%r8 |
---|
400 | ldo -i13BREAK(%r8),%r8 ; if im13 field doesn't match |
---|
401 | comb,<>,n %r8,%r0,break_default ; go to default operation |
---|
402 | extru %r1,31,5,%r8 |
---|
403 | ldi 0x9,%r1 ; set exception index |
---|
404 | comib,=,n i5BP,%r8,break_breakpoint |
---|
405 | comib,=,n i5PSW,%r8,break_psw |
---|
406 | comib,=,n i5REG,%r8,break_reg_init |
---|
407 | comib,=,n i5INLINE,%r8,break_breakpoint |
---|
408 | ; fall through to break_default |
---|
409 | |
---|
410 | break_default |
---|
411 | ; PrintString Str09,0x9 |
---|
412 | ldi 32,%r26 |
---|
413 | bl,n putnum,%r2 |
---|
414 | nop |
---|
415 | |
---|
416 | break_reg_init |
---|
417 | bl setup_vectors,%r25 |
---|
418 | nop |
---|
419 | bl save_regs,%r25 |
---|
420 | nop |
---|
421 | ; fall through to advance past break instruction |
---|
422 | |
---|
423 | break_psw |
---|
424 | b,n recover |
---|
425 | |
---|
426 | break_breakpoint |
---|
427 | b,n STUB_RESTORE |
---|
428 | |
---|
429 | ;------------------------------------------------------------------------------- |
---|
430 | |
---|
431 | handle_rcc |
---|
432 | mfctl %ipsw,%r1 |
---|
433 | bb,>=,n %r1,10,do_restore ; check nullify bit |
---|
434 | dep %r0,10,1,%r1 |
---|
435 | mtctl %r1,%ipsw ; clear nullify bit |
---|
436 | |
---|
437 | ;; was the AdvancePCOQ .macro |
---|
438 | mtctl %r0,%pcoq ; throw away iiaoq head pointer, tail->head |
---|
439 | mfctl %pcoq,%r1 ; get tail pointer |
---|
440 | mtctl %r1,%pcoq ; insert tail pointer |
---|
441 | ldo 4(%r1),%r1 ; advance tail pointer |
---|
442 | mtctl %r1,%pcoq ; insert new tail pointer, former tail->head |
---|
443 | |
---|
444 | do_restore |
---|
445 | b,n STUB_RESTORE |
---|
446 | nop |
---|
447 | ;------------------------------------------------------------------------------- |
---|
448 | |
---|
449 | print_intr |
---|
450 | ; %dp may be messed up, so do self-relocating to reach Save_area |
---|
451 | blr %r0,%r1 |
---|
452 | addil L%Str01-pr_intr_0,%r1 |
---|
453 | |
---|
454 | pr_intr_0 |
---|
455 | ldo R%Str01-pr_intr_0(%r1),%r1 ; r1 points to Save_area |
---|
456 | b puts ; print string--return through rp |
---|
457 | add %r1,%arg0,%arg0 |
---|
458 | |
---|
459 | ;------------------------------------------------------------------------------- |
---|
460 | |
---|
461 | halt |
---|
462 | ; %dp may be messed up, so do self-relocating to reach Save_area |
---|
463 | blr %r0,%r1 |
---|
464 | addil L%HaltStr-halt_0,%r1 |
---|
465 | |
---|
466 | halt_0 |
---|
467 | bl puts,%rp ; print halt message |
---|
468 | ldo R%HaltStr-halt_0(%r1),%arg0 |
---|
469 | |
---|
470 | nop |
---|
471 | b,n . ; loop forever |
---|
472 | nop |
---|
473 | |
---|
474 | ;------------------------------------------------------------------------------- |
---|
475 | |
---|
476 | recover |
---|
477 | ;; was the AdvancePCOQ .macro |
---|
478 | mtctl %r0,%pcoq ; throw away iiaoq head pointer, tail->head |
---|
479 | mfctl %pcoq,%r1 ; get tail pointer |
---|
480 | mtctl %r1,%pcoq ; insert tail pointer |
---|
481 | ldo 4(%r1),%r1 ; advance tail pointer |
---|
482 | mtctl %r1,%pcoq ; insert new tail pointer, former tail->head |
---|
483 | |
---|
484 | rfir |
---|
485 | |
---|
486 | ;------------------------------------------------------------------------------- |
---|
487 | |
---|
488 | save_state ; %r25 is return pointer |
---|
489 | ; %dp may be messed up, so do self-relocating to reach Save_area |
---|
490 | blr %r0,%r1 |
---|
491 | addil L%Save_area-sa_st_0,%r1 |
---|
492 | |
---|
493 | sa_st_0 |
---|
494 | ldo R%Save_area-sa_st_0(%r1),%r1 ; r1 points to Save_area |
---|
495 | |
---|
496 | ; save general registers |
---|
497 | stw %r0,R_gr0(%r1) |
---|
498 | ; don't save %r1 until restored |
---|
499 | stw %r2,R_gr2(%r1) |
---|
500 | stw %r3,R_gr3(%r1) |
---|
501 | stw %r4,R_gr4(%r1) |
---|
502 | stw %r5,R_gr5(%r1) |
---|
503 | stw %r6,R_gr6(%r1) |
---|
504 | stw %r7,R_gr7(%r1) |
---|
505 | ; don't save %r8, %r9 until restored |
---|
506 | stw %r10,R_gr10(%r1) |
---|
507 | stw %r11,R_gr11(%r1) |
---|
508 | stw %r12,R_gr12(%r1) |
---|
509 | stw %r13,R_gr13(%r1) |
---|
510 | stw %r14,R_gr14(%r1) |
---|
511 | stw %r15,R_gr15(%r1) |
---|
512 | ; don't save %r16, %r17 until restored |
---|
513 | stw %r18,R_gr18(%r1) |
---|
514 | stw %r19,R_gr19(%r1) |
---|
515 | stw %r20,R_gr20(%r1) |
---|
516 | stw %r21,R_gr21(%r1) |
---|
517 | stw %r22,R_gr22(%r1) |
---|
518 | stw %r23,R_gr23(%r1) |
---|
519 | ; don't save %r24, %r25 until restored |
---|
520 | stw %r26,R_gr26(%r1) |
---|
521 | stw %r27,R_gr27(%r1) |
---|
522 | stw %r28,R_gr28(%r1) |
---|
523 | stw %r29,R_gr29(%r1) |
---|
524 | copy %r25,%rp ; copy return pointer to %rp |
---|
525 | stw %r30,R_gr30(%r1) |
---|
526 | copy %r1,%r19 ; save Save_area pointer in %r19 |
---|
527 | stw %r31,R_gr31(%r1) |
---|
528 | shdw_gr ; restore %r1 and %r25 (et al.) from shadow regs |
---|
529 | shdw_gr |
---|
530 | stw %r1,R_gr1(%r19) ; save %r1 |
---|
531 | stw %r8,R_gr8(%r19) |
---|
532 | stw %r9,R_gr9(%r19) |
---|
533 | stw %r16,R_gr16(%r19) |
---|
534 | stw %r17,R_gr17(%r19) |
---|
535 | stw %r24,R_gr24(%r19) |
---|
536 | |
---|
537 | ; save control registers |
---|
538 | mfctl %rctr,%r1 |
---|
539 | stw %r1,R_rctr(%r19) |
---|
540 | mfctl %pidr1,%r1 |
---|
541 | stw %r1,R_pidr1(%r19) |
---|
542 | mfctl %pidr2,%r1 |
---|
543 | stw %r1,R_pidr2(%r19) |
---|
544 | mfctl %ccr,%r1 |
---|
545 | stw %r1,R_ccr(%r19) |
---|
546 | mfctl %sar,%r1 |
---|
547 | stw %r1,R_sar(%r19) |
---|
548 | mfctl %pidr3,%r1 |
---|
549 | stw %r1,R_pidr3(%r19) |
---|
550 | mfctl %pidr4,%r1 |
---|
551 | stw %r1,R_pidr4(%r19) |
---|
552 | mfctl %iva,%r1 |
---|
553 | stw %r1,R_iva(%r19) |
---|
554 | mfctl %eiem,%r1 |
---|
555 | stw %r1,R_eiem(%r19) |
---|
556 | mfctl %itmr,%r1 |
---|
557 | stw %r1,R_itmr(%r19) |
---|
558 | mfctl %pcsq,%r1 |
---|
559 | mtctl %r1,%pcsq |
---|
560 | stw %r1,R_pcsqH(%r19) |
---|
561 | mfctl %pcsq,%r1 |
---|
562 | mtctl %r1,%pcsq |
---|
563 | stw %r1,R_pcsqT(%r19) |
---|
564 | mfctl %pcoq,%r1 |
---|
565 | mtctl %r1,%pcoq |
---|
566 | stw %r1,R_pcoqH(%r19) |
---|
567 | mfctl %pcoq,%r1 |
---|
568 | mtctl %r1,%pcoq |
---|
569 | stw %r1,R_pcoqT(%r19) |
---|
570 | mfctl %iir,%r1 |
---|
571 | stw %r1,R_iir(%r19) |
---|
572 | mfctl %isr,%r1 |
---|
573 | stw %r1,R_isr(%r19) |
---|
574 | mfctl %ior,%r1 |
---|
575 | stw %r1,R_ior(%r19) |
---|
576 | mfctl %ipsw,%r1 |
---|
577 | stw %r1,R_ipsw(%r19) |
---|
578 | mfctl %eirr,%r1 |
---|
579 | stw %r1,R_eirr(%r19) |
---|
580 | mfctl %tr0,%r1 |
---|
581 | stw %r1,R_tr0(%r19) |
---|
582 | mfctl %tr1,%r1 |
---|
583 | stw %r1,R_tr1(%r19) |
---|
584 | mfctl %tr2,%r1 |
---|
585 | stw %r1,R_tr2(%r19) |
---|
586 | mfctl %tr3,%r1 |
---|
587 | stw %r1,R_tr3(%r19) |
---|
588 | mfctl %tr4,%r1 |
---|
589 | stw %r1,R_tr4(%r19) |
---|
590 | mfctl %tr5,%r1 |
---|
591 | stw %r1,R_tr5(%r19) |
---|
592 | mfctl %tr6,%r1 |
---|
593 | stw %r1,R_tr6(%r19) |
---|
594 | mfctl %tr7,%r1 |
---|
595 | stw %r1,R_tr7(%r19) |
---|
596 | |
---|
597 | ; save diagnose registers |
---|
598 | mfcpu_c 0,%r1 |
---|
599 | mfcpu_c 0,%r1 |
---|
600 | stw %r1,R_cpu0(%r19) |
---|
601 | |
---|
602 | #ifdef PRINT_SPACE |
---|
603 | stw %r25,R_gr25(%r19) |
---|
604 | |
---|
605 | ; save space registers |
---|
606 | mfsp %sr0,%r1 |
---|
607 | stw %r1,R_sr0(%r19) |
---|
608 | mfsp %sr1,%r1 |
---|
609 | stw %r1,R_sr1(%r19) |
---|
610 | mfsp %sr2,%r1 |
---|
611 | stw %r1,R_sr2(%r19) |
---|
612 | mfsp %sr3,%r1 |
---|
613 | stw %r1,R_sr3(%r19) |
---|
614 | mfsp %sr4,%r1 |
---|
615 | stw %r1,R_sr4(%r19) |
---|
616 | mfsp %sr5,%r1 |
---|
617 | stw %r1,R_sr5(%r19) |
---|
618 | mfsp %sr6,%r1 |
---|
619 | stw %r1,R_sr6(%r19) |
---|
620 | mfsp %sr7,%r1 |
---|
621 | bv (%rp) |
---|
622 | stw %r1,R_sr7(%r19) |
---|
623 | #else |
---|
624 | bv (%rp) |
---|
625 | stw %r25,R_gr25(%r19) |
---|
626 | #endif |
---|
627 | |
---|
628 | |
---|
629 | ;------------------------------------------------------------------------------- |
---|
630 | |
---|
631 | restore_to_STUB ; doesn't return--goes to STUB_RESTORE |
---|
632 | ; Note--STUB_RESTORE executes rfir, |
---|
633 | ; so we don't need to |
---|
634 | copy %r1,%r8 ; save exception index |
---|
635 | ; %dp may be messed up, so do self-relocating to reach Save_area |
---|
636 | bl re_st_0,%r1 |
---|
637 | addil L%Save_area-re_st_0,%r1 |
---|
638 | |
---|
639 | re_st_0 |
---|
640 | ldo R%Save_area-re_st_0(%r1),%r1 ; r1 points to Save_area |
---|
641 | |
---|
642 | ; restore general registers |
---|
643 | ldw R_gr2(%r1),%r2 |
---|
644 | ldw R_gr3(%r1),%r3 |
---|
645 | ldw R_gr4(%r1),%r4 |
---|
646 | ldw R_gr5(%r1),%r5 |
---|
647 | ldw R_gr6(%r1),%r6 |
---|
648 | ldw R_gr7(%r1),%r7 |
---|
649 | ; ldw R_gr8(%r1),%r8 don't smash the exception index |
---|
650 | ldw R_gr9(%r1),%r9 |
---|
651 | ldw R_gr10(%r1),%r10 |
---|
652 | ldw R_gr11(%r1),%r11 |
---|
653 | ldw R_gr12(%r1),%r12 |
---|
654 | ldw R_gr13(%r1),%r13 |
---|
655 | ldw R_gr14(%r1),%r14 |
---|
656 | ldw R_gr15(%r1),%r15 |
---|
657 | ldw R_gr16(%r1),%r16 |
---|
658 | ldw R_gr17(%r1),%r17 |
---|
659 | ldw R_gr18(%r1),%r18 |
---|
660 | ldw R_gr19(%r1),%r19 |
---|
661 | ldw R_gr20(%r1),%r20 |
---|
662 | ldw R_gr21(%r1),%r21 |
---|
663 | ldw R_gr22(%r1),%r22 |
---|
664 | ldw R_gr23(%r1),%r23 |
---|
665 | ldw R_gr24(%r1),%r24 |
---|
666 | ldw R_gr25(%r1),%r25 |
---|
667 | ldw R_gr26(%r1),%r26 |
---|
668 | ldw R_gr27(%r1),%r27 |
---|
669 | ldw R_gr28(%r1),%r28 |
---|
670 | ldw R_gr29(%r1),%r29 |
---|
671 | ldw R_gr30(%r1),%r30 |
---|
672 | ldw R_gr31(%r1),%r31 |
---|
673 | ldw R_gr1(%r1),%r1 |
---|
674 | b STUB_RESTORE |
---|
675 | copy %r8,%r1 ; restore the exception index |
---|
676 | |
---|
677 | ;------------------------------------------------------------------------------- |
---|
678 | |
---|
679 | #define HoldPtr %r10 |
---|
680 | #define SavePtr %r11 |
---|
681 | #define StrPtr %r12 |
---|
682 | #define Count %r13 |
---|
683 | |
---|
684 | #define Hold_Hold 0*4 /* First word of hold area */ |
---|
685 | #define Hold_Save 1*4 /* Second word of hold area */ |
---|
686 | #define Hold_Str 2*4 /* Third word of hold area */ |
---|
687 | #define Hold_Count 3*4 /* Fourth word of hold area */ |
---|
688 | #define Hold_rp 4*4 /* Fifth word of hold area */ |
---|
689 | |
---|
690 | print_state |
---|
691 | ; %dp may be messed up, so do self-relocating to reach Save_area |
---|
692 | blr %r0,%mrp |
---|
693 | addil L%Hold_area-pr_st_0,%mrp |
---|
694 | |
---|
695 | pr_st_0 |
---|
696 | ldo R%Hold_area-pr_st_0(%r1),%r1 ; r1 points to Hold_area |
---|
697 | |
---|
698 | ; save working registers |
---|
699 | |
---|
700 | stw HoldPtr,Hold_Hold(%r1) |
---|
701 | copy %r1,HoldPtr ; HoldPtr = &Hold_area |
---|
702 | stw SavePtr,Hold_Save(HoldPtr) |
---|
703 | ldo Save_area-Hold_area(HoldPtr),SavePtr ; SavePtr = &Save_area |
---|
704 | stw StrPtr,Hold_Str(HoldPtr) |
---|
705 | addil L%PrintLabels-pr_st_0,%mrp |
---|
706 | stw Count,Hold_Count(HoldPtr) |
---|
707 | ldo R%PrintLabels-pr_st_0(%r1),StrPtr |
---|
708 | stw %rp,Hold_rp(HoldPtr) |
---|
709 | |
---|
710 | |
---|
711 | #ifdef PRINT_SPACE |
---|
712 | ldi 68,Count |
---|
713 | #else |
---|
714 | ldo R_gr0(SavePtr),SavePtr |
---|
715 | ldi 60,Count |
---|
716 | #endif |
---|
717 | |
---|
718 | ; print register values |
---|
719 | |
---|
720 | print_loop |
---|
721 | bl puts,%rp ; print label |
---|
722 | ldo 1(StrPtr),%arg0 ; advance past length byte |
---|
723 | bl putnum,%rp ; print register value |
---|
724 | ldwm 4(SavePtr),%arg0 |
---|
725 | ldbs,ma 1(StrPtr),%r1 |
---|
726 | addib,> -1,Count,print_loop |
---|
727 | add %r1,StrPtr,StrPtr |
---|
728 | |
---|
729 | ; skip to next line |
---|
730 | bl puts,%rp ; print label |
---|
731 | ldo 1(StrPtr),%arg0 ; advance past length byte |
---|
732 | |
---|
733 | ; restore working registers |
---|
734 | |
---|
735 | ldw Hold_rp(HoldPtr),%rp |
---|
736 | ldw Hold_Count(HoldPtr),Count |
---|
737 | ldw Hold_Str(HoldPtr),StrPtr |
---|
738 | ldw Hold_Save(HoldPtr),SavePtr |
---|
739 | bv (%rp) |
---|
740 | ldw Hold_Hold(HoldPtr),HoldPtr |
---|
741 | |
---|
742 | #undef SavePtr |
---|
743 | #undef HoldPtr |
---|
744 | #undef StrPtr |
---|
745 | #undef Count |
---|
746 | |
---|
747 | #undef Hold_Save |
---|
748 | #undef Hold_Scr |
---|
749 | #undef Hold_Str |
---|
750 | #undef Hold_Count |
---|
751 | #undef Hold_rp |
---|
752 | |
---|
753 | ;------------------------------------------------------------------------------- |
---|
754 | |
---|
755 | .space $PRIVATE$ |
---|
756 | .subspa $DATA$,align=4,access=0x1f |
---|
757 | |
---|
758 | /* Used to save machine registers before printing */ |
---|
759 | Save_area |
---|
760 | .block R_SIZE ; Used to store registers |
---|
761 | |
---|
762 | /* Used to hold callee-save registers */ |
---|
763 | Hold_area |
---|
764 | .block 8*4 ; 8 words to store temp. registers |
---|
765 | |
---|
766 | HaltStr |
---|
767 | .stringz "\r\nHalted\r\n" |
---|
768 | |
---|
769 | RebootStr |
---|
770 | .stringz "\r\nRebooting . . .\r\n" |
---|
771 | |
---|
772 | Str01 |
---|
773 | .stringz "\r\nHPMC\r\n" |
---|
774 | |
---|
775 | Str02 |
---|
776 | .stringz "\r\nPower Fail\r\n" |
---|
777 | |
---|
778 | Str03 |
---|
779 | .stringz "\r\nRecovery Counter Trap\r\n" |
---|
780 | |
---|
781 | Str04 |
---|
782 | .stringz "\r\nExternal Interrupt\r\n" |
---|
783 | |
---|
784 | Str05 |
---|
785 | .stringz "\r\nLPMC\r\n" |
---|
786 | |
---|
787 | Str06 |
---|
788 | .stringz "\r\nITLB Miss\r\n" |
---|
789 | |
---|
790 | Str07 |
---|
791 | .stringz "\r\nInstruction Memory Protection Trap\r\n" |
---|
792 | |
---|
793 | Str08 |
---|
794 | .stringz "\r\nIllegal Instruction\r\n" |
---|
795 | |
---|
796 | Str09 |
---|
797 | .stringz "\r\nBreak Trap\r\n" |
---|
798 | |
---|
799 | Str0a |
---|
800 | .stringz "\r\nPrivileged Operation\r\n" |
---|
801 | |
---|
802 | Str0b |
---|
803 | .stringz "\r\nPrivileged Register\r\n" |
---|
804 | |
---|
805 | Str0c |
---|
806 | .stringz "\r\nOverflow Trap\r\n" |
---|
807 | |
---|
808 | Str0d |
---|
809 | .stringz "\r\nConditional Trap\r\n" |
---|
810 | |
---|
811 | Str0e |
---|
812 | .stringz "\r\nAssist Exception\r\n" |
---|
813 | |
---|
814 | Str0f |
---|
815 | .stringz "\r\nData TLB Miss\r\n" |
---|
816 | |
---|
817 | Str10 |
---|
818 | .stringz "\r\nNon-access ITLB Miss\r\n" |
---|
819 | |
---|
820 | Str11 |
---|
821 | .stringz "\r\nNon-access DTLB Miss\r\n" |
---|
822 | |
---|
823 | Str12 |
---|
824 | .stringz "\r\nData Memory Protection Trap\r\n" |
---|
825 | |
---|
826 | Str13 |
---|
827 | .stringz "\r\nData Memory Break\r\n" |
---|
828 | |
---|
829 | Str14 |
---|
830 | .stringz "\r\nTLB Dirty Bit Trap\r\n" |
---|
831 | |
---|
832 | Str15 |
---|
833 | .stringz "\r\nPage Reference Trap\r\n" |
---|
834 | |
---|
835 | Str16 |
---|
836 | .stringz "\r\nAssist Emulation Trap\r\n" |
---|
837 | |
---|
838 | Str17 |
---|
839 | .stringz "\r\nHigher-privilege Trap\r\n" |
---|
840 | |
---|
841 | Str18 |
---|
842 | .stringz "\r\nLower-privilege Trap\r\n" |
---|
843 | |
---|
844 | Str19 |
---|
845 | .stringz "\r\nTaken Branch Trap\r\n" |
---|
846 | |
---|
847 | Str20 |
---|
848 | .stringz "\r\nHere I am!\r\n" |
---|
849 | |
---|
850 | PrintLabels |
---|
851 | #ifdef PRINT_SPACE |
---|
852 | .byte 10 |
---|
853 | .stringz "sr 0 = 0x" |
---|
854 | .byte 13 |
---|
855 | .stringz "sr 1 = 0x" |
---|
856 | .byte 13 |
---|
857 | .stringz "sr 2 = 0x" |
---|
858 | .byte 13 |
---|
859 | .stringz " sr 3 = 0x" |
---|
860 | .byte 12 |
---|
861 | .stringz "\r\nsr 4 = 0x" |
---|
862 | .byte 13 |
---|
863 | .stringz " sr 5 = 0x" |
---|
864 | .byte 13 |
---|
865 | .stringz " sr 6 = 0x" |
---|
866 | .byte 13 |
---|
867 | .stringz " sr 7 = 0x" |
---|
868 | .byte 13 |
---|
869 | .stringz "\r\n\ngr 0 = 0x" |
---|
870 | #else |
---|
871 | .byte 10 |
---|
872 | .stringz "gr 0 = 0x" |
---|
873 | #endif |
---|
874 | |
---|
875 | .byte 13 |
---|
876 | .stringz " gr 1 = 0x" |
---|
877 | .byte 13 |
---|
878 | .stringz " gr 2 = 0x" |
---|
879 | .byte 13 |
---|
880 | .stringz " gr 3 = 0x" |
---|
881 | .byte 12 |
---|
882 | .stringz "\r\ngr 4 = 0x" |
---|
883 | .byte 13 |
---|
884 | .stringz " gr 5 = 0x" |
---|
885 | .byte 13 |
---|
886 | .stringz " gr 6 = 0x" |
---|
887 | .byte 13 |
---|
888 | .stringz " gr 7 = 0x" |
---|
889 | .byte 12 |
---|
890 | .stringz "\r\ngr 8 = 0x" |
---|
891 | .byte 13 |
---|
892 | .stringz " gr 9 = 0x" |
---|
893 | .byte 13 |
---|
894 | .stringz " gr10 = 0x" |
---|
895 | .byte 13 |
---|
896 | .stringz " gr11 = 0x" |
---|
897 | .byte 12 |
---|
898 | .stringz "\r\ngr12 = 0x" |
---|
899 | .byte 13 |
---|
900 | .stringz " gr13 = 0x" |
---|
901 | .byte 13 |
---|
902 | .stringz " gr14 = 0x" |
---|
903 | .byte 13 |
---|
904 | .stringz " gr15 = 0x" |
---|
905 | .byte 12 |
---|
906 | .stringz "\r\ngr16 = 0x" |
---|
907 | .byte 13 |
---|
908 | .stringz " gr17 = 0x" |
---|
909 | .byte 13 |
---|
910 | .stringz " gr18 = 0x" |
---|
911 | .byte 13 |
---|
912 | .stringz " gr19 = 0x" |
---|
913 | .byte 12 |
---|
914 | .stringz "\r\ngr20 = 0x" |
---|
915 | .byte 13 |
---|
916 | .stringz " gr21 = 0x" |
---|
917 | .byte 13 |
---|
918 | .stringz " gr22 = 0x" |
---|
919 | .byte 13 |
---|
920 | .stringz " gr23 = 0x" |
---|
921 | .byte 12 |
---|
922 | .stringz "\r\ngr24 = 0x" |
---|
923 | .byte 13 |
---|
924 | .stringz " gr25 = 0x" |
---|
925 | .byte 13 |
---|
926 | .stringz " gr26 = 0x" |
---|
927 | .byte 13 |
---|
928 | .stringz " gr27 = 0x" |
---|
929 | .byte 12 |
---|
930 | .stringz "\r\ngr28 = 0x" |
---|
931 | .byte 13 |
---|
932 | .stringz " gr29 = 0x" |
---|
933 | .byte 13 |
---|
934 | .stringz " gr30 = 0x" |
---|
935 | .byte 13 |
---|
936 | .stringz " gr31 = 0x" |
---|
937 | .byte 13 |
---|
938 | .stringz "\r\n\nrctr = 0x" |
---|
939 | .byte 53 |
---|
940 | .stringz " cpu0 = 0x" |
---|
941 | .byte 12 |
---|
942 | .stringz "\r\npid1 = 0x" |
---|
943 | .byte 13 |
---|
944 | .stringz " pid2 = 0x" |
---|
945 | .byte 13 |
---|
946 | .stringz " ccr = 0x" |
---|
947 | .byte 13 |
---|
948 | .stringz " sar = 0x" |
---|
949 | .byte 12 |
---|
950 | .stringz "\r\npid3 = 0x" |
---|
951 | .byte 13 |
---|
952 | .stringz " pid4 = 0x" |
---|
953 | .byte 13 |
---|
954 | .stringz " iva = 0x" |
---|
955 | .byte 13 |
---|
956 | .stringz " eiem = 0x" |
---|
957 | .byte 12 |
---|
958 | .stringz "\r\nitmr = 0x" |
---|
959 | .byte 13 |
---|
960 | .stringz " iasq = 0x" |
---|
961 | .byte 13 |
---|
962 | .stringz " iaoq = 0x" |
---|
963 | .byte 13 |
---|
964 | .stringz " iir = 0x" |
---|
965 | .byte 32 |
---|
966 | .stringz "\r\n iasq = 0x" |
---|
967 | .byte 13 |
---|
968 | .stringz " iaoq = 0x" |
---|
969 | .byte 12 |
---|
970 | .stringz "\r\n isr = 0x" |
---|
971 | .byte 13 |
---|
972 | .stringz " ior = 0x" |
---|
973 | .byte 13 |
---|
974 | .stringz " ipsw = 0x" |
---|
975 | .byte 13 |
---|
976 | .stringz " eirr = 0x" |
---|
977 | .byte 12 |
---|
978 | .stringz "\r\ncr24 = 0x" |
---|
979 | .byte 13 |
---|
980 | .stringz " cr25 = 0x" |
---|
981 | .byte 13 |
---|
982 | .stringz " cr26 = 0x" |
---|
983 | .byte 13 |
---|
984 | .stringz " cr27 = 0x" |
---|
985 | .byte 12 |
---|
986 | .stringz "\r\ncr28 = 0x" |
---|
987 | .byte 13 |
---|
988 | .stringz " cr29 = 0x" |
---|
989 | .byte 13 |
---|
990 | .stringz " cr30 = 0x" |
---|
991 | .byte 13 |
---|
992 | .stringz " cr31 = 0x" |
---|
993 | .byte 4 |
---|
994 | .stringz "\r\n\n" |
---|
995 | |
---|
996 | .end |
---|