Properly protect the HLE instructions against corrupted memory. (#189)
authorgameblabla <gameblabla@users.noreply.github.com>
Sun, 22 Aug 2021 21:39:05 +0000 (21:39 +0000)
committerGitHub <noreply@github.com>
Sun, 22 Aug 2021 21:39:05 +0000 (00:39 +0300)
Fix is from PCSX-redux :
https://github.com/grumpycoders/pcsx-redux/commit/99c9508f2a9dc1444b88f37eb100cdfb17862b52

This should hopefully fix HDHOSHY's experimental patch properly.

Co-authored-by: Nicolas Noble <nicolasnoble@users.noreply.github.com>
libpcsxcore/new_dynarec/emu_if.h
libpcsxcore/new_dynarec/new_dynarec.c
libpcsxcore/psxhle.c
libpcsxcore/psxhle.h
libpcsxcore/psxinterpreter.c

index 3980490..17abab0 100644 (file)
@@ -97,8 +97,6 @@ void pcsx_mtc0(u32 reg, u32 val);
 void pcsx_mtc0_ds(u32 reg, u32 val);
 
 /* misc */
-extern void (*psxHLEt[])();
-
 extern void SysPrintf(const char *fmt, ...);
 
 #ifdef RAM_FIXED
index cd63d2b..c3c470d 100644 (file)
@@ -35,6 +35,7 @@ static int sceBlock;
 #endif
 
 #include "new_dynarec_config.h"
+#include "../psxhle.h" //emulator interface
 #include "emu_if.h" //emulator interface
 
 //#define DISASM
@@ -3445,7 +3446,11 @@ void hlecall_assemble(int i,struct regstat *i_regs)
   assert(!is_delayslot);
   (void)ccreg;
   emit_movimm(start+i*4+4,0); // Get PC
-  emit_movimm((int)psxHLEt[source[i]&7],1);
+  uint32_t hleCode = source[i] & 0x03ffffff;
+  if (hleCode >= (sizeof(psxHLEt) / sizeof(psxHLEt[0])))
+    emit_movimm((int)psxNULL,1);
+  else
+    emit_movimm((int)psxHLEt[hleCode],1);
   emit_addimm(HOST_CCREG,CLOCK_ADJUST(ccadj[i]),HOST_CCREG); // XXX
   emit_jmp((int)jump_hlecall);
 }
index 83362ec..52227a4 100644 (file)
@@ -89,7 +89,7 @@ static void hleExecRet() {
        psxRegs.pc = psxRegs.GPR.n.ra;
 }
 
-void (*psxHLEt[256])() = {
+const void (*psxHLEt[8])() = {
        hleDummy, hleA0, hleB0, hleC0,
        hleBootstrap, hleExecRet,
        hleDummy, hleDummy
index eef78e8..0529c38 100644 (file)
@@ -28,7 +28,7 @@ extern "C" {
 #include "r3000a.h"
 #include "plugins.h"
 
-extern void (*psxHLEt[256])();
+extern const void (*psxHLEt[8])();
 
 #ifdef __cplusplus
 }
index cf3de79..fa454e1 100644 (file)
@@ -842,7 +842,13 @@ void psxBASIC(struct psxCP2Regs *regs) {
 
 void psxHLE() {
 //     psxHLEt[psxRegs.code & 0xffff]();
-       psxHLEt[psxRegs.code & 0x07]();         // HDHOSHY experimental patch
+//     psxHLEt[psxRegs.code & 0x07]();         // HDHOSHY experimental patch
+    uint32_t hleCode = psxRegs.code & 0x03ffffff;
+    if (hleCode >= (sizeof(psxHLEt) / sizeof(psxHLEt[0]))) {
+        psxNULL();
+    } else {
+        psxHLEt[hleCode]();
+    }
 }
 
 void (*psxBSC[64])() = {