RCSID("$NetBSD: trap_subr.S,v 1.15 2022/07/05 20:15:40 andvar Exp $")
#ifdef _KERNEL_OPT
#include "opt_altivec.h"
#include "opt_ddb.h"
#include "opt_mpc85xx.h"
#include "opt_multiprocessor.h"
#endif
.globl _C_LABEL(sctrapexit), _C_LABEL(trapexit), _C_LABEL(intrcall)
#define FRAME_EXC_PROLOGUE(start, sprg, srr) \
mtspr sprg,%r2; \
mfsprg3 %r2; \
addi %r2,%r2,4*(32-start); \
\
mtsprg3 %r2; \
stmw %r##start,-4*(32-start)(%r2); \
\
mfspr %r26,sprg; \
mfcr %r27; \
mfxer %r28; \
mfspr %r30, SPR_##srr##0; \
mfspr %r31, SPR_##srr##1
#define PROLOGUE_GET_DEAR mfspr %r24, SPR_DEAR
#define PROLOGUE_GET_ESR mfspr %r25, SPR_ESR
#define PROLOGUE_GET_SRRS mfsrr0 %r24; \
mfsrr1 %r25
#define PROLOGUE_GET_SPRG1 mfsprg1 %r29
#define PROLOGUE_GET_DBSR mfspr %r25, SPR_DBSR
#define SAVE_ESR stw %r25, FRAME_ESR(%r1)
#define SAVE_DEAR stw %r24, FRAME_DEAR(%r1)
#define SAVE_DEAR_ESR SAVE_ESR; SAVE_DEAR
#define SAVE_SRRS SAVE_DEAR_ESR
#define SAVE_SPRG1 stw %r29, FRAME_SPRG1(%r1)
#define SAVE_DBSR stw %r25, FRAME_DBSR(%r1)
#define SAVE_NOTHING
#define RESTORE_SPRG1(r) lwz r, FRAME_SPRG1(%r1); \
mtsprg1 r
#define RESTORE_SRR0(r) lwz r, FRAME_DEAR(%r1); \
mtsrr0 r
#define RESTORE_SRR1(r) lwz r, FRAME_ESR(%r1); \
mtsrr1 r
#define FRAME_PROLOGUE \
FRAME_EXC_PROLOGUE(26, SPR_SPRG1, SRR)
#define FRAME_PROLOGUE_DEAR_ESR \
FRAME_EXC_PROLOGUE(24, SPR_SPRG1, SRR); \
PROLOGUE_GET_ESR; \
PROLOGUE_GET_DEAR
#define FRAME_PROLOGUE_ESR \
FRAME_EXC_PROLOGUE(25, SPR_SPRG1, SRR); \
PROLOGUE_GET_ESR
#define FRAME_TLBPROLOGUE \
FRAME_EXC_PROLOGUE(20, SPR_SPRG1, SRR); \
PROLOGUE_GET_ESR; \
PROLOGUE_GET_DEAR
#define FRAME_INTR_PROLOGUE \
FRAME_EXC_PROLOGUE(26, SPR_SPRG1, SRR)
#define FRAME_CRIT_PROLOGUE \
FRAME_EXC_PROLOGUE(24, SPR_SPRG4, CSRR); \
PROLOGUE_GET_SPRG1; \
PROLOGUE_GET_SRRS
#define FRAME_MCHK_PROLOGUE \
FRAME_EXC_PROLOGUE(24, SPR_SPRG5, MCSRR); \
PROLOGUE_GET_SPRG1; \
PROLOGUE_GET_SRRS
#define FRAME_DEBUG_PROLOGUE \
FRAME_EXC_PROLOGUE(24, SPR_SPRG4, CSRR); \
PROLOGUE_GET_SPRG1; \
PROLOGUE_GET_SRRS
#if defined(DDB)
#define FRAME_SAVE_SRR0_FOR_DDB \
lwz %r29, FRAMELEN+CFRAME_LR(%r1); \
stw %r29, FRAME_CFRAME_LR(%r1); \
addi %r30, %r30, 4; \
stw %r30, FRAMELEN+CFRAME_LR(%r1)
#define FRAME_RESTORE_RETURN_ADDRESS \
lwz %r3, FRAME_CFRAME_LR(%r1); \
stw %r3, FRAMELEN+CFRAME_LR(%r1)
#else
#define FRAME_SAVE_SRR0_FOR_DDB
#define FRAME_RESTORE_RETURN_ADDRESS
#endif
#ifdef PPC_HAVE_SPE
#define FRAME_SAVE_SPEFSCR \
mfspefscr %r0; \
stw %r0, FRAME_SPEFSCR(%r1)
#define FRAME_RESTORE_SPEFSCR \
lwz %r0, FRAME_SPEFSCR(%r1); \
mtspefscr %r0
#else
#define FRAME_SAVE_SPEFSCR
#define FRAME_RESTORE_SPEFSCR
#endif
#define FRAME_EXC_ENTER(exc, tf, start, save_prologue) \
mtcr %r31; \
mr %r31, %r1; \
bf MSR_PR, 1f; \
mfsprg2 %r2; \
lwz %r2, L_PCB(%r2); \
addi %r1, %r2, USPACE-CALLFRAMELEN; \
\
1: \
stwu %r31, -FRAMELEN(%r1); \
stw %r0, FRAME_R0(%r1); \
stw %r31, FRAME_R1(%r1); \
stw %r26, FRAME_R2(%r1); \
save_prologue; \
\
\
mflr %r26; \
mfctr %r29; \
mfcr %r31; \
stmw %r26, FRAME_LR(%r1); \
FRAME_SAVE_SRR0_FOR_DDB; \
mr %r0, %r31; \
mfsprg3 %r2; \
addi %r2,%r2,-4*(32-start); \
lmw %r##start,0(%r2); \
mtsprg3 %r2; \
stmw %r3, FRAME_R3(%r1); \
\
mr %r31, %r0; \
mfsprg2 %r13; \
FRAME_SAVE_SPEFSCR; \
li %r7, exc; \
stw %r7, FRAME_EXC(%r1); \
addi tf, %r1, FRAME_TF
#define FRAME_EXC_EXIT(rfi, srr) \
FRAME_RESTORE_RETURN_ADDRESS; \
lmw %r26, FRAME_LR(%r1); \
oris %r31,%r31,PSL_CE@h; \
mtspr SPR_##srr##1, %r31; \
mtspr SPR_##srr##0, %r30; \
FRAME_RESTORE_SPEFSCR; \
mtctr %r29; \
mtxer %r28; \
mtcr %r27; \
mtlr %r26; \
lmw %r2, FRAME_R2(%r1); \
lwz %r0, FRAME_R0(%r1); \
lwz %r1, FRAME_R1(%r1); \
rfi
#define FRAME_ENTER(exc, tf) \
FRAME_EXC_ENTER(exc, tf, 26, SAVE_NOTHING)
#define FRAME_ENTER_ESR(exc, tf) \
FRAME_EXC_ENTER(exc, tf, 25, SAVE_ESR)
#define FRAME_ENTER_DEAR_ESR(exc, tf) \
FRAME_EXC_ENTER(exc, tf, 24, SAVE_DEAR_ESR)
#define FRAME_EXIT FRAME_EXC_EXIT(rfi, SRR)
#define FRAME_TLBENTER(exc) \
FRAME_EXC_ENTER(exc, %r4, 20, SAVE_DEAR_ESR)
#define FRAME_TLBEXIT FRAME_EXC_EXIT(rfi, SRR)
#define FRAME_MCHK_ENTER(exc) \
FRAME_EXC_ENTER(exc, %r3, 26, SAVE_SPRG1; SAVE_SRRS)
#define FRAME_MCHK_EXIT \
RESTORE_SRR0(%r28); \
RESTORE_SRR1(%r27); \
RESTORE_SPRG1(%r26); \
FRAME_EXC_EXIT(rfmci, MCSRR)
#define FRAME_DEBUG_ENTER(exc) \
FRAME_EXC_ENTER(exc, %r4, 26, SAVE_SPRG1; SAVE_SRRS)
#define FRAME_DEBUG_EXIT \
RESTORE_SPRG1(%r26); FRAME_EXC_EXIT(rfci, CSRR)
#define FRAME_INTR_SP \
bf MSR_PR, 1f; \
mfsprg2 %r2; \
lwz %r2, L_PCB(%r2); \
addi %r1, %r2, USPACE-CALLFRAMELEN; \
\
1:
#define FRAME_INTR_SP_NEW(sym) \
lis %r2,(sym)@ha; \
addi %r1,%r2,(sym)@l
#define FRAME_INTR_XENTER(exc, start, get_intr_sp, save_prologue) \
mtcr %r31; \
mr %r31, %r1; \
get_intr_sp; \
stwu %r31, -FRAMELEN(%r1); \
stw %r0, FRAME_R0(%r1); \
stw %r31, FRAME_R1(%r1); \
stw %r26, FRAME_R2(%r1); \
save_prologue; \
mflr %r26; \
mfctr %r29; \
mfcr %r31; \
stmw %r26, FRAME_LR(%r1); \
FRAME_SAVE_SRR0_FOR_DDB; \
stw %r3, FRAME_R3(%r1); \
stw %r4, FRAME_R4(%r1); \
stw %r5, FRAME_R5(%r1); \
stw %r6, FRAME_R6(%r1); \
stw %r7, FRAME_R7(%r1); \
stw %r8, FRAME_R8(%r1); \
stw %r9, FRAME_R9(%r1); \
stw %r10, FRAME_R10(%r1); \
stw %r11, FRAME_R11(%r1); \
stw %r12, FRAME_R12(%r1); \
stw %r13, FRAME_R13(%r1); \
mfsprg3 %r2; \
addi %r2,%r2,-4*(32-start); \
lmw %r##start,0(%r2); \
mtsprg3 %r2; \
mfsprg2 %r13; \
li %r7, exc; \
stw %r7, FRAME_EXC(%r1); \
addi %r3, %r1, FRAME_TF
#define FRAME_INTR_XEXIT(rfi, srr) \
FRAME_RESTORE_RETURN_ADDRESS; \
lwz %r8, FRAME_LR(%r1); \
lwz %r9, FRAME_CR(%r1); \
lwz %r10, FRAME_XER(%r1); \
lwz %r11, FRAME_CTR(%r1); \
lwz %r12, FRAME_SRR0(%r1); \
lwz %r13, FRAME_SRR1(%r1); \
mtspr SPR_##srr##1, %r13; \
mtspr SPR_##srr##0, %r12; \
mtctr %r11; \
mtxer %r10; \
mtcr %r9; \
mtlr %r8; \
lwz %r13, FRAME_R13(%r1); \
lwz %r12, FRAME_R12(%r1); \
lwz %r11, FRAME_R11(%r1); \
lwz %r10, FRAME_R10(%r1); \
lwz %r9, FRAME_R9(%r1); \
lwz %r8, FRAME_R8(%r1); \
lwz %r7, FRAME_R7(%r1); \
lwz %r6, FRAME_R6(%r1); \
lwz %r5, FRAME_R5(%r1); \
lwz %r4, FRAME_R4(%r1); \
lwz %r3, FRAME_R3(%r1); \
lwz %r2, FRAME_R2(%r1); \
lwz %r0, FRAME_R0(%r1); \
lwz %r1, FRAME_R1(%r1); \
rfi
#define FRAME_INTR_ENTER(exc) \
FRAME_INTR_XENTER(exc, 26, FRAME_INTR_SP, SAVE_NOTHING)
#define FRAME_INTR_EXIT \
FRAME_INTR_XEXIT(rfi, SRR)
#define FRAME_CRIT_ENTER(exc) \
FRAME_INTR_XENTER(exc, 24, FRAME_INTR_SP, SAVE_SPRG1)
#define FRAME_WDOG_ENTER(exc, sym) \
FRAME_INTR_XENTER(exc, 24, FRAME_INTR_SP_NEW(sym), SAVE_SPRG1)
#define FRAME_CRIT_EXIT \
RESTORE_SRR0(%r4); \
RESTORE_SRR1(%r5); \
RESTORE_SPRG1(%r6); \
FRAME_INTR_XEXIT(rfci, CSRR)
#if defined(MULTIPROCESSOR)
#define FRAME_TLBMISSLOCK \
GET_CPUINFO(%r23); \
ldint %r22, CI_MTX_COUNT(%r23); \
subi %r22, %r22, 1; \
stint %r22, CI_MTX_COUNT(%r23); \
isync; \
cmpwi %r22, 0; \
bne 1f; \
ldint %r22, CI_CPL(%r23); \
stint %r22, CI_MTX_OLDSPL(%r23); \
1: lis %r23, _C_LABEL(pmap_tlb_miss_lock)@h; \
ori %r23, %r23, _C_LABEL(pmap_tlb_miss_lock)@l; \
li %r20, MTX_LOCK; \
2: lwarx %r22, %r20, %r23; \
cmpwi %r22, __SIMPLELOCK_UNLOCKED; \
beq+ 4f; \
3: lwzx %r22, %r20, %r23; \
cmpwi %r22, __SIMPLELOCK_UNLOCKED; \
beq+ 2b; \
b 3b; \
4: li %r21, __SIMPLELOCK_LOCKED; \
stwcx. %r21, %r20, %r23; \
bne- 2b; \
isync; \
msync;
#define FRAME_TLBMISSUNLOCK \
sync; \
lis %r23, _C_LABEL(pmap_tlb_miss_lock)@h; \
ori %r23, %r23, _C_LABEL(pmap_tlb_miss_lock)@l; \
li %r22, __SIMPLELOCK_UNLOCKED; \
stw %r22, MTX_LOCK(%r23); \
isync; \
msync; \
GET_CPUINFO(%r23); \
ldint %r22, CI_MTX_COUNT(%r23); \
addi %r22, %r22, 1; \
stint %r22, CI_MTX_COUNT(%r23); \
isync;
#else
#define FRAME_TLBMISSLOCK
#define FRAME_TLBMISSUNLOCK
#endif
.text
.p2align 4
_C_LABEL(critical_input_vector):
FRAME_CRIT_PROLOGUE
FRAME_CRIT_ENTER(EXC_CII)
bl _C_LABEL(intr_critintr)
FRAME_CRIT_EXIT
.p2align 4
_C_LABEL(machine_check_vector):
FRAME_MCHK_PROLOGUE
FRAME_MCHK_ENTER(EXC_MCHK)
mfspr %r7, SPR_MCAR
mfspr %r6, SPR_MCSR
stw %r6, FRAME_MCSR(%r1)
stw %r7, FRAME_MCAR(%r1)
li %r3, T_MACHINE_CHECK
bl _C_LABEL(trap)
FRAME_MCHK_EXIT
.p2align 4
_C_LABEL(data_storage_vector):
FRAME_PROLOGUE_DEAR_ESR
FRAME_ENTER_DEAR_ESR(EXC_DSI, %r4)
li %r3, T_DSI
trapenter:
trapagain:
wrtee %r31
bl _C_LABEL(trap)
_C_LABEL(trapexit):
wrteei 0
andi. %r4, %r31, PSL_PR
beq trapdone
lwz %r4, L_MD_ASTPENDING(%r13)
cmplwi %r4, 0
beq+ trapdone
li %r6, EXC_AST
stw %r6, FRAME_EXC(%r1)
addi %r4, %r1, FRAME_TF
li %r3, T_AST
b trapagain
trapdone:
FRAME_EXIT
.p2align 4
_C_LABEL(instruction_storage_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_ISI, %r4)
li %r3, T_ISI
b trapenter
.p2align 4
_ENTRY(external_input_vector)
FRAME_INTR_PROLOGUE
FRAME_INTR_ENTER(EXC_EXI)
bl _C_LABEL(intr_extintr)
_C_LABEL(intrcall):
GET_CPUINFO(%r6)
lwz %r5, FRAME_SRR1(%r1)
andi. %r4, %r5, PSL_PR
beq intrexit
lwz %r4, L_MD_ASTPENDING(%r13)
cmplwi %r4, 0
beq+ intrexit
stmw %r14, FRAME_R14(%r1)
FRAME_SAVE_SPEFSCR
mr %r31, %r5
li %r4, EXC_AST
stw %r4, FRAME_EXC(%r1)
addi %r4, %r1, FRAME_TF
li %r3, T_AST
b trapagain
intrexit:
FRAME_INTR_EXIT
.p2align 4
_C_LABEL(alignment_vector):
FRAME_PROLOGUE_DEAR_ESR
FRAME_ENTER_DEAR_ESR(EXC_ALI, %r4)
li %r3, T_ALIGNMENT
b trapenter
.p2align 4
_C_LABEL(program_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_PGM, %r4)
li %r3, T_PROGRAM
b trapenter
#ifdef SPR_IVOR7
.p2align 4
_C_LABEL(fp_unavailable_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_FPU, %r4)
li %r3, T_FP_UNAVAILABLE
b trapenter
#endif
.p2align 4
_C_LABEL(system_call_vector):
FRAME_PROLOGUE
FRAME_ENTER(EXC_SC, %r3)
wrteei 1
lwz %r7, L_PROC(%r13)
lwz %r8, P_MD_SYSCALL(%r7)
mtlr %r8
blrl
_C_LABEL(sctrapexit):
wrteei 0
lwz %r4, L_MD_ASTPENDING(%r13)
cmplwi %r4, 0
beq+ trapdone
li %r0, EXC_AST
stw %r0, FRAME_EXC(%r1)
addi %r4, %r1, FRAME_TF
li %r3, T_AST
b trapenter
#ifdef SPR_IVOR9
.p2align 4
_C_LABEL(ap_unavailable_vector):
FRAME_PROLOGUE
FRAME_ENTER(EXC_PGM, %r4)
li %r3, T_AP_UNAVAILABLE
b trapenter
#endif
.p2align 4
_C_LABEL(decrementer_vector):
FRAME_INTR_PROLOGUE
FRAME_INTR_ENTER(EXC_DECR)
bl _C_LABEL(intr_decrintr)
b intrexit
.p2align 4
_C_LABEL(fixed_interval_timer_vector):
FRAME_PROLOGUE
FRAME_INTR_ENTER(EXC_FIT)
bl _C_LABEL(intr_fitintr)
b intrexit
#ifdef E500_WDOG_STACK
.data
.lcomm wdogstk,4096
#endif
.text
.p2align 4
_C_LABEL(watchdog_timer_vector):
FRAME_CRIT_PROLOGUE
#ifdef E500_WDOG_STACK
FRAME_WDOG_ENTER(EXC_WDOG, wdogstk+4096-CALLFRAMELEN)
#else
FRAME_CRIT_ENTER(EXC_WDOG);
#endif
bl _C_LABEL(intr_wdogintr)
FRAME_CRIT_EXIT
.p2align 4
_C_LABEL(data_tlb_error_vector):
FRAME_TLBPROLOGUE
FRAME_TLBMISSLOCK
mflr %r29
mr %r23, %r24
rlwinm %r22, %r31, \
MSR_DS+PTR_SCALESHIFT+1, \
31-PTR_SCALESHIFT, \
31-PTR_SCALESHIFT
bl pte_load
FRAME_TLBMISSUNLOCK
mtlr %r29
FRAME_TLBENTER(EXC_DSI)
li %r3, T_DATA_TLB_ERROR
b trapenter
.p2align 4
_C_LABEL(instruction_tlb_error_vector):
FRAME_TLBPROLOGUE
FRAME_TLBMISSLOCK
mflr %r29
mr %r23, %r30
rlwinm %r22, %r31, \
MSR_IS+PTR_SCALESHIFT+1, \
31-PTR_SCALESHIFT, \
31-PTR_SCALESHIFT
bl pte_load
FRAME_TLBMISSUNLOCK
mtlr %r29
FRAME_TLBENTER(EXC_ISI)
li %r3, T_INSTRUCTION_TLB_ERROR
b trapenter
.p2align 4
_C_LABEL(debug_vector):
FRAME_CRIT_PROLOGUE
FRAME_CRIT_ENTER(EXC_DEBUG)
mfspr %r6, SPR_DBSR
stw %r6, FRAME_ESR(%r1)
li %r3, T_DEBUG
bl _C_LABEL(trap)
FRAME_CRIT_EXIT
.p2align 4
_C_LABEL(spv_unavailable_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_VEC, %r4)
li %r3, T_SPE_UNAVAILABLE
b trapenter
.p2align 4
_C_LABEL(fpdata_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_FPA, %r4)
li %r3, T_EMBEDDED_FP_DATA
b trapenter
.p2align 4
_C_LABEL(fpround_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_FPA, %r4)
li %r3, T_EMBEDDED_FP_ROUND
b trapenter
.p2align 4
_C_LABEL(perfmon_vector):
FRAME_PROLOGUE_ESR
FRAME_ENTER_ESR(EXC_PERF, %r4)
li %r3, T_EMBEDDED_PERF_MONITOR
b trapenter
.p2align 4
pte_load:
cmplwi %cr2, %r22, 0
GET_CPUINFO(%r2)
addi %r22, %r22, CI_PMAP_SEGTAB
lwzx %r20, %r22, %r2
cmplwi %r20, 0
beqlr %cr0
rlwinm %r22, %r23, NSEGPG_SCALESHIFT + PTR_SCALESHIFT, \
31-(NSEGPG_SCALESHIFT + PTR_SCALESHIFT - 1), \
31-PTR_SCALESHIFT
lwzx %r20, %r22, %r20
cmplwi %r20, 0
beqlr %cr0
rlwinm %r22, %r23, \
NSEGPG_SCALESHIFT + NPTEPG_SCALESHIFT + PTE_SCALESHIFT, \
31-(NPTEPG_SCALESHIFT + PTE_SCALESHIFT - 1), \
31-PTE_SCALESHIFT
lwzx %r20, %r22, %r20
cmplwi %r20, 0
beqlr %cr0
#if (PTE_UNSYNCED << 1) != PTE_xX
#error PTE_UNSYNCED definition error
#endif
#if (PTE_UNMODIFIED << 1) != PTE_xW
#error PTE_UNMODIFIED definition error
#endif
andi. %r22, %r20, (PTE_UNSYNCED|PTE_UNMODIFIED)
rotlwi %r22, %r22, 1
andc %r20, %r20, %r22
e500_pte_load:
bne+ %cr2, 1f
mfspr %r22, SPR_MAS1
lis %r21, MAS1_TID@h
andc %r22, %r22, %r21
mtspr SPR_MAS1, %r22
1:
andi. %r21, %r20, PTE_WIMGE_MASK
cmplwi %r21, PTE_M
beq+ %cr0, 2f
mfspr %r22, SPR_MAS2
clrrwi %r22, %r22, PTE_RWX_SHIFT
or %r22, %r22, %r21
mtspr SPR_MAS2, %r22
2:
mfspr %r21, SPR_MAS1
extrwi %r21, %r21, 1, 31-MAS1_TS_SHIFT
clrrwi %r23, %r20, PAGE_SHIFT
andi. %r20, %r20, PTE_RWX_MASK
rotrwi %r20, %r20, PTE_RWX_SHIFT
andi. %r22, %r20, (MAS3_SW|MAS3_SR)
rotlw %r20, %r20, %r21
or %r20, %r20, %r22
or %r23, %r23, %r20
mtspr SPR_MAS3, %r23
isync
tlbwe
lmw %r30, CI_EV_TLBMISS_SOFT(%r2)
addic %r31, %r31, 1
addze %r30, %r30
stmw %r30, CI_EV_TLBMISS_SOFT(%r2)
FRAME_TLBMISSUNLOCK
mtlr %r29
mtxer %r28
mtcr %r27
mtsprg1 %r26
mfsprg3 %r2
addi %r2,%r2,-4*(32-20)
lmw %r20,0(%r2)
mtsprg3 %r2
mfsprg1 %r2
rfi
.p2align 4
.globl _C_LABEL(exception_init)
_C_LABEL(exception_init):
lis %r6,_C_LABEL(critical_input_vector)@h
mtspr SPR_IVPR, %r6
ori %r5,%r6,_C_LABEL(critical_input_vector)@l
mtspr SPR_IVOR0, %r5
ori %r5,%r6,_C_LABEL(machine_check_vector)@l
mtspr SPR_IVOR1, %r5
ori %r5,%r6,_C_LABEL(data_storage_vector)@l
mtspr SPR_IVOR2, %r5
ori %r5,%r6,_C_LABEL(instruction_storage_vector)@l
mtspr SPR_IVOR3, %r5
ori %r5,%r6,_C_LABEL(external_input_vector)@l
mtspr SPR_IVOR4, %r5
ori %r5,%r6,_C_LABEL(alignment_vector)@l
mtspr SPR_IVOR5, %r5
ori %r5,%r6,_C_LABEL(program_vector)@l
mtspr SPR_IVOR6, %r5
#ifdef SPR_IVOR7
ori %r5,%r6,_C_LABEL(fp_unavailable_vector)@l
mtspr SPR_IVOR7, %r5
#endif
ori %r5,%r6,_C_LABEL(system_call_vector)@l
mtspr SPR_IVOR8, %r5
#ifdef SPR_IVOR9
ori %r5,%r6,_C_LABEL(ap_unavailable_vector)@l
mtspr SPR_IVOR9, %r5
#endif
ori %r5,%r6,_C_LABEL(decrementer_vector)@l
mtspr SPR_IVOR10, %r5
ori %r5,%r6,_C_LABEL(fixed_interval_timer_vector)@l
mtspr SPR_IVOR11, %r5
ori %r5,%r6,_C_LABEL(watchdog_timer_vector)@l
mtspr SPR_IVOR12, %r5
ori %r5,%r6,_C_LABEL(data_tlb_error_vector)@l
mtspr SPR_IVOR13, %r5
ori %r5,%r6,_C_LABEL(instruction_tlb_error_vector)@l
mtspr SPR_IVOR14, %r5
ori %r5,%r6,_C_LABEL(debug_vector)@l
mtspr SPR_IVOR15, %r5
ori %r5,%r6,_C_LABEL(spv_unavailable_vector)@l
mtspr SPR_IVOR32, %r5
ori %r5,%r6,_C_LABEL(fpdata_vector)@l
mtspr SPR_IVOR33, %r5
ori %r5,%r6,_C_LABEL(fpround_vector)@l
mtspr SPR_IVOR34, %r5
ori %r5,%r6,_C_LABEL(perfmon_vector)@l
mtspr SPR_IVOR35, %r5
mfspr %r5, SPR_PIR
cmplwi %r5,0
bnelr
lis %r5,_C_LABEL(powerpc_intrsw)@ha
stw %r3,_C_LABEL(powerpc_intrsw)@l(%r5)
blr
#ifdef notyet
.data
.lcomm ddbstk,4096
.text
_ENTRY(cpu_Debugger)
mflr %r0
stw %r0, CFRAME_LR(%r1)
mfmsr %r3
wrteei 0
mr %r4,%r1
lis %r10,ddbstk@ha
addi %r10,%r10,ddbstk@l
sub %r5,%r1,%r10
cmplwi %r5,4096
blt %cr0, 1f
addi %r1,%r10,4096-CALLFRAMELEN
1:
stwu %r4,-FRAMELEN(%r1)
stw %r4,FRAME_R1(%r1)
stmw %r13,FRAME_R13(%r1)
mr %r26,%r0
mfcr %r27
mfxer %r28
mfctr %r29
mr %r30,%r0
mr %r31,%r3
stmw %r26,FRAME_LR(%r1)
mr %r31,%r1
mr %r1,%r10
addi %r4,%r1,FRAME_TF
li %r3,EXC_PGM
stw %r3,FRAME_EXC(%r1)
li %r3,T_PROGRAM
bl _C_LABEL(trap)
lmw %r26,FRAME_LR(%r1)
mtlr %r26
mtcr %r27
mtxer %r28
mtctr %r29
mr %r0,%r31
lmw %r13,FRAME_R13(%r1)
lwz %r1,FRAME_R1(%r1)
wrtee %r0
blr
#endif