aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/new_dynarec/new_dynarec.c
diff options
context:
space:
mode:
authornotaz2013-06-05 01:39:46 +0300
committernotaz2013-06-05 01:39:46 +0300
commitd848b60a3da875fca0b1f2ddf8a4ae9d487d685b (patch)
tree919084d5dd0190d423f02721598d5f0961811e33 /libpcsxcore/new_dynarec/new_dynarec.c
parent88901dd2de7982c765053ec47ef987efbc8ab89e (diff)
downloadpcsx_rearmed-d848b60a3da875fca0b1f2ddf8a4ae9d487d685b.tar.gz
pcsx_rearmed-d848b60a3da875fca0b1f2ddf8a4ae9d487d685b.tar.bz2
pcsx_rearmed-d848b60a3da875fca0b1f2ddf8a4ae9d487d685b.zip
drc: add a test to catch broken platforms early
Diffstat (limited to 'libpcsxcore/new_dynarec/new_dynarec.c')
-rw-r--r--libpcsxcore/new_dynarec/new_dynarec.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c
index 8437008..d8d8991 100644
--- a/libpcsxcore/new_dynarec/new_dynarec.c
+++ b/libpcsxcore/new_dynarec/new_dynarec.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <stdint.h> //include for uint64_t
#include <assert.h>
+#include <errno.h>
#include <sys/mman.h>
#include "emu_if.h" //emulator interface
@@ -8005,6 +8006,28 @@ void disassemble_inst(int i)
static void disassemble_inst(int i) {}
#endif // DISASM
+#define DRC_TEST_VAL 0x74657374
+
+static int new_dynarec_test(void)
+{
+ int (*testfunc)(void) = (void *)out;
+ int ret;
+ emit_movimm(DRC_TEST_VAL,0); // test
+ emit_jmpreg(14);
+ literal_pool(0);
+#ifdef __arm__
+ __clear_cache((void *)testfunc, out);
+#endif
+ SysPrintf("testing if we can run recompiled code..\n");
+ ret = testfunc();
+ if (ret == DRC_TEST_VAL)
+ SysPrintf("test passed.\n");
+ else
+ SysPrintf("test failed: %08x\n", ret);
+ out=(u_char *)BASE_ADDR;
+ return ret == DRC_TEST_VAL;
+}
+
// clear the state completely, instead of just marking
// things invalid like invalidate_all_pages() does
void new_dynarec_clear_full()
@@ -8039,17 +8062,19 @@ void new_dynarec_clear_full()
void new_dynarec_init()
{
- printf("Init new dynarec\n");
+ SysPrintf("Init new dynarec\n");
out=(u_char *)BASE_ADDR;
#if BASE_ADDR_FIXED
if (mmap (out, 1<<TARGET_SIZE_2,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0) <= 0) {SysPrintf("mmap() failed\n");}
+ -1, 0) <= 0) {
+ SysPrintf("mmap() failed: %s\n", strerror(errno));
+ }
#else
// not all systems allow execute in data segment by default
if (mprotect(out, 1<<TARGET_SIZE_2, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
- SysPrintf("mprotect() failed\n");
+ SysPrintf("mprotect() failed: %s\n", strerror(errno));
#endif
#ifdef MUPEN64
rdword=&readmem_dword;
@@ -8104,6 +8129,7 @@ void new_dynarec_init()
#endif
tlb_hacks();
arch_init();
+ new_dynarec_test();
#ifndef RAM_FIXED
ram_offset=(u_int)rdram-0x80000000;
#endif