📄 iva_table.s
字号:
/**************************************************************************** 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"#endifR_gr0 .equ 0R_gr1 .equ 4R_gr2 .equ 8R_gr3 .equ 12R_gr4 .equ 16R_gr5 .equ 20R_gr6 .equ 24R_gr7 .equ 28R_gr8 .equ 32R_gr9 .equ 36R_gr10 .equ 40R_gr11 .equ 44R_gr12 .equ 48R_gr13 .equ 52R_gr14 .equ 56R_gr15 .equ 60R_gr16 .equ 64R_gr17 .equ 68R_gr18 .equ 72R_gr19 .equ 76R_gr20 .equ 80R_gr21 .equ 84R_gr22 .equ 88R_gr23 .equ 92R_gr24 .equ 96R_gr25 .equ 100R_gr26 .equ 104R_gr27 .equ 108R_gr28 .equ 112R_gr29 .equ 116R_gr30 .equ 120R_gr31 .equ 124R_rctr .equ 160R_cpu0 .equ 164R_pidr1 .equ 168R_pidr2 .equ 172R_ccr .equ 176R_sar .equ 180R_pidr3 .equ 184R_pidr4 .equ 188R_iva .equ 192R_eiem .equ 196R_itmr .equ 200R_pcsqH .equ 204R_pcoqH .equ 208R_iir .equ 212R_pcsqT .equ 216R_pcoqT .equ 220R_isr .equ 224R_ior .equ 228R_ipsw .equ 232R_eirr .equ 236R_tr0 .equ 240R_tr1 .equ 244R_tr2 .equ 248R_tr3 .equ 252R_tr4 .equ 256R_tr5 .equ 260R_tr6 .equ 264R_tr7 .equ 268R_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 2048iva_table .blockz 32 ; entry 0 is reserved .align 32hpmc nop b,n hpmc_handler nop .word 0 .word 0 .word 0 .word hpmc_handler .word 0 .align 32power_fail; PrintString Str02,0x2 ldi 1,%r26 bl,n putnum,%r2 nop .align 32recovery;; PrintString Str03,0x3 ldi 2,%r26 bl,n putnum,%r2 nop ldi 3,%r1 b,n handle_rcc nop .align 32external; PrintString Str04,0x4 ldi 3,%r26 bl,n putnum,%r2 nop .align 32lpmc; PrintString Str05,0x5 ldi 4,%r26 bl,n putnum,%r2 nop .align 32itlb_miss; PrintString Str06,0x6 ldi 5,%r26 bl,n putnum,%r2 nop .align 32imem_protection; PrintString Str07,0x7 ldi 6,%r26 bl,n putnum,%r2 nop .align 32illegal_inst; PrintString Str08,0x8 ldi 7,%r26 bl,n putnum,%r2 nop .align 32break b,n break_handler nop .align 32privileged_op; PrintString Str0a,0xa ldi 8,%r26 bl,n putnum,%r2 nop .align 32privileged_reg; PrintString Str0b,0xb ldi 9,%r26 bl,n putnum,%r2 nop .align 32overflow; PrintString Str0c,0xc ldi 32,%r26 bl,n putnum,%r2 nop .align 32conditional; PrintString Str0d,0xd ldi 32,%r26 bl,n putnum,%r2 nop .align 32assist_excep; PrintString Str0e,0xe ldi 32,%r26 bl,n putnum,%r2 nop .align 32dtlb_miss; PrintString Str0f,0xf ldi 32,%r26 bl,n putnum,%r2 nop .align 32na_itlb; PrintString Str10,0x10 ldi 32,%r26 bl,n putnum,%r2 nop .align 32na_dtlb; PrintString Str11,0x11 ldi 32,%r26 bl,n putnum,%r2 nop .align 32dmem_protection; PrintString Str12,0x12 ldi 32,%r26 bl,n putnum,%r2 nop .align 32dmem_break; PrintString Str13,0x13 ldi 32,%r26 bl,n putnum,%r2 nop .align 32tlb_dirty; PrintString Str14,0x14 ldi 32,%r26 bl,n putnum,%r2 nop .align 32page_ref; PrintString Str15,0x15 ldi 32,%r26 bl,n putnum,%r2 nop .align 32assist_emul; PrintString Str16,0x16 ldi 32,%r26 bl,n putnum,%r2 nop .align 32high_priv; PrintString Str17,0x17 ldi 32,%r26 bl,n putnum,%r2 nop .align 32low_priv; PrintString Str18,0x18 ldi 32,%r26 bl,n putnum,%r2 nop .align 32branch_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=GRfoobar .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=GRsetup_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 2048break_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_defaultbreak_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 instructionbreak_psw b,n recoverbreak_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->headdo_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,%r1pr_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,%r1halt_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,%r1sa_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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -