this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Get a new RPC socket when forking; implement fork-waiting

+81 -7
+2
src/dyld/src/dyldAPIs.cpp
··· 126 126 #ifdef DARLING 127 127 extern "C" int mach_driver_get_dyld_fd(void); 128 128 extern "C" void* elfcalls_get_pointer(void); 129 + extern "C" void mach_driver_set_dyld_fd(int fd); 129 130 #endif 130 131 131 132 // In 10.3.x and earlier all the NSObjectFileImage API's were implemeneted in libSystem.dylib ··· 262 263 #ifdef DARLING 263 264 {"__dyld_get_mach_driver_fd", (void*)mach_driver_get_dyld_fd }, 264 265 {"__dyld_get_elfcalls", (void*)elfcalls_get_pointer }, 266 + {"__dyld_set_mach_driver_fd", (void*)mach_driver_set_dyld_fd }, 265 267 #endif 266 268 #pragma clang diagnostic pop 267 269 #endif //DEPRECATED_APIS_SUPPORTED
+4
src/kernel/emulation/linux/elfcalls_wrapper.c
··· 79 79 const void* __dserver_socket_address(void) { 80 80 return elfcalls()->dserver_socket_address(); 81 81 }; 82 + 83 + int __dserver_new_socket(void) { 84 + return elfcalls()->dserver_new_socket(); 85 + };
+1
src/kernel/emulation/linux/elfcalls_wrapper.h
··· 29 29 void* __darling_thread_get_stack(void); 30 30 31 31 const void* __dserver_socket_address(void); 32 + int __dserver_new_socket(void); 32 33 33 34 #ifdef __cplusplus 34 35 }
+6 -1
src/kernel/emulation/linux/mach/lkm.c
··· 21 21 extern _libkernel_functions_t _libkernel_functions; 22 22 23 23 24 - static int driver_fd = -1; 24 + int driver_fd = -1; 25 25 26 26 VISIBLE 27 27 struct elf_calls* _elfcalls; ··· 122 122 { 123 123 return driver_fd; 124 124 } 125 + 126 + __attribute__((visibility("default"))) 127 + void mach_driver_set_dyld_fd(int fd) { 128 + driver_fd = fd; 129 + }; 125 130 126 131 VISIBLE 127 132 int mach_driver_get_fd(void) {
+29
src/kernel/emulation/linux/process/fork.c
··· 8 8 9 9 #include <darlingserver/rpc.h> 10 10 #include "../simple.h" 11 + #include "../elfcalls_wrapper.h" 12 + #include "../mach/lkm.h" 13 + #include "../unistd/close.h" 14 + #include "../../../libsyscall/wrappers/_libkernel_init.h" 15 + 16 + extern int driver_fd; 17 + extern _libkernel_functions_t _libkernel_functions; 11 18 12 19 long sys_fork(void) 13 20 { ··· 24 31 else if (ret == 0) 25 32 { 26 33 // in the child 34 + 35 + // close the old RPC fd 36 + // FIXME: we actually have to close ALL the old RPC fds for any threads the parent process may have had 37 + close_internal((int)(intptr_t)_os_tsd_get_direct(__TSD_DSERVER_RPC_FD)); 38 + 39 + // create a new dserver RPC socket 40 + int new_rpc_fd = __dserver_new_socket(); 41 + if (new_rpc_fd < 0) { 42 + // we can't do anything if we don't get our own separate connection to darlingserver 43 + __simple_printf("Failed to create socket after fork\n"); 44 + __simple_abort(); 45 + } 46 + 47 + // set the new RPC fd 48 + _os_tsd_set_direct(__TSD_DSERVER_RPC_FD, (void*)(intptr_t)new_rpc_fd); 49 + driver_fd = new_rpc_fd; 50 + 51 + // update the fd stored in dyld, too 52 + void (*dyld_set_mach_driver_fd)(int fd); 53 + _libkernel_functions->dyld_func_lookup("__dyld_set_mach_driver_fd", (void**)&dyld_set_mach_driver_fd); 54 + dyld_set_mach_driver_fd(new_rpc_fd); 55 + 27 56 if (dserver_rpc_checkin(true) < 0) { 28 57 // we can't do ANYTHING if darlingserver fails to acknowledge us 29 58 __simple_printf("Failed to checkin with darlingserver after fork\n");
+4
src/kernel/libsyscall/CMakeLists.txt
··· 20 20 21 21 include_directories(${CMAKE_SOURCE_DIR}/src/external/lkm/osfmk) 22 22 23 + include_directories( 24 + "${CMAKE_BINARY_DIR}/src/external/darlingserver/include" 25 + ) 26 + 23 27 set(LIBSYSCALL_MIGS 24 28 mach/clock 25 29 mach/clock_priv
+4 -6
src/kernel/libsyscall/mach/mach_init.c
··· 63 63 #include "externs.h" 64 64 65 65 #ifdef DARLING 66 - #include <darling/lkm/api.h> 66 + #include <darlingserver/rpc.h> 67 67 #endif 68 68 69 69 mach_port_t bootstrap_port = MACH_PORT_NULL; ··· 99 99 100 100 extern void _pthread_set_self(void *); 101 101 extern void _init_cpu_capabilities(void); 102 - 103 - #ifdef DARLING 104 - extern void lkm_call(int nr, void* arg); 105 - #endif 106 102 107 103 kern_return_t 108 104 host_page_size(__unused host_t host, vm_size_t *out_page_size) ··· 148 144 149 145 #ifdef DARLING 150 146 int _mach_fork_parent(void) { 151 - lkm_call(NR_fork_wait_for_child, NULL); 147 + if (dserver_rpc_fork_wait_for_child() < 0) { 148 + __builtin_unreachable(); 149 + } 152 150 return 0; 153 151 }; 154 152 #endif
+30
src/startup/mldr/elfcalls/elfcalls.c
··· 9 9 #include "elfcalls.h" 10 10 #include "threads.h" 11 11 #include <sys/un.h> 12 + #include <sys/socket.h> 13 + #include <fcntl.h> 12 14 13 15 static void* dlopen_simple(const char* name) 14 16 { ··· 58 60 return &__dserver_socket_address_data; 59 61 }; 60 62 63 + static int __dserver_new_socket(void) { 64 + int new_rpc_fd = socket(AF_UNIX, SOCK_DGRAM, 0); 65 + if (new_rpc_fd < 0) { 66 + return -1; 67 + } 68 + 69 + // make it close-on-exec 70 + int fd_flags = fcntl(new_rpc_fd, F_GETFD); 71 + if (fd_flags < 0) { 72 + close(new_rpc_fd); 73 + return -1; 74 + } 75 + if (fcntl(new_rpc_fd, F_SETFD, fd_flags | FD_CLOEXEC) < 0) { 76 + close(new_rpc_fd); 77 + return -1; 78 + } 79 + 80 + // auto-bind it 81 + sa_family_t family = AF_UNIX; 82 + if (bind(new_rpc_fd, (const struct sockaddr*)&family, sizeof(family)) < 0) { 83 + close(new_rpc_fd); 84 + return -1; 85 + } 86 + 87 + return new_rpc_fd; 88 + }; 89 + 61 90 void elfcalls_make(struct elf_calls* calls) 62 91 { 63 92 calls->dlopen = dlopen_simple; ··· 89 118 *((void**)&calls->shm_unlink) = shm_unlink; 90 119 91 120 calls->dserver_socket_address = __dserver_socket_address; 121 + calls->dserver_new_socket = __dserver_new_socket; 92 122 }
+1
src/startup/mldr/elfcalls/elfcalls.h
··· 52 52 53 53 // darlingserver RPC info 54 54 const void* (*dserver_socket_address)(void); 55 + int (*dserver_new_socket)(void); 55 56 }; 56 57 57 58 #endif