diff --git a/Internal/NKPublic.a b/Internal/NKPublic.a index bdfd12c..dab1a41 100644 --- a/Internal/NKPublic.a +++ b/Internal/NKPublic.a @@ -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) diff --git a/NanoKernel/NKInit.s b/NanoKernel/NKInit.s old mode 100644 new mode 100755 index 6e43881..434c1d8 --- a/NanoKernel/NKInit.s +++ b/NanoKernel/NKInit.s @@ -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 diff --git a/NanoKernel/NKIntHandlers.s b/NanoKernel/NKIntHandlers.s index cfaea46..8c29d1a 100644 --- a/NanoKernel/NKIntHandlers.s +++ b/NanoKernel/NKIntHandlers.s @@ -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 diff --git a/NanoKernel/NKReset.s b/NanoKernel/NKReset.s index f23f131..06d6942 100755 --- a/NanoKernel/NKReset.s +++ b/NanoKernel/NKReset.s @@ -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 diff --git a/NanoKernel/NKSystemCrash.s b/NanoKernel/NKSystemCrash.s new file mode 100755 index 0000000..939e510 --- /dev/null +++ b/NanoKernel/NKSystemCrash.s @@ -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 diff --git a/NanoKernel/NanoKernel.s b/NanoKernel/NanoKernel.s index 7c79cfe..0d291ea 100644 --- a/NanoKernel/NanoKernel.s +++ b/NanoKernel/NanoKernel.s @@ -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'