memretry in some shape

This commit is contained in:
Elliot Nunn 2018-07-24 12:56:38 +08:00
parent 5086393238
commit 2d82285303
18 changed files with 1592 additions and 143 deletions

85
NanoKernel/MRInterrupts.s Executable file
View File

@ -0,0 +1,85 @@
; Special MR registers to investigate: r19 (inst addr), r26 (error)
MRDataStorageInt ; Consult DSISR and the page table to decide what to do
mfdsisr r31 ; Check DSISR for simple HTAB miss
andis. r28, r31, 0xC030 ; (bits 0/1/10/11)
mfsprg r1, 1
mfdar r27
bne @possible_htab_miss
andis. r28, r31, 0x0800 ; Illegal data access (else crash!)
addi r29, r1, 0x320 ; ?bug -> PutPTE used to accept this arg
bnel PutPTE ; Read the failing PTE to r30/r31
li r28, 0x43 ; Filter Writethru and Protection bits
and r28, r31, r28
cmpwi cr7, r28, 0x43
beql SystemCrash ; Not illegal data access => Crash
mfsprg r28, 2
mtlr r28
bne cr7, @access_exception ; Any filtered bit unset => Exception
mfsrr0 r28 ; Writethru and Protection bits set => ROM write nop
addi r28, r28, 4
lwz r26, KDP.NKInfo.QuietWrite(r1)
mtsrr0 r28
addi r26, r26, 1
stw r26, KDP.NKInfo.QuietWrite(r1)
@return
extrwi r26, r25, 8, 22 ; Signal to some MemRetry code?
rfi
@access_exception
andi. r28, r31, 3
li r8, ecDataSupAccessViolation
beq ExceptionAfterRetry
cmpwi r28, 3
li r8, ecDataWriteViolation
beq ExceptionAfterRetry ; Nobody allowed to write => Exception
li r8, ecDataSupWriteViolation
b ExceptionAfterRetry ; Supervisor allowed to write => Exception
@possible_htab_miss
andis. r28, r31, 0x8010 ; Check for DataAccess Interrupt or ec[io]wx
bne MRHardwareFault ; Either of those => big trouble
bl PutPTE ; HTAB miss => fill HTAB
mfsprg r28, 2 ; (restore lr)
mtlt r28
beq @return ; HTAB success => RFI
li r8, ecDataPageFault
blt ExceptionAfterRetry ; Fault => Exception
li r8, ecDataInvalidAddress
b ExceptionAfterRetry ; Bad address => Exception
MRMachineCheckInt ; Always gives HW fault
mfsprg r1, 1
lwz r27, KDP.HtabLastEA(r1)
subf r28, r19, r27 ; Delete last HTAB entry if suspicious
cmpwi r28, -16
blt @no_htab_del
cmpwi r28, 16
bgt @no_htab_del
lwz r28, KDP.NKInfo.HashTableDeleteCount(r1)
lwz r29, KDP.ApproxCurrentPTEG(r1)
addi r28, r28, 1
stw r28, KDP.NKInfo.HashTableDeleteCount(r1)
li r28, 0
stw r28, 0(r29)
sync
tlbie r27
sync
@no_htab_del
MRHardwareFault ; Can come from a DSI or a Machine Check
cmplw r10, r19
li r8, ecDataHardwareFault
bne ExceptionAfterRetry
mtsprg 3, r24
lmw r14, KDP.r14(r1)
li r8, ecInstHardwareFault
b Exception

155
NanoKernel/MRMemtab.s Executable file
View File

@ -0,0 +1,155 @@
; Indexing this table:
; bits 0-23 MRCode
; bits 24-26 number of bytes to access minus one
; bit 27 one for load, zero for store
; bits 28-30 alignment modulus
; bit 31 zero (entries are 2b)
; "Alignment modulus":
; If the "string" to be accessed is right-aligned to an 8b boundary, modulus is 0.
; Modulus then increases by 1 for every increase in the address of the "string".
; Interpreting this table:
; Each entry refers to a routine
MACRO
memtabRow &label
DC.W (&label-MRTop) - (*-MRMemtab)
ENDM
MRMemtab
memtabRow MRStore1 ; 1-byte stores
memtabRow MRStore1 ; mod 1
memtabRow MRStore1 ; mod 2
memtabRow MRStore1 ; mod 3
memtabRow MRStore1 ; mod 4
memtabRow MRStore1 ; mod 5
memtabRow MRStore1 ; mod 6
memtabRow MRStore1 ; mod 7
memtabRow MRLoad1 ; 1-byte loads
memtabRow MRLoad1 ; mod 1
memtabRow MRLoad1 ; mod 2
memtabRow MRLoad1 ; mod 3
memtabRow MRLoad1 ; mod 4
memtabRow MRLoad1 ; mod 5
memtabRow MRLoad1 ; mod 6
memtabRow MRLoad1 ; mod 7
memtabRow MRStore2 ; 2-byte stores
memtabRow MRStore11 ; mod 1
memtabRow MRStore2 ; mod 2
memtabRow MRStore11 ; mod 3
memtabRow MRStore2 ; mod 4
memtabRow MRStore11 ; mod 5
memtabRow MRStore2 ; mod 6
memtabRow MRStore11 ; mod 7
memtabRow MRLoad2Fast ; 2-byte loads
memtabRow MRLoad11 ; mod 1
memtabRow MRLoad2Fast ; mod 2
memtabRow MRLoad11 ; mod 3
memtabRow MRLoad2Fast ; mod 4
memtabRow MRLoad11 ; mod 5
memtabRow MRLoad2Fast ; mod 6
memtabRow MRLoad11 ; mod 7
memtabRow MRStore12 ; 3-byte stores
memtabRow MRStore21 ; mod 1
memtabRow MRStore12 ; mod 2
memtabRow MRStore21 ; mod 3
memtabRow MRStore12 ; mod 4
memtabRow MRStore21 ; mod 5
memtabRow MRStore12 ; mod 6
memtabRow MRStore21 ; mod 7
memtabRow MRLoad12 ; 3-byte loads
memtabRow MRLoad21 ; mod 1
memtabRow MRLoad12 ; mod 2
memtabRow MRLoad21 ; mod 3
memtabRow MRLoad12 ; mod 4
memtabRow MRLoad21 ; mod 5
memtabRow MRLoad12 ; mod 6
memtabRow MRLoad21 ; mod 7
memtabRow MRStore4 ; 4-byte stores
memtabRow MRStore121 ; mod 1
memtabRow MRStore22Fast ; mod 2
memtabRow MRStore121 ; mod 3
memtabRow MRStore4 ; mod 4
memtabRow MRStore121 ; mod 5
memtabRow MRStore22Fast ; mod 6
memtabRow MRStore121 ; mod 7
memtabRow MRLoad4 ; 4-byte loads
memtabRow MRLoad121 ; mod 1
memtabRow MRLoad22Fast ; mod 2
memtabRow MRLoad121 ; mod 3
memtabRow MRLoad4 ; mod 4
memtabRow MRLoad121 ; mod 5
memtabRow MRLoad22Fast ; mod 6
memtabRow MRLoad121 ; mod 7
memtabRow MRStore14 ; 5-byte stores
memtabRow MRStore41 ; mod 1
memtabRow MRStore14 ; mod 2
memtabRow MRStore221 ; mod 3
memtabRow MRStore14 ; mod 4
memtabRow MRStore41 ; mod 5
memtabRow MRStore14 ; mod 6
memtabRow MRStore221 ; mod 7
memtabRow MRLoad14 ; 5-byte loads
memtabRow MRLoad41 ; mod 1
memtabRow MRLoad122 ; mod 2
memtabRow MRLoad221 ; mod 3
memtabRow MRLoad14 ; mod 4
memtabRow MRLoad41 ; mod 5
memtabRow MRLoad122 ; mod 6
memtabRow MRLoad221 ; mod 7
memtabRow MRStore24 ; 6-byte stores
memtabRow MRStore141 ; mod 1
memtabRow MRStore42 ; mod 2
memtabRow MRStore1221 ; mod 3
memtabRow MRStore24 ; mod 4
memtabRow MRStore141 ; mod 5
memtabRow MRStore42 ; mod 6
memtabRow MRStore1221 ; mod 7
memtabRow MRLoad24 ; 6-byte loads
memtabRow MRLoad141 ; mod 1
memtabRow MRLoad42 ; mod 2
memtabRow MRLoad1221 ; mod 3
memtabRow MRLoad24 ; mod 4
memtabRow MRLoad141 ; mod 5
memtabRow MRLoad42 ; mod 6
memtabRow MRLoad1221 ; mod 7
memtabRow MRStore124 ; 7-byte stores
memtabRow MRStore241 ; mod 1
memtabRow MRStore142 ; mod 2
memtabRow MRStore421 ; mod 3
memtabRow MRStore124 ; mod 4
memtabRow MRStore241 ; mod 5
memtabRow MRStore142 ; mod 6
memtabRow MRStore421 ; mod 7
memtabRow MRLoad124 ; 7-byte loads
memtabRow MRLoad241 ; mod 1
memtabRow MRLoad142 ; mod 2
memtabRow MRLoad421 ; mod 3
memtabRow MRLoad124 ; mod 4
memtabRow MRLoad241 ; mod 5
memtabRow MRLoad142 ; mod 6
memtabRow MRLoad421 ; mod 7
memtabRow MRStore8 ; 8-byte stores
memtabRow MRStore1241 ; mod 1
memtabRow MRStore242 ; mod 2
memtabRow MRStore1421 ; mod 3
memtabRow MRStore44 ; mod 4
memtabRow MRStore1241 ; mod 5
memtabRow MRStore242 ; mod 6
memtabRow MRStore1421 ; mod 7
memtabRow MRLoad8 ; 8-byte loads
memtabRow MRLoad1241 ; mod 1
memtabRow MRLoad242 ; mod 2
memtabRow MRLoad1421 ; mod 3
memtabRow MRLoad44 ; mod 4
memtabRow MRLoad1241 ; mod 5
memtabRow MRLoad242 ; mod 6
memtabRow MRLoad1421 ; mod 7

272
NanoKernel/MRMemtabCode.s Executable file
View File

@ -0,0 +1,272 @@
; Each routine accepts:
; r17 = pretend inst with (byteCount-1) in bits 28-30 (will be decremented)
; r19 = address of byte to the right of the string to be loaded/saved
; r26 as a scratch register
; r20/r21 = right-justified data (stores only)
; Before jumping to MRDoneMemAccess or one of the MRFast paths, each routine sets:
; r20/r21 = right-justified data (loads only)
; r17 has byteCount field decremented
; r26 = junk, not to be trusted
########################################################################
MRLoad1241
lbz r26, -8(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 0
MRLoad241
lhz r26, -7(r19)
subi r17, r17, 4
insrwi r20, r26, 16, 8
b MRLoad41
MRLoad141
lbz r26, -6(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 16
MRLoad41
lwz r26, -5(r19)
subi r17, r17, 8
inslwi r20, r26, 8, 24
insrwi r21, r26, 24, 0
b MRLoad1
MRLoad1421
lbz r26, -8(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 0
MRLoad421
lwz r26, -7(r19)
subi r17, r17, 8
inslwi r20, r26, 24, 8
insrwi r21, r26, 8, 0
b MRLoad21
MRLoad1221
lbz r26, -6(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 16
MRLoad221
lhz r26, -5(r19)
subi r17, r17, 4
rlwimi r20, r26, 24, 24, 31
insrwi r21, r26, 8, 0
b MRLoad21
MRLoad121
lbz r26, -4(r19)
subi r17, r17, 2
insrwi r21, r26, 8, 0
MRLoad21
lhz r26, -3(r19)
subi r17, r17, 4
insrwi r21, r26, 16, 8
b MRLoad1
MRLoad11
lbz r26, -2(r19)
subi r17, r17, 2
insrwi r21, r26, 8, 16
MRLoad1
lbz r26, -1(r19)
insrwi r21, r26, 8, 24
b MRDoneMemAccess
MRLoad242
lhz r26, -8(r19)
subi r17, r17, 4
insrwi r20, r26, 16, 0
b MRLoad42
MRLoad142
lbz r26, -7(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 8
MRLoad42
lwz r26, -6(r19)
subi r17, r17, 8
inslwi r20, r26, 16, 16
insrwi r21, r26, 16, 0
b MRLoad2Fast
MRLoad122
lbz r26, -5(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 24
b MRLoad22Fast
MRLoad12
lbz r26, -3(r19)
subi r17, r17, 2
insrwi r21, r26, 8, 8
b MRLoad2Fast
MRLoad44
lwz r20, -8(r19)
subi r17, r17, 8
lwz r21, -4(r19)
b MRDoneMemAccess
MRLoad124
lbz r26, -7(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 8
MRLoad24
lhz r26, -6(r19)
subi r17, r17, 4
insrwi r20, r26, 16, 16
lwz r21, -4(r19)
b MRDoneMemAccess
MRLoad14
lbz r26, -5(r19)
subi r17, r17, 2
insrwi r20, r26, 8, 24
lwz r21, -4(r19)
b MRDoneMemAccess
MRLoad8
lwz r20, -8(r19)
lwz r21, -4(r19)
b MRDoneMemAccess
########################################################################
MRStore1241
srwi r26, r20, 24
stb r26, -8(r19)
subi r17, r17, 2
MRStore241
srwi r26, r20, 8
sth r26, -7(r19)
subi r17, r17, 4
b MRStore41
MRStore141
srwi r26, r20, 8
stb r26, -6(r19)
subi r17, r17, 2
MRStore41
srwi r26, r21, 8
insrwi r26, r20, 8, 0
stw r26, -5(r19)
subi r17, r17, 8
stb r21, -1(r19)
b MRDoneMemAccess
MRStore1421
srwi r26, r20, 24
stb r26, -8(r19)
subi r17, r17, 2
MRStore421
srwi r26, r21, 24
insrwi r26, r20, 24, 0
stw r26, -7(r19)
subi r17, r17, 8
b MRStore21
MRStore1221
srwi r26, r20, 8
stb r26, -6(r19)
subi r17, r17, 2
MRStore221
srwi r26, r21, 24
insrwi r26, r20, 8, 16
sth r26, -5(r19)
subi r17, r17, 4
b MRStore21
MRStore121
srwi r26, r21, 24
stb r26, -4(r19)
subi r17, r17, 2
MRStore21
srwi r26, r21, 8
sth r26, -3(r19)
subi r17, r17, 4
stb r21, -1(r19)
b MRDoneMemAccess
MRStore11
srwi r26, r21, 8
stb r26, -2(r19)
subi r17, r17, 2
MRStore1
stb r21, -1(r19)
b MRDoneMemAccess
MRStore242
srwi r26, r20, 16
sth r26, -8(r19)
subi r17, r17, 4
b MRStore42
MRStore142
srwi r26, r20, 16
stb r26, -7(r19)
subi r17, r17, 2
MRStore42
srwi r26, r21, 16
insrwi r26, r20, 16, 0
stw r26, -6(r19)
subi r17, r17, 8
sth r21, -2(r19)
b MRDoneMemAccess
MRStore122
stb r20, -5(r19)
subi r17, r17, 2
b MRStore22Fast
MRStore12
srwi r26, r21, 16
stb r26, -3(r19)
subi r17, r17, 2
MRStore2
sth r21, -2(r19)
b MRDoneMemAccess
MRStore44
stw r20, -8(r19)
subi r17, r17, 8
stw r21, -4(r19)
b MRDoneMemAccess
MRStore124
srwi r26, r20, 16
stb r26, -7(r19)
subi r17, r17, 2
MRStore24
sth r20, -6(r19)
subi r17, r17, 4
stw r21, -4(r19)
b MRDoneMemAccess
MRStore14
stb r20, -5(r19)
subi r17, r17, 2
stw r21, -4(r19)
b MRDoneMemAccess
MRStore8
stw r20, -8(r19)
stw r21, -4(r19)
b MRDoneMemAccess

136
NanoKernel/MROptab.s Normal file
View File

@ -0,0 +1,136 @@
MACRO
optabRow &upperSix, &lowerSix, &flags, &primLabel, &secLabel
DC.W (&lowerSix << 10) | (&upperSix << 4) | &flags ; 0-5 lowerSix, 6-11 upperSix, 12-15 flags
DC.W ((&primLabel - MRTop) << 6) | ((&secLabel - MRTop) >> 2) ; 16-23 primary routine, 24-31 secondary routine
ENDM
MROptabX
optabRow 20, 09, %0000, MRPrimPlainLoad, MRSecLWARX ; Xopcd=00000(101)00=020=LWARX
optabRow 21, 17, %0000, MRCrash, MRSecFail ; Xopcd=00010(101)00=084
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00100(101)00=148
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00110(101)00=212
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01000(101)00=276
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01010(101)00=340
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01100(101)00=404
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01110(101)00=468
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10000(101)00=532
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10010(101)00=596
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10100(101)00=660
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10110(101)00=724
optabRow 03, 17, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=11000(101)00=788
optabRow 06, 09, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=11010(101)00=852
optabRow 19, 16, %0000, MRPrimPlainStore, MRExit ; Xopcd=11100(101)00=916
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11110(101)00=980
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00001(101)00=052
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00011(101)00=116
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00101(101)00=180
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00111(101)00=244
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01001(101)00=308
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01011(101)00=372
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01101(101)00=436
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01111(101)00=500
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10001(101)00=564
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10011(101)00=628
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10101(101)00=692
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10111(101)00=756
optabRow 03, 17, %0000, MRPrimUpdLoad, MRSecLoad ; Xopcd=11001(101)00=820
optabRow 27, 17, %0011, MRCrash, MRSecFail ; Xopcd=11011(101)00=884
optabRow 19, 16, %0000, MRPrimUpdStore, MRExit ; Xopcd=11101(101)00=948
optabRow 31, 16, %0010, MRCrash, MRSecFail ; Xopcd=11111(101)00=1012
optabRow 03, 17, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=00000(101)01=021=LDX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00010(101)01=085
optabRow 19, 16, %0000, MRPrimPlainStore, MRExit ; Xopcd=00100(101)01=149=STDX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00110(101)01=213
optabRow 40, 09, %1011, MRPrimUnknown, MRSecUnknown ; Xopcd=01000(101)01=277
optabRow 06, 09, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=01010(101)01=341
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01100(101)01=405
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01110(101)01=469
optabRow 32, 09, %1011, MRPrimLSWX, MRSecLSWix ; Xopcd=10000(101)01=533=LSWX
optabRow 32, 09, %1111, MRPrimLSWI, MRSecLSWix ; Xopcd=10010(101)01=597=LSWI
optabRow 36, 08, %0010, MRPrimSTSWX, MRSecStrStore ; Xopcd=10100(101)01=661=STSWX
optabRow 36, 08, %1110, MRPrimSTSWI, MRSecStrStore ; Xopcd=10110(101)01=725=STSWI
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11000(101)01=789
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11010(101)01=853
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11100(101)01=917
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11110(101)01=981
optabRow 03, 17, %0000, MRPrimUpdLoad, MRSecLoad ; Xopcd=00001(101)01=053=LDUX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00011(101)01=117
optabRow 19, 16, %0000, MRPrimUpdStore, MRExit ; Xopcd=00101(101)01=181=STDUX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00111(101)01=245
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01001(101)01=309
optabRow 06, 09, %0000, MRPrimUpdLoad, MRExit ; Xopcd=01011(101)01=373=LWAUX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01101(101)01=437
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01111(101)01=501
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10001(101)01=565
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10011(101)01=629
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10101(101)01=693
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10111(101)01=757
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11001(101)01=821
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11011(101)01=885
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11101(101)01=949
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11111(101)01=1013
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00000(101)10=022
optabRow 62, 03, %0010, MRPrimUpdLoad, MRSecCacheWang ; Xopcd=00010(101)10=086
optabRow 22, 09, %0000, MRPrimPlainStore, MRSecSTWCX ; Xopcd=00100(101)10=150=STWCX.
optabRow 23, 16, %0000, MRCrash, MRSecFail ; Xopcd=00110(101)10=214
optabRow 62, 03, %0010, MRPrimUpdLoad, MRSecCacheWang ; Xopcd=01000(101)10=278=DCBT
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01010(101)10=342
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01100(101)10=406
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01110(101)10=470
optabRow 10, 09, %0010, MRPrimUpdLoad, MRSecLWBRX ; Xopcd=10000(101)10=534=LWBRX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10010(101)10=598
optabRow 18, 08, %0000, MRPrimSTWBRX, MRExit ; Xopcd=10100(101)10=662=STWBRX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10110(101)10=726
optabRow 09, 05, %0010, MRPrimUpdLoad, MRSecLHBRX ; Xopcd=11000(101)10=790=LHBRX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11010(101)10=854
optabRow 17, 04, %0000, MRPrimSTHBRX, MRExit ; Xopcd=11100(101)10=918=STHBRX
optabRow 62, 03, %0010, MRPrimUpdLoad, MRSecCacheWang ; Xopcd=11110(101)10=982=ICBI
optabRow 62, 03, %0010, MRPrimUpdLoad, MRSecCacheWang ; Xopcd=00001(101)10=054=DCBST
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00011(101)10=118
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=00101(101)10=182
optabRow 62, 03, %0010, MRPrimUpdLoad, MRSecCacheWang ; Xopcd=00111(101)10=246=DCBTST
optabRow 63, 01, %0000, MRPrimPlainLoad, MRIOInstFail ; Xopcd=01001(101)10=310=ECIWX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01011(101)10=374
optabRow 63, 00, %0000, MRPrimPlainStore, MRIOInstFail ; Xopcd=01101(101)10=438=ECOWX
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=01111(101)10=502
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10001(101)10=566
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10011(101)10=630
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10101(101)10=694
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=10111(101)10=758
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11001(101)10=822
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11011(101)10=886
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11101(101)10=950
optabRow 48, 16, %0010, MRPrimDCBZ, MRSecDCBZ ; Xopcd=11111(101)10=1014=DCBZ
MROptabD
optabRow 02, 09, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=00000(101)11=023=LWZX Dopcd=(1)00000=32=LWZ
optabRow 00, 03, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=00010(101)11=087=LBZX Dopcd=(1)00010=34=LBZ
optabRow 18, 08, %0000, MRPrimPlainStore, MRExit ; Xopcd=00100(101)11=151=STWX Dopcd=(1)00100=36=STW
optabRow 16, 02, %0000, MRPrimPlainStore, MRExit ; Xopcd=00110(101)11=215=STBX Dopcd=(1)00110=38=STB
optabRow 01, 05, %0000, MRPrimPlainLoad, MRSecLoad ; Xopcd=01000(101)11=279=LHZX Dopcd=(1)01000=40=LHZ
optabRow 05, 05, %0000, MRPrimPlainLoad, MRSecLoadExt ; Xopcd=01010(101)11=343=LHAX Dopcd=(1)01010=42=LHA
optabRow 17, 04, %0000, MRPrimPlainStore, MRExit ; Xopcd=01100(101)11=407=STHX Dopcd=(1)01100=44=STH
optabRow 26, 09, %0011, MRPrimUpdLoad, MRSecLMW ; Xopcd=01110(101)11=471 Dopcd=(1)01110=46=LMW
optabRow 14, 09, %0000, MRPrimPlainLoad, MRSecLFSu ; Xopcd=10000(101)11=535=LFSX Dopcd=(1)10000=48=LFS
optabRow 15, 17, %0000, MRPrimPlainLoad, MRSecLFDu ; Xopcd=10010(101)11=599=LFDX Dopcd=(1)10010=50=LFD
optabRow 18, 08, %0000, MRPrimSTFSx, MRExit ; Xopcd=10100(101)11=663=STFSX Dopcd=(1)10100=52=STFS
optabRow 19, 16, %0000, MRPrimSTFDx, MRExit ; Xopcd=10110(101)11=727=STFDX Dopcd=(1)10110=54=STFD
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11000(101)11=791 Dopcd=(1)11000=56
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11010(101)11=855 Dopcd=(1)11010=58
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11100(101)11=919 Dopcd=(1)11100=60
optabRow 18, 08, %0000, MRPrimSTFDx, MRExit ; Xopcd=11110(101)11=983=STFIWX Dopcd=(1)11110=62
optabRow 02, 09, %0000, MRPrimUpdLoad, MRSecLoad ; Xopcd=00001(101)11=055=LWZUX Dopcd=(1)00001=33=LWZU
optabRow 00, 03, %0000, MRPrimUpdLoad, MRSecLoad ; Xopcd=00011(101)11=119=LBZUX Dopcd=(1)00011=35=LBZU
optabRow 18, 08, %0000, MRPrimUpdStore, MRExit ; Xopcd=00101(101)11=183=STWUX Dopcd=(1)00101=37=STWU
optabRow 16, 02, %0000, MRPrimUpdStore, MRExit ; Xopcd=00111(101)11=247=STBUX Dopcd=(1)00111=39=STBU
optabRow 01, 05, %0000, MRPrimUpdLoad, MRSecLoad ; Xopcd=01001(101)11=311=LHZUX Dopcd=(1)01001=41=LHZU
optabRow 05, 05, %0000, MRPrimUpdLoad, MRSecLoadExt ; Xopcd=01011(101)11=375=LHAUX Dopcd=(1)01011=43=LHAU
optabRow 17, 04, %0000, MRPrimUpdStore, MRExit ; Xopcd=01101(101)11=439=STHUX Dopcd=(1)01101=45=STHU
optabRow 30, 08, %0010, MRPrimUpdStore, MRSecSTMW ; Xopcd=01111(101)11=503 Dopcd=(1)01111=47=STMW
optabRow 14, 09, %0000, MRPrimUpdLoad, MRSecLFSu ; Xopcd=10001(101)11=567=LFSUX Dopcd=(1)10001=49=LFSU
optabRow 15, 17, %0000, MRPrimUpdLoad, MRSecLFDu ; Xopcd=10011(101)11=631=LFDUX Dopcd=(1)10011=51=LFDU
optabRow 18, 08, %0000, MRPrimSTFSUx, MRExit ; Xopcd=10101(101)11=695=STFSUX Dopcd=(1)10101=53=STFSU
optabRow 19, 16, %0000, MRPrimSTFDUx, MRExit ; Xopcd=10111(101)11=759=STFDUX Dopcd=(1)10111=55=STFDU
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11001(101)11=823 Dopcd=(1)11001=57
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11011(101)11=887 Dopcd=(1)11011=59
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11101(101)11=951 Dopcd=(1)11101=61
optabRow 63, 01, %0000, MRCrash, MRSecFail ; Xopcd=11111(101)11=1015 Dopcd=(1)11111=63

493
NanoKernel/MROptabCode.s Normal file
View File

@ -0,0 +1,493 @@
MRCrash ; C00
bl SystemCrash
MRSecFail ; C04
b MRIOInstFail
########################################################################
MRPrimSTFSx ; C08
rlwinm r17, r17, 0,16,10
MRPrimSTFSUx ; C0C
crclr cr7_so
b MRDoTableSTFD
MRPrimSTFDx ; C14
rlwinm r17, r17, 0,16,10
MRPrimSTFDUx ; C18
crset cr7_so
MRDoTableSTFD ; C1C
; This table is of the form:
; stfd <reg>, KDP.FloatEmScratch(r1)
; b
clrrwi r19, r25, 10
rlwimi r19, r17, 14,24,28
addi r19, r19, STFDTable-MRTop
mtlr r19
rlwimi r14, r11, 0,18,18
mtmsr r14
blr
MRDoneTableSTFD ; c38
ori r11, r11, 0x2000
lwz r20, KDP.FloatEmScratch(r1)
lwz r21, KDP.FloatEmScratch+4(r1)
bso cr7, MRPrimUpdLoad
extrwi r23, r20, 11,1
cmpwi r23, 0x380
insrwi r20, r20, 27,2
inslwi r20, r21, 3,29
mr r21, r20
bgt MRPrimUpdLoad
cmpwi r23, 0x36A
clrrwi r21, r20, 31
blt MRPrimUpdLoad
oris r20, r20, 0x80
neg r23, r23
clrlwi r20, r20, 8
srw r20, r20, r23
rlwimi r21, r20, 31,9,31
b MRPrimUpdLoad
########################################################################
MRPrimSTWBRX ; C84
rlwinm r28, r17, 13,25,29
lwbrx r21, r1, r28
b MRPrimPlainLoad
MRPrimSTHBRX ; C90
rlwinm r28, r17, 13,25,29
addi r21, r1, 2
lhbrx r21, r21, r28
b MRPrimPlainLoad
########################################################################
MRPrimUpdStore ; CA0
rlwinm r28, r17, 13,25,29
lwzx r21, r1, r28
b MRPrimUpdLoad
MRPrimPlainStore ; CAC
rlwinm r28, r17, 13,25,29
lwzx r21, r1, r28
MRPrimPlainLoad ; CB4
rlwinm r17, r17, 0,16,10
MRPrimUpdLoad ; CB8
extrwi. r22, r17, 4,27
add r19, r18, r22
########################################################################
MRDoMemAccess ; CC0
clrrwi r25, r25, 10
insrwi r25, r19, 3,28
insrwi r25, r17, 4,24
lha r22, MRMemtab-MRTop(r25)
addi r23, r1, KDP.VecTblMemRetry
add r22, r22, r25
mtlr r22
mtsprg 3, r23
mtmsr r15
insrwi r25, r26, 8,22
bnelr
b MRDoneMemAccess
MRStore22Fast ; Fast return paths from MemAccess code
srwi r23, r21, 16
sth r23, -4(r19)
addi r17, r17, -4
sth r21, -2(r19)
b MRDoneMemAccess
MRLoad22Fast
lhz r23, -4(r19)
addi r17, r17, -4
insrwi r21, r23, 16,0
MRLoad2Fast
lhz r23, -2(r19)
insrwi r21, r23, 16,16
MRDoneMemAccess ; D18
sync
rlwinm. r28, r17, 18,25,29
mtlr r25
cror cr0_eq, cr0_eq, cr3_eq
mtmsr r14
mtsprg 3, r24
beqlr
crset cr3_so
stwx r18, r1, r28
blr
########################################################################
MRSecLoadExt ; D40
extsh r21, r21
MRSecLoad ; D44
rlwinm r28, r17, 13,25,29
crset cr3_so
stwx r21, r1, r28
########################################################################
MRExit ; D50
andi. r23, r16, 0x20
addi r10, r10, 4
mtsrr0 r10
mtsrr1 r11
bne @trace
mtlr r12
bns cr3, @otherway
mtcr r13
lmw r2, KDP.r2(r1)
lwz r0, KDP.r0(r1)
lwz r1, KDP.r1(r1)
rfi
@otherway
mtcr r13
lmw r10, KDP.r10(r1)
lwz r1, KDP.r1(r1)
rfi
@trace
mfsprg r24, 3
mtsprg 2, r12
rlwinm r16, r16, 0,27,25
lwz r12, VecTbl.Trace(r24)
stw r16, KDP.Flags(r1)
mtcr r13
mtlr r12
lmw r2, KDP.r2(r1)
lwz r0, KDP.r0(r1)
lwz r1, KDP.r1(r1)
mtsprg 1, r1
blrl
########################################################################
MRSecLHBRX ; DC0
slwi r21, r21, 16
MRSecLWBRX ; DC4
rlwinm r28, r17, 13,25,29
crset cr3_so
stwbrx r21, r1, r28
b MRExit
########################################################################
MRSecLFSu ; DD4
clrrwi r20, r21, 31
xor. r21, r20, r21
beq MRSecLFDu
rlwinm. r23, r21, 16,17,24
addi r23, r23, 0x80
rlwimi r20, r21, 29,5,31
extsh r23, r23
rlwimi r20, r21, 0,1,1
slwi r21, r21, 29
addi r23, r23, -0x4080
rlwimi r20, r23, 0,2,4
bne MRSecLFDu
srwi r21, r21, 20
insrwi r21, r20, 20,0
cntlzw r23, r21
slw r21, r21, r23
neg r23, r23
rlwimi r20, r21, 21,12,31
addi r23, r23, 0x380
slwi r21, r21, 21
insrwi r20, r23, 11,1
MRSecLFDu ; E28
; This table is of the form:
; lfd <reg>, KDP.FloatEmScratch(r1)
; b MRExit
rlwimi r23, r17, 14,24,28
addi r23, r23, LFDTable-MRTop
mtlr r23
stw r20, KDP.FloatEmScratch(r1)
stw r21, KDP.FloatEmScratch+4(r1)
rlwimi r14, r11, 0,18,18
mtmsr r14
ori r11, r11, 0x2000
blr
########################################################################
MRSecLMW ; E50
rlwinm. r28, r17, 13,25,29
rlwinm r23, r17, 18,25,29
cmpw cr7, r28, r23
addis r17, r17, 0x20
beq loc_E68
beq cr7, loc_E6C
loc_E68 ; E68
stwx r21, r1, r28
loc_E6C ; E6C
cmpwi r28, 0x7C
li r22, 9
insrwi r17, r22, 6,26
addi r19, r19, 4
bne MRDoMemAccess
b MRExit
MRSecSTMW ; E84
addis r17, r17, 0x20
rlwinm. r28, r17, 13,25,29
beq MRExit
lwzx r21, r1, r28
li r22, 8
insrwi r17, r22, 6,26
addi r19, r19, 4
b MRDoMemAccess
########################################################################
MRPrimDCBZ ; Zero four 8b chunks of the cache blk
clrrwi r19, r18, 5 ; r19 = address of chunk to zero
b MRComDCBZ ; (for use by this code only)
MRSecDCBZ ; EAC
andi. r22, r19, 0x18
clrrwi r19, r19, 3 ; MemAccess code decrements this reg
beq MRExit ; Zeroed all foun chunks -> done!
MRComDCBZ ; EB8
li r22, 0x10 ; Set 8 bytes (? set bit 27)
insrwi. r17, r22, 6,26
addi r19, r19, 8 ; Align ptr to right hand size of chunk
li r20, 0 ; Contents = zeros
li r21, 0
b MRDoMemAccess ; Go, then come back to MRSecDCBZ
########################################################################
MRSecLWARX ; ED0
rlwinm r28, r17, 13,25,29
crset cr3_so
stwx r21, r1, r28
stwcx. r21, r1, r28
b MRExit
MRSecSTWCX ; EE4
stwcx. r0, 0, r1
mfcr r23
rlwinm r23, r23, 0,3,1
rlwimi r13, r23, 0,0,3
b MRExit
########################################################################
MRSecCacheWang ; EF8
rlwinm r16, r16, 0,28,25
addi r10, r10, -4
stw r16, KDP.Flags(r1)
b MRExit
########################################################################
MRIOInstFail ; F08
li r8, ecDataInvalidAddress
b ExceptionMemRetried
########################################################################
MRPrimSTSWI ; F10
addi r22, r27, -0x800
extrwi r22, r22, 5,16
b loc_F2C
MRPrimSTSWX ; F1C
mfxer r22
andi. r22, r22, 0x7F
addi r22, r22, -1
beq MRExit
loc_F2C ; F2C
rlwimi r17, r22, 4,21,25
not r22, r22
insrwi r17, r22, 2,4
mr r19, r18
b loc_1008
MRSecStrStore ; F40
andi. r22, r17, 0x7C0
addis r28, r17, 0x20
rlwimi r17, r28, 0,6,10
addi r17, r17, -0x40
bne loc_1008
b MRExit
########################################################################
MRPrimLSWI ; F58
addi r22, r27, -0x800
extrwi r22, r22, 5,16
addis r28, r27, 0x3E0
rlwimi r17, r28, 22,16,20
b loc_F80
MRPrimLSWX ; F6C
mfxer r22
andi. r22, r22, 0x7F
rlwimi r17, r27, 0,16,20
addi r22, r22, -1
beq MRExit
loc_F80 ; F80
andis. r23, r17, 0x1F
rlwimi r17, r22, 4,21,25
not r22, r22
insrwi r17, r22, 2,4
mr r19, r18
bne loc_1070
rlwimi r17, r17, 5,11,15
b loc_1070
MRSecLSWix ; FA0
andi. r22, r17, 0x7C0
rlwinm r28, r17, 13,25,29
bne loc_1044
rlwinm r22, r17, 9,27,28
slw r21, r21, r22
b loc_1044
########################################################################
MRPrimUnknown ; FB8
mfxer r22
andi. r22, r22, 0x7F
rlwimi r17, r27, 0,16,20
insrwi r17, r27, 1,3
addi r22, r22, -1
beq MRExit
andis. r23, r17, 0x1F
rlwimi r17, r22, 4,21,25
not r22, r22
insrwi r17, r22, 2,4
mr r19, r18
bne loc_10C8
rlwimi r17, r17, 5,11,15
b loc_10C8
MRSecUnknown ; 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
lwzx r21, r1, r28
li r22, 8
insrwi r17, r22, 6,26
addi r19, r19, 4
bne MRDoMemAccess
rlwinm r22, r17, 9,27,28
srw r21, r21, r22
extrwi r22, r17, 2,4
neg r22, r22
add r19, r19, r22
addi r22, r22, 4
insrwi. r17, r22, 5,26
b MRDoMemAccess
loc_1044 ; 1044
rlwinm r23, r17, 18,25,29
cmpw cr7, r28, r23
rlwinm r23, r17, 23,25,29
cmpw cr6, r28, r23
beq cr7, loc_1060
beq cr6, loc_1060
stwx r21, r1, r28
loc_1060 ; 1060
addis r28, r17, 0x20
rlwimi r17, r28, 0,6,10
addi r17, r17, -0x40
beq MRExit
loc_1070 ; 1070
andi. r23, r17, 0x7C0
li r22, 9
insrwi r17, r22, 6,26
addi r19, r19, 4
bne MRDoMemAccess
extrwi r22, r17, 2,4
neg r22, r22
add r19, r19, r22
addi r22, r22, 4
insrwi. r17, r22, 5,26
b MRDoMemAccess
loc_109C ; 109C
rlwinm r23, r17, 18,25,29
cmpw cr7, r28, r23
rlwinm r23, r17, 23,25,29
cmpw cr6, r28, r23
beq cr7, loc_10B8
beq cr6, loc_10B8
stwx r21, r1, r28
loc_10B8 ; 10B8
addis r28, r17, 0x20
rlwimi r17, r28, 0,6,10
addi r17, r17, -0x40
beq MRExit
loc_10C8 ; 10C8
not r22, r22
rlwimi r22, r17, 6,30,31
li r28, 1
mfxer r23
extrwi r23, r23, 8,16
srwi r20, r21, 24
cmpw cr7, r20, r23
add. r22, r22, r28
beq cr7, loc_112C
beq loc_112C
extrwi r20, r21, 8,8
cmpw cr7, r20, r23
add. r22, r22, r28
beq cr7, loc_112C
beq loc_112C
extrwi r20, r21, 8,16
cmpw cr7, r20, r23
add. r22, r22, r28
beq cr7, loc_112C
beq loc_112C
clrlwi r20, r21, 24
cmpw cr7, r20, r23
add. r22, r22, r28
beq cr7, loc_112C
bne loc_1070
loc_112C ; 112C
rlwinm. r28, r17, 0,3,3
mfxer r23
add r22, r22, r23
insrwi r23, r22, 7,25
mtxer r23
beq MRExit
mfcr r23
clrlwi r23, r23, 30
insrwi r13, r23, 4,0
b MRExit

264
NanoKernel/MemRetryBackup.s Executable file
View File

@ -0,0 +1,264 @@
MACRO
MRTblEntry &word, &func1, &func2
dc.w &word
dc.b (&func1 - FDP) >> 2
dc.b (&func2 - FDP) >> 2
ENDM
MRTblEntry 0x2540, FDP_00B8, FDP_0150 ; lwarx
MRTblEntry 0x4550, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E4, FDP_0150
MRTblEntry 0x2460, FDP_00E4, FDP_0150
MRTblEntry 0x4130, FDP_00DC, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E8, FDP_0150
MRTblEntry 0x45b3, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00A4, FDP_015C
MRTblEntry 0x41f2, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E4, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00DC, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x268b, FDP_0314, FDP_02FC
MRTblEntry 0x2460, FDP_00E4, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x260b, FDP_02B0, FDP_02E4 ; lswx
MRTblEntry 0x260f, FDP_029C, FDP_02E4 ; lswi
MRTblEntry 0x2242, FDP_0260, FDP_0284 ; stswx
MRTblEntry 0x224e, FDP_0254, FDP_0284 ; stswi
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E8, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00A4, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2460, FDP_00E8, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x2160, FDP_00B0, FDP_015C ; stwcx.
MRTblEntry 0x4170, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x24a2, FDP_00E8, FDP_0164 ; lwbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2120, FDP_0088, FDP_015C ; stwbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x1492, FDP_00E8, FDP_0160 ; lhbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x1110, FDP_0094, FDP_015C ; sthbrx
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_00E4, FDP_024C ; eciwx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x03f0, FDP_00DC, FDP_024C ; ecowx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4302, FDP_01F8, FDP_020C ; dcbz
MRTblEntry 0x0f50, FDP_00E4, FDP_0370 ; lwz(x)
MRTblEntry 0x2770, FDP_00D4, FDP_0398 ; lbz(x)
MRTblEntry 0x0b90, FDP_0350, FDP_015C ; stw(x)
MRTblEntry 0x23b0, FDP_0364, FDP_015C ; stb(x)
MRTblEntry 0x1410, FDP_00E4, FDP_0150 ; lhz(x)
MRTblEntry 0x1450, FDP_00E4, FDP_014C ; lha(x)
MRTblEntry 0x1110, FDP_00DC, FDP_015C ; sth(x)
MRTblEntry 0x25a3, FDP_00E8, FDP_01A4 ; lmw
MRTblEntry 0x24e0, FDP_00E4, FDP_0174 ; lfs(x)
MRTblEntry 0x44f0, FDP_00E4, FDP_0178 ; lfd(x)
MRTblEntry 0x2120, FDP_0008, FDP_015C ; stfs(x)
MRTblEntry 0x4130, FDP_0014, FDP_015C ; stfd(x)
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2120, FDP_0014, FDP_015C ; stfiwx
MRTblEntry 0x1760, FDP_00CC, FDP_0384 ; lwzu(x)
MRTblEntry 0x8740, FDP_00C0, FDP_015C ; lbzu(x)
MRTblEntry 0x23a0, FDP_0358, FDP_015C ; stwu(x)
MRTblEntry 0x8380, FDP_00C0, FDP_015C ; stbu(x)
MRTblEntry 0x1410, FDP_00E8, FDP_0150 ; lhzu(x)
MRTblEntry 0x8740, FDP_00C0, FDP_015C ; lhau(x)
MRTblEntry 0x1110, FDP_00A4, FDP_015C ; sthu(x)
MRTblEntry 0x8380, FDP_00C0, FDP_015C ; stmw
MRTblEntry 0x24e0, FDP_00E8, FDP_0174 ; lfsu(x)
MRTblEntry 0x44f0, FDP_00E8, FDP_0178 ; lfdu(x)
MRTblEntry 0x2120, FDP_000C, FDP_015C ; stfsu(x)
MRTblEntry 0x4130, FDP_0018, FDP_015C ; stfdu(x)
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2540, FDP_00B8, FDP_0150 ; lwarx
MRTblEntry 0x4550, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E4, FDP_0150
MRTblEntry 0x2460, FDP_00E4, FDP_0150
MRTblEntry 0x4130, FDP_00DC, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E8, FDP_0150
MRTblEntry 0x45b3, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00A4, FDP_015C
MRTblEntry 0x41f2, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E4, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00DC, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x268b, FDP_0314, FDP_02FC
MRTblEntry 0x2460, FDP_00E4, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x260b, FDP_02B0, FDP_02E4 ; lswx
MRTblEntry 0x260f, FDP_029C, FDP_02E4 ; lswi
MRTblEntry 0x2242, FDP_0260, FDP_0284 ; stswx
MRTblEntry 0x224e, FDP_0254, FDP_0284 ; stswi
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4430, FDP_00E8, FDP_0150
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4130, FDP_00A4, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2460, FDP_00E8, FDP_015C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x2160, FDP_00B0, FDP_015C ; stwcx.
MRTblEntry 0x4170, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x24a2, FDP_00E8, FDP_0164 ; lwbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2120, FDP_0088, FDP_015C ; stwbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x1492, FDP_00E8, FDP_0160 ; lhbrx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x1110, FDP_0094, FDP_015C ; sthbrx
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x0fe2, FDP_00E8, FDP_023C
MRTblEntry 0x07f0, FDP_00E4, FDP_024C ; eciwx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x03f0, FDP_00DC, FDP_024C ; ecowx
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x4302, FDP_01F8, FDP_020C ; dcbz
MRTblEntry 0x2420, FDP_00E4, FDP_0150 ; lwz(x)
MRTblEntry 0x0c00, FDP_00E4, FDP_0150 ; lbz(x)
MRTblEntry 0x2120, FDP_00DC, FDP_015C ; stw(x)
MRTblEntry 0x0900, FDP_00DC, FDP_015C ; stb(x)
MRTblEntry 0x1410, FDP_00E4, FDP_0150 ; lhz(x)
MRTblEntry 0x1450, FDP_00E4, FDP_014C ; lha(x)
MRTblEntry 0x1110, FDP_00DC, FDP_015C ; sth(x)
MRTblEntry 0x25a3, FDP_00E8, FDP_01A4 ; lmw
MRTblEntry 0x24e0, FDP_00E4, FDP_0174 ; lfs(x)
MRTblEntry 0x44f0, FDP_00E4, FDP_0178 ; lfd(x)
MRTblEntry 0x2120, FDP_0008, FDP_015C ; stfs(x)
MRTblEntry 0x4130, FDP_0014, FDP_015C ; stfd(x)
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x2120, FDP_0014, FDP_015C ; stfiwx
MRTblEntry 0x2420, FDP_00E8, FDP_0150 ; lwzu(x)
MRTblEntry 0x0c00, FDP_00E8, FDP_0150 ; lbzu(x)
MRTblEntry 0x2120, FDP_00A4, FDP_015C ; stwu(x)
MRTblEntry 0x0900, FDP_00A4, FDP_015C ; stbu(x)
MRTblEntry 0x1410, FDP_00E8, FDP_0150 ; lhzu(x)
MRTblEntry 0x1450, FDP_00E8, FDP_014C ; lhau(x)
MRTblEntry 0x1110, FDP_00A4, FDP_015C ; sthu(x)
MRTblEntry 0x21e2, FDP_00A4, FDP_01D8 ; stmw
MRTblEntry 0x24e0, FDP_00E8, FDP_0174 ; lfsu(x)
MRTblEntry 0x44f0, FDP_00E8, FDP_0178 ; lfdu(x)
MRTblEntry 0x2120, FDP_000C, FDP_015C ; stfsu(x)
MRTblEntry 0x4130, FDP_0018, FDP_015C ; stfdu(x)
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004
MRTblEntry 0x07f0, FDP_xxxx, FDP_0004

View File

@ -82,27 +82,25 @@ kSIGP17 equ 17 ; r4 = target CPU idx?
; Exception cause equates
; System = FFFFFFFF, Alt = 7DF2F700 (ecInstPageFault and ecDataPageFault disabled), same +/- VM
ecNoException equ 0 ; Exception
ecSystemCall equ 1 ; ?
ecTrapInstr equ 2 ; Exception
ecFloatException equ 3 ; Exception
ecInvalidInstr equ 4 ; Exception
ecPrivilegedInstr equ 5 ; ?
ecMachineCheck equ 7 ; Exception
ecInstTrace equ 8 ; Exception
ecInstInvalidAddress equ 10 ; Exception
ecInstHardwareFault equ 11 ; Exception
ecInstPageFault equ 12 ; Exception
ecInstSupAccessViolation equ 14 ; Exception
; Usually from MemRetryDSI (also IntAlignment and IntMachineCheck)
ecDataInvalidAddress equ 18 ; ExceptionMemRetried
ecDataHardwareFault equ 19 ; ExceptionMemRetried
ecDataPageFault equ 20 ; ExceptionMemRetried
ecDataWriteViolation equ 21 ; ExceptionMemRetried
ecDataSupAccessViolation equ 22 ; ExceptionMemRetried
ecDataSupWriteViolation equ 23 ; ?
ecUnknown24 equ 24 ; ExceptionMemRetried
ecNoException equ 0
ecSystemCall equ 1
ecTrapInstr equ 2
ecFloatException equ 3
ecInvalidInstr equ 4
ecPrivilegedInstr equ 5
ecMachineCheck equ 7
ecInstTrace equ 8
ecInstInvalidAddress equ 10
ecInstHardwareFault equ 11
ecInstPageFault equ 12
ecInstSupAccessViolation equ 14
ecDataInvalidAddress equ 18
ecDataHardwareFault equ 19
ecDataPageFault equ 20
ecDataWriteViolation equ 21
ecDataSupAccessViolation equ 22
ecDataSupWriteViolation equ 23
ecUnknown24 equ 24
; Runtime Flag equates
@ -132,7 +130,7 @@ ecUnknown24 equ 24 ; ExceptionMemRetried
_bitEqu 23, FlagFE1
_bitEqu 24, Flag24
_bitEqu 25, Flag25
_bitEqu 26, Flag26
_bitEqu 26, FlagTrace
_bitEqu 27, FlagLowSaves
_bitEqu 28, Flag28
_bitEqu 29, Flag29

View File

@ -398,13 +398,13 @@ IntReturn
_bclr r7, r7, bitFlagLowSaves
bc BO_IF, bitFlag31, Trace_0x30
_bclr r7, r7, bitFlag26
_bclr r7, r7, bitFlagTrace
b @return
@Trace_0x18
bc BO_IF_NOT, bitFlag26, @return
_bclr r7, r7, bitFlag26
bc BO_IF_NOT, bitFlagTrace, @return
_bclr r7, r7, bitFlagTrace
stw r7, KDP.Flags(r1)
li r8, ecInstTrace

View File

@ -3,7 +3,7 @@
########################################################################
_alignToCacheBlock
IntFPUnavail
FPUnavailInt
; Reload the FPU
mfsprg r1, 0
@ -149,7 +149,7 @@ DisableFPU
b &DEST
ENDM
FloatLoadJumpTable
MakeFloatJumpTable lfd, FDP_0da0
FloatSaveJumpTable
MakeFloatJumpTable stfd, FDP_003c
LFDTable
MakeFloatJumpTable lfd, MRExit
STFDTable
MakeFloatJumpTable stfd, MRDoneTableSTFD

View File

@ -206,7 +206,7 @@ IntExternal2
; Increment the Sys/Alt CPU clocks, and the Dec-int counter
_align 6
IntDecrementerSystem
DecrementerIntSys
mfsprg r1, 0
stmw r2, KDP.r2(r1)
mfdec r31
@ -252,7 +252,7 @@ DecCommon ; DEC for Alternate=r30, System=r31
mfsprg r1, 1
rfi
IntDecrementerAlternate
DecrementerIntAlt
mfsprg r1, 0
stmw r2, KDP.r2(r1)
lwz r31, KDP.OtherContextDEC(r1)
@ -262,7 +262,7 @@ IntDecrementerAlternate
########################################################################
_align 6
IntDSI
DataStorageInt
mfsprg r1, 0
stmw r2, KDP.r2(r1)
mfsprg r11, 1
@ -277,7 +277,7 @@ IntDSI
mfmsr r14
_bset r15, r14, bitMsrDR
mtmsr r15
lwz r27, 0(r10)
lwz r27, 0(r10) ; r27 = INSTRUCTION
mtmsr r14
EmulateDataAccess
@ -285,38 +285,39 @@ EmulateDataAccess
lwz r25, KDP.RetryCodePtr(r1)
li r21, 0
beq @r0
lwzx r18, r1, r18
lwzx r18, r1, r18 ; r16 = contents of rA
@r0
andis. r26, r27, 0xec00
andis. r26, r27, 0xec00 ; intended to extract the major opcode? seems wrong though!
lwz r16, KDP.Flags(r1)
mfsprg r24, 3
rlwinm r17, r27, 0, 6, 15
rlwinm r17, r27, 0, 6, 15 ; r17 = rS/D and rA fields
rlwimi r16, r16, 27, 26, 26
bge @low_opcode
bge @xform
;dform
rlwimi r25, r27, 7, 26, 29 ; opcode >= 32
rlwimi r25, r27, 12, 25, 25
lwz r26, 0xb80(r25)
extsh r23, r27
lwz r26, MROptabD - MRTop(r25) ; table of 4b elements, index = major opcode bits 51234 (this is the last quarter of MROptabX)
extsh r23, r27 ; r23 = register offset field, sign-extended
rlwimi r25, r26, 26, 22, 29
mtlr r25
mtcr r26
add r18, r18, r23
rlwimi r17, r26, 6, 26, 5
mtlr r25 ; dest = r25 = first of two function ptrs in table entry
mtcr r26 ; using the flags in the arbitrary upper 16 bits of the table entry?
add r18, r18, r23 ; r18 = effective address attempted by instruction
rlwimi r17, r26, 6, 26, 5 ; r17 = pretend X-form inst with: maj opcode (from tbl), rS/D and RA (from inst), min opcode (from tbl)
blr
@low_opcode ; opcode <= 31
@xform ; opcode <= 31
rlwimi r25, r27, 27, 26, 29
rlwimi r25, r27, 0, 25, 25
rlwimi r25, r27, 6, 23, 24
lwz r26, 0x800(r25)
rlwinm r23, r27, 23, 25, 29
lwz r26, MROptabX - MRTop(r25) ; table of 4b elements, index = minor (x-form) opcode bits 8940123
rlwinm r23, r27, 23, 25, 29 ; r23 = 4 * rB
rlwimi r25, r26, 26, 22, 29
mtlr r25
mtlr r25 ; dest = r25 = first of two function ptrs in table entry
mtcr r26
lwzx r23, r1, r23
rlwimi r17, r26, 6, 26, 5
add r18, r18, r23
lwzx r23, r1, r23 ; get rB from saved registers
rlwimi r17, r26, 6, 26, 5 ; r17 = pretend X-form inst with: maj opcode (from tbl), rS/D and RA (from inst), min opcode (from tbl)
add r18, r18, r23 ; r18 = effective address attempted by instruction
bclr BO_IF_NOT, 13
neg r23, r23
add r18, r18, r23
@ -325,7 +326,7 @@ EmulateDataAccess
########################################################################
_align 6
IntAlignment
AlignmentInt
mfsprg r1, 0
stmw r2, KDP.r2(r1)
@ -350,11 +351,11 @@ IntAlignment
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 Flag26
rlwimi r16, r16, 27, 26, 26 ; copy FlagSE to FlagTrace
bne @X_form
; D- or DS-form (immediate-indexed) instruction
lwz r26, FDP_TableBase + 4*(0x40 + 0x20)(r25) ; use upper quarter of table
lwz r26, MROptabD - MRTop(r25) ; use upper quarter of table
mfmsr r14
rlwimi r25, r26, 26, 22, 29 ; third byte of lookup value is a /4 code offset in FDP
mtlr r25 ; so get ready to go there
@ -365,7 +366,7 @@ IntAlignment
@X_form
; X-form (register-indexed) instruction
lwz r26, FDP_TableBase(r25)
lwz r26, MROptabX - MRTop(r25)
mfmsr r14
rlwimi r25, r26, 26, 22, 29
mtlr r25
@ -380,15 +381,11 @@ IntAlignment
########################################################################
; FDP GOES HERE (0xC00)! (just include it as a file?)
; there are some big mistakes in the labels below!
_align 10
FDP
dcb.l (0x1874-0xC00)/4, 0x46445020 ; 'FDP '
INCLUDE 'NKMemRetry.s'
########################################################################
IntISI
InstStorageInt
bl LoadInterruptRegisters
andis. r8, r11, 0x4020 ; what the hell are these MSR bits?
@ -396,7 +393,7 @@ IntISI
stmw r14, KDP.r14(r8)
mr r27, r10
bl PopulateHTAB
bl PutPTE
bne @not_in_htab
mfsprg r24, 3
@ -429,7 +426,7 @@ major_0x039dc_0x14
########################################################################
IntMachineCheck
MachineCheckInt
bl LoadInterruptRegisters
li r8, ecMachineCheck
b Exception

View File

@ -3,7 +3,7 @@
; NKExceptions
; IntReturn
; NKPaging
; PopulateHTAB
; PutPTE
; EXPORTS:
; EditPTEInHTAB (=> NKMPCalls)
; GetPARPageInfo (=> NKMPCalls)
@ -66,7 +66,7 @@ VMDispatchTable
DeclareVMCall 2, VMReturn
; VMGetPhysicalAddress: 'return phys address given log page (can be different from above!)'
; VMGetPhysicaless: 'return phys address given log page (can be different from above!)'
; ('above' means VMGetPhysicalPage)
DeclareVMCall 11, VMReturnMinus1
@ -96,7 +96,7 @@ VMDispatchTable
; VMReturn
; VMGetPhysicalAddress_one
; VMGetPhysicaless_one
VMReturnMinus1 ; OUTSIDE REFERER
li r3, -0x01
@ -133,7 +133,7 @@ VMInit ; OUTSIDE REFERER
stw r5, KDP.PARPageListPtr(r1) ; where did NK find this???
lwz r6, KDP.CurrentMemLayout.SegMapPtr(r1)
lwz r6, KDP.CurMap.SegMapPtr(r1)
li r5, 0x00
li r4, 0x00
@ -278,7 +278,7 @@ VMInit_0x218
cmpwi r5, 0x00
addi r15, r15, 0x04
bgt VMInit_0x218
lwz r6, KDP.CurrentMemLayout.SegMapPtr(r1)
lwz r6, KDP.CurMap.SegMapPtr(r1)
li r9, 0
ori r7, r9, 0xffff
li r8, 0xa00
@ -293,7 +293,7 @@ VMInit_0x250
addi r9, r9, 1
cmpwi r9, 3
ble VMInit_0x250
lwz r6, KDP.CurrentMemLayout.SegMapPtr(r1)
lwz r6, KDP.CurMap.SegMapPtr(r1)
lwz r9, KDP.VMLogicalPages(r1)
lwz r15, KDP.PARPageListPtr(r1)
@ -838,7 +838,7 @@ VMAllocateMemory_0xc0
rlwinm. r9, r7, 0, 0, 11
blt cr7, VMReturnMinus1
bne VMReturnMinus1
lwz r14, KDP.CurrentMemLayout.SegMapPtr(r1)
lwz r14, KDP.CurMap.SegMapPtr(r1)
rlwinm r9, r7, 19, 25, 28
lwzx r14, r14, r9
clrlwi r9, r7, 0x10
@ -963,7 +963,7 @@ GetPARPageInfo_0x40 ;some kind of little-used code path for when VMMaxVirtualPag
rlwinm. r9, r4, 0, 0, 11
blt cr4, VMReturnMinus1;return failure if r4<VMMaxVirtualPages
bne VMReturnMinus1 ;return failure if bits 0-11 of r4 are non-zero
lwz r15, KDP.CurrentMemLayout.SegMapPtr(r1);this appears to be an array of 8-byte structures.
lwz r15, KDP.CurMap.SegMapPtr(r1);this appears to be an array of 8-byte structures.
rlwinm r9, r4, 19, 25, 28;copy bits 12-15 or r4 to bits 25-28 of r9
lwzx r15, r15, r9 ;do an index for some reason
clrlwi r9, r4, 0x10 ;copy bits 16-31 to r9
@ -1131,7 +1131,7 @@ VMLastExportedFunc_0xd7
mr r14, r26
mflr r6
slwi r27, r4, 12
bl PopulateHTAB
bl PutPTE
bnel SystemCrash
mr r27, r7
mr r29, r8

57
NanoKernel/NKMemRetry.s Executable file
View File

@ -0,0 +1,57 @@
; Control flow between PRIMARY and SECONDARY optab routines:
; INTERRUPT HANDLER sets:
; r14 = original interrupt MSR
; r15 = MSR | MSR[DR]
; r17 = pretend inst: 0-5 from optab || 6-10 rS/rD || 11-15 rA || 21-25 zero || 26-31 from optab
; r18 = effective address attempted
; r25 = dirty MRTop ptr
; r26 = OpTab entry
; r27 = instruction
; LR = r25 = address of primary routine (jumped to)
; PRIMARY ROUTINE
; LOOP until SECONDARY ROUTINE calls, or is, an exit routine
; MRDoMemAccess 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??)
; r19 = address first byte *after* the string to be accessed
; r25 = dirty MRTop ptr
; r26 = the original OpTab entry
; EQ = should continue (NE => skip to MRDoneMemAccess)
; MRDoMemAccess sets:
; r25 = address of secondary routine
; MSR = r15
; SPRG3 = VecTblMemRetry
; LR = r22 = address of MemAccess routine (jumped to)
; MemAccess routine accepts:
; r17 = pretend inst as noted above (will be modified)
; r19 = address first byte *after* the string to be accessed (not modified)
; r20/r21 = right-justified data (stores only)
; MemAccess routine sets:
; r17 = same but with byteCount field decremented
; r20/r21 = right-justified data (loads only)
; r26 = scratch
; MRDoneMemAccess sets:
; r17 = pretend inst as above
; MSR = r14
; SPRG3 = r24
; userspace register rA in EWA = r18 (EA), and CR3.SO = 1 (skipped for r0 or if CR3.EQ)
; LR = r25 = address of secondary routine (jumped to)
; SECONDARY ROUTINE
; EXIT ROUTINE
_align 10
MRTop
INCLUDE 'MROptabCode.s' ; c00:1154
INCLUDE 'MRMemtabCode.s' ; 1154:13f4
INCLUDE 'MRInterrupts.s' ; 13f4:14f4
INCLUDE 'MROptab.s' ; 14f4:16f4
INCLUDE 'MRMemtab.s' ; 16f4:17f4
INCLUDE 'MRUnknown.s' ; 17f4:1874

View File

@ -3,8 +3,8 @@
########################################################################
########################################################################
PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
lwz r29, KDP.CurrentMemLayout.SegMapPtr(r1)
PutPTE ; EA r27 // PTE r30/r31, EQ=Success, GT=Invalid, LT=Fault
lwz r29, KDP.CurMap.SegMapPtr(r1) ; late addition: r29 used to be an argument
rlwinm r28, r27, 7, 0x0000000F << 3 ; convert segment of passed ptr to offset into SegMap
lwzx r29, r29, r28 ; r29 = ptr to start of segment in PageMap
rlwinm r28, r27, 20, 0x0000FFFF ; r27 = page index within SegMap
@ -74,13 +74,13 @@ PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
bge cr6, @found_blank_pte
rlwinm r28, r31, 0, 26, 26 ; wImg bit in PTE???
addi r29, r29, 8 ; Leave PTE + 24 in r29
blt cr7, @no_blanks_in_pteg ; >>>>> This might cause PopulateHTAB to return an error (BNE)
blt cr7, @no_blanks_in_pteg ; >>>>> This might cause PutPTE to return an error (BNE)
@found_blank_pte ; Take PTE address (plus 24) in r29, draft PTE[lo] in r31
cmpwi r26, 0 ; NOTE: top bit of r31 will be set if sec'dary hash func was used
mfsrin r28, r27
extrwi r30, r27, 6, 4 ; PTE[API/26-31] taken from upper 6 bits of offset-within-segment
stw r27, KDP.NewestPageInHtab(r1)
stw r27, KDP.HtabLastEA(r1)
ori r31, r31, 0x100 ; set PTE[R(eference)]
rlwimi r30, r31, 27, 25, 25 ; set PTE[H(ash func ID)] to cheeky topmost bit of the phys addr in r31
rlwinm r31, r31, 0, 21, 19 ; unset upper reserved bit in PTE[lo]
@ -167,8 +167,8 @@ PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
; Helpful return code for @daddy_flag
@return_via_pf2
bgtlr
addi r29, r1, KDP.SupervisorMemLayout
b SwitchMemLayout
addi r29, r1, KDP.SupervisorMap
b SetMap
########################################################################
; So try the secondary hashing function, if we haven't already
@ -235,7 +235,7 @@ PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
rlwinm r31, r31, 6, 10, 19
xor r28, r28, r31
lwz r26, KDP.CurrentMemLayout.SegMapPtr(r1)
lwz r26, KDP.CurMap.SegMapPtr(r1)
rlwinm r30, r28, (32-25), 0x00000078
lwzx r26, r26, r30 ; r26 pts into PageMap @ current segment
@ -272,7 +272,7 @@ PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
_InvalNCBPointerCache scratch=r28
bne cr7, PopulateHTAB ; not a DaddyFlag + CountingFlag? Retriable...
bne cr7, PutPTE ; not a DaddyFlag + CountingFlag? Retriable...
rlwinm r26, r26, 22, 0xFFFFFFFC ; PIRFlag << 31 | BtmBit << 22 | physBase * 4
lwzux r28, r26, r30
@ -289,14 +289,14 @@ PopulateHTAB ; LogicalAddress r28 // Success cr0.eq
rlwimi r28, r31, 27, 28, 28
stw r28, 0(r26)
b PopulateHTAB
b PutPTE
########################################################################
########################################################################
SwitchMemLayout
lwz r28, MemLayout.SegMapPtr(r29)
stw r28, KDP.CurrentMemLayout.SegMapPtr(r1)
SetMap ; MapPtrBlk r29
lwz r28, MapPtrBlkSegMapPtr(r29)
stw r28, KDP.CurMap.SegMapPtr(r1)
addi r28, r28, 16*8 + 4
lis r31, 0
@ -308,10 +308,10 @@ SwitchMemLayout
bne @next_seg
mfpvr r31
lwz r28, MemLayout.BatMap(r29)
lwz r28, MapPtrBlkBatMap(r29)
andis. r31, r31, 0xFFFE
addi r29, r1, 0
stw r28, KDP.CurrentMemLayout.BatMap(r1)
stw r28, KDP.CurMap.BatMap(r1)
beq @601
rlwimi r29, r28, 7, 0x00000078 ; BATS, non-601
@ -440,7 +440,7 @@ SwitchMemLayout
########################################################################
########################################################################
GetPhysicalAddr
GetPhysical ; EA r27, batPtr r29 // PA r31, EQ=Fail
lwz r30, 0(r29)
li r28, -1
rlwimi r28, r30, 15, 0, 14
@ -461,7 +461,7 @@ GetPhysicalAddr
rlwimi r28, r30, 15, 0, 14
xor r31, r27, r30
andc. r31, r31, r28
bne nobats
bne GetPhysicalFromHTAB
@_54
andi. r31, r30, 1
@ -471,7 +471,7 @@ GetPhysicalAddr
or r31, r31, r28
bnelr
nobats
GetPhysicalFromHTAB ; EA r27 // PA r31, EQ=Fail
mfsrin r31, r27
rlwinm r30, r27, 10, 26, 31
rlwimi r30, r31, 7, 1, 24

View File

@ -41,58 +41,58 @@ rAlt set r8
stw r23, VecTbl.SystemReset(rSys)
stw r23, VecTbl.SystemReset(rAlt)
_kaddr r23, rNK, IntMachineCheck
_kaddr r23, rNK, MachineCheckInt
stw r23, VecTbl.MachineCheck(rSys)
stw r23, VecTbl.MachineCheck(rAlt)
_kaddr r23, rNK, IntDSI
_kaddr r23, rNK, DataStorageInt
stw r23, VecTbl.DSI(rSys)
stw r23, VecTbl.DSI(rAlt)
_kaddr r23, rNK, IntISI
_kaddr r23, rNK, InstStorageInt
stw r23, VecTbl.ISI(rSys)
stw r23, VecTbl.ISI(rAlt)
lbz r22, NKConfigurationInfo.InterruptHandlerKind(rCI)
cmpwi r22, 0
_kaddr r23, rNK, IntExternal0
_kaddr r23, rNK, ExternalInt0
beq @chosenIntHandler
cmpwi r22, 1
_kaddr r23, rNK, IntExternal1
_kaddr r23, rNK, ExternalInt1
beq @chosenIntHandler
cmpwi r22, 2
_kaddr r23, rNK, IntExternal2
_kaddr r23, rNK, ExternalInt2
beq @chosenIntHandler
@chosenIntHandler
stw r23, VecTbl.External(rSys)
_kaddr r23, rNK, IntProgram
_kaddr r23, rNK, ProgramInt
stw r23, VecTbl.External(rAlt)
_kaddr r23, rNK, IntAlignment
_kaddr r23, rNK, AlignmentInt
stw r23, VecTbl.Alignment(rSys)
stw r23, VecTbl.Alignment(rAlt)
_kaddr r23, rNK, IntProgram
_kaddr r23, rNK, ProgramInt
stw r23, VecTbl.Program(rSys)
stw r23, VecTbl.Program(rAlt)
_kaddr r23, rNK, IntFPUnavail
_kaddr r23, rNK, FPUnavailInt
stw r23, VecTbl.FPUnavail(rSys)
stw r23, VecTbl.FPUnavail(rAlt)
_kaddr r23, rNK, IntDecrementerSystem
_kaddr r23, rNK, DecrementerIntSys
stw r23, VecTbl.Decrementer(rSys)
_kaddr r23, rNK, IntDecrementerAlternate
_kaddr r23, rNK, DecrementerIntAlt
stw r23, VecTbl.Decrementer(rAlt)
_kaddr r23, rNK, IntSyscall
_kaddr r23, rNK, SyscallInt
stw r23, VecTbl.Syscall(rSys)
stw r23, VecTbl.Syscall(rAlt)
_kaddr r23, rNK, IntTrace
_kaddr r23, rNK, TraceInt
stw r23, VecTbl.Trace(rSys)
stw r23, VecTbl.Trace(rAlt)
stw r23, VecTbl.OtherTrace(rSys)
@ -111,7 +111,7 @@ rAlt set r8
########################################################################
; Fill the KCallTbl, the IntProgram interface to the NanoKernel
; Fill the KCallTbl, the ProgramInt interface to the NanoKernel
InitKCalls
_kaddr r23, rNK, KCallSystemCrash ; Uninited call -> crash
addi r8, r1, KDP.KCallTbl
@ -274,24 +274,24 @@ CopyBATRangeInit
; Save some ptrs that allow us to enable Overlay mode, etc
addi r23, r1, KDP.SegMap32SupInit
stw r23, KDP.SupervisorMemLayout.SegMapPtr(r1)
stw r23, KDP.SupervisorMap.SegMapPtr(r1)
lwz r23, NKConfigurationInfo.BatMap32SupInit(rCI)
stw r23, KDP.SupervisorMemLayout.BatMap(r1)
stw r23, KDP.SupervisorMap.BatMap(r1)
addi r23, r1, KDP.SegMap32UsrInit
stw r23, KDP.UserMemLayout.SegMapPtr(r1)
stw r23, KDP.UserMap.SegMapPtr(r1)
lwz r23, NKConfigurationInfo.BatMap32UsrInit(rCI)
stw r23, KDP.UserMemLayout.BatMap(r1)
stw r23, KDP.UserMap.BatMap(r1)
addi r23, r1, KDP.SegMap32CPUInit
stw r23, KDP.CpuMemLayout.SegMapPtr(r1)
stw r23, KDP.CpuMap.SegMapPtr(r1)
lwz r23, NKConfigurationInfo.BatMap32CPUInit(rCI)
stw r23, KDP.CpuMemLayout.BatMap(r1)
stw r23, KDP.CpuMap.BatMap(r1)
addi r23, r1, KDP.SegMap32OvlInit
stw r23, KDP.OverlayMemLayout.SegMapPtr(r1)
stw r23, KDP.OverlayMap.SegMapPtr(r1)
lwz r23, NKConfigurationInfo.BatMap32OvlInit(rCI)
stw r23, KDP.OverlayMemLayout.BatMap(r1)
stw r23, KDP.OverlayMap.BatMap(r1)
########################################################################
@ -408,8 +408,8 @@ CreatePARInPageMap
; Enable the ROM Overlay
addi r29, r1, KDP.OverlayMemLayout
bl SwitchMemLayout
addi r29, r1, KDP.OverlayMap
bl SetMap
########################################################################
@ -417,15 +417,15 @@ CreatePARInPageMap
lwz r27, KDP.ConfigInfoPtr(r1)
lwz r27, NKConfigurationInfo.LA_InterruptCtl(r27)
bl PopulateHTAB
bl PutPTE
lwz r27, KDP.ConfigInfoPtr(r1)
lwz r27, NKConfigurationInfo.LA_KernelData(r27)
bl PopulateHTAB
bl PutPTE
lwz r27, KDP.ConfigInfoPtr(r1)
lwz r27, NKConfigurationInfo.LA_EmulatorData(r27)
bl PopulateHTAB
bl PutPTE
########################################################################

View File

@ -147,7 +147,7 @@ KCallRunAlternateContext
mr r27, r8
addi r29, r1, KDP.BATs + 0xa0
bl GetPhysicalAddr
bl GetPhysical
clrlwi r23, r8, 20
beq @fail
@ -158,7 +158,7 @@ KCallRunAlternateContext
addi r27, r27, 0x1000
addi r29, r1, KDP.BATs + 0xa0
bl GetPhysicalAddr
bl GetPhysical
beq @fail
subi r31, r31, 0x1000
@ -267,7 +267,7 @@ Reset
_alignToCacheBlock
KCallPrioritizeInterrupts
; Left side: roll back the interrupt preparation before the int handler repeats is
; Right side: jump to the external interrupt handler (PIH or IntProgram)
; Right side: jump to the external interrupt handler (PIH or ProgramInt)
mtsprg 2, r12
mtsrr0 r10
mtsrr1 r11
@ -321,7 +321,7 @@ KCallSystemCrash
########################################################################
_alignToCacheBlock
IntProgram
ProgramInt
; (also called when the Alternate Context gets an External Int => Exception)
; Standard interrupt palaver
@ -420,7 +420,7 @@ IntProgram
########################################################################
_alignToCacheBlock
IntSyscall
SyscallInt
bl LoadInterruptRegisters
mfmsr r8
subi r10, r10, 4
@ -431,7 +431,7 @@ IntSyscall
########################################################################
_alignToCacheBlock
IntTrace
TraceInt
bl LoadInterruptRegisters
li r8, ecInstTrace
b Exception

View File

@ -102,7 +102,7 @@ L ds.l 1
########################################################################
MemLayout RECORD 0, INCR
MapPtrBlk RECORD 0, INCR
SegMapPtr ds.l 1
BatMap ds.l 1 ; packed array of 4-bit indices into BATs
ENDR
@ -182,11 +182,11 @@ PARPerSegmentPLEPtrs ds.l 4 ; 5b0:5c0 ; for each PAR segment, a ptr into the PAR
FloatingPtTemp1 ds.l 1 ; 5c0
FloatingPtTemp2 ds.l 1 ; 5c4
SupervisorMemLayout ds MemLayout ; 5c8:5d0
UserMemLayout ds MemLayout ; 5d0:5d8
CpuMemLayout ds MemLayout ; 5d8:5e0
OverlayMemLayout ds MemLayout ; 5e0:5e8
CurrentMemLayout ds MemLayout ; 5e8:5f0
SupervisorMap ds MapPtrBlk ; 5c8:5d0
UserMap ds MapPtrBlk ; 5d0:5d8
CpuMap ds MapPtrBlk ; 5d8:5e0
OverlayMap ds MapPtrBlk ; 5e0:5e8
CurMap ds MapPtrBlk ; 5e8:5f0
KCallTbl ds KCallTbl ; 5f0:630
@ -215,7 +215,7 @@ PageMapStartPtr ds.l 1 ; 684
PageAttributeInit ds.l 1 ; 688 ; defaults for PLE/PTE?
HtabTempPage ds.l 1 ; 68c ; a page that lives temporarily in the HTAB (per its PME)
HtabTempEntryPtr ds.l 1 ; 690 ; ptr to that PME
NewestPageInHtab ds.l 1 ; 694
HtabLastEA ds.l 1 ; 694
ApproxCurrentPTEG ds.l 1 ; 698
OverflowingPTEG ds.l 1 ; 69c
PTEGMask ds.l 1 ; 6a0

View File

@ -20,8 +20,8 @@
; Exception
; ExceptionMemRetried
; NKFloatInts
; FloatLoadJumpTable
; FloatSaveJumpTable
; LFDTable
; STFDTable
; NKIntHandlers
; LoadInterruptRegisters
; EmulateDataAccess
@ -76,7 +76,7 @@ FDP_0018 ; stfdu(x)
FDP_001c ; called from above
clrrwi r19, r25, 10
rlwimi r19, r17, 14, 24, 28
addi r19, r19, FloatSaveJumpTable - FDP
addi r19, r19, STFDTable - FDP
mtlr r19
rlwimi r14, r11, 0, 18, 18
mtmsr r14
@ -231,7 +231,7 @@ FDP_0174
FDP_0178
clrrwi r23, r25, 10
rlwimi r23, r17, 14, 24, 28
addi r23, r23, FloatLoadJumpTable - FDP
addi r23, r23, LFDTable - FDP
mtlr r23
stw r20, -0x02E0(r1)
stw r21, -0x02DC(r1)
@ -1631,7 +1631,7 @@ FDP_06e4
; This is the traceTable, intimately associated with loc_D18/FDP_011C
macro
HalfWordTableEntry &n, &target

View File

@ -14,11 +14,3 @@ NKTop
include 'NKSoftInt.s'
include 'NKLegacyVM.s'
NKBtm
FDP_TableBase
FDP_003C
loc_A38
FDP_011C
loc_D50
FDP_0DA0
MemRetryDSI
MemRetryMachineCheck