about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-05 21:21:34 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-05 21:21:34 +0100
commitbdf2922f5d5e4f98731833dc727048a32b514902 (patch)
tree8469ef332ab98cb4f26b056143ed686dd2761022 /src/libtools
parentf52d13f86adee09506b74efa679dc1cd2e4548e2 (diff)
downloadbox64-bdf2922f5d5e4f98731833dc727048a32b514902.tar.gz
box64-bdf2922f5d5e4f98731833dc727048a32b514902.zip
[INTERPRETER] Added addling to divide by 0 exception
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/signals.c23
1 files changed, 23 insertions, 0 deletions
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)