diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 18 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.h | 1 | ||||
| -rw-r--r-- | src/emu/x64int3.c | 2 | ||||
| -rw-r--r-- | src/emu/x64run.c | 56 | ||||
| -rw-r--r-- | src/emu/x64run0f.c | 27 | ||||
| -rw-r--r-- | src/emu/x64run64.c | 4 | ||||
| -rw-r--r-- | src/emu/x64run660f.c | 7 | ||||
| -rw-r--r-- | src/emu/x64run670f.c | 3 | ||||
| -rw-r--r-- | src/emu/x64runavx0f.c | 5 | ||||
| -rw-r--r-- | src/emu/x64runavx0f38.c | 13 | ||||
| -rw-r--r-- | src/emu/x64runavx660f.c | 3 | ||||
| -rw-r--r-- | src/emu/x64runavx660f38.c | 9 | ||||
| -rw-r--r-- | src/emu/x64runavx660f3a.c | 7 | ||||
| -rw-r--r-- | src/emu/x64runf20f.c | 5 | ||||
| -rw-r--r-- | src/emu/x64syscall.c | 2 | ||||
| -rwxr-xr-x | src/emu/x86int3.c | 2 | ||||
| -rw-r--r-- | src/include/os.h | 3 | ||||
| -rw-r--r-- | src/include/signals.h | 3 | ||||
| -rw-r--r-- | src/os/os_linux.c | 17 |
19 files changed, 107 insertions, 80 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c index 51340ded..5656dcac 100644 --- a/src/dynarec/dynarec_native_functions.c +++ b/src/dynarec/dynarec_native_functions.c @@ -8,6 +8,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64context.h" #include "box64cpu.h" @@ -185,42 +186,37 @@ void native_ud(x64emu_t* emu) { if(BOX64ENV(dynarec_test)) emu->test.test = 0; - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } void native_br(x64emu_t* emu) { if(BOX64ENV(dynarec_test)) emu->test.test = 0; - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xb09d); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xb09d); } void native_priv(x64emu_t* emu) { emu->test.test = 0; - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); } void native_int(x64emu_t* emu, int num) { emu->test.test = 0; - emit_interruption(emu, num, (void*)R_RIP); -} - -void native_singlestep(x64emu_t* emu) -{ - emit_signal(emu, SIGTRAP, (void*)R_RIP, 1); + EmitInterruption(emu, num, (void*)R_RIP); } void native_int3(x64emu_t* emu) { - emit_signal(emu, SIGTRAP, NULL, 3); + EmitSignal(emu, SIGTRAP, NULL, 3); } void native_div0(x64emu_t* emu) { emu->test.test = 0; - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); } void native_fsave(x64emu_t* emu, uint8_t* ed) diff --git a/src/dynarec/dynarec_native_functions.h b/src/dynarec/dynarec_native_functions.h index 3620fca7..0df058f2 100644 --- a/src/dynarec/dynarec_native_functions.h +++ b/src/dynarec/dynarec_native_functions.h @@ -55,7 +55,6 @@ void native_clflush(x64emu_t* emu, void* p); void native_ud(x64emu_t* emu); void native_br(x64emu_t* emu); void native_priv(x64emu_t* emu); -void native_singlestep(x64emu_t* emu); void native_int3(x64emu_t* emu); void native_int(x64emu_t* emu, int num); void native_div0(x64emu_t* emu); diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c index 9ae93f99..5520ce83 100644 --- a/src/emu/x64int3.c +++ b/src/emu/x64int3.c @@ -393,7 +393,7 @@ void x64Int3(x64emu_t* emu, uintptr_t* addr) } if(!BOX64ENV(ignoreint3) && my_context->signals[SIGTRAP]) { R_RIP = *addr; // update RIP - emit_signal(emu, SIGTRAP, NULL, 3); + EmitSignal(emu, SIGTRAP, NULL, 3); } else { printf_log(LOG_DEBUG, "%04d|Warning, ignoring unsupported Int 3 call @%p\n", GetTID(), (void*)R_RIP); R_RIP = *addr; diff --git a/src/emu/x64run.c b/src/emu/x64run.c index f55084c5..7ba98455 100644 --- a/src/emu/x64run.c +++ b/src/emu/x64run.c @@ -338,7 +338,7 @@ x64emurun: if(rex.is32bits) { R_AX = aas16(emu, R_AX); } else { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); goto fini; } break; @@ -438,7 +438,7 @@ x64emurun: GETGD; int* bounds = (int*)GETEA(0); if(bounds[0]<GD->dword[0] || bounds[1]>GD->dword[0]) - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xb09d); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xb09d); } else { unimp = 1; goto fini; @@ -597,7 +597,7 @@ x64emurun: if(rex.is32bits && BOX64ENV(ignoreint3)) { } else { - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); } STEP; #endif @@ -1540,14 +1540,14 @@ x64emurun: if(box64_wine && tmp8u==0x2D) { // lets ignore the INT 2D printf_log(LOG_DEBUG, "INT 2D called\n"); - emit_interruption(emu, 0x2d, (void*)R_RIP); + EmitInterruption(emu, 0x2d, (void*)R_RIP); } else if(box64_wine && tmp8u==0x2c) { printf_log(LOG_DEBUG, "INT 2c called\n"); - emit_interruption(emu, 0x2c, (void*)R_RIP); + EmitInterruption(emu, 0x2c, (void*)R_RIP); } else if(box64_wine && tmp8u==0x29) { // INT 29 is __fastfail printf_log(LOG_DEBUG, "INT 29 called => __fastfail(0x%x)\n", R_ECX); - emit_interruption(emu, 0x29, (void*)R_RIP); + EmitInterruption(emu, 0x29, (void*)R_RIP); } else if (tmp8u==0x80) { R_RIP = addr; if(ACCESS_FLAG(F_TF)) @@ -1560,7 +1560,7 @@ x64emurun: } else if (tmp8u==0x03) { R_RIP = addr; #ifndef TEST_INTERPRETER - emit_signal(emu, SIGTRAP, NULL, 3); + EmitSignal(emu, SIGTRAP, NULL, 3); STEP2; #endif } else { @@ -1568,7 +1568,7 @@ x64emurun: R_RIP = addr; } #ifndef TEST_INTERPRETER - emit_interruption(emu, tmp8u, (void*)R_RIP); + EmitInterruption(emu, tmp8u, (void*)R_RIP); STEP2; #endif } @@ -1583,7 +1583,7 @@ x64emurun: #ifndef TEST_INTERPRETER CHECK_FLAGS(emu); if(ACCESS_FLAG(F_OF)) - emit_interruption(emu, 4, (void*)R_RIP); + EmitInterruption(emu, 4, (void*)R_RIP); STEP2; #endif break; @@ -1606,7 +1606,7 @@ x64emurun: RESET_FLAGS(emu); #ifndef TEST_INTERPRETER if((new_cs&3)!=3) - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); // GP if trying to change priv level + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); // GP if trying to change priv level #endif emu->segs[_CS] = new_cs; emu->segs_serial[_CS] = 0; @@ -1878,7 +1878,7 @@ x64emurun: F8; if(rex.is32bits && BOX64ENV(ignoreint3)) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -1918,7 +1918,7 @@ x64emurun: #ifndef TEST_INTERPRETER if(rex.is32bits && BOX64ENV(ignoreint3)) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -1940,14 +1940,14 @@ x64emurun: case 0xF1: /* INT1 */ emu->old_ip = R_RIP; #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 128); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 128); #endif break; case 0xF4: /* HLT */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -1980,14 +1980,14 @@ x64emurun: case 6: /* DIV Eb */ #ifndef TEST_INTERPRETER if(!EB->byte[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif div8(emu, EB->byte[0]); break; case 7: /* IDIV Eb */ #ifndef TEST_INTERPRETER if(!EB->byte[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif idiv8(emu, EB->byte[0]); break; @@ -2019,14 +2019,14 @@ x64emurun: case 6: /* DIV Ed */ #ifndef TEST_INTERPRETER if(!ED->q[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif div64(emu, ED->q[0]); break; case 7: /* IDIV Ed */ #ifndef TEST_INTERPRETER if(!ED->q[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif idiv64(emu, ED->q[0]); break; @@ -2063,7 +2063,7 @@ x64emurun: case 6: /* DIV Ed */ #ifndef TEST_INTERPRETER if(!ED->dword[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif div32(emu, ED->dword[0]); //emu->regs[_AX].dword[1] = 0; // already put high regs to 0 @@ -2072,7 +2072,7 @@ x64emurun: case 7: /* IDIV Ed */ #ifndef TEST_INTERPRETER if(!ED->dword[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); #endif idiv32(emu, ED->dword[0]); //emu->regs[_AX].dword[1] = 0; @@ -2093,14 +2093,14 @@ x64emurun: // this is a privilege opcode if(rex.is32bits && BOX64ENV(ignoreint3)) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; break; case 0xFB: /* STI */ // this is a privilege opcode if(rex.is32bits && BOX64ENV(ignoreint3)) {} else - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; break; case 0xFC: /* CLD */ @@ -2165,7 +2165,7 @@ x64emurun: GETET(0); if(MODREG) { printf_log(LOG_NONE, "Illegal Opcode %p: (%02X %02X %02X %02X) %02X %02X %02X %02X\n", (void*)R_RIP, PK(-6), PK(-5), PK(-4), PK(-3), opcode, nextop, PK(0), PK(1)); - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); goto fini; } else { if(rex.is32bits || !rex.w) { @@ -2212,7 +2212,7 @@ x64emurun: GETET(0); if(MODREG) { printf_log(LOG_NONE, "Illegal Opcode %p: (%02X %02X %02X %02X) %02X %02X %02X %02X\n", (void*)R_RIP, PK(-6), PK(-5), PK(-4), PK(-3), opcode, nextop, PK(0), PK(1)); - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); goto fini; } else { if(rex.is32bits || !rex.w) { @@ -2255,7 +2255,7 @@ x64emurun: break; default: printf_log(LOG_NONE, "Illegal Opcode %p: (%02X %02X %02X %02X) %02X %02X %02X %02X %02X %02X\n", (void*)R_RIP, PK(-6), PK(-5), PK(-4), PK(-3), opcode, nextop, PK(0), PK(1), PK(2), PK(3)); - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); goto fini; } break; @@ -2271,7 +2271,7 @@ x64emurun: } else { tf_next = 0; R_RIP = addr; - emit_signal(emu, SIGTRAP, (void*)addr, 1); + EmitSignal(emu, SIGTRAP, (void*)addr, 1); if(emu->quit) goto fini; } } @@ -2285,7 +2285,7 @@ fini: // check the TRACE flag before going to out, in case it's a step by step scenario if(!emu->quit && !emu->fork && ACCESS_FLAG(F_TF)) { R_RIP = addr; - emit_signal(emu, SIGTRAP, (void*)addr, 1); + EmitSignal(emu, SIGTRAP, (void*)addr, 1); if(emu->quit) goto fini; } #endif @@ -2295,7 +2295,7 @@ if(emu->segs[_CS]!=0x33 && emu->segs[_CS]!=0x23) printf_log(LOG_NONE, "Warning, if(unimp) { //emu->quit = 1; UnimpOpcode(emu, is32bits); - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } // fork handling if(emu->fork) { diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c index 2a5df329..45fb53ef 100644 --- a/src/emu/x64run0f.c +++ b/src/emu/x64run0f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "box64cpu_util.h" @@ -94,19 +95,19 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0xC8: /* MONITOR */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; case 0xC9: /* MWAIT */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; case 0xD0: if(R_RCX) { #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif } else { R_RAX = 0b111; // x87 & SSE & AVX for now @@ -169,7 +170,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x06: /* CLTS */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; @@ -177,13 +178,13 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x09: /* WBINVD */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; case 0x0B: /* UD2 */ #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif break; @@ -206,7 +207,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) break; case 0x0E: /* FEMMS */ #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif break; @@ -294,7 +295,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x23: /* MOV drX, REG */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; @@ -395,7 +396,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x30: /* WRMSR */ // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; case 0x31: /* RDTSC */ @@ -408,20 +409,20 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x32: /* RDMSR */ // priviledge instruction #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; case 0x34: /* SYSENTER */ #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; case 0x35: /* SYSEXIT */ #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0xbad0); STEP; #endif break; @@ -695,7 +696,7 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) case 0x3F: #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif break; GOCOND(0x40 diff --git a/src/emu/x64run64.c b/src/emu/x64run64.c index bfecc778..3fa47326 100644 --- a/src/emu/x64run64.c +++ b/src/emu/x64run64.c @@ -825,12 +825,12 @@ uintptr_t Run64(x64emu_t *emu, rex_t rex, int seg, uintptr_t addr) break; case 6: /* DIV Eb */ if(!EB->byte[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); div8(emu, EB->byte[0]); break; case 7: /* IDIV Eb */ if(!EB->byte[0]) - emit_div0(emu, (void*)R_RIP, 1); + EmitDiv0(emu, (void*)R_RIP, 1); idiv8(emu, EB->byte[0]); break; } diff --git a/src/emu/x64run660f.c b/src/emu/x64run660f.c index a6271775..eef57099 100644 --- a/src/emu/x64run660f.c +++ b/src/emu/x64run660f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -708,7 +709,7 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) GETED(0); // this is a privilege opcode... #ifndef TEST_INTERPRETER - emit_signal(emu, SIGSEGV, (void*)R_RIP, 0); + EmitSignal(emu, SIGSEGV, (void*)R_RIP, 0); #endif break; @@ -1720,7 +1721,7 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) nextop = F8; if(!BOX64ENV(cputype) || (nextop&0xC0)>>3) { #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif } else { GETEX(2); @@ -1735,7 +1736,7 @@ uintptr_t Run660F(x64emu_t *emu, rex_t rex, uintptr_t addr) nextop = F8; if(!BOX64ENV(cputype) || !(MODREG)) { #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif } else { GETGX; diff --git a/src/emu/x64run670f.c b/src/emu/x64run670f.c index 8d074a1d..72a5865e 100644 --- a/src/emu/x64run670f.c +++ b/src/emu/x64run670f.c @@ -8,6 +8,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -188,7 +189,7 @@ uintptr_t Run670F(x64emu_t *emu, rex_t rex, int rep, uintptr_t addr) nextop = F8; FAKEED32(0); #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif break; default: diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c index 4ca1cb5e..2e514e32 100644 --- a/src/emu/x64runavx0f.c +++ b/src/emu/x64runavx0f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -593,13 +594,13 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0x77: if(!vex.l) { // VZEROUPPER if(vex.v!=0) { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } else { memset(emu->ymm, 0, sizeof(sse_regs_t)*((vex.rex.is32bits)?8:16)); } } else { // VZEROALL if(vex.v!=0) { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } else { memset(emu->xmm, 0, sizeof(sse_regs_t)*((vex.rex.is32bits)?8:16)); memset(emu->ymm, 0, sizeof(sse_regs_t)*((vex.rex.is32bits)?8:16)); diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c index 015167c5..178d95ac 100644 --- a/src/emu/x64runavx0f38.c +++ b/src/emu/x64runavx0f38.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -60,7 +61,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0xF2: /* ANDN Gd, Vd, Ed */ nextop = F8; - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); ResetFlags(emu); GETGD; GETED(0); @@ -80,7 +81,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) nextop = F8; switch((nextop>>3)&7) { case 1: /* BLSR Vd, Ed */ - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); ResetFlags(emu); GETVD; GETED(0); @@ -96,7 +97,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) CLEAR_FLAG(F_PF); // Undef break; case 2: /* BLSMSK Vd, Ed */ - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); ResetFlags(emu); GETVD; GETED(0); @@ -112,7 +113,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) CLEAR_FLAG(F_PF); // Undef break; case 3: /* BLSI Vd, Ed */ - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); ResetFlags(emu); GETVD; GETED(0); @@ -136,7 +137,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0xF5: /* BZHI Gd, Ed, Vd */ nextop = F8; - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); GETGD; GETED(0); GETVD; @@ -159,7 +160,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0xF7: /* BEXTR Gd, Ed, Vd */ nextop = F8; - if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); ResetFlags(emu); GETGD; GETED(0); diff --git a/src/emu/x64runavx660f.c b/src/emu/x64runavx660f.c index 26c36bbb..8f9790f7 100644 --- a/src/emu/x64runavx660f.c +++ b/src/emu/x64runavx660f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -1999,7 +2000,7 @@ uintptr_t RunAVX_660F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0xF7: /* VMASKMOVDQU Gx, Ex */ nextop = F8; if(vex.l) { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } GETEX(0); GETGX; diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c index 1766168d..2fec0afb 100644 --- a/src/emu/x64runavx660f38.c +++ b/src/emu/x64runavx660f38.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -538,7 +539,7 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETEY; GETGY; GETVY; - if(!vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(!vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); if(GX==EX) { eax1 = *EX; EX = &eax1; @@ -981,7 +982,7 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETEY; GETGY; GETVY; - if(!vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(!vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); if(GX==EX) { eax1 = *EX; EX = &eax1; @@ -1377,7 +1378,7 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0x92: /* VGATHERDPD/VGATHERDPS Gx, VSIB, Vx */ nextop = F8; if(((nextop&7)!=4) || MODREG) { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } GETGX; GETVX; @@ -1444,7 +1445,7 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0x93: /* VGATHERQPD/VGATHERQPS Gx, VSIB, Vx */ nextop = F8; if(((nextop&7)!=4) || MODREG) { - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); } GETGX; GETVX; diff --git a/src/emu/x64runavx660f3a.c b/src/emu/x64runavx660f3a.c index d81f6a84..3985668e 100644 --- a/src/emu/x64runavx660f3a.c +++ b/src/emu/x64runavx660f3a.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -98,7 +99,7 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETGY; GETEY; u8 = F8; - if(!vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(!vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); if(GX==EX) { eax1 = *EX; EX = &eax1; @@ -183,7 +184,7 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETGY; GETVY; u8 = F8; - if(!vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(!vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); if(GX==EX) { eax1 = *EX; EX = &eax1; @@ -776,7 +777,7 @@ uintptr_t RunAVX_660F3A(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETGY; GETVY; u8 = F8; - if(!vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + if(!vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); if(GX==EX) { eax1 = *EX; EX = &eax1; diff --git a/src/emu/x64runf20f.c b/src/emu/x64runf20f.c index 1886543b..9fe4c319 100644 --- a/src/emu/x64runf20f.c +++ b/src/emu/x64runf20f.c @@ -9,6 +9,7 @@ #include <sys/types.h> #include <unistd.h> +#include "os.h" #include "debug.h" #include "box64stack.h" #include "x64emu.h" @@ -317,7 +318,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) nextop = F8; if(!BOX64ENV(cputype) || !(MODREG)) { #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif } else { GETGX; @@ -334,7 +335,7 @@ uintptr_t RunF20F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step) nextop = F8; if(!BOX64ENV(cputype) || !(MODREG)) { #ifndef TEST_INTERPRETER - emit_signal(emu, SIGILL, (void*)R_RIP, 0); + EmitSignal(emu, SIGILL, (void*)R_RIP, 0); #endif } else { GETGX; diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index f7d6a6d7..376809a7 100644 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -448,7 +448,7 @@ void EXPORT x64Syscall(x64emu_t *emu) uintptr_t ret_addr = R_RIP-2; if(/*ret_addr<0x700000000000LL &&*/ (my_context->signals[SIGSYS]>2) && !FindElfAddress(my_context, ret_addr)) { // not a linux elf, not a syscall to setup x86_64 arch. Signal SIGSYS - emit_signal(emu, SIGSYS, (void*)ret_addr, R_EAX&0xffff); // what are the parameters? + EmitSignal(emu, SIGSYS, (void*)ret_addr, R_EAX&0xffff); // what are the parameters? return; } } diff --git a/src/emu/x86int3.c b/src/emu/x86int3.c index f3b232c6..fea71a00 100755 --- a/src/emu/x86int3.c +++ b/src/emu/x86int3.c @@ -482,7 +482,7 @@ void x86Int3(x64emu_t* emu, uintptr_t* addr) } if(!BOX64ENV(ignoreint3) && my_context->signals[SIGTRAP]) { R_RIP = *addr; // update RIP - emit_signal(emu, SIGTRAP, NULL, 3); + EmitSignal(emu, SIGTRAP, NULL, 3); } else { printf_log(LOG_DEBUG, "%04d|Warning, ignoring unsupported Int 3 call @%p\n", GetTID(), (void*)R_RIP); R_RIP = *addr; diff --git a/src/include/os.h b/src/include/os.h index 819975bb..6646c49f 100644 --- a/src/include/os.h +++ b/src/include/os.h @@ -3,6 +3,9 @@ int GetTID(void); int SchedYield(void); +void EmitSignal(void* emu, int sig, void* addr, int code); +void EmitDiv0(void* emu, void* addr, int code); +void EmitInterruption(void* emu, int num, void* addr); #ifndef _WIN32 #include <setjmp.h> diff --git a/src/include/signals.h b/src/include/signals.h index df295dea..cb627250 100644 --- a/src/include/signals.h +++ b/src/include/signals.h @@ -1,7 +1,10 @@ #ifndef __SIGNALS_H__ #define __SIGNALS_H__ +#include <stdint.h> #include <signal.h> +#include "box64context.h" + typedef void (*sighandler_t)(int); #ifdef ANDROID diff --git a/src/os/os_linux.c b/src/os/os_linux.c index e4b5b193..b09bcc35 100644 --- a/src/os/os_linux.c +++ b/src/os/os_linux.c @@ -1,8 +1,10 @@ #include <sys/syscall.h> #include <sched.h> #include <unistd.h> +#include <stdint.h> #include "os.h" +#include "signals.h" int GetTID(void) { @@ -13,3 +15,18 @@ int SchedYield(void) { return sched_yield(); } + +void EmitSignal(void* emu, int sig, void* addr, int code) +{ + return emit_signal((x64emu_t*)emu, sig, addr, code); +} + +void EmitDiv0(void* emu, void* addr, int code) +{ + return emit_div0((x64emu_t*)emu, addr, code); +} + +void EmitInterruption(void* emu, int num, void* addr) +{ + return emit_interruption((x64emu_t*)emu, num, addr); +} |