Finish SoftInt

This commit is contained in:
Elliot Nunn 2018-07-06 22:58:40 +08:00
parent 5e9622f4b8
commit fa5cf87729
2 changed files with 91 additions and 1 deletions

View File

@ -4,7 +4,93 @@
IllegalInstruction
org 0x29c0
mfmsr r9
_bset r8, r9, MSR_DRbit
mtmsr r8
lwz r8, 0(r10)
mtmsr r9
stw r0, EWA.r0(r1)
stw r2, EWA.r2(r1)
stw r3, EWA.r3(r1)
stw r4, EWA.r4(r1)
stw r5, EWA.r5(r1)
lwz r9, ContextBlock.r7(r6)
stw r9, EWA.r7(r1)
lwz r9, ContextBlock.r8(r6)
stw r9, EWA.r8(r1)
lwz r9, ContextBlock.r9(r6)
stw r9, EWA.r9(r1)
lwz r9, ContextBlock.r10(r6)
stw r9, EWA.r10(r1)
lwz r9, ContextBlock.r11(r6)
stw r9, EWA.r11(r1)
lwz r9, ContextBlock.r12(r6)
stw r9, EWA.r12(r1)
lwz r9, ContextBlock.r13(r6)
stw r9, EWA.r13(r1)
stmw r14, EWA.r14(r1)
rlwinm r9, r8, 6, 15, 31
cmplwi r9, 0xB99F
beq @MFTB
rlwinm r9, r8, 17, 15, 20
insrwi r9, r8, 11, 21
cmplwi r9, 0xFFAE
beq @STFIWX
@FAIL
li r8, ecInvalidInstr
b Exception
@MFTB
extrwi r9, r8, 10, 11 ; r9 = tbr field
cmplwi cr7, r9, 0x188 ; TBL=268, mangled
cmplwi cr6, r9, 0x1A8 ; TBU=269, mangled
cror 15, cr6_eq, cr7_eq
bc BO_IF_NOT, 15, @FAIL
@retry_rtc
DIALECT POWER
mfrtcu r20
mfrtcl r21
mfrtcu r23
DIALECT POWERPC
xor. r23, r23, r20
lis r23, 1000000000 >> 16
rlwinm r28, r8, 13, 25, 29 ; r28 = dest register number * 4
ori r23, r23, 1000000000 & 0xFFFF
bne @retry_rtc
mullw r8, r20, r23
mulhwu r20, r20, r23
mfxer r23
addc r21, r21, r8
addze r20, r20
mtxer r23
lwz r23, KDP.NanoKernelInfo + NKNanoKernelInfo.EmulatedUnimpInstCount(r1)
rlwimi r7, r7, 27, 26, 26
addi r23, r23, 1
stw r23, KDP.NanoKernelInfo + NKNanoKernelInfo.EmulatedUnimpInstCount(r1)
stwx r21, r1, r28 ; save register into EWA
mr r16, r7
beq cr7, loc_D50 ; TBL
stwx r20, r1, r28
b loc_D50 ; TBU
@STFIWX
lwz r23, KDP.NanoKernelInfo + NKNanoKernelInfo.EmulatedUnimpInstCount(r1)
mr r27, r8
addi r23, r23, 1
stw r23, KDP.NanoKernelInfo + NKNanoKernelInfo.EmulatedUnimpInstCount(r1)
mfmsr r14
_bset r15, r14, MSR_DRbit
b loc_A38
########################################################################

View File

@ -46,6 +46,10 @@ IntDSI
IntAlignment
org 0xC00
FDP
org 0xA38
loc_A38
org 0xD50
loc_D50
org 0x13F4
MemRetryDSI
org 0x1498