diff --git a/liblfi/include/lfi.h b/liblfi/include/lfi.h index c08ba3b..9bfd054 100644 --- a/liblfi/include/lfi.h +++ b/liblfi/include/lfi.h @@ -95,6 +95,6 @@ struct LFILoadOpts { bool lfi_proc_loadelf(struct LFIAddrSpace* as, uint8_t* prog, size_t progsz, uint8_t* interp, size_t interpsz, struct LFILoadInfo* o_info, struct LFILoadOpts opts); bool lfi_proc_init(struct LFIContext* ctx, struct LFIAddrSpace* as, struct LFILoadInfo info); -void lfi_thread_init(void* thread_create, void* pausefn); +void lfi_thread_init(void (*thread_create)(void*), void* pausefn); char* lfi_strerror(void); diff --git a/liblfi/pal/ctx.c b/liblfi/pal/ctx.c index 2faef6f..a74ad77 100644 --- a/liblfi/pal/ctx.c +++ b/liblfi/pal/ctx.c @@ -158,13 +158,13 @@ pal_register_clonectx(struct LFIContext* ctx) } EXPORT void -lfi_thread_init(void* thread_create, void* pausefn) +lfi_thread_init(void (*thread_create)(void*), void* pausefn) { // invoke sbx_thread_create(&_lfi_pause) with the clone context LOCK_WITH_DEFER(&lfi_clonectx_lk, lk); - *lfi_regs_entry(&lfi_clonectx->regs) = (uintptr_t) thread_create; - *lfi_regs_arg0(&lfi_clonectx->regs) = (uintptr_t) pausefn; - lfi_ctx_run(lfi_clonectx, lfi_clonectx->as); + assert(lfi_myctx == NULL); + lfi_myctx = lfi_clonectx; + thread_create(pausefn); lfi_myctx = lfi_newctx; lfi_newctx = NULL; } diff --git a/liblfi/syscalls/sys_thread.c b/liblfi/syscalls/sys_thread.c index d38d7ad..6b6f553 100644 --- a/liblfi/syscalls/sys_thread.c +++ b/liblfi/syscalls/sys_thread.c @@ -131,12 +131,15 @@ spawn(struct TuxThread* p, uint64_t flags, uint64_t stack, uint64_t ptidp, uint6 // of creating a new kernel thread, we just save the stack and tls that // was created so it can be reused when we need to spawn threads in the // future. + struct LFIContext* save_ctx = lfi_myctx; + threadspawn(p2); + lfi_myctx = save_ctx; pal_register_clonectx(p2->p_ctx); } else if (p->p_ctx == lfi_clonectx) { + struct LFIContext* save_ctx = lfi_myctx; threadspawn(p2); + lfi_myctx = save_ctx; lfi_newctx = p2->p_ctx; - // does not return - lfi_ctx_pause(p->p_ctx, 0); } else { // Actually create a new thread. pthread_t thread;