| /**************************************************************************** |
| |
| THIS SOFTWARE IS NOT COPYRIGHTED |
| |
| HP offers the following for use in the public domain. HP makes no |
| warranty with regard to the software or it's performance and the |
| user accepts the software "AS IS" with all faults. |
| |
| HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD |
| TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| |
| ****************************************************************************/ |
| |
| .space $TEXT$ |
| .subspa $CODE$,access=0x2c |
| |
| #include "diagnose.h" |
| #if 0 |
| #include "iva_table.h" |
| #endif |
| |
| R_gr0 .equ 0 |
| R_gr1 .equ 4 |
| R_gr2 .equ 8 |
| R_gr3 .equ 12 |
| R_gr4 .equ 16 |
| R_gr5 .equ 20 |
| R_gr6 .equ 24 |
| R_gr7 .equ 28 |
| R_gr8 .equ 32 |
| R_gr9 .equ 36 |
| R_gr10 .equ 40 |
| R_gr11 .equ 44 |
| R_gr12 .equ 48 |
| R_gr13 .equ 52 |
| R_gr14 .equ 56 |
| R_gr15 .equ 60 |
| R_gr16 .equ 64 |
| R_gr17 .equ 68 |
| R_gr18 .equ 72 |
| R_gr19 .equ 76 |
| R_gr20 .equ 80 |
| R_gr21 .equ 84 |
| R_gr22 .equ 88 |
| R_gr23 .equ 92 |
| R_gr24 .equ 96 |
| R_gr25 .equ 100 |
| R_gr26 .equ 104 |
| R_gr27 .equ 108 |
| R_gr28 .equ 112 |
| R_gr29 .equ 116 |
| R_gr30 .equ 120 |
| R_gr31 .equ 124 |
| R_rctr .equ 160 |
| R_cpu0 .equ 164 |
| R_pidr1 .equ 168 |
| R_pidr2 .equ 172 |
| R_ccr .equ 176 |
| R_sar .equ 180 |
| R_pidr3 .equ 184 |
| R_pidr4 .equ 188 |
| R_iva .equ 192 |
| R_eiem .equ 196 |
| |
| R_itmr .equ 200 |
| R_pcsqH .equ 204 |
| R_pcoqH .equ 208 |
| R_iir .equ 212 |
| R_pcsqT .equ 216 |
| R_pcoqT .equ 220 |
| R_isr .equ 224 |
| R_ior .equ 228 |
| R_ipsw .equ 232 |
| R_eirr .equ 236 |
| R_tr0 .equ 240 |
| R_tr1 .equ 244 |
| R_tr2 .equ 248 |
| R_tr3 .equ 252 |
| R_tr4 .equ 256 |
| R_tr5 .equ 260 |
| R_tr6 .equ 264 |
| R_tr7 .equ 268 |
| |
| R_SIZE .equ 300 |
| |
| .import putc,code |
| .import puts,code |
| .import putnum,code |
| .import put_led,code |
| .import save_regs,code |
| .import STUB_RESTORE,code |
| .import RegBlk,data |
| .export iva_table,data |
| .IMPORT led_putnum,code |
| .IMPORT delay,code |
| .IMPORT putnum,code |
| .IMPORT outbyte,code |
| .IMPORT print,code |
| |
| .align 2048 |
| iva_table |
| .blockz 32 ; entry 0 is reserved |
| |
| .align 32 |
| hpmc |
| nop |
| b,n hpmc_handler |
| nop |
| .word 0 |
| .word 0 |
| .word 0 |
| .word hpmc_handler |
| .word 0 |
| |
| .align 32 |
| power_fail |
| ; PrintString Str02,0x2 |
| ldi 1,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| recovery |
| ;; PrintString Str03,0x3 |
| ldi 2,%r26 |
| bl,n putnum,%r2 |
| nop |
| ldi 3,%r1 |
| b,n handle_rcc |
| nop |
| |
| .align 32 |
| external |
| ; PrintString Str04,0x4 |
| ldi 3,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| lpmc |
| ; PrintString Str05,0x5 |
| ldi 4,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| itlb_miss |
| ; PrintString Str06,0x6 |
| ldi 5,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| imem_protection |
| ; PrintString Str07,0x7 |
| ldi 6,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| illegal_inst |
| ; PrintString Str08,0x8 |
| ldi 7,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| break |
| b,n break_handler |
| nop |
| |
| .align 32 |
| privileged_op |
| ; PrintString Str0a,0xa |
| ldi 8,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| privileged_reg |
| ; PrintString Str0b,0xb |
| ldi 9,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| overflow |
| ; PrintString Str0c,0xc |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| conditional |
| ; PrintString Str0d,0xd |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| assist_excep |
| ; PrintString Str0e,0xe |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| dtlb_miss |
| ; PrintString Str0f,0xf |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| na_itlb |
| ; PrintString Str10,0x10 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| na_dtlb |
| ; PrintString Str11,0x11 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| dmem_protection |
| ; PrintString Str12,0x12 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| dmem_break |
| ; PrintString Str13,0x13 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| tlb_dirty |
| ; PrintString Str14,0x14 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| page_ref |
| ; PrintString Str15,0x15 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| assist_emul |
| ; PrintString Str16,0x16 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| high_priv |
| ; PrintString Str17,0x17 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| low_priv |
| ; PrintString Str18,0x18 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| .align 32 |
| branch_taken |
| ; PrintString Str19,0x19 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| /* |
| * foobar -- debug procedure calling between C and assembler |
| */ |
| .EXPORT foobar,ENTRY,ARGW0=GR,RTNVAL=GR |
| foobar |
| .PROC |
| .CALLINFO CALLER,FRAME=128,SAVE_RP |
| .ENTRY |
| |
| stw %r2,-20(0,%r30) ; stash the return pointer |
| ldo 128(%r30),%r30 ; push up the stack pointer |
| |
| ldi 8, %r26 |
| bl,n led_putnum,%r2 |
| nop |
| ldil L'900000,%r26 |
| ldo R'900000(%r26),%r26 |
| bl,n delay,%r2 |
| nop |
| ldi 8, %r26 |
| bl,n led_putnum,%r2 |
| nop |
| ldil L'900000,%r26 |
| ldo R'900000(%r26),%r26 |
| bl,n delay,%r2 |
| nop |
| ;; copy %r26,%r26 |
| ;; bl,n putnum,%r2 |
| nop |
| |
| ldw -148(0,%r30),%r2 ; retrieve the return pointer |
| ldo -128(%r30),%r30 ; reset the stack pointer |
| bv,n 0(%r2) |
| nop |
| |
| .EXIT |
| .PROCEND |
| |
| /* |
| * setup_vectors -- add vectors for GDB to the vector table. |
| * %r3 - current vector table |
| * %r4 - new vector table |
| */ |
| .EXPORT setup_vectors,ENTRY,ARGW0=GR,RTNVAL=GR |
| setup_vectors |
| .PROC |
| .CALLINFO CALLER,FRAME=128,SAVE_RP |
| .ENTRY |
| stw %r2,-20(0,%r30) ; stash the return pointer |
| ldo 128(%r30),%r30 ; push up the stack pointer |
| |
| mfctl %iva,%r3 |
| |
| ldil L%iva_table,%r4 ; Get the new vector table |
| ldo R%iva_table(%r4),%r4 ; address |
| |
| ldil L%break_handler,%r5 ; Get the breakpoint |
| ldo R%break_handler(%r5),%r5 ; handler vector |
| |
| ldil L%break_default,%r6 ; Get the default handler |
| ldo R%break_default(%r6),%r6 ; vector |
| |
| stw %r6,4(%r4) ; ad the default vector |
| stw %r5,36(%r4) ; add the break vector |
| |
| mtctl %r4,%iva |
| |
| ldw -148(0,%r30),%r2 ; retrieve the return pointer |
| ldo -128(%r30),%r30 ; reset the stack pointer |
| bv,n 0(%r2) |
| nop |
| |
| .EXIT |
| .PROCEND |
| |
| ;------------------------------------------------------------------------------- |
| hpmc_handler |
| bl,n save_state,%r25 |
| nop |
| bl print_intr,%rp |
| ldi Str01-Str01,%arg0 |
| bl print_state,%rp |
| nop |
| ldil L%0xf0000000,%r1 |
| ldw (%r1),%r1 ; read from ROM to reset HPMC |
| |
| mfcpu_c 0,%r1 |
| mfcpu_c 0,%r1 |
| depi 0,CPU_DIAG_0_PREV_HPMC_PREP_BIT,1,%r1 ; clear Prev HPMC bit |
| |
| #ifdef PCXL |
| depi 0,CPU_DIAG_0_L2DHPMC_BIT,1,%r1 |
| depi 0,CPU_DIAG_0_L2IHPMC_BIT,1,%r1 |
| depi 0,CPU_DIAG_0_L1IHPMC_BIT,1,%r1 |
| depi 0,CPU_DIAG_0_L2PARERR_BIT,4,%r1 |
| #else /* PCXT */ |
| depi 0,CPU_DIAG_0_DHPMC_BIT,1,%r1 ; don't clear DHPMC |
| depi 0,CPU_DIAG_0_ILPMC_BIT,1,%r1 ; don't clear ILPMC |
| depi 0,CPU_DIAG_0_HTOC_BIT,1,%r1 ; don't clear HTOC |
| #endif |
| |
| mtcpu %r1,0 |
| mtcpu %r1,0 |
| |
| b,n restore_to_STUB |
| ldi 0x1,%r1 |
| |
| /* |
| * break_handler -- this is the main entry point for an exception |
| */ |
| .ALIGN 2048 |
| break_handler |
| |
| mfctl %iir,%r1 ; r1 = break instruction |
| extru %r1,18,13,%r8 |
| ldo -i13BREAK(%r8),%r8 ; if im13 field doesn't match |
| comb,<>,n %r8,%r0,break_default ; go to default operation |
| extru %r1,31,5,%r8 |
| ldi 0x9,%r1 ; set exception index |
| comib,=,n i5BP,%r8,break_breakpoint |
| comib,=,n i5PSW,%r8,break_psw |
| comib,=,n i5REG,%r8,break_reg_init |
| comib,=,n i5INLINE,%r8,break_breakpoint |
| ; fall through to break_default |
| |
| break_default |
| ; PrintString Str09,0x9 |
| ldi 32,%r26 |
| bl,n putnum,%r2 |
| nop |
| |
| break_reg_init |
| bl setup_vectors,%r25 |
| nop |
| bl save_regs,%r25 |
| nop |
| ; fall through to advance past break instruction |
| |
| break_psw |
| b,n recover |
| |
| break_breakpoint |
| b,n STUB_RESTORE |
| |
| ;------------------------------------------------------------------------------- |
| |
| handle_rcc |
| mfctl %ipsw,%r1 |
| bb,>=,n %r1,10,do_restore ; check nullify bit |
| dep %r0,10,1,%r1 |
| mtctl %r1,%ipsw ; clear nullify bit |
| |
| ;; was the AdvancePCOQ .macro |
| mtctl %r0,%pcoq ; throw away iiaoq head pointer, tail->head |
| mfctl %pcoq,%r1 ; get tail pointer |
| mtctl %r1,%pcoq ; insert tail pointer |
| ldo 4(%r1),%r1 ; advance tail pointer |
| mtctl %r1,%pcoq ; insert new tail pointer, former tail->head |
| |
| do_restore |
| b,n STUB_RESTORE |
| nop |
| ;------------------------------------------------------------------------------- |
| |
| print_intr |
| ; %dp may be messed up, so do self-relocating to reach Save_area |
| blr %r0,%r1 |
| addil L%Str01-pr_intr_0,%r1 |
| |
| pr_intr_0 |
| ldo R%Str01-pr_intr_0(%r1),%r1 ; r1 points to Save_area |
| b puts ; print string--return through rp |
| add %r1,%arg0,%arg0 |
| |
| ;------------------------------------------------------------------------------- |
| |
| halt |
| ; %dp may be messed up, so do self-relocating to reach Save_area |
| blr %r0,%r1 |
| addil L%HaltStr-halt_0,%r1 |
| |
| halt_0 |
| bl puts,%rp ; print halt message |
| ldo R%HaltStr-halt_0(%r1),%arg0 |
| |
| nop |
| b,n . ; loop forever |
| nop |
| |
| ;------------------------------------------------------------------------------- |
| |
| recover |
| ;; was the AdvancePCOQ .macro |
| mtctl %r0,%pcoq ; throw away iiaoq head pointer, tail->head |
| mfctl %pcoq,%r1 ; get tail pointer |
| mtctl %r1,%pcoq ; insert tail pointer |
| ldo 4(%r1),%r1 ; advance tail pointer |
| mtctl %r1,%pcoq ; insert new tail pointer, former tail->head |
| |
| rfir |
| |
| ;------------------------------------------------------------------------------- |
| |
| save_state ; %r25 is return pointer |
| ; %dp may be messed up, so do self-relocating to reach Save_area |
| blr %r0,%r1 |
| addil L%Save_area-sa_st_0,%r1 |
| |
| sa_st_0 |
| ldo R%Save_area-sa_st_0(%r1),%r1 ; r1 points to Save_area |
| |
| ; save general registers |
| stw %r0,R_gr0(%r1) |
| ; don't save %r1 until restored |
| stw %r2,R_gr2(%r1) |
| stw %r3,R_gr3(%r1) |
| stw %r4,R_gr4(%r1) |
| stw %r5,R_gr5(%r1) |
| stw %r6,R_gr6(%r1) |
| stw %r7,R_gr7(%r1) |
| ; don't save %r8, %r9 until restored |
| stw %r10,R_gr10(%r1) |
| stw %r11,R_gr11(%r1) |
| stw %r12,R_gr12(%r1) |
| stw %r13,R_gr13(%r1) |
| stw %r14,R_gr14(%r1) |
| stw %r15,R_gr15(%r1) |
| ; don't save %r16, %r17 until restored |
| stw %r18,R_gr18(%r1) |
| stw %r19,R_gr19(%r1) |
| stw %r20,R_gr20(%r1) |
| stw %r21,R_gr21(%r1) |
| stw %r22,R_gr22(%r1) |
| stw %r23,R_gr23(%r1) |
| ; don't save %r24, %r25 until restored |
| stw %r26,R_gr26(%r1) |
| stw %r27,R_gr27(%r1) |
| stw %r28,R_gr28(%r1) |
| stw %r29,R_gr29(%r1) |
| copy %r25,%rp ; copy return pointer to %rp |
| stw %r30,R_gr30(%r1) |
| copy %r1,%r19 ; save Save_area pointer in %r19 |
| stw %r31,R_gr31(%r1) |
| shdw_gr ; restore %r1 and %r25 (et al.) from shadow regs |
| shdw_gr |
| stw %r1,R_gr1(%r19) ; save %r1 |
| stw %r8,R_gr8(%r19) |
| stw %r9,R_gr9(%r19) |
| stw %r16,R_gr16(%r19) |
| stw %r17,R_gr17(%r19) |
| stw %r24,R_gr24(%r19) |
| |
| ; save control registers |
| mfctl %rctr,%r1 |
| stw %r1,R_rctr(%r19) |
| mfctl %pidr1,%r1 |
| stw %r1,R_pidr1(%r19) |
| mfctl %pidr2,%r1 |
| stw %r1,R_pidr2(%r19) |
| mfctl %ccr,%r1 |
| stw %r1,R_ccr(%r19) |
| mfctl %sar,%r1 |
| stw %r1,R_sar(%r19) |
| mfctl %pidr3,%r1 |
| stw %r1,R_pidr3(%r19) |
| mfctl %pidr4,%r1 |
| stw %r1,R_pidr4(%r19) |
| mfctl %iva,%r1 |
| stw %r1,R_iva(%r19) |
| mfctl %eiem,%r1 |
| stw %r1,R_eiem(%r19) |
| mfctl %itmr,%r1 |
| stw %r1,R_itmr(%r19) |
| mfctl %pcsq,%r1 |
| mtctl %r1,%pcsq |
| stw %r1,R_pcsqH(%r19) |
| mfctl %pcsq,%r1 |
| mtctl %r1,%pcsq |
| stw %r1,R_pcsqT(%r19) |
| mfctl %pcoq,%r1 |
| mtctl %r1,%pcoq |
| stw %r1,R_pcoqH(%r19) |
| mfctl %pcoq,%r1 |
| mtctl %r1,%pcoq |
| stw %r1,R_pcoqT(%r19) |
| mfctl %iir,%r1 |
| stw %r1,R_iir(%r19) |
| mfctl %isr,%r1 |
| stw %r1,R_isr(%r19) |
| mfctl %ior,%r1 |
| stw %r1,R_ior(%r19) |
| mfctl %ipsw,%r1 |
| stw %r1,R_ipsw(%r19) |
| mfctl %eirr,%r1 |
| stw %r1,R_eirr(%r19) |
| mfctl %tr0,%r1 |
| stw %r1,R_tr0(%r19) |
| mfctl %tr1,%r1 |
| stw %r1,R_tr1(%r19) |
| mfctl %tr2,%r1 |
| stw %r1,R_tr2(%r19) |
| mfctl %tr3,%r1 |
| stw %r1,R_tr3(%r19) |
| mfctl %tr4,%r1 |
| stw %r1,R_tr4(%r19) |
| mfctl %tr5,%r1 |
| stw %r1,R_tr5(%r19) |
| mfctl %tr6,%r1 |
| stw %r1,R_tr6(%r19) |
| mfctl %tr7,%r1 |
| stw %r1,R_tr7(%r19) |
| |
| ; save diagnose registers |
| mfcpu_c 0,%r1 |
| mfcpu_c 0,%r1 |
| stw %r1,R_cpu0(%r19) |
| |
| #ifdef PRINT_SPACE |
| stw %r25,R_gr25(%r19) |
| |
| ; save space registers |
| mfsp %sr0,%r1 |
| stw %r1,R_sr0(%r19) |
| mfsp %sr1,%r1 |
| stw %r1,R_sr1(%r19) |
| mfsp %sr2,%r1 |
| stw %r1,R_sr2(%r19) |
| mfsp %sr3,%r1 |
| stw %r1,R_sr3(%r19) |
| mfsp %sr4,%r1 |
| stw %r1,R_sr4(%r19) |
| mfsp %sr5,%r1 |
| stw %r1,R_sr5(%r19) |
| mfsp %sr6,%r1 |
| stw %r1,R_sr6(%r19) |
| mfsp %sr7,%r1 |
| bv (%rp) |
| stw %r1,R_sr7(%r19) |
| #else |
| bv (%rp) |
| stw %r25,R_gr25(%r19) |
| #endif |
| |
| |
| ;------------------------------------------------------------------------------- |
| |
| restore_to_STUB ; doesn't return--goes to STUB_RESTORE |
| ; Note--STUB_RESTORE executes rfir, |
| ; so we don't need to |
| copy %r1,%r8 ; save exception index |
| ; %dp may be messed up, so do self-relocating to reach Save_area |
| bl re_st_0,%r1 |
| addil L%Save_area-re_st_0,%r1 |
| |
| re_st_0 |
| ldo R%Save_area-re_st_0(%r1),%r1 ; r1 points to Save_area |
| |
| ; restore general registers |
| ldw R_gr2(%r1),%r2 |
| ldw R_gr3(%r1),%r3 |
| ldw R_gr4(%r1),%r4 |
| ldw R_gr5(%r1),%r5 |
| ldw R_gr6(%r1),%r6 |
| ldw R_gr7(%r1),%r7 |
| ; ldw R_gr8(%r1),%r8 don't smash the exception index |
| ldw R_gr9(%r1),%r9 |
| ldw R_gr10(%r1),%r10 |
| ldw R_gr11(%r1),%r11 |
| ldw R_gr12(%r1),%r12 |
| ldw R_gr13(%r1),%r13 |
| ldw R_gr14(%r1),%r14 |
| ldw R_gr15(%r1),%r15 |
| ldw R_gr16(%r1),%r16 |
| ldw R_gr17(%r1),%r17 |
| ldw R_gr18(%r1),%r18 |
| ldw R_gr19(%r1),%r19 |
| ldw R_gr20(%r1),%r20 |
| ldw R_gr21(%r1),%r21 |
| ldw R_gr22(%r1),%r22 |
| ldw R_gr23(%r1),%r23 |
| ldw R_gr24(%r1),%r24 |
| ldw R_gr25(%r1),%r25 |
| ldw R_gr26(%r1),%r26 |
| ldw R_gr27(%r1),%r27 |
| ldw R_gr28(%r1),%r28 |
| ldw R_gr29(%r1),%r29 |
| ldw R_gr30(%r1),%r30 |
| ldw R_gr31(%r1),%r31 |
| ldw R_gr1(%r1),%r1 |
| b STUB_RESTORE |
| copy %r8,%r1 ; restore the exception index |
| |
| ;------------------------------------------------------------------------------- |
| |
| #define HoldPtr %r10 |
| #define SavePtr %r11 |
| #define StrPtr %r12 |
| #define Count %r13 |
| |
| #define Hold_Hold 0*4 /* First word of hold area */ |
| #define Hold_Save 1*4 /* Second word of hold area */ |
| #define Hold_Str 2*4 /* Third word of hold area */ |
| #define Hold_Count 3*4 /* Fourth word of hold area */ |
| #define Hold_rp 4*4 /* Fifth word of hold area */ |
| |
| print_state |
| ; %dp may be messed up, so do self-relocating to reach Save_area |
| blr %r0,%mrp |
| addil L%Hold_area-pr_st_0,%mrp |
| |
| pr_st_0 |
| ldo R%Hold_area-pr_st_0(%r1),%r1 ; r1 points to Hold_area |
| |
| ; save working registers |
| |
| stw HoldPtr,Hold_Hold(%r1) |
| copy %r1,HoldPtr ; HoldPtr = &Hold_area |
| stw SavePtr,Hold_Save(HoldPtr) |
| ldo Save_area-Hold_area(HoldPtr),SavePtr ; SavePtr = &Save_area |
| stw StrPtr,Hold_Str(HoldPtr) |
| addil L%PrintLabels-pr_st_0,%mrp |
| stw Count,Hold_Count(HoldPtr) |
| ldo R%PrintLabels-pr_st_0(%r1),StrPtr |
| stw %rp,Hold_rp(HoldPtr) |
| |
| |
| #ifdef PRINT_SPACE |
| ldi 68,Count |
| #else |
| ldo R_gr0(SavePtr),SavePtr |
| ldi 60,Count |
| #endif |
| |
| ; print register values |
| |
| print_loop |
| bl puts,%rp ; print label |
| ldo 1(StrPtr),%arg0 ; advance past length byte |
| bl putnum,%rp ; print register value |
| ldwm 4(SavePtr),%arg0 |
| ldbs,ma 1(StrPtr),%r1 |
| addib,> -1,Count,print_loop |
| add %r1,StrPtr,StrPtr |
| |
| ; skip to next line |
| bl puts,%rp ; print label |
| ldo 1(StrPtr),%arg0 ; advance past length byte |
| |
| ; restore working registers |
| |
| ldw Hold_rp(HoldPtr),%rp |
| ldw Hold_Count(HoldPtr),Count |
| ldw Hold_Str(HoldPtr),StrPtr |
| ldw Hold_Save(HoldPtr),SavePtr |
| bv (%rp) |
| ldw Hold_Hold(HoldPtr),HoldPtr |
| |
| #undef SavePtr |
| #undef HoldPtr |
| #undef StrPtr |
| #undef Count |
| |
| #undef Hold_Save |
| #undef Hold_Scr |
| #undef Hold_Str |
| #undef Hold_Count |
| #undef Hold_rp |
| |
| ;------------------------------------------------------------------------------- |
| |
| .space $PRIVATE$ |
| .subspa $DATA$,align=4,access=0x1f |
| |
| /* Used to save machine registers before printing */ |
| Save_area |
| .block R_SIZE ; Used to store registers |
| |
| /* Used to hold callee-save registers */ |
| Hold_area |
| .block 8*4 ; 8 words to store temp. registers |
| |
| HaltStr |
| .stringz "\r\nHalted\r\n" |
| |
| RebootStr |
| .stringz "\r\nRebooting . . .\r\n" |
| |
| Str01 |
| .stringz "\r\nHPMC\r\n" |
| |
| Str02 |
| .stringz "\r\nPower Fail\r\n" |
| |
| Str03 |
| .stringz "\r\nRecovery Counter Trap\r\n" |
| |
| Str04 |
| .stringz "\r\nExternal Interrupt\r\n" |
| |
| Str05 |
| .stringz "\r\nLPMC\r\n" |
| |
| Str06 |
| .stringz "\r\nITLB Miss\r\n" |
| |
| Str07 |
| .stringz "\r\nInstruction Memory Protection Trap\r\n" |
| |
| Str08 |
| .stringz "\r\nIllegal Instruction\r\n" |
| |
| Str09 |
| .stringz "\r\nBreak Trap\r\n" |
| |
| Str0a |
| .stringz "\r\nPrivileged Operation\r\n" |
| |
| Str0b |
| .stringz "\r\nPrivileged Register\r\n" |
| |
| Str0c |
| .stringz "\r\nOverflow Trap\r\n" |
| |
| Str0d |
| .stringz "\r\nConditional Trap\r\n" |
| |
| Str0e |
| .stringz "\r\nAssist Exception\r\n" |
| |
| Str0f |
| .stringz "\r\nData TLB Miss\r\n" |
| |
| Str10 |
| .stringz "\r\nNon-access ITLB Miss\r\n" |
| |
| Str11 |
| .stringz "\r\nNon-access DTLB Miss\r\n" |
| |
| Str12 |
| .stringz "\r\nData Memory Protection Trap\r\n" |
| |
| Str13 |
| .stringz "\r\nData Memory Break\r\n" |
| |
| Str14 |
| .stringz "\r\nTLB Dirty Bit Trap\r\n" |
| |
| Str15 |
| .stringz "\r\nPage Reference Trap\r\n" |
| |
| Str16 |
| .stringz "\r\nAssist Emulation Trap\r\n" |
| |
| Str17 |
| .stringz "\r\nHigher-privilege Trap\r\n" |
| |
| Str18 |
| .stringz "\r\nLower-privilege Trap\r\n" |
| |
| Str19 |
| .stringz "\r\nTaken Branch Trap\r\n" |
| |
| Str20 |
| .stringz "\r\nHere I am!\r\n" |
| |
| PrintLabels |
| #ifdef PRINT_SPACE |
| .byte 10 |
| .stringz "sr 0 = 0x" |
| .byte 13 |
| .stringz "sr 1 = 0x" |
| .byte 13 |
| .stringz "sr 2 = 0x" |
| .byte 13 |
| .stringz " sr 3 = 0x" |
| .byte 12 |
| .stringz "\r\nsr 4 = 0x" |
| .byte 13 |
| .stringz " sr 5 = 0x" |
| .byte 13 |
| .stringz " sr 6 = 0x" |
| .byte 13 |
| .stringz " sr 7 = 0x" |
| .byte 13 |
| .stringz "\r\n\ngr 0 = 0x" |
| #else |
| .byte 10 |
| .stringz "gr 0 = 0x" |
| #endif |
| |
| .byte 13 |
| .stringz " gr 1 = 0x" |
| .byte 13 |
| .stringz " gr 2 = 0x" |
| .byte 13 |
| .stringz " gr 3 = 0x" |
| .byte 12 |
| .stringz "\r\ngr 4 = 0x" |
| .byte 13 |
| .stringz " gr 5 = 0x" |
| .byte 13 |
| .stringz " gr 6 = 0x" |
| .byte 13 |
| .stringz " gr 7 = 0x" |
| .byte 12 |
| .stringz "\r\ngr 8 = 0x" |
| .byte 13 |
| .stringz " gr 9 = 0x" |
| .byte 13 |
| .stringz " gr10 = 0x" |
| .byte 13 |
| .stringz " gr11 = 0x" |
| .byte 12 |
| .stringz "\r\ngr12 = 0x" |
| .byte 13 |
| .stringz " gr13 = 0x" |
| .byte 13 |
| .stringz " gr14 = 0x" |
| .byte 13 |
| .stringz " gr15 = 0x" |
| .byte 12 |
| .stringz "\r\ngr16 = 0x" |
| .byte 13 |
| .stringz " gr17 = 0x" |
| .byte 13 |
| .stringz " gr18 = 0x" |
| .byte 13 |
| .stringz " gr19 = 0x" |
| .byte 12 |
| .stringz "\r\ngr20 = 0x" |
| .byte 13 |
| .stringz " gr21 = 0x" |
| .byte 13 |
| .stringz " gr22 = 0x" |
| .byte 13 |
| .stringz " gr23 = 0x" |
| .byte 12 |
| .stringz "\r\ngr24 = 0x" |
| .byte 13 |
| .stringz " gr25 = 0x" |
| .byte 13 |
| .stringz " gr26 = 0x" |
| .byte 13 |
| .stringz " gr27 = 0x" |
| .byte 12 |
| .stringz "\r\ngr28 = 0x" |
| .byte 13 |
| .stringz " gr29 = 0x" |
| .byte 13 |
| .stringz " gr30 = 0x" |
| .byte 13 |
| .stringz " gr31 = 0x" |
| .byte 13 |
| .stringz "\r\n\nrctr = 0x" |
| .byte 53 |
| .stringz " cpu0 = 0x" |
| .byte 12 |
| .stringz "\r\npid1 = 0x" |
| .byte 13 |
| .stringz " pid2 = 0x" |
| .byte 13 |
| .stringz " ccr = 0x" |
| .byte 13 |
| .stringz " sar = 0x" |
| .byte 12 |
| .stringz "\r\npid3 = 0x" |
| .byte 13 |
| .stringz " pid4 = 0x" |
| .byte 13 |
| .stringz " iva = 0x" |
| .byte 13 |
| .stringz " eiem = 0x" |
| .byte 12 |
| .stringz "\r\nitmr = 0x" |
| .byte 13 |
| .stringz " iasq = 0x" |
| .byte 13 |
| .stringz " iaoq = 0x" |
| .byte 13 |
| .stringz " iir = 0x" |
| .byte 32 |
| .stringz "\r\n iasq = 0x" |
| .byte 13 |
| .stringz " iaoq = 0x" |
| .byte 12 |
| .stringz "\r\n isr = 0x" |
| .byte 13 |
| .stringz " ior = 0x" |
| .byte 13 |
| .stringz " ipsw = 0x" |
| .byte 13 |
| .stringz " eirr = 0x" |
| .byte 12 |
| .stringz "\r\ncr24 = 0x" |
| .byte 13 |
| .stringz " cr25 = 0x" |
| .byte 13 |
| .stringz " cr26 = 0x" |
| .byte 13 |
| .stringz " cr27 = 0x" |
| .byte 12 |
| .stringz "\r\ncr28 = 0x" |
| .byte 13 |
| .stringz " cr29 = 0x" |
| .byte 13 |
| .stringz " cr30 = 0x" |
| .byte 13 |
| .stringz " cr31 = 0x" |
| .byte 4 |
| .stringz "\r\n\n" |
| |
| .end |