this repo has no description
1
fork

Configure Feed

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

Build some missing libm funcs Seemingly working pthread_cond

+470 -39
+3
src/kernel/emulation/linux/CMakeLists.txt
··· 160 160 bsdthread/pthread_kill.c 161 161 psynch/psynch_mutexwait.c 162 162 psynch/psynch_mutexdrop.c 163 + psynch/psynch_cvwait.c 164 + psynch/psynch_cvbroad.c 165 + psynch/psynch_cvsignal.c 163 166 syscalls-table.S 164 167 ) 165 168
+27
src/kernel/emulation/linux/psynch/psynch_cvbroad.c
··· 1 + #include "psynch_cvbroad.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <asm/unistd.h> 5 + #include "../../../mach_server/client/lkm.h" 6 + #include "../../../../lkm/api.h" 7 + #include "../simple.h" 8 + 9 + long sys_psynch_cvbroad(void* cv, uint32_t cvgen, uint32_t diffgen, void* mutex, uint32_t mgen, 10 + uint32_t ugen, uint64_t tid, uint32_t flags) 11 + { 12 + struct psynch_cvbroad_args args = { 13 + .cv = cv, 14 + .cvgen = cvgen, 15 + .diffgen = diffgen, 16 + .mutex = mutex, 17 + .mgen = mgen, 18 + .ugen = ugen, 19 + .tid = tid, 20 + .flags = flags, 21 + }; 22 + 23 + // __simple_printf("sys_psynch_mutexwait(mutex=%p, mgen=%x)\n", mutex, mgen); 24 + 25 + return lkm_call(NR_psynch_cvbroad_trap, &args); 26 + } 27 +
+9
src/kernel/emulation/linux/psynch/psynch_cvbroad.h
··· 1 + #ifndef LINUX_PSYNCH_CVBROAD_H 2 + #define LINUX_PSYNCH_CVBROAD_H 3 + #include <stdint.h> 4 + 5 + long sys_psynch_cvbroad(void* cv, uint32_t cvgen, uint32_t diffgen, void* mutex, uint32_t mgen, 6 + uint32_t ugen, uint64_t tid, uint32_t flags); 7 + 8 + #endif 9 +
+27
src/kernel/emulation/linux/psynch/psynch_cvsignal.c
··· 1 + #include "psynch_cvsignal.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <asm/unistd.h> 5 + #include "../../../mach_server/client/lkm.h" 6 + #include "../../../../lkm/api.h" 7 + #include "../simple.h" 8 + 9 + long sys_psynch_cvsignal(void* cv, uint32_t cvgen, uint32_t cvugen, void* mutex, uint32_t mgen, 10 + uint32_t ugen, int thread_port, uint32_t flags) 11 + { 12 + struct psynch_cvsignal_args args = { 13 + .cv = cv, 14 + .cvgen = cvgen, 15 + .cvugen = cvugen, 16 + .mutex = mutex, 17 + .mgen = mgen, 18 + .ugen = ugen, 19 + .thread_port = thread_port, 20 + .flags = flags, 21 + }; 22 + 23 + // __simple_printf("sys_psynch_mutexwait(mutex=%p, mgen=%x)\n", mutex, mgen); 24 + 25 + return lkm_call(NR_psynch_cvsignal_trap, &args); 26 + } 27 +
+9
src/kernel/emulation/linux/psynch/psynch_cvsignal.h
··· 1 + #ifndef LINUX_PSYNCH_CVSIGNAL_H 2 + #define LINUX_PSYNCH_CVSIGNAL_H 3 + #include <stdint.h> 4 + 5 + long sys_psynch_cvsignal(void* cv, uint32_t cvgen, uint32_t cvugen, void* mutex, uint32_t mgen, 6 + uint32_t ugen, int thread_port, uint32_t flags); 7 + 8 + #endif 9 +
+29
src/kernel/emulation/linux/psynch/psynch_cvwait.c
··· 1 + #include "psynch_cvwait.h" 2 + #include "../base.h" 3 + #include "../errno.h" 4 + #include <asm/unistd.h> 5 + #include "../../../mach_server/client/lkm.h" 6 + #include "../../../../lkm/api.h" 7 + #include "../simple.h" 8 + 9 + // FIXME: __hack = result of 'call' instruction used to invoke Darling syscalls 10 + 11 + long sys_psynch_cvwait(void* cv, uint32_t cvgen, uint32_t cvugen, void* mutex, uint32_t mgen, 12 + uint32_t ugen, void* __hack, uint64_t sec, uint64_t usec) 13 + { 14 + struct psynch_cvwait_args args = { 15 + .cv = cv, 16 + .cvgen = cvgen, 17 + .cvugen = cvugen, 18 + .mutex = mutex, 19 + .mgen = mgen, 20 + .ugen = ugen, 21 + .sec = sec, 22 + .usec = usec, 23 + }; 24 + 25 + // __simple_printf("sys_psynch_mutexwait(mutex=%p, mgen=%x)\n", mutex, mgen); 26 + 27 + return lkm_call(NR_psynch_cvwait_trap, &args); 28 + } 29 +
+9
src/kernel/emulation/linux/psynch/psynch_cvwait.h
··· 1 + #ifndef LINUX_PSYNCH_CVWAIT_H 2 + #define LINUX_PSYNCH_CVWAIT_H 3 + #include <stdint.h> 4 + 5 + long sys_psynch_cvwait(void* cv, uint32_t cvgen, uint32_t cvugen, void* mutex, uint32_t mgen, 6 + uint32_t ugen, void* __hack, uint64_t sec, uint64_t usec); 7 + 8 + #endif 9 +
+4 -2
src/kernel/emulation/linux/syscalls-table.S
··· 7 7 movq (%r10,%rax,8), %r10 8 8 test %r10, %r10 9 9 jz .no_sys 10 - call *%r10 11 - ret 10 + jmp *%r10 11 + // Breaks 6+ arg syscalls 12 + // call *%r10 13 + // ret 12 14 .no_sys: 13 15 movq %rax, %rdi 14 16 call __unknown_syscall@PLT
+6
src/kernel/emulation/linux/syscalls.c
··· 115 115 #include "select/poll.h" 116 116 #include "psynch/psynch_mutexwait.h" 117 117 #include "psynch/psynch_mutexdrop.h" 118 + #include "psynch/psynch_cvwait.h" 119 + #include "psynch/psynch_cvsignal.h" 120 + #include "psynch/psynch_cvbroad.h" 118 121 #include "bsdthread/workq_kernreturn.h" 119 122 #include "bsdthread/workq_open.h" 120 123 #include "bsdthread/pthread_kill.h" ··· 238 241 [244] = sys_posix_spawn, 239 242 [301] = sys_psynch_mutexwait, 240 243 [302] = sys_psynch_mutexdrop, 244 + [303] = sys_psynch_cvbroad, 245 + [304] = sys_psynch_cvsignal, 246 + [305] = sys_psynch_cvwait, 241 247 [328] = sys_pthread_kill, 242 248 [329] = sys_sigprocmask, // __pthread_sigmask 243 249 [331] = sys_disable_threadsignal,
+3 -3
src/kernel/libsyscall/CMakeLists.txt
··· 104 104 wrappers/cancelable/fcntl.c 105 105 wrappers/cancelable/fcntl-cancel.c 106 106 wrappers/cancelable/select.c # defined in sys_x86-64/ 107 - #wrappers/cancelable/select-cancel.c 107 + wrappers/cancelable/select-cancel.c 108 108 wrappers/cancelable/sigsuspend.c 109 109 wrappers/cancelable/sigsuspend-cancel.c 110 110 ··· 968 968 mig(mach/vm_map.defs) 969 969 970 970 set_source_files_properties(custom/errno.c PROPERTIES COMPILE_FLAGS "-no-integrated-as") 971 + set_source_files_properties(${syscall_legacy_sources} PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE") 971 972 set_source_files_properties(wrappers/legacy/select-pre1050.c PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE -DSYSCALL_PRE1050") 972 - set_source_files_properties(wrappers/legacy/select.c PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE") 973 - #set_source_files_properties(wrappers/cancelable/select-cancel.c PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE") 973 + set_source_files_properties(wrappers/cancelable/select-cancel.c PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE") 974 974 set_source_files_properties(wrappers/cancelable/select.c PROPERTIES COMPILE_FLAGS "-U_DARWIN_C_SOURCE") 975 975 976 976 foreach (file IN ITEMS ${syscall_legacy_sources})
+5 -2
src/libm/CMakeLists.txt
··· 4 4 enable_language(C ASM) 5 5 6 6 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse -msse2 -msse3 -w") 7 - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__DARWIN_UNIX03 -fPIC -w") # -DBUILDING_FOR_CARBONCORE_LEGACY") 7 + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__DARWIN_UNIX03 -fPIC -w -DBUILDING_FOR_CARBONCORE_LEGACY") # -DBUILDING_FOR_CARBONCORE_LEGACY") 8 8 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -nostdlib -Wl,--version-script=${DARLING_TOP_DIRECTORY}/darwin.map") 9 9 10 10 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Source/Intel) ··· 145 145 SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 146 146 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 147 147 148 - add_library(system_m SHARED ${libm_sources}) 148 + add_library(system_m_extra OBJECT Source/Intel/xmm_misc.c) 149 + set_target_properties(system_m_extra PROPERTIES COMPILE_FLAGS "-UBUILDING_FOR_CARBONCORE_LEGACY") 150 + 151 + add_library(system_m SHARED ${libm_sources} $<TARGET_OBJECTS:system_m_extra>) 149 152 150 153 install(TARGETS system_m DESTINATION lib${SUFFIX}/darling) 151 154
+2 -1
src/lkm/Makefile
··· 22 22 mig/taskServer.o mig/thread_actServer.o \ 23 23 servers/thread_act.o \ 24 24 mig/duct.o proc_entry.o bsd_ioctl.o \ 25 - psynch/psynch_mutex.o psynch/pthread_kill.o 25 + psynch/psynch_mutex.o psynch/pthread_kill.o \ 26 + psynch/psynch_cv.o 26 27 27 28 # Otherwise we were called directly from the command 28 29 # line; invoke the kernel build system.
+45 -1
src/lkm/api.h
··· 26 26 27 27 #define DARLING_MACH_API_BASE 0x1000 28 28 29 + #pragma pack (push, 1) 30 + 29 31 enum { NR_get_api_version = DARLING_MACH_API_BASE, 30 32 NR_mach_reply_port, 31 33 NR__kernelrpc_mach_port_mod_refs, ··· 44 46 NR_bsd_ioctl_trap, 45 47 NR_thread_self_trap, 46 48 NR_bsdthread_terminate_trap, 47 - NR_psynch_mutexwait_trap, 49 + NR_psynch_mutexwait_trap, // 0x12 48 50 NR_psynch_mutexdrop_trap, 49 51 NR_pthread_kill_trap, 52 + NR_psynch_cvwait_trap, // 0x15 53 + NR_psynch_cvsignal_trap, 54 + NR_psynch_cvbroad_trap, 50 55 }; 51 56 52 57 struct mach_port_mod_refs_args ··· 173 178 int thread_port; 174 179 int sig; 175 180 }; 181 + 182 + struct psynch_cvwait_args 183 + { 184 + uint64_t cv; 185 + uint32_t cvgen; 186 + uint32_t cvugen; 187 + uint64_t mutex; 188 + uint32_t mgen; 189 + uint32_t ugen; 190 + uint64_t sec; 191 + /* Called usec, but seems to contain nsec */ 192 + uint64_t usec; 193 + }; 194 + 195 + struct psynch_cvsignal_args 196 + { 197 + uint64_t cv; 198 + uint32_t cvgen; 199 + uint32_t cvugen; 200 + uint64_t mutex; 201 + uint32_t mgen; 202 + uint32_t ugen; 203 + int thread_port; 204 + uint32_t flags; 205 + }; 206 + 207 + struct psynch_cvbroad_args 208 + { 209 + uint64_t cv; 210 + uint32_t cvgen; 211 + uint32_t diffgen; 212 + uint64_t mutex; 213 + uint32_t mgen; 214 + uint32_t ugen; 215 + uint64_t tid; 216 + uint32_t flags; 217 + }; 218 + 219 + #pragma pack (pop) 176 220 177 221 #endif
+3
src/lkm/darling_task.h
··· 41 41 42 42 spinlock_t mutex_wq_lock; 43 43 DECLARE_HASHTABLE(mutex_wq, 8); 44 + 45 + spinlock_t cv_wq_lock; 46 + DECLARE_HASHTABLE(cv_wq, 8); 44 47 }; 45 48 46 49 typedef struct mach_task mach_task_t;
+3
src/lkm/ipc_server.c
··· 54 54 hash_init(task->mutex_wq); 55 55 spin_lock_init(&task->mutex_wq_lock); 56 56 57 + hash_init(task->cv_wq); 58 + spin_lock_init(&task->cv_wq_lock); 59 + 57 60 ipc_space_init(&task->namespace); 58 61 59 62 port->is_server_port = true;
+209
src/lkm/psynch/psynch_cv.c
··· 1 + /* 2 + * Darling Mach Linux Kernel Module 3 + * Copyright (C) 2015 Lubos Dolezel 4 + * 5 + * This program is free software; you can redistribute it and/or 6 + * modify it under the terms of the GNU General Public License 7 + * as published by the Free Software Foundation; either version 2 8 + * of the License, or (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 + */ 19 + #include "psynch_cv.h" 20 + #include "../mach_includes.h" 21 + #include <linux/sched.h> 22 + #include <linux/wait.h> 23 + #include <linux/list.h> 24 + #include <linux/uaccess.h> 25 + #include <linux/slab.h> 26 + #include "../darling_task.h" 27 + #include "../debug.h" 28 + #include <stdbool.h> 29 + #include <linux/jiffies.h> 30 + #include "psynch_mutex.h" 31 + 32 + struct pthread_cv 33 + { 34 + struct hlist_node node; 35 + uint64_t pointer; 36 + wait_queue_head_t wq; 37 + struct list_head waiting; 38 + unsigned int refcount; 39 + }; 40 + typedef struct pthread_cv pthread_cv_t; 41 + 42 + struct pthread_waiter 43 + { 44 + struct list_head entry; 45 + int wakeup; 46 + uint32_t 47 + }; 48 + 49 + static pthread_cv_t* cv_get(mach_task_t* task, uint64_t address, 50 + bool no_create); 51 + static void cv_put(mach_task_t* task, pthread_cv_t* cv); 52 + 53 + int psynch_cvwait_trap(mach_task_t* task, 54 + struct psynch_cvwait_args* in_args) 55 + { 56 + struct psynch_cvwait_args args; 57 + struct pthread_waiter waiter; 58 + pthread_cv_t* cv; 59 + int retval; 60 + 61 + if (copy_from_user(&args, in_args, sizeof(args))) 62 + return -EFAULT; 63 + 64 + debug_msg("psynch_cvwait(): cv=%p, mutex=%p\n", 65 + args.cv, args.mutex); 66 + if (args.mutex != 0) 67 + psynch_mutexdrop(task, args.mutex, args.mgen, args.ugen); 68 + 69 + spin_lock(&task->cv_wq_lock); 70 + 71 + cv = cv_get(task, args.cv, false); 72 + BUG_ON(cv == NULL); 73 + 74 + waiter.wakeup = 0; 75 + list_add_tail(&waiter.entry, &cv->waiting); 76 + 77 + spin_unlock(&task->cv_wq_lock); 78 + 79 + // NOTE: args.usec seems to actually contain nsecs 80 + debug_msg("\tWaiting(%p)\n", &waiter); 81 + if (args.sec > 0 || args.usec > 0) 82 + { 83 + retval = wait_event_interruptible_timeout(cv->wq, waiter.wakeup != 0, 84 + usecs_to_jiffies(args.sec * USEC_PER_SEC + args.usec / 1000)); 85 + } 86 + else 87 + { 88 + retval = wait_event_interruptible(cv->wq, waiter.wakeup != 0); 89 + } 90 + 91 + debug_msg("\tWoken up(%p)\n", &waiter); 92 + 93 + spin_lock(&task->cv_wq_lock); 94 + cv_put(task, cv); 95 + spin_unlock(&task->cv_wq_lock); 96 + 97 + return retval; 98 + } 99 + 100 + int psynch_cvbroad_trap(mach_task_t* task, 101 + struct psynch_cvbroad_args* in_args) 102 + { 103 + struct psynch_cvbroad_args args; 104 + pthread_cv_t* cv; 105 + struct list_head* item; 106 + 107 + if (copy_from_user(&args, in_args, sizeof(args))) 108 + return -EFAULT; 109 + 110 + debug_msg("psynch_cvbroad_trap(): cv=%p\n", args.cv); 111 + spin_lock(&task->cv_wq_lock); 112 + 113 + cv = cv_get(task, args.cv, true); 114 + 115 + if (cv == NULL) 116 + { 117 + // Nobody is waiting 118 + spin_unlock(&task->cv_wq_lock); 119 + return 0; 120 + } 121 + 122 + list_for_each(item, &cv->waiting) 123 + { 124 + struct pthread_waiter* waiter; 125 + 126 + waiter = list_entry(item, typeof(*waiter), entry); 127 + debug_msg("\tWake up waiter %p\n", waiter); 128 + waiter->wakeup = 1; 129 + } 130 + INIT_LIST_HEAD(&cv->waiting); 131 + 132 + wake_up_interruptible(&cv->wq); 133 + cv_put(task, cv); 134 + spin_unlock(&task->cv_wq_lock); 135 + 136 + return 0x100 /* PTHRW_INC */; 137 + } 138 + 139 + int psynch_cvsignal_trap(mach_task_t* task, 140 + struct psynch_cvsignal_args* in_args) 141 + { 142 + struct psynch_cvsignal_args args; 143 + pthread_cv_t* cv; 144 + struct pthread_waiter* waiter; 145 + 146 + if (copy_from_user(&args, in_args, sizeof(args))) 147 + return -EFAULT; 148 + 149 + debug_msg("psynch_cvsignal_trap(): cv=%p\n", args.cv); 150 + 151 + spin_lock(&task->cv_wq_lock); 152 + 153 + cv = cv_get(task, args.cv, true); 154 + 155 + if (cv == NULL) 156 + { 157 + // Nobody is waiting 158 + spin_unlock(&task->cv_wq_lock); 159 + return 0; 160 + } 161 + 162 + waiter = list_first_entry(&cv->waiting, typeof(*waiter), entry); 163 + waiter->wakeup = 1; 164 + debug_msg("\tWake up waiter %p\n", waiter); 165 + list_del(&waiter->entry); 166 + 167 + wake_up_interruptible(&cv->wq); 168 + cv_put(task, cv); 169 + spin_unlock(&task->cv_wq_lock); 170 + 171 + return 0x100 /* PTHRW_INC */; 172 + } 173 + 174 + pthread_cv_t* cv_get(mach_task_t* task, uint64_t address, bool no_create) 175 + { 176 + pthread_cv_t* node; 177 + hash_for_each_possible(task->cv_wq, node, node, address) 178 + { 179 + if (node->pointer != address) 180 + continue; 181 + 182 + node->refcount++; 183 + return node; 184 + } 185 + 186 + if (no_create) 187 + return NULL; 188 + 189 + node = (pthread_cv_t*) kmalloc(sizeof(pthread_cv_t), GFP_KERNEL); 190 + node->refcount = 1; 191 + node->pointer = address; 192 + 193 + init_waitqueue_head(&node->wq); 194 + INIT_LIST_HEAD(&node->waiting); 195 + hash_add(task->cv_wq, &node->node, address); 196 + 197 + return node; 198 + } 199 + 200 + void cv_put(mach_task_t* task, pthread_cv_t* cv) 201 + { 202 + cv->refcount--; 203 + 204 + if (cv->refcount == 0) 205 + { 206 + hash_del(&cv->node); 207 + kfree(cv); 208 + } 209 + }
+33
src/lkm/psynch/psynch_cv.h
··· 1 + /* 2 + * Darling Mach Linux Kernel Module 3 + * Copyright (C) 2015 Lubos Dolezel 4 + * 5 + * This program is free software; you can redistribute it and/or 6 + * modify it under the terms of the GNU General Public License 7 + * as published by the Free Software Foundation; either version 2 8 + * of the License, or (at your option) any later version. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this program; if not, write to the Free Software 17 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 + */ 19 + 20 + #ifndef PSYNCH_CV_H 21 + #define PSYNCH_CV_H 22 + #include "../api.h" 23 + #include "../ipc_types.h" 24 + 25 + int psynch_cvwait_trap(mach_task_t* task, 26 + struct psynch_cvwait_args* args); 27 + int psynch_cvbroad_trap(mach_task_t* task, 28 + struct psynch_cvbroad_args* args); 29 + int psynch_cvsignal_trap(mach_task_t* task, 30 + struct psynch_cvsignal_args* args); 31 + 32 + #endif /* PSYNCH_CV_H */ 33 +
+15 -7
src/lkm/psynch/psynch_mutex.c
··· 65 65 66 66 if (mutex->mgen != 0) 67 67 { 68 - spin_unlock(&task->mutex_wq_lock); 68 + retval = mutex->mgen; 69 69 70 70 // Put the mutex twice, because the waker did not put the mutex 71 71 // in order to keep the information around 72 72 mutex_put(task, mutex); 73 73 mutex_put(task, mutex); 74 + 75 + spin_unlock(&task->mutex_wq_lock); 74 76 75 - retval = mutex->mgen; 76 77 goto out; 77 78 } 78 79 ··· 103 104 int psynch_mutexdrop_trap(mach_task_t* task, 104 105 struct psynch_mutexdrop_args* in_args) 105 106 { 106 - pthread_mutex_t* mutex; 107 107 struct psynch_mutexdrop_args args; 108 108 109 109 if (copy_from_user(&args, in_args, sizeof(args))) 110 110 return -EFAULT; 111 111 112 - debug_msg("psynch_mutexdrop_trap(%d): mutex=0x%llx, mgen=0x%x\n", 113 - current->pid, args.mutex, args.mgen); 112 + return psynch_mutexdrop(task, args.mutex, args.mgen, args.ugen); 113 + } 114 + 115 + int psynch_mutexdrop(mach_task_t* task, uint64_t in_mutex, uint32_t mgen, 116 + uint32_t ugen) 117 + { 118 + pthread_mutex_t* mutex; 119 + 120 + debug_msg("psynch_mutexdrop(%d): mutex=0x%llx, mgen=0x%x\n", 121 + current->pid, in_mutex, mgen); 114 122 spin_lock(&task->mutex_wq_lock); 115 123 116 - mutex = mutex_get(task, args.mutex); 117 - mutex->mgen = args.mgen; 124 + mutex = mutex_get(task, in_mutex); 125 + mutex->mgen = mgen; 118 126 119 127 if (!list_empty(&mutex->waiting)) 120 128 {
+2
src/lkm/psynch/psynch_mutex.h
··· 26 26 struct psynch_mutexwait_args* args); 27 27 int psynch_mutexdrop_trap(mach_task_t* task, 28 28 struct psynch_mutexdrop_args* args); 29 + int psynch_mutexdrop(mach_task_t* task, uint64_t mutex, uint32_t mgen, 30 + uint32_t ugen); 29 31 30 32 #endif /* PSYNCH_MUTEX_H */ 31 33
+27 -23
src/lkm/traps.c
··· 44 44 #include "primitives/semaphore.h" 45 45 #include "psynch/psynch_mutex.h" 46 46 #include "psynch/pthread_kill.h" 47 + #include "psynch/psynch_cv.h" 47 48 48 49 MODULE_LICENSE("GPL"); 49 50 ··· 57 58 .owner = THIS_MODULE 58 59 }; 59 60 60 - #define sc(n) n-DARLING_MACH_API_BASE 61 + #define TRAP(num, impl) [num - DARLING_MACH_API_BASE] = (trap_handler) impl 61 62 62 63 static const trap_handler mach_traps[30] = { 63 - [sc(NR_get_api_version)] = (trap_handler) mach_get_api_version, 64 - [sc(NR_mach_reply_port)] = (trap_handler) mach_reply_port_trap, 65 - [sc(NR__kernelrpc_mach_port_mod_refs)] = (trap_handler) _kernelrpc_mach_port_mod_refs_trap, 66 - [sc(NR_task_self_trap)] = (trap_handler) mach_task_self_trap, 67 - [sc(NR__kernelrpc_mach_port_allocate)] = (trap_handler) _kernelrpc_mach_port_allocate_trap, 68 - [sc(NR_mach_msg_overwrite_trap)] = (trap_handler) mach_msg_overwrite_trap, 69 - [sc(NR_host_self_trap)] = (trap_handler) mach_host_self_trap, 70 - [sc(NR__kernelrpc_mach_port_deallocate)] = (trap_handler) _kernelrpc_mach_port_deallocate_trap, 71 - [sc(NR__kernelrpc_mach_port_destroy)] = (trap_handler) _kernelrpc_mach_port_destroy_trap, 72 - [sc(NR_semaphore_signal_trap)] = (trap_handler) semaphore_signal_trap, 73 - [sc(NR_semaphore_signal_all_trap)] = (trap_handler) semaphore_signal_all_trap, 74 - [sc(NR_semaphore_wait_trap)] = (trap_handler) semaphore_wait_trap, 75 - [sc(NR_semaphore_wait_signal_trap)] = (trap_handler) semaphore_wait_signal_trap, 76 - [sc(NR_semaphore_timedwait_signal_trap)] = (trap_handler) semaphore_timedwait_signal_trap, 77 - [sc(NR_semaphore_timedwait_trap)] = (trap_handler) semaphore_timedwait_trap, 78 - [sc(NR_bsd_ioctl_trap)] = (trap_handler) bsd_ioctl_trap, 79 - [sc(NR_thread_self_trap)] = (trap_handler) mach_thread_self_trap, 80 - [sc(NR_bsdthread_terminate_trap)] = (trap_handler) bsdthread_terminate_trap, 81 - [sc(NR_psynch_mutexwait_trap)] = (trap_handler) psynch_mutexwait_trap, 82 - [sc(NR_psynch_mutexdrop_trap)] = (trap_handler) psynch_mutexdrop_trap, 83 - [sc(NR_pthread_kill_trap)] = (trap_handler) pthread_kill_trap, 64 + TRAP(NR_get_api_version, mach_get_api_version), 65 + TRAP(NR_mach_reply_port, mach_reply_port_trap), 66 + TRAP(NR__kernelrpc_mach_port_mod_refs, _kernelrpc_mach_port_mod_refs_trap), 67 + TRAP(NR_task_self_trap, mach_task_self_trap), 68 + TRAP(NR__kernelrpc_mach_port_allocate, _kernelrpc_mach_port_allocate_trap), 69 + TRAP(NR_mach_msg_overwrite_trap, mach_msg_overwrite_trap), 70 + TRAP(NR_host_self_trap, mach_host_self_trap), 71 + TRAP(NR__kernelrpc_mach_port_deallocate, _kernelrpc_mach_port_deallocate_trap), 72 + TRAP(NR__kernelrpc_mach_port_destroy, _kernelrpc_mach_port_destroy_trap), 73 + TRAP(NR_semaphore_signal_trap, semaphore_signal_trap), 74 + TRAP(NR_semaphore_signal_all_trap, semaphore_signal_all_trap), 75 + TRAP(NR_semaphore_wait_trap, semaphore_wait_trap), 76 + TRAP(NR_semaphore_wait_signal_trap, semaphore_wait_signal_trap), 77 + TRAP(NR_semaphore_timedwait_signal_trap, semaphore_timedwait_signal_trap), 78 + TRAP(NR_semaphore_timedwait_trap, semaphore_timedwait_trap), 79 + TRAP(NR_bsd_ioctl_trap, bsd_ioctl_trap), 80 + TRAP(NR_thread_self_trap, mach_thread_self_trap), 81 + TRAP(NR_bsdthread_terminate_trap, bsdthread_terminate_trap), 82 + TRAP(NR_psynch_mutexwait_trap, psynch_mutexwait_trap), 83 + TRAP(NR_psynch_mutexdrop_trap, psynch_mutexdrop_trap), 84 + TRAP(NR_pthread_kill_trap, pthread_kill_trap), 85 + TRAP(NR_psynch_cvwait_trap, psynch_cvwait_trap), 86 + TRAP(NR_psynch_cvsignal_trap, psynch_cvsignal_trap), 87 + TRAP(NR_psynch_cvbroad_trap, psynch_cvbroad_trap), 84 88 }; 85 - #undef sc 89 + #undef TRAP 86 90 87 91 static struct miscdevice mach_dev = { 88 92 MISC_DYNAMIC_MINOR,