about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/libtools/signal32.c11
-rw-r--r--src/libtools/signals.c29
2 files changed, 16 insertions, 24 deletions
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c
index 9399aba8..d34cff1f 100644
--- a/src/libtools/signal32.c
+++ b/src/libtools/signal32.c
@@ -38,13 +38,16 @@
 #include "dynarec_native.h"
 #if defined(ARM64)
 #include "dynarec/arm64/arm64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.regs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.regs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.pc
 #elif defined(LA64)
 #include "dynarec/la64/la64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.__gregs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.__gregs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.__pc;
 #elif defined(RV64)
 #include "dynarec/rv64/rv64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.__gregs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.__gregs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.__gregs[REG_PC]
 #else
 #error Unsupported Architecture
 #endif //arch
@@ -497,7 +500,7 @@ void my_sigactionhandler_oldcode_32(x64emu_t* emu, int32_t sig, int simple, sigi
     ucontext_t *p = (ucontext_t *)ucntx;
     void* pc = NULL;
     if(p) {
-        pc = (void*)p->uc_mcontext.pc;
+        pc = (void*)CONTEXT_PC(p);
         if(db)
             frame = from_ptr((ptr_t)CONTEXT_REG(p, xRSP));
     }
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index a6902cdb..e53f9c62 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -43,13 +43,16 @@
 #include "gdbjit.h"
 #if defined(ARM64)
 #include "dynarec/arm64/arm64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.regs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.regs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.pc
 #elif defined(LA64)
 #include "dynarec/la64/la64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.__gregs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.__gregs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.__pc;
 #elif defined(RV64)
 #include "dynarec/rv64/rv64_mapping.h"
-#define CONTEXT_REG(P, X) P->uc_mcontext.__gregs[X]
+#define CONTEXT_REG(P, X)   P->uc_mcontext.__gregs[X]
+#define CONTEXT_PC(P)       P->uc_mcontext.__gregs[REG_PC]
 #else
 #error Unsupported Architecture
 #endif //arch
@@ -278,7 +281,7 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss
 #ifdef DYNAREC
 x64emu_t* getEmuSignal(x64emu_t* emu, ucontext_t* p, dynablock_t* db)
 {
-    if(db && p->uc_mcontext.regs[0]>0x10000) {
+    if(db && CONTEXT_REG(p, xEmu)>0x10000) {
         emu = (x64emu_t*)CONTEXT_REG(p, xEmu);
     }
     return emu;
@@ -1430,13 +1433,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx)
                 if(!db->gone && !is_hotpage && hash==db->hash) {
                     dynarec_log(LOG_INFO, "Dynablock (%p, x64addr=%p, always_test=%d) is clean, %s continuing at %p (%p)!\n", db, db->x64_addr, db->always_test, type_callret?"self-loop":"ret from callret", (void*)x64pc, (void*)addr);
                     // it's good! go next opcode
-                    #ifdef __aarch64__
-                    p->uc_mcontext.pc+=4;
-                    #elif defined(LA64)
-                    p->uc_mcontext.__pc+=4;
-                    #elif defined(RV64)
-                    p->uc_mcontext.__gregs[REG_PC]+=4;
-                    #endif
+                    CONTEXT_PC(p)+=4;
                     if(db->always_test)
                         protectDB((uintptr_t)db->x64_addr, 1);
                     else {
@@ -1882,15 +1879,7 @@ void my_sigactionhandler(int32_t sig, siginfo_t* info, void * ucntx)
     void* pc = NULL;
     #ifdef DYNAREC
     ucontext_t *p = (ucontext_t *)ucntx;
-    #ifdef ARM64
-    pc = (void*)p->uc_mcontext.pc;
-    #elif defined(LA64)
-    pc = (void*)p->uc_mcontext.__pc;
-    #elif defined(RV64)
-    pc = (void*)p->uc_mcontext.__gregs[0];
-    #else
-    #error Unsupported architecture
-    #endif
+    pc = (void*)CONTEXT_PC(p);
     #endif
     dynablock_t* db = FindDynablockFromNativeAddress(pc);
     x64emu_t* emu = thread_get_emu();