From 49cc5eabcbcebdd6a67bfa32a82caf1723997d78 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Wed, 23 Jul 2025 11:13:28 +0200 Subject: Some handling of case where signal numbers differs between native and x64 archs (not complete, missing sigset conversions) --- src/os/emit_signal_wine.c | 6 +++--- src/os/emit_signals_linux.c | 31 +++++++++++++++---------------- 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src/os') diff --git a/src/os/emit_signal_wine.c b/src/os/emit_signal_wine.c index ef0a0f65..6f8ee126 100644 --- a/src/os/emit_signal_wine.c +++ b/src/os/emit_signal_wine.c @@ -2,10 +2,10 @@ * Copyright 2022-2025 André Zwing * Copyright 2023 Alexandre Julliard */ -#include #include #include +#include "x64_signals.h" #include "x64emu.h" #include "debug.h" #include "custommem.h" @@ -16,11 +16,11 @@ void EmitSignal(x64emu_t* emu, int sig, void* addr, int code) EXCEPTION_RECORD rec; switch (sig) { - case SIGILL: + case X64_SIGILL: printf_log(LOG_DEBUG, "SIGILL at %p with code %d\n", addr, code); rec.ExceptionCode = STATUS_ILLEGAL_INSTRUCTION; break; - case SIGSEGV: + case X64_SIGSEGV: printf_log(LOG_DEBUG, "SIGSEGV at %p with code %d\n", addr, code); rec.ExceptionCode = STATUS_ACCESS_VIOLATION; break; diff --git a/src/os/emit_signals_linux.c b/src/os/emit_signals_linux.c index e14c4c83..4e7f6c77 100644 --- a/src/os/emit_signals_linux.c +++ b/src/os/emit_signals_linux.c @@ -6,12 +6,11 @@ #include #include #include -#include #ifndef ANDROID #include #endif - +#include "x64_signals.h" #include "box64context.h" #include "custommem.h" #include "debug.h" @@ -29,15 +28,15 @@ void EmitSignal(x64emu_t* emu, int sig, void* addr, int code) { siginfo_t info = { 0 }; info.si_signo = sig; - info.si_errno = (sig == SIGSEGV) ? 0x1234 : 0; // Mark as a sign this is a #GP(0) (like privileged instruction) + info.si_errno = (sig == X64_SIGSEGV) ? 0x1234 : 0; // Mark as a sign this is a #GP(0) (like privileged instruction) info.si_code = code; - if (sig == SIGSEGV && code == 0xbad0) { + if (sig == X64_SIGSEGV && code == 0xbad0) { info.si_errno = 0xbad0; info.si_code = 0; - } else if (sig == SIGSEGV && code == 0xecec) { + } else if (sig == X64_SIGSEGV && code == 0xecec) { info.si_errno = 0xecec; info.si_code = SEGV_ACCERR; - } else if (sig == SIGSEGV && code == 0xb09d) { + } else if (sig == X64_SIGSEGV && code == 0xb09d) { info.si_errno = 0xb09d; info.si_code = 0; } @@ -52,7 +51,7 @@ void EmitSignal(x64emu_t* emu, int sig, void* addr, int code) printf_log(LOG_NONE, "Emit Signal %d at IP=%p(%s / %s) / addr=%p, code=0x%x\n", sig, (void*)R_RIP, x64name ? x64name : "???", elfname ? elfname : "?", addr, code); print_rolling_log(LOG_INFO); - if ((BOX64ENV(showbt) || sig == SIGABRT) && BOX64ENV(log) >= LOG_INFO) { + if ((BOX64ENV(showbt) || sig == X64_SIGABRT) && BOX64ENV(log) >= LOG_INFO) { // show native bt #define BT_BUF_SIZE 100 int nptrs; @@ -94,7 +93,7 @@ void EmitSignal(x64emu_t* emu, int sig, void* addr, int code) // fclose(f); // } // } - if (sig == SIGILL) { + if (sig == X64_SIGILL) { uint8_t* mem = (uint8_t*)R_RIP; printf_log(LOG_NONE, "SIGILL: Opcode at ip is %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx\n", mem[0], mem[1], mem[2], mem[3], mem[4], mem[5]); } @@ -108,14 +107,14 @@ void CheckExec(x64emu_t* emu, uintptr_t addr) return; // disabling the test, 4K pagesize simlation isn't good enough for this while ((getProtection/*_fast*/(addr) & (PROT_EXEC | PROT_READ)) != (PROT_EXEC | PROT_READ)) { R_RIP = addr; // incase there is a slight difference - EmitSignal(emu, SIGSEGV, (void*)addr, 0xecec); + EmitSignal(emu, X64_SIGSEGV, (void*)addr, 0xecec); } } void EmitInterruption(x64emu_t* emu, int num, void* addr) { siginfo_t info = { 0 }; - info.si_signo = SIGSEGV; + info.si_signo = X64_SIGSEGV; info.si_errno = 0xdead; info.si_code = num; info.si_addr = NULL; // addr; @@ -128,13 +127,13 @@ void EmitInterruption(x64emu_t* emu, int num, void* addr) elfname = ElfName(elf); printf_log(LOG_NONE, "Emit Interruption 0x%x at IP=%p(%s / %s) / addr=%p\n", num, (void*)R_RIP, x64name ? x64name : "???", elfname ? elfname : "?", addr); } - my_sigactionhandler_oldcode(emu, SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); + my_sigactionhandler_oldcode(emu, X64_SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); } void EmitDiv0(x64emu_t* emu, void* addr, int code) { siginfo_t info = { 0 }; - info.si_signo = SIGSEGV; + info.si_signo = X64_SIGSEGV; info.si_errno = 0xcafe; info.si_code = code; info.si_addr = addr; @@ -147,13 +146,13 @@ void EmitDiv0(x64emu_t* emu, void* addr, int code) elfname = ElfName(elf); printf_log(LOG_NONE, "Emit Divide by 0 at IP=%p(%s / %s) / addr=%p\n", (void*)R_RIP, x64name ? x64name : "???", elfname ? elfname : "?", addr); } - my_sigactionhandler_oldcode(emu, SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); + my_sigactionhandler_oldcode(emu, X64_SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); } void EmitWineInt(x64emu_t* emu, int num, void* addr) { siginfo_t info = { 0 }; - info.si_signo = SIGSEGV; + info.si_signo = X64_SIGSEGV; info.si_errno = 0xdead; info.si_code = num; info.si_addr = NULL; // addr; @@ -167,10 +166,10 @@ void EmitWineInt(x64emu_t* emu, int num, void* addr) printf_log(LOG_NONE, "Emit Interruption 0x%x at IP=%p(%s / %s) / addr=%p\n", num, (void*)R_RIP, x64name ? x64name : "???", elfname ? elfname : "?", addr); } if(box64_is32bits) - my_sigactionhandler_oldcode(emu, SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); + my_sigactionhandler_oldcode(emu, X64_SIGSEGV, 0, &info, NULL, NULL, NULL, R_RIP); else { uintptr_t frame = R_RSP; - int sig = SIGSEGV; + int sig = X64_SIGSEGV; // stack tracking x64_stack_t *new_ss = my_context->onstack[sig]?sigstack_getstack():NULL; int used_stack = 0; -- cgit 1.4.1