about summary refs log tree commit diff stats
path: root/src/tools/callback.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-17 16:21:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-17 16:21:38 +0100
commit54be0c0dec8ad3c81caa0366f84c056717792cb2 (patch)
treeec3f895739734aba1a0b73eb622634cf39c1e8c4 /src/tools/callback.c
parent20df2789b542b5c280d71b4ae0fa797a24f6d130 (diff)
downloadbox64-54be0c0dec8ad3c81caa0366f84c056717792cb2.tar.gz
box64-54be0c0dec8ad3c81caa0366f84c056717792cb2.zip
Saved defered flag status when processing signal / foreign function
Diffstat (limited to 'src/tools/callback.c')
-rw-r--r--src/tools/callback.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/tools/callback.c b/src/tools/callback.c
index 162c801f..341a554d 100644
--- a/src/tools/callback.c
+++ b/src/tools/callback.c
@@ -164,6 +164,13 @@ uint64_t RunSafeFunction(uintptr_t fnc, int nargs, ...)
     Push64(emu, R_R10);
     Push64(emu, R_R11);
     Push64(emu, R_RAX);
+    deferred_flags_t old_df = emu->df;
+    multiuint_t old_op1 = emu->op1;
+    multiuint_t old_op2 = emu->op2;
+    multiuint_t old_res = emu->res;
+    multiuint_t old_op1_sav= emu->op1_sav;
+    multiuint_t old_res_sav= emu->res_sav;
+    deferred_flags_t old_df_sav= emu->df_sav;
 
     R_RSP -= stackn*sizeof(void*);   // need to push in reverse order
 
@@ -200,7 +207,14 @@ uint64_t RunSafeFunction(uintptr_t fnc, int nargs, ...)
 
     R_RSP = old_rbp;          // mov rsp, rbp
     R_RBP = Pop64(emu);     // pop rbp
-    
+
+    emu->df = old_df;
+    emu->op1 = old_op1;
+    emu->op2 = old_op2;
+    emu->res = old_res;
+    emu->op1_sav = old_op1_sav;
+    emu->res_sav = old_res_sav;
+    emu->df_sav = old_df_sav;
 
     return ret;
 }