about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-08 15:20:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-08 15:20:52 +0200
commit7db5b33284eb1611ec1ae15b030ef146f6b46c1c (patch)
tree66f5359a63d7dcd991d04c835f6c7c54ad85d00a /src
parent6607ddb15daeec7f54504a907e5db5013d3da618 (diff)
downloadbox64-7db5b33284eb1611ec1ae15b030ef146f6b46c1c.tar.gz
box64-7db5b33284eb1611ec1ae15b030ef146f6b46c1c.zip
Some small changes to thread and fork and cloning x64emu_t struct
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec.c4
-rwxr-xr-xsrc/emu/x64emu.c12
-rwxr-xr-xsrc/emu/x64run_private.c4
-rwxr-xr-xsrc/emu/x64syscall.c9
-rwxr-xr-xsrc/include/x64emu.h2
-rwxr-xr-xsrc/libtools/signals.c4
-rwxr-xr-xsrc/libtools/threads.c6
-rwxr-xr-xsrc/main.c11
-rwxr-xr-xsrc/wrapped/wrappedlibc.c10
9 files changed, 43 insertions, 19 deletions
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index fffc508a..5e5a5b7c 100755
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -133,7 +133,7 @@ void DynaCall(x64emu_t* emu, uintptr_t addr)
                     emu->test.clean = 0;
                 Run(emu, 1);
             } else {
-                dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x64 instructions emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,emu);
+                dynarec_log(LOG_DEBUG, "%04d|Calling DynaRec Block @%p (%p) of %d x64 instructions (hash=0x%x) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize ,block->hash, emu);
                 CHECK_FLAGS(emu);
                 // block is here, let's run it!
                 native_prolog(emu, block->block);
@@ -221,7 +221,7 @@ int DynaRun(x64emu_t* emu)
                     emu->test.clean = 0;
                 Run(emu, 1);
             } else {
-                dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, emu);
+                dynarec_log(LOG_DEBUG, "%04d|Running DynaRec Block @%p (%p) of %d x64 insts (hash=0x%x) emu=%p\n", GetTID(), (void*)R_RIP, block->block, block->isize, block->hash, emu);
                 // block is here, let's run it!
                 native_prolog(emu, block->block);
             }
diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index de4dd50e..d48b4912 100755
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -117,10 +117,18 @@ x64emu_t *NewX64EmuFromStack(x64emu_t* emu, box64context_t *context, uintptr_t s
 }
 
 EXPORTDYN
-void SetupX64Emu(x64emu_t *emu)
+void SetupX64Emu(x64emu_t *emu, x64emu_t *ref)
 {
     printf_log(LOG_DEBUG, "Setup X86_64 Emu\n");
-    (void)emu;  // Not doing much here...
+    if(ref) {
+        // save RIP and RSP
+        uintptr_t old_rip = R_RIP;
+        uintptr_t old_rsp = R_RSP;
+        CloneEmu(emu, ref);
+        // restore RIP and RSP
+        R_RIP = old_rip;
+        R_RSP = old_rsp;
+    }
 }
 
 #ifdef HAVE_TRACE
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 9f8457c2..dfd9a40b 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -33,6 +33,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
     (void)argc; (void)ubp_av; (void)fini; (void)rtld_fini; (void)stack_end;
 
     if(init) {
+        uintptr_t old_rsp = GetRSP(emu);
+        uintptr_t old_rbp = GetRBP(emu); // should not be needed, but seems to be without dynarec
         Push64(emu, GetRBP(emu));   // set frame pointer
         SetRBP(emu, GetRSP(emu));   // save RSP
         SetRSP(emu, GetRSP(emu)&~0xFLL);    // Align RSP
@@ -47,6 +49,8 @@ int32_t EXPORT my___libc_start_main(x64emu_t* emu, int *(main) (int, char * *, c
             return 0;
         SetRSP(emu, GetRBP(emu));   // restore RSP
         SetRBP(emu, Pop64(emu));    // restore RBP
+        SetRSP(emu, old_rsp);
+        SetRBP(emu, old_rbp);
         emu->quit = 0;
     } else {
         RunElfInit(my_context->elfs[0], emu);
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c
index 4a82f9a1..c426cd32 100755
--- a/src/emu/x64syscall.c
+++ b/src/emu/x64syscall.c
@@ -198,6 +198,7 @@ scwrap_t syscallwrap[] = {
     { 208, __NR_io_getevents, 4},
     { 209, __NR_io_submit, 3},
     { 210, __NR_io_cancel, 3},
+    { 212, __NR_lookup_dcookie, 3},
     #ifdef __NR_epoll_create
     { 213, __NR_epoll_create, 1},
     #endif
@@ -557,8 +558,8 @@ void EXPORT x64Syscall(x64emu_t *emu)
                         }
                     }
                     x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RSI)?0:1);
-                    SetupX64Emu(newemu);
-                    CloneEmu(newemu, emu);
+                    SetupX64Emu(newemu, emu);
+                    //CloneEmu(newemu, emu);
                     Push64(newemu, 0);
                     PushExit(newemu);
                     void* mystack = NULL;
@@ -858,8 +859,8 @@ uintptr_t EXPORT my_syscall(x64emu_t *emu)
                     }
                 }
                 x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack_base, stack_size, (R_RDX)?0:1);
-                SetupX64Emu(newemu);
-                CloneEmu(newemu, emu);
+                SetupX64Emu(newemu, emu);
+                //CloneEmu(newemu, emu);
                 Push64(newemu, 0);
                 PushExit(newemu);
                 void* mystack = NULL;
diff --git a/src/include/x64emu.h b/src/include/x64emu.h
index c7f2e20e..d242925a 100755
--- a/src/include/x64emu.h
+++ b/src/include/x64emu.h
@@ -6,7 +6,7 @@ typedef struct box64context_s box64context_t;
 
 x64emu_t *NewX64Emu(box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack);
 x64emu_t *NewX64EmuFromStack(x64emu_t* emu, box64context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack);
-void SetupX64Emu(x64emu_t *emu);
+void SetupX64Emu(x64emu_t *emu, x64emu_t *ref);
 void FreeX64Emu(x64emu_t **x64emu);
 void FreeX64EmuFromStack(x64emu_t **emu);
 void CloneEmu(x64emu_t *newemu, const x64emu_t* emu);
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index e9ed2eec..1ea5489a 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -753,9 +753,9 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
     if(sig!=SIGSEGV && !(Locks&is_dyndump_locked))
         dynarec = 1;
     #endif
-    if (simple)
+    /*if (simple)
         ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 1, sig);
-    else
+    else*/
         ret = RunFunctionHandler(&exits, dynarec, sigcontext, my_context->signals[sig], 3, sig, info2, sigcontext);
     // restore old value from emu
     if(used_stack)  // release stack
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index ebf3d669..707d3833 100755
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -215,7 +215,7 @@ x64emu_t* thread_get_emu()
 		}
 		void* stack = my_mmap(NULL, NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
 		x64emu_t *emu = NewX64Emu(my_context, 0, (uintptr_t)stack, stacksize, 1);
-		SetupX64Emu(emu);
+		SetupX64Emu(emu, NULL);
 		thread_set_emu(emu);
 		return emu;
 	}
@@ -490,7 +490,7 @@ EXPORT int my_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_rou
 
 	emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t));
     x64emu_t *emuthread = NewX64Emu(my_context, (uintptr_t)start_routine, (uintptr_t)stack, stacksize, own);
-	SetupX64Emu(emuthread);
+	SetupX64Emu(emuthread, emu);
 	//SetFS(emuthread, GetFS(emu));
 	et->emu = emuthread;
 	et->fnc = (uintptr_t)start_routine;
@@ -512,7 +512,7 @@ void* my_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** pet
 	void* stack = my_mmap(NULL, NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
 	emuthread_t *et = (emuthread_t*)box_calloc(1, sizeof(emuthread_t));
     x64emu_t *emuthread = NewX64Emu(emu->context, (uintptr_t)f, (uintptr_t)stack, stacksize, 1);
-	SetupX64Emu(emuthread);
+	SetupX64Emu(emuthread, emu					);
 	//SetFS(emuthread, GetFS(emu));
 	et->emu = emuthread;
 	et->fnc = (uintptr_t)f;
diff --git a/src/main.c b/src/main.c
index aebe557a..77e2274c 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1366,8 +1366,13 @@ int main(int argc, const char **argv, char **env) {
             wine_prereserve(prereserve);
         // special case for winedbg, doesn't work anyway
         if(argv[nextarg+1] && strstr(argv[nextarg+1], "winedbg")==argv[nextarg+1]) {
-            printf_log(LOG_NONE, "winedbg detected, not launching it!\n");
-            exit(0);    // exiting, it doesn't work anyway
+            if(getenv("BOX64_WINEDBG")) {
+                box64_nobanner = 1;
+                box64_log = 0;
+            } else {
+                printf_log(LOG_NONE, "winedbg detected, not launching it!\n");
+                exit(0);    // exiting, it doesn't work anyway
+            }
         }
         box64_wine = 1;
     } else 
@@ -1692,7 +1697,7 @@ int main(int argc, const char **argv, char **env) {
     x64emu_t *emu = NewX64Emu(my_context, my_context->ep, (uintptr_t)my_context->stack, my_context->stacksz, 0);
     // stack setup is much more complicated then just that!
     SetupInitialStack(emu); // starting here, the argv[] don't need free anymore
-    SetupX64Emu(emu);
+    SetupX64Emu(emu, NULL);
     SetRSI(emu, my_context->argc);
     SetRDX(emu, (uint64_t)my_context->argv);
     SetRCX(emu, (uint64_t)my_context->envv);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index cb4ae59d..0c0c0238 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -482,6 +482,11 @@ int my_dl_iterate_phdr(x64emu_t *emu, void* F, void *data);
 
 pid_t EXPORT my_fork(x64emu_t* emu)
 {
+    #if 1
+    emu->quit = 1;
+    emu->fork = 3;  // use regular fork...
+    return 0;
+    #else
     // execute atforks prepare functions, in reverse order
     for (int i=my_context->atfork_sz-1; i>=0; --i)
         if(my_context->atforks[i].prepare)
@@ -507,6 +512,7 @@ pid_t EXPORT my_fork(x64emu_t* emu)
                 RunFunctionWithEmu(emu, 0, my_context->atforks[i].child, 0);
     }
     return v;
+    #endif
 }
 pid_t EXPORT my___fork(x64emu_t* emu) __attribute__((alias("my_fork")));
 pid_t EXPORT my_vfork(x64emu_t* emu)
@@ -3138,8 +3144,8 @@ EXPORT int my_clone(x64emu_t* emu, void* fn, void* stack, int flags, void* args,
     void* mystack = NULL;
     clone_arg_t* arg = (clone_arg_t*)box_calloc(1, sizeof(clone_arg_t));
     x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack, 0, 0);
-    SetupX64Emu(newemu);
-    CloneEmu(newemu, emu);
+    SetupX64Emu(newemu, emu);
+    //CloneEmu(newemu, emu);
     if(my_context->stack_clone_used) {
         printf_log(LOG_DEBUG, " no free stack_clone ");
         mystack = box_malloc(1024*1024);  // stack for own process... memory leak, but no practical way to remove it