about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynarec_native_functions.c18
-rw-r--r--src/dynarec/dynarec_native_functions.h1
-rw-r--r--src/emu/x64int3.c2
-rw-r--r--src/emu/x64run.c56
-rw-r--r--src/emu/x64run0f.c27
-rw-r--r--src/emu/x64run64.c4
-rw-r--r--src/emu/x64run660f.c7
-rw-r--r--src/emu/x64run670f.c3
-rw-r--r--src/emu/x64runavx0f.c5
-rw-r--r--src/emu/x64runavx0f38.c13
-rw-r--r--src/emu/x64runavx660f.c3
-rw-r--r--src/emu/x64runavx660f38.c9
-rw-r--r--src/emu/x64runavx660f3a.c7
-rw-r--r--src/emu/x64runf20f.c5
-rw-r--r--src/emu/x64syscall.c2
-rwxr-xr-xsrc/emu/x86int3.c2
-rw-r--r--src/include/os.h3
-rw-r--r--src/include/signals.h3
-rw-r--r--src/os/os_linux.c17
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);
+}