this repo has no description
1
fork

Configure Feed

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

Update darlingserver; implement the client side of S2C

+134 -5
+1
src/kernel/emulation/linux/CMakeLists.txt
··· 22 22 ${CMAKE_BINARY_DIR}/src/kernel/libsyscall 23 23 ${CMAKE_CURRENT_BINARY_DIR} 24 24 ${CMAKE_BINARY_DIR}/src/external/darlingserver/include 25 + ${CMAKE_SOURCE_DIR}/src/external/darlingserver/include 25 26 ) 26 27 27 28 mig(signal/mach_exc.defs)
+1
src/kernel/emulation/linux/mach/CMakeLists.txt
··· 9 9 ${CMAKE_SOURCE_DIR}/src/startup 10 10 ${CMAKE_BINARY_DIR}/src/startup 11 11 ${CMAKE_BINARY_DIR}/src/external/darlingserver/include 12 + ${CMAKE_SOURCE_DIR}/src/external/darlingserver/include 12 13 ) 13 14 14 15 set(mach_server_client_sources
+116 -4
src/kernel/emulation/linux/resources/dserver-rpc-defs.h
··· 1 1 #include "../network/recvmsg.h" 2 2 #include "../network/sendmsg.h" 3 3 #include "../network/getsockopt.h" 4 + #include "../network/sendto.h" 4 5 #include <stddef.h> 5 6 #include <sys/_types/_iovec_t.h> 6 7 #include <linux-syscalls/linux.h> ··· 8 9 #include "../duct_errno.h" 9 10 #include "../mach/lkm.h" 10 11 #include "../elfcalls_wrapper.h" 12 + #include "../simple.h" 13 + 14 + #include <darlingserver/rpc-supplement.h> 15 + 16 + #ifndef DSERVER_RPC_HOOKS_ARCHITECTURE 17 + #define DSERVER_RPC_HOOKS_ARCHITECTURE 1 18 + enum dserver_rpc_architecture { 19 + dserver_rpc_architecture_invalid, 20 + dserver_rpc_architecture_i386, 21 + dserver_rpc_architecture_x86_64, 22 + dserver_rpc_architecture_arm32, 23 + dserver_rpc_architecture_arm64, 24 + }; 25 + 26 + typedef enum dserver_rpc_architecture dserver_rpc_architecture_t; 27 + #endif 11 28 12 29 extern void* memcpy(void* dest, const void* src, __SIZE_TYPE__ n); 13 30 ··· 30 47 #define DSERVER_RPC_HOOKS_CMSG_DATA(cmsghdr) (&(cmsghdr)->cmsg_data[0]) 31 48 #define DSERVER_RPC_HOOKS_ATTRIBUTE static 32 49 33 - #define dserver_rpc_hooks_get_pid() ((pid_t)LINUX_SYSCALL0(__NR_getpid)) 50 + #define dserver_rpc_hooks_get_pid() ((int)LINUX_SYSCALL0(__NR_getpid)) 34 51 35 - #define dserver_rpc_hooks_get_tid() ((pid_t)LINUX_SYSCALL(__NR_gettid)) 52 + #define dserver_rpc_hooks_get_tid() ((int)LINUX_SYSCALL(__NR_gettid)) 36 53 37 54 #if __x86_64__ 38 55 #define dserver_rpc_hooks_get_architecture() dserver_rpc_architecture_x86_64 ··· 61 78 }; 62 79 63 80 static long int dserver_rpc_hooks_receive_message(int socket, dserver_rpc_hooks_msghdr_t* out_message) { 81 + long int ret = 0; 82 + 83 + retry: 64 84 #ifdef __NR_socketcall 65 - return LINUX_SYSCALL(__NR_socketcall, LINUX_SYS_RECVMSG, ((long[6]) { socket, out_message, 0 })); 85 + ret = LINUX_SYSCALL(__NR_socketcall, LINUX_SYS_RECVMSG, ((long[6]) { socket, out_message, 0 })); 66 86 #else 67 - return LINUX_SYSCALL(__NR_recvmsg, socket, out_message, 0); 87 + ret = LINUX_SYSCALL(__NR_recvmsg, socket, out_message, 0); 68 88 #endif 89 + if (ret < 0) { 90 + return ret; 91 + } 92 + 93 + if (ret >= sizeof(dserver_s2c_callhdr_t)) { 94 + dserver_s2c_callhdr_t* callhdr = out_message->msg_iov->iov_base; 95 + 96 + if (callhdr->call_number == 0x52cca11) { 97 + // this is an S2C call 98 + // handle it 99 + switch (callhdr->s2c_number) { 100 + case dserver_s2c_msgnum_mmap: { 101 + dserver_s2c_call_mmap_t* mmap_call = out_message->msg_iov->iov_base; 102 + uint64_t call_ret; 103 + dserver_s2c_reply_mmap_t reply = { 104 + .header.call_number = 0x52cca11, 105 + .header.pid = dserver_rpc_hooks_get_pid(), 106 + .header.tid = dserver_rpc_hooks_get_tid(), 107 + .header.architecture = dserver_rpc_hooks_get_architecture(), 108 + .header.s2c_number = dserver_s2c_msgnum_mmap, 109 + .address = 0, 110 + .errno_result = 0, 111 + }; 112 + 113 + #ifdef __NR_mmap2 114 + call_ret = (void*)LINUX_SYSCALL(__NR_mmap2, mmap_call->address, mmap_call->length, mmap_call->protection, mmap_call->flags, mmap_call->fd, mmap_call->offset / 4096); 115 + #else 116 + call_ret = (void*)LINUX_SYSCALL(__NR_mmap, mmap_call->address, mmap_call->length, mmap_call->protection, mmap_call->flags, mmap_call->fd, mmap_call->offset); 117 + #endif 118 + 119 + if ((unsigned long)call_ret > (unsigned long)-4096) { 120 + // this is actually an errno 121 + reply.errno_result = -(int)call_ret; 122 + reply.address = (void*)(-1); 123 + } else { 124 + reply.address = call_ret; 125 + } 126 + 127 + #ifdef __NR_socketcall 128 + ret = LINUX_SYSCALL(__NR_socketcall, LINUX_SYS_SENDTO, ((long[6]) { socket, &reply, sizeof(reply), 0, dserver_rpc_hooks_get_server_address(), dserver_rpc_hooks_get_server_address_length() })); 129 + #else 130 + ret = LINUX_SYSCALL(__NR_sendto, socket, &reply, sizeof(reply), 0, dserver_rpc_hooks_get_server_address(), dserver_rpc_hooks_get_server_address_length()); 131 + #endif 132 + if (ret < 0) { 133 + return ret; 134 + } 135 + } break; 136 + 137 + case dserver_s2c_msgnum_munmap: { 138 + dserver_s2c_call_munmap_t* munmap_call = out_message->msg_iov->iov_base; 139 + int call_ret; 140 + dserver_s2c_reply_munmap_t reply = { 141 + .header.call_number = 0x52cca11, 142 + .header.pid = dserver_rpc_hooks_get_pid(), 143 + .header.tid = dserver_rpc_hooks_get_tid(), 144 + .header.architecture = dserver_rpc_hooks_get_architecture(), 145 + .header.s2c_number = dserver_s2c_msgnum_munmap, 146 + .return_value = 0, 147 + .errno_result = 0, 148 + }; 149 + 150 + call_ret = LINUX_SYSCALL2(__NR_munmap, munmap_call->address, munmap_call->length); 151 + 152 + if (call_ret < 0) { 153 + reply.return_value = -1; 154 + reply.errno_result = -call_ret; 155 + } else { 156 + reply.return_value = call_ret; 157 + } 158 + 159 + #ifdef __NR_socketcall 160 + ret = LINUX_SYSCALL(__NR_socketcall, LINUX_SYS_SENDTO, ((long[6]) { socket, &reply, sizeof(reply), 0, dserver_rpc_hooks_get_server_address(), dserver_rpc_hooks_get_server_address_length() })); 161 + #else 162 + ret = LINUX_SYSCALL(__NR_sendto, socket, &reply, sizeof(reply), 0, dserver_rpc_hooks_get_server_address(), dserver_rpc_hooks_get_server_address_length()); 163 + #endif 164 + if (ret < 0) { 165 + return ret; 166 + } 167 + } break; 168 + 169 + default: 170 + __simple_printf("Invalid S2C call number: %d", callhdr->s2c_number); 171 + __simple_abort(); 172 + } 173 + 174 + // go back and wait for another message 175 + // we'll stop once we receive a normal message (i.e. not an S2C call) 176 + goto retry; 177 + } 178 + } 179 + 180 + return ret; 69 181 }; 70 182 71 183 #define dserver_rpc_hooks_get_bad_message_status() (-LINUX_EBADMSG)
+1
src/kernel/libsyscall/CMakeLists.txt
··· 22 22 23 23 include_directories( 24 24 "${CMAKE_BINARY_DIR}/src/external/darlingserver/include" 25 + "${CMAKE_SOURCE_DIR}/src/external/darlingserver/include" 25 26 ) 26 27 27 28 set(LIBSYSCALL_MIGS
+1 -1
src/startup/CMakeLists.txt
··· 18 18 19 19 target_link_libraries(darling -lutil) 20 20 21 - include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/external/darlingserver/include) 21 + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_BINARY_DIR}/src/external/darlingserver/include ${CMAKE_SOURCE_DIR}/src/external/darlingserver/include) 22 22 23 23 install(TARGETS darling DESTINATION bin 24 24 PERMISSIONS
+14
src/startup/mldr/resources/dserver-rpc-defs.h
··· 5 5 #include <stdlib.h> 6 6 #include <string.h> 7 7 #include <errno.h> 8 + #include <stdio.h> 9 + 10 + #include <darlingserver/rpc-supplement.h> 8 11 9 12 #define dserver_rpc_hooks_msghdr_t struct msghdr 10 13 #define dserver_rpc_hooks_iovec_t struct iovec ··· 54 57 if (ret < 0) { 55 58 return -errno; 56 59 } 60 + 61 + if (ret >= sizeof(dserver_s2c_callhdr_t)) { 62 + dserver_s2c_callhdr_t* callhdr = out_message->msg_iov->iov_base; 63 + if (callhdr->call_number == 0x52cca11) { 64 + // this is an S2C call 65 + // mldr shouldn't need to be doing S2C calls 66 + fprintf(stderr, "mldr darlingserver RPC hooks received S2C call\n"); 67 + abort(); 68 + } 69 + } 70 + 57 71 return ret; 58 72 }; 59 73