This commit is contained in:
Elliot Nunn 2018-07-15 17:20:35 +08:00
parent f1b71713d3
commit 7b62fa404d
6 changed files with 369 additions and 34 deletions

View File

@ -586,7 +586,7 @@ TestIntMaskInit ds.l 1 ; 670 ; These are all copied from ConfigInfo...
PostIntMaskInit ds.l 1 ; 674
ClearIntMaskInit ds.l 1 ; 678
PA_EmulatorIplValue ds.l 1 ; 67c ; Physical ptr into EDP
SharedMemoryAddrPlus ds.l 1 ; 680 ; Really not sure
DebugIntPtr ds.l 1 ; 680 ; Within (debug?) shared memory
PA_PageMapStart ds.l 1 ; 684 ; Physical ptr to PageMap (= KDP+0x920)
PageAttributeInit ds.l 1 ; 688 ; defaults for page table entries (see ConfigInfo)

4
NanoKernel/NKInit.s Normal file → Executable file
View File

@ -196,7 +196,7 @@ InitKernelGlobals
lwz r12, NKConfigurationInfo.SharedMemoryAddr(rCI)
addi r12, r12, 0x7c
stw r12, KDP.SharedMemoryAddrPlus(r1)
stw r12, KDP.DebugIntPtr(r1)
lwz r12, NKConfigurationInfo.PageAttributeInit(rCI)
stw r12, KDP.PageAttributeInit(r1)
@ -261,7 +261,7 @@ InitInfoRecords
########################################################################
SetProcessorInfo
InitProcessorInfo
mfpvr r12
stw r12, KDP.ProcInfo.ProcessorVersionReg(r1)
srwi r12, r12, 16

View File

@ -1,5 +1,207 @@
; AUTO-GENERATED SYMBOL LIST
########################################################################
_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
mrsrr1 r5
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
mrsrr1 r5
lwz r4, EWA.r4(r1)
lwz r5, EWA.r5(r1)
lwz r3, KDP.PA_NanoKernelCode ; Loop that number up in the table
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
mrsrr1 r5
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
########################################################################
; Increment the Sys/Alt CPU clocks, and the Dec-int counter

View File

@ -57,13 +57,13 @@ rAlt set r8
lbz r22, NKConfigurationInfo.InterruptHandlerKind(rCI)
cmpwi r22, 0
_kaddr r23, rNK, IntForEmulator_1
_kaddr r23, rNK, IntExternal0
beq @chosenIntHandler
cmpwi r22, 1
_kaddr r23, rNK, IntForEmulator_2
_kaddr r23, rNK, IntExternal1
beq @chosenIntHandler
cmpwi r22, 2
_kaddr r23, rNK, IntForEmulator_3
_kaddr r23, rNK, IntExternal2
beq @chosenIntHandler
@chosenIntHandler

159
NanoKernel/NKSystemCrash.s Executable file
View File

@ -0,0 +1,159 @@
SystemCrash
mfsprg0 r1
stw r0, KDP.ThudSavedR0(r1)
mfspr r0, sprg1
stw r0, KDP.ThudSavedR1(r1)
stmw r2, KDP.ThudSavedR2(r1)
mfspr r0, cr
stw r0, KDP.ThudSavedCR(r1)
mfspr r0, mq
stw r0, KDP.ThudSavedMQ(r1)
mfspr r0, xer
stw r0, KDP.ThudSavedXER(r1)
mfspr r0, sprg2
stw r0, KDP.ThudSavedSPRG2(r1)
mfspr r0, ctr
stw r0, KDP.ThudSavedCTR(r1)
mfspr r0, pvr
stw r0, KDP.ThudSavedPVR(r1)
mfspr r0, dsisr
stw r0, KDP.ThudSavedDSISR(r1)
mfspr r0, dar
stw r0, KDP.ThudSavedDAR(r1)
mfspr r0, tbu
stw r0, KDP.ThudSavedTBU(r1)
mfspr r0, tb
stw r0, KDP.ThudSavedTB(r1)
mfspr r0, dec
stw r0, KDP.ThudSavedDEC(r1)
mfspr r0, hid0
stw r0, KDP.ThudSavedHID0(r1)
mfspr r0, sdr1
stw r0, KDP.ThudSavedSDR(r1)
mfspr r0, srr0
stw r0, KDP.ThudSavedSRR0(r1)
mfspr r0, srr1
stw r0, KDP.ThudSavedSRR(r1)
mfspr r0, msr
stw r0, KDP.ThudSavedMSR(r1)
mfsr r0, 0
stw r0, KDP.ThudSavedSR0(r1)
mfsr r0, 1
stw r0, KDP.ThudSavedSR1(r1)
mfsr r0, 2
stw r0, KDP.ThudSavedSR2(r1)
mfsr r0, 3
stw r0, KDP.ThudSavedSR3(r1)
mfsr r0, 4
stw r0, KDP.ThudSavedSR4(r1)
mfsr r0, 5
stw r0, KDP.ThudSavedSR5(r1)
mfsr r0, 6
stw r0, KDP.ThudSavedSR6(r1)
mfsr r0, 7
stw r0, KDP.ThudSavedSR7(r1)
mfsr r0, 8
stw r0, KDP.ThudSavedSR8(r1)
mfsr r0, 9
stw r0, KDP.ThudSavedSR9(r1)
mfsr r0, 10
stw r0, KDP.ThudSavedSR10(r1)
mfsr r0, 11
stw r0, KDP.ThudSavedSR11(r1)
mfsr r0, 12
stw r0, KDP.ThudSavedSR12(r1)
mfsr r0, 13
stw r0, KDP.ThudSavedSR13(r1)
mfsr r0, 14
stw r0, KDP.ThudSavedSR14(r1)
mfsr r0, 15
stw r0, KDP.ThudSavedSR15(r1)
mfspr r0, msr
ori r0, r0, 0x2000
mtmsr r0
stfd f0, KDP.ThudSavedF0(r1)
stfd f1, KDP.ThudSavedF1(r1)
stfd f2, KDP.ThudSavedF2(r1)
stfd f3, KDP.ThudSavedF3(r1)
stfd f4, KDP.ThudSavedF4(r1)
stfd f5, KDP.ThudSavedF5(r1)
stfd f6, KDP.ThudSavedF6(r1)
stfd f7, KDP.ThudSavedF7(r1)
stfd f8, KDP.ThudSavedF8(r1)
stfd f9, KDP.ThudSavedF9(r1)
stfd f10, KDP.ThudSavedF10(r1)
stfd f11, KDP.ThudSavedF11(r1)
stfd f12, KDP.ThudSavedF12(r1)
stfd f13, KDP.ThudSavedF13(r1)
stfd f14, KDP.ThudSavedF14(r1)
stfd f15, KDP.ThudSavedF15(r1)
stfd f16, KDP.ThudSavedF16(r1)
stfd f17, KDP.ThudSavedF17(r1)
stfd f18, KDP.ThudSavedF18(r1)
stfd f19, KDP.ThudSavedF19(r1)
stfd f20, KDP.ThudSavedF20(r1)
stfd f21, KDP.ThudSavedF21(r1)
stfd f22, KDP.ThudSavedF22(r1)
stfd f23, KDP.ThudSavedF23(r1)
stfd f24, KDP.ThudSavedF24(r1)
stfd f25, KDP.ThudSavedF25(r1)
stfd f26, KDP.ThudSavedF26(r1)
stfd f27, KDP.ThudSavedF27(r1)
stfd f28, KDP.ThudSavedF28(r1)
stfd f29, KDP.ThudSavedF29(r1)
stfd f30, KDP.ThudSavedF30(r1)
stfd f31, KDP.ThudSavedF31(r1)
mffs f31
lwz r0, KDP.ThudSavedF31+4(r1)
stfd f31, KDP.ThudSavedF31+4(r1)
stw r0, KDP.ThudSavedF31+4(r1)
mfspr r0, lr
stw r0, KDP.ThudSavedLR(r1)
########################################################################
lis r2, 2 ; Count down from 64k to find a zero
@nonzero
lwzu r0, -4(r2)
mr. r2, r2
bne @nonzero
@retryrtc ; Save RTC in "Mac/Smurf shared message mem"
mfrtcu r2
mfrtcl r3
mfrtcu r0
xor. r0, r0, r2
bne @retryrtc
lwz r1, KDP.SharedMemoryAddr(r1)
stw r2, 0(r1)
ori r3, r3, 1
stw r3, 4(r1)
dcbf 0, r1
sync
@loopforever
lwz r1, 0(0)
addi r1, r1, 1
stw r1, 0(0)
li r1, 0
dcbst r1, r1
b @loopforever

View File

@ -20,34 +20,8 @@ MemRetryDSI
MemRetryMachineCheck
NKTop
b VMPanic
org 0x0
Entry
org 0xA4
bankLoop
org 0xC8
FloatTables
org 0x308
ProcessorInfoTbl
org 0x374
FiguredOutProcessor
org 0x468
Thud
Panic
VMPanic
org 0x680
IntForEmulator_1
org 0x740
PDM68kInterruptTable
org 0x780
IntForEmulator_2
org 0x840
IntForEmulator_3
org 0x940
include 'NKInit.s'
include 'NKSystemCrash.s'
include 'NKIntHandlers.s'
include 'NKMemory.s'
include 'NKExceptions.s'