mirror of
https://github.com/elliotnunn/powermac-rom.git
synced 2024-06-07 08:30:20 +00:00
lots of architectural work
This commit is contained in:
parent
dbf0af7ab9
commit
2194a99638
|
@ -32,13 +32,13 @@ MRDataStorageInt ; Consult DSISR and the page table to decide what to do
|
|||
@access_exception
|
||||
andi. r28, r31, 3
|
||||
li r8, ecDataSupAccessViolation
|
||||
beq ExceptionAfterRetry
|
||||
beq MRException
|
||||
|
||||
cmpwi r28, 3
|
||||
li r8, ecDataWriteViolation
|
||||
beq ExceptionAfterRetry ; Nobody allowed to write => Exception
|
||||
beq MRException ; Nobody allowed to write => Exception
|
||||
li r8, ecDataSupWriteViolation
|
||||
b ExceptionAfterRetry ; Supervisor allowed to write => Exception
|
||||
b MRException ; Supervisor allowed to write => Exception
|
||||
|
||||
@possible_htab_miss
|
||||
andis. r28, r31, 0x8010 ; Check for DataAccess Interrupt or ec[io]wx
|
||||
|
@ -49,9 +49,9 @@ MRDataStorageInt ; Consult DSISR and the page table to decide what to do
|
|||
mtlr r28
|
||||
beq @return ; HTAB success => RFI
|
||||
li r8, ecDataPageFault
|
||||
blt ExceptionAfterRetry ; Fault => Exception
|
||||
blt MRException ; Fault => Exception
|
||||
li r8, ecDataInvalidAddress
|
||||
b ExceptionAfterRetry ; Bad address => Exception
|
||||
b MRException ; Bad address => Exception
|
||||
|
||||
MRMachineCheckInt ; Always gives HW fault
|
||||
mfsprg r1, 1
|
||||
|
@ -77,7 +77,7 @@ MRMachineCheckInt ; Always gives HW fault
|
|||
MRHardwareFault ; Can come from a DSI or a Machine Check
|
||||
cmplw r10, r19
|
||||
li r8, ecDataHardwareFault
|
||||
bne ExceptionAfterRetry
|
||||
bne MRException
|
||||
|
||||
mtsprg 3, r24
|
||||
lmw r14, KDP.r14(r1)
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
; Each routine accepts:
|
||||
; r17 = pretend inst with (byteCount-1) in bits 28-30 (will be decremented)
|
||||
; r17 = pretend inst with accessLen (range 1-8) in bits 27-30 (will be decremented)
|
||||
; r19 = address of byte to the right of the string to be loaded/saved
|
||||
; r23 as a scratch register
|
||||
; r20/r21 = right-justified data (stores only)
|
||||
|
||||
; Before jumping to MRDoSecondary or one of the MRFast paths, each routine sets:
|
||||
; r20/r21 = right-justified data (loads only)
|
||||
; r17 has byteCount field decremented
|
||||
; r17 has len field decremented
|
||||
; r23 = junk, not to be trusted
|
||||
|
||||
########################################################################
|
||||
|
|
|
@ -1,6 +1,25 @@
|
|||
MACRO
|
||||
optabRow &upperSix, &lowerSix, &flags, &primLabel, &secLabel
|
||||
DC.W ((&lowerSix) << 10) | (&upperSix << 4) | &flags ; 0-5 lowerSix, 6-11 upperSix, 12-15 flags
|
||||
IF &TYPE('&upperSix') = 'UNDEFINED' ; 0-5 lowerSix
|
||||
orUpperSix set 63
|
||||
ELSE
|
||||
orUpperSix set &upperSix
|
||||
ENDIF
|
||||
|
||||
IF &TYPE('&lowerSix') = 'UNDEFINED' ; 6-11 upperSix
|
||||
orLowerSix set 1
|
||||
ELSE
|
||||
orLowerSix set &lowerSix
|
||||
ENDIF
|
||||
|
||||
IF &TYPE('&flags') = 'UNDEFINED' ; 12-15 flags
|
||||
orFlags set 1
|
||||
ELSE
|
||||
orFlags set &flags
|
||||
ENDIF
|
||||
|
||||
DC.W (orLowerSix << 10) | (orUpperSix << 4) | orFlags
|
||||
|
||||
IF &TYPE('&primLabel') = 'UNDEFINED' ; 16-23 primary routine
|
||||
DC.B (MRPriCrash - MRBase) >> 2
|
||||
ELSE
|
||||
|
@ -13,144 +32,145 @@
|
|||
ENDIF
|
||||
ENDM
|
||||
|
||||
; LEGEND .. top 6 bits of r17
|
||||
; .. bottom 6 bits of r17
|
||||
; . mrOpflag1
|
||||
; . mrOpflag2
|
||||
; . mrOpflag3
|
||||
; . mrFlagDidLoad
|
||||
; LEGEND .. metatab index (r17 bits 0-5, dflt=63)
|
||||
; .... access size (r17 bits 27-30) and (L)oad/(S)tore (r17 bit 31)
|
||||
;
|
||||
; primary routine secondary routine
|
||||
; (dflt=MRPriCrash) (dflt=MRSecException)
|
||||
; ................ ................
|
||||
; . mrOpflag1 }
|
||||
; . mrOpflag2 } cr3 flags,
|
||||
; . mrOpflag3 } all unset by default
|
||||
; . mrFlagDidLoad }
|
||||
;
|
||||
; primary routine secondary routine X-form extended opcode D-form opcode
|
||||
; (dflt=MRPriCrash) (dflt=MRSecExc'n)
|
||||
; ................ ................ ....................... .................
|
||||
|
||||
MROptabX
|
||||
optabRow 20, 9, %0000, MRPriPlainLoad, MRSecLWARX ; Xopcd=00000(101)00=020=LWARX
|
||||
optabRow 21, 17, %0000, , ; Xopcd=00010(101)00=084
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00100(101)00=148
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00110(101)00=212
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01000(101)00=276
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01010(101)00=340
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01100(101)00=404
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01110(101)00=468
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10000(101)00=532
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10010(101)00=596
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10100(101)00=660
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10110(101)00=724
|
||||
optabRow 3, 17, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=11000(101)00=788
|
||||
optabRow 6, 9, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=11010(101)00=852
|
||||
optabRow 19, 16, %0000, MRPriPlainStore, MRSecDone ; Xopcd=11100(101)00=916
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11110(101)00=980
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00001(101)00=052
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00011(101)00=116
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00101(101)00=180
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00111(101)00=244
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01001(101)00=308
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01011(101)00=372
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01101(101)00=436
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01111(101)00=500
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10001(101)00=564
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10011(101)00=628
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10101(101)00=692
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10111(101)00=756
|
||||
optabRow 3, 17, %0000, MRPriUpdLoad, MRSecLoad ; Xopcd=11001(101)00=820
|
||||
optabRow 27, 17, %0011, , ; Xopcd=11011(101)00=884
|
||||
optabRow 19, 16, %0000, MRPriUpdStore, MRSecDone ; Xopcd=11101(101)00=948
|
||||
optabRow 31, 16, %0010, , ; Xopcd=11111(101)00=1012
|
||||
optabRow 3, 17, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=00000(101)01=021=LDX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00010(101)01=085
|
||||
optabRow 19, 16, %0000, MRPriPlainStore, MRSecDone ; Xopcd=00100(101)01=149=STDX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00110(101)01=213
|
||||
optabRow 40, 9, %1011, MRPriUnknown, MRSecUnknown ; Xopcd=01000(101)01=277
|
||||
optabRow 6, 9, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=01010(101)01=341
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01100(101)01=405
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01110(101)01=469
|
||||
optabRow 32, 9, %1011, MRPriLSWX, MRSecLSWix ; Xopcd=10000(101)01=533=LSWX
|
||||
optabRow 32, 9, %1111, MRPriLSWI, MRSecLSWix ; Xopcd=10010(101)01=597=LSWI
|
||||
optabRow 36, 8, %0010, MRPriSTSWX, MRSecStrStore ; Xopcd=10100(101)01=661=STSWX
|
||||
optabRow 36, 8, %1110, MRPriSTSWI, MRSecStrStore ; Xopcd=10110(101)01=725=STSWI
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11000(101)01=789
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11010(101)01=853
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11100(101)01=917
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11110(101)01=981
|
||||
optabRow 3, 17, %0000, MRPriUpdLoad, MRSecLoad ; Xopcd=00001(101)01=053=LDUX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00011(101)01=117
|
||||
optabRow 19, 16, %0000, MRPriUpdStore, MRSecDone ; Xopcd=00101(101)01=181=STDUX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00111(101)01=245
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01001(101)01=309
|
||||
optabRow 6, 9, %0000, MRPriUpdLoad, MRSecDone ; Xopcd=01011(101)01=373=LWAUX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01101(101)01=437
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01111(101)01=501
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10001(101)01=565
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10011(101)01=629
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10101(101)01=693
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10111(101)01=757
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11001(101)01=821
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11011(101)01=885
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11101(101)01=949
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11111(101)01=1013
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00000(101)10=022
|
||||
optabRow 62, 3, %0010, MRPriUpdLoad, MRSecCacheWang ; Xopcd=00010(101)10=086
|
||||
optabRow 22, 9, %0000, MRPriPlainStore, MRSecSTWCX ; Xopcd=00100(101)10=150=STWCX.
|
||||
optabRow 23, 16, %0000, , ; Xopcd=00110(101)10=214
|
||||
optabRow 62, 3, %0010, MRPriUpdLoad, MRSecCacheWang ; Xopcd=01000(101)10=278=DCBT
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01010(101)10=342
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01100(101)10=406
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01110(101)10=470
|
||||
optabRow 10, 9, %0010, MRPriUpdLoad, MRSecLWBRX ; Xopcd=10000(101)10=534=LWBRX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10010(101)10=598
|
||||
optabRow 18, 8, %0000, MRPriSTWBRX, MRSecDone ; Xopcd=10100(101)10=662=STWBRX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10110(101)10=726
|
||||
optabRow 9, 5, %0010, MRPriUpdLoad, MRSecLHBRX ; Xopcd=11000(101)10=790=LHBRX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11010(101)10=854
|
||||
optabRow 17, 4, %0000, MRPriSTHBRX, MRSecDone ; Xopcd=11100(101)10=918=STHBRX
|
||||
optabRow 62, 3, %0010, MRPriUpdLoad, MRSecCacheWang ; Xopcd=11110(101)10=982=ICBI
|
||||
optabRow 62, 3, %0010, MRPriUpdLoad, MRSecCacheWang ; Xopcd=00001(101)10=054=DCBST
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00011(101)10=118
|
||||
optabRow 63, 1, %0000, , ; Xopcd=00101(101)10=182
|
||||
optabRow 62, 3, %0010, MRPriUpdLoad, MRSecCacheWang ; Xopcd=00111(101)10=246=DCBTST
|
||||
optabRow 63, 1, %0000, MRPriPlainLoad, MRSecIOInstFail ; Xopcd=01001(101)10=310=ECIWX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01011(101)10=374
|
||||
optabRow 63, 0, %0000, MRPriPlainStore, MRSecIOInstFail ; Xopcd=01101(101)10=438=ECOWX
|
||||
optabRow 63, 1, %0000, , ; Xopcd=01111(101)10=502
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10001(101)10=566
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10011(101)10=630
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10101(101)10=694
|
||||
optabRow 63, 1, %0000, , ; Xopcd=10111(101)10=758
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11001(101)10=822
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11011(101)10=886
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11101(101)10=950
|
||||
optabRow 48, 16, %0010, MRPriDCBZ, MRSecDCBZ ; Xopcd=11111(101)10=1014=DCBZ
|
||||
optabRow 20, 4,L, %0000, MRPriPlainLoad, MRSecLWARX ; 00000(101)00=020=LWARX metatabLine %0001, MRSecLWARX ; 20
|
||||
optabRow 21, 8,L, %0000, MRPriCrash, MRSecException ; 00010(101)00=084=LDARX metatabLine %0001, MRSecException ; 21
|
||||
optabRow , ,, , , ; 00100(101)00=148
|
||||
optabRow , ,, , , ; 00110(101)00=212
|
||||
optabRow , ,, , , ; 01000(101)00=276
|
||||
optabRow , ,, , , ; 01010(101)00=340
|
||||
optabRow , ,, , , ; 01100(101)00=404
|
||||
optabRow , ,, , , ; 01110(101)00=468
|
||||
optabRow , ,, , , ; 10000(101)00=532
|
||||
optabRow , ,, , , ; 10010(101)00=596
|
||||
optabRow , ,, , , ; 10100(101)00=660
|
||||
optabRow , ,, , , ; 10110(101)00=724
|
||||
optabRow 3, 8,L, %0000, MRPriPlainLoad, MRSecLoad ; 11000(101)00=788 metatabLine %0001, MRSecLoad ; 3
|
||||
optabRow 6, 4,L, %0000, MRPriPlainLoad, MRSecLoad ; 11010(101)00=852 metatabLine %0001, MRSecLoad ; 6
|
||||
optabRow 19, 8,S, %0000, MRPriPlainStore, MRSecDone ; 11100(101)00=916 metatabLine %0001, MRSecDone ; 19
|
||||
optabRow , ,, , , ; 11110(101)00=980
|
||||
optabRow , ,, , , ; 00001(101)00=052
|
||||
optabRow , ,, , , ; 00011(101)00=116
|
||||
optabRow , ,, , , ; 00101(101)00=180
|
||||
optabRow , ,, , , ; 00111(101)00=244
|
||||
optabRow , ,, , , ; 01001(101)00=308
|
||||
optabRow , ,, , , ; 01011(101)00=372
|
||||
optabRow , ,, , , ; 01101(101)00=436
|
||||
optabRow , ,, , , ; 01111(101)00=500
|
||||
optabRow , ,, , , ; 10001(101)00=564
|
||||
optabRow , ,, , , ; 10011(101)00=628
|
||||
optabRow , ,, , , ; 10101(101)00=692
|
||||
optabRow , ,, , , ; 10111(101)00=756
|
||||
optabRow 3, 8,L, %0000, MRPriUpdLoad, MRSecLoad ; 11001(101)00=820 metatabLine %0001, MRSecLoad ; 3
|
||||
optabRow 27, 8,L, %0011, MRPriCrash, MRSecException ; 11011(101)00=884 metatabLine %0011, MRSecException ; 27
|
||||
optabRow 19, 8,S, %0000, MRPriUpdStore, MRSecDone ; 11101(101)00=948 metatabLine %0001, MRSecDone ; 19
|
||||
optabRow 31, 8,S, %0010, MRPriCrash, MRSecException ; 11111(101)00=1012 metatabLine %0011, MRSecException ; 31
|
||||
optabRow 3, 8,L, %0000, MRPriPlainLoad, MRSecLoad ; 00000(101)01=021=LDX metatabLine %0001, MRSecLoad ; 3
|
||||
optabRow , ,, , , ; 00010(101)01=085
|
||||
optabRow 19, 8,S, %0000, MRPriPlainStore, MRSecDone ; 00100(101)01=149=STDX metatabLine %0001, MRSecDone ; 19
|
||||
optabRow , ,, , , ; 00110(101)01=213
|
||||
optabRow 40, 4,L, %1011, MRPriLSCBX, MRSecLSCBX ; 01000(101)01=277=LSCBX (POWER) metatabLine %0011, MRSecLSCBX ; 40
|
||||
optabRow 6, 4,L, %0000, MRPriPlainLoad, MRSecLoad ; 01010(101)01=341=LWAX metatabLine %0001, MRSecLoad ; 6
|
||||
optabRow , ,, , , ; 01100(101)01=405
|
||||
optabRow , ,, , , ; 01110(101)01=469
|
||||
optabRow 32, 4,L, %1011, MRPriLSWX, MRSecLSWix ; 10000(101)01=533=LSWX metatabLine %0011, MRSecLSWix ; 32
|
||||
optabRow 32, 4,L, %1111, MRPriLSWI, MRSecLSWix ; 10010(101)01=597=LSWI metatabLine %0011, MRSecLSWix ; 32
|
||||
optabRow 36, 4,S, %0010, MRPriSTSWX, MRSecStrStore ; 10100(101)01=661=STSWX metatabLine %0011, MRSecStrStore ; 36
|
||||
optabRow 36, 4,S, %1110, MRPriSTSWI, MRSecStrStore ; 10110(101)01=725=STSWI metatabLine %0011, MRSecStrStore ; 36
|
||||
optabRow , ,, , , ; 11000(101)01=789
|
||||
optabRow , ,, , , ; 11010(101)01=853
|
||||
optabRow , ,, , , ; 11100(101)01=917
|
||||
optabRow , ,, , , ; 11110(101)01=981
|
||||
optabRow 3, 8,L, %0000, MRPriUpdLoad, MRSecLoad ; 00001(101)01=053=LDUX metatabLine %0001, MRSecLoad ; 3
|
||||
optabRow , ,, , , ; 00011(101)01=117
|
||||
optabRow 19, 8,S, %0000, MRPriUpdStore, MRSecDone ; 00101(101)01=181=STDUX metatabLine %0001, MRSecDone ; 19
|
||||
optabRow , ,, , , ; 00111(101)01=245
|
||||
optabRow , ,, , , ; 01001(101)01=309
|
||||
optabRow 6, 4,L, %0000, MRPriUpdLoad, MRSecDone ; 01011(101)01=373=LWAUX metatabLine %0001, MRSecLoad ; 6
|
||||
optabRow , ,, , , ; 01101(101)01=437
|
||||
optabRow , ,, , , ; 01111(101)01=501
|
||||
optabRow , ,, , , ; 10001(101)01=565
|
||||
optabRow , ,, , , ; 10011(101)01=629
|
||||
optabRow , ,, , , ; 10101(101)01=693
|
||||
optabRow , ,, , , ; 10111(101)01=757
|
||||
optabRow , ,, , , ; 11001(101)01=821
|
||||
optabRow , ,, , , ; 11011(101)01=885
|
||||
optabRow , ,, , , ; 11101(101)01=949
|
||||
optabRow , ,, , , ; 11111(101)01=1013
|
||||
optabRow , ,, , , ; 00000(101)10=022
|
||||
optabRow 62, 1,L, %0010, MRPriUpdLoad, MRSecRedoNoTrace ; 00010(101)10=086 metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
optabRow 22, 4,L, %0000, MRPriPlainStore, MRSecSTWCX ; 00100(101)10=150=STWCX. metatabLine %0001, MRSecSTWCX ; 22
|
||||
optabRow 23, 8,S, %0000, MRPriCrash, MRSecException ; 00110(101)10=214=STDCX. metatabLine %0001, MRSecException ; 23
|
||||
optabRow 62, 1,L, %0010, MRPriUpdLoad, MRSecRedoNoTrace ; 01000(101)10=278=DCBT metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
optabRow , ,, , , ; 01010(101)10=342
|
||||
optabRow , ,, , , ; 01100(101)10=406
|
||||
optabRow , ,, , , ; 01110(101)10=470
|
||||
optabRow 10, 4,L, %0010, MRPriUpdLoad, MRSecLWBRX ; 10000(101)10=534=LWBRX metatabLine %0011, MRSecLWBRX ; 10
|
||||
optabRow , ,, , , ; 10010(101)10=598
|
||||
optabRow 18, 4,S, %0000, MRPriSTWBRX, MRSecDone ; 10100(101)10=662=STWBRX metatabLine %0001, MRSecDone ; 18
|
||||
optabRow , ,, , , ; 10110(101)10=726
|
||||
optabRow 9, 2,L, %0010, MRPriUpdLoad, MRSecLHBRX ; 11000(101)10=790=LHBRX metatabLine %0011, MRSecLHBRX ; 9
|
||||
optabRow , ,, , , ; 11010(101)10=854
|
||||
optabRow 17, 2,S, %0000, MRPriSTHBRX, MRSecDone ; 11100(101)10=918=STHBRX metatabLine %0001, MRSecDone ; 17
|
||||
optabRow 62, 1,L, %0010, MRPriUpdLoad, MRSecRedoNoTrace ; 11110(101)10=982=ICBI metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
optabRow 62, 1,L, %0010, MRPriUpdLoad, MRSecRedoNoTrace ; 00001(101)10=054=DCBST metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
optabRow , ,, , , ; 00011(101)10=118
|
||||
optabRow , ,, , , ; 00101(101)10=182
|
||||
optabRow 62, 1,L, %0010, MRPriUpdLoad, MRSecRedoNoTrace ; 00111(101)10=246=DCBTST metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
optabRow 63, 0,L, %0000, MRPriPlainLoad, MRSecException2 ; 01001(101)10=310=ECIWX metatabLine %0001, MRSecException2 ; 63
|
||||
optabRow , ,, , , ; 01011(101)10=374
|
||||
optabRow 63, 0,S, %0000, MRPriPlainStore, MRSecException2 ; 01101(101)10=438=ECOWX metatabLine %0001, MRSecException2 ; 63
|
||||
optabRow , ,, , , ; 01111(101)10=502
|
||||
optabRow , ,, , , ; 10001(101)10=566
|
||||
optabRow , ,, , , ; 10011(101)10=630
|
||||
optabRow , ,, , , ; 10101(101)10=694
|
||||
optabRow , ,, , , ; 10111(101)10=758
|
||||
optabRow , ,, , , ; 11001(101)10=822
|
||||
optabRow , ,, , , ; 11011(101)10=886
|
||||
optabRow , ,, , , ; 11101(101)10=950
|
||||
optabRow 48, 8,S, %0010, MRPriDCBZ, MRSecDCBZ ; 11111(101)10=1014=DCBZ metatabLine %0011, MRSecDCBZ ; 48
|
||||
MROptabD
|
||||
optabRow 2, 9, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=00000(101)11=023=LWZX Dopcd=(1)00000=32=LWZ
|
||||
optabRow 0, 3, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=00010(101)11=087=LBZX Dopcd=(1)00010=34=LBZ
|
||||
optabRow 18, 8, %0000, MRPriPlainStore, MRSecDone ; Xopcd=00100(101)11=151=STWX Dopcd=(1)00100=36=STW
|
||||
optabRow 16, 2, %0000, MRPriPlainStore, MRSecDone ; Xopcd=00110(101)11=215=STBX Dopcd=(1)00110=38=STB
|
||||
optabRow 1, 5, %0000, MRPriPlainLoad, MRSecLoad ; Xopcd=01000(101)11=279=LHZX Dopcd=(1)01000=40=LHZ
|
||||
optabRow 5, 5, %0000, MRPriPlainLoad, MRSecLoadExt ; Xopcd=01010(101)11=343=LHAX Dopcd=(1)01010=42=LHA
|
||||
optabRow 17, 4, %0000, MRPriPlainStore, MRSecDone ; Xopcd=01100(101)11=407=STHX Dopcd=(1)01100=44=STH
|
||||
optabRow 26, 9, %0011, MRPriUpdLoad, MRSecLMW ; Xopcd=01110(101)11=471 Dopcd=(1)01110=46=LMW
|
||||
optabRow 14, 9, %0000, MRPriPlainLoad, MRSecLFSu ; Xopcd=10000(101)11=535=LFSX Dopcd=(1)10000=48=LFS
|
||||
optabRow 15, 17, %0000, MRPriPlainLoad, MRSecLFDu ; Xopcd=10010(101)11=599=LFDX Dopcd=(1)10010=50=LFD
|
||||
optabRow 18, 8, %0000, MRPriSTFSx, MRSecDone ; Xopcd=10100(101)11=663=STFSX Dopcd=(1)10100=52=STFS
|
||||
optabRow 19, 16, %0000, MRPriSTFDx, MRSecDone ; Xopcd=10110(101)11=727=STFDX Dopcd=(1)10110=54=STFD
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11000(101)11=791 Dopcd=(1)11000=56
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11010(101)11=855 Dopcd=(1)11010=58
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11100(101)11=919 Dopcd=(1)11100=60
|
||||
optabRow 18, 8, %0000, MRPriSTFDx, MRSecDone ; Xopcd=11110(101)11=983=STFIWX Dopcd=(1)11110=62
|
||||
optabRow 2, 9, %0000, MRPriUpdLoad, MRSecLoad ; Xopcd=00001(101)11=055=LWZUX Dopcd=(1)00001=33=LWZU
|
||||
optabRow 0, 3, %0000, MRPriUpdLoad, MRSecLoad ; Xopcd=00011(101)11=119=LBZUX Dopcd=(1)00011=35=LBZU
|
||||
optabRow 18, 8, %0000, MRPriUpdStore, MRSecDone ; Xopcd=00101(101)11=183=STWUX Dopcd=(1)00101=37=STWU
|
||||
optabRow 16, 2, %0000, MRPriUpdStore, MRSecDone ; Xopcd=00111(101)11=247=STBUX Dopcd=(1)00111=39=STBU
|
||||
optabRow 1, 5, %0000, MRPriUpdLoad, MRSecLoad ; Xopcd=01001(101)11=311=LHZUX Dopcd=(1)01001=41=LHZU
|
||||
optabRow 5, 5, %0000, MRPriUpdLoad, MRSecLoadExt ; Xopcd=01011(101)11=375=LHAUX Dopcd=(1)01011=43=LHAU
|
||||
optabRow 17, 4, %0000, MRPriUpdStore, MRSecDone ; Xopcd=01101(101)11=439=STHUX Dopcd=(1)01101=45=STHU
|
||||
optabRow 30, 8, %0010, MRPriUpdStore, MRSecSTMW ; Xopcd=01111(101)11=503 Dopcd=(1)01111=47=STMW
|
||||
optabRow 14, 9, %0000, MRPriUpdLoad, MRSecLFSu ; Xopcd=10001(101)11=567=LFSUX Dopcd=(1)10001=49=LFSU
|
||||
optabRow 15, 17, %0000, MRPriUpdLoad, MRSecLFDu ; Xopcd=10011(101)11=631=LFDUX Dopcd=(1)10011=51=LFDU
|
||||
optabRow 18, 8, %0000, MRPriSTFSUx, MRSecDone ; Xopcd=10101(101)11=695=STFSUX Dopcd=(1)10101=53=STFSU
|
||||
optabRow 19, 16, %0000, MRPriSTFDUx, MRSecDone ; Xopcd=10111(101)11=759=STFDUX Dopcd=(1)10111=55=STFDU
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11001(101)11=823 Dopcd=(1)11001=57
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11011(101)11=887 Dopcd=(1)11011=59
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11101(101)11=951 Dopcd=(1)11101=61
|
||||
optabRow 63, 1, %0000, , ; Xopcd=11111(101)11=1015 Dopcd=(1)11111=63
|
||||
optabRow 2, 4,L, %0000, MRPriPlainLoad, MRSecLoad ; 00000(101)11=023=LWZX (1)00000=32=LWZ metatabLine %0001, MRSecLoad ; 2
|
||||
optabRow 0, 1,L, %0000, MRPriPlainLoad, MRSecLoad ; 00010(101)11=087=LBZX (1)00010=34=LBZ metatabLine %0001, MRSecLoad ; 0
|
||||
optabRow 18, 4,S, %0000, MRPriPlainStore, MRSecDone ; 00100(101)11=151=STWX (1)00100=36=STW metatabLine %0001, MRSecDone ; 18
|
||||
optabRow 16, 1,S, %0000, MRPriPlainStore, MRSecDone ; 00110(101)11=215=STBX (1)00110=38=STB metatabLine %0001, MRSecDone ; 16
|
||||
optabRow 1, 2,L, %0000, MRPriPlainLoad, MRSecLoad ; 01000(101)11=279=LHZX (1)01000=40=LHZ metatabLine %0001, MRSecLoad ; 1
|
||||
optabRow 5, 2,L, %0000, MRPriPlainLoad, MRSecLoadExt ; 01010(101)11=343=LHAX (1)01010=42=LHA metatabLine %0001, MRSecLoadExt ; 5
|
||||
optabRow 17, 2,S, %0000, MRPriPlainStore, MRSecDone ; 01100(101)11=407=STHX (1)01100=44=STH metatabLine %0001, MRSecDone ; 17
|
||||
optabRow 26, 4,L, %0011, MRPriUpdLoad, MRSecLMW ; 01110(101)11=471 (1)01110=46=LMW metatabLine %0011, MRSecLMW ; 26
|
||||
optabRow 14, 4,L, %0000, MRPriPlainLoad, MRSecLFSu ; 10000(101)11=535=LFSX (1)10000=48=LFS metatabLine %0001, MRSecLFSu ; 14
|
||||
optabRow 15, 8,L, %0000, MRPriPlainLoad, MRSecLFDu ; 10010(101)11=599=LFDX (1)10010=50=LFD metatabLine %0001, MRSecLFDu ; 15
|
||||
optabRow 18, 4,S, %0000, MRPriSTFSx, MRSecDone ; 10100(101)11=663=STFSX (1)10100=52=STFS metatabLine %0001, MRSecDone ; 18
|
||||
optabRow 19, 8,S, %0000, MRPriSTFDx, MRSecDone ; 10110(101)11=727=STFDX (1)10110=54=STFD metatabLine %0001, MRSecDone ; 19
|
||||
optabRow , ,, , , ; 11000(101)11=791 (1)11000=56
|
||||
optabRow , ,, , , ; 11010(101)11=855 (1)11010=58
|
||||
optabRow , ,, , , ; 11100(101)11=919 (1)11100=60
|
||||
optabRow 18, 4,S, %0000, MRPriSTFDx, MRSecDone ; 11110(101)11=983=STFIWX (1)11110=62 metatabLine %0001, MRSecDone ; 18
|
||||
optabRow 2, 4,L, %0000, MRPriUpdLoad, MRSecLoad ; 00001(101)11=055=LWZUX (1)00001=33=LWZU metatabLine %0001, MRSecLoad ; 2
|
||||
optabRow 0, 1,L, %0000, MRPriUpdLoad, MRSecLoad ; 00011(101)11=119=LBZUX (1)00011=35=LBZU metatabLine %0001, MRSecLoad ; 0
|
||||
optabRow 18, 4,S, %0000, MRPriUpdStore, MRSecDone ; 00101(101)11=183=STWUX (1)00101=37=STWU metatabLine %0001, MRSecDone ; 18
|
||||
optabRow 16, 1,S, %0000, MRPriUpdStore, MRSecDone ; 00111(101)11=247=STBUX (1)00111=39=STBU metatabLine %0001, MRSecDone ; 16
|
||||
optabRow 1, 2,L, %0000, MRPriUpdLoad, MRSecLoad ; 01001(101)11=311=LHZUX (1)01001=41=LHZU metatabLine %0001, MRSecLoad ; 1
|
||||
optabRow 5, 2,L, %0000, MRPriUpdLoad, MRSecLoadExt ; 01011(101)11=375=LHAUX (1)01011=43=LHAU metatabLine %0001, MRSecLoadExt ; 5
|
||||
optabRow 17, 2,S, %0000, MRPriUpdStore, MRSecDone ; 01101(101)11=439=STHUX (1)01101=45=STHU metatabLine %0001, MRSecDone ; 17
|
||||
optabRow 30, 4,S, %0010, MRPriUpdStore, MRSecSTMW ; 01111(101)11=503 (1)01111=47=STMW metatabLine %0011, MRSecSTMW ; 30
|
||||
optabRow 14, 4,L, %0000, MRPriUpdLoad, MRSecLFSu ; 10001(101)11=567=LFSUX (1)10001=49=LFSU metatabLine %0001, MRSecLFSu ; 14
|
||||
optabRow 15, 8,L, %0000, MRPriUpdLoad, MRSecLFDu ; 10011(101)11=631=LFDUX (1)10011=51=LFDU metatabLine %0001, MRSecLFDu ; 15
|
||||
optabRow 18, 4,S, %0000, MRPriSTFSUx, MRSecDone ; 10101(101)11=695=STFSUX (1)10101=53=STFSU metatabLine %0001, MRSecDone ; 18
|
||||
optabRow 19, 8,S, %0000, MRPriSTFDUx, MRSecDone ; 10111(101)11=759=STFDUX (1)10111=55=STFDU metatabLine %0001, MRSecDone ; 19
|
||||
optabRow , ,, , , ; 11001(101)11=823 (1)11001=57
|
||||
optabRow , ,, , , ; 11011(101)11=887 (1)11011=59
|
||||
optabRow , ,, , , ; 11101(101)11=951 (1)11101=61
|
||||
optabRow , ,, , , ; 11111(101)11=1015 (1)11111=63
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
MRPriCrash ; C00
|
||||
bl SystemCrash
|
||||
MRSecException ; C04
|
||||
b MRSecIOInstFail
|
||||
b MRSecException2
|
||||
|
||||
########################################################################
|
||||
|
||||
|
@ -139,30 +139,30 @@ MRSecLoad ; D44
|
|||
|
||||
########################################################################
|
||||
|
||||
MRSecDone ; D50
|
||||
andi. r23, r16, FlagTrace
|
||||
MRSecDone
|
||||
andi. r23, r16, ContextFlagTraceWhenDone ; Time to return from interrupt
|
||||
addi r10, r10, 4
|
||||
mtsrr0 r10
|
||||
mtsrr1 r11
|
||||
bne @trace
|
||||
bne @trace ; Is a Trace flagged?
|
||||
mtlr r12
|
||||
|
||||
bc BO_IF_NOT, mrFlagDidLoad, @otherway
|
||||
bc BO_IF_NOT, mrFlagDidLoad, @load_ewa_registers
|
||||
mtcr r13
|
||||
lmw r2, KDP.r2(r1)
|
||||
lwz r0, KDP.r0(r1)
|
||||
lwz r1, KDP.r1(r1)
|
||||
rfi
|
||||
@otherway
|
||||
@load_ewa_registers ; Only load changed registers
|
||||
mtcr r13
|
||||
lmw r10, KDP.r10(r1)
|
||||
lwz r1, KDP.r1(r1)
|
||||
rfi
|
||||
|
||||
@trace
|
||||
@trace ; Jump to Trace int handler
|
||||
mfsprg r24, 3
|
||||
mtsprg 2, r12
|
||||
_bclr r16, r16, bitFlagTrace
|
||||
_clear r16, r16, bitContextFlagTraceWhenDone
|
||||
lwz r12, VecTbl.Trace(r24)
|
||||
stw r16, KDP.Flags(r1)
|
||||
mtcr r13
|
||||
|
@ -292,17 +292,17 @@ MRSecSTWCX ; EE4
|
|||
|
||||
########################################################################
|
||||
|
||||
MRSecCacheWang ; EF8
|
||||
rlwinm r16, r16, 0, ~(FlagTrace | FlagLowSaves)
|
||||
addi r10, r10, -4
|
||||
MRSecRedoNoTrace ; Rerun the (cache) instruction, but not its Trace Exception
|
||||
rlwinm r16, r16, 0, ~(ContextFlagTraceWhenDone | ContextFlagMemRetryErr)
|
||||
subi r10, r10, 4
|
||||
stw r16, KDP.Flags(r1)
|
||||
b MRSecDone
|
||||
|
||||
########################################################################
|
||||
|
||||
MRSecIOInstFail ; F08
|
||||
MRSecException2 ; F08
|
||||
li r8, ecDataInvalidAddress
|
||||
b ExceptionAfterRetry
|
||||
b MRException
|
||||
|
||||
########################################################################
|
||||
|
||||
|
@ -368,7 +368,7 @@ MRSecLSWix ; FA0
|
|||
|
||||
########################################################################
|
||||
|
||||
MRPriUnknown ; FB8
|
||||
MRPriLSCBX ; FB8
|
||||
mfxer r22
|
||||
andi. r22, r22, 0x7F
|
||||
rlwimi r17, r27, 0,16,20
|
||||
|
@ -384,16 +384,16 @@ MRPriUnknown ; FB8
|
|||
rlwimi r17, r17, 5,11,15
|
||||
b loc_10C8
|
||||
|
||||
MRSecUnknown ; FF0
|
||||
MRSecLSCBX ; FF0
|
||||
rlwinm. r22, r17, 28,25,29
|
||||
rlwinm r28, r17, 13,25,29
|
||||
bne loc_109C
|
||||
rlwinm r23, r17, 9,27,28
|
||||
|
||||
loc_1000 ; 1000
|
||||
slw r21, r21, r23
|
||||
b loc_109C
|
||||
|
||||
########################################################################
|
||||
|
||||
loc_1008 ; 1008
|
||||
andi. r23, r17, 0x7C0
|
||||
rlwinm r28, r17, 13,25,29
|
||||
|
|
|
@ -103,39 +103,33 @@ ecDataSupWriteViolation equ 23
|
|||
ecUnknown24 equ 24
|
||||
|
||||
|
||||
; Runtime Flag equates
|
||||
_bitEqu 0, Flag0
|
||||
_bitEqu 1, Flag1
|
||||
_bitEqu 2, Flag2
|
||||
_bitEqu 3, Flag3
|
||||
_bitEqu 4, Flag4
|
||||
_bitEqu 5, Flag5
|
||||
_bitEqu 6, Flag6
|
||||
_bitEqu 7, Flag7
|
||||
_bitEqu 8, FlagEmu
|
||||
_bitEqu 9, Flag9
|
||||
_bitEqu 10, FlagBlue
|
||||
_bitEqu 11, Flag11
|
||||
_bitEqu 12, FlagVec
|
||||
_bitEqu 13, FlagHasMQ
|
||||
_bitEqu 14, Flag14
|
||||
_bitEqu 15, Flag15
|
||||
_bitEqu 16, FlagSIGP
|
||||
_bitEqu 17, Flag17
|
||||
_bitEqu 18, Flag18
|
||||
_bitEqu 19, Flag19
|
||||
_bitEqu 20, FlagFE0
|
||||
_bitEqu 21, FlagSE
|
||||
_bitEqu 22, FlagBE
|
||||
_bitEqu 23, FlagFE1
|
||||
_bitEqu 24, Flag24
|
||||
_bitEqu 25, Flag25
|
||||
_bitEqu 26, FlagTrace
|
||||
_bitEqu 27, FlagLowSaves
|
||||
_bitEqu 28, Flag28
|
||||
_bitEqu 29, Flag29
|
||||
_bitEqu 30, Flag30
|
||||
_bitEqu 31, Flag31
|
||||
; FLAGS r7/cr
|
||||
|
||||
crMaskAll equ %11111111
|
||||
|
||||
; Bits 0-7 (CR0-CR1): Exception Cause Number (see equates)
|
||||
crMaskExceptionNum equ %11000000
|
||||
maskExceptionNum equ 0xFF000000
|
||||
|
||||
crMaskFlags equ %00111111
|
||||
maskFlags equ 0x00FFFFFF
|
||||
|
||||
; Bits 8-15 (CR2-CR3) Global Flags
|
||||
crMaskGlobalFlags equ %00110000
|
||||
maskGlobalFlags equ 0x00FF0000
|
||||
_bitEqu 8, GlobalFlagSystem ; raised when System (Emulator) Context is running
|
||||
_bitEqu 13, GlobalFlagMQReg ; raised when POWER "Multiply-Quotient" register is present
|
||||
|
||||
; Bits 24-31 (CR6-CR7) Context Flags
|
||||
crMaskContextFlags equ %00001111
|
||||
maskContextFlags equ 0x0000FFFF
|
||||
; Bits 20-23 (CR5) MSR Flags FE0/SE/BE/FE1:
|
||||
crMaskMsrFlags equ %000001000
|
||||
maskMsrFlags equ 0x00000F000
|
||||
; Bits 24-31 (CR6-CR7) Other Context Flags:
|
||||
_bitEqu 26, ContextFlagTraceWhenDone ; raised when MSR[SE] is up but we get an unrelated interrupt
|
||||
_bitEqu 27, ContextFlagMemRetryErr ; raised when an exception is raised during MemRetry
|
||||
_bitEqu 31, ContextFlagResumeMemRetry ; allows MemRetry to be resumed (raised by userspace?)
|
||||
|
||||
|
||||
mrOpflag1 equ cr3_lt
|
||||
|
|
|
@ -2,23 +2,21 @@
|
|||
|
||||
########################################################################
|
||||
|
||||
ExceptionAfterRetry
|
||||
MRException
|
||||
mtsprg 3, r24
|
||||
|
||||
lwz r9, KDP.Enables(r1)
|
||||
rlwinm r23, r17, (32-1), 27, 31
|
||||
extrwi r23, r17, 5, 25 ; extract accessLen field
|
||||
rlwnm. r9, r9, r8, 0, 0 ; BGE taken if exception disabled
|
||||
|
||||
bcl BO_IF, bitFlag15, major_0x02980_0x100
|
||||
bcl BO_IF, mrFlagDidLoad, LoadExtraMRRegs
|
||||
|
||||
lwz r6, KDP.CurCBPtr(r1)
|
||||
|
||||
_bset r7, r16, 27
|
||||
lwz r6, KDP.ContextPtr(r1)
|
||||
|
||||
_set r7, r16, bitContextFlagMemRetryErr
|
||||
neg r23, r23
|
||||
mtcrf 0x3f, r7
|
||||
add r19, r19, r23
|
||||
|
||||
mtcrf crMaskFlags, r7
|
||||
add r19, r19, r23 ; convert r19 from end address back to start address??
|
||||
insrwi r7, r8, 8, 0 ; ec code -> high byte of flags
|
||||
|
||||
slwi r8, r8, 2 ; increment counter
|
||||
|
@ -29,19 +27,19 @@ ExceptionAfterRetry
|
|||
|
||||
; Move regs from KDP to ContextBlock
|
||||
lwz r8, KDP.r7(r1)
|
||||
stw r8, CB.r7(r6)
|
||||
stw r8, CB.r7+4(r6)
|
||||
lwz r8, KDP.r8(r1)
|
||||
stw r8, CB.r8(r6)
|
||||
stw r8, CB.r8+4(r6)
|
||||
lwz r8, KDP.r9(r1)
|
||||
stw r8, CB.r9(r6)
|
||||
stw r8, CB.r9+4(r6)
|
||||
lwz r8, KDP.r10(r1)
|
||||
stw r8, CB.r10(r6)
|
||||
stw r8, CB.r10+4(r6)
|
||||
lwz r8, KDP.r11(r1)
|
||||
stw r8, CB.r11(r6)
|
||||
stw r8, CB.r11+4(r6)
|
||||
lwz r8, KDP.r12(r1)
|
||||
stw r8, CB.r12(r6)
|
||||
stw r8, CB.r12+4(r6)
|
||||
lwz r8, KDP.r13(r1)
|
||||
stw r8, CB.r13(r6)
|
||||
stw r8, CB.r13+4(r6)
|
||||
|
||||
bge RunSystemContext ; Alt Context has left exception disabled => Sys Context
|
||||
;fall through ; exception enabled => run userspace handler
|
||||
|
@ -49,36 +47,36 @@ ExceptionAfterRetry
|
|||
########################################################################
|
||||
|
||||
RunExceptionHandler
|
||||
stw r10, CB.ExceptionOriginAddr(r6) ; Save r10/SRR0, r12/LR, r3, r4
|
||||
stw r12, CB.ExceptionOriginLR(r6)
|
||||
stw r3, CB.ExceptionOriginR3(r6)
|
||||
stw r4, CB.ExceptionOriginR4(r6)
|
||||
stw r10, CB.FaultSrcPC+4(r6) ; Save r10/SRR0, r12/LR, r3, r4
|
||||
stw r12, CB.FaultSrcLR+4(r6)
|
||||
stw r3, CB.FaultSrcR3+4(r6)
|
||||
stw r4, CB.FaultSrcR4+4(r6)
|
||||
|
||||
lwz r8, KDP.Enables(r1) ; Save Enables & Flags
|
||||
stw r7, CB.ExceptionOriginFlags(r6)
|
||||
stw r8, CB.ExceptionOriginEnables(r6)
|
||||
lwz r8, KDP.Enables(r1) ; Save Enables & Flags, inc ContextFlagMemRetryErr
|
||||
stw r7, CB.IntraState.Flags(r6)
|
||||
stw r8, CB.IntraState.Enables(r6)
|
||||
|
||||
; Set up the Exception Handler context
|
||||
li r8, 0 ; r8/Enables = 0 (handler must not throw exception)
|
||||
lwz r10, CB.ExceptionHandler(r6) ; r10/SRR0 = handler addr
|
||||
lwz r4, CB.ExceptionHandlerR4(r6) ; r4 = arbitrary second argument
|
||||
lwz r10, CB.IntraState.Handler+4(r6) ; r10/SRR0 = handler addr
|
||||
lwz r4, CB.IntraState.HandlerArg+4(r6) ; r4 = arbitrary second argument
|
||||
lwz r3, KDP.ECBPtrLogical(r1) ; r3 = ContextBlock ptr
|
||||
bc BO_IF, bitFlagEmu, @sys
|
||||
bc BO_IF, bitGlobalFlagSystem, @sys
|
||||
lwz r3, KDP.NCBCacheLA0(r1)
|
||||
@sys
|
||||
lwz r12, KDP.EmuKCallTblPtrLogical(r1) ; r12/LR = address of KCallReturnFromException trap
|
||||
|
||||
bcl BO_IF, bitFlagLowSaves, PreferRegistersFromKDPSavingContextBlock ; ???
|
||||
bcl BO_IF, bitContextFlagMemRetryErr, SaveFailingMemRetryState
|
||||
|
||||
rlwinm r7, r7, 0, 29, 15 ; unset flags 16-28
|
||||
stw r8, KDP.Enables(r1)
|
||||
rlwimi r11, r7, 0, 20, 23 ; threfore unset MSR[FE0/SE/BE/FE1]
|
||||
|
||||
b IntReturn
|
||||
b ReturnFromInt
|
||||
|
||||
########################################################################
|
||||
|
||||
major_0x02980_0x100
|
||||
LoadExtraMRRegs
|
||||
lwz r0, KDP.r0(r1)
|
||||
lwz r2, KDP.r2(r1)
|
||||
lwz r3, KDP.r3(r1)
|
||||
|
@ -86,12 +84,12 @@ major_0x02980_0x100
|
|||
lwz r5, KDP.r5(r1)
|
||||
blr
|
||||
|
||||
PreferRegistersFromKDPSavingContextBlock
|
||||
stw r17, CB.PropagateR17(r6)
|
||||
stw r20, CB.PropagateR20(r6)
|
||||
stw r21, CB.PropagateR21(r6)
|
||||
stw r19, CB.PropagateR19(r6)
|
||||
stw r18, CB.PropagateR18(r6)
|
||||
SaveFailingMemRetryState
|
||||
stw r17, CB.IntraState.MemRet17+4(r6)
|
||||
stw r20, CB.IntraState.MemRetData(r6)
|
||||
stw r21, CB.IntraState.MemRetData+4(r6)
|
||||
stw r19, CB.IntraState.MemRet19+4(r6)
|
||||
stw r18, CB.IntraState.MemRet18+4(r6)
|
||||
lmw r14, KDP.r14(r1)
|
||||
blr
|
||||
|
||||
|
@ -104,68 +102,70 @@ KCallReturnFromExceptionFastPath
|
|||
addi r11, r11, 1
|
||||
stw r11, KDP.NKInfo.NanoKernelCallCounts(r1)
|
||||
mfsrr1 r11
|
||||
rlwimi r7, r7, 27, 26, 26 ; ?re-enable single stepping
|
||||
rlwimi r7, r7, 32+bitMsrSE-bitContextFlagTraceWhenDone, ContextFlagTraceWhenDone
|
||||
|
||||
KCallReturnFromException
|
||||
cmplwi cr1, r3, 1 ; exception handler return value
|
||||
cmplwi cr1, r3, 1 ; exception handler return value
|
||||
blt cr1, @dispose
|
||||
mtcrf 0x3f, r7
|
||||
mtcrf crMaskFlags, r7
|
||||
beq cr1, @propagate
|
||||
|
||||
;force to system context ; Handler returned >= 1
|
||||
; If handler returns an exception cause code 2-255, "force" this exception to the System Context.
|
||||
subi r8, r3, 32
|
||||
lwz r9, KDP.NKInfo.ExceptionForcedCount(r1)
|
||||
cmplwi r8, 256-32
|
||||
addi r9, r9, 1
|
||||
stw r9, KDP.NKInfo.ExceptionForcedCount(r1)
|
||||
insrwi r7, r3, 8, 0
|
||||
blt RunSystemContext ; Handler returned 1-255: force that exception number to System
|
||||
blt RunSystemContext
|
||||
li r8, ecTrapInstr
|
||||
b Exception ; Handler returned >= 256: fail!
|
||||
b Exception ; (error if number is > max exception number)
|
||||
|
||||
@dispose ; Handler returned 0: return to the code that threw the exception
|
||||
lwz r8, CB.ExceptionOriginFlags(r6)
|
||||
lwz r10, CB.ExceptionOriginAddr(r6)
|
||||
rlwimi r7, r8, 0, 0xFF00FFFF ; restore most Flags to pre-exception state
|
||||
lwz r8, CB.ExceptionOriginEnables(r6)
|
||||
rlwimi r11, r7, 0, 20, 23 ; MSR[FE0/SE/BE/FE1] <- Flags
|
||||
; If handler returns 0 (System Context must always do this), return to userspace.
|
||||
@dispose
|
||||
lwz r8, CB.IntraState.Flags(r6) ; Restore Context flags (inc exception number?)
|
||||
lwz r10, CB.FaultSrcPC+4(r6)
|
||||
rlwimi r7, r8, 0, maskExceptionNum | maskContextFlags ; preserve global flags
|
||||
lwz r8, CB.IntraState.Enables(r6)
|
||||
rlwimi r11, r7, 0, maskMsrFlags
|
||||
stw r8, KDP.Enables(r1)
|
||||
andi. r8, r11, MsrFE0 + MsrFE1 ; check: are floating-pt exceptions enabled?
|
||||
|
||||
andi. r8, r11, MsrFE0 + MsrFE1 ; check: are floating-pt exceptions enabled?
|
||||
lwz r12, CB.FaultSrcLR+4(r6) ; restore LR/r3/r4
|
||||
lwz r3, CB.FaultSrcR3+4(r6)
|
||||
lwz r4, CB.FaultSrcR4+4(r6)
|
||||
|
||||
lwz r12, CB.ExceptionOriginLR(r6) ; restore LR/r3/r4
|
||||
lwz r3, CB.ExceptionOriginR3(r6)
|
||||
lwz r4, CB.ExceptionOriginR4(r6)
|
||||
bnel EnableFPU
|
||||
|
||||
bnel EnableFPU ; if FP exceptions are enabled, make sure the FPU is enabled
|
||||
addi r9, r6, CB.IntraState ; If MemRetry was interrupted, resume it.
|
||||
|
||||
addi r9, r6, CB.ExceptionOriginFlags ; never gets used... points to exception part of ContextBlock?
|
||||
b ReturnFromInt
|
||||
|
||||
b IntReturn
|
||||
|
||||
@propagate ; Handler returned 1: propagate exception
|
||||
; If handler returns 1, "propagate" this exception to the System Context
|
||||
; (When we get back to the Alternate Context, it will be as if the exception was disposed.)
|
||||
@propagate
|
||||
lwz r9, KDP.NKInfo.ExceptionPropagateCount(r1)
|
||||
lwz r8, CB.ExceptionOriginFlags(r6)
|
||||
lwz r8, CB.IntraState.Flags(r6)
|
||||
addi r9, r9, 1
|
||||
stw r9, KDP.NKInfo.ExceptionPropagateCount(r1)
|
||||
lwz r10, CB.ExceptionOriginAddr(r6)
|
||||
rlwimi r7, r8, 0, 0xFF00FFFF ; restore most Flags to pre-exception state
|
||||
lwz r8, CB.ExceptionOriginEnables(r6)
|
||||
mtcrf 0x0f, r7
|
||||
rlwimi r11, r7, 0, 20, 23 ; MSR[FE0/SE/BE/FE1] <- Flags
|
||||
lwz r10, CB.FaultSrcPC+4(r6)
|
||||
rlwimi r7, r8, 0, maskExceptionNum | maskContextFlags ; preserve global flags
|
||||
lwz r8, CB.IntraState.Enables(r6)
|
||||
mtcrf crMaskContextFlags, r7
|
||||
rlwimi r11, r7, 0, maskMsrFlags
|
||||
stw r8, KDP.Enables(r1)
|
||||
|
||||
lwz r12, CB.ExceptionOriginLR(r6) ; restore LR/r3/r4
|
||||
lwz r3, CB.ExceptionOriginR3(r6)
|
||||
lwz r4, CB.ExceptionOriginR4(r6)
|
||||
lwz r12, CB.FaultSrcLR+4(r6) ; restore LR/r3/r4
|
||||
lwz r3, CB.FaultSrcR3+4(r6)
|
||||
lwz r4, CB.FaultSrcR4+4(r6)
|
||||
|
||||
bc BO_IF_NOT, bitFlagLowSaves, RunSystemContext
|
||||
stmw r14, KDP.r14(r1)
|
||||
lwz r17, CB.PropagateR17(r6)
|
||||
lwz r20, CB.PropagateR20(r6)
|
||||
lwz r21, CB.PropagateR21(r6)
|
||||
lwz r19, CB.PropagateR19(r6)
|
||||
lwz r18, CB.PropagateR18(r6)
|
||||
bc BO_IF_NOT, bitContextFlagMemRetryErr, RunSystemContext
|
||||
stmw r14, KDP.r14(r1) ; When we *do* get back to this context,
|
||||
lwz r17, CB.IntraState.MemRet17+4(r6) ; make sure MemRetry state can be resumed
|
||||
lwz r20, CB.IntraState.MemRetData(r6) ; from InterState
|
||||
lwz r21, CB.IntraState.MemRetData+4(r6)
|
||||
lwz r19, CB.IntraState.MemRet19+4(r6)
|
||||
lwz r18, CB.IntraState.MemRet18+4(r6)
|
||||
b RunSystemContext
|
||||
|
||||
########################################################################
|
||||
|
@ -198,14 +198,14 @@ LoadInterruptRegisters
|
|||
stw r6, KDP.r6(r1)
|
||||
mfsprg r6, 1
|
||||
stw r6, KDP.r1(r1)
|
||||
lwz r6, KDP.CurCBPtr(r1)
|
||||
stw r7, CB.r7(r6)
|
||||
stw r8, CB.r8(r6)
|
||||
stw r9, CB.r9(r6)
|
||||
stw r10, CB.r10(r6)
|
||||
stw r11, CB.r11(r6)
|
||||
stw r12, CB.r12(r6)
|
||||
stw r13, CB.r13(r6)
|
||||
lwz r6, KDP.ContextPtr(r1)
|
||||
stw r7, CB.r7+4(r6)
|
||||
stw r8, CB.r8+4(r6)
|
||||
stw r9, CB.r9+4(r6)
|
||||
stw r10, CB.r10+4(r6)
|
||||
stw r11, CB.r11+4(r6)
|
||||
stw r12, CB.r12+4(r6)
|
||||
stw r13, CB.r13+4(r6)
|
||||
mfsrr0 r10
|
||||
mfcr r13
|
||||
lwz r7, KDP.Flags(r1)
|
||||
|
@ -217,7 +217,7 @@ LoadInterruptRegisters
|
|||
|
||||
Exception
|
||||
lwz r9, KDP.Enables(r1)
|
||||
mtcrf 0x3f, r7
|
||||
mtcrf crMaskFlags, r7
|
||||
|
||||
rlwnm. r9, r9, r8, 0, 0 ; BLT taken if exception enabled
|
||||
|
||||
|
@ -240,7 +240,7 @@ RunSystemContext
|
|||
addi r8, r1, KDP.VecTblSystem ; System VecTbl
|
||||
mtsprg 3, r8
|
||||
|
||||
bcl BO_IF, bitFlagEmu, SystemCrash ; System Context already running!
|
||||
bcl BO_IF, bitGlobalFlagSystem, SystemCrash ; System Context already running!
|
||||
|
||||
; Fallthru (new CB in r9, old CB in r6)
|
||||
|
||||
|
@ -249,61 +249,61 @@ RunSystemContext
|
|||
SwitchContext ; OldCB *r6, NewCB *r9
|
||||
; Run the System or Alternate Context
|
||||
lwz r8, KDP.Enables(r1)
|
||||
stw r7, CB.Flags(r6)
|
||||
stw r8, CB.Enables(r6)
|
||||
stw r7, CB.InterState.Flags(r6)
|
||||
stw r8, CB.InterState.Enables(r6)
|
||||
|
||||
bc BO_IF_NOT, bitFlagLowSaves, @not_low_saves
|
||||
stw r17, CB.LowSave17(r6)
|
||||
stw r20, CB.LowSave20(r6)
|
||||
stw r21, CB.LowSave21(r6)
|
||||
stw r19, CB.LowSave19(r6)
|
||||
stw r18, CB.LowSave18(r6)
|
||||
bc BO_IF_NOT, bitContextFlagMemRetryErr, @can_dispose_mr_state
|
||||
stw r17, CB.InterState.MemRet17+4(r6)
|
||||
stw r20, CB.InterState.MemRetData(r6)
|
||||
stw r21, CB.InterState.MemRetData+4(r6)
|
||||
stw r19, CB.InterState.MemRet19+4(r6)
|
||||
stw r18, CB.InterState.MemRet18+4(r6)
|
||||
lmw r14, KDP.r14(r1)
|
||||
@not_low_saves
|
||||
@can_dispose_mr_state
|
||||
|
||||
mfxer r8
|
||||
stw r13, CB.CR(r6)
|
||||
stw r8, CB.XER(r6)
|
||||
stw r12, CB.LR(r6)
|
||||
stw r13, CB.CR+4(r6)
|
||||
stw r8, CB.XER+4(r6)
|
||||
stw r12, CB.LR+4(r6)
|
||||
mfctr r8
|
||||
stw r10, CB.SRR0(r6)
|
||||
stw r8, CB.CTR(r6)
|
||||
stw r10, CB.PC+4(r6)
|
||||
stw r8, CB.CTR+4(r6)
|
||||
|
||||
bc BO_IF_NOT, bitFlagHasMQ, @no_mq
|
||||
lwz r8, CB.MQ(r9)
|
||||
bc BO_IF_NOT, bitGlobalFlagMQReg, @no_mq
|
||||
lwz r8, CB.MQ+4(r9)
|
||||
mfspr r12, mq
|
||||
mtspr mq, r8
|
||||
stw r12, CB.MQ(r6)
|
||||
stw r12, CB.MQ+4(r6)
|
||||
@no_mq
|
||||
|
||||
lwz r8, KDP.r1(r1)
|
||||
stw r0, CB.r0(r6)
|
||||
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 r0, CB.r0+4(r6)
|
||||
stw r8, CB.r1+4(r6)
|
||||
stw r2, CB.r2+4(r6)
|
||||
stw r3, CB.r3+4(r6)
|
||||
stw r4, CB.r4+4(r6)
|
||||
lwz r8, KDP.r6(r1)
|
||||
stw r5, CB.r5+4(r6)
|
||||
stw r8, CB.r6+4(r6)
|
||||
_band. r8, r11, bitMsrFP
|
||||
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)
|
||||
stw r27, 0x01dc(r6)
|
||||
stw r28, 0x01e4(r6)
|
||||
stw r29, 0x01ec(r6)
|
||||
stw r30, 0x01f4(r6)
|
||||
stw r31, 0x01fc(r6)
|
||||
stw r14, CB.r14+4(r6)
|
||||
stw r15, CB.r15+4(r6)
|
||||
stw r16, CB.r16+4(r6)
|
||||
stw r17, CB.r17+4(r6)
|
||||
stw r18, CB.r18+4(r6)
|
||||
stw r19, CB.r19+4(r6)
|
||||
stw r20, CB.r20+4(r6)
|
||||
stw r21, CB.r21+4(r6)
|
||||
stw r22, CB.r22+4(r6)
|
||||
stw r23, CB.r23+4(r6)
|
||||
stw r24, CB.r24+4(r6)
|
||||
stw r25, CB.r25+4(r6)
|
||||
stw r26, CB.r26+4(r6)
|
||||
stw r27, CB.r27+4(r6)
|
||||
stw r28, CB.r28+4(r6)
|
||||
stw r29, CB.r29+4(r6)
|
||||
stw r30, CB.r30+4(r6)
|
||||
stw r31, CB.r31+4(r6)
|
||||
bnel DisableFPU
|
||||
|
||||
lwz r8, KDP.OtherContextDEC(r1)
|
||||
|
@ -313,144 +313,140 @@ SwitchContext ; OldCB *r6, NewCB *r9
|
|||
mtdec r8
|
||||
blel ResetDEC ; to r8
|
||||
|
||||
lwz r8, CB.Flags(r9) ; r8 is the new Flags variable
|
||||
stw r9, KDP.CurCBPtr(r1)
|
||||
xoris r7, r7, 1 << (15 - bitFlagEmu) ; flip Emulator flag
|
||||
rlwimi r11, r8, 0, 20, 23 ; "enact" MSR[FE0/SE/BE/FE1]
|
||||
mr r6, r9 ; change the magic ContextBlock register
|
||||
rlwimi r7, r8, 0, 0x0000FFFF ; change bottom half of flags only
|
||||
lwz r8, CB.InterState.Flags(r9) ; r8 is the new Flags variable
|
||||
stw r9, KDP.ContextPtr(r1)
|
||||
xoris r7, r7, GlobalFlagSystem >> 16 ; flip Emulator flag
|
||||
rlwimi r11, r8, 0, maskMsrFlags
|
||||
mr r6, r9 ; change the magic ContextBlock register
|
||||
rlwimi r7, r8, 0, maskContextFlags ; change bottom half of flags only
|
||||
|
||||
andi. r8, r11, MsrFE0 + MsrFE1 ; FP exceptions enabled in new context?
|
||||
andi. r8, r11, MsrFE0 + MsrFE1 ; FP exceptions enabled in new context?
|
||||
|
||||
lwz r8, CB.Enables(r6)
|
||||
lwz r13, CB.CR(r6)
|
||||
lwz r8, CB.InterState.Enables(r6)
|
||||
lwz r13, CB.CR+4(r6)
|
||||
stw r8, KDP.Enables(r1)
|
||||
lwz r8, CB.XER(r6)
|
||||
lwz r12, CB.LR(r6)
|
||||
lwz r8, CB.XER+4(r6)
|
||||
lwz r12, CB.LR+4(r6)
|
||||
mtxer r8
|
||||
lwz r8, CB.CTR(r6)
|
||||
lwz r10, CB.SRR0(r6)
|
||||
lwz r8, CB.CTR+4(r6)
|
||||
lwz r10, CB.PC+4(r6)
|
||||
mtctr r8
|
||||
|
||||
bnel ReloadFPU ; FP exceptions enabled, so load FPU
|
||||
|
||||
stwcx. r0, 0, r1
|
||||
|
||||
lwz r8, CB.r1(r6)
|
||||
lwz r0, CB.r0(r6)
|
||||
lwz r8, CB.r1+4(r6)
|
||||
lwz r0, CB.r0+4(r6)
|
||||
stw r8, KDP.r1(r1)
|
||||
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)
|
||||
lwz r2, CB.r2+4(r6)
|
||||
lwz r3, CB.r3+4(r6)
|
||||
lwz r4, CB.r4+4(r6)
|
||||
lwz r8, CB.r6+4(r6)
|
||||
lwz r5, CB.r5+4(r6)
|
||||
stw r8, KDP.r6(r1)
|
||||
lwz r14, CB.r14+4(r6)
|
||||
lwz r15, CB.r15+4(r6)
|
||||
lwz r16, CB.r16+4(r6)
|
||||
lwz r17, CB.r17+4(r6)
|
||||
lwz r18, CB.r18+4(r6)
|
||||
lwz r19, CB.r19+4(r6)
|
||||
lwz r20, CB.r20+4(r6)
|
||||
lwz r21, CB.r21+4(r6)
|
||||
lwz r22, CB.r22+4(r6)
|
||||
lwz r23, CB.r23+4(r6)
|
||||
lwz r24, CB.r24+4(r6)
|
||||
lwz r25, CB.r25+4(r6)
|
||||
lwz r26, CB.r26+4(r6)
|
||||
lwz r27, CB.r27+4(r6)
|
||||
lwz r28, CB.r28+4(r6)
|
||||
lwz r29, CB.r29+4(r6)
|
||||
lwz r30, CB.r30+4(r6)
|
||||
lwz r31, CB.r31+4(r6)
|
||||
|
||||
########################################################################
|
||||
|
||||
IntReturn
|
||||
andi. r8, r7, FlagTrace | FlagLowSaves
|
||||
bnel @do_trace
|
||||
ReturnFromInt ; If ContextFlagMemRetryErr && ContextFlagResumeMemRetry, please pass KernelState ptr in r9
|
||||
andi. r8, r7, ContextFlagTraceWhenDone | ContextFlagMemRetryErr
|
||||
bnel @special_cases ; Keep rare cases out of the hot path
|
||||
|
||||
stw r7, KDP.Flags(r1) ; Save kernel flags for next interrupt
|
||||
mtlr r12 ; Restore user SPRs from kernel GPRs
|
||||
stw r7, KDP.Flags(r1) ; Save kernel flags for next interrupt
|
||||
mtlr r12 ; Restore user SPRs from kernel GPRs
|
||||
mtsrr0 r10
|
||||
mtsrr1 r11
|
||||
mtcr r13
|
||||
lwz r10, CB.r10(r6) ; Restore user GPRs from ContextBlock
|
||||
lwz r11, CB.r11(r6)
|
||||
lwz r12, CB.r12(r6)
|
||||
lwz r13, CB.r13(r6)
|
||||
lwz r7, CB.r7(r6)
|
||||
lwz r8, CB.r8(r6)
|
||||
lwz r9, CB.r9(r6)
|
||||
lwz r6, KDP.r6(r1) ; Restore last two registers from EWA
|
||||
lwz r10, CB.r10+4(r6) ; Restore user GPRs from ContextBlock
|
||||
lwz r11, CB.r11+4(r6)
|
||||
lwz r12, CB.r12+4(r6)
|
||||
lwz r13, CB.r13+4(r6)
|
||||
lwz r7, CB.r7+4(r6)
|
||||
lwz r8, CB.r8+4(r6)
|
||||
lwz r9, CB.r9+4(r6)
|
||||
lwz r6, KDP.r6(r1) ; Restore last two registers from EWA
|
||||
lwz r1, KDP.r1(r1)
|
||||
rfi ; Go
|
||||
|
||||
rfi ; Return from interrupt
|
||||
@special_cases
|
||||
mtcrf crMaskFlags, r7
|
||||
bc BO_IF_NOT, bitContextFlagMemRetryErr, @no_memretry ; If MemRetry had to be paused for an exception
|
||||
_clear r7, r7, bitContextFlagMemRetryErr ; which is now finished, finish MemRetry.
|
||||
bc BO_IF, bitContextFlagResumeMemRetry, @resume_memretry
|
||||
_clear r7, r7, bitContextFlagTraceWhenDone
|
||||
b @justreturn
|
||||
|
||||
|
||||
@do_trace
|
||||
mtcrf 0x3f, r7
|
||||
|
||||
bc BO_IF_NOT, bitFlagLowSaves, @no_low_saves
|
||||
|
||||
_bclr r7, r7, bitFlagLowSaves ; LowSaves set with flag 31 -> unset and do some emulation
|
||||
bc BO_IF, bitFlag31, @last_minute_memretry
|
||||
|
||||
_bclr r7, r7, bitFlagTrace ; But if flag 31 is unset, disable tracing and go home
|
||||
b @return
|
||||
|
||||
@no_low_saves
|
||||
bc BO_IF_NOT, bitFlagTrace, @return
|
||||
|
||||
_bclr r7, r7, bitFlagTrace ; Trace flag set with no LowSaves -> unset that flag, and do Trace Exception
|
||||
stw r7, KDP.Flags(r1)
|
||||
@no_memretry
|
||||
bc BO_IF_NOT, bitContextFlagTraceWhenDone, @justreturn ; If this current interrupt was raised when
|
||||
_clear r7, r7, bitContextFlagTraceWhenDone ; every instruction should be followed by a
|
||||
stw r7, KDP.Flags(r1) ; Trace exception, then raise one.
|
||||
li r8, ecInstTrace
|
||||
b Exception
|
||||
|
||||
@return
|
||||
@justreturn
|
||||
blr
|
||||
|
||||
@last_minute_memretry
|
||||
@resume_memretry ; Pick up where an MRException left off, now that the Exception has been disposed.
|
||||
stw r7, KDP.Flags(r1)
|
||||
stw r0, 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)
|
||||
|
||||
stw r0, KDP.r0(r1)
|
||||
stw r2, KDP.r2(r1)
|
||||
stw r3, KDP.r3(r1)
|
||||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
|
||||
lwz r8, CB.r7+7(r6)
|
||||
stw r8, KDP.r7(r1)
|
||||
lwz r8, CB.r8+7(r6)
|
||||
stw r8, KDP.r8(r1)
|
||||
lwz r8, CB.r9+7(r6)
|
||||
stw r8, KDP.r9(r1)
|
||||
lwz r8, CB.r10+7(r6)
|
||||
stw r8, KDP.r10(r1)
|
||||
lwz r8, CB.r11+7(r6)
|
||||
stw r8, KDP.r11(r1)
|
||||
lwz r8, CB.r12+7(r6)
|
||||
stw r8, KDP.r12(r1)
|
||||
lwz r8, CB.r13+7(r6)
|
||||
stw r8, KDP.r13(r1)
|
||||
|
||||
stmw r14, KDP.r14(r1)
|
||||
|
||||
lwz r17, CB.LowSave17(r9) ; LowSave means "MemRetry in ContextBlock"
|
||||
lwz r20, CB.LowSave20(r9)
|
||||
lwz r21, CB.LowSave21(r9)
|
||||
lwz r19, CB.LowSave19(r9)
|
||||
lwz r18, CB.LowSave18(r9)
|
||||
_bclr r16, r7, bitFlagLowSaves
|
||||
lwz r17, KernelState.MemRet17+4(r9) ; Get the MR state from IntraState (if context was never switched)
|
||||
lwz r20, KernelState.MemRetData(r9) ; or InterState (if exception was propagated to System Context and
|
||||
lwz r21, KernelState.MemRetData+4(r9) ; we are now switching back to Alternate Context).
|
||||
lwz r19, KernelState.MemRet19+4(r9)
|
||||
lwz r18, KernelState.MemRet18+4(r9)
|
||||
_clear r16, r7, bitContextFlagMemRetryErr
|
||||
|
||||
lwz r25, KDP.MRBase(r1) ; MRUnknown is indexed by the first arg of MROptab?
|
||||
extrwi. r22, r17, 4, 27 ;
|
||||
add r19, r19, r22 ; Correct r19 (EA) by adding byteCount from r17
|
||||
add r19, r19, r22 ; Correct r19 (EA) by adding len from r17
|
||||
rlwimi r25, r17, 7, 25, 30 ; The top of MRUnknown is... mysterious!
|
||||
lhz r26, MRUnknown-MRBase(r25) ; leaving this incorrect as a reminder!
|
||||
|
||||
insrwi r25, r19, 3, 28 ; Set Memtab alignment modulus
|
||||
stw r16, KDP.Flags(r1)
|
||||
rlwimi r26, r26, 8, 8, 15 ; First byte of MRUnknown is for cr3/cr4
|
||||
insrwi r25, r17, 4, 24 ; byteCount and load/store from second arg of MROptab?
|
||||
insrwi r25, r17, 4, 24 ; len and load/store from second arg of MROptab?
|
||||
mtcrf 0x10, r26 ; Set CR3
|
||||
lha r22, MRMemtab-MRBase(r25) ; Jump to MRMemtab...
|
||||
|
||||
|
@ -460,9 +456,9 @@ IntReturn
|
|||
mtlr r22
|
||||
mtsprg 3, r23
|
||||
mfmsr r14
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
mtmsr r15
|
||||
rlwimi r25, r26, 2, 22, 29 ; Second byte of MRUnknown is
|
||||
rlwimi r25, r26, 2, 22, 29 ; Second byte of MRUnknown is a secondary routine
|
||||
bnelr
|
||||
b MRDoSecondary
|
||||
|
||||
|
|
|
@ -14,12 +14,12 @@ FPUnavailInt
|
|||
stw r11, KDP.NKInfo.FPUReloadCount(r1)
|
||||
|
||||
mfsrr1 r11
|
||||
_bset r11, r11, bitMsrFP
|
||||
_set r11, r11, bitMsrFP
|
||||
mtsrr1 r11
|
||||
|
||||
mfmsr r11 ; need this to access float registers
|
||||
_bset r11, r11, bitMsrFP
|
||||
lwz r6, KDP.CurCBPtr(r1)
|
||||
_set r11, r11, bitMsrFP
|
||||
lwz r6, KDP.ContextPtr(r1)
|
||||
mtmsr r11
|
||||
|
||||
bl LoadFloats
|
||||
|
@ -40,53 +40,53 @@ EnableFPU
|
|||
bnelr
|
||||
|
||||
ReloadFPU
|
||||
lwz r8, 0xe4(r6) ; ???
|
||||
lwz r8, CB.FPSCR+4(r6)
|
||||
rlwinm. r8, r8, 1, 0, 0
|
||||
|
||||
mfmsr r8
|
||||
_bset r8, r8, bitMsrFP
|
||||
_set r8, r8, bitMsrFP
|
||||
beqlr
|
||||
mtmsr r8
|
||||
|
||||
_bset r11, r11, bitMsrFP
|
||||
_set r11, r11, bitMsrFP
|
||||
|
||||
########################################################################
|
||||
|
||||
LoadFloats
|
||||
lfd f31, 0xe0(r6)
|
||||
lfd f0, 0x200(r6)
|
||||
lfd f1, 0x208(r6)
|
||||
lfd f2, 0x210(r6)
|
||||
lfd f3, 0x218(r6)
|
||||
lfd f4, 0x220(r6)
|
||||
lfd f5, 0x228(r6)
|
||||
lfd f6, 0x230(r6)
|
||||
lfd f7, 0x238(r6)
|
||||
mtfsf 0xff, f31
|
||||
lfd f8, 0x240(r6)
|
||||
lfd f9, 0x248(r6)
|
||||
lfd f10, 0x250(r6)
|
||||
lfd f11, 0x258(r6)
|
||||
lfd f12, 0x260(r6)
|
||||
lfd f13, 0x268(r6)
|
||||
lfd f14, 0x270(r6)
|
||||
lfd f15, 0x278(r6)
|
||||
lfd f16, 0x280(r6)
|
||||
lfd f17, 0x288(r6)
|
||||
lfd f18, 0x290(r6)
|
||||
lfd f19, 0x298(r6)
|
||||
lfd f20, 0x2a0(r6)
|
||||
lfd f21, 0x2a8(r6)
|
||||
lfd f22, 0x2b0(r6)
|
||||
lfd f23, 0x2b8(r6)
|
||||
lfd f24, 0x2c0(r6)
|
||||
lfd f25, 0x2c8(r6)
|
||||
lfd f26, 0x2d0(r6)
|
||||
lfd f27, 0x2d8(r6)
|
||||
lfd f28, 0x2e0(r6)
|
||||
lfd f29, 0x2e8(r6)
|
||||
lfd f30, 0x2f0(r6)
|
||||
lfd f31, 0x2f8(r6)
|
||||
lfd f31, CB.FPSCR(r6)
|
||||
lfd f0, CB.f0(r6)
|
||||
lfd f1, CB.f1(r6)
|
||||
lfd f2, CB.f2(r6)
|
||||
lfd f3, CB.f3(r6)
|
||||
lfd f4, CB.f4(r6)
|
||||
lfd f5, CB.f5(r6)
|
||||
lfd f6, CB.f6(r6)
|
||||
lfd f7, CB.f7(r6)
|
||||
mtfs f31
|
||||
lfd f8, CB.f8(r6)
|
||||
lfd f9, CB.f9(r6)
|
||||
lfd f10, CB.f10(r6)
|
||||
lfd f11, CB.f11(r6)
|
||||
lfd f12, CB.f12(r6)
|
||||
lfd f13, CB.f13(r6)
|
||||
lfd f14, CB.f14(r6)
|
||||
lfd f15, CB.f15(r6)
|
||||
lfd f16, CB.f16(r6)
|
||||
lfd f17, CB.f17(r6)
|
||||
lfd f18, CB.f18(r6)
|
||||
lfd f19, CB.f19(r6)
|
||||
lfd f20, CB.f20(r6)
|
||||
lfd f21, CB.f21(r6)
|
||||
lfd f22, CB.f22(r6)
|
||||
lfd f23, CB.f23(r6)
|
||||
lfd f24, CB.f24(r6)
|
||||
lfd f25, CB.f25(r6)
|
||||
lfd f26, CB.f26(r6)
|
||||
lfd f27, CB.f27(r6)
|
||||
lfd f28, CB.f28(r6)
|
||||
lfd f29, CB.f29(r6)
|
||||
lfd f30, CB.f30(r6)
|
||||
lfd f31, CB.f31(r6)
|
||||
|
||||
blr
|
||||
|
||||
|
@ -94,45 +94,45 @@ LoadFloats
|
|||
|
||||
DisableFPU
|
||||
mfmsr r8
|
||||
_bset r8, r8, bitMsrFP
|
||||
_set r8, r8, bitMsrFP
|
||||
mtmsr r8
|
||||
|
||||
_bclr r11, r11, bitMsrFP
|
||||
_clear r11, r11, bitMsrFP
|
||||
|
||||
stfd f0, 0x200(r6)
|
||||
stfd f1, 0x208(r6)
|
||||
stfd f2, 0x210(r6)
|
||||
stfd f3, 0x218(r6)
|
||||
stfd f4, 0x220(r6)
|
||||
stfd f5, 0x228(r6)
|
||||
stfd f6, 0x230(r6)
|
||||
stfd f7, 0x238(r6)
|
||||
stfd f8, 0x240(r6)
|
||||
stfd f9, 0x248(r6)
|
||||
stfd f10, 0x250(r6)
|
||||
stfd f11, 0x258(r6)
|
||||
stfd f12, 0x260(r6)
|
||||
stfd f13, 0x268(r6)
|
||||
stfd f14, 0x270(r6)
|
||||
stfd f15, 0x278(r6)
|
||||
stfd f16, 0x280(r6)
|
||||
stfd f17, 0x288(r6)
|
||||
stfd f18, 0x290(r6)
|
||||
stfd f19, 0x298(r6)
|
||||
stfd f20, 0x2a0(r6)
|
||||
stfd f21, 0x2a8(r6)
|
||||
stfd f22, 0x2b0(r6)
|
||||
stfd f23, 0x2b8(r6)
|
||||
stfd f0, CB.f0(r6)
|
||||
stfd f1, CB.f1(r6)
|
||||
stfd f2, CB.f2(r6)
|
||||
stfd f3, CB.f3(r6)
|
||||
stfd f4, CB.f4(r6)
|
||||
stfd f5, CB.f5(r6)
|
||||
stfd f6, CB.f6(r6)
|
||||
stfd f7, CB.f7(r6)
|
||||
stfd f8, CB.f8(r6)
|
||||
stfd f9, CB.f9(r6)
|
||||
stfd f10, CB.f10(r6)
|
||||
stfd f11, CB.f11(r6)
|
||||
stfd f12, CB.f12(r6)
|
||||
stfd f13, CB.f13(r6)
|
||||
stfd f14, CB.f14(r6)
|
||||
stfd f15, CB.f15(r6)
|
||||
stfd f16, CB.f16(r6)
|
||||
stfd f17, CB.f17(r6)
|
||||
stfd f18, CB.f18(r6)
|
||||
stfd f19, CB.f19(r6)
|
||||
stfd f20, CB.f20(r6)
|
||||
stfd f21, CB.f21(r6)
|
||||
stfd f22, CB.f22(r6)
|
||||
stfd f23, CB.f23(r6)
|
||||
mffs f0
|
||||
stfd f24, 0x2c0(r6)
|
||||
stfd f25, 0x2c8(r6)
|
||||
stfd f26, 0x2d0(r6)
|
||||
stfd f27, 0x2d8(r6)
|
||||
stfd f28, 0x2e0(r6)
|
||||
stfd f29, 0x2e8(r6)
|
||||
stfd f30, 0x2f0(r6)
|
||||
stfd f31, 0x2f8(r6)
|
||||
stfd f0, 0xe0(r6)
|
||||
stfd f24, CB.f24(r6)
|
||||
stfd f25, CB.f25(r6)
|
||||
stfd f26, CB.f26(r6)
|
||||
stfd f27, CB.f27(r6)
|
||||
stfd f28, CB.f28(r6)
|
||||
stfd f29, CB.f29(r6)
|
||||
stfd f30, CB.f30(r6)
|
||||
stfd f31, CB.f31(r6)
|
||||
stfd f0, CB.FPSCR(r6)
|
||||
|
||||
blr
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ InitKernelGlobals
|
|||
|
||||
add r12, rED, r11
|
||||
stw r12, KDP.ECBPtr(r1)
|
||||
stw r12, KDP.CurCBPtr(r1)
|
||||
stw r12, KDP.ContextPtr(r1)
|
||||
|
||||
lwz r12, NKConfigurationInfo.TestIntMaskInit(rCI)
|
||||
stw r12, KDP.TestIntMaskInit(r1)
|
||||
|
@ -362,16 +362,16 @@ InitEmulator
|
|||
add r12, r11, r12
|
||||
lwz r11, NKConfigurationInfo.ECBOffset(rCI) ; address of declared Emu entry point
|
||||
add r11, r11, rED
|
||||
stw r12, CB.ExceptionOriginAddr(r11)
|
||||
stw r12, CB.FaultSrcPC+4(r11)
|
||||
|
||||
lwz r12, NKConfigurationInfo.LA_EmulatorData(rCI) ; address of Emu global page
|
||||
stw r12, CB.ExceptionOriginR3(r11)
|
||||
stw r12, CB.FaultSrcR3+4(r11)
|
||||
|
||||
lwz r12, NKConfigurationInfo.LA_DispatchTable(rCI) ; address of 512kb Emu dispatch table
|
||||
stw r12, CB.ExceptionOriginR4(r11)
|
||||
stw r12, CB.FaultSrcR4+4(r11)
|
||||
|
||||
lwz r12, KDP.EmuKCallTblPtrLogical(r1) ; address of KCallReturnFromException trap
|
||||
stw r12, CB.ExceptionHandlerRetAddr(r11)
|
||||
stw r12, CB.IntraState.HandlerReturn+4(r11)
|
||||
|
||||
|
||||
lwz r10, KDP.LowMemPtr(r1) ; Zero out bottom 8k of Low Memory
|
||||
|
@ -398,9 +398,9 @@ InitEmulator
|
|||
mfpvr r7 ; Calculate Flags:
|
||||
srwi r7, r7, 16
|
||||
cmpwi r7, 1
|
||||
lis r7, FlagEmu >> 16 ; we will enter System Context (all CPUs)
|
||||
lis r7, GlobalFlagSystem >> 16 ; we will enter System Context (all CPUs)
|
||||
bne @not_601
|
||||
_bset r7, r7, bitFlagHasMQ ; but only 601 has MQ register
|
||||
_set r7, r7, bitGlobalFlagMQReg ; but only 601 has MQ register
|
||||
@not_601
|
||||
stw r7, KDP.Flags(r1)
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ ExternalInt0
|
|||
|
||||
mfmsr r2 ; Save a self-ptr to FF880000... why?
|
||||
lis r3, 0xFF88
|
||||
_bset r0, r2, bitMsrDR
|
||||
_set r0, r2, bitMsrDR
|
||||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
mfsrr0 r4
|
||||
|
@ -81,7 +81,7 @@ ExternalInt1
|
|||
|
||||
lis r2, 0x50F3 ; Query OpenPIC at 50F2A000
|
||||
mfmsr r3
|
||||
_bset r0, r3, bitMsrDR
|
||||
_set r0, r3, bitMsrDR
|
||||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
mfsrr0 r4
|
||||
|
@ -139,7 +139,7 @@ ExternalInt2
|
|||
|
||||
lis r2, 0xF300 ; Query OpenPIC at F3000028/C
|
||||
mfmsr r0
|
||||
_bset r3, r0, bitMsrDR
|
||||
_set r3, r0, bitMsrDR
|
||||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
mfsrr0 r4
|
||||
|
@ -275,7 +275,7 @@ DataStorageInt
|
|||
mfcr r13
|
||||
|
||||
mfmsr r14
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
mtmsr r15
|
||||
lwz r27, 0(r10) ; r27 = INSTRUCTION
|
||||
mtmsr r14
|
||||
|
@ -291,7 +291,7 @@ EmulateDataAccess
|
|||
lwz r16, KDP.Flags(r1)
|
||||
mfsprg r24, 3
|
||||
rlwinm r17, r27, 0, 6, 15 ; r17 = rS/D and rA fields
|
||||
rlwimi r16, r16, 27, 26, 26
|
||||
rlwimi r16, r16, 27, 26, 26 ; ContextFlagTraceWhenDone = MsrSE
|
||||
bge @xform
|
||||
|
||||
;dform
|
||||
|
@ -351,7 +351,7 @@ AlignmentInt
|
|||
rlwinm r17, r27, 16, 0x03FF0000
|
||||
lwz r16, KDP.Flags(r1)
|
||||
rlwimi r25, r27, 24, 23, 29 ; add constant fields from dsisr (*4) to FDP
|
||||
rlwimi r16, r16, 27, 26, 26 ; copy FlagSE to FlagTrace
|
||||
rlwimi r16, r16, 27, 26, 26 ; ContextFlagTraceWhenDone = MsrSE
|
||||
bne @X_form
|
||||
|
||||
; D- or DS-form (immediate-indexed) instruction
|
||||
|
@ -359,7 +359,7 @@ AlignmentInt
|
|||
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
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
mtcr r26
|
||||
rlwimi r17, r26, 6, 26, 5 ; wrap some shite around the register values
|
||||
blr
|
||||
|
@ -370,7 +370,7 @@ AlignmentInt
|
|||
mfmsr r14
|
||||
rlwimi r25, r26, 26, 22, 29
|
||||
mtlr r25
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
mtcr r26
|
||||
rlwimi r17, r26, 6, 26, 5
|
||||
bclr BO_IF_NOT, mrOpflag1
|
||||
|
@ -398,7 +398,7 @@ InstStorageInt
|
|||
|
||||
mfsprg r24, 3
|
||||
mfmsr r14
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
addi r23, r1, KDP.VecTblMemRetry
|
||||
mtsprg 3, r23
|
||||
mr r19, r10
|
||||
|
@ -408,7 +408,7 @@ InstStorageInt
|
|||
mtmsr r14
|
||||
mtsprg 3, r24
|
||||
lmw r14, KDP.r14(r1)
|
||||
b IntReturn
|
||||
b ReturnFromInt
|
||||
|
||||
@not_in_htab
|
||||
lmw r14, KDP.r14(r1)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
; AUTO-GENERATED SYMBOL LIST
|
||||
; IMPORTS:
|
||||
; NKExceptions
|
||||
; IntReturn
|
||||
; ReturnFromInt
|
||||
; NKPaging
|
||||
; PutPTE
|
||||
; EXPORTS:
|
||||
|
@ -114,8 +114,8 @@ VMReturn ; OUTSIDE REFERER
|
|||
lwz r15, KDP.r15(r1)
|
||||
lwz r16, KDP.r16(r1)
|
||||
lwz r7, KDP.Flags(r1)
|
||||
lwz r6, KDP.CurCBPtr(r1)
|
||||
b IntReturn
|
||||
lwz r6, KDP.ContextPtr(r1)
|
||||
b ReturnFromInt
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@ HalfLoadedReg set (®)
|
|||
ENDM
|
||||
|
||||
MACRO
|
||||
_bset &dest, &src, &bit
|
||||
_set &dest, &src, &bit
|
||||
|
||||
IF &bit < 16
|
||||
oris&dot &dest, &src, 1 << (15 - (&bit))
|
||||
|
@ -187,19 +187,19 @@ HalfLoadedReg set (®)
|
|||
ENDM
|
||||
|
||||
MACRO
|
||||
_bclr &dest, &src, &bit
|
||||
_clear &dest, &src, &bit
|
||||
|
||||
_bclr_rbit set &bit+1
|
||||
if _bclr_rbit > 31
|
||||
_bclr_rbit set 0
|
||||
_clear_rbit set &bit+1
|
||||
if _clear_rbit > 31
|
||||
_clear_rbit set 0
|
||||
endif
|
||||
|
||||
_bclr_lbit set &bit-1
|
||||
if _bclr_lbit < 0
|
||||
_bclr_lbit set 31
|
||||
_clear_lbit set &bit-1
|
||||
if _clear_lbit < 0
|
||||
_clear_lbit set 31
|
||||
endif
|
||||
|
||||
rlwinm&dot &dest, &src, 0, _bclr_rbit, _bclr_lbit
|
||||
rlwinm&dot &dest, &src, 0, _clear_rbit, _clear_lbit
|
||||
|
||||
ENDM
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
; LOOP until SECONDARY ROUTINE calls, or is, an exit routine
|
||||
; MRPriDone accepts:
|
||||
; r17 = pretend inst: 0-5 from optab || 6-10 rS/rD || 11-15 rA || 21-27 ?? || 28-30 byteCount-1 || 31 isLoad (NB: what about bottom 6 bits??)
|
||||
; r17 = pretend inst: 0-5 from optab || 6-10 rS/rD || 11-15 rA || 21-26 ?? || 27-30 accessLen || 31 isLoad (NB: what about bottom 6 bits??)
|
||||
; r19 = address first byte *after* the string to be accessed
|
||||
; r25 = dirty MRBase ptr
|
||||
; r26 = the original OpTab entry
|
||||
|
@ -32,7 +32,7 @@
|
|||
; r20/r21 = right-justified data (stores only)
|
||||
|
||||
; MemAccess routine sets:
|
||||
; r17 = same but with byteCount field decremented
|
||||
; r17 = same but with len field decremented
|
||||
; r20/r21 = right-justified data (loads only)
|
||||
; r26 = scratch
|
||||
|
||||
|
@ -47,6 +47,19 @@
|
|||
|
||||
; EXIT ROUTINE
|
||||
|
||||
|
||||
|
||||
; registers in broad terms:
|
||||
; r16 Flags (why not r7?)
|
||||
;*r17 Status
|
||||
;*r18 effective address
|
||||
;*r19 end address
|
||||
;*r20/r21 data
|
||||
; r25 MemRetry pointer (often dirty)
|
||||
; r26 OpTab entry
|
||||
; r27 instruction
|
||||
|
||||
|
||||
_align 10
|
||||
MRBase
|
||||
INCLUDE 'MROptabCode.s' ; c00:1154
|
||||
|
@ -54,6 +67,84 @@ MRBase
|
|||
INCLUDE 'MRInterrupts.s' ; 13f4:14f4
|
||||
INCLUDE 'MROptab.s' ; 14f4:16f4
|
||||
INCLUDE 'MRMemtab.s' ; 16f4:17f4
|
||||
; INCLUDE 'MRUnknown.s' ; 17f4:1874
|
||||
; INCLUDE 'MRUnknown.s' ; 17f4:1874
|
||||
MRUnknown
|
||||
dcb.b 128, 0
|
||||
|
||||
END
|
||||
|
||||
; There is definitely some structure here -- but what does it mean?? Crack the bastard...
|
||||
|
||||
; metatabLine %0001, MRSecLoad ; 0
|
||||
; metatabLine %0001, MRSecLoad ; 1
|
||||
; metatabLine %0001, MRSecLoad ; 2
|
||||
; metatabLine %0001, MRSecLoad ; 3
|
||||
|
||||
metatabLine %0001, MRSecException ; 4
|
||||
; metatabLine %0001, MRSecLoadExt ; 5
|
||||
; metatabLine %0001, MRSecLoad ; 6
|
||||
metatabLine %0001, MRSecException ; 7
|
||||
metatabLine %0001, MRSecException ; 8
|
||||
; metatabLine %0011, MRSecLHBRX ; 9
|
||||
; metatabLine %0011, MRSecLWBRX ; 10
|
||||
metatabLine %0001, MRSecException ; 11
|
||||
metatabLine %0001, MRSecException ; 12
|
||||
metatabLine %0001, MRSecException ; 13
|
||||
; metatabLine %0001, MRSecLFSu ; 14
|
||||
; metatabLine %0001, MRSecLFDu ; 15
|
||||
|
||||
; metatabLine %0001, MRSecDone ; 16
|
||||
; metatabLine %0001, MRSecDone ; 17
|
||||
; metatabLine %0001, MRSecDone ; 18
|
||||
; metatabLine %0001, MRSecDone ; 19
|
||||
|
||||
; metatabLine %0001, MRSecLWARX ; 20 ; MRSecLoad
|
||||
; metatabLine %0001, MRSecException ; 21
|
||||
; metatabLine %0001, MRSecSTWCX ; 22 ; MRSecDone
|
||||
; metatabLine %0001, MRSecException ; 23
|
||||
|
||||
metatabLine %0001, MRSecException ; 24
|
||||
metatabLine %0001, MRSecException ; 25
|
||||
; metatabLine %0011, MRSecLMW ; 26
|
||||
; metatabLine %0011, MRSecException ; 27
|
||||
metatabLine %0001, MRSecException ; 28
|
||||
metatabLine %0001, MRSecException ; 29
|
||||
; metatabLine %0011, MRSecSTMW ; 30
|
||||
; metatabLine %0011, MRSecException ; 31
|
||||
|
||||
|
||||
; metatabLine %0011, MRSecLSWix ; 32
|
||||
metatabLine %0011, MRSecLSWix ; 33
|
||||
metatabLine %0011, MRSecLSWix ; 34
|
||||
metatabLine %0011, MRSecLSWix ; 35
|
||||
|
||||
; metatabLine %0011, MRSecStrStore ; 36
|
||||
metatabLine %0011, MRSecStrStore ; 37
|
||||
metatabLine %0011, MRSecStrStore ; 38
|
||||
metatabLine %0011, MRSecStrStore ; 39
|
||||
|
||||
; metatabLine %0011, MRSecLSCBX ; 40
|
||||
metatabLine %0011, MRSecLSCBX ; 41
|
||||
metatabLine %0011, MRSecLSCBX ; 42
|
||||
metatabLine %0011, MRSecLSCBX ; 43
|
||||
metatabLine %0011, MRSecLSCBX ; 44
|
||||
metatabLine %0011, MRSecLSCBX ; 45
|
||||
metatabLine %0011, MRSecLSCBX ; 46
|
||||
metatabLine %0011, MRSecLSCBX ; 47
|
||||
|
||||
; metatabLine %0011, MRSecDCBZ ; 48
|
||||
metatabLine %0001, MRSecException ; 49
|
||||
metatabLine %0001, MRSecException ; 50
|
||||
metatabLine %0001, MRSecException ; 51
|
||||
metatabLine %0001, MRSecException ; 52 ; MRSecDone
|
||||
metatabLine %0001, MRSecException ; 53 ; FDP_0370
|
||||
metatabLine %0001, MRSecException ; 54 ; FDP_0384
|
||||
metatabLine %0001, MRSecException ; 55 ; FDP_0398
|
||||
metatabLine %0001, MRSecException ; 56 ; MRSecDone
|
||||
metatabLine %0001, MRSecException ; 57 ; MRSecDone
|
||||
metatabLine %0001, MRSecException ; 58 ; MRSecDone
|
||||
metatabLine %0001, MRSecException ; 59 ; MRSecDone
|
||||
metatabLine %0001, MRSecException ; 60
|
||||
metatabLine %0001, MRSecException ; 61
|
||||
; metatabLine %0011, MRSecRedoNoTrace ; 62
|
||||
; metatabLine %0001, MRSecException2 ; 63
|
||||
|
|
|
@ -213,7 +213,7 @@ PutPTE ; EA r27 // PTE r30/r31, EQ=Success, GT=Invalid, LT=Fault
|
|||
cmpwi cr7, r28, 0
|
||||
clrrwi r28, r31, 12
|
||||
cmpw r28, r1
|
||||
lwz r30, KDP.CurCBPtr(r1)
|
||||
lwz r30, KDP.ContextPtr(r1)
|
||||
|
||||
beq cr7, @rethink_pte_search
|
||||
addi r31, r30, 768-1
|
||||
|
|
|
@ -259,7 +259,7 @@ CopyBATRangeInit
|
|||
lwzu r21, 4(r9) ; grab LBAT
|
||||
stwu r20, 4(r8) ; store UBAT
|
||||
|
||||
_bclr r23, r21, 22 ; if LBAT[22] (reserved) is set:
|
||||
_clear r23, r21, 22 ; if LBAT[22] (reserved) is set:
|
||||
cmpw r21, r23
|
||||
beq @bitnotset
|
||||
add r21, r23, rCI ; then LBAT[BRPN] is relative to ConfigInfo struct
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
IllegalInstruction
|
||||
mfmsr r9
|
||||
_bset r8, r9, bitMsrDR
|
||||
_set r8, r9, bitMsrDR
|
||||
mtmsr r8
|
||||
lwz r8, 0(r10)
|
||||
mtmsr r9
|
||||
|
@ -14,19 +14,19 @@ IllegalInstruction
|
|||
stw r3, KDP.r3(r1)
|
||||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
lwz r9, CB.r7(r6)
|
||||
lwz r9, CB.r7+4(r6)
|
||||
stw r9, KDP.r7(r1)
|
||||
lwz r9, CB.r8(r6)
|
||||
lwz r9, CB.r8+4(r6)
|
||||
stw r9, KDP.r8(r1)
|
||||
lwz r9, CB.r9(r6)
|
||||
lwz r9, CB.r9+4(r6)
|
||||
stw r9, KDP.r9(r1)
|
||||
lwz r9, CB.r10(r6)
|
||||
lwz r9, CB.r10+4(r6)
|
||||
stw r9, KDP.r10(r1)
|
||||
lwz r9, CB.r11(r6)
|
||||
lwz r9, CB.r11+4(r6)
|
||||
stw r9, KDP.r11(r1)
|
||||
lwz r9, CB.r12(r6)
|
||||
lwz r9, CB.r12+4(r6)
|
||||
stw r9, KDP.r12(r1)
|
||||
lwz r9, CB.r13(r6)
|
||||
lwz r9, CB.r13+4(r6)
|
||||
stw r9, KDP.r13(r1)
|
||||
stmw r14, KDP.r14(r1)
|
||||
|
||||
|
@ -69,15 +69,15 @@ IllegalInstruction
|
|||
addze r20, r20
|
||||
mtxer r23
|
||||
lwz r23, KDP.NKInfo.EmulatedUnimpInstCount(r1)
|
||||
rlwimi r7, r7, 27, 26, 26
|
||||
rlwimi r7, r7, 27, 26, 26 ; ContextFlagTraceWhenDone = MsrSE
|
||||
addi r23, r23, 1
|
||||
stw r23, KDP.NKInfo.EmulatedUnimpInstCount(r1)
|
||||
|
||||
stwx r21, r1, r28 ; save register into EWA
|
||||
mr r16, r7
|
||||
beq cr7, MRSecDone ; TBL
|
||||
beq cr7, MRSecDone ; TBL
|
||||
stwx r20, r1, r28
|
||||
b MRSecDone ; TBU
|
||||
b MRSecDone ; TBU
|
||||
|
||||
|
||||
@STFIWX
|
||||
|
@ -86,7 +86,7 @@ IllegalInstruction
|
|||
addi r23, r23, 1
|
||||
stw r23, KDP.NKInfo.EmulatedUnimpInstCount(r1)
|
||||
mfmsr r14
|
||||
_bset r15, r14, bitMsrDR
|
||||
_set r15, r14, bitMsrDR
|
||||
b EmulateDataAccess
|
||||
|
||||
########################################################################
|
||||
|
@ -103,7 +103,7 @@ KCallRunAlternateContext
|
|||
lwz r9, KDP.NCBCacheLA0(r1)
|
||||
rlwinm r8, r3, 0, 0, 25
|
||||
cmpw cr1, r8, r9
|
||||
bne IntReturn
|
||||
bne ReturnFromInt
|
||||
lwz r9, KDP.NCBCachePA0(r1)
|
||||
bne cr1, @search_cache
|
||||
|
||||
|
@ -114,11 +114,11 @@ KCallRunAlternateContext
|
|||
mtsprg 3, r8
|
||||
|
||||
lwz r8, KDP.EmuKCallTblPtrLogical(r1)
|
||||
mtcrf 0x3f, r7
|
||||
mtcrf crMaskFlags, r7
|
||||
clrlwi r7, r7, 8
|
||||
stw r8, CB.ExceptionHandlerRetAddr(r9)
|
||||
stw r8, CB.IntraState.HandlerReturn+4(r9)
|
||||
|
||||
stw r9, KDP.CurCBPtr(r1)
|
||||
stw r9, KDP.ContextPtr(r1)
|
||||
|
||||
b SwitchContext ; OldCB *r6, NewCB *r9
|
||||
|
||||
|
@ -252,9 +252,9 @@ KCallResetSystem
|
|||
|
||||
; Gary Davidian skeleton key: r5/D0 = MSR bits to unset, r7/D2 = MSR bits to set
|
||||
andc r11, r11, r5
|
||||
lwz r8, CB.r7(r6)
|
||||
lwz r8, CB.r7+4(r6)
|
||||
or r11, r11, r8
|
||||
b IntReturn
|
||||
b ReturnFromInt
|
||||
|
||||
Reset
|
||||
include 'NKReset.s'
|
||||
|
@ -272,18 +272,18 @@ KCallPrioritizeInterrupts
|
|||
mtsrr0 r10
|
||||
mtsrr1 r11
|
||||
mtcr r13
|
||||
lwz r10, CB.r10(r6)
|
||||
lwz r11, CB.r11(r6)
|
||||
lwz r12, CB.r12(r6)
|
||||
lwz r13, CB.r13(r6)
|
||||
lwz r7, CB.r7(r6)
|
||||
lwz r10, CB.r10+4(r6)
|
||||
lwz r11, CB.r11+4(r6)
|
||||
lwz r12, CB.r12+4(r6)
|
||||
lwz r13, CB.r13+4(r6)
|
||||
lwz r7, CB.r7+4(r6)
|
||||
lwz r8, KDP.r1(r1)
|
||||
mfsprg r9, 3
|
||||
lwz r9, VecTbl.External(r9)
|
||||
mtsprg 1, r8
|
||||
mtlr r9
|
||||
lwz r8, CB.r8(r6)
|
||||
lwz r9, CB.r9(r6)
|
||||
lwz r8, CB.r8+4(r6)
|
||||
lwz r9, CB.r9+4(r6)
|
||||
lwz r6, KDP.r6(r1)
|
||||
blrl ; (could this ever fall though to KCallSystemCrash?)
|
||||
|
||||
|
@ -296,22 +296,22 @@ KCallSystemCrash
|
|||
stw r4, KDP.r4(r1)
|
||||
stw r5, KDP.r5(r1)
|
||||
|
||||
lwz r8, CB.r7(r6)
|
||||
lwz r9, CB.r8(r6)
|
||||
lwz r8, CB.r7+4(r6)
|
||||
lwz r9, CB.r8+4(r6)
|
||||
stw r8, KDP.r7(r1)
|
||||
stw r9, KDP.r8(r1)
|
||||
|
||||
lwz r8, CB.r9(r6)
|
||||
lwz r9, CB.r10(r6)
|
||||
lwz r8, CB.r9+4(r6)
|
||||
lwz r9, CB.r10+4(r6)
|
||||
stw r8, KDP.r9(r1)
|
||||
stw r9, KDP.r10(r1)
|
||||
|
||||
lwz r8, CB.r11(r6)
|
||||
lwz r9, CB.r12(r6)
|
||||
lwz r8, CB.r11+4(r6)
|
||||
lwz r9, CB.r12+4(r6)
|
||||
stw r8, KDP.r11(r1)
|
||||
stw r9, KDP.r12(r1)
|
||||
|
||||
lwz r8, CB.r13(r6)
|
||||
lwz r8, CB.r13+4(r6)
|
||||
stw r8, KDP.r13(r1)
|
||||
|
||||
stmw r14, KDP.r14(r1)
|
||||
|
@ -329,14 +329,14 @@ ProgramInt
|
|||
stw r6, KDP.r6(r1)
|
||||
mfsprg r6, 1
|
||||
stw r6, KDP.r1(r1)
|
||||
lwz r6, KDP.CurCBPtr(r1)
|
||||
stw r7, CB.r7(r6)
|
||||
stw r8, CB.r8(r6)
|
||||
stw r9, CB.r9(r6)
|
||||
stw r10, CB.r10(r6)
|
||||
stw r11, CB.r11(r6)
|
||||
stw r12, CB.r12(r6)
|
||||
stw r13, CB.r13(r6)
|
||||
lwz r6, KDP.ContextPtr(r1)
|
||||
stw r7, CB.r7+4(r6)
|
||||
stw r8, CB.r8+4(r6)
|
||||
stw r9, CB.r9+4(r6)
|
||||
stw r10, CB.r10+4(r6)
|
||||
stw r11, CB.r11+4(r6)
|
||||
stw r12, CB.r12+4(r6)
|
||||
stw r13, CB.r13+4(r6)
|
||||
|
||||
; Compare SRR0 with address of Emulator's KCall trap table
|
||||
lwz r8, KDP.EmuKCallTblPtrLogical(r1)
|
||||
|
@ -346,7 +346,7 @@ ProgramInt
|
|||
lwz r7, KDP.Flags(r1)
|
||||
mfsprg r12, 2
|
||||
beq KCallReturnFromExceptionFastPath ; KCall in Emulator table => fast path
|
||||
rlwimi. r7, r7, bitFlagEmu, 0, 0
|
||||
rlwimi. r7, r7, bitGlobalFlagSystem, 0, 0
|
||||
cmplwi cr7, r8, 16 * 4
|
||||
bge cr0, @fromAltContext ; Alt Context cannot make KCalls; this might be an External Int
|
||||
bge cr7, @notFromEmulatorTrapTable ; from Emulator but not from its KCall table => do more checks
|
||||
|
@ -370,7 +370,7 @@ ProgramInt
|
|||
bc BO_IF_NOT, 14, @notTrap
|
||||
|
||||
mfmsr r9 ; fetch the instruction to get the "trap number"
|
||||
_bset r8, r9, bitMsrDR
|
||||
_set r8, r9, bitMsrDR
|
||||
mtmsr r8
|
||||
lwz r8, 0(r10)
|
||||
mtmsr r9
|
||||
|
@ -431,7 +431,7 @@ SyscallInt
|
|||
########################################################################
|
||||
|
||||
_alignToCacheBlock
|
||||
TraceInt
|
||||
TraceInt ; here because of MSR[SE/BE], possibly thanks to ContextFlagTraceWhenDone
|
||||
bl LoadInterruptRegisters
|
||||
li r8, ecInstTrace
|
||||
b Exception
|
||||
|
|
|
@ -201,7 +201,7 @@ CodeBase ds.l 1 ; 64c
|
|||
MRBase ds.l 1 ; 650
|
||||
ECBPtrLogical ds.l 1 ; 654 ; Emulator/System ContextBlock
|
||||
ECBPtr ds.l 1 ; 658
|
||||
CurCBPtr ds.l 1 ; 65c ; moved to EWA (per-CPU) in NKv2
|
||||
ContextPtr ds.l 1 ; 65c ; moved to EWA (per-CPU) in NKv2
|
||||
Flags ds.l 1 ; 660 ; moved to EWA (per-CPU) in NKv2
|
||||
Enables ds.l 1 ; 664 ; moved to EWA (per-CPU) in NKv2
|
||||
OtherContextDEC ds.l 1 ; 668 ; ticks that the *inactive* context has left out of 1s
|
||||
|
@ -342,136 +342,108 @@ InfoRecBlk ds.b 64 ; fc0:1000 ; Access using ptr equates in InfoRecords
|
|||
|
||||
########################################################################
|
||||
|
||||
CB RECORD 0,INCR ; ContextBlock (Emulator/System or Native/Alternate)
|
||||
Flags ds.l 1 ; 000
|
||||
Enables ds.l 1 ; 004
|
||||
ds.l 1 ; 008
|
||||
ds.l 1 ; 00c
|
||||
ds.l 1 ; 010
|
||||
ds.l 1 ; 014
|
||||
ds.l 1 ; 018
|
||||
ds.l 1 ; 01c
|
||||
ds.l 1 ; 020
|
||||
LowSave17 ds.l 1 ; 024
|
||||
LowSave20 ds.l 1 ; 028
|
||||
LowSave21 ds.l 1 ; 02c
|
||||
ds.l 1 ; 030
|
||||
LowSave19 ds.l 1 ; 034
|
||||
ds.l 1 ; 038
|
||||
LowSave18 ds.l 1 ; 03c
|
||||
KernelState RECORD 0,INCR
|
||||
Flags ds.l 1 ; 00
|
||||
Enables ds.l 1 ; 04
|
||||
|
||||
ExceptionOriginFlags ds.l 1 ; 040 ; from before exception
|
||||
ExceptionOriginEnables ds.l 1 ; 044 ; from before exception
|
||||
ds.l 1 ; 048
|
||||
ExceptionHandler ds.l 1 ; 04c
|
||||
ds.l 1 ; 050
|
||||
ExceptionHandlerR4 ds.l 1 ; 054
|
||||
ds.l 1 ; 058
|
||||
ExceptionHandlerRetAddr ds.l 1 ; 05c
|
||||
ds.l 1 ; 060
|
||||
PropagateR17 ds.l 1 ; 064
|
||||
PropagateR20 ds.l 1 ; 068
|
||||
PropagateR21 ds.l 1 ; 06c
|
||||
ds.l 1 ; 070
|
||||
PropagateR19 ds.l 1 ; 074
|
||||
ds.l 1 ; 078
|
||||
PropagateR18 ds.l 1 ; 07c
|
||||
Handler ds.d 1 ; 08
|
||||
HandlerArg ds.d 1 ; 10
|
||||
HandlerReturn ds.d 1 ; 18
|
||||
|
||||
ds.l 1 ; 080
|
||||
ExceptionOriginAddr ds.l 1 ; 084
|
||||
ds.l 1 ; 088
|
||||
ExceptionOriginLR ds.l 1 ; 08c
|
||||
ds.l 1 ; 090
|
||||
ExceptionOriginR3 ds.l 1 ; 094
|
||||
ds.l 1 ; 098
|
||||
ExceptionOriginR4 ds.l 1 ; 09c
|
||||
ds.l 1 ; 0a0
|
||||
MSR ds.l 1 ; 0a4
|
||||
ds.l 1 ; 0a8
|
||||
ds.l 1 ; 0ac
|
||||
ds.l 1 ; 0b0
|
||||
ds.l 1 ; 0b4
|
||||
ds.l 1 ; 0b8
|
||||
ds.l 1 ; 0bc
|
||||
ds.l 1 ; 0c0
|
||||
MQ ds.l 1 ; 0c4 ; 601 only
|
||||
ds.l 1 ; 0c8
|
||||
ds.l 1 ; 0cc
|
||||
ds.l 1 ; 0d0
|
||||
XER ds.l 1 ; 0d4
|
||||
ds.l 1 ; 0d8
|
||||
CR ds.l 1 ; 0dc
|
||||
ds.l 1 ; 0e0
|
||||
ds.l 1 ; 0e4
|
||||
ds.l 1 ; 0e8
|
||||
LR ds.l 1 ; 0ec
|
||||
ds.l 1 ; 0f0
|
||||
CTR ds.l 1 ; 0f4
|
||||
ds.l 1 ; 0f8
|
||||
SRR0 ds.l 1 ; 0fc
|
||||
ds.l 1
|
||||
r0 ds.l 1 ; 104
|
||||
ds.l 1
|
||||
r1 ds.l 1 ; 10c
|
||||
ds.l 1
|
||||
r2 ds.l 1 ; 114
|
||||
ds.l 1
|
||||
r3 ds.l 1 ; 11c
|
||||
ds.l 1
|
||||
r4 ds.l 1 ; 124
|
||||
ds.l 1
|
||||
r5 ds.l 1 ; 12c
|
||||
ds.l 1
|
||||
r6 ds.l 1 ; 134
|
||||
ds.l 1
|
||||
r7 ds.l 1 ; 13c
|
||||
ds.l 1
|
||||
r8 ds.l 1 ; 144
|
||||
ds.l 1
|
||||
r9 ds.l 1 ; 14c
|
||||
ds.l 1
|
||||
r10 ds.l 1 ; 154
|
||||
ds.l 1
|
||||
r11 ds.l 1 ; 15c
|
||||
ds.l 1
|
||||
r12 ds.l 1 ; 164
|
||||
ds.l 1
|
||||
r13 ds.l 1 ; 16c
|
||||
ds.l 1
|
||||
r14 ds.l 1 ; 174
|
||||
ds.l 1
|
||||
r15 ds.l 1 ; 17c
|
||||
ds.l 1
|
||||
r16 ds.l 1 ; 184
|
||||
ds.l 1
|
||||
r17 ds.l 1 ; 18c
|
||||
ds.l 1
|
||||
r18 ds.l 1 ; 194
|
||||
ds.l 1
|
||||
r19 ds.l 1 ; 19c
|
||||
ds.l 1
|
||||
r20 ds.l 1 ; 1a4
|
||||
ds.l 1
|
||||
r21 ds.l 1 ; 1ac
|
||||
ds.l 1
|
||||
r22 ds.l 1 ; 1b4
|
||||
ds.l 1
|
||||
r23 ds.l 1 ; 1bc
|
||||
ds.l 1
|
||||
r24 ds.l 1 ; 1c4
|
||||
ds.l 1
|
||||
r25 ds.l 1 ; 1cc
|
||||
ds.l 1
|
||||
r26 ds.l 1 ; 1d4
|
||||
ds.l 1
|
||||
r27 ds.l 1 ; 1dc
|
||||
ds.l 1
|
||||
r28 ds.l 1 ; 1e4
|
||||
ds.l 1
|
||||
r29 ds.l 1 ; 1ec
|
||||
ds.l 1
|
||||
r30 ds.l 1 ; 1f4
|
||||
ds.l 1
|
||||
r31 ds.l 1 ; 1fc
|
||||
FloatRegisters ds.d 32 ; 200:300
|
||||
MemRet17 ds.d 1 ; 20 ; MemRetry state
|
||||
MemRetData ds.d 1 ; 28
|
||||
MemRet19 ds.d 1 ; 30
|
||||
MemRet18 ds.d 1 ; 38
|
||||
ENDR
|
||||
|
||||
########################################################################
|
||||
|
||||
CB RECORD 0,INCR ; ContextBlock (Emulator/System or Native/Alternate)
|
||||
|
||||
InterState ds KernelState ; 000:040 ; for switching between contexts
|
||||
IntraState ds KernelState ; 040:080 ; for raising/disposing exceptions within a context
|
||||
|
||||
FaultSrcPC ds.d 1 ; 080 ; saved when starting an exception handler
|
||||
FaultSrcLR ds.d 1 ; 088
|
||||
FaultSrcR3 ds.d 1 ; 090
|
||||
FaultSrcR4 ds.d 1 ; 098
|
||||
|
||||
MSR ds.d 1 ; 0a0
|
||||
ds.d 1 ; 0a8
|
||||
ds.d 1 ; 0b0
|
||||
ds.d 1 ; 0b8
|
||||
MQ ds.d 1 ; 0c0 ; 601 only
|
||||
ds.d 1 ; 0c8
|
||||
XER ds.d 1 ; 0d0
|
||||
CR ds.d 1 ; 0d8
|
||||
FPSCR ds.d 1 ; 0e0 ; unsure, mffs/mtfs?
|
||||
LR ds.d 1 ; 0e8
|
||||
CTR ds.d 1 ; 0f0
|
||||
PC ds.d 1 ; 0f8
|
||||
|
||||
r0 ds.d 1 ; 100 ; big-endian, so 32-bit value stored in second word
|
||||
r1 ds.d 1 ; 108
|
||||
r2 ds.d 1 ; 110
|
||||
r3 ds.d 1 ; 118
|
||||
r4 ds.d 1 ; 120
|
||||
r5 ds.d 1 ; 128
|
||||
r6 ds.d 1 ; 130
|
||||
r7 ds.d 1 ; 138
|
||||
r8 ds.d 1 ; 140
|
||||
r9 ds.d 1 ; 148
|
||||
r10 ds.d 1 ; 150
|
||||
r11 ds.d 1 ; 158
|
||||
r12 ds.d 1 ; 160
|
||||
r13 ds.d 1 ; 168
|
||||
r14 ds.d 1 ; 170
|
||||
r15 ds.d 1 ; 178
|
||||
r16 ds.d 1 ; 180
|
||||
r17 ds.d 1 ; 188
|
||||
r18 ds.d 1 ; 190
|
||||
r19 ds.d 1 ; 198
|
||||
r20 ds.d 1 ; 1a0
|
||||
r21 ds.d 1 ; 1a8
|
||||
r22 ds.d 1 ; 1b0
|
||||
r23 ds.d 1 ; 1b8
|
||||
r24 ds.d 1 ; 1c0
|
||||
r25 ds.d 1 ; 1c8
|
||||
r26 ds.d 1 ; 1d0
|
||||
r27 ds.d 1 ; 1d8
|
||||
r28 ds.d 1 ; 1e0
|
||||
r29 ds.d 1 ; 1e8
|
||||
r30 ds.d 1 ; 1f0
|
||||
r31 ds.d 1 ; 1f8
|
||||
|
||||
f0 ds.d 1 ; 200
|
||||
f1 ds.d 1 ; 208
|
||||
f2 ds.d 1 ; 210
|
||||
f3 ds.d 1 ; 218
|
||||
f4 ds.d 1 ; 220
|
||||
f5 ds.d 1 ; 228
|
||||
f6 ds.d 1 ; 230
|
||||
f7 ds.d 1 ; 238
|
||||
f8 ds.d 1 ; 240
|
||||
f9 ds.d 1 ; 248
|
||||
f10 ds.d 1 ; 250
|
||||
f11 ds.d 1 ; 258
|
||||
f12 ds.d 1 ; 260
|
||||
f13 ds.d 1 ; 268
|
||||
f14 ds.d 1 ; 270
|
||||
f15 ds.d 1 ; 278
|
||||
f16 ds.d 1 ; 280
|
||||
f17 ds.d 1 ; 288
|
||||
f18 ds.d 1 ; 290
|
||||
f19 ds.d 1 ; 298
|
||||
f20 ds.d 1 ; 2a0
|
||||
f21 ds.d 1 ; 2a8
|
||||
f22 ds.d 1 ; 2b0
|
||||
f23 ds.d 1 ; 2b8
|
||||
f24 ds.d 1 ; 2c0
|
||||
f25 ds.d 1 ; 2c8
|
||||
f26 ds.d 1 ; 2d0
|
||||
f27 ds.d 1 ; 2d8
|
||||
f28 ds.d 1 ; 2e0
|
||||
f29 ds.d 1 ; 2e8
|
||||
f30 ds.d 1 ; 2f0
|
||||
f31 ds.d 1 ; 2f8
|
||||
ENDR
|
||||
|
|
|
@ -86,7 +86,7 @@ SystemCrash
|
|||
stw r0, KDP.CrashSR15(r1)
|
||||
|
||||
mfmsr r0
|
||||
_bset r0, r0, bitMsrFP
|
||||
_set r0, r0, bitMsrFP
|
||||
mtmsr r0
|
||||
stfd f0, KDP.CrashF0(r1)
|
||||
stfd f1, KDP.CrashF1(r1)
|
||||
|
|
Loading…
Reference in New Issue
Block a user