diff --git a/src/external/lkm b/src/external/lkm index 251b2313c..49713eb18 160000 --- a/src/external/lkm +++ b/src/external/lkm @@ -1 +1 @@ -Subproject commit 251b2313c882f67a03da97299c384c1d3be9c7f7 +Subproject commit 49713eb18354c171566c5e29a90565f98b2a4e13 diff --git a/src/kernel/emulation/linux/bsdthread/bsdthread_register.c b/src/kernel/emulation/linux/bsdthread/bsdthread_register.c index 86a7f19e7..8f929ed7c 100644 --- a/src/kernel/emulation/linux/bsdthread/bsdthread_register.c +++ b/src/kernel/emulation/linux/bsdthread/bsdthread_register.c @@ -3,6 +3,10 @@ #include "../errno.h" #include "../../../../../platform-include/sys/errno.h" #include "../signal/sigexc.h" +#include "../mach/lkm.h" +#include "../../../../external/lkm/api.h" +#include +#include #include int pthread_obj_size; @@ -15,12 +19,33 @@ bsdwqthread_entry_t wqueue_entry_point; #define WORKQ_FEATURE_FINEPRIO 0x02 #define WORKQ_FEATURE_KEVENT 0x40 +struct _pthread_registration_data { + uint64_t version; + + uint64_t dispatch_queue_offset; + uint64_t main_qos; + uint32_t tsd_offset; + uint32_t return_to_kernel_offset; + uint32_t mach_thread_self_offset; +} __attribute__ ((packed)); + +static struct _pthread_registration_data g_pth_regdata; + long sys_bsdthread_register(void* thread_start, void* wqthread, int pthsize, - void* dummy, void* targetconc, unsigned long long dpq_offset) + const struct _pthread_registration_data* pth_regdata, + unsigned long pth_regdata_len, unsigned long long dpq_offset) { pthread_obj_size = pthsize; pthread_entry_point = (bsdthread_entry_t) thread_start; wqueue_entry_point = (bsdwqthread_entry_t) wqthread; + g_pth_regdata = *pth_regdata; + + struct set_thread_handles_args args; + args.pthread_handle = (unsigned long) _pthread_getspecific_direct(_PTHREAD_TSD_SLOT_PTHREAD_SELF); + args.dispatch_qaddr = args.pthread_handle + g_pth_regdata.tsd_offset + g_pth_regdata.dispatch_queue_offset; + + lkm_call(NR_set_thread_handles, &args); + return /* WORKQ_FEATURE_KEVENT | WORKQ_FEATURE_FINEPRIO | PTHREAD_FEATURE_QOS_MAINTENANCE | PTHREAD_FEATURE_DISPATCHFUNC | PTHREAD_FEATURE_QOS_DEFAULT */ 0; } @@ -29,6 +54,12 @@ void pthread_entry_point_wrapper(void* self, int thread_port, void* funptr, void* funarg, unsigned long stacksize, unsigned int flags) { sigexc_thread_setup(); + + struct set_thread_handles_args args; + args.pthread_handle = (unsigned long) self; + args.dispatch_qaddr = args.pthread_handle + g_pth_regdata.tsd_offset + g_pth_regdata.dispatch_queue_offset; + + lkm_call(NR_set_thread_handles, &args); pthread_entry_point(self, thread_port, funptr, funarg, stacksize, flags); } diff --git a/src/kernel/emulation/linux/bsdthread/bsdthread_register.h b/src/kernel/emulation/linux/bsdthread/bsdthread_register.h index 61054a949..349f812d2 100644 --- a/src/kernel/emulation/linux/bsdthread/bsdthread_register.h +++ b/src/kernel/emulation/linux/bsdthread/bsdthread_register.h @@ -9,8 +9,11 @@ extern int pthread_obj_size; extern bsdthread_entry_t pthread_entry_point; extern bsdwqthread_entry_t wqueue_entry_point; +struct _pthread_registration_data; + long sys_bsdthread_register(void* thread_start, void* wqthread, int pthsize, - void* dummy, void* targetconc, unsigned long long dpq_offset); + const struct _pthread_registration_data* pth_regdata, + unsigned long pth_regdata_len, unsigned long long dpq_offset); void pthread_entry_point_wrapper(void* self, int thread_port, void* funptr, void* funarg, unsigned long stacksize, unsigned int flags); void wqueue_entry_point_wrapper(void* self, int thread_port, void* stackaddr, diff --git a/src/kernel/emulation/linux/signal/sigexc.c b/src/kernel/emulation/linux/signal/sigexc.c index 6224002c5..e9c2cb2e2 100644 --- a/src/kernel/emulation/linux/signal/sigexc.c +++ b/src/kernel/emulation/linux/signal/sigexc.c @@ -5,7 +5,6 @@ #include #include #include -#include #include "sigaltstack.h" #include "../mach/lkm.h" #include "../../../../external/lkm/api.h" @@ -30,8 +29,6 @@ extern _libkernel_functions_t _libkernel_functions; void darling_sigexc_uninstall(void); void sigrt_handler(int signum, struct linux_siginfo* info, void* ctxt); -#define SIGEXC_TSD_KEY 102 -#define SIGEXC_CONTEXT_TSD_KEY 103 static char sigexc_altstack[8*1024]; #if defined(__x86_64__)