mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-06-09 07:29:36 +00:00
Split up NKInterrupts.s
This commit is contained in:
parent
b1d95b5928
commit
f0e290f709
|
@ -7,7 +7,10 @@ NKFiles =
|
||||||
{NKDir}NKBuiltinInit.s ¶
|
{NKDir}NKBuiltinInit.s ¶
|
||||||
{NKDir}NKProcFlagsTbl.s ¶
|
{NKDir}NKProcFlagsTbl.s ¶
|
||||||
{NKDir}NKProcInfoTbl.s ¶
|
{NKDir}NKProcInfoTbl.s ¶
|
||||||
{NKDir}NKInterrupts.s ¶
|
{NKDir}NKExceptions.s ¶
|
||||||
|
{NKDir}NKIntHandlers.s ¶
|
||||||
|
{NKDir}NKFloatInts.s ¶
|
||||||
|
{NKDir}NKIntMisc.s ¶
|
||||||
{NKDir}NKPaging.s ¶
|
{NKDir}NKPaging.s ¶
|
||||||
{NKDir}NKTranslation.s ¶
|
{NKDir}NKTranslation.s ¶
|
||||||
{NKDir}NKVMCalls.s ¶
|
{NKDir}NKVMCalls.s ¶
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
; CreateArea (=> NKVMCalls)
|
; CreateArea (=> NKVMCalls)
|
||||||
; CreateAreasFromPageMap (=> NKInit)
|
; CreateAreasFromPageMap (=> NKInit)
|
||||||
; DeletePTE (=> NKVMCalls)
|
; DeletePTE (=> NKVMCalls)
|
||||||
; FindAreaAbove (=> NKInterrupts, NKPaging, NKTasks, NKVMCalls)
|
; FindAreaAbove (=> NKIntHandlers, NKPaging, NKTasks, NKVMCalls)
|
||||||
; FreePageListPush (=> NKInit)
|
; FreePageListPush (=> NKInit)
|
||||||
; GetPTEFromPLE (=> NKVMCalls)
|
; GetPTEFromPLE (=> NKVMCalls)
|
||||||
; InitFreePageList (=> NKInit)
|
; InitFreePageList (=> NKInit)
|
||||||
|
@ -42,9 +42,9 @@
|
||||||
; MPCall_95_0x254 (=> NKPaging)
|
; MPCall_95_0x254 (=> NKPaging)
|
||||||
; NKCreateAddressSpaceSub (=> NKInit)
|
; NKCreateAddressSpaceSub (=> NKInit)
|
||||||
; SetPTE (=> NKVMCalls)
|
; SetPTE (=> NKVMCalls)
|
||||||
; SpaceGetPagePLE (=> NKInterrupts, NKPaging, NKVMCalls)
|
; SpaceGetPagePLE (=> NKIntHandlers, NKPaging, NKVMCalls)
|
||||||
; SpaceL2PIgnoringBATs (=> NKMPCalls)
|
; SpaceL2PIgnoringBATs (=> NKMPCalls)
|
||||||
; SpaceL2PUsingBATs (=> NKInterrupts, NKMPCalls)
|
; SpaceL2PUsingBATs (=> NKIntHandlers, NKMPCalls)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,11 +41,11 @@
|
||||||
|
|
||||||
; AUTO-GENERATED SYMBOL LIST
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
; NKInterrupts
|
; NKExceptions
|
||||||
; IntReturn
|
; IntReturn
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; FlushCaches (=> NKPowerCalls)
|
; FlushCaches (=> NKPowerCalls)
|
||||||
; FlushL1CacheUsingMSSCR0 (=> NKInterrupts)
|
; FlushL1CacheUsingMSSCR0 (=> NKIntHandlers)
|
||||||
; kcCacheDispatch (=> NKInit)
|
; kcCacheDispatch (=> NKInit)
|
||||||
|
|
||||||
; DeclareMPCall 199, kcCacheDispatch ; DEBUG
|
; DeclareMPCall 199, kcCacheDispatch ; DEBUG
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
; printd (=> NKInit, NKMPCalls, NKPoolAllocator, NKTimers)
|
; printd (=> NKInit, NKMPCalls, NKPoolAllocator, NKTimers)
|
||||||
; printh (=> NKBuiltinInit, NKMPCalls, NKReplacementInit, NKScheduler, NKThud, NKTimers)
|
; printh (=> NKBuiltinInit, NKMPCalls, NKReplacementInit, NKScheduler, NKThud, NKTimers)
|
||||||
; prints (=> NKMPCalls, NKThud)
|
; prints (=> NKMPCalls, NKThud)
|
||||||
; printw (=> NKAddressSpaces, NKInit, NKInterrupts, NKMPCalls, NKPaging, NKPoolAllocator, NKReplacementInit, NKScheduler, NKThud, NKTimers, NKVMCalls)
|
; printw (=> NKAddressSpaces, NKExceptions, NKInit, NKIntHandlers, NKIntMisc, NKMPCalls, NKPaging, NKPoolAllocator, NKReplacementInit, NKScheduler, NKThud, NKTimers, NKVMCalls)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,3 +67,28 @@ kSynchClock equ 8 ; r4 = target CPU idx,
|
||||||
kSIGP9 equ 9 ; no args?
|
kSIGP9 equ 9 ; no args?
|
||||||
kGetProcessorTemp equ 12 ; r4 = selector (ignored on Core99), r5 = cpu ID ; my name
|
kGetProcessorTemp equ 12 ; r4 = selector (ignored on Core99), r5 = cpu ID ; my name
|
||||||
kSIGP17 equ 17 ; r4 = target CPU idx?
|
kSIGP17 equ 17 ; r4 = target CPU idx?
|
||||||
|
|
||||||
|
|
||||||
|
; Exception cause equates
|
||||||
|
; System = FFFFFFFF, Alt = 7DF2F700 (ecInstPageFault and ecDataPageFault disabled), same +/- VM
|
||||||
|
ecNoException equ 0 ; Exception
|
||||||
|
ecSystemCall equ 1 ; ?
|
||||||
|
ecTrapInstr equ 2 ; Exception
|
||||||
|
ecFloatException equ 3 ; Exception
|
||||||
|
ecInvalidInstr equ 4 ; Exception
|
||||||
|
ecPrivilegedInstr equ 5 ; ?
|
||||||
|
ecMachineCheck equ 7 ; Exception
|
||||||
|
ecInstTrace equ 8 ; Exception
|
||||||
|
ecInstInvalidAddress equ 10 ; Exception
|
||||||
|
ecInstHardwareFault equ 11 ; Exception
|
||||||
|
ecInstPageFault equ 12 ; Exception
|
||||||
|
ecInstSupAccessViolation equ 14 ; Exception
|
||||||
|
|
||||||
|
; Usually from MemRetryDSI (also IntAlignment and IntMachineCheck)
|
||||||
|
ecDataInvalidAddress equ 18 ; ExceptionMemRetried
|
||||||
|
ecDataHardwareFault equ 19 ; ExceptionMemRetried
|
||||||
|
ecDataPageFault equ 20 ; ExceptionMemRetried
|
||||||
|
ecDataWriteViolation equ 21 ; ExceptionMemRetried
|
||||||
|
ecDataSupAccessViolation equ 22 ; ExceptionMemRetried
|
||||||
|
ecDataSupWriteViolation equ 23 ; ?
|
||||||
|
ecUnknown24 equ 24 ; ExceptionMemRetried
|
||||||
|
|
840
NanoKernel/NKExceptions.s
Normal file
840
NanoKernel/NKExceptions.s
Normal file
|
@ -0,0 +1,840 @@
|
||||||
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
|
; IMPORTS:
|
||||||
|
; NKConsoleLog
|
||||||
|
; printw
|
||||||
|
; NKFloatInts
|
||||||
|
; IntHandleSpecialFPException
|
||||||
|
; bugger_around_with_floats
|
||||||
|
; NKIndex
|
||||||
|
; LookupID
|
||||||
|
; NKIntMisc
|
||||||
|
; IntReturnFromSIGP
|
||||||
|
; NKMPCalls
|
||||||
|
; BlockMPCall
|
||||||
|
; NKPoolAllocator
|
||||||
|
; PoolAlloc
|
||||||
|
; NKScheduler
|
||||||
|
; FlagSchEval
|
||||||
|
; Save_v0_v31
|
||||||
|
; SchEval
|
||||||
|
; SchRdyTaskNow
|
||||||
|
; SchRestoreStartingAtR14
|
||||||
|
; SchReturn
|
||||||
|
; SchSaveStartingAtR14
|
||||||
|
; SchTaskUnrdy
|
||||||
|
; NKSync
|
||||||
|
; CauseNotification
|
||||||
|
; EnqueueMessage
|
||||||
|
; UnblockBlueIfCouldBePolling
|
||||||
|
; NKTasks
|
||||||
|
; ThrowTaskToDebugger
|
||||||
|
; NKTranslation
|
||||||
|
; FDP_011c
|
||||||
|
; EXPORTS:
|
||||||
|
; Exception (=> NKIntHandlers, NKIntMisc, NKThud, NKTranslation)
|
||||||
|
; ExceptionMemRetried (=> NKIntHandlers, NKTranslation)
|
||||||
|
; IntReturn (=> NKCache, NKIntHandlers, NKIntMisc, NKMPCalls, NKPowerCalls, NKPrimaryIntHandlers, NKRTASCalls, NKVMCalls)
|
||||||
|
; IntReturnToOtherBlueContext (=> NKIntMisc)
|
||||||
|
; IntReturnToSystemContext (=> NKIntHandlers)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BlockTaskToHandleException
|
||||||
|
|
||||||
|
b BlockMPCall
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ARG EC r8, nuFlags r16, ? r17, ? r19, ? r23, vecTable *r24
|
||||||
|
|
||||||
|
align 5
|
||||||
|
|
||||||
|
ExceptionMemRetried
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
mtsprg 3, r24
|
||||||
|
|
||||||
|
lwz r9, EWA.Enables(r1)
|
||||||
|
rlwinm r23, r17, (32-1), 27, 31
|
||||||
|
rlwnm. r9, r9, r8, 0, 0 ; cr0.lt = (exception enabled?)
|
||||||
|
|
||||||
|
bcl BO_IF, EWA.kFlag15, major_0x02980_0x100
|
||||||
|
|
||||||
|
lwz r6, EWA.PA_ContextBlock(r1)
|
||||||
|
|
||||||
|
_bset r7, r16, 27
|
||||||
|
|
||||||
|
neg r23, r23
|
||||||
|
mtcrf 0x3f, r7
|
||||||
|
add r19, r19, r23
|
||||||
|
|
||||||
|
; Exception code in high byte of flags
|
||||||
|
rlwimi r7, r8, 24, 0xFF000000
|
||||||
|
|
||||||
|
|
||||||
|
; Increment counter, easy enough
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
slwi r8, r8, 2
|
||||||
|
add r8, r8, r1
|
||||||
|
lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8)
|
||||||
|
addi r9, r9, 1
|
||||||
|
stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8)
|
||||||
|
|
||||||
|
srwi r9, r7, 24
|
||||||
|
|
||||||
|
; Move regs from EWA to ContextBlock
|
||||||
|
mfsprg r1, 0
|
||||||
|
lwz r8, 0x0000(r1)
|
||||||
|
stw r8, 0x0104(r6)
|
||||||
|
lwz r8, 0x001c(r1)
|
||||||
|
stw r8, 0x013c(r6)
|
||||||
|
lwz r8, 0x0020(r1)
|
||||||
|
stw r8, 0x0144(r6)
|
||||||
|
lwz r8, 0x0024(r1)
|
||||||
|
stw r8, 0x014c(r6)
|
||||||
|
lwz r8, 0x0028(r1)
|
||||||
|
stw r8, 0x0154(r6)
|
||||||
|
lwz r8, 0x002c(r1)
|
||||||
|
stw r8, 0x015c(r6)
|
||||||
|
lwz r8, 0x0030(r1)
|
||||||
|
stw r8, 0x0164(r6)
|
||||||
|
lwz r8, 0x0034(r1)
|
||||||
|
stw r8, 0x016c(r6)
|
||||||
|
|
||||||
|
|
||||||
|
; Order of preference:
|
||||||
|
; SIGP-return exceptions obviously separate
|
||||||
|
; MTasks (non-blue) -> UnhandledDataFault (ends up going to system page queue)
|
||||||
|
; Exception enabled for blue task (i.e. in system context) -> field exception to task
|
||||||
|
; Not actually a data fault -> system context (68k interrupt)
|
||||||
|
; Data fault that blue does not wish to handle
|
||||||
|
|
||||||
|
cmpwi cr1, r9, ecDataPageFault
|
||||||
|
|
||||||
|
bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP
|
||||||
|
bc BO_IF_NOT, EWA.kFlagBlue, UnhandledDataFault
|
||||||
|
blt LetBlueHandleOwnException
|
||||||
|
bne cr1, IntReturnToSystemContext
|
||||||
|
b UnhandledDataFault
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LetBlueHandleOwnException
|
||||||
|
|
||||||
|
; How does the ContextBlock contain exception handling information?
|
||||||
|
mfsprg r1, 0
|
||||||
|
stw r10, 0x0084(r6)
|
||||||
|
stw r12, 0x008c(r6)
|
||||||
|
stw r3, 0x0094(r6)
|
||||||
|
stw r4, 0x009c(r6)
|
||||||
|
lwz r8, EWA.Enables(r1)
|
||||||
|
stw r7, ContextBlock.SavedFlags(r6)
|
||||||
|
stw r8, ContextBlock.SavedEnables(r6)
|
||||||
|
li r8, 0
|
||||||
|
lwz r10, ContextBlock.ExceptionHandler(r6)
|
||||||
|
stw r8, EWA.Enables(r1) ; disallow double-exceptions
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
lwz r4, 0x0054(r6)
|
||||||
|
|
||||||
|
; Which context will we pass to the task exception handler?
|
||||||
|
lwz r3, KDP.LA_ECB(r1)
|
||||||
|
bc BO_IF, 8, @pass_system_context
|
||||||
|
lwz r3, KDP.LA_NCB(r1)
|
||||||
|
_bclr r11, r11, MSR_EEbit
|
||||||
|
@pass_system_context
|
||||||
|
|
||||||
|
; exception handler will return via trap in emulator code
|
||||||
|
lwz r12, KDP.LA_EmulatorKernelTrapTable + NanoKernelCallTable.ReturnFromException(r1)
|
||||||
|
|
||||||
|
bcl BO_IF, EWA.kFlagLowSaves, PreferRegistersFromEWASavingContextBlock
|
||||||
|
|
||||||
|
rlwinm r7, r7, 0, 29, 16 ; unset 17-28
|
||||||
|
rlwimi r11, r7, 0, 20, 23 ; threfore unset MSR[FE0/SE/BE/FE1]
|
||||||
|
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
major_0x02980_0x100
|
||||||
|
lwz r2, 0x0008(r1)
|
||||||
|
lwz r3, 0x000c(r1)
|
||||||
|
lwz r4, 0x0010(r1)
|
||||||
|
lwz r5, 0x0014(r1)
|
||||||
|
blr
|
||||||
|
|
||||||
|
PreferRegistersFromEWASavingContextBlock ; OUTSIDE REFERER
|
||||||
|
mfsprg r8, 0
|
||||||
|
stw r17, 0x0064(r6)
|
||||||
|
stw r20, 0x0068(r6)
|
||||||
|
stw r21, 0x006c(r6)
|
||||||
|
stw r19, ContextBlock.SRR0(r6)
|
||||||
|
stw r18, 0x007c(r6)
|
||||||
|
lmw r14, EWA.r14(r8)
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; This is the only path to UnhandledCodeFault
|
||||||
|
|
||||||
|
Exception
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
mtcrf 0x3f, r7
|
||||||
|
|
||||||
|
lwz r9, EWA.Enables(r1)
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
|
||||||
|
rlwnm. r9, r9, r8, 0, 0 ; cr0.lt = (exception enabled?)
|
||||||
|
|
||||||
|
; Exception code in high byte of flags
|
||||||
|
rlwimi r7, r8, 24, 0xFF000000
|
||||||
|
|
||||||
|
; Increment counter, easy enough
|
||||||
|
slwi r8, r8, 2
|
||||||
|
add r8, r8, r1
|
||||||
|
lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8)
|
||||||
|
addi r9, r9, 1
|
||||||
|
stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionCauseCounts(r8)
|
||||||
|
|
||||||
|
srwi r9, r7, 24
|
||||||
|
|
||||||
|
; Order of preference:
|
||||||
|
; SIGP-return exceptions obviously separate
|
||||||
|
; MTasks (non-blue) -> UnhandledCodeFault (ends up going to backing store)
|
||||||
|
; Exception enabled for blue task (i.e. in system context) -> field exception to task
|
||||||
|
; Code fault for blue task but exception is disabled -> UnhandledCodeFault
|
||||||
|
; Non-code fault for blue task -> system context (68k interrupt)
|
||||||
|
|
||||||
|
bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP
|
||||||
|
bc BO_IF_NOT, EWA.kFlagBlue, UnhandledCodeFault
|
||||||
|
|
||||||
|
cmpwi cr1, r9, ecInstPageFault
|
||||||
|
|
||||||
|
blt LetBlueHandleOwnException
|
||||||
|
beq cr1, UnhandledCodeFault
|
||||||
|
; b IntReturnToSystemContext
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; THESE TWO RETURN PATHS ARE ONLY CALLED IF BLUE IS RUNNING!
|
||||||
|
|
||||||
|
IntReturnToSystemContext
|
||||||
|
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
lwz r9, KDP.PA_ECB(r1)
|
||||||
|
|
||||||
|
addi r8, r1, KDP.VecBaseSystem
|
||||||
|
mtsprg 3, r8
|
||||||
|
|
||||||
|
; Exception came from emulator! Can't handle that with a 68k interrupt, can we?
|
||||||
|
bcl BO_IF, EWA.kFlagEmu, SuspendBlueTask
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Swap the blue task between the system and alternate contexts
|
||||||
|
|
||||||
|
; ARG old_context r6, new_context r9
|
||||||
|
|
||||||
|
IntReturnToOtherBlueContext
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
|
||||||
|
lwz r8, EWA.Enables(r1)
|
||||||
|
stw r7, ContextBlock.Flags(r6)
|
||||||
|
stw r8, ContextBlock.Enables(r6)
|
||||||
|
|
||||||
|
bc BO_IF_NOT, EWA.kFlagLowSaves, @not_low_saves
|
||||||
|
stw r17, 0x0024(r6)
|
||||||
|
stw r20, 0x0028(r6)
|
||||||
|
stw r21, 0x002c(r6)
|
||||||
|
stw r19, 0x0034(r6)
|
||||||
|
stw r18, 0x003c(r6)
|
||||||
|
lmw r14, 0x0038(r1)
|
||||||
|
@not_low_saves
|
||||||
|
|
||||||
|
|
||||||
|
; Save state to the old ContextBlock
|
||||||
|
|
||||||
|
mfxer r8
|
||||||
|
stw r13, ContextBlock.CR(r6)
|
||||||
|
stw r8, ContextBlock.XER(r6)
|
||||||
|
stw r12, ContextBlock.LR(r6)
|
||||||
|
mfctr r8
|
||||||
|
stw r10, ContextBlock.CodePtr(r6)
|
||||||
|
stw r8, ContextBlock.KernelCTR(r6)
|
||||||
|
|
||||||
|
bc BO_IF_NOT, EWA.kFlagHasMQ, @no_mq
|
||||||
|
lwz r8, ContextBlock.MQ(r9)
|
||||||
|
mfspr r12, mq
|
||||||
|
mtspr mq, r8
|
||||||
|
stw r12, ContextBlock.MQ(r6)
|
||||||
|
@no_mq
|
||||||
|
|
||||||
|
lwz r8, 0x0004(r1)
|
||||||
|
stw r8, 0x010c(r6)
|
||||||
|
stw r2, 0x0114(r6)
|
||||||
|
stw r3, 0x011c(r6)
|
||||||
|
stw r4, 0x0124(r6)
|
||||||
|
lwz r8, 0x0018(r1)
|
||||||
|
stw r5, 0x012c(r6)
|
||||||
|
stw r8, 0x0134(r6)
|
||||||
|
stw r14, 0x0174(r6)
|
||||||
|
stw r15, 0x017c(r6)
|
||||||
|
stw r16, 0x0184(r6)
|
||||||
|
stw r17, 0x018c(r6)
|
||||||
|
stw r18, 0x0194(r6)
|
||||||
|
stw r19, 0x019c(r6)
|
||||||
|
stw r20, 0x01a4(r6)
|
||||||
|
stw r21, 0x01ac(r6)
|
||||||
|
stw r22, 0x01b4(r6)
|
||||||
|
stw r23, 0x01bc(r6)
|
||||||
|
stw r24, 0x01c4(r6)
|
||||||
|
stw r25, 0x01cc(r6)
|
||||||
|
stw r26, 0x01d4(r6)
|
||||||
|
_band. r8, r11, MSR_FPbit
|
||||||
|
stw r27, 0x01dc(r6)
|
||||||
|
stw r28, 0x01e4(r6)
|
||||||
|
stw r29, 0x01ec(r6)
|
||||||
|
stw r30, 0x01f4(r6)
|
||||||
|
stw r31, 0x01fc(r6)
|
||||||
|
|
||||||
|
bnel bugger_around_with_floats
|
||||||
|
|
||||||
|
bc BO_IF_NOT, EWA.kFlagVec, @no_vec
|
||||||
|
bl Save_v0_v31
|
||||||
|
@no_vec
|
||||||
|
|
||||||
|
stw r11, ContextBlock.MSR(r6)
|
||||||
|
|
||||||
|
|
||||||
|
; Load state from the new ContextBlock
|
||||||
|
|
||||||
|
lwz r8, ContextBlock.Flags(r9)
|
||||||
|
|
||||||
|
stw r9, EWA.PA_ContextBlock(r1)
|
||||||
|
|
||||||
|
xoris r7, r7, 1 << (15 - EWA.kFlagEmu) ; toggle the emulator flag
|
||||||
|
|
||||||
|
rlwimi r11, r8, 0, 20, 23 ; MSR[FE0/SE/BE/FE1]
|
||||||
|
|
||||||
|
mr r6, r9
|
||||||
|
rlwimi r7, r8, 0, 17, 31 ; copy the flags that *do* differ between contexts
|
||||||
|
|
||||||
|
andi. r8, r11, MSR_FE0 | MSR_FE1
|
||||||
|
|
||||||
|
lwz r8, ContextBlock.Enables(r6)
|
||||||
|
lwz r13, ContextBlock.CR(r6)
|
||||||
|
stw r8, EWA.Enables(r1)
|
||||||
|
lwz r8, ContextBlock.XER(r6)
|
||||||
|
lwz r12, ContextBlock.LR(r6)
|
||||||
|
mtxer r8
|
||||||
|
lwz r8, ContextBlock.KernelCTR(r6)
|
||||||
|
lwz r10, ContextBlock.CodePtr(r6)
|
||||||
|
mtctr r8
|
||||||
|
|
||||||
|
bnel IntHandleSpecialFPException
|
||||||
|
|
||||||
|
lwarx r8, 0, r1
|
||||||
|
sync
|
||||||
|
stwcx. r8, 0, r1
|
||||||
|
|
||||||
|
lwz r29, ContextBlock.VectorSaveArea(r6)
|
||||||
|
lwz r8, ContextBlock.r1(r6)
|
||||||
|
cmpwi r29, 0
|
||||||
|
stw r8, EWA.r1(r1)
|
||||||
|
lwz r28, 0x210(r29)
|
||||||
|
beq @no_vrsave
|
||||||
|
mtspr vrsave, r28
|
||||||
|
@no_vrsave
|
||||||
|
|
||||||
|
lwz r2, 0x0114(r6)
|
||||||
|
lwz r3, 0x011c(r6)
|
||||||
|
lwz r4, 0x0124(r6)
|
||||||
|
lwz r8, 0x0134(r6)
|
||||||
|
lwz r5, 0x012c(r6)
|
||||||
|
stw r8, 0x0018(r1)
|
||||||
|
lwz r14, 0x0174(r6)
|
||||||
|
lwz r15, 0x017c(r6)
|
||||||
|
lwz r16, 0x0184(r6)
|
||||||
|
lwz r17, 0x018c(r6)
|
||||||
|
lwz r18, 0x0194(r6)
|
||||||
|
lwz r19, 0x019c(r6)
|
||||||
|
lwz r20, 0x01a4(r6)
|
||||||
|
lwz r21, 0x01ac(r6)
|
||||||
|
lwz r22, 0x01b4(r6)
|
||||||
|
lwz r23, 0x01bc(r6)
|
||||||
|
lwz r24, 0x01c4(r6)
|
||||||
|
lwz r25, 0x01cc(r6)
|
||||||
|
lwz r26, 0x01d4(r6)
|
||||||
|
lwz r27, 0x01dc(r6)
|
||||||
|
lwz r28, 0x01e4(r6)
|
||||||
|
lwz r29, 0x01ec(r6)
|
||||||
|
lwz r30, 0x01f4(r6)
|
||||||
|
lwz r31, 0x01fc(r6)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Almost always goes straight through to SchReturn. Zeros a word in EWA.
|
||||||
|
|
||||||
|
; ARG flags_to_set r7
|
||||||
|
|
||||||
|
IntReturn ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
andi. r8, r7, (1 << (31 - 26)) | (1 << (31 - 27))
|
||||||
|
mfsprg r1, 0
|
||||||
|
bnel major_0x02ccc ; my counters say almost never called!
|
||||||
|
li r8, 0
|
||||||
|
stw r7, EWA.Flags(r1)
|
||||||
|
stw r8, EWA.WeMightClear(r1)
|
||||||
|
b SchReturn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Almost never called (by above func)
|
||||||
|
|
||||||
|
major_0x02ccc ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
mtcrf 0x3f, r7
|
||||||
|
|
||||||
|
bc BO_IF_NOT, EWA.kFlagLowSaves, @major_0x02ccc_0x18
|
||||||
|
_bclr r7, r7, EWA.kFlagLowSaves
|
||||||
|
|
||||||
|
bc BO_IF, EWA.kFlag31, major_0x02ccc_0x30
|
||||||
|
_bclr r7, r7, EWA.kFlag26
|
||||||
|
|
||||||
|
b @return
|
||||||
|
@major_0x02ccc_0x18
|
||||||
|
|
||||||
|
bc BO_IF_NOT, EWA.kFlag26, @return
|
||||||
|
_bclr r7, r7, EWA.kFlag26
|
||||||
|
|
||||||
|
stw r7, EWA.Flags(r1)
|
||||||
|
li r8, ecInstTrace
|
||||||
|
b Exception
|
||||||
|
@return
|
||||||
|
|
||||||
|
blr
|
||||||
|
|
||||||
|
major_0x02ccc_0x30
|
||||||
|
; according to my counter, this point is never reached
|
||||||
|
|
||||||
|
rlwinm. r8, r7, 0, 8, 8
|
||||||
|
beq SuspendBlueTask
|
||||||
|
stw r7, EWA.Flags(r1)
|
||||||
|
lwz r8, 0x0104(r6)
|
||||||
|
stw r8, 0x0000(r1)
|
||||||
|
stw r2, 0x0008(r1)
|
||||||
|
stw r3, 0x000c(r1)
|
||||||
|
stw r4, 0x0010(r1)
|
||||||
|
stw r5, 0x0014(r1)
|
||||||
|
lwz r8, 0x013c(r6)
|
||||||
|
stw r8, 0x001c(r1)
|
||||||
|
lwz r8, 0x0144(r6)
|
||||||
|
stw r8, 0x0020(r1)
|
||||||
|
lwz r8, 0x014c(r6)
|
||||||
|
stw r8, 0x0024(r1)
|
||||||
|
lwz r8, 0x0154(r6)
|
||||||
|
stw r8, 0x0028(r1)
|
||||||
|
lwz r8, 0x015c(r6)
|
||||||
|
stw r8, 0x002c(r1)
|
||||||
|
lwz r8, 0x0164(r6)
|
||||||
|
stw r8, 0x0030(r1)
|
||||||
|
lwz r8, 0x016c(r6)
|
||||||
|
stw r8, 0x0034(r1)
|
||||||
|
stmw r14, 0x0038(r1)
|
||||||
|
lwz r8, -0x0004(r1)
|
||||||
|
lwz r17, 0x0024(r9)
|
||||||
|
lwz r20, 0x0028(r9)
|
||||||
|
lwz r21, 0x002c(r9)
|
||||||
|
lwz r19, 0x0034(r9)
|
||||||
|
lwz r18, 0x003c(r9)
|
||||||
|
_bclr r16, r7, EWA.kFlagLowSaves
|
||||||
|
lwz r25, 0x0650(r8)
|
||||||
|
rlwinm. r22, r17, 31, 27, 31
|
||||||
|
add r19, r19, r22
|
||||||
|
rlwimi r25, r17, 7, 25, 30
|
||||||
|
lhz r26, 0x0d20(r25)
|
||||||
|
rlwimi r25, r19, 1, 28, 30
|
||||||
|
stw r16, EWA.Flags(r1)
|
||||||
|
rlwimi r26, r26, 8, 8, 15 ; copy hi byte of entry to second byte of word
|
||||||
|
rlwimi r25, r17, 4, 23, 27
|
||||||
|
mtcrf 0x10, r26 ; so the second nybble of the entry is copied to cr3
|
||||||
|
lha r22, 0x0c00(r25)
|
||||||
|
addi r23, r8, KDP.VecBaseMemRetry
|
||||||
|
add r22, r22, r25
|
||||||
|
mfsprg r24, 3
|
||||||
|
mtlr r22
|
||||||
|
mtsprg 3, r23
|
||||||
|
mfmsr r14
|
||||||
|
ori r15, r14, 0x10
|
||||||
|
mtmsr r15
|
||||||
|
isync
|
||||||
|
rlwimi r25, r26, 2, 22, 29 ; apparently the lower byte of the entry is an FDP (code?) offset, /4!
|
||||||
|
bnelr
|
||||||
|
b FDP_011c
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SuspendBlueTask
|
||||||
|
bl SchSaveStartingAtR14 ; r8 := EWA
|
||||||
|
|
||||||
|
lwz r31, EWA.PA_CurTask(r8)
|
||||||
|
lwz r8, Task.ExceptionHandlerID(r31)
|
||||||
|
bl LookupID
|
||||||
|
cmpwi r9, Queue.kIDClass
|
||||||
|
mr r30, r8
|
||||||
|
bnel @no_exception_handler
|
||||||
|
|
||||||
|
lwz r28, Queue.ReservePtr(r30)
|
||||||
|
cmpwi r28, 0
|
||||||
|
beql @no_memory_reserved_for_exception_messages
|
||||||
|
|
||||||
|
;notify exception handler
|
||||||
|
_Lock PSA.SchLock, scratch1=r8, scratch2=r9
|
||||||
|
|
||||||
|
lwz r29, Task.Flags(r31)
|
||||||
|
_bset r29, r29, Task.kFlagStopped
|
||||||
|
_bset r29, r29, Task.kFlag19
|
||||||
|
stw r29, Task.Flags(r31)
|
||||||
|
|
||||||
|
; pop 'notr'
|
||||||
|
lwz r17, Message.LLL + LLL.Next(r28)
|
||||||
|
stw r17, Queue.ReservePtr(r30)
|
||||||
|
|
||||||
|
; word1 = task ID
|
||||||
|
lwz r17, Task.ID(r31)
|
||||||
|
stw r17, Message.Word1(r28)
|
||||||
|
|
||||||
|
; word 2 = kMPTaskAbortedErr
|
||||||
|
li r18, kMPTaskAbortedErr
|
||||||
|
stw r18, Message.Word2(r28)
|
||||||
|
stw r18, Task.ErrToReturnIfIDie(r31)
|
||||||
|
|
||||||
|
; word 3 = SRR0
|
||||||
|
stw r10, Message.Word3(r28)
|
||||||
|
|
||||||
|
_log 'Blue task suspended. Notifying exception handler - srr1/0 '
|
||||||
|
mr r8, r11
|
||||||
|
bl Printw
|
||||||
|
mr r8, r10
|
||||||
|
bl Printw
|
||||||
|
_log 'lr '
|
||||||
|
mr r8, r12
|
||||||
|
bl Printw
|
||||||
|
_log '^n'
|
||||||
|
|
||||||
|
mr r31, r30
|
||||||
|
mr r8, r28
|
||||||
|
bl EnqueueMessage ; Message *r8, Queue *r31
|
||||||
|
|
||||||
|
b SchEval
|
||||||
|
|
||||||
|
@no_exception_handler
|
||||||
|
@no_memory_reserved_for_exception_messages
|
||||||
|
mflr r16
|
||||||
|
_log 'Blue task terminated - no exception handler registered - srr1/0 '
|
||||||
|
mr r8, r11
|
||||||
|
bl Printw
|
||||||
|
mr r8, r10
|
||||||
|
bl Printw
|
||||||
|
_log 'lr '
|
||||||
|
mr r8, r12
|
||||||
|
bl Printw
|
||||||
|
_log '^n'
|
||||||
|
mtlr r16
|
||||||
|
b IntPanicIsland
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
######## ### ###### ######## ######## ### ## ## ## ######## ######
|
||||||
|
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
|
||||||
|
## ## ## ## ## ## ## ## ## ## ## ## ## ##
|
||||||
|
######## ## ## ## #### ###### ###### ## ## ## ## ## ## ######
|
||||||
|
## ######### ## ## ## ## ######### ## ## ## ## ##
|
||||||
|
## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
|
||||||
|
## ## ## ###### ######## ## ## ## ####### ######## ## ######
|
||||||
|
|
||||||
|
; Blue can easily get to both of these!
|
||||||
|
|
||||||
|
UnhandledCodeFault
|
||||||
|
|
||||||
|
bcl BO_IF, EWA.kFlagLowSaves, IntPanicIsland
|
||||||
|
bl SchSaveStartingAtR14
|
||||||
|
|
||||||
|
mr r30, r10
|
||||||
|
lwz r29, EWA.r6(r8)
|
||||||
|
lwz r31, EWA.PA_CurTask(r8)
|
||||||
|
stw r29, ContextBlock.r6(r6)
|
||||||
|
stw r30, ContextBlock.SRR0(r6) ; ContextBlock.srr0?
|
||||||
|
stw r7, 0x0040(r6) ; ContextBlock.savedFlags?
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
|
||||||
|
; get task in r31, globals in r1
|
||||||
|
|
||||||
|
; Will be released via BlockMPCall
|
||||||
|
_Lock PSA.SchLock, scratch1=r28, scratch2=r29
|
||||||
|
|
||||||
|
mr r8, r31
|
||||||
|
bl SchTaskUnrdy
|
||||||
|
|
||||||
|
lwz r16, Task.Flags(r31)
|
||||||
|
srwi r8, r7, 24
|
||||||
|
|
||||||
|
|
||||||
|
; To debugger if not actually a code fault, or Task takes all exceptions
|
||||||
|
rlwinm. r16, r16, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions
|
||||||
|
cmpwi cr1, r8, ecInstPageFault
|
||||||
|
bne _PageFaultToDebugger
|
||||||
|
bne cr1, _PageFaultToDebugger
|
||||||
|
|
||||||
|
|
||||||
|
lwz r8, Task.CodeFaultCtr(r31)
|
||||||
|
addi r8, r8, 1
|
||||||
|
stw r8, Task.CodeFaultCtr(r31)
|
||||||
|
|
||||||
|
b _CommonFaultPath
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
UnhandledDataFault
|
||||||
|
|
||||||
|
bcl BO_IF_NOT, EWA.kFlagLowSaves, IntPanicIsland
|
||||||
|
|
||||||
|
bl PreferRegistersFromEWASavingContextBlock
|
||||||
|
|
||||||
|
stw r10, ContextBlock.LA_EmulatorEntry(r6)
|
||||||
|
|
||||||
|
_bclr r7, r7, EWA.kFlagLowSaves
|
||||||
|
|
||||||
|
|
||||||
|
bl SchSaveStartingAtR14
|
||||||
|
|
||||||
|
lwz r30, ContextBlock.SRR0(r6)
|
||||||
|
lwz r29, 0x0018(r8)
|
||||||
|
lwz r31, -0x0008(r8)
|
||||||
|
stw r29, 0x0134(r6)
|
||||||
|
stw r7, 0x0040(r6)
|
||||||
|
lwz r1, -0x0004(r1)
|
||||||
|
|
||||||
|
|
||||||
|
; Will be released via BlockMPCall
|
||||||
|
_Lock PSA.SchLock, scratch1=r28, scratch2=r29
|
||||||
|
|
||||||
|
|
||||||
|
mr r8, r31
|
||||||
|
bl SchTaskUnrdy
|
||||||
|
|
||||||
|
|
||||||
|
lwz r16, Task.Flags(r31)
|
||||||
|
srwi r8, r7, 24
|
||||||
|
|
||||||
|
|
||||||
|
; To debugger if not actually a data fault, or Task takes all exceptions
|
||||||
|
rlwinm. r16, r16, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions
|
||||||
|
cmpwi cr1, r8, ecDataPageFault
|
||||||
|
bne _PageFaultToDebugger
|
||||||
|
bne cr1, _PageFaultToDebugger
|
||||||
|
|
||||||
|
|
||||||
|
lwz r8, Task.DataFaultCtr(r31)
|
||||||
|
addi r8, r8, 1
|
||||||
|
stw r8, Task.DataFaultCtr(r31)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
_CommonFaultPath
|
||||||
|
|
||||||
|
mfsprg r14, 0
|
||||||
|
|
||||||
|
_bclr r7, r7, EWA.kFlag26
|
||||||
|
_bclr r7, r7, EWA.kFlag31
|
||||||
|
|
||||||
|
; Panic if EWA.SpecialAreaPtr is invalid (presumably means CurrentlyFaultingArea?)
|
||||||
|
lwz r29, EWA.SpecialAreaPtr(r14)
|
||||||
|
lisori r17, Area.kSignature
|
||||||
|
lwz r16, Area.Signature(r29)
|
||||||
|
cmplw r16, r17
|
||||||
|
bnel IntPanicIsland
|
||||||
|
|
||||||
|
lwz r17, Area.Counter(r29)
|
||||||
|
addi r17, r17, 1
|
||||||
|
stw r17, Area.Counter(r29)
|
||||||
|
|
||||||
|
; Get BackingProvider ptr in r26 (`mr` a few instructions down)
|
||||||
|
lwz r8, Area.BackingProviderID(r29)
|
||||||
|
bl LookupID
|
||||||
|
|
||||||
|
|
||||||
|
; Three escape hatches:
|
||||||
|
|
||||||
|
; PAGE FAULT TASK VMMaxVirtualPages CODE PATH
|
||||||
|
; --------------------------------------------------------------
|
||||||
|
; code blue 0 1
|
||||||
|
; code blue nonzero 3
|
||||||
|
; code non-blue 0 1
|
||||||
|
; code non-blue nonzero 1
|
||||||
|
; data blue 0 3
|
||||||
|
; data blue nonzero 3
|
||||||
|
; data non-blue 0 2
|
||||||
|
; data non-blue nonzero 2
|
||||||
|
|
||||||
|
lwz r16, KDP.VMMaxVirtualPages(r1)
|
||||||
|
cmpwi cr0, r9, ecInstPageFault
|
||||||
|
cmpwi cr1, r16, 0
|
||||||
|
mr r26, r8
|
||||||
|
bne cr0, @ESCAPE_HATCH_2_OR_3
|
||||||
|
beq cr1, @force_escape_hatch_1
|
||||||
|
bc BO_IF, EWA.kFlagBlue, @ESCAPE_HATCH_2_OR_3
|
||||||
|
@force_escape_hatch_1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ESCAPE HATCH 1: CODE FAULT OUTSIDE BLUE TASK -> AREA BACKING PROVIDER
|
||||||
|
|
||||||
|
; (also handles blue code faults IFF the never-before-seen VM regime is active)
|
||||||
|
|
||||||
|
lwz r16, Task.Flags(r31)
|
||||||
|
|
||||||
|
; Enqueue Task on its internal Semaphore (only to be released when Provider says)
|
||||||
|
addi r17, r31, Task.QueueMember
|
||||||
|
addi r18, r31, Task.PageFaultSema
|
||||||
|
stw r18, LLL.Freeform(r17)
|
||||||
|
InsertAsPrev r17, r18, scratch=r19
|
||||||
|
|
||||||
|
li r17, 1
|
||||||
|
_bset r16, r16, Task.kFlagPageFaulted
|
||||||
|
stw r17, Task.PageFaultSema + Semaphore.Value(r31)
|
||||||
|
stw r16, Task.Flags(r31)
|
||||||
|
|
||||||
|
; SRR0 points to faulting instruction. Extract the faulting page.
|
||||||
|
rlwinm r30, r30, 0, 0xFFFFF000
|
||||||
|
|
||||||
|
; Message = page address || Area ID || Task ID
|
||||||
|
lwz r27, Area.ID(r29)
|
||||||
|
lwz r28, Task.ID(r31)
|
||||||
|
stw r30, Message.Word1(r26)
|
||||||
|
stw r27, Message.Word2(r26)
|
||||||
|
stw r28, Message.Word3(r26)
|
||||||
|
|
||||||
|
; Bang
|
||||||
|
mr r30, r26
|
||||||
|
bl CauseNotification
|
||||||
|
|
||||||
|
; Success? If not, fall through to using the global blue-serviced page queue
|
||||||
|
cmpwi r8, 0
|
||||||
|
beq BlockTaskToHandleException
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ESCAPE_HATCH_2_OR_3
|
||||||
|
|
||||||
|
mfcr r28 ; only for hatch 3
|
||||||
|
li r8, Message.Size ; only for hatch 2
|
||||||
|
|
||||||
|
bc BO_IF, EWA.kFlagBlue, @ESCAPE_HATCH_3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ESCAPE HATCH 2: DATA FAULT OUTSIDE BLUE TASK -> INTO SYSTEM PAGQ FOR BLUE TO SERVICE
|
||||||
|
|
||||||
|
; Instead of banging a notification, we send a (new) message to the global Page Queue
|
||||||
|
|
||||||
|
bl PoolAlloc
|
||||||
|
mr. r26, r8
|
||||||
|
beq @oom_for_pagq_message
|
||||||
|
|
||||||
|
|
||||||
|
; Block the task in the usual way, but do *not* set Task.kFlagPageFaulted
|
||||||
|
|
||||||
|
addi r17, r31, Task.QueueMember
|
||||||
|
addi r18, r31, Task.PageFaultSema
|
||||||
|
stw r18, LLL.Freeform(r17)
|
||||||
|
InsertAsPrev r17, r18, scratch=r19
|
||||||
|
|
||||||
|
li r17, 1
|
||||||
|
stw r17, Task.PageFaultSema + Semaphore.Value(r31)
|
||||||
|
|
||||||
|
|
||||||
|
; Via the Page Queue, tell the blue task what it needs to know
|
||||||
|
|
||||||
|
lwz r27, Area.ID(r29)
|
||||||
|
lisori r8, Message.kSignature
|
||||||
|
lwz r29, Task.PageFaultSema(r31)
|
||||||
|
stw r27, Message.Word1(r26) ; arg1 = area ID
|
||||||
|
stw r29, Message.Word2(r26) ; arg2 = sempahore ID in its BlockedTasks linked list
|
||||||
|
stw r8, Message.LLL + LLL.Signature(r26)
|
||||||
|
stw r30, Message.Word3(r26) ; arg3 = page address
|
||||||
|
|
||||||
|
mr r8, r26
|
||||||
|
addi r31, r1, PSA.PageQueue
|
||||||
|
bl EnqueueMessage ; Message *r8, Queue *r31
|
||||||
|
|
||||||
|
|
||||||
|
; (Unconditionally) raise blue's priority to latency protection, and unblock it
|
||||||
|
|
||||||
|
lwz r8, PSA.BlueSpinningOn(r1) ; this guarantees that blue will always be unblocked
|
||||||
|
bl UnblockBlueIfCouldBePolling
|
||||||
|
|
||||||
|
|
||||||
|
; Block the faulting task (this releases the scheduler lock)
|
||||||
|
|
||||||
|
b BlockMPCall
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; ESCAPE HATCH 3: PAGE FAULT IN BLUE TASK -> 68K INTERRUPT
|
||||||
|
|
||||||
|
; All faults that occur in the blue task, except inst faults when the ?? VM regime is enabled
|
||||||
|
|
||||||
|
@ESCAPE_HATCH_3
|
||||||
|
|
||||||
|
; Let the blue task keep running!
|
||||||
|
mr r8, r31
|
||||||
|
bl SchRdyTaskNow
|
||||||
|
|
||||||
|
; The other pathways release the Sch lock in BlockMPCall
|
||||||
|
_AssertAndRelease PSA.SchLock, scratch=r31
|
||||||
|
|
||||||
|
; Restore CR (got clobbered by SchRdyTaskNow?)
|
||||||
|
|
||||||
|
; Do the LowSaves help the Emulator do an interrupt?
|
||||||
|
mtcr r28
|
||||||
|
bc BO_IF_NOT, EWA.kFlagLowSaves, @nolo
|
||||||
|
lwz r8, 0x0064(r6)
|
||||||
|
lwz r9, 0x0068(r6)
|
||||||
|
stw r8, 0x0024(r6)
|
||||||
|
stw r9, 0x0028(r6)
|
||||||
|
lwz r8, 0x006c(r6)
|
||||||
|
lwz r9, ContextBlock.SRR0(r6)
|
||||||
|
stw r8, 0x002c(r6)
|
||||||
|
stw r9, 0x0034(r6)
|
||||||
|
lwz r8, 0x007c(r6)
|
||||||
|
stw r8, 0x003c(r6)
|
||||||
|
crclr EWA.kFlagLowSaves
|
||||||
|
@nolo
|
||||||
|
|
||||||
|
bl SchRestoreStartingAtR14
|
||||||
|
|
||||||
|
; Central to the Mac OS architecture: a 68k interrupt!
|
||||||
|
b IntReturnToSystemContext
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; This seems like an awfully calm way to handle a page fault.
|
||||||
|
|
||||||
|
@oom_for_pagq_message
|
||||||
|
|
||||||
|
li r16, Task.kNominalPriority
|
||||||
|
stb r16, Task.Priority(r31)
|
||||||
|
mr r8, r31
|
||||||
|
bl SchRdyTaskNow
|
||||||
|
bl FlagSchEval
|
||||||
|
b BlockMPCall
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; For tasks that were created with kMPCreateTaskTakesAllExceptionsMask
|
||||||
|
|
||||||
|
_PageFaultToDebugger
|
||||||
|
|
||||||
|
b ThrowTaskToDebugger
|
176
NanoKernel/NKFloatInts.s
Normal file
176
NanoKernel/NKFloatInts.s
Normal file
|
@ -0,0 +1,176 @@
|
||||||
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
|
; IMPORTS:
|
||||||
|
; NKTranslation
|
||||||
|
; FDP_003c
|
||||||
|
; FDP_0DA0
|
||||||
|
; EXPORTS:
|
||||||
|
; FloatLoadJumpTable (=> NKTranslation)
|
||||||
|
; FloatSaveJumpTable (=> NKTranslation)
|
||||||
|
; IntFPUnavail (=> NKInit)
|
||||||
|
; IntHandleSpecialFPException (=> NKExceptions, NKRTASCalls)
|
||||||
|
; bugger_around_with_floats (=> NKExceptions, NKRTASCalls)
|
||||||
|
; major_0x03e18 (=> NKIntHandlers)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### ####### ###### # #
|
||||||
|
# # # ##### # # # # # # # ## # # ## # #
|
||||||
|
# ## # # # # # # # ## # # # # # # # # #
|
||||||
|
# # # # # ##### ###### # # # # # # # # # # # # #
|
||||||
|
# # # # # # # # # # # # ###### # # ###### # #
|
||||||
|
# # ## # # # # # # ## # # # # # # # #
|
||||||
|
### # # # # # ##### # # # # ## # # # ######
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
IntFPUnavail ; OUTSIDE REFERER
|
||||||
|
mfsprg r1, 0
|
||||||
|
stw r11, -0x0290(r1)
|
||||||
|
stw r6, -0x028c(r1)
|
||||||
|
lwz r6, -0x0004(r1)
|
||||||
|
lwz r11, 0x0e88(r6)
|
||||||
|
addi r11, r11, 0x01
|
||||||
|
stw r11, 0x0e88(r6)
|
||||||
|
mfspr r11, srr1
|
||||||
|
ori r11, r11, 0x2000
|
||||||
|
mtspr srr1, r11
|
||||||
|
mfmsr r11
|
||||||
|
ori r11, r11, 0x2000
|
||||||
|
lwz r6, -0x0014(r1)
|
||||||
|
mtmsr r11
|
||||||
|
isync
|
||||||
|
bl LoadFloatsFromContextBlock
|
||||||
|
lwz r11, -0x0290(r1)
|
||||||
|
lwz r6, -0x028c(r1)
|
||||||
|
mfsprg r1, 2
|
||||||
|
mtlr r1
|
||||||
|
mfsprg r1, 1
|
||||||
|
rfi
|
||||||
|
dcb.b 32, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
major_0x03e18 ; OUTSIDE REFERER
|
||||||
|
rlwinm. r8, r11, 0, 18, 18
|
||||||
|
bnelr
|
||||||
|
|
||||||
|
IntHandleSpecialFPException ; OUTSIDE REFERER
|
||||||
|
lwz r8, 0x00e4(r6)
|
||||||
|
rlwinm. r8, r8, 1, 0, 0
|
||||||
|
mfmsr r8
|
||||||
|
ori r8, r8, 0x2000
|
||||||
|
beqlr
|
||||||
|
mtmsr r8
|
||||||
|
isync
|
||||||
|
ori r11, r11, 0x2000
|
||||||
|
|
||||||
|
LoadFloatsFromContextBlock ; OUTSIDE REFERER
|
||||||
|
lfd f31, 0x00e0(r6)
|
||||||
|
lfd f0, 0x0200(r6)
|
||||||
|
lfd f1, 0x0208(r6)
|
||||||
|
lfd f2, 0x0210(r6)
|
||||||
|
lfd f3, 0x0218(r6)
|
||||||
|
lfd f4, 0x0220(r6)
|
||||||
|
lfd f5, 0x0228(r6)
|
||||||
|
lfd f6, 0x0230(r6)
|
||||||
|
lfd f7, 0x0238(r6)
|
||||||
|
mtfsf 0xff, f31
|
||||||
|
lfd f8, 0x0240(r6)
|
||||||
|
lfd f9, 0x0248(r6)
|
||||||
|
lfd f10, 0x0250(r6)
|
||||||
|
lfd f11, 0x0258(r6)
|
||||||
|
lfd f12, 0x0260(r6)
|
||||||
|
lfd f13, 0x0268(r6)
|
||||||
|
lfd f14, 0x0270(r6)
|
||||||
|
lfd f15, 0x0278(r6)
|
||||||
|
lfd f16, 0x0280(r6)
|
||||||
|
lfd f17, 0x0288(r6)
|
||||||
|
lfd f18, 0x0290(r6)
|
||||||
|
lfd f19, 0x0298(r6)
|
||||||
|
lfd f20, 0x02a0(r6)
|
||||||
|
lfd f21, 0x02a8(r6)
|
||||||
|
lfd f22, 0x02b0(r6)
|
||||||
|
lfd f23, 0x02b8(r6)
|
||||||
|
lfd f24, 0x02c0(r6)
|
||||||
|
lfd f25, 0x02c8(r6)
|
||||||
|
lfd f26, 0x02d0(r6)
|
||||||
|
lfd f27, 0x02d8(r6)
|
||||||
|
lfd f28, 0x02e0(r6)
|
||||||
|
lfd f29, 0x02e8(r6)
|
||||||
|
lfd f30, 0x02f0(r6)
|
||||||
|
lfd f31, 0x02f8(r6)
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bugger_around_with_floats ; OUTSIDE REFERER
|
||||||
|
mfmsr r8
|
||||||
|
ori r8, r8, 0x2000
|
||||||
|
mtmsr r8
|
||||||
|
isync
|
||||||
|
_bclr r11, r11, 18
|
||||||
|
stfd f0, 0x0200(r6)
|
||||||
|
stfd f1, 0x0208(r6)
|
||||||
|
stfd f2, 0x0210(r6)
|
||||||
|
stfd f3, 0x0218(r6)
|
||||||
|
stfd f4, 0x0220(r6)
|
||||||
|
stfd f5, 0x0228(r6)
|
||||||
|
stfd f6, 0x0230(r6)
|
||||||
|
stfd f7, 0x0238(r6)
|
||||||
|
stfd f8, 0x0240(r6)
|
||||||
|
stfd f9, 0x0248(r6)
|
||||||
|
stfd f10, 0x0250(r6)
|
||||||
|
stfd f11, 0x0258(r6)
|
||||||
|
stfd f12, 0x0260(r6)
|
||||||
|
stfd f13, 0x0268(r6)
|
||||||
|
stfd f14, 0x0270(r6)
|
||||||
|
stfd f15, 0x0278(r6)
|
||||||
|
stfd f16, 0x0280(r6)
|
||||||
|
stfd f17, 0x0288(r6)
|
||||||
|
stfd f18, 0x0290(r6)
|
||||||
|
stfd f19, 0x0298(r6)
|
||||||
|
stfd f20, 0x02a0(r6)
|
||||||
|
stfd f21, 0x02a8(r6)
|
||||||
|
stfd f22, 0x02b0(r6)
|
||||||
|
stfd f23, 0x02b8(r6)
|
||||||
|
mffs f0
|
||||||
|
stfd f24, 0x02c0(r6)
|
||||||
|
stfd f25, 0x02c8(r6)
|
||||||
|
stfd f26, 0x02d0(r6)
|
||||||
|
stfd f27, 0x02d8(r6)
|
||||||
|
stfd f28, 0x02e0(r6)
|
||||||
|
stfd f29, 0x02e8(r6)
|
||||||
|
stfd f30, 0x02f0(r6)
|
||||||
|
stfd f31, 0x02f8(r6)
|
||||||
|
stfd f0, 0x00e0(r6)
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; indexed emulation code, mofo
|
||||||
|
|
||||||
|
;two instructions per load-store register
|
||||||
|
|
||||||
|
macro
|
||||||
|
CreateFloatJumpTable &opcode, &dest, &highest==31
|
||||||
|
|
||||||
|
if &highest > 0
|
||||||
|
CreateFloatJumpTable &opcode, &dest, highest = (&highest) - 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
&opcode (&highest), -0x2e0(r1)
|
||||||
|
b &dest
|
||||||
|
|
||||||
|
endm
|
||||||
|
|
||||||
|
|
||||||
|
FloatLoadJumpTable
|
||||||
|
CreateFloatJumpTable lfd, FDP_0da0
|
||||||
|
|
||||||
|
|
||||||
|
FloatSaveJumpTable
|
||||||
|
CreateFloatJumpTable stfd, FDP_003c
|
|
@ -26,7 +26,7 @@
|
||||||
; DeleteID (=> NKAddressSpaces, NKMPCalls, NKSync, NKTasks, NKTimers)
|
; DeleteID (=> NKAddressSpaces, NKMPCalls, NKSync, NKTasks, NKTimers)
|
||||||
; GetNextIDOfClass (=> NKAddressSpaces, NKMPCalls, NKThud)
|
; GetNextIDOfClass (=> NKAddressSpaces, NKMPCalls, NKThud)
|
||||||
; InitIDIndex (=> NKInit)
|
; InitIDIndex (=> NKInit)
|
||||||
; LookupID (=> NKAddressSpaces, NKInterrupts, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKThud, NKTimers)
|
; LookupID (=> NKAddressSpaces, NKExceptions, NKIntMisc, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKThud, NKTimers)
|
||||||
; MakeID (=> NKAddressSpaces, NKInit, NKMPCalls, NKSync, NKTasks)
|
; MakeID (=> NKAddressSpaces, NKInit, NKMPCalls, NKSync, NKTasks)
|
||||||
;_______________________________________________________________________
|
;_______________________________________________________________________
|
||||||
|
|
||||||
|
|
|
@ -54,31 +54,33 @@
|
||||||
; printc
|
; printc
|
||||||
; printd
|
; printd
|
||||||
; printw
|
; printw
|
||||||
|
; NKFloatInts
|
||||||
|
; IntFPUnavail
|
||||||
; NKIndex
|
; NKIndex
|
||||||
; InitIDIndex
|
; InitIDIndex
|
||||||
; MakeID
|
; MakeID
|
||||||
; NKInterrupts
|
; NKIntHandlers
|
||||||
; HandlePerfMonitorInt
|
|
||||||
; IgnoreSoftwareInt
|
|
||||||
; IntAlignment
|
; IntAlignment
|
||||||
; IntDSI
|
; IntDSI
|
||||||
; IntDecrementer
|
; IntDecrementer
|
||||||
; IntExternalAlternate
|
|
||||||
; IntExternalSystem
|
|
||||||
; IntFPUnavail
|
|
||||||
; IntISI
|
; IntISI
|
||||||
; IntMachineCheck
|
; IntMachineCheck
|
||||||
|
; MemRetryDSI
|
||||||
|
; MemRetryMachineCheck
|
||||||
|
; PIHDSI
|
||||||
|
; kcReturnFromException
|
||||||
|
; NKIntMisc
|
||||||
|
; HandlePerfMonitorInt
|
||||||
|
; IgnoreSoftwareInt
|
||||||
|
; IntExternalAlternate
|
||||||
|
; IntExternalSystem
|
||||||
; IntPerfMonitor
|
; IntPerfMonitor
|
||||||
; IntProgram
|
; IntProgram
|
||||||
; IntSyscall
|
; IntSyscall
|
||||||
; IntThermalEvent
|
; IntThermalEvent
|
||||||
; IntTrace
|
; IntTrace
|
||||||
; MemRetryDSI
|
|
||||||
; MemRetryMachineCheck
|
|
||||||
; PIHDSI
|
|
||||||
; kcPrioritizeInterrupts
|
; kcPrioritizeInterrupts
|
||||||
; kcResetSystem
|
; kcResetSystem
|
||||||
; kcReturnFromException
|
|
||||||
; kcRunAlternateContext
|
; kcRunAlternateContext
|
||||||
; kcThud
|
; kcThud
|
||||||
; major_0x046d0
|
; major_0x046d0
|
||||||
|
@ -130,7 +132,7 @@
|
||||||
; FinishInitBuiltin (=> NKBuiltinInit)
|
; FinishInitBuiltin (=> NKBuiltinInit)
|
||||||
; InitHighLevel (=> NKReplacementInit)
|
; InitHighLevel (=> NKReplacementInit)
|
||||||
; InitIRP (=> NKBuiltinInit, NKReplacementInit)
|
; InitIRP (=> NKBuiltinInit, NKReplacementInit)
|
||||||
; ResetBuiltinKernel (=> NKInterrupts)
|
; ResetBuiltinKernel (=> NKIntMisc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
934
NanoKernel/NKIntHandlers.s
Normal file
934
NanoKernel/NKIntHandlers.s
Normal file
|
@ -0,0 +1,934 @@
|
||||||
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
|
; IMPORTS:
|
||||||
|
; NKAddressSpaces
|
||||||
|
; FindAreaAbove
|
||||||
|
; SpaceGetPagePLE
|
||||||
|
; SpaceL2PUsingBATs
|
||||||
|
; NKCache
|
||||||
|
; FlushL1CacheUsingMSSCR0
|
||||||
|
; NKConsoleLog
|
||||||
|
; printw
|
||||||
|
; NKExceptions
|
||||||
|
; Exception
|
||||||
|
; ExceptionMemRetried
|
||||||
|
; IntReturn
|
||||||
|
; IntReturnToSystemContext
|
||||||
|
; NKFloatInts
|
||||||
|
; major_0x03e18
|
||||||
|
; NKIntMisc
|
||||||
|
; IntReturnFromSIGP
|
||||||
|
; NKPaging
|
||||||
|
; PagingFunc1
|
||||||
|
; PagingL2PWithBATs
|
||||||
|
; NKScheduler
|
||||||
|
; SchFiddlePriorityShifty
|
||||||
|
; SchRestoreStartingAtR14
|
||||||
|
; SchSaveStartingAtR14
|
||||||
|
; NKTimers
|
||||||
|
; TimerDispatch
|
||||||
|
; NKTranslation
|
||||||
|
; FDP_0DA0
|
||||||
|
; EXPORTS:
|
||||||
|
; IntAlignment (=> NKInit)
|
||||||
|
; IntDSI (=> NKInit)
|
||||||
|
; IntDecrementer (=> NKInit)
|
||||||
|
; IntISI (=> NKInit)
|
||||||
|
; IntMachineCheck (=> NKInit)
|
||||||
|
; LoadInterruptRegisters (=> NKIntMisc, NKTranslation)
|
||||||
|
; MaskedInterruptTaken (=> NKIntMisc)
|
||||||
|
; MemRetryDSI (=> NKInit)
|
||||||
|
; MemRetryMachineCheck (=> NKInit)
|
||||||
|
; PIHDSI (=> NKInit)
|
||||||
|
; kcReturnFromException (=> NKInit)
|
||||||
|
; major_0x03324 (=> NKTranslation)
|
||||||
|
; major_0x03548 (=> NKTranslation)
|
||||||
|
; save_all_registers (=> NKIntMisc)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
IntDecrementer ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
bl LoadInterruptRegisters
|
||||||
|
|
||||||
|
lwz r8, KDP.OldKDP(r1)
|
||||||
|
rlwinm. r9, r11, 0, 16, 16
|
||||||
|
cmpwi cr1, r8, 0x00
|
||||||
|
beq MaskedInterruptTaken
|
||||||
|
beq cr1, IntDecrementer_0x54
|
||||||
|
|
||||||
|
stw r16, ContextBlock.r16(r6)
|
||||||
|
stw r17, ContextBlock.r17(r6)
|
||||||
|
stw r18, ContextBlock.r18(r6)
|
||||||
|
stw r25, ContextBlock.r25(r6)
|
||||||
|
|
||||||
|
bl SchFiddlePriorityShifty
|
||||||
|
ble IntDecrementer_0x48
|
||||||
|
|
||||||
|
lwz r8, PSA.CriticalReadyQ + ReadyQueue.Timecake + 4(r1)
|
||||||
|
mtspr dec, r8
|
||||||
|
|
||||||
|
lwz r16, ContextBlock.r16(r6)
|
||||||
|
lwz r17, ContextBlock.r17(r6)
|
||||||
|
lwz r18, ContextBlock.r18(r6)
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
IntDecrementer_0x48
|
||||||
|
lwz r16, 0x0184(r6)
|
||||||
|
lwz r17, 0x018c(r6)
|
||||||
|
lwz r18, 0x0194(r6)
|
||||||
|
|
||||||
|
IntDecrementer_0x54
|
||||||
|
; r6 = ewa
|
||||||
|
bl SchSaveStartingAtR14
|
||||||
|
; r8 = sprg0 (not used by me)
|
||||||
|
|
||||||
|
|
||||||
|
_Lock PSA.SchLock, scratch1=r8, scratch2=r9
|
||||||
|
|
||||||
|
lwz r8, 0x0e8c(r1)
|
||||||
|
addi r8, r8, 0x01
|
||||||
|
stw r8, 0x0e8c(r1)
|
||||||
|
bl TimerDispatch
|
||||||
|
_AssertAndRelease PSA.SchLock, scratch=r8
|
||||||
|
|
||||||
|
bl SchRestoreStartingAtR14
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### ###### ##### ###
|
||||||
|
# # # ##### # # # # #
|
||||||
|
# ## # # # # # #
|
||||||
|
# # # # # # # ##### #
|
||||||
|
# # # # # # # # #
|
||||||
|
# # ## # # # # # #
|
||||||
|
### # # # ###### ##### ###
|
||||||
|
|
||||||
|
; Kick it to the FDP-associated MemRetryDSI
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
IntDSI
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
stmw r2, EWA.r2(r1)
|
||||||
|
mfsprg r11, 1
|
||||||
|
|
||||||
|
stw r0, EWA.r0(r1)
|
||||||
|
stw r11, EWA.r1(r1) ; Why?
|
||||||
|
|
||||||
|
li r0, 0
|
||||||
|
|
||||||
|
mfspr r10, srr0
|
||||||
|
mfspr r11, srr1
|
||||||
|
mfsprg r12, 2
|
||||||
|
mfcr r13
|
||||||
|
mfsprg r24, 3
|
||||||
|
|
||||||
|
lwz r16, EWA.Flags(r1)
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
|
||||||
|
mfspr r26, dsisr
|
||||||
|
|
||||||
|
; Activate the Translation vecTable, and test DSISR bit 5
|
||||||
|
; ("Set if the access is due to a lwarx, ldarx, stwcx., or stdcx.
|
||||||
|
; instruction that addresses memory that is Write Through
|
||||||
|
; Required or Caching Inhibited; otherwise cleared")
|
||||||
|
addi r23, r1, KDP.VecBaseMemRetry
|
||||||
|
andis. r28, r26, 0x400 ; test bit 5 (see cmt above)
|
||||||
|
mtsprg 3, r23
|
||||||
|
|
||||||
|
mfmsr r14
|
||||||
|
bne HandleDSIDueToIllegalSyncPrimitive
|
||||||
|
|
||||||
|
_bset r15, r14, 27 ; temp set MSR[DR]
|
||||||
|
mtmsr r15
|
||||||
|
isync
|
||||||
|
|
||||||
|
lwz r27, 0(r10) ; get instruction (should be fine!)
|
||||||
|
|
||||||
|
mtmsr r14 ; restore MSR
|
||||||
|
isync
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
major_0x03324 ; OUTSIDE REFERER
|
||||||
|
rlwinm. r18, r27, 18, 25, 29
|
||||||
|
lwz r25, 0x0650(r1)
|
||||||
|
li r21, 0x00
|
||||||
|
mfsprg r1, 0
|
||||||
|
beq major_0x03324_0x18
|
||||||
|
lwzx r18, r1, r18
|
||||||
|
|
||||||
|
major_0x03324_0x18
|
||||||
|
andis. r26, r27, 0xec00
|
||||||
|
lwz r16, EWA.Flags(r1)
|
||||||
|
rlwinm r17, r27, 0, 6, 15
|
||||||
|
rlwimi r16, r16, 27, 26, 26
|
||||||
|
bge major_0x03324_0x58
|
||||||
|
rlwimi r25, r27, 7, 26, 29
|
||||||
|
rlwimi r25, r27, 12, 25, 25
|
||||||
|
lwz r26, 0x0b80(r25)
|
||||||
|
extsh r23, r27
|
||||||
|
rlwimi r25, r26, 26, 22, 29
|
||||||
|
mtlr r25
|
||||||
|
mtcr r26
|
||||||
|
add r18, r18, r23
|
||||||
|
crclr cr5_so
|
||||||
|
rlwimi r17, r26, 6, 26, 5
|
||||||
|
blr
|
||||||
|
|
||||||
|
major_0x03324_0x58
|
||||||
|
rlwimi r25, r27, 27, 26, 29
|
||||||
|
rlwimi r25, r27, 0, 25, 25
|
||||||
|
rlwimi r25, r27, 6, 23, 24
|
||||||
|
rlwimi r25, r27, 4, 22, 22
|
||||||
|
lwz r26, 0x0800(r25)
|
||||||
|
rlwinm r23, r27, 23, 25, 29
|
||||||
|
rlwimi r25, r26, 26, 22, 29
|
||||||
|
mtlr r25
|
||||||
|
mtcr r26
|
||||||
|
lwzx r23, r1, r23
|
||||||
|
crclr cr5_so
|
||||||
|
rlwimi r17, r26, 6, 26, 5
|
||||||
|
add r18, r18, r23
|
||||||
|
bclr BO_IF_NOT, 13
|
||||||
|
neg r23, r23
|
||||||
|
add r18, r18, r23
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HandleDSIDueToIllegalSyncPrimitive ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
ori r15, r14, 0x10
|
||||||
|
mr r28, r16
|
||||||
|
mfspr r18, dar
|
||||||
|
mfspr r19, dsisr
|
||||||
|
mtmsr r15
|
||||||
|
isync
|
||||||
|
lwz r27, 0x0000(r10)
|
||||||
|
mtmsr r14
|
||||||
|
isync
|
||||||
|
mtsprg 3, r24
|
||||||
|
lwz r1, -0x0004(r1)
|
||||||
|
mr r31, r19
|
||||||
|
mr r8, r18
|
||||||
|
li r9, 0x00
|
||||||
|
bl SpaceL2PUsingBATs ; LogicalPage *r8, MPAddressSpace *r9 // PhysicalPage *r17
|
||||||
|
mr r16, r28
|
||||||
|
crset cr3_so
|
||||||
|
mfsprg r1, 0
|
||||||
|
beq major_0x03324_0x12c
|
||||||
|
mr r18, r8
|
||||||
|
rlwinm r28, r27, 13, 25, 29
|
||||||
|
andis. r9, r31, 0x200
|
||||||
|
rlwimi r18, r17, 0, 0, 19
|
||||||
|
beq major_0x03324_0x118
|
||||||
|
lwzx r31, r1, r28
|
||||||
|
stwcx. r31, 0, r18
|
||||||
|
sync
|
||||||
|
dcbf 0, r18
|
||||||
|
mfcr r31
|
||||||
|
rlwimi r13, r31, 0, 0, 3
|
||||||
|
b FDP_0da0
|
||||||
|
|
||||||
|
major_0x03324_0x118
|
||||||
|
lwarx r31, 0, r18
|
||||||
|
sync
|
||||||
|
dcbf 0, r18
|
||||||
|
stwx r31, r1, r28
|
||||||
|
b FDP_0da0
|
||||||
|
|
||||||
|
major_0x03324_0x12c
|
||||||
|
subi r10, r10, 4
|
||||||
|
b FDP_0da0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; This int handler is our best foothold into the FDP!
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
IntAlignment ; OUTSIDE REFERER
|
||||||
|
mfsprg r1, 0
|
||||||
|
stmw r2, 0x0008(r1)
|
||||||
|
mfsprg r11, 1
|
||||||
|
stw r0, 0x0000(r1)
|
||||||
|
stw r11, 0x0004(r1)
|
||||||
|
li r0, 0x00
|
||||||
|
|
||||||
|
lwz r11, EWA.PA_CurTask(r1)
|
||||||
|
lwz r16, EWA.Flags(r1)
|
||||||
|
lwz r21, Task.Flags(r11)
|
||||||
|
lwz r1, -0x0004(r1) ; wha???
|
||||||
|
|
||||||
|
lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.MisalignmentCount(r1)
|
||||||
|
addi r11, r11, 1
|
||||||
|
stw r11, KDP.NanoKernelInfo + NKNanoKernelInfo.MisalignmentCount(r1)
|
||||||
|
|
||||||
|
mfspr r10, srr0
|
||||||
|
mfspr r11, srr1
|
||||||
|
mfsprg r12, 2
|
||||||
|
mfcr r13
|
||||||
|
mfsprg r24, 3
|
||||||
|
mfspr r27, dsisr
|
||||||
|
mfspr r18, dar
|
||||||
|
|
||||||
|
rlwinm. r21, r21, 0, Task.kFlagTakesAllExceptions, Task.kFlagTakesAllExceptions
|
||||||
|
|
||||||
|
addi r23, r1, KDP.VecBaseMemRetry
|
||||||
|
|
||||||
|
bne major_0x03548_0x20
|
||||||
|
|
||||||
|
; DSISR for misaligned X-form instruction:
|
||||||
|
|
||||||
|
; (0) 0 (14)||(15) 29:30 (16)||(17) 25 (17)||(18) 21:24 (21)||(22) rD (26)||(27) rA? (31)
|
||||||
|
|
||||||
|
; DSISR for misaligned D-form instruction:
|
||||||
|
|
||||||
|
; (0) zero (16)||(17) 5 (17)||(18) 1:4 (21)||(22) rD (26)||(27) rA? (31)
|
||||||
|
|
||||||
|
FDP_TableBase equ 0xa00
|
||||||
|
|
||||||
|
; Virtual PC might put the thing in MSR_LE mode
|
||||||
|
rlwinm. r21, r11, 0, MSR_LEbit, MSR_LEbit ; msr bits in srr1
|
||||||
|
|
||||||
|
; Get the FDP and F.O. if we were in MSR_LE mode
|
||||||
|
lwz r25, KDP.PA_FDP(r1)
|
||||||
|
bne major_0x03548_0x20
|
||||||
|
|
||||||
|
|
||||||
|
rlwinm. r21, r27, 17, 30, 31 ; evaluate hi two bits of XO (or 0 for d-form?)
|
||||||
|
|
||||||
|
rlwinm r17, r27, 16, 6, 15 ; save src and dest register indices in r17
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
|
||||||
|
rlwimi r25, r27, 24, 23, 29 ; add constant fields from dsisr (*4) to FDP
|
||||||
|
|
||||||
|
|
||||||
|
rlwimi r16, r16, 27, 26, 26 ; AllCpuFeatures: copy bit 21 to bit 26
|
||||||
|
|
||||||
|
bne @regidx
|
||||||
|
|
||||||
|
; D-form (immediate-indexed) instruction
|
||||||
|
lwz r26, FDP_TableBase + 4*(0x40 + 0x20)(r25) ; use upper quarter of table
|
||||||
|
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
|
||||||
|
ori r15, r14, 0x10
|
||||||
|
mtcr r26
|
||||||
|
rlwimi r17, r26, 6, 26, 5 ; wrap some shite around the register values
|
||||||
|
crclr cr5_so
|
||||||
|
blr
|
||||||
|
|
||||||
|
@regidx
|
||||||
|
; X-form (register-indexed) instruction
|
||||||
|
lwz r26, FDP_TableBase(r25)
|
||||||
|
mfmsr r14
|
||||||
|
mtsprg 3, r23
|
||||||
|
rlwimi r25, r26, 26, 22, 29
|
||||||
|
mtlr r25
|
||||||
|
ori r15, r14, 0x10
|
||||||
|
mtcr r26
|
||||||
|
rlwimi r17, r26, 6, 26, 5
|
||||||
|
crclr 23 ; unset bit 23 = cr5_so
|
||||||
|
bclr BO_IF_NOT, 12 ; jump now if bit 12 is off
|
||||||
|
|
||||||
|
; if bit 12 was on, turn on paging and fetch the offending insn
|
||||||
|
; and also activate the Translation vector table
|
||||||
|
mtmsr r15
|
||||||
|
isync
|
||||||
|
lwz r27, 0x0000(r10)
|
||||||
|
mtmsr r14
|
||||||
|
isync
|
||||||
|
mtsprg 3, r24
|
||||||
|
blr
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
major_0x03548 ; OUTSIDE REFERER
|
||||||
|
sync
|
||||||
|
mtmsr r14
|
||||||
|
isync
|
||||||
|
mflr r23
|
||||||
|
icbi 0, r23
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
blr
|
||||||
|
|
||||||
|
major_0x03548_0x20 ; OUTSIDE REFERER
|
||||||
|
li r8, 0x00
|
||||||
|
lis r17, -0x100
|
||||||
|
mtcr r8
|
||||||
|
mr r19, r18
|
||||||
|
rlwimi r17, r27, 7, 31, 31
|
||||||
|
xori r17, r17, 0x01
|
||||||
|
li r8, ecUnknown24
|
||||||
|
b ExceptionMemRetried
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
MemRetryDSI ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
mfsprg r1, 0
|
||||||
|
mfspr r31, dsisr
|
||||||
|
mfspr r27, dar
|
||||||
|
andis. r28, r31, 0xc030
|
||||||
|
lwz r1, -0x0004(r1)
|
||||||
|
bne MemRetryDSI_0x1c8
|
||||||
|
mfspr r30, srr1
|
||||||
|
andi. r28, r30, 0x4000
|
||||||
|
mfsprg r30, 0
|
||||||
|
beq MemRetryDSI_0x100
|
||||||
|
stw r8, -0x00e0(r30)
|
||||||
|
stw r9, -0x00dc(r30)
|
||||||
|
mfcr r8
|
||||||
|
stw r16, -0x00d8(r30)
|
||||||
|
stw r17, -0x00d4(r30)
|
||||||
|
stw r18, -0x00d0(r30)
|
||||||
|
stw r19, -0x00cc(r30)
|
||||||
|
stw r8, -0x00c8(r30)
|
||||||
|
lwz r8, -0x001c(r30)
|
||||||
|
mr r9, r27
|
||||||
|
bl FindAreaAbove
|
||||||
|
lwz r16, 0x0024(r8)
|
||||||
|
lwz r17, 0x0028(r8)
|
||||||
|
cmplw r27, r16
|
||||||
|
cmplw cr7, r27, r17
|
||||||
|
blt MemRetryDSI_0xe0
|
||||||
|
bgt cr7, MemRetryDSI_0xe0
|
||||||
|
mr r31, r8
|
||||||
|
mr r8, r27
|
||||||
|
bl SpaceGetPagePLE ; LogicalPage *r8, Area *r31 // PLE *r30, notfound cr0.eq
|
||||||
|
beq MemRetryDSI_0xe0
|
||||||
|
lwz r8, 0x0000(r30)
|
||||||
|
lwz r16, 0x0098(r31)
|
||||||
|
rlwinm r28, r8, 0, 29, 30
|
||||||
|
cmpwi cr7, r28, 0x04
|
||||||
|
cmpwi r28, 0x02
|
||||||
|
beq cr7, MemRetryDSI_0xe0
|
||||||
|
beq MemRetryDSI_0xe0
|
||||||
|
|
||||||
|
MemRetryDSI_0x98
|
||||||
|
addi r17, r31, 0x90
|
||||||
|
cmpw r16, r17
|
||||||
|
addi r17, r16, 0x14
|
||||||
|
beq MemRetryDSI_0x158
|
||||||
|
lwz r9, 0x0010(r16)
|
||||||
|
add r9, r9, r17
|
||||||
|
|
||||||
|
MemRetryDSI_0xb0
|
||||||
|
lwz r18, 0x0000(r17)
|
||||||
|
cmplw cr7, r17, r9
|
||||||
|
lwz r19, 0x0004(r17)
|
||||||
|
bgt cr7, MemRetryDSI_0xd8
|
||||||
|
cmplw r27, r18
|
||||||
|
cmplw cr7, r27, r19
|
||||||
|
blt MemRetryDSI_0xd0
|
||||||
|
ble cr7, MemRetryDSI_0xe0
|
||||||
|
|
||||||
|
MemRetryDSI_0xd0
|
||||||
|
addi r17, r17, 0x08
|
||||||
|
b MemRetryDSI_0xb0
|
||||||
|
|
||||||
|
MemRetryDSI_0xd8
|
||||||
|
lwz r16, 0x0008(r16)
|
||||||
|
b MemRetryDSI_0x98
|
||||||
|
|
||||||
|
MemRetryDSI_0xe0
|
||||||
|
mfsprg r30, 0
|
||||||
|
mfspr r31, dsisr
|
||||||
|
lwz r8, -0x00e0(r30)
|
||||||
|
lwz r9, -0x00dc(r30)
|
||||||
|
lwz r16, -0x00d8(r30)
|
||||||
|
lwz r17, -0x00d4(r30)
|
||||||
|
lwz r18, -0x00d0(r30)
|
||||||
|
lwz r19, -0x00cc(r30)
|
||||||
|
|
||||||
|
MemRetryDSI_0x100
|
||||||
|
andis. r28, r31, 0x800
|
||||||
|
addi r29, r1, KDP.BATs + 0xa0
|
||||||
|
bnel PagingL2PWithBATs
|
||||||
|
li r28, 0x43
|
||||||
|
and r28, r31, r28
|
||||||
|
cmpwi cr7, r28, 0x43
|
||||||
|
beql IntPanicIsland
|
||||||
|
mfsprg r28, 2
|
||||||
|
mtlr r28
|
||||||
|
bne cr7, MemRetryDSI_0x144
|
||||||
|
mfspr r28, srr0
|
||||||
|
addi r28, r28, 0x04
|
||||||
|
lwz r26, 0x0e90(r1)
|
||||||
|
mtspr srr0, r28
|
||||||
|
addi r26, r26, 0x01
|
||||||
|
stw r26, 0x0e90(r1)
|
||||||
|
b MemRetryDSI_0x19c
|
||||||
|
|
||||||
|
MemRetryDSI_0x144
|
||||||
|
andi. r28, r31, 0x03
|
||||||
|
li r8, ecDataSupAccessViolation
|
||||||
|
beq ExceptionMemRetried
|
||||||
|
li r8, ecDataWriteViolation
|
||||||
|
b ExceptionMemRetried
|
||||||
|
|
||||||
|
MemRetryDSI_0x158
|
||||||
|
mfsprg r30, 0
|
||||||
|
lwz r16, 0x0f00(r1)
|
||||||
|
lwz r8, -0x00c8(r30)
|
||||||
|
addi r16, r16, 0x01
|
||||||
|
mtcr r8
|
||||||
|
lwz r9, -0x00dc(r30)
|
||||||
|
stw r16, 0x0f00(r1)
|
||||||
|
lwz r16, -0x00d8(r30)
|
||||||
|
lwz r17, -0x00d4(r30)
|
||||||
|
lwz r18, -0x00d0(r30)
|
||||||
|
lwz r19, -0x00cc(r30)
|
||||||
|
lwz r8, -0x00e0(r30)
|
||||||
|
mfspr r29, srr1
|
||||||
|
mfsprg r28, 2
|
||||||
|
_bclr r29, r29, 17
|
||||||
|
mtlr r28
|
||||||
|
mtspr srr1, r29
|
||||||
|
|
||||||
|
MemRetryDSI_0x19c
|
||||||
|
mfsprg r1, 1
|
||||||
|
rlwinm r26, r25, 30, 24, 31
|
||||||
|
rfi
|
||||||
|
dcb.b 32, 0
|
||||||
|
|
||||||
|
|
||||||
|
MemRetryDSI_0x1c8
|
||||||
|
andis. r28, r31, 0x8010
|
||||||
|
bne MemRetryMachineCheck_0x14c
|
||||||
|
|
||||||
|
_Lock PSA.HTABLock, scratch1=r28, scratch2=r31
|
||||||
|
|
||||||
|
bl PagingFunc1
|
||||||
|
_AssertAndRelease PSA.HTABLock, scratch=r28
|
||||||
|
mfsprg r28, 2
|
||||||
|
mtlr r28
|
||||||
|
beq MemRetryDSI_0x19c
|
||||||
|
li r8, ecDataInvalidAddress
|
||||||
|
bge ExceptionMemRetried
|
||||||
|
li r8, ecDataPageFault
|
||||||
|
b ExceptionMemRetried
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MemRetryMachineCheck ; OUTSIDE REFERER
|
||||||
|
mfsprg r1, 0
|
||||||
|
mr r28, r8
|
||||||
|
|
||||||
|
lwz r27, EWA.CPUBase + CPU.ID(r1)
|
||||||
|
_log 'CPU '
|
||||||
|
mr r8, r27
|
||||||
|
bl Printw
|
||||||
|
|
||||||
|
_log 'MemRetry machine check - last EA '
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
lwz r27, 0x0694(r1)
|
||||||
|
mr r8, r27
|
||||||
|
bl Printw
|
||||||
|
|
||||||
|
_log ' SRR1 '
|
||||||
|
mfspr r8, srr1
|
||||||
|
mr r8, r8
|
||||||
|
bl Printw
|
||||||
|
|
||||||
|
_log ' SRR0 '
|
||||||
|
mfspr r8, srr0
|
||||||
|
mr r8, r8
|
||||||
|
bl Printw
|
||||||
|
_log '^n'
|
||||||
|
|
||||||
|
mr r8, r28
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
lwz r27, 0x0694(r1)
|
||||||
|
subf r28, r19, r27
|
||||||
|
cmpwi r28, -0x10
|
||||||
|
blt MemRetryMachineCheck_0x14c
|
||||||
|
cmpwi r28, 0x10
|
||||||
|
bgt MemRetryMachineCheck_0x14c
|
||||||
|
|
||||||
|
_Lock PSA.HTABLock, scratch1=r28, scratch2=r29
|
||||||
|
|
||||||
|
lwz r28, 0x0e98(r1)
|
||||||
|
addi r28, r28, 0x01
|
||||||
|
stw r28, 0x0e98(r1)
|
||||||
|
lwz r29, 0x0698(r1)
|
||||||
|
li r28, 0x00
|
||||||
|
stw r28, 0x0000(r29)
|
||||||
|
mfspr r28, pvr
|
||||||
|
rlwinm. r28, r28, 0, 0, 14
|
||||||
|
sync
|
||||||
|
tlbie r27
|
||||||
|
beq MemRetryMachineCheck_0x124
|
||||||
|
sync
|
||||||
|
tlbsync
|
||||||
|
|
||||||
|
MemRetryMachineCheck_0x124
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
_AssertAndRelease PSA.HTABLock, scratch=r28
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MemRetryMachineCheck_0x14c ; OUTSIDE REFERER
|
||||||
|
cmplw r10, r19
|
||||||
|
li r8, ecDataHardwareFault
|
||||||
|
bne ExceptionMemRetried
|
||||||
|
mfsprg r1, 0
|
||||||
|
mtsprg 3, r24
|
||||||
|
lmw r14, 0x0038(r1)
|
||||||
|
li r8, ecInstHardwareFault
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
IntISI ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
bl LoadInterruptRegisters
|
||||||
|
|
||||||
|
andis. r8, r11, 0x4020
|
||||||
|
beq major_0x039dc_0x14
|
||||||
|
mfsprg r8, 0
|
||||||
|
stmw r14, 0x0038(r8)
|
||||||
|
|
||||||
|
_Lock PSA.HTABLock, scratch1=r28, scratch2=r31
|
||||||
|
|
||||||
|
mr r27, r10
|
||||||
|
bl PagingFunc1
|
||||||
|
_AssertAndRelease PSA.HTABLock, scratch=r28
|
||||||
|
mfsprg r8, 0
|
||||||
|
bne major_0x039dc
|
||||||
|
|
||||||
|
|
||||||
|
; MemRetry
|
||||||
|
|
||||||
|
mfsprg r24, 3
|
||||||
|
mfmsr r14
|
||||||
|
ori r15, r14, 0x10
|
||||||
|
addi r23, r1, KDP.VecBaseMemRetry
|
||||||
|
mtsprg 3, r23
|
||||||
|
mr r19, r10
|
||||||
|
mtmsr r15
|
||||||
|
isync
|
||||||
|
lbz r23, 0x0000(r19)
|
||||||
|
sync
|
||||||
|
mtmsr r14
|
||||||
|
isync
|
||||||
|
mfsprg r8, 0
|
||||||
|
mtsprg 3, r24
|
||||||
|
lmw r14, 0x0038(r8)
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
major_0x039dc ; OUTSIDE REFERER
|
||||||
|
lmw r14, 0x0038(r8)
|
||||||
|
li r8, ecInstPageFault
|
||||||
|
blt Exception
|
||||||
|
li r8, ecInstInvalidAddress
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
major_0x039dc_0x14 ; OUTSIDE REFERER
|
||||||
|
andis. r8, r11, 0x800
|
||||||
|
li r8, ecInstSupAccessViolation
|
||||||
|
bne Exception
|
||||||
|
li r8, ecInstHardwareFault
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IntMachineCheck ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
bl LoadInterruptRegisters
|
||||||
|
|
||||||
|
lwz r9, EWA.CPUBase + CPU.ID(r8)
|
||||||
|
_log 'CPU '
|
||||||
|
mr r8, r9
|
||||||
|
bl Printw
|
||||||
|
|
||||||
|
_log 'Machine check at ' ; srr1/srr0
|
||||||
|
mr r8, r11
|
||||||
|
bl Printw
|
||||||
|
mr r8, r10
|
||||||
|
bl Printw
|
||||||
|
|
||||||
|
_log '- last unmapped EA '
|
||||||
|
lwz r8, 0x0694(r1)
|
||||||
|
mr r8, r8
|
||||||
|
bl Printw
|
||||||
|
_log '^n'
|
||||||
|
|
||||||
|
rlwinm. r8, r11, 0, 2, 2
|
||||||
|
beq @not_L1_data_cache_error
|
||||||
|
|
||||||
|
;L1 data cache error
|
||||||
|
bl FlushL1CacheUsingMSSCR0
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
@not_L1_data_cache_error
|
||||||
|
li r8, ecMachineCheck
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MaskedInterruptTaken ; OUTSIDE REFERER
|
||||||
|
_log '*** CPU MALFUNCTION - Masked interrupt punched through. SRR1/0 '
|
||||||
|
mr r8, r11
|
||||||
|
bl Printw
|
||||||
|
mr r8, r10
|
||||||
|
bl Printw
|
||||||
|
_log '^n'
|
||||||
|
lis r10, -0x4523
|
||||||
|
ori r10, r10, 0xcb00
|
||||||
|
li r8, ecMachineCheck
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
PIHDSI ; OUTSIDE REFERER
|
||||||
|
mfspr r8, dsisr
|
||||||
|
rlwimi r11, r8, 0, 0, 9
|
||||||
|
andis. r8, r11, 0x4020
|
||||||
|
beq major_0x039dc_0x14
|
||||||
|
mfsprg r8, 0
|
||||||
|
stmw r14, 0x0038(r8)
|
||||||
|
lwz r1, -0x0004(r8)
|
||||||
|
|
||||||
|
_Lock PSA.HTABLock, scratch1=r28, scratch2=r31
|
||||||
|
|
||||||
|
mfspr r27, dar
|
||||||
|
bl PagingFunc1
|
||||||
|
_AssertAndRelease PSA.HTABLock, scratch=r28
|
||||||
|
mfsprg r8, 0
|
||||||
|
bne major_0x039dc
|
||||||
|
lmw r14, 0x0038(r8)
|
||||||
|
mfsprg r1, 2
|
||||||
|
mtlr r1
|
||||||
|
mfsprg r1, 1
|
||||||
|
rfi
|
||||||
|
dcb.b 32, 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### ####### #######
|
||||||
|
# # #### # # ###### ##### # # ##### # # # ##### #### # # # # # #### ###### ##### ##### # #### # #
|
||||||
|
# # # # # # # # # # # # ## # # # # # # ## ## # # # # # # # # # # # # ## #
|
||||||
|
#### # ###### ##### # # # # # # # # ##### # # # # # ## # ##### ## # ##### # # # # # # # # #
|
||||||
|
# # # # # # # # # ##### # # # # ##### # # # # # ## # # ##### # # # # # # #
|
||||||
|
# # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # # ##
|
||||||
|
# # #### # # ###### # #### # # # # # # # #### # # ####### # # #### ###### # # # #### # #
|
||||||
|
|
||||||
|
align kIntAlign
|
||||||
|
|
||||||
|
; dead code?
|
||||||
|
|
||||||
|
lwz r11, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r1)
|
||||||
|
mr r10, r12
|
||||||
|
addi r11, r11, 1
|
||||||
|
stw r11, KDP.NanoKernelInfo + NKNanoKernelInfo.NanoKernelCallCounts(r1)
|
||||||
|
mfsrr1 r11
|
||||||
|
rlwimi r7, r7, 27, 26, 26
|
||||||
|
|
||||||
|
kcReturnFromException ; OUTSIDE REFERER
|
||||||
|
|
||||||
|
_bset r11, r11, MSR_EEbit
|
||||||
|
|
||||||
|
mtcrf 0x3f, r7
|
||||||
|
cmplwi cr1, r3, 1 ; exception handler return value
|
||||||
|
bc BO_IF, EWA.kFlagSIGP, IntReturnFromSIGP
|
||||||
|
|
||||||
|
blt cr1, major_0x03be0_0x58
|
||||||
|
beq cr1, major_0x03be0_0x90
|
||||||
|
|
||||||
|
|
||||||
|
subi r8, r3, 32
|
||||||
|
lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionForcedCount(r1)
|
||||||
|
cmplwi r8, 224
|
||||||
|
addi r9, r9, 1
|
||||||
|
stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionForcedCount(r1)
|
||||||
|
mfsprg r1, 0
|
||||||
|
rlwimi r7, r3, 24, 0, 7
|
||||||
|
blt major_0x03be0_0xe8
|
||||||
|
li r8, ecTrapInstr
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
major_0x03be0_0x58
|
||||||
|
mfsprg r1, 0
|
||||||
|
lwz r8, 0x0040(r6)
|
||||||
|
lwz r10, 0x0084(r6)
|
||||||
|
rlwimi r7, r8, 0, 17, 7
|
||||||
|
lwz r8, 0x0044(r6)
|
||||||
|
rlwimi r11, r7, 0, 20, 23 ; MSR[FE0/SE/BE/FE1]
|
||||||
|
stw r8, EWA.Enables(r1)
|
||||||
|
andi. r8, r11, 0x900
|
||||||
|
lwz r12, 0x008c(r6)
|
||||||
|
lwz r3, 0x0094(r6)
|
||||||
|
lwz r4, 0x009c(r6)
|
||||||
|
bnel major_0x03e18
|
||||||
|
addi r9, r6, 0x40
|
||||||
|
b IntReturn
|
||||||
|
|
||||||
|
major_0x03be0_0x90
|
||||||
|
lwz r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionPropagateCount(r1)
|
||||||
|
lwz r8, 0x0040(r6)
|
||||||
|
addi r9, r9, 1
|
||||||
|
stw r9, KDP.NanoKernelInfo + NKNanoKernelInfo.ExceptionPropagateCount(r1)
|
||||||
|
mfsprg r1, 0
|
||||||
|
lwz r10, 0x0084(r6)
|
||||||
|
rlwimi r7, r8, 0, 17, 7
|
||||||
|
lwz r8, 0x0044(r6)
|
||||||
|
mtcrf 0x0f, r7
|
||||||
|
rlwimi r11, r7, 0, 20, 23 ; MSR[FE0/SE/BE/FE1]
|
||||||
|
stw r8, EWA.Enables(r1)
|
||||||
|
lwz r12, 0x008c(r6)
|
||||||
|
lwz r3, 0x0094(r6)
|
||||||
|
lwz r4, 0x009c(r6)
|
||||||
|
bne cr2, major_0x03be0_0xe8
|
||||||
|
bns cr6, major_0x03be0_0xe8
|
||||||
|
stmw r14, 0x0038(r1)
|
||||||
|
lwz r17, 0x0064(r6)
|
||||||
|
lwz r20, 0x0068(r6)
|
||||||
|
lwz r21, 0x006c(r6)
|
||||||
|
lwz r19, ContextBlock.SRR0(r6)
|
||||||
|
lwz r18, 0x007c(r6)
|
||||||
|
|
||||||
|
major_0x03be0_0xe8
|
||||||
|
beq cr2, IntReturnToSystemContext
|
||||||
|
crclr cr6_so
|
||||||
|
mfspr r10, srr0
|
||||||
|
li r8, ecTrapInstr
|
||||||
|
b Exception
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align 5
|
||||||
|
|
||||||
|
save_all_registers ; OUTSIDE REFERER
|
||||||
|
mfsprg r1, 0
|
||||||
|
stw r6, 0x0018(r1)
|
||||||
|
mfsprg r6, 1
|
||||||
|
stw r6, 0x0004(r1)
|
||||||
|
lwz r6, -0x0014(r1)
|
||||||
|
stw r0, 0x0104(r6)
|
||||||
|
stw r7, 0x013c(r6)
|
||||||
|
stw r8, 0x0144(r6)
|
||||||
|
stw r9, 0x014c(r6)
|
||||||
|
stw r10, 0x0154(r6)
|
||||||
|
stw r11, 0x015c(r6)
|
||||||
|
stw r12, 0x0164(r6)
|
||||||
|
stw r13, 0x016c(r6)
|
||||||
|
li r0, 0x00
|
||||||
|
mfspr r10, srr0
|
||||||
|
mfspr r11, srr1
|
||||||
|
mfcr r13
|
||||||
|
mfsprg r12, 2
|
||||||
|
lwz r7, EWA.Flags(r1)
|
||||||
|
lwz r1, -0x0004(r1)
|
||||||
|
|
||||||
|
; r6 = ewa
|
||||||
|
b SchSaveStartingAtR14
|
||||||
|
; r8 = sprg0 (not used by me)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ### ######
|
||||||
|
# #### ## ##### # # # ##### ###### ##### ##### # # ##### ##### # # ###### #### # #### ##### ###### ##### ####
|
||||||
|
# # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
# # # # # # # # # # # # ##### # # # # # # # # # ###### ##### # # #### # ##### # # ####
|
||||||
|
# # # ###### # # # # # # # # ##### ##### # # ##### # # # # # ### # # # # ##### #
|
||||||
|
# # # # # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # #
|
||||||
|
####### #### # # ##### ### # # # ###### # # # # #### # # # # ###### #### # #### # ###### # # ####
|
||||||
|
|
||||||
|
; How we arrive here:
|
||||||
|
;
|
||||||
|
; PowerPC exception vector saved r1/LR in SPRG1/2 and
|
||||||
|
; jumped where directed by the vecTable pointed to by
|
||||||
|
; SPRG3. That function bl'ed here.
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; When we arrive here:
|
||||||
|
;
|
||||||
|
; r1 is saved in SPRG1 (r1 itself is junk)
|
||||||
|
; LR is saved in SPRG2 (LR itself contains return addr)
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Before we return:
|
||||||
|
;
|
||||||
|
; Reg Contains Original saved in
|
||||||
|
; ---------------------------------------------
|
||||||
|
; r0 0 ContextBlock
|
||||||
|
; r1 KDP EWA
|
||||||
|
; r2 (itself)
|
||||||
|
; r3 (itself)
|
||||||
|
; r4 (itself)
|
||||||
|
; r5 (itself)
|
||||||
|
; r6 ContextBlock EWA
|
||||||
|
; r7 Flags ContextBlock
|
||||||
|
; r8 EWA ContextBlock
|
||||||
|
; r9 (itself) ContextBlock
|
||||||
|
; r10 SRR0 ContextBlock
|
||||||
|
; r11 SRR1 ContextBlock
|
||||||
|
; r12 LR ContextBlock
|
||||||
|
; r13 CR ContextBlock
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Can be followed up by a call to SchSaveStartingAtR14,
|
||||||
|
; (which will put them in the ContextBlock too).
|
||||||
|
|
||||||
|
align 5
|
||||||
|
|
||||||
|
LoadInterruptRegisters
|
||||||
|
|
||||||
|
; Get EWA pointer in r1 (phew)
|
||||||
|
mfsprg r1, 0
|
||||||
|
|
||||||
|
; Save r6 in EWA
|
||||||
|
stw r6, EWA.r6(r1)
|
||||||
|
|
||||||
|
; Save pre-interrupt r1 (which SPRG1 held) to EWA
|
||||||
|
mfsprg r6, 1
|
||||||
|
stw r6, EWA.r1(r1)
|
||||||
|
|
||||||
|
; Get ContextBlock pointer in r6 (phew)
|
||||||
|
lwz r6, EWA.PA_ContextBlock(r1)
|
||||||
|
|
||||||
|
; Save r0, r7-r13 in ContextBlock
|
||||||
|
stw r0, ContextBlock.r0(r6)
|
||||||
|
stw r7, ContextBlock.r7(r6)
|
||||||
|
stw r8, ContextBlock.r8(r6)
|
||||||
|
stw r9, ContextBlock.r9(r6)
|
||||||
|
stw r10, ContextBlock.r10(r6)
|
||||||
|
stw r11, ContextBlock.r11(r6)
|
||||||
|
stw r12, ContextBlock.r12(r6)
|
||||||
|
stw r13, ContextBlock.r13(r6)
|
||||||
|
|
||||||
|
; Zero r0 (convenient)
|
||||||
|
li r0, 0
|
||||||
|
|
||||||
|
; Make some useful special registers conveniently available
|
||||||
|
mfspr r10, srr0
|
||||||
|
mfspr r11, srr1
|
||||||
|
mfcr r13
|
||||||
|
mfsprg r12, 2
|
||||||
|
|
||||||
|
; Point r8 to EWA
|
||||||
|
mr r8, r1
|
||||||
|
|
||||||
|
; Features in r7, KDP in r8
|
||||||
|
lwz r7, EWA.Flags(r1)
|
||||||
|
lwz r1, EWA.PA_KDP(r1)
|
||||||
|
|
||||||
|
blr
|
1141
NanoKernel/NKIntMisc.s
Normal file
1141
NanoKernel/NKIntMisc.s
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -20,13 +20,14 @@
|
||||||
; printh
|
; printh
|
||||||
; prints
|
; prints
|
||||||
; printw
|
; printw
|
||||||
|
; NKExceptions
|
||||||
|
; IntReturn
|
||||||
; NKIndex
|
; NKIndex
|
||||||
; DeleteID
|
; DeleteID
|
||||||
; GetNextIDOfClass
|
; GetNextIDOfClass
|
||||||
; LookupID
|
; LookupID
|
||||||
; MakeID
|
; MakeID
|
||||||
; NKInterrupts
|
; NKIntMisc
|
||||||
; IntReturn
|
|
||||||
; SIGP
|
; SIGP
|
||||||
; NKPaging
|
; NKPaging
|
||||||
; PagingL2PWithBATs
|
; PagingL2PWithBATs
|
||||||
|
@ -64,7 +65,7 @@
|
||||||
; RemovePageFromTLB
|
; RemovePageFromTLB
|
||||||
; VMSecondLastExportedFunc
|
; VMSecondLastExportedFunc
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; BlockMPCall (=> NKInterrupts, NKSync)
|
; BlockMPCall (=> NKExceptions, NKSync)
|
||||||
; CommonMPCallReturnPath (=> NKAddressSpaces, NKSleep, NKTasks)
|
; CommonMPCallReturnPath (=> NKAddressSpaces, NKSleep, NKTasks)
|
||||||
; MPCall_6_0x78 (=> NKTasks)
|
; MPCall_6_0x78 (=> NKTasks)
|
||||||
; ReleaseAndMPCallWasBad (=> NKAddressSpaces)
|
; ReleaseAndMPCallWasBad (=> NKAddressSpaces)
|
||||||
|
@ -83,7 +84,7 @@
|
||||||
; ReturnParamErrFromMPCall (=> NKAddressSpaces, NKPrimaryIntHandlers, NKSleep)
|
; ReturnParamErrFromMPCall (=> NKAddressSpaces, NKPrimaryIntHandlers, NKSleep)
|
||||||
; ReturnZeroFromMPCall (=> NKAddressSpaces, NKSleep, NKSync)
|
; ReturnZeroFromMPCall (=> NKAddressSpaces, NKSleep, NKSync)
|
||||||
; ScrambleMPCall (=> NKSync)
|
; ScrambleMPCall (=> NKSync)
|
||||||
; kcMPDispatch (=> NKInit, NKInterrupts)
|
; kcMPDispatch (=> NKInit, NKIntMisc)
|
||||||
; major_0x0b0cc (=> NKAddressSpaces)
|
; major_0x0b0cc (=> NKAddressSpaces)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,10 @@ Local_Panic set *
|
||||||
; panic
|
; panic
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; PagingFlushTLB (=> NKInit, NKScheduler, NKSleep)
|
; PagingFlushTLB (=> NKInit, NKScheduler, NKSleep)
|
||||||
; PagingFunc1 (=> NKInit, NKInterrupts, NKThud, NKVMCalls)
|
; PagingFunc1 (=> NKInit, NKIntHandlers, NKThud, NKVMCalls)
|
||||||
; PagingFunc2 (=> NKInit)
|
; PagingFunc2 (=> NKInit)
|
||||||
; PagingFunc2AndAHalf (=> NKSleep)
|
; PagingFunc2AndAHalf (=> NKSleep)
|
||||||
; PagingL2PWithBATs (=> NKInterrupts, NKMPCalls, NKRTASCalls, NKSleep)
|
; PagingL2PWithBATs (=> NKIntHandlers, NKIntMisc, NKMPCalls, NKRTASCalls, NKSleep)
|
||||||
; PagingL2PWithoutBATs (=> NKInit, NKScreenConsole, NKThud)
|
; PagingL2PWithoutBATs (=> NKInit, NKScreenConsole, NKThud)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; ExtendPool (=> NKMPCalls)
|
; ExtendPool (=> NKMPCalls)
|
||||||
; InitPool (=> NKInit)
|
; InitPool (=> NKInit)
|
||||||
; PoolAlloc (=> NKInterrupts, NKSync, NKTasks)
|
; PoolAlloc (=> NKExceptions, NKSync, NKTasks)
|
||||||
; PoolAllocClear (=> NKAddressSpaces, NKIndex, NKInit, NKMPCalls, NKSync, NKTasks, NKTimers, NKVMCalls)
|
; PoolAllocClear (=> NKAddressSpaces, NKIndex, NKInit, NKMPCalls, NKSync, NKTasks, NKTimers, NKVMCalls)
|
||||||
; PoolFree (=> NKAddressSpaces, NKMPCalls, NKSync, NKTasks, NKTimers)
|
; PoolFree (=> NKAddressSpaces, NKMPCalls, NKSync, NKTasks, NKTimers)
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
; NKCache
|
; NKCache
|
||||||
; FlushCaches
|
; FlushCaches
|
||||||
; NKInterrupts
|
; NKExceptions
|
||||||
; IntReturn
|
; IntReturn
|
||||||
|
; NKIntMisc
|
||||||
; wordfill
|
; wordfill
|
||||||
; NKThud
|
; NKThud
|
||||||
; panic
|
; panic
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
; AUTO-GENERATED SYMBOL LIST
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
|
; NKExceptions
|
||||||
|
; IntReturn
|
||||||
; NKIndex
|
; NKIndex
|
||||||
; LookupID
|
; LookupID
|
||||||
; NKInterrupts
|
|
||||||
; IntReturn
|
|
||||||
; NKMPCalls
|
; NKMPCalls
|
||||||
; ReturnMPCallOOM
|
; ReturnMPCallOOM
|
||||||
; ReturnParamErrFromMPCall
|
; ReturnParamErrFromMPCall
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
; AUTO-GENERATED SYMBOL LIST
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
; NKInterrupts
|
; NKExceptions
|
||||||
; IntHandleSpecialFPException
|
|
||||||
; IntReturn
|
; IntReturn
|
||||||
|
; NKFloatInts
|
||||||
|
; IntHandleSpecialFPException
|
||||||
; bugger_around_with_floats
|
; bugger_around_with_floats
|
||||||
; NKPaging
|
; NKPaging
|
||||||
; PagingL2PWithBATs
|
; PagingL2PWithBATs
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
; NKConsoleLog
|
; NKConsoleLog
|
||||||
; printh
|
; printh
|
||||||
; printw
|
; printw
|
||||||
; NKInterrupts
|
; NKIntMisc
|
||||||
; SIGP
|
; SIGP
|
||||||
; NKPaging
|
; NKPaging
|
||||||
; PagingFlushTLB
|
; PagingFlushTLB
|
||||||
|
@ -17,27 +17,27 @@
|
||||||
; TimebaseTicksPerPeriod
|
; TimebaseTicksPerPeriod
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; CalculateTimeslice (=> NKInit, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
; CalculateTimeslice (=> NKInit, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
||||||
; FlagSchEval (=> NKInit, NKInterrupts, NKMPCalls, NKTasks)
|
; FlagSchEval (=> NKExceptions, NKInit, NKMPCalls, NKTasks)
|
||||||
; FlagSchEvaluationIfTaskRequires (=> NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
; FlagSchEvaluationIfTaskRequires (=> NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
||||||
; NewCpuEntryPoint (=> NKMPCalls)
|
; NewCpuEntryPoint (=> NKMPCalls)
|
||||||
; Restore_v0_v31 (=> NKInterrupts)
|
; Restore_v0_v31 (=> NKIntMisc)
|
||||||
; Save_f0_f31 (=> NKSleep)
|
; Save_f0_f31 (=> NKSleep)
|
||||||
; Save_v0_v31 (=> NKInterrupts, NKMPCalls, NKSleep)
|
; Save_v0_v31 (=> NKExceptions, NKMPCalls, NKSleep)
|
||||||
; SchEval (=> NKInterrupts, NKMPCalls)
|
; SchEval (=> NKExceptions, NKMPCalls)
|
||||||
; SchExitInterrupt (=> NKInterrupts)
|
; SchExitInterrupt (=> NKIntMisc)
|
||||||
; SchFiddlePriorityShifty (=> NKInterrupts)
|
; SchFiddlePriorityShifty (=> NKIntHandlers)
|
||||||
; SchIdleTask (=> NKInit, NKMPCalls)
|
; SchIdleTask (=> NKInit, NKMPCalls)
|
||||||
; SchIdleTaskStopper (=> NKMPCalls)
|
; SchIdleTaskStopper (=> NKMPCalls)
|
||||||
; SchInit (=> NKInit)
|
; SchInit (=> NKInit)
|
||||||
; SchRdyTaskLater (=> NKMPCalls, NKPrimaryIntHandlers, NKSync)
|
; SchRdyTaskLater (=> NKMPCalls, NKPrimaryIntHandlers, NKSync)
|
||||||
; SchRdyTaskNow (=> NKInit, NKInterrupts, NKMPCalls, NKSync, NKTasks, NKTimers)
|
; SchRdyTaskNow (=> NKExceptions, NKInit, NKMPCalls, NKSync, NKTasks, NKTimers)
|
||||||
; SchRestoreStartingAtR14 (=> NKInit, NKInterrupts, NKMPCalls, NKPrimaryIntHandlers, NKVMCalls)
|
; SchRestoreStartingAtR14 (=> NKExceptions, NKInit, NKIntHandlers, NKIntMisc, NKMPCalls, NKPrimaryIntHandlers, NKVMCalls)
|
||||||
; SchRestoreStartingAtR20 (=> NKPrimaryIntHandlers)
|
; SchRestoreStartingAtR20 (=> NKPrimaryIntHandlers)
|
||||||
; SchReturn (=> NKInterrupts)
|
; SchReturn (=> NKExceptions)
|
||||||
; SchSaveStartingAtR14 (=> NKInterrupts, NKMPCalls, NKVMCalls)
|
; SchSaveStartingAtR14 (=> NKExceptions, NKIntHandlers, NKIntMisc, NKMPCalls, NKVMCalls)
|
||||||
; SchSaveStartingAtR20 (=> NKPrimaryIntHandlers)
|
; SchSaveStartingAtR20 (=> NKPrimaryIntHandlers)
|
||||||
; SchSwitchSpace (=> NKInit, NKInterrupts, NKSleep)
|
; SchSwitchSpace (=> NKInit, NKIntMisc, NKSleep)
|
||||||
; SchTaskUnrdy (=> NKInterrupts, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
; SchTaskUnrdy (=> NKExceptions, NKMPCalls, NKPrimaryIntHandlers, NKSync, NKTasks, NKTimers)
|
||||||
; clear_cr0_lt (=> NKTimers)
|
; clear_cr0_lt (=> NKTimers)
|
||||||
; major_0x149d4 (=> NKTimers)
|
; major_0x149d4 (=> NKTimers)
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
; AUTO-GENERATED SYMBOL LIST
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
; NKInterrupts
|
; NKIntMisc
|
||||||
; SIGP
|
; SIGP
|
||||||
; NKMPCalls
|
; NKMPCalls
|
||||||
; CommonMPCallReturnPath
|
; CommonMPCallReturnPath
|
||||||
|
|
|
@ -36,11 +36,11 @@
|
||||||
; GetTime
|
; GetTime
|
||||||
; TimebaseTicksPerPeriod
|
; TimebaseTicksPerPeriod
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; CauseNotification (=> NKAddressSpaces, NKInterrupts, NKPrimaryIntHandlers)
|
; CauseNotification (=> NKAddressSpaces, NKExceptions, NKIntMisc, NKPrimaryIntHandlers)
|
||||||
; EnqueueMessage (=> NKInterrupts, NKTasks, NKTimers)
|
; EnqueueMessage (=> NKExceptions, NKTasks, NKTimers)
|
||||||
; SetEvent (=> NKAddressSpaces, NKTimers)
|
; SetEvent (=> NKAddressSpaces, NKTimers)
|
||||||
; SignalSemaphore (=> NKTimers)
|
; SignalSemaphore (=> NKTimers)
|
||||||
; UnblockBlueIfCouldBePolling (=> NKInterrupts)
|
; UnblockBlueIfCouldBePolling (=> NKExceptions)
|
||||||
|
|
||||||
|
|
||||||
####### ## ## ######## ## ## ######## ######
|
####### ## ## ######## ## ## ######## ######
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; CreateTask (=> NKInit, NKMPCalls)
|
; CreateTask (=> NKInit, NKMPCalls)
|
||||||
; TasksFuncThatIsNotAMPCall (=> NKScheduler)
|
; TasksFuncThatIsNotAMPCall (=> NKScheduler)
|
||||||
; ThrowTaskToDebugger (=> NKInterrupts)
|
; ThrowTaskToDebugger (=> NKExceptions)
|
||||||
|
|
||||||
|
|
||||||
; This file mostly provides MPCall implementations related to multitasking.
|
; This file mostly provides MPCall implementations related to multitasking.
|
||||||
|
|
|
@ -7,16 +7,16 @@
|
||||||
; printh
|
; printh
|
||||||
; prints
|
; prints
|
||||||
; printw
|
; printw
|
||||||
|
; NKExceptions
|
||||||
|
; Exception
|
||||||
; NKIndex
|
; NKIndex
|
||||||
; GetNextIDOfClass
|
; GetNextIDOfClass
|
||||||
; LookupID
|
; LookupID
|
||||||
; NKInterrupts
|
|
||||||
; Exception
|
|
||||||
; NKPaging
|
; NKPaging
|
||||||
; PagingFunc1
|
; PagingFunc1
|
||||||
; PagingL2PWithoutBATs
|
; PagingL2PWithoutBATs
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; panic (=> NKAddressSpaces, NKIndex, NKInit, NKInterrupts, NKMPCalls, NKPaging, NKPoolAllocator, NKPowerCalls, NKRTASCalls, NKScheduler, NKSleep, NKSync, NKTasks, NKTimers, NKTranslation, NKVMCalls)
|
; panic (=> NKAddressSpaces, NKIndex, NKInit, NKMPCalls, NKPaging, NKPoolAllocator, NKPowerCalls, NKRTASCalls, NKScheduler, NKSleep, NKSync, NKTasks, NKTimers, NKTranslation, NKVMCalls)
|
||||||
; panic_non_interactive (=> NKTimers)
|
; panic_non_interactive (=> NKTimers)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
; SetTimesliceFromCurTime (=> NKScheduler)
|
; SetTimesliceFromCurTime (=> NKScheduler)
|
||||||
; StartTimeslicing (=> NKInit)
|
; StartTimeslicing (=> NKInit)
|
||||||
; TimebaseTicksPerPeriod (=> NKScheduler, NKSync)
|
; TimebaseTicksPerPeriod (=> NKScheduler, NKSync)
|
||||||
; TimerDispatch (=> NKInterrupts)
|
; TimerDispatch (=> NKIntHandlers)
|
||||||
|
|
||||||
|
|
||||||
Local_Panic set *
|
Local_Panic set *
|
||||||
|
|
|
@ -16,23 +16,26 @@
|
||||||
|
|
||||||
; AUTO-GENERATED SYMBOL LIST
|
; AUTO-GENERATED SYMBOL LIST
|
||||||
; IMPORTS:
|
; IMPORTS:
|
||||||
; NKInterrupts
|
; NKExceptions
|
||||||
; Exception
|
; Exception
|
||||||
; ExceptionMemRetried
|
; ExceptionMemRetried
|
||||||
|
; NKFloatInts
|
||||||
; FloatLoadJumpTable
|
; FloatLoadJumpTable
|
||||||
; FloatSaveJumpTable
|
; FloatSaveJumpTable
|
||||||
; IgnoreSoftwareInt
|
; NKIntHandlers
|
||||||
; LoadInterruptRegisters
|
; LoadInterruptRegisters
|
||||||
; major_0x03324
|
; major_0x03324
|
||||||
; major_0x03548
|
; major_0x03548
|
||||||
|
; NKIntMisc
|
||||||
|
; IgnoreSoftwareInt
|
||||||
; NKThud
|
; NKThud
|
||||||
; panic
|
; panic
|
||||||
; EXPORTS:
|
; EXPORTS:
|
||||||
; FDP (=> NKBuiltinInit, NKReplacementInit)
|
; FDP (=> NKBuiltinInit, NKReplacementInit)
|
||||||
; FDPEmulateInstruction (=> NKInterrupts)
|
; FDPEmulateInstruction (=> NKIntMisc)
|
||||||
; FDP_003c (=> NKInterrupts)
|
; FDP_003c (=> NKFloatInts)
|
||||||
; FDP_011c (=> NKInterrupts)
|
; FDP_011c (=> NKExceptions)
|
||||||
; FDP_0DA0 (=> NKInterrupts)
|
; FDP_0DA0 (=> NKFloatInts, NKIntHandlers)
|
||||||
; FDP_1c40 (=> NKInit)
|
; FDP_1c40 (=> NKInit)
|
||||||
; ProbePerfMonitor (=> NKInit)
|
; ProbePerfMonitor (=> NKInit)
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
; SpaceGetPagePLE
|
; SpaceGetPagePLE
|
||||||
; NKConsoleLog
|
; NKConsoleLog
|
||||||
; printw
|
; printw
|
||||||
; NKInterrupts
|
; NKExceptions
|
||||||
; IntReturn
|
; IntReturn
|
||||||
; NKPaging
|
; NKPaging
|
||||||
; PagingFunc1
|
; PagingFunc1
|
||||||
|
|
|
@ -11,8 +11,18 @@
|
||||||
|
|
||||||
NKTop
|
NKTop
|
||||||
include 'NKInit.s'
|
include 'NKInit.s'
|
||||||
|
|
||||||
align 5
|
align 5
|
||||||
include 'NKInterrupts.s'
|
IntPanicIsland
|
||||||
|
b Panic
|
||||||
|
include 'NKExceptions.s'
|
||||||
|
align 5
|
||||||
|
include 'NKIntHandlers.s'
|
||||||
|
align 5
|
||||||
|
include 'NKFloatInts.s'
|
||||||
|
align 6
|
||||||
|
include 'NKIntMisc.s'
|
||||||
|
|
||||||
align 5
|
align 5
|
||||||
include 'NKPaging.s'
|
include 'NKPaging.s'
|
||||||
align 5
|
align 5
|
||||||
|
|
Loading…
Reference in New Issue
Block a user