mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-09-08 10:54:24 +00:00
This is the usual way to release a lock. Most MP calls employ it indirectly, through their return path.
1363 lines
21 KiB
ArmAsm
1363 lines
21 KiB
ArmAsm
; panic
|
||
|
||
; Xrefs:
|
||
; "vec"
|
||
; Local_Panic
|
||
; Local_Panic
|
||
; major_0x02ccc
|
||
; IntDecrementer
|
||
; IntDSIOtherOther
|
||
; IntMachineCheckMemRetry
|
||
; IntISI
|
||
; IntDSIOther
|
||
; IntPerfMonitor
|
||
; IntThermalEvent
|
||
; Local_Panic
|
||
; FDP_1c40
|
||
; Local_Panic
|
||
; kcVMDispatch
|
||
; Local_Panic
|
||
; kcRTASDispatch
|
||
; ReleaseAndMPCallWasBad
|
||
; ReleaseAndReturnZeroFromMPCall
|
||
; major_0x0af60
|
||
; ReleaseAndReturnMPCallBlueBlocking
|
||
; major_0x0b054
|
||
; ReleaseAndReturnMPCallPrivilegedErr
|
||
; major_0x0b0cc
|
||
; AlternateMPCallReturnPath
|
||
; MPCall_0
|
||
; MPCall_6
|
||
; KCYieldWithHint
|
||
; KCStartCPU
|
||
; KCStopScheduling
|
||
; MPCall_115
|
||
; Local_Panic
|
||
; major_0x0d35c
|
||
; MPCall_41
|
||
; Local_Panic
|
||
; MPCall_9
|
||
; KCThrowException
|
||
; Local_Panic
|
||
; MPCall_70
|
||
; MPCall_72
|
||
; createarea
|
||
; major_0x102c8
|
||
; MPCall_73
|
||
; MPCall_74
|
||
; MPCall_75
|
||
; MPCall_130
|
||
; KCSetAreaAccess
|
||
; MPCall_123
|
||
; MPCall_81
|
||
; MPCall_98
|
||
; MPCall_83
|
||
; MPCall_84
|
||
; KCMapPage
|
||
; KCUnmapPages
|
||
; KCMakePhysicallyContiguous
|
||
; KCLockPages
|
||
; KCUnlockPages
|
||
; KCHoldPages
|
||
; KCUnholdPages
|
||
; MPCall_91
|
||
; MPCall_92
|
||
; MPCall_94
|
||
; MPCall_95
|
||
; Local_Panic
|
||
; major_0x129cc
|
||
; Local_Panic
|
||
; Local_Panic
|
||
; major_0x142dc
|
||
; major_0x14548
|
||
; Local_Panic
|
||
; CommonPIHPath
|
||
; print_common
|
||
|
||
|
||
align 5
|
||
|
||
|
||
panic ; OUTSIDE REFERER
|
||
crset cr1_eq
|
||
b panic_common
|
||
|
||
panic_non_interactive
|
||
crclr cr1_eq
|
||
|
||
panic_common
|
||
mfsprg r1, 0
|
||
stmw r29, EWA.ThudSavedR29(r1)
|
||
lwz r1, EWA.PA_KDP(r1)
|
||
mflr r29
|
||
|
||
_Lock PSA.ThudLock, scratch1=r30, scratch2=r31
|
||
|
||
stw r29, KDP.ThudSavedLR(r1)
|
||
stw r0, KDP.ThudSavedR0(r1)
|
||
mfsprg r0, 1
|
||
stw r0, KDP.ThudSavedR1(r1)
|
||
stw r2, KDP.ThudSavedR2(r1)
|
||
mfsprg r2, 0
|
||
lmw r29, EWA.ThudSavedR29(r2)
|
||
stmw r3, KDP.ThudSavedR3(r1)
|
||
mfcr r0
|
||
stw r0, KDP.ThudSavedCR(r1)
|
||
|
||
|
||
; Save the silly multiply-quotient register
|
||
|
||
mfspr r0, pvr
|
||
rlwinm. r0, r0, 0, 0, 14
|
||
bne- @no_mq
|
||
dialect POWER
|
||
mfmq r0
|
||
dialect PowerPC
|
||
stw r0, KDP.ThudSavedMQ(r1)
|
||
@no_mq
|
||
|
||
mfxer r0
|
||
stw r0, KDP.ThudSavedXER(r1)
|
||
mfsprg r0, 2
|
||
stw r0, KDP.ThudSavedSPRG2(r1)
|
||
mfctr r0
|
||
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)
|
||
|
||
|
||
; Save the time
|
||
|
||
mfpvr r0
|
||
rlwinm. r0, r0, 0, 0, 14
|
||
bne- @not_601
|
||
|
||
@rtcloop
|
||
dialect POWER
|
||
mfrtcu r0
|
||
mfrtcl r2
|
||
mfrtcu r3
|
||
dialect PowerPC
|
||
cmpw r0, r3
|
||
bne+ @rtcloop
|
||
|
||
stw r0, KDP.ThudSavedTBU(r1)
|
||
stw r2, KDP.ThudSavedTB(r1)
|
||
b @end_if_601
|
||
@not_601
|
||
|
||
@tbloop
|
||
mftbu r0
|
||
mftb r2
|
||
mftbu r3
|
||
cmpw r0, r3
|
||
bne+ @tbloop
|
||
stw r0, KDP.ThudSavedTBU(r1)
|
||
stw r2, KDP.ThudSavedTB(r1)
|
||
@end_if_601
|
||
|
||
|
||
mfspr r0, dec
|
||
stw r0, 0x07a8(r1)
|
||
mfspr r0, hid0
|
||
stw r0, 0x07ac(r1)
|
||
mfspr r0, sdr1
|
||
stw r0, 0x07b0(r1)
|
||
mfspr r0, srr0
|
||
stw r0, 0x07b4(r1)
|
||
mfspr r0, srr1
|
||
stw r0, 0x07b8(r1)
|
||
mfmsr r0
|
||
stw r0, 0x07bc(r1)
|
||
mfsr r0, 0
|
||
stw r0, 0x07c0(r1)
|
||
mfsr r0, 1
|
||
stw r0, 0x07c4(r1)
|
||
mfsr r0, 2
|
||
stw r0, 0x07c8(r1)
|
||
mfsr r0, 3
|
||
stw r0, 0x07cc(r1)
|
||
mfsr r0, 4
|
||
stw r0, 0x07d0(r1)
|
||
mfsr r0, 5
|
||
stw r0, 0x07d4(r1)
|
||
mfsr r0, 6
|
||
stw r0, 0x07d8(r1)
|
||
mfsr r0, 7
|
||
stw r0, 0x07dc(r1)
|
||
mfsr r0, 8
|
||
stw r0, 0x07e0(r1)
|
||
mfsr r0, 9
|
||
stw r0, 0x07e4(r1)
|
||
mfsr r0, 10
|
||
stw r0, 0x07e8(r1)
|
||
mfsr r0, 11
|
||
stw r0, 0x07ec(r1)
|
||
mfsr r0, 12
|
||
stw r0, 0x07f0(r1)
|
||
mfsr r0, 13
|
||
stw r0, 0x07f4(r1)
|
||
mfsr r0, 14
|
||
stw r0, 0x07f8(r1)
|
||
mfsr r0, 15
|
||
stw r0, 0x07fc(r1)
|
||
|
||
|
||
mfmsr r0
|
||
_bset r0, r0, MSR_FPbit
|
||
mtmsr r0
|
||
isync
|
||
|
||
stfd f0, 0x0800(r1)
|
||
stfd f1, 0x0808(r1)
|
||
stfd f2, 0x0810(r1)
|
||
stfd f3, 0x0818(r1)
|
||
stfd f4, 0x0820(r1)
|
||
stfd f5, 0x0828(r1)
|
||
stfd f6, 0x0830(r1)
|
||
stfd f7, 0x0838(r1)
|
||
stfd f8, 0x0840(r1)
|
||
stfd f9, 0x0848(r1)
|
||
stfd f10, 0x0850(r1)
|
||
stfd f11, 0x0858(r1)
|
||
stfd f12, 0x0860(r1)
|
||
stfd f13, 0x0868(r1)
|
||
stfd f14, 0x0870(r1)
|
||
stfd f15, 0x0878(r1)
|
||
stfd f16, 0x0880(r1)
|
||
stfd f17, 0x0888(r1)
|
||
stfd f18, 0x0890(r1)
|
||
stfd f19, 0x0898(r1)
|
||
stfd f20, 0x08a0(r1)
|
||
stfd f21, 0x08a8(r1)
|
||
stfd f22, 0x08b0(r1)
|
||
stfd f23, 0x08b8(r1)
|
||
stfd f24, 0x08c0(r1)
|
||
stfd f25, 0x08c8(r1)
|
||
stfd f26, 0x08d0(r1)
|
||
stfd f27, 0x08d8(r1)
|
||
stfd f28, 0x08e0(r1)
|
||
stfd f29, 0x08e8(r1)
|
||
stfd f30, 0x08f0(r1)
|
||
stfd f31, 0x08f8(r1)
|
||
mffs f31
|
||
lwz r0, 0x08fc(r1)
|
||
stfd f31, 0x08fc(r1)
|
||
stw r0, 0x08fc(r1)
|
||
bne- cr1, @0x260
|
||
|
||
if &TYPE('NKDebugShim') != 'UNDEFINED'
|
||
b @go_here_to_use_saved_debug_command
|
||
endif
|
||
|
||
@0x23c
|
||
lwz r1, 0(0)
|
||
addi r1, r1, 1
|
||
stw r1, 0(0)
|
||
|
||
li r1, 0
|
||
dcbst r1, r1
|
||
|
||
bl getchar
|
||
|
||
; gets kdp from print!!!
|
||
cmpwi r8, -0x01
|
||
bne- @0x260
|
||
b @0x23c
|
||
|
||
@0x260
|
||
lwz r8, 0x0edc(r1)
|
||
ori r8, r8, 0x02
|
||
stw r8, 0x0edc(r1)
|
||
_log '<EFBFBD> NanoKernel debugger^n'
|
||
|
||
@prompt
|
||
|
||
if &TYPE('NKDebugShim') != 'UNDEFINED'
|
||
b @NKDebugShimCode
|
||
endif
|
||
|
||
_log '<EFBFBD> ' ; thats an omega, btw
|
||
li r17, 0x00 ; r17 = charcount
|
||
stw r17, -0x08fc(r1)
|
||
|
||
@input_busywait
|
||
bl getchar
|
||
cmpwi r8, -1
|
||
beq+ @input_busywait
|
||
|
||
mr r16, r8
|
||
cmpwi r16, 8 ; backspace
|
||
cmpwi cr1, r17, 0
|
||
bne- @not_backspace
|
||
ble+ cr1, @input_busywait
|
||
|
||
|
||
; Backspace, wipe position, then backspace again!
|
||
subi r17, r17, 1
|
||
li r8, 8
|
||
bl Printc
|
||
li r8, ' '
|
||
bl Printc
|
||
li r8, 8
|
||
bl Printc
|
||
|
||
b @input_busywait
|
||
@not_backspace
|
||
|
||
; If
|
||
cmpwi cr2, r17, 95
|
||
addi r18, r1, -0x960 ; prepare to copy the line!
|
||
blt- cr2, @short_line
|
||
_log '^b'
|
||
b @input_busywait
|
||
|
||
@0x30c
|
||
addi r17, r17, 1 ; accept the character as an addition to the line
|
||
mr r8, r16
|
||
bl Printc
|
||
b @input_busywait
|
||
@short_line
|
||
|
||
cmpwi r16, 13
|
||
stbx r16, r17, r18
|
||
bne+ @0x30c
|
||
li r16, 0x00
|
||
stbx r16, r17, r18
|
||
_log '^n'
|
||
|
||
|
||
@go_here_to_use_saved_debug_command
|
||
|
||
|
||
; Now a line is expected to be committed:
|
||
|
||
addi r15, r1, -0x960
|
||
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq+ @prompt
|
||
bl @load_commands
|
||
mflr r16
|
||
bl @load_tbl
|
||
mflr r17
|
||
|
||
; r16 = command strings
|
||
; r17 = lut
|
||
bl cmd_lookup
|
||
; cr0 = found
|
||
; r17 = ptr to lut entry
|
||
|
||
bne- @bad_command
|
||
bl @load_tbl
|
||
mflr r16
|
||
lwz r17, 0x0000(r17)
|
||
add r16, r16, r17
|
||
mtlr r16
|
||
|
||
blr
|
||
|
||
@bad_command
|
||
_log '???^n'
|
||
b @prompt
|
||
|
||
@load_commands
|
||
blrl
|
||
string CString
|
||
dc.b 'dm'
|
||
dc.b 'dml'
|
||
dc.b 'g'
|
||
dc.b 'id'
|
||
dc.b 'kd'
|
||
dc.b 'td'
|
||
dc.b '?'
|
||
dc.b 'help'
|
||
dc.b 0xff
|
||
align 2
|
||
|
||
@load_tbl
|
||
blrl
|
||
|
||
@tbl
|
||
dc.l @cmd_dumpmem_physical - @tbl
|
||
dc.l @cmd_dumpmem_logical - @tbl
|
||
dc.l @cmd_goto - @tbl
|
||
dc.l @cmd_opaque_id_info - @tbl
|
||
dc.l @cmd_display_kern_data - @tbl
|
||
dc.l @cmd_dump_registers - @tbl
|
||
dc.l @cmd_help - @tbl
|
||
dc.l @cmd_help - @tbl
|
||
dc.l 0
|
||
|
||
@cmd_help
|
||
_log 'Commands:^n'
|
||
_log ' dm address [length] -- Display physical^n'
|
||
_log ' dml address [length] -- Display logical^n'
|
||
_log ' g [address] -- Go resume^n'
|
||
_log ' id [-all -p -t -tm -q -s -r -c -sp -e -cg -a -n -nc]^n'
|
||
_log ' id idvalue -- Obtain opaque ID info^n'
|
||
_log ' kd -- Display kernel data^n'
|
||
_log ' td -- Dump registers^n'
|
||
b @prompt
|
||
|
||
@cmd_dumpmem_physical
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq- @missing_physical_addr
|
||
bl major_0x187b0
|
||
bne- @bad_length_1
|
||
mr r30, r16
|
||
li r31, 0x10
|
||
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq- @0x5e0
|
||
bl major_0x187b0
|
||
bne- @bad_length_1
|
||
mr r31, r16
|
||
|
||
@0x5e0
|
||
addi r31, r31, 0x03
|
||
rlwinm r31, r31, 0, 0, 29
|
||
mr r16, r30
|
||
mr r17, r31
|
||
bl print_memory
|
||
b @prompt
|
||
|
||
@missing_physical_addr
|
||
_log 'Need a physical address^n'
|
||
b @prompt
|
||
|
||
@bad_length_1
|
||
_log 'Length must be a hexadecimal value^n'
|
||
b @prompt
|
||
|
||
@cmd_dumpmem_logical
|
||
_log 'Logical memory^n'
|
||
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq- @missing_logical_addr
|
||
bl major_0x187b0
|
||
bne- @bad_length_2
|
||
mr r30, r16
|
||
li r31, 0x10
|
||
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq- @0x6b0
|
||
bl major_0x187b0
|
||
bne- @bad_length_2
|
||
mr r31, r16
|
||
|
||
@0x6b0
|
||
addi r31, r31, 0x03
|
||
rlwinm r31, r31, 0, 0, 29
|
||
mr r16, r30
|
||
mr r17, r31
|
||
bl print_memory_logical
|
||
b @prompt
|
||
|
||
@missing_logical_addr
|
||
_log 'Need a logical address^n'
|
||
b @prompt
|
||
|
||
@bad_length_2
|
||
_log 'Length must be a hexadecimal value^n'
|
||
b @prompt
|
||
|
||
@cmd_goto
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
lwz r31, 0x0904(r1)
|
||
beq- @0x748
|
||
bl major_0x187b0
|
||
bne- @bad_resume_address
|
||
stw r16, 0x0904(r1)
|
||
|
||
@0x748
|
||
|
||
@NKDebugShimCode
|
||
_log 'Resuming at '
|
||
lwz r31, 0x0904(r1)
|
||
mr r8, r31
|
||
bl Printw
|
||
_log ' - wish me luck.^n'
|
||
bl prereturn
|
||
lwz r8, 0x0904(r1)
|
||
|
||
_AssertAndRelease PSA.ThudLock, scratch=r9
|
||
|
||
mtlr r8
|
||
blr
|
||
|
||
@bad_resume_address
|
||
_log 'Need hexadecimal value for resume address^n'
|
||
b @prompt
|
||
|
||
@cmd_opaque_id_info
|
||
; r15 = start
|
||
bl next_cmd_word
|
||
; r15 = ptr
|
||
; r16 = char
|
||
|
||
cmpwi r16, 0x00
|
||
beq- @missing_opaque_id
|
||
bl @load_id_args
|
||
mflr r16
|
||
li r17, 0x00
|
||
|
||
; r16 = command strings
|
||
; r17 = lut
|
||
bl cmd_lookup
|
||
; cr0 = found
|
||
; r17 = ptr to lut entry
|
||
|
||
bne- @0x884
|
||
li r29, 0x00
|
||
li r30, 0x00
|
||
srwi r31, r17, 2
|
||
|
||
@0x82c
|
||
mr r8, r30
|
||
mr r9, r31
|
||
bl GetNextIDOfClass
|
||
mr. r30, r8
|
||
beq- @0x868
|
||
mr r8, r8
|
||
bl Printw
|
||
addi r29, r29, 0x01
|
||
andi. r29, r29, 0x07
|
||
bne+ @0x82c
|
||
_log '^n'
|
||
b @0x82c
|
||
|
||
@0x868
|
||
cmpwi r29, 0x00
|
||
beq+ @prompt
|
||
_log '^n'
|
||
b @prompt
|
||
|
||
@0x884
|
||
bl major_0x187b0
|
||
bne- @bad_opaque_id
|
||
mr r30, r16
|
||
mr r8, r16
|
||
|
||
; r8 = id
|
||
bl LookupID
|
||
; r8 = something not sure what
|
||
; r9 = 0:inval, 1:proc, 2:task, 3:timer, 4:q, 5:sema, 6:cr, 7:cpu, 8:addrspc, 9:evtg, 10:cohg, 11:area, 12:not, 13:log
|
||
|
||
mr r31, r8
|
||
_log 'ID '
|
||
mr r8, r30
|
||
bl Printw
|
||
bl @load_id_kind_strings
|
||
mflr r17
|
||
slwi r18, r9, 4
|
||
add r8, r17, r18
|
||
bl PrintS
|
||
cmpwi r9, 0x00
|
||
beq- @0x978
|
||
_log ' at '
|
||
mr r8, r31
|
||
bl Printw
|
||
_log '^n'
|
||
mr r16, r31
|
||
bl @load_more_jumps
|
||
mflr r17
|
||
slwi r18, r9, 2
|
||
lwzx r17, r17, r18
|
||
bl print_memory
|
||
b @prompt
|
||
|
||
@missing_opaque_id
|
||
_log 'Need an opaque ID^n'
|
||
b @prompt
|
||
|
||
@bad_opaque_id
|
||
_log 'ID must be a hexadecimal value^n'
|
||
b @prompt
|
||
|
||
@0x978
|
||
_log '^n'
|
||
b @prompt
|
||
|
||
@load_id_kind_strings
|
||
blrl
|
||
string CString
|
||
dc.b 'is invalid. '
|
||
dc.b 'Process '
|
||
dc.b 'Task '
|
||
dc.b 'Timer '
|
||
dc.b 'Queue '
|
||
dc.b 'Semaphore '
|
||
dc.b 'Critical Region'
|
||
dc.b 'Cpu '
|
||
dc.b 'Address Space '
|
||
dc.b 'Event Group '
|
||
dc.b 'Coherence Group'
|
||
dc.b 'Area '
|
||
dc.b 'Notification '
|
||
dc.b 'Console Log '
|
||
align 2
|
||
|
||
@load_more_jumps
|
||
blrl
|
||
dc.l 0
|
||
dc.l Process.Size
|
||
dc.l Task.Size
|
||
dc.l Timer.Size
|
||
dc.l Queue.Size
|
||
dc.l Semaphore.Size
|
||
dc.l CriticalRegion.Size
|
||
dc.l CPU.Size
|
||
dc.l AddressSpace.Size
|
||
dc.l EventGroup.Size
|
||
dc.l CoherenceGroup.Size
|
||
dc.l Area.Size
|
||
dc.l Notification.Size
|
||
dc.l ConsoleLog.Size
|
||
|
||
@load_id_args
|
||
blrl
|
||
dc.b '-all'
|
||
dc.b '-p'
|
||
dc.b '-t'
|
||
dc.b '-tm'
|
||
dc.b '-q'
|
||
dc.b '-s'
|
||
dc.b '-r'
|
||
dc.b '-c'
|
||
dc.b '-sp'
|
||
dc.b '-e'
|
||
dc.b '-cg'
|
||
dc.b '-a'
|
||
dc.b '-n'
|
||
dc.b '-nc'
|
||
dc.b 0xff
|
||
align 2
|
||
|
||
@cmd_display_kern_data
|
||
mfsprg r17, 0
|
||
|
||
_log 'Kernel version '
|
||
lhz r8, KDP.InfoRecord + InfoRecord.NKNanoKernelInfoVer(r1)
|
||
bl Printh
|
||
|
||
_log 'Code base '
|
||
lwz r8, KDP.PA_NanoKernelCode(r1)
|
||
bl Printw
|
||
|
||
_log 'PSA '
|
||
addi r8, r17, PSA.Base
|
||
bl Printw
|
||
|
||
_log 'KDP '
|
||
mr r8, r1
|
||
bl Printw
|
||
|
||
_log 'EDP '
|
||
lwz r8, KDP.PA_EmulatorData(r1)
|
||
bl Printw
|
||
|
||
_log '^nCurrent EWA '
|
||
mr r8, r17
|
||
bl Printw
|
||
|
||
_log ' is CPU '
|
||
lhz r8, -0x0116(r17)
|
||
bl Printh
|
||
|
||
_log ' ID-'
|
||
lwz r8, -0x0340(r17)
|
||
bl Printw
|
||
|
||
lwz r18, EWA.PA_CurTask(r17)
|
||
_log '^nCurrent task '
|
||
mr r8, r18
|
||
bl Printw
|
||
|
||
_log 'ID-'
|
||
lwz r8, Task.ID(r18)
|
||
bl Printw
|
||
|
||
_log 'name \"'
|
||
lwz r8, Task.Name(r18)
|
||
rotlwi r8, r8, 8
|
||
bl Printc
|
||
rotlwi r8, r8, 8
|
||
bl Printc
|
||
rotlwi r8, r8, 8
|
||
bl Printc
|
||
rotlwi r8, r8, 8
|
||
bl Printc
|
||
|
||
_log '\" Owning process '
|
||
lwz r8, 0x006c(r18)
|
||
bl Printw
|
||
|
||
_log ' ID-'
|
||
lwz r8, 0x0060(r18)
|
||
bl Printw
|
||
|
||
_log '^nAddress Space '
|
||
lwz r18, -0x001c(r17)
|
||
mr r8, r18
|
||
bl Printw
|
||
|
||
_log ' ID-'
|
||
lwz r8, 0x0000(r18)
|
||
bl Printw
|
||
|
||
_log '^n'
|
||
|
||
bl print_xpt_info
|
||
b @prompt
|
||
|
||
@cmd_dump_registers
|
||
_log 'Kernel registers:^n'
|
||
bl print_sprgs
|
||
bl print_sprs
|
||
_log '^n'
|
||
bl print_segment_registers
|
||
_log '^n'
|
||
bl print_gprs
|
||
b @prompt
|
||
|
||
|
||
|
||
; major_0x18040
|
||
|
||
; Xrefs:
|
||
; "EightyForty"
|
||
|
||
mflr r16
|
||
lwz r17, 0x07b4(r1)
|
||
rlwinm r17, r17, 16, 16, 27
|
||
cmpwi r17, 0x6800
|
||
bne- major_0x18040_0x100
|
||
lwz r17, 0x071c(r1)
|
||
srwi r17, r17, 16
|
||
andi. r17, r17, 0xffa0
|
||
cmpwi r17, 0x2a0
|
||
bne- major_0x18040_0x64
|
||
_log 'Caused by emulator termination request^n'
|
||
b major_0x18040_0x9c
|
||
|
||
major_0x18040_0x64
|
||
_log 'Caused by unhandled emulator exception^n'
|
||
|
||
major_0x18040_0x9c
|
||
lwz r17, 0x079c(r1)
|
||
lwz r18, 0x0704(r1)
|
||
subf r17, r18, r17
|
||
cmpwi r17, 0x100
|
||
cmpwi cr1, r17, -0x100
|
||
bgt- major_0x18040_0x100
|
||
blt- cr1, major_0x18040_0x100
|
||
_log 'Looks like interrupt stack overflow by os or application^n'
|
||
|
||
major_0x18040_0x100
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_xpt_info
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_xpt_info ; OUTSIDE REFERER
|
||
mflr r16
|
||
lwz r18, 0x064c(r1)
|
||
llabel r18, NKBtm
|
||
add r19, r18, r19
|
||
_log 'Termination caller '
|
||
lwz r20, 0x0904(r1)
|
||
mr r8, r20
|
||
bl Printw
|
||
subf. r21, r18, r20
|
||
cmplw cr1, r20, r19
|
||
blt- print_xpt_info_0x84
|
||
bge- cr1, print_xpt_info_0x84
|
||
_log '( NK+'
|
||
mr r8, r21
|
||
bl Printw
|
||
_log ')^n'
|
||
|
||
print_xpt_info_0x84
|
||
_log ' Last exception at '
|
||
mfspr r8, srr1
|
||
bl Printw
|
||
mfspr r8, srr0
|
||
bl Printw
|
||
mfspr r8, srr0
|
||
subf. r21, r18, r8
|
||
cmplw cr1, r8, r19
|
||
blt- print_xpt_info_0xf8
|
||
bge- cr1, print_xpt_info_0xf8
|
||
_log '( NK+'
|
||
mr r8, r21
|
||
bl Printw
|
||
_log ')'
|
||
|
||
print_xpt_info_0xf8
|
||
_log '^n'
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_sprgs
|
||
|
||
; Goldmine. Tells me what the SPRGs do!
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_sprgs ; OUTSIDE REFERER
|
||
mflr r16
|
||
_log 'SPRGs ewa: '
|
||
mfsprg r8, 0
|
||
bl Printw
|
||
_log ' r1: '
|
||
mfsprg r8, 1
|
||
bl Printw
|
||
_log ' lr: '
|
||
mfsprg r8, 2
|
||
bl Printw
|
||
_log ' vecBase: '
|
||
mfsprg r8, 3
|
||
bl Printw
|
||
_log '^n'
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_sprs
|
||
|
||
; Both user-mode and supervisor-only
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_sprs ; OUTSIDE REFERER
|
||
mflr r16
|
||
_log ' cr: '
|
||
lwz r8, 0x0780(r1)
|
||
bl Printw
|
||
_log 'xer: '
|
||
lwz r8, 0x0788(r1)
|
||
bl Printw
|
||
_log 'ctr: '
|
||
lwz r8, 0x0790(r1)
|
||
bl Printw
|
||
_log 'lr: '
|
||
lwz r8, 0x078c(r1)
|
||
bl Printw
|
||
_log '^n dsisr: '
|
||
lwz r8, 0x0798(r1)
|
||
bl Printw
|
||
_log 'dar:'
|
||
lwz r8, 0x079c(r1)
|
||
bl Printw
|
||
_log 'pvr: '
|
||
lwz r8, 0x0794(r1)
|
||
bl Printw
|
||
_log '^n'
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_segment_registers
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_segment_registers ; OUTSIDE REFERER
|
||
mflr r16
|
||
_log ' sr0-sr7 '
|
||
li r17, 0x08
|
||
mtctr r17
|
||
li r18, 0x00
|
||
|
||
print_segment_registers_0x28
|
||
mfsrin r8, r18
|
||
addis r18, r18, 0x1000
|
||
bl Printw
|
||
bdnz+ print_segment_registers_0x28
|
||
_log '^n sr8-sr15 '
|
||
li r17, 0x08
|
||
mtctr r17
|
||
|
||
print_segment_registers_0x5c
|
||
mfsrin r8, r18
|
||
addis r18, r18, 0x1000
|
||
bl Printw
|
||
bdnz+ print_segment_registers_0x5c
|
||
_log '^n'
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_gprs
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_gprs ; OUTSIDE REFERER
|
||
mflr r16
|
||
addi r17, r1, 0x6fc
|
||
_log ' r0-r7 '
|
||
li r18, 0x08
|
||
mtctr r18
|
||
|
||
print_gprs_0x28
|
||
lwzu r8, 0x0004(r17)
|
||
bl Printw
|
||
bdnz+ print_gprs_0x28
|
||
_log '^n r8-r15 '
|
||
li r18, 0x08
|
||
mtctr r18
|
||
|
||
print_gprs_0x58
|
||
lwzu r8, 0x0004(r17)
|
||
bl Printw
|
||
bdnz+ print_gprs_0x58
|
||
_log '^n r16-r23 '
|
||
li r18, 0x08
|
||
mtctr r18
|
||
|
||
print_gprs_0x88
|
||
lwzu r8, 0x0004(r17)
|
||
bl Printw
|
||
bdnz+ print_gprs_0x88
|
||
_log '^n r24-r31 '
|
||
li r18, 0x08
|
||
mtctr r18
|
||
|
||
print_gprs_0xb8
|
||
lwzu r8, 0x0004(r17)
|
||
bl Printw
|
||
bdnz+ print_gprs_0xb8
|
||
_log '^n'
|
||
mtlr r16
|
||
blr
|
||
|
||
|
||
|
||
; print_memory
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_memory ; OUTSIDE REFERER
|
||
mflr r18
|
||
srwi r17, r17, 4
|
||
|
||
print_memory_0x8
|
||
mr r8, r16
|
||
bl Printw
|
||
_log ' '
|
||
lwz r8, 0x0000(r16)
|
||
bl Printw
|
||
lwz r8, 0x0004(r16)
|
||
bl Printw
|
||
lwz r8, 0x0008(r16)
|
||
bl Printw
|
||
lwz r8, 0x000c(r16)
|
||
bl Printw
|
||
_log ' *'
|
||
li r8, 0x10
|
||
addi r16, r16, -0x01
|
||
mtctr r8
|
||
|
||
print_memory_0x60
|
||
lbzu r8, 0x0001(r16)
|
||
cmpwi r8, 0xff
|
||
beq- print_memory_0x74
|
||
cmpwi r8, 0x20
|
||
bgt- print_memory_0x78
|
||
|
||
print_memory_0x74
|
||
li r8, 0x20
|
||
|
||
print_memory_0x78
|
||
bl Printc
|
||
bdnz+ print_memory_0x60
|
||
_log '*^n'
|
||
addi r16, r16, 0x01
|
||
addi r17, r17, -0x01
|
||
bl getchar
|
||
cmpwi r8, -0x01
|
||
bne- print_memory_0xb0
|
||
cmpwi r17, 0x00
|
||
bne+ print_memory_0x8
|
||
|
||
print_memory_0xb0
|
||
_log '^n'
|
||
mtlr r18
|
||
blr
|
||
|
||
|
||
|
||
; print_memory_logical
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
print_memory_logical ; OUTSIDE REFERER
|
||
mflr r18
|
||
srwi r17, r17, 4
|
||
|
||
print_memory_logical_0x8
|
||
mr r8, r16
|
||
bl Printw
|
||
_log ' '
|
||
li r19, 0x10
|
||
|
||
print_memory_logical_0x24
|
||
mr r27, r16
|
||
bl PagingFunc1
|
||
beq- print_memory_logical_0x5c
|
||
blt- print_memory_logical_0x48
|
||
_log '..'
|
||
b print_memory_logical_0x6c
|
||
|
||
print_memory_logical_0x48
|
||
_log '--'
|
||
b print_memory_logical_0x6c
|
||
|
||
print_memory_logical_0x5c
|
||
bl PagingFunc4
|
||
rlwimi r31, r27, 0, 20, 31
|
||
lbz r8, 0x0000(r31)
|
||
bl print_unknown
|
||
|
||
print_memory_logical_0x6c
|
||
addi r16, r16, 0x01
|
||
addi r19, r19, -0x01
|
||
andi. r8, r19, 0x03
|
||
bne- print_memory_logical_0x84
|
||
li r8, 0x20
|
||
bl Printc
|
||
|
||
print_memory_logical_0x84
|
||
cmpwi r19, 0x00
|
||
bgt+ print_memory_logical_0x24
|
||
_log ' *'
|
||
li r8, 0x10
|
||
addi r16, r16, -0x10
|
||
mtctr r8
|
||
|
||
print_memory_logical_0xac
|
||
mr r27, r16
|
||
bl PagingFunc1
|
||
li r8, 0x20
|
||
bne- print_memory_logical_0xdc
|
||
bl PagingFunc4
|
||
rlwimi r31, r27, 0, 20, 31
|
||
lbz r8, 0x0000(r31)
|
||
cmpwi r8, 0xff
|
||
beq- print_memory_logical_0xd8
|
||
cmpwi r8, 0x20
|
||
bgt- print_memory_logical_0xdc
|
||
|
||
print_memory_logical_0xd8
|
||
li r8, 0x20
|
||
|
||
print_memory_logical_0xdc
|
||
bl Printc
|
||
addi r16, r16, 0x01
|
||
bdnz+ print_memory_logical_0xac
|
||
_log '*^n'
|
||
addi r17, r17, -0x01
|
||
bl getchar
|
||
cmpwi r8, -0x01
|
||
bne- print_memory_logical_0x114
|
||
cmpwi r17, 0x00
|
||
bne+ print_memory_logical_0x8
|
||
|
||
print_memory_logical_0x114
|
||
_log '^n'
|
||
mtlr r18
|
||
blr
|
||
|
||
|
||
|
||
; cmd_lookup
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
; > r16 = command strings
|
||
; > r17 = lut
|
||
|
||
; < cr0 = found
|
||
; < r17 = ptr to lut entry
|
||
|
||
cmd_lookup ; OUTSIDE REFERER
|
||
addi r15, r15, -0x01
|
||
addi r16, r16, -0x01
|
||
mr r18, r15
|
||
|
||
cmd_lookup_0xc
|
||
lbzu r21, 0x0001(r16)
|
||
lbzu r20, 0x0001(r15)
|
||
cmpwi r21, 0xff
|
||
cmpwi cr1, r21, 0x00
|
||
beq- cmd_lookup_0x44
|
||
beq- cr1, cmd_lookup_0x50
|
||
cmpw r20, r21
|
||
beq+ cmd_lookup_0xc
|
||
|
||
cmd_lookup_0x2c
|
||
lbzu r21, 0x0001(r16)
|
||
cmpwi r21, 0x00
|
||
bne+ cmd_lookup_0x2c
|
||
|
||
cmd_lookup_0x38
|
||
addi r17, r17, 0x04
|
||
mr r15, r18
|
||
b cmd_lookup_0xc
|
||
|
||
cmd_lookup_0x44
|
||
addi r15, r18, 0x01
|
||
cmpw r15, r18
|
||
blr
|
||
|
||
cmd_lookup_0x50
|
||
cmpwi r20, 0x20
|
||
beqlr-
|
||
cmpwi r20, 0x00
|
||
beqlr-
|
||
b cmd_lookup_0x38
|
||
|
||
|
||
|
||
; next_cmd_word
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
; > r15 = start
|
||
|
||
; < r15 = ptr
|
||
; < r16 = char
|
||
|
||
next_cmd_word ; OUTSIDE REFERER
|
||
addi r15, r15, -0x01
|
||
|
||
next_cmd_word_0x4
|
||
lbzu r16, 0x0001(r15)
|
||
cmpwi r16, 0x20
|
||
beq+ next_cmd_word_0x4
|
||
blr
|
||
|
||
|
||
|
||
; major_0x187b0
|
||
|
||
; Xrefs:
|
||
; panic
|
||
|
||
major_0x187b0 ; OUTSIDE REFERER
|
||
addi r15, r15, -0x01
|
||
li r16, 0x00
|
||
|
||
major_0x187b0_0x8
|
||
lbzu r17, 0x0001(r15)
|
||
cmplwi r17, 0x30
|
||
cmplwi cr1, r17, 0x39
|
||
blt- major_0x187b0_0x28
|
||
bgt- cr1, major_0x187b0_0x28
|
||
slwi r16, r16, 4
|
||
rlwimi r16, r17, 0, 28, 31
|
||
b major_0x187b0_0x8
|
||
|
||
major_0x187b0_0x28
|
||
cmplwi r17, 0x61
|
||
cmplwi cr1, r17, 0x66
|
||
blt- major_0x187b0_0x48
|
||
bgt- cr1, major_0x187b0_0x48
|
||
addi r17, r17, -0x57
|
||
slwi r16, r16, 4
|
||
rlwimi r16, r17, 0, 28, 31
|
||
b major_0x187b0_0x8
|
||
|
||
major_0x187b0_0x48
|
||
cmplwi r17, 0x41
|
||
cmplwi cr1, r17, 0x46
|
||
blt- major_0x187b0_0x68
|
||
bgt- cr1, major_0x187b0_0x68
|
||
addi r17, r17, -0x37
|
||
slwi r16, r16, 4
|
||
rlwimi r16, r17, 0, 28, 31
|
||
b major_0x187b0_0x8
|
||
|
||
major_0x187b0_0x68
|
||
cmpwi r17, 0x00
|
||
beqlr-
|
||
cmpwi r17, 0x20
|
||
blr
|
||
|
||
|
||
prereturn ; OUTSIDE REFERER
|
||
lwz r1, EWA.PA_KDP(r1)
|
||
|
||
mfmsr r0
|
||
_bset r0, r0, MSR_FPbit
|
||
mtmsr r0
|
||
isync
|
||
|
||
lfd f31, 0x08fc(r1)
|
||
mtfsf 0xff, f31
|
||
lfd f0, 0x0800(r1)
|
||
lfd f1, 0x0808(r1)
|
||
lfd f2, 0x0810(r1)
|
||
lfd f3, 0x0818(r1)
|
||
lfd f4, 0x0820(r1)
|
||
lfd f5, 0x0828(r1)
|
||
lfd f6, 0x0830(r1)
|
||
lfd f7, 0x0838(r1)
|
||
lfd f8, 0x0840(r1)
|
||
lfd f9, 0x0848(r1)
|
||
lfd f10, 0x0850(r1)
|
||
lfd f11, 0x0858(r1)
|
||
lfd f12, 0x0860(r1)
|
||
lfd f13, 0x0868(r1)
|
||
lfd f14, 0x0870(r1)
|
||
lfd f15, 0x0878(r1)
|
||
lfd f16, 0x0880(r1)
|
||
lfd f17, 0x0888(r1)
|
||
lfd f18, 0x0890(r1)
|
||
lfd f19, 0x0898(r1)
|
||
lfd f20, 0x08a0(r1)
|
||
lfd f21, 0x08a8(r1)
|
||
lfd f22, 0x08b0(r1)
|
||
lfd f23, 0x08b8(r1)
|
||
lfd f24, 0x08c0(r1)
|
||
lfd f25, 0x08c8(r1)
|
||
lfd f26, 0x08d0(r1)
|
||
lfd f27, 0x08d8(r1)
|
||
lfd f28, 0x08e0(r1)
|
||
lfd f29, 0x08e8(r1)
|
||
lfd f30, 0x08f0(r1)
|
||
lfd f31, 0x08f8(r1)
|
||
|
||
lwz r0, 0x07c0(r1)
|
||
mtsr 0x00, r0
|
||
lwz r0, 0x07c4(r1)
|
||
mtsr 0x01, r0
|
||
lwz r0, 0x07c8(r1)
|
||
mtsr 0x02, r0
|
||
lwz r0, 0x07cc(r1)
|
||
mtsr 0x03, r0
|
||
lwz r0, 0x07d0(r1)
|
||
mtsr 0x04, r0
|
||
lwz r0, 0x07d4(r1)
|
||
mtsr 0x05, r0
|
||
lwz r0, 0x07d8(r1)
|
||
mtsr 0x06, r0
|
||
lwz r0, 0x07dc(r1)
|
||
mtsr 0x07, r0
|
||
lwz r0, 0x07e0(r1)
|
||
mtsr 0x08, r0
|
||
lwz r0, 0x07e4(r1)
|
||
mtsr 0x09, r0
|
||
lwz r0, 0x07e8(r1)
|
||
mtsr 0x0a, r0
|
||
lwz r0, 0x07ec(r1)
|
||
mtsr 0x0b, r0
|
||
lwz r0, 0x07f0(r1)
|
||
mtsr 0x0c, r0
|
||
lwz r0, 0x07f4(r1)
|
||
mtsr 0x0d, r0
|
||
lwz r0, 0x07f8(r1)
|
||
mtsr 0x0e, r0
|
||
lwz r0, 0x07fc(r1)
|
||
mtsr 0x0f, r0
|
||
|
||
lwz r0, 0x07a8(r1)
|
||
mtspr dec, r0
|
||
|
||
lwz r0, 0x07b4(r1)
|
||
mtspr srr0, r0
|
||
lwz r0, 0x07b8(r1)
|
||
mtspr srr1, r0
|
||
|
||
lwz r0, 0x07bc(r1)
|
||
mtmsr r0
|
||
|
||
mfpvr r0
|
||
rlwinm. r0, r0, 0, 0, 14
|
||
|
||
bne- @not_601
|
||
lwz r0, 0x0784(r1)
|
||
mtspr mq, r0
|
||
@not_601
|
||
|
||
lwz r0, 0x0788(r1)
|
||
mtxer r0
|
||
lwz r0, 0x078c(r1)
|
||
mtsprg 2, r0
|
||
lwz r0, 0x0790(r1)
|
||
mtctr r0
|
||
|
||
; Only because this crashes QEMU
|
||
|
||
if &TYPE('NKDebugShim') = 'UNDEFINED'
|
||
lwz r0, 0x0794(r1)
|
||
mtspr pvr, r0
|
||
endif
|
||
|
||
lwz r0, 0x0798(r1)
|
||
mtspr dsisr, r0
|
||
lwz r0, 0x079c(r1)
|
||
mtspr dar, r0
|
||
lwz r0, 0x0780(r1)
|
||
mtcr r0
|
||
lwz r0, 0x0700(r1)
|
||
lwz r2, 0x0704(r1)
|
||
mtsprg 1, r2
|
||
lmw r2, 0x0708(r1)
|
||
|
||
|
||
blr
|
||
|
||
align 5
|