| /**************************************************************************** |
| |
| 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 |
| |
| #if 1 |
| #include "diagnose.h" |
| #endif |
| |
| i13BREAK .equ 0xa5a ; im13 field for specified functions |
| i5REG .equ 0x06 ; Init registers |
| i5BP .equ 0x09 ; GDB breakpoin |
| i5PSW .equ 0x0b ; Get PSW |
| i5INLINE .equ 0x0e ; Get INLINE |
| 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_sr0 .equ 128 |
| R_sr1 .equ 132 |
| R_sr2 .equ 136 |
| R_sr3 .equ 140 |
| R_sr4 .equ 144 |
| R_sr5 .equ 148 |
| R_sr6 .equ 152 |
| R_sr7 .equ 156 |
| |
| R_cr0 .equ 160 |
| R_cr1 .equ 164 |
| R_cr2 .equ 168 |
| R_cr3 .equ 172 |
| R_cr4 .equ 176 |
| R_cr5 .equ 180 |
| R_cr6 .equ 184 |
| R_cr7 .equ 188 |
| R_cr8 .equ 192 |
| R_cr9 .equ 196 |
| R_cr10 .equ 200 |
| R_cr11 .equ 204 |
| R_cr12 .equ 208 |
| R_cr13 .equ 212 |
| R_cr14 .equ 216 |
| R_cr15 .equ 220 |
| R_cr16 .equ 224 |
| R_cr17H .equ 228 |
| R_cr18H .equ 232 |
| R_cr19 .equ 236 |
| R_cr20 .equ 240 |
| R_cr21 .equ 244 |
| R_cr22 .equ 248 |
| R_cr23 .equ 252 |
| R_cr24 .equ 256 |
| R_cr25 .equ 260 |
| R_cr26 .equ 264 |
| R_cr27 .equ 268 |
| R_cr28 .equ 272 |
| R_cr29 .equ 276 |
| R_cr30 .equ 280 |
| R_cr31 .equ 284 |
| |
| R_cr17T .equ 288 |
| R_cr18T .equ 292 |
| |
| R_cpu0 .equ 296 |
| |
| R_SIZE .equ 300 |
| |
| min_stack .equ 64 |
| |
| .import handle_exception |
| .import $global$, data |
| .IMPORT putnum, code |
| .IMPORT led_putnum, code |
| .IMPORT delay, code |
| |
| .export FICE |
| .export DEBUG_GO |
| .export DEBUG_SS |
| .export STUB_RESTORE |
| |
| .export save_regs |
| .export RegBlk |
| .export Exception_index |
| |
| ;------------------------------------------------------------------------------- |
| .EXPORT breakpoint,ENTRY,ARGW0=GR,RTNVAL=GR |
| breakpoint |
| .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 |
| |
| ;;; debug |
| ldi 6, %r26 |
| bl,n led_putnum,%r2 |
| nop |
| ldil L'900000,%r26 |
| ldo R'900000(%r26),%r26 |
| bl,n delay,%r2 |
| nop |
| ;;; |
| break i5INLINE,i13BREAK |
| ;;; more debug |
| ldi 7, %r26 |
| bl,n led_putnum,%r2 |
| nop |
| ldil L'900000,%r26 |
| ldo R'900000(%r26),%r26 |
| bl,n delay,%r2 |
| nop |
| ;;; |
| |
| FICE fice 0(0,%r26) ; Flush the i cache entry |
| sync |
| |
| ldw -148(0,%r30),%r2 ; retrieve the return pointer |
| ldo -128(%r30),%r30 ; reset the stack pointer |
| bv,n 0(%r2) ; return to caller |
| nop |
| |
| .EXIT |
| .PROCEND |
| |
| ;------------------------------------------------------------------------------- |
| DEBUG_GO |
| or,tr %r0,%r0,%r10 ; if go, do not set R-bit to 1 |
| |
| DEBUG_SS |
| ldi 1,%r10 ; else set R-bit to 1 |
| |
| DEBUG_EXEC |
| |
| bl DGO_0,%r8 ; r8 points to register block |
| addil L%RegBlk-DGO_0,%r8 |
| DGO_0 |
| ldo R%RegBlk-DGO_0(%r1),%r8 |
| |
| ; load space registers |
| |
| ldw R_sr0(%r8),%r1 |
| mtsp %r1,%sr0 |
| ldw R_sr1(%r8),%r1 |
| mtsp %r1,%sr1 |
| ldw R_sr2(%r8),%r1 |
| mtsp %r1,%sr2 |
| ldw R_sr3(%r8),%r1 |
| mtsp %r1,%sr3 |
| ldw R_sr4(%r8),%r1 |
| mtsp %r1,%sr4 |
| ldw R_sr5(%r8),%r1 |
| mtsp %r1,%sr5 |
| ldw R_sr6(%r8),%r1 |
| mtsp %r1,%sr6 |
| ldw R_sr7(%r8),%r1 |
| mtsp %r1,%sr7 |
| |
| ; clear Q-bit for rfi |
| |
| rsm 0x08,%r0 |
| |
| ; load control registers |
| |
| ldw R_cr0(%r8),%r1 |
| or,= %r10,%r0,%r0 ; if single step |
| copy %r0,%r1 ; set %cr0 to 0 |
| mtctl %r1,%cr0 |
| ldw R_cr8(%r8),%r1 |
| mtctl %r1,%cr8 |
| ldw R_cr9(%r8),%r1 |
| mtctl %r1,%cr9 |
| ldw R_cr10(%r8),%r1 |
| mtctl %r1,%cr10 |
| ldw R_cr11(%r8),%r1 |
| mtctl %r1,%cr11 |
| ldw R_cr12(%r8),%r1 |
| mtctl %r1,%cr12 |
| ldw R_cr13(%r8),%r1 |
| mtctl %r1,%cr13 |
| ldw R_cr14(%r8),%r1 |
| mtctl %r1,%cr14 |
| ldw R_cr15(%r8),%r1 |
| mtctl %r1,%cr15 |
| ldw R_cr16(%r8),%r1 |
| mtctl %r1,%cr16 |
| ldw R_cr17H(%r8),%r1 ; load iiasq.head |
| mtctl %r1,%cr17 |
| ldw R_cr18H(%r8),%r1 ; load iiaoq.head |
| mtctl %r1,%cr18 |
| ldw R_cr17T(%r8),%r1 ; load iiasq.tail |
| mtctl %r1,%cr17 |
| ldw R_cr18T(%r8),%r1 ; load iiaoq.tail |
| mtctl %r1,%cr18 |
| ldw R_cr19(%r8),%r1 |
| mtctl %r1,%cr19 |
| ldw R_cr20(%r8),%r1 |
| mtctl %r1,%cr20 |
| ldw R_cr21(%r8),%r1 |
| mtctl %r1,%cr21 |
| ldw R_cr22(%r8),%r1 |
| dep %r10,27,1,%r1 ; set R-bit if applicable |
| mtctl %r1,%cr22 |
| ldw R_cr23(%r8),%r1 |
| mtctl %r1,%cr23 |
| ldw R_cr24(%r8),%r1 |
| mtctl %r1,%cr24 |
| ldw R_cr25(%r8),%r1 |
| mtctl %r1,%cr25 |
| ldw R_cr26(%r8),%r1 |
| mtctl %r1,%cr26 |
| ldw R_cr27(%r8),%r1 |
| mtctl %r1,%cr27 |
| ldw R_cr28(%r8),%r1 |
| mtctl %r1,%cr28 |
| ldw R_cr29(%r8),%r1 |
| mtctl %r1,%cr29 |
| ldw R_cr30(%r8),%r1 |
| mtctl %r1,%cr30 |
| ldw R_cr31(%r8),%r1 |
| mtctl %r1,%cr31 |
| |
| ; load diagnose registers |
| |
| ldw R_cpu0(%r8),%r1 |
| ldil L%CPU0_MASK,%r2 |
| ldo R%CPU0_MASK(%r2),%r2 |
| xor %r1,%r2,%r1 ; xor the read/clear bits |
| nop |
| mtcpu %r1,0 |
| mtcpu %r1,0 |
| |
| ; load general registers |
| |
| ldw R_gr1(%r8),%r1 |
| ldw R_gr2(%r8),%r2 |
| ldw R_gr3(%r8),%r3 |
| ldw R_gr4(%r8),%r4 |
| ldw R_gr5(%r8),%r5 |
| ldw R_gr6(%r8),%r6 |
| ldw R_gr7(%r8),%r7 |
| ldw R_gr9(%r8),%r9 |
| ldw R_gr10(%r8),%r10 |
| ldw R_gr11(%r8),%r11 |
| ldw R_gr12(%r8),%r12 |
| ldw R_gr13(%r8),%r13 |
| ldw R_gr14(%r8),%r14 |
| ldw R_gr15(%r8),%r15 |
| ldw R_gr16(%r8),%r16 |
| ldw R_gr17(%r8),%r17 |
| ldw R_gr18(%r8),%r18 |
| ldw R_gr19(%r8),%r19 |
| ldw R_gr20(%r8),%r20 |
| ldw R_gr21(%r8),%r21 |
| ldw R_gr22(%r8),%r22 |
| ldw R_gr23(%r8),%r23 |
| ldw R_gr24(%r8),%r24 |
| ldw R_gr25(%r8),%r25 |
| ldw R_gr26(%r8),%r26 |
| ldw R_gr27(%r8),%r27 |
| ldw R_gr28(%r8),%r28 |
| ldw R_gr29(%r8),%r29 |
| ldw R_gr30(%r8),%r30 |
| ldw R_gr31(%r8),%r31 |
| ldw R_gr8(%r8),%r8 |
| |
| ; execute user program |
| |
| nop |
| rfi ; switch to user code |
| nop |
| |
| ;------------------------------------------------------------------------------- |
| |
| STUB_RESTORE |
| copy %r1,%r9 ; save exception index |
| bl SR_00,%r8 |
| addil L%Exception_index-SR_00,%r8 |
| SR_00 |
| ldo R%Exception_index-SR_00(%r1),%r8 |
| stw %r9,(%r8) |
| |
| bl save_regs,%r25 |
| nop |
| |
| #ifdef DEBUG_DEBUGGER1 |
| stwm %r1,8(%sp) |
| bl putc,%rp |
| ldi CR,%arg0 |
| bl putc,%rp |
| ldi LF,%arg0 |
| bl printit,%mrp |
| mfctl %pcoq,%arg0 |
| |
| mfctl %pcoq,%r1 |
| mtctl %r1,%pcoq |
| mfctl %pcoq,%arg0 |
| bl printit,%mrp |
| mtctl %arg0,%pcoq |
| |
| bl printit,%mrp |
| ldw -8(%sp),%arg0 |
| |
| ldwm -8(%sp),%r1 |
| #endif |
| |
| #ifdef DEBUG_DEBUGGER2 |
| stwm %r1,8(%sp) |
| bl putc,%rp |
| ldi LF,%arg0 |
| ldwm -8(%sp),%r1 |
| #endif |
| |
| #ifdef DEBUG_DEBUGGER3 |
| bl printit,%mrp |
| copy iptr,%arg0 |
| bl printit,%mrp |
| copy rstack,%arg0 |
| bl printit,%mrp |
| copy gspace,%arg0 |
| bl printit,%mrp |
| copy dstack,%arg0 |
| bl printit,%mrp |
| copy nextptr,%arg0 |
| bl printit,%mrp |
| copy %dp,%arg0 |
| bl printit,%mrp |
| copy %sp,%arg0 |
| bl printit,%mrp |
| mfctl %rctr,%arg0 |
| bl printit,%mrp |
| mfctl %iva,%arg0 |
| bl printit,%mrp |
| mfctl %eiem,%arg0 |
| bl printit,%mrp |
| mfctl %ipsw,%arg0 |
| bl printit,%mrp |
| copy %r0,%arg0 |
| #endif |
| bl SR_1,%sp |
| addil L%Stub_stack-SR_1,%sp |
| SR_1 |
| ldo R%Stub_stack-SR_1(%r1),%sp ; set the stack pointer |
| |
| bl SR_2,%arg0 |
| addil L%RegBlk-SR_2,%arg0 |
| SR_2 |
| ldo R%RegBlk-SR_2(%r1),%arg0 ; set arg0 (save register area) |
| |
| bl SR_3,%arg1 |
| addil L%Exception_index-SR_3,%arg1 ; set arg1 address |
| SR_3 |
| ldo R%Exception_index-SR_3(%r1),%arg1 ; set arg1 address |
| |
| addi min_stack,%sp,%sp ; allocate min stack frame |
| |
| bl handle_exception,%r2 |
| ldw 0(%arg1),%arg1 ; load arg1 |
| addi -min_stack,%sp,%sp ; de allocate min stack frame |
| |
| b DEBUG_EXEC ; |
| copy %r28,%r10 |
| ;------------------------------------------------------------------------------- |
| |
| save_regs ; return address is in %r25 |
| |
| bl SR_0,%r1 ; r1 points to Register block |
| addil L%RegBlk-SR_0,%r1 |
| SR_0 |
| ldo R%RegBlk-SR_0(%r1),%r1 |
| |
| ; save general registers |
| |
| stw %r0,R_gr0(%r1) |
| ; don't store %r1 yet |
| 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 store %r8 yet |
| ; don't store %r9 yet |
| 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 store %r16 yet |
| ; don't store %r17 yet |
| 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 store %r24 yet |
| ; don't store %r25 yet |
| stw %r26,R_gr26(%r1) |
| stw %r27,R_gr27(%r1) |
| stw %r28,R_gr28(%r1) |
| stw %r29,R_gr29(%r1) |
| stw %r30,R_gr30(%r1) |
| stw %r31,R_gr31(%r1) |
| |
| ; restore general registers from shadow registers and save them |
| |
| copy %r1,%r10 ; hold Register block pointer |
| copy %r25,%rp ; hold return pointer |
| shdw_gr |
| shdw_gr |
| stw %r1,R_gr1(%r10) |
| stw %r8,R_gr8(%r10) |
| stw %r9,R_gr9(%r10) |
| stw %r16,R_gr16(%r10) |
| stw %r17,R_gr17(%r10) |
| stw %r24,R_gr24(%r10) |
| stw %r25,R_gr25(%r10) |
| |
| ; save control registers |
| |
| mfctl %cr0,%r1 |
| stw %r1,R_cr0(%r10) |
| stw %r0,R_cr1(%r10) |
| stw %r0,R_cr2(%r10) |
| stw %r0,R_cr3(%r10) |
| stw %r0,R_cr4(%r10) |
| stw %r0,R_cr5(%r10) |
| stw %r0,R_cr6(%r10) |
| stw %r0,R_cr7(%r10) |
| mfctl %cr8,%r1 |
| stw %r1,R_cr8(%r10) |
| mfctl %cr9,%r1 |
| stw %r1,R_cr9(%r10) |
| mfctl %cr10,%r1 |
| stw %r1,R_cr10(%r10) |
| mfctl %cr11,%r1 |
| stw %r1,R_cr11(%r10) |
| mfctl %cr12,%r1 |
| stw %r1,R_cr12(%r10) |
| mfctl %cr13,%r1 |
| stw %r1,R_cr13(%r10) |
| mfctl %cr14,%r1 |
| stw %r1,R_cr14(%r10) |
| mfctl %cr15,%r1 |
| stw %r1,R_cr15(%r10) |
| mfctl %cr16,%r1 |
| stw %r1,R_cr16(%r10) |
| mfctl %cr17,%r1 |
| stw %r1,R_cr17H(%r10) |
| mtctl %r1,%cr17 |
| mfctl %cr17,%r1 |
| stw %r1,R_cr17T(%r10) |
| mtctl %r1,%cr17 |
| mfctl %cr18,%r1 |
| stw %r1,R_cr18H(%r10) |
| mtctl %r1,%cr18 |
| mfctl %cr18,%r1 |
| stw %r1,R_cr18T(%r10) |
| mtctl %r1,%cr18 |
| mfctl %cr19,%r1 |
| stw %r1,R_cr19(%r10) |
| mfctl %cr20,%r1 |
| stw %r1,R_cr20(%r10) |
| mfctl %cr21,%r1 |
| stw %r1,R_cr21(%r10) |
| mfctl %cr22,%r1 |
| stw %r1,R_cr22(%r10) |
| mfctl %cr23,%r1 |
| stw %r1,R_cr23(%r10) |
| mfctl %cr24,%r1 |
| stw %r1,R_cr24(%r10) |
| mfctl %cr25,%r1 |
| stw %r1,R_cr25(%r10) |
| mfctl %cr26,%r1 |
| stw %r1,R_cr26(%r10) |
| mfctl %cr27,%r1 |
| stw %r1,R_cr27(%r10) |
| mfctl %cr28,%r1 |
| stw %r1,R_cr28(%r10) |
| mfctl %cr29,%r1 |
| stw %r1,R_cr29(%r10) |
| mfctl %cr30,%r1 |
| stw %r1,R_cr30(%r10) |
| mfctl %cr31,%r1 |
| stw %r1,R_cr31(%r10) |
| |
| ; save diagnose registers |
| |
| mfcpu_c 0,%r1 |
| mfcpu_c 0,%r1 |
| stw %r1,R_cpu0(%r10) |
| |
| ; save space registers |
| |
| mfsp %sr0,%r1 |
| stw %r1,R_sr0(%r10) |
| mfsp %sr1,%r1 |
| stw %r1,R_sr1(%r10) |
| mfsp %sr2,%r1 |
| stw %r1,R_sr2(%r10) |
| mfsp %sr3,%r1 |
| stw %r1,R_sr3(%r10) |
| mfsp %sr4,%r1 |
| stw %r1,R_sr4(%r10) |
| mfsp %sr5,%r1 |
| stw %r1,R_sr5(%r10) |
| mfsp %sr6,%r1 |
| stw %r1,R_sr6(%r10) |
| mfsp %sr7,%r1 |
| bv (%rp) |
| stw %r1,R_sr7(%r10) |
| |
| #ifdef DEBUG_DEBUGGER |
| ;------------------------------------------------------------------------------- |
| printit |
| mtctl %rp,%tr0 |
| mtctl %r1,%tr1 |
| bl putnum,%rp |
| copy %rp,%arg0 |
| |
| mtctl %mrp,%tr2 |
| bl putc,%rp |
| ldi CR,%arg0 |
| bl putc,%rp |
| ldi LF,%arg0 |
| mfctl %tr2,%mrp |
| mfctl %tr1,%r1 |
| bv (%mrp) |
| mfctl %tr0,%rp |
| #endif |
| .space $PRIVATE$ |
| .subspa $DATA$,align=4,access=0x1f |
| |
| Exception_index |
| .word 0 |
| |
| RegBlk |
| .block R_SIZE ; register block |
| |
| Stub_stack |
| .block 1024 |
| |
| .end |