powermac-rom/NanoKernel/NKIntHandlers.s

436 lines
9.1 KiB
ArmAsm
Raw Normal View History

2018-07-04 11:26:33 +00:00
; AUTO-GENERATED SYMBOL LIST
2018-07-15 09:20:35 +00:00
########################################################################
_align 6
IntExternal0
mfsprg r1, 0 ; Init regs and increment ctr
stw r0, EWA.r2(r1)
stw r2, EWA.r2(r1)
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
stw r3, EWA.r3(r1)
addi r2, r2, 1
stw r2, KDP.NKInfo.ExternalIntCount(r1)
mfmsr r2 ; Save a self-ptr to FF880000... why?
lis r3, 0xFF88
_bset r0, r2, bitMsrDR
stw r4, EWA.r4(r1)
stw r5, EWA.r5(r1)
mfsrr0 r4
mfsrr1 r5
mtmsr r0
stw r3, 0(r3)
mtmsr r2
mtsrr0 r4
2018-07-15 09:34:52 +00:00
mtsrr1 r5
2018-07-15 09:20:35 +00:00
lwz r4, EWA.r4(r1)
lwz r5, EWA.r5(r1)
lwz r2, KDP.DebugIntPtr(r1) ; Query the shared mem (debug?) for int num
mfcr r0
lha r2, 0(r2)
lwz r3, KDP.PA_EmulatorIplValue(r1)
rlwinm. r2, r2, 0, 0x80000007
ori r2, r2, 0x8000
sth r2, 0(r3)
mfsprg r2, 2
lwz r3, EWA.r3(r1)
mtlr r2
beq @return ; 0 -> no interrupt
bgt @clear ; negative -> clear interrupt
; positive -> post interrupt
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
or r0, r0, r2
@return
mtcr r0 ; Set CR and return
lwz r0, EWA.r0(r1)
lwz r2, EWA.r2(r1)
mfsprg r1, 1
rfi
@clear
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
and r0, r0, r2
b @return
########################################################################
_align 6
IntLookupTable
dc.l 0, 1, 2, 2, 4, 4, 4, 4
dc.l 3, 3, 3, 3, 4, 4, 4, 4
dc.l 4, 4, 4, 4, 4, 4, 4, 4
dc.l 4, 4, 4, 4, 4, 4, 4, 4
dc.l 7, 7, 7, 7, 7, 7, 7, 7
dc.l 7, 7, 7, 7, 7, 7, 7, 7
dc.l 7, 7, 7, 7, 7, 7, 7, 7
dc.l 7, 7, 7, 7, 7, 7, 7, 7
_align 6
IntExternal1
mfsprg r1, 0 ; Init regs and increment ctr
stw r0, EWA.r2(r1)
stw r2, EWA.r2(r1)
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
stw r3, EWA.r3(r1)
addi r2, r2, 1
stw r2, KDP.NKInfo.ExternalIntCount(r1)
lis r2, 0x50F3 ; Query OpenPIC at 50F2A000
mfmsr r2
_bset r0, r2, bitMsrDR
stw r4, EWA.r4(r1)
stw r5, EWA.r5(r1)
mfsrr0 r4
mfsrr1 r5
mtmsr r0
li r0, 0xC0
stb r0, -0x6000(r2)
eieio
lbz r0, -0x6000(r2)
mtmsr r2
mtsrr0 r4
2018-07-15 09:34:52 +00:00
mtsrr1 r5
2018-07-15 09:20:35 +00:00
lwz r4, EWA.r4(r1)
lwz r5, EWA.r5(r1)
2018-07-15 09:34:52 +00:00
lwz r3, KDP.PA_NanoKernelCode(r1) ; Loop that number up in the table
2018-07-15 09:20:35 +00:00
rlwimi r3, r0, 0, 0x0000003F
lbz r2, IntLookupTable-NKTop(r3)
mfcr r0
lwz r3, KDP.PA_EmulatorIplValue(r1)
clrlwi. r2, r2, 29
sth r2, 0(r3)
mfsprg r2, 2
lwz r3, EWA.r3(r1)
mtlr r2
beq @clear ; 0 -> clear interrupt
; nonzero -> post interrupt
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
or r0, r0, r2
@return
mtcr r0 ; Set CR and return
lwz r0, EWA.r0(r1)
lwz r2, EWA.r2(r1)
mfsprg r1, 1
rfi
@clear
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
and r0, r0, r2
b @return
########################################################################
_align 6
IntExternal2
mfsprg r1, 0 ; Init regs and increment ctr
stw r0, EWA.r2(r1)
stw r2, EWA.r2(r1)
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
stw r3, EWA.r3(r1)
addi r2, r2, 1
stw r2, KDP.NKInfo.ExternalIntCount(r1)
lis r2, 0xF300 ; Query OpenPIC at F3000028/C
mfmsr r2
_bset r3, r2, bitMsrDR
stw r4, EWA.r4(r1)
stw r5, EWA.r5(r1)
mfsrr0 r4
mfsrr1 r5
mtmsr r3
lis r3, 0x8000
stw r3, 0x28(r2)
eieio
lwz r3, 0x2C(r2)
mtmsr r0
mtsrr0 r4
2018-07-15 09:34:52 +00:00
mtsrr1 r5
2018-07-15 09:20:35 +00:00
lwz r4, EWA.r4(r1)
lwz r5, EWA.r5(r1)
mfcr r0
; Interpret OpenPic result:
rlwinm. r2, r3, 0, 11, 11 ; bit 11 -> 7
li r2, 7
bne @gotnum
rlwinm r2, r3, 0, 15, 16 ; bit 15-16/21/31 -> 4
rlwimi. r2, r3, 0, 21, 31
li r2, 4
bne @gotnum
rlwinm. r2, r3, 0, 18, 18 ; bit 18 -> 3
li r2, 3
bne @gotnum
andis. r2, r3, 0x7FEA ; bit 1-10/12/14/19-20 -> 2
rlwimi. r2, r3, 0, 19, 20
li r2, 2
bne @gotnum
extrwi. r2, r3, 1, 13 ; bit 13 -> 1
; else -> 0
@gotnum
lwz r3, KDP.PA_EmulatorIplValue(r1)
sth r2, 0(r3)
mfsprg r2, 2
lwz r3, EWA.r3(r1)
mtlr r2
beq @clear ; 0 -> clear interrupt
; nonzero -> post interrupt
lwz r2, KDP.PostIntMaskInit(r1) ; Post an interrupt via Cond Reg
or r0, r0, r2
@return
mtcr r0 ; Set CR and return
lwz r0, EWA.r0(r1)
lwz r2, EWA.r2(r1)
mfsprg r1, 1
rfi
@clear
lwz r2, KDP.ClearIntMaskInit(r1) ; Clear an interrupt via Cond Reg
and r0, r0, r2
b @return
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
; Increment the Sys/Alt CPU clocks, and the Dec-int counter
_align 6
2018-07-09 08:06:47 +00:00
IntDecrementerSystem
mfsprg r1, 0
2018-07-10 05:16:19 +00:00
stmw r2, EWA.r2(r1)
2018-07-09 08:06:47 +00:00
mfdec r31
2018-07-10 05:16:19 +00:00
lwz r30, KDP.OtherContextDEC(r1)
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
DecCommon ; DEC for Alternate=r30, System=r31
mfxer r29 ; we will do carries
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
lwz r28, KDP.ProcInfo.DecClockRateHz(r1)
stw r28, KDP.OtherContextDEC(r1)
mtdec r28 ; reset Sys and Alt decrementers
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
subf r31, r31, r28 ; System ticks actually elapsed
subf r30, r30, r28 ; Alternate ticks actually elapsed
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
lwz r28, KDP.NKInfo.SysContextCpuTime+4(r1)
lwz r27, KDP.NKInfo.SysContextCpuTime(r1)
addc r28, r28, r31
addze r27, r27
stw r28, KDP.NKInfo.SysContextCpuTime+4(r1)
stw r27, KDP.NKInfo.SysContextCpuTime(r1)
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
lwz r28, KDP.NKInfo.AltContextCpuTime+4(r1)
lwz r27, KDP.NKInfo.AltContextCpuTime(r1)
addc r28, r28, r30
addze r27, r27
stw r28, KDP.NKInfo.AltContextCpuTime+4(r1)
stw r27, KDP.NKInfo.AltContextCpuTime(r1)
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
mtxer r29
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
stw r0, EWA.r0(r1)
mfsprg r31, 1
stw r31, EWA.r1(r1)
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
lwz r31, KDP.NKInfo.DecrementerIntCount(r1)
addi r31, r31, 1
stw r31, KDP.NKInfo.DecrementerIntCount(r1)
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
lmw r27, EWA.r27(r1)
mfsprg r1, 2
mtlr r1
mfsprg r1, 1
rfi
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
IntDecrementerAlternate
mfsprg r1, 0
stmw r2, EWA.r2(r1)
lwz r31, KDP.OtherContextDEC(r1)
mfdec r30
b DecCommon
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
_align 6
2018-07-04 11:26:33 +00:00
IntDSI
mfsprg r1, 0
stmw r2, EWA.r2(r1)
mfsprg r11, 1
stw r0, EWA.r0(r1)
2018-07-09 08:06:47 +00:00
stw r11, EWA.r1(r1)
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
mfsrr0 r10
mfsrr1 r11
2018-07-04 11:26:33 +00:00
mfsprg r12, 2
mfcr r13
mfmsr r14
2018-07-09 08:06:47 +00:00
_bset r15, r14, bitMsrDR
2018-07-04 11:26:33 +00:00
mtmsr r15
2018-07-09 08:06:47 +00:00
lwz r27, 0(r10)
mtmsr r14
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
EmulateDataAccess
rlwinm. r18, r27, 18, 25, 29 ; r16 = 4 * rA (r0 wired to 0)
lwz r25, KDP.PA_FDP(r1)
li r21, 0
beq @r0
2018-07-04 11:26:33 +00:00
lwzx r18, r1, r18
2018-07-09 08:06:47 +00:00
@r0
andis. r26, r27, 0xec00
2018-07-10 05:16:19 +00:00
lwz r16, KDP.Flags(r1)
mfsprg r24, 3
2018-07-09 08:06:47 +00:00
rlwinm r17, r27, 0, 6, 15
2018-07-04 11:26:33 +00:00
rlwimi r16, r16, 27, 26, 26
2018-07-09 08:06:47 +00:00
bge @low_opcode
rlwimi r25, r27, 7, 26, 29 ; opcode >= 32
2018-07-04 11:26:33 +00:00
rlwimi r25, r27, 12, 25, 25
2018-07-09 08:06:47 +00:00
lwz r26, 0xb80(r25)
2018-07-04 11:26:33 +00:00
extsh r23, r27
rlwimi r25, r26, 26, 22, 29
mtlr r25
mtcr r26
add r18, r18, r23
2018-07-09 08:06:47 +00:00
rlwimi r17, r26, 6, 26, 5
2018-07-04 11:26:33 +00:00
blr
2018-07-09 08:06:47 +00:00
@low_opcode ; opcode <= 31
2018-07-04 11:26:33 +00:00
rlwimi r25, r27, 27, 26, 29
2018-07-09 08:06:47 +00:00
rlwimi r25, r27, 0, 25, 25
rlwimi r25, r27, 6, 23, 24
lwz r26, 0x800(r25)
2018-07-04 11:26:33 +00:00
rlwinm r23, r27, 23, 25, 29
rlwimi r25, r26, 26, 22, 29
mtlr r25
mtcr r26
lwzx r23, r1, r23
2018-07-09 08:06:47 +00:00
rlwimi r17, r26, 6, 26, 5
2018-07-04 11:26:33 +00:00
add r18, r18, r23
bclr BO_IF_NOT, 13
neg r23, r23
add r18, r18, r23
blr
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-10 05:16:19 +00:00
_align 6
2018-07-09 08:06:47 +00:00
IntAlignment
2018-07-04 11:26:33 +00:00
mfsprg r1, 0
2018-07-09 08:06:47 +00:00
stmw r2, EWA.r2(r1)
2018-07-04 11:26:33 +00:00
2018-07-09 08:13:00 +00:00
lwz r11, KDP.NKInfo.MisalignmentCount(r1)
2018-07-04 11:26:33 +00:00
addi r11, r11, 1
2018-07-09 08:13:00 +00:00
stw r11, KDP.NKInfo.MisalignmentCount(r1)
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
mfsprg r11, 1
stw r0, EWA.r0(r1)
stw r11, EWA.r1(r1)
mfsrr0 r10
mfsrr1 r11
2018-07-04 11:26:33 +00:00
mfsprg r12, 2
mfcr r13
mfsprg r24, 3
2018-07-09 08:06:47 +00:00
mfdsisr r27
mfdar r18
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
extrwi. r21, r27, 2, 15 ; evaluate hi two bits of XO (or 0 for d-form?)
lwz r25, KDP.PA_FDP(r1)
rlwinm r17, r27, 16, 0x03FF0000
lwz r16, KDP.Flags(r1)
2018-07-04 11:26:33 +00:00
rlwimi r25, r27, 24, 23, 29 ; add constant fields from dsisr (*4) to FDP
2018-07-09 08:06:47 +00:00
rlwimi r16, r16, 27, 26, 26 ; copy FlagSE to Flag26
bne @X_form
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
; D- or DS-form (immediate-indexed) instruction
lwz r26, FDP_TableBase + 4*(0x40 + 0x20)(r25) ; use upper quarter of table
2018-07-04 11:26:33 +00:00
mfmsr r14
rlwimi r25, r26, 26, 22, 29 ; third byte of lookup value is a /4 code offset in FDP
mtlr r25 ; so get ready to go there
2018-07-09 08:06:47 +00:00
_bset r15, r14, bitMsrDR
2018-07-04 11:26:33 +00:00
mtcr r26
2018-07-09 08:06:47 +00:00
rlwimi r17, r26, 6, 26, 5 ; wrap some shite around the register values
2018-07-04 11:26:33 +00:00
blr
2018-07-09 08:06:47 +00:00
@X_form
2018-07-04 11:26:33 +00:00
; X-form (register-indexed) instruction
2018-07-09 08:06:47 +00:00
lwz r26, FDP_TableBase(r25)
2018-07-04 11:26:33 +00:00
mfmsr r14
rlwimi r25, r26, 26, 22, 29
mtlr r25
2018-07-09 08:06:47 +00:00
_bset r15, r14, bitMsrDR
2018-07-04 11:26:33 +00:00
mtcr r26
2018-07-09 08:06:47 +00:00
rlwimi r17, r26, 6, 26, 5
bclr BO_IF_NOT, 12
2018-07-04 11:26:33 +00:00
mtmsr r15
2018-07-09 08:06:47 +00:00
lwz r27, 0(r10)
2018-07-04 11:26:33 +00:00
mtmsr r14
blr
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-10 05:16:19 +00:00
; FDP GOES HERE (0xC00)! (just include it as a file?)
; there are some big mistakes in the labels below!
_align 10
FDP
dcb.l (0x1874-0xC00)/4, 0x46445020 ; 'FDP '
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
IntISI
2018-07-04 11:26:33 +00:00
bl LoadInterruptRegisters
2018-07-09 08:06:47 +00:00
andis. r8, r11, 0x4020 ; what the hell are these MSR bits?
2018-07-04 11:26:33 +00:00
beq major_0x039dc_0x14
2018-07-09 08:06:47 +00:00
stmw r14, EWA.r14(r8)
2018-07-04 11:26:33 +00:00
mr r27, r10
2018-07-09 06:53:50 +00:00
bl PopulateHTAB
2018-07-09 08:06:47 +00:00
bne @not_in_htab
2018-07-04 11:26:33 +00:00
mfsprg r24, 3
mfmsr r14
2018-07-09 08:06:47 +00:00
_bset r15, r14, bitMsrDR
2018-07-04 11:26:33 +00:00
addi r23, r1, KDP.VecBaseMemRetry
mtsprg 3, r23
mr r19, r10
mtmsr r15
2018-07-09 08:06:47 +00:00
lbz r23, 0(r19)
2018-07-04 11:26:33 +00:00
sync
mtmsr r14
mtsprg 3, r24
2018-07-09 08:06:47 +00:00
lmw r14, EWA.r14(r8)
2018-07-04 11:26:33 +00:00
b IntReturn
2018-07-09 08:06:47 +00:00
@not_in_htab
lmw r14, EWA.r14(r8)
2018-07-04 11:26:33 +00:00
li r8, ecInstPageFault
blt Exception
li r8, ecInstInvalidAddress
b Exception
2018-07-09 08:06:47 +00:00
major_0x039dc_0x14
andis. r8, r11, 0x800
2018-07-04 11:26:33 +00:00
li r8, ecInstSupAccessViolation
bne Exception
li r8, ecInstHardwareFault
b Exception
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-09 08:06:47 +00:00
IntMachineCheck
2018-07-04 11:26:33 +00:00
bl LoadInterruptRegisters
li r8, ecMachineCheck
b Exception