From bdf2922f5d5e4f98731833dc727048a32b514902 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Tue, 5 Dec 2023 21:21:34 +0100 Subject: [INTERPRETER] Added addling to divide by 0 exception --- src/libtools/signals.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/libtools') diff --git a/src/libtools/signals.c b/src/libtools/signals.c index 6ed84dc9..2cf6ce6e 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -1009,6 +1009,10 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void } else { sigcontext->uc_mcontext.gregs[X64_ERR] = 0x0a|(int_n<<3); } + } else if(info->si_errno==0xcafe) { + info2->si_errno = 0; + sigcontext->uc_mcontext.gregs[X64_TRAPNO] = 0; + info2->si_signo = SIGFPE; } } else if(sig==SIGFPE) { if (info->si_code == FPE_INTOVF) @@ -1707,6 +1711,25 @@ void emit_interruption(x64emu_t* emu, int num, void* addr) my_sigactionhandler_oldcode(SIGSEGV, 0, &info, NULL, NULL, NULL); } +void emit_div0(x64emu_t* emu, void* addr, int code) +{ + siginfo_t info = {0}; + info.si_signo = SIGSEGV; + info.si_errno = 0xcafe; + info.si_code = code; + info.si_addr = addr; + const char* x64name = NULL; + const char* elfname = NULL; + if(box64_log>LOG_INFO || box64_dynarec_dump || box64_showsegv) { + x64name = getAddrFunctionName(R_RIP); + elfheader_t* elf = FindElfAddress(my_context, R_RIP); + if(elf) + 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(SIGSEGV, 0, &info, NULL, NULL, NULL); +} + EXPORT sighandler_t my_signal(x64emu_t* emu, int signum, sighandler_t handler) { if(signum<0 || signum>MAX_SIGNAL) -- cgit 1.4.1