powermac-rom/NanoKernel/NKIntHandlers.s

234 lines
4.9 KiB
ArmAsm
Raw Normal View History

2018-07-04 11:26:33 +00:00
; AUTO-GENERATED SYMBOL LIST
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