powermac-rom/NanoKernel/NKIntHandlers.s

433 lines
9.9 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
2018-07-15 11:59:56 +00:00
stw r0, KDP.r0(r1)
2018-07-15 10:30:41 +00:00
stw r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
2018-07-15 10:30:41 +00:00
stw r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 10:30:41 +00:00
stw r4, KDP.r4(r1)
stw r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
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 10:30:41 +00:00
lwz r4, KDP.r4(r1)
lwz r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
lwz r2, KDP.DebugIntPtr(r1) ; Query the shared mem (debug?) for int num
mfcr r0
lha r2, 0(r2)
2018-07-15 11:13:45 +00:00
lwz r3, KDP.EmuIntLevelPtr(r1)
2018-07-15 09:20:35 +00:00
rlwinm. r2, r2, 0, 0x80000007
ori r2, r2, 0x8000
sth r2, 0(r3)
mfsprg r2, 2
2018-07-15 10:30:41 +00:00
lwz r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
mtlr r2
2018-07-15 11:59:56 +00:00
beq @clear ; 0 -> clear interrupt
bgt @return ; negative -> no interrupt flag
2018-07-15 09:20:35 +00:00
; 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
2018-07-15 10:30:41 +00:00
lwz r0, KDP.r0(r1)
lwz r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 11:29:31 +00:00
dc.b 0, 1, 2, 2, 4, 4, 4, 4
dc.b 3, 3, 3, 3, 4, 4, 4, 4
dc.b 4, 4, 4, 4, 4, 4, 4, 4
dc.b 4, 4, 4, 4, 4, 4, 4, 4
dc.b 7, 7, 7, 7, 7, 7, 7, 7
dc.b 7, 7, 7, 7, 7, 7, 7, 7
dc.b 7, 7, 7, 7, 7, 7, 7, 7
dc.b 7, 7, 7, 7, 7, 7, 7, 7
2018-07-15 09:20:35 +00:00
_align 6
IntExternal1
mfsprg r1, 0 ; Init regs and increment ctr
2018-07-15 11:59:56 +00:00
stw r0, KDP.r0(r1)
2018-07-15 10:30:41 +00:00
stw r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
2018-07-15 10:30:41 +00:00
stw r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
addi r2, r2, 1
stw r2, KDP.NKInfo.ExternalIntCount(r1)
lis r2, 0x50F3 ; Query OpenPIC at 50F2A000
2018-07-15 11:59:56 +00:00
mfmsr r3
_bset r0, r3, bitMsrDR
2018-07-15 10:30:41 +00:00
stw r4, KDP.r4(r1)
stw r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
mfsrr0 r4
mfsrr1 r5
mtmsr r0
li r0, 0xC0
stb r0, -0x6000(r2)
eieio
lbz r0, -0x6000(r2)
2018-07-15 11:59:56 +00:00
mtmsr r3
2018-07-15 09:20:35 +00:00
mtsrr0 r4
2018-07-15 09:34:52 +00:00
mtsrr1 r5
2018-07-15 10:30:41 +00:00
lwz r4, KDP.r4(r1)
lwz r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
2018-07-15 11:13:45 +00:00
lwz r3, KDP.NKCodePtr(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
2018-07-15 11:13:45 +00:00
lwz r3, KDP.EmuIntLevelPtr(r1)
2018-07-15 09:20:35 +00:00
clrlwi. r2, r2, 29
sth r2, 0(r3)
mfsprg r2, 2
2018-07-15 10:30:41 +00:00
lwz r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 10:30:41 +00:00
lwz r0, KDP.r0(r1)
lwz r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 11:59:56 +00:00
stw r0, KDP.r0(r1)
2018-07-15 10:30:41 +00:00
stw r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
lwz r2, KDP.NKInfo.ExternalIntCount(r1)
2018-07-15 10:30:41 +00:00
stw r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
addi r2, r2, 1
stw r2, KDP.NKInfo.ExternalIntCount(r1)
lis r2, 0xF300 ; Query OpenPIC at F3000028/C
2018-07-15 11:59:56 +00:00
mfmsr r0
_bset r3, r0, bitMsrDR
2018-07-15 10:30:41 +00:00
stw r4, KDP.r4(r1)
stw r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
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 10:30:41 +00:00
lwz r4, KDP.r4(r1)
lwz r5, KDP.r5(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 11:13:45 +00:00
lwz r3, KDP.EmuIntLevelPtr(r1)
2018-07-15 09:20:35 +00:00
sth r2, 0(r3)
mfsprg r2, 2
2018-07-15 10:30:41 +00:00
lwz r3, KDP.r3(r1)
2018-07-15 09:20:35 +00:00
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
2018-07-15 10:30:41 +00:00
lwz r0, KDP.r0(r1)
lwz r2, KDP.r2(r1)
2018-07-15 09:20:35 +00:00
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-24 04:56:38 +00:00
DecrementerIntSys
2018-07-09 08:06:47 +00:00
mfsprg r1, 0
2018-07-15 10:30:41 +00:00
stmw r2, KDP.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-15 10:30:41 +00:00
stw r0, KDP.r0(r1)
2018-07-10 05:16:19 +00:00
mfsprg r31, 1
2018-07-15 10:30:41 +00:00
stw r31, KDP.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-15 10:30:41 +00:00
lmw r27, KDP.r27(r1)
2018-07-10 05:16:19 +00:00
mfsprg r1, 2
mtlr r1
mfsprg r1, 1
rfi
2018-07-04 11:26:33 +00:00
2018-07-24 04:56:38 +00:00
DecrementerIntAlt
2018-07-10 05:16:19 +00:00
mfsprg r1, 0
2018-07-15 10:30:41 +00:00
stmw r2, KDP.r2(r1)
2018-07-10 05:16:19 +00:00
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-24 04:56:38 +00:00
DataStorageInt
2018-07-04 11:26:33 +00:00
mfsprg r1, 0
2018-07-15 10:30:41 +00:00
stmw r2, KDP.r2(r1)
2018-07-04 11:26:33 +00:00
mfsprg r11, 1
2018-07-15 10:30:41 +00:00
stw r0, KDP.r0(r1)
stw r11, KDP.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-24 04:56:38 +00:00
lwz r27, 0(r10) ; r27 = INSTRUCTION
2018-07-09 08:06:47 +00:00
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)
2018-07-15 11:13:45 +00:00
lwz r25, KDP.RetryCodePtr(r1)
2018-07-09 08:06:47 +00:00
li r21, 0
beq @r0
2018-07-24 04:56:38 +00:00
lwzx r18, r1, r18 ; r16 = contents of rA
2018-07-09 08:06:47 +00:00
@r0
2018-07-24 04:56:38 +00:00
andis. r26, r27, 0xec00 ; intended to extract the major opcode? seems wrong though!
2018-07-10 05:16:19 +00:00
lwz r16, KDP.Flags(r1)
mfsprg r24, 3
2018-07-24 04:56:38 +00:00
rlwinm r17, r27, 0, 6, 15 ; r17 = rS/D and rA fields
2018-07-04 11:26:33 +00:00
rlwimi r16, r16, 27, 26, 26
2018-07-24 04:56:38 +00:00
bge @xform
2018-07-09 08:06:47 +00:00
2018-07-24 04:56:38 +00:00
;dform
2018-07-09 08:06:47 +00:00
rlwimi r25, r27, 7, 26, 29 ; opcode >= 32
2018-07-04 11:26:33 +00:00
rlwimi r25, r27, 12, 25, 25
2018-07-24 04:56:38 +00:00
lwz r26, MROptabD - MRTop(r25) ; table of 4b elements, index = major opcode bits 51234 (this is the last quarter of MROptabX)
extsh r23, r27 ; r23 = register offset field, sign-extended
2018-07-04 11:26:33 +00:00
rlwimi r25, r26, 26, 22, 29
2018-07-24 04:56:38 +00:00
mtlr r25 ; dest = r25 = first of two function ptrs in table entry
mtcr r26 ; using the flags in the arbitrary upper 16 bits of the table entry?
add r18, r18, r23 ; r18 = effective address attempted by instruction
rlwimi r17, r26, 6, 26, 5 ; r17 = pretend X-form inst with: maj opcode (from tbl), rS/D and RA (from inst), min opcode (from tbl)
2018-07-04 11:26:33 +00:00
blr
2018-07-24 04:56:38 +00:00
@xform ; 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
2018-07-24 04:56:38 +00:00
lwz r26, MROptabX - MRTop(r25) ; table of 4b elements, index = minor (x-form) opcode bits 8940123
rlwinm r23, r27, 23, 25, 29 ; r23 = 4 * rB
2018-07-04 11:26:33 +00:00
rlwimi r25, r26, 26, 22, 29
2018-07-24 04:56:38 +00:00
mtlr r25 ; dest = r25 = first of two function ptrs in table entry
2018-07-04 11:26:33 +00:00
mtcr r26
2018-07-24 04:56:38 +00:00
lwzx r23, r1, r23 ; get rB from saved registers
rlwimi r17, r26, 6, 26, 5 ; r17 = pretend X-form inst with: maj opcode (from tbl), rS/D and RA (from inst), min opcode (from tbl)
add r18, r18, r23 ; r18 = effective address attempted by instruction
2018-07-04 11:26:33 +00:00
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-24 04:56:38 +00:00
AlignmentInt
2018-07-04 11:26:33 +00:00
mfsprg r1, 0
2018-07-15 10:30:41 +00:00
stmw r2, KDP.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
2018-07-15 10:30:41 +00:00
stw r0, KDP.r0(r1)
stw r11, KDP.r1(r1)
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
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?)
2018-07-15 11:13:45 +00:00
lwz r25, KDP.RetryCodePtr(r1)
2018-07-09 08:06:47 +00:00
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-24 04:56:38 +00:00
rlwimi r16, r16, 27, 26, 26 ; copy FlagSE to FlagTrace
2018-07-09 08:06:47 +00:00
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
2018-07-24 04:56:38 +00:00
lwz r26, MROptabD - MRTop(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-24 04:56:38 +00:00
lwz r26, MROptabX - MRTop(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
2018-07-24 04:56:38 +00:00
INCLUDE 'NKMemRetry.s'
2018-07-10 05:16:19 +00:00
2018-07-09 08:06:47 +00:00
########################################################################
2018-07-04 11:26:33 +00:00
2018-07-24 04:56:38 +00:00
InstStorageInt
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-15 10:30:41 +00:00
stmw r14, KDP.r14(r8)
2018-07-04 11:26:33 +00:00
mr r27, r10
2018-07-24 04:56:38 +00:00
bl PutPTE
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
addi r23, r1, KDP.VecTblMemRetry
2018-07-04 11:26:33 +00:00
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-15 11:59:56 +00:00
lmw r14, KDP.r14(r1)
2018-07-04 11:26:33 +00:00
b IntReturn
2018-07-09 08:06:47 +00:00
@not_in_htab
2018-07-15 11:59:56 +00:00
lmw r14, KDP.r14(r1)
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-24 04:56:38 +00:00
MachineCheckInt
2018-07-04 11:26:33 +00:00
bl LoadInterruptRegisters
li r8, ecMachineCheck
b Exception