about summary refs log tree commit diff stats
path: root/src/libtools/signals.c
diff options
context:
space:
mode:
authorYang Liu <numbksco@gmail.com>2025-10-22 01:15:18 +0800
committerGitHub <noreply@github.com>2025-10-22 01:15:18 +0800
commitfe0e3b7a9fb6a3dd0a7b4f60b4b5c2c9d83bb796 (patch)
treef5f1438f654661352dce169dbb5d4cd879585bc2 /src/libtools/signals.c
parente3cd3e8347086b9a2a3cc370088bba0ace0e740a (diff)
downloadbox64-fe0e3b7a9fb6a3dd0a7b4f60b4b5c2c9d83bb796.tar.gz
box64-fe0e3b7a9fb6a3dd0a7b4f60b4b5c2c9d83bb796.zip
[LA64] Fixed LBT signal handling, also refined la64noext support (#3080)
Diffstat (limited to 'src/libtools/signals.c')
-rw-r--r--src/libtools/signals.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index fcf7e7e9..72cd7591 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -354,7 +354,30 @@ void copyUCTXreg2Emu(x64emu_t* emu, ucontext_t* p, uintptr_t ip) {
     GO(R15);
     #undef GO
     emu->ip.q[0] = ip;
-    emu->eflags.x64 = CONTEXT_REG(p, xFlags);
+#ifdef LA64
+    // TODO: move to ADJUST_ARCH
+    if (cpuext.lbt) {
+        struct lbt_context* lbt_ctx = NULL;
+        struct sctx_info* info = (struct sctx_info*)p->uc_mcontext.__extcontext;
+        while (info->magic && !lbt_ctx) {
+            if (info->magic == LBT_CTX_MAGIC)
+                lbt_ctx = (struct lbt_context*)((uintptr_t)info + sizeof(struct sctx_info));
+            else
+                info = (struct sctx_info*)((uintptr_t)info + info->size);
+        }
+
+        if (lbt_ctx) {
+            uint64_t scratch = 0;
+            uint64_t flags = CONTEXT_REG(p, xFlags) & ~0b100011010101;
+            flags = flags | (lbt_ctx->eflags & 0b100011010101);
+            emu->eflags.x64 = flags;
+        } else {
+            printf_log(LOG_NONE, "Are you on a non-LBT kernel? Use BOX64_DYNAREC_LA64NOEXT=lbt to prevent Box64 from using it.\n");
+            emu->eflags.x64 = CONTEXT_REG(p, xFlags);
+        }
+    } else
+#endif
+        emu->eflags.x64 = CONTEXT_REG(p, xFlags);
 #endif
 }