diff options
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/modrm.h | 6 | ||||
| -rw-r--r-- | src/emu/x64run.c | 11 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 13 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 1 |
4 files changed, 23 insertions, 8 deletions
diff --git a/src/emu/modrm.h b/src/emu/modrm.h index 2f2cd1fc..6b02e74a 100644 --- a/src/emu/modrm.h +++ b/src/emu/modrm.h @@ -11,9 +11,9 @@ #define F64S *(int64_t*)(addr+=8, addr-8) #define PK(a) *(uint8_t*)(addr+a) #ifdef DYNAREC -#define STEP if(step) return 0; -#define STEP2 if(step) {R_RIP = addr; return 0;} -#define STEP3 if(*step) (*step)++; +#define STEP check_exec(emu, addr); if(step) return 0; +#define STEP2 check_exec(emu, addr); if(step) {R_RIP = addr; return 0;} +#define STEP3 check_exec(emu, addr); if(*step) (*step)++; #else #define STEP #define STEP2 diff --git a/src/emu/x64run.c b/src/emu/x64run.c index 27232c9e..5859ec34 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -71,6 +71,7 @@ int Run(x64emu_t *emu, int step) #ifdef TEST_INTERPRETER test->memsize = 0; #else + check_exec(emu, R_RIP); x64emurun: while(1) #endif @@ -1813,7 +1814,7 @@ x64emurun: F8; if(rex.is32bits && box64_ignoreint3) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -1853,7 +1854,7 @@ x64emurun: #ifndef TEST_INTERPRETER if(rex.is32bits && box64_ignoreint3) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -1882,7 +1883,7 @@ x64emurun: case 0xF4: /* HLT */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -2016,14 +2017,14 @@ x64emurun: // this is a privilege opcode if(rex.is32bits && box64_ignoreint3) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; break; case 0xFB: /* STI */ // this is a privilege opcode if(rex.is32bits && box64_ignoreint3) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; break; case 0xFC: /* CLD */ diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index d1ae6ff8..0364f4e9 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -387,6 +387,19 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) R_RAX = tmp64u&0xFFFFFFFF; break; + case 0x34: /* SYSENTER */ + #ifndef TEST_INTERPRETER + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + STEP; + #endif + break; + case 0x35: /* SYSEXIT */ + #ifndef TEST_INTERPRETER + emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + STEP; + #endif + break; + case 0x38: // these are some SSE3 opcodes opcode = F8; switch(opcode) { diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index 5b28888f..097d0e32 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -20,6 +20,7 @@ #include "x87emu_private.h" #include "box64context.h" #include "bridge.h" +#include "signals.h" #include "modrm.h" |