1 #include <sys/cdefs.h>
2 #include <sys/types.h>
3 #include <sys/errno.h>
4
5 #include <mach/mach.h>
6 #include <mach/boolean.h>
7 #include <mach/mach_traps.h>
8 #include <mach/mach_init.h>
9 #include <mach/mach_types.h>
10 #include <mach/message.h>
11 #include <mach/mach_port.h>
12 #include <mach/mach_vm.h>
13 #include <stdbool.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16
17 #define HAVE_MACH
18 #include <pthread.h>
19
20 kern_return_t _kernelrpc_mach_port_allocate_trap(
21 ipc_space_t task,
22 mach_port_right_t right,
23 mach_port_name_t *name
24 );
25 kern_return_t _kernelrpc_mach_port_deallocate_trap(
26 ipc_space_t task,
27 mach_port_name_t name
28 );
29
30 kern_return_t _kernelrpc_mach_port_insert_right_trap(
31 ipc_space_t task,
32 mach_port_name_t name,
33 mach_port_t poly,
34 mach_msg_type_name_t polyPoly
35 );
36 kern_return_t _kernelrpc_mach_port_extract_right_trap(
37 ipc_space_t task,
38 mach_port_name_t name,
39 mach_msg_type_name_t msgt_name,
40 mach_port_t *poly,
41 mach_msg_type_name_t *polyPoly
42 );
43
44 kern_return_t _kernelrpc_mach_vm_allocate_trap(
45 mach_vm_map_t target,
46 mach_vm_address_t *address,
47 mach_vm_size_t size,
48 int flags
49 );
50 kern_return_t _kernelrpc_mach_vm_deallocate_trap(
51 mach_vm_map_t target,
52 vm_address_t address,
53 mach_vm_size_t size
54 );
55 kern_return_t _kernelrpc_mach_vm_map_trap(
56 mach_vm_map_t target,
57 vm_address_t *address,
58 mach_vm_offset_t mask,
59 mach_vm_size_t size,
60 int flags,
61 vm_prot_t cur_protection
62 );
63
64 mach_port_t host_self_trap(void);
65 mach_port_t thread_self_trap(void);
66
67
68 kern_return_t vm_allocate(mach_port_name_t target, vm_address_t *addr, vm_size_t size, int flags);
69 kern_return_t vm_deallocate(mach_port_name_t target, vm_address_t addr, vm_size_t size);
70
71
72
73 kern_return_t
mach_port_allocate(mach_port_name_t target,mach_port_right_t right,mach_port_name_t * name)74 mach_port_allocate(mach_port_name_t target, mach_port_right_t right,
75 mach_port_name_t *name)
76 {
77
78 return (_kernelrpc_mach_port_allocate_trap(target, right, name));
79 }
80
81 kern_return_t
mach_port_deallocate(mach_port_name_t target,mach_port_name_t name)82 mach_port_deallocate(mach_port_name_t target, mach_port_name_t name)
83 {
84
85 return (_kernelrpc_mach_port_deallocate_trap(target, name));
86 }
87
88 kern_return_t
mach_port_extract_right(mach_port_name_t target __unused,mach_port_name_t name __unused,mach_msg_type_name_t msgt_name __unused,mach_port_name_t * poly __unused,mach_msg_type_name_t * polyPoly __unused)89 mach_port_extract_right(mach_port_name_t target __unused,
90 mach_port_name_t name __unused,
91 mach_msg_type_name_t msgt_name __unused,
92 mach_port_name_t *poly __unused,
93 mach_msg_type_name_t *polyPoly __unused)
94 {
95
96 /* no syscall for this - needs to go through the normal RPC glue */
97 return (ENOSYS);
98 }
99
100 kern_return_t
mach_port_insert_right(mach_port_name_t target,mach_port_name_t name,mach_port_name_t poly,mach_msg_type_name_t polyPoly)101 mach_port_insert_right(mach_port_name_t target, mach_port_name_t name,
102 mach_port_name_t poly, mach_msg_type_name_t polyPoly)
103 {
104
105 return (_kernelrpc_mach_port_insert_right_trap(target, name, poly, polyPoly));
106 }
107
108 kern_return_t
mach_port_mod_refs(mach_port_name_t target,mach_port_name_t name,mach_port_right_t right,mach_port_delta_t delta)109 mach_port_mod_refs(mach_port_name_t target, mach_port_name_t name,
110 mach_port_right_t right, mach_port_delta_t delta)
111 {
112
113 return (_kernelrpc_mach_port_mod_refs_trap(target, name, right, delta));
114 }
115
116 mach_port_t
mach_host_self(void)117 mach_host_self(void)
118 {
119
120 return (host_self_trap());
121 }
122
123 kern_return_t
mach_vm_allocate(mach_port_name_t target,vm_address_t * addr,vm_size_t size,int flags)124 mach_vm_allocate(mach_port_name_t target, vm_address_t *addr, vm_size_t size, int flags)
125 {
126
127 return (_kernelrpc_mach_vm_allocate_trap(target, addr, size, flags));
128 }
129
130 kern_return_t
vm_allocate(mach_port_name_t target,vm_address_t * addr,vm_size_t size,int flags)131 vm_allocate(mach_port_name_t target, vm_address_t *addr, vm_size_t size, int flags)
132 {
133
134 return (_kernelrpc_mach_vm_allocate_trap(target, addr, size, flags));
135 }
136
137 kern_return_t
mach_vm_deallocate(mach_port_name_t target,vm_address_t addr,vm_size_t size)138 mach_vm_deallocate(mach_port_name_t target, vm_address_t addr, vm_size_t size)
139 {
140
141 return (_kernelrpc_mach_vm_deallocate_trap(target, addr, size));
142 }
143
144 kern_return_t
vm_deallocate(mach_port_name_t target,vm_address_t addr,vm_size_t size)145 vm_deallocate(mach_port_name_t target, vm_address_t addr, vm_size_t size)
146 {
147
148 return (_kernelrpc_mach_vm_deallocate_trap(target, addr, size));
149 }
150
151
152 kern_return_t
mach_vm_map(mach_vm_map_t target,mach_vm_address_t * address,mach_vm_offset_t mask,mach_vm_size_t size,int flags,mem_entry_name_port_t object __unused,memory_object_offset_t offset __unused,boolean_t copy __unused,vm_prot_t cur_protection,vm_prot_t max_protection __unused,vm_inherit_t inheritance __unused)153 mach_vm_map(mach_vm_map_t target, mach_vm_address_t *address, mach_vm_offset_t mask,
154 mach_vm_size_t size, int flags, mem_entry_name_port_t object __unused,
155 memory_object_offset_t offset __unused, boolean_t copy __unused,
156 vm_prot_t cur_protection, vm_prot_t max_protection __unused,
157 vm_inherit_t inheritance __unused)
158 {
159
160 return (_kernelrpc_mach_vm_map_trap(target, address, size, mask, flags, cur_protection));
161 }
162
163 kern_return_t
mach_port_move_member(mach_port_name_t target,mach_port_name_t member,mach_port_name_t after)164 mach_port_move_member(mach_port_name_t target, mach_port_name_t member, mach_port_name_t after)
165 {
166
167 return (_kernelrpc_mach_port_move_member_trap(target, member, after));
168 }
169
170 kern_return_t
mach_port_insert_member(mach_port_name_t target,mach_port_name_t name,mach_port_name_t pset)171 mach_port_insert_member(mach_port_name_t target, mach_port_name_t name, mach_port_name_t pset)
172 {
173
174 return (_kernelrpc_mach_port_insert_member_trap(target, name, pset));
175 }
176
177
178 kern_return_t
mach_port_extract_member(mach_port_name_t target,mach_port_name_t name,mach_port_name_t pset)179 mach_port_extract_member(mach_port_name_t target, mach_port_name_t name, mach_port_name_t pset)
180 {
181
182 return (_kernelrpc_mach_port_extract_member_trap(target, name, pset));
183 }
184
185 #include <time.h>
186 #include <mach/mach_time.h>
187 uint64_t
mach_absolute_time(void)188 mach_absolute_time(void)
189 {
190 struct timespec tp;
191
192 if (clock_gettime(CLOCK_REALTIME_FAST, &tp))
193 return (0);
194
195 return (tp.tv_sec*NSEC_PER_SEC + tp.tv_nsec);
196 }
197
198 mach_port_t
pthread_mach_thread_np(uintptr_t self)199 pthread_mach_thread_np(uintptr_t self)
200 {
201
202 if ((pthread_t)self != pthread_self()) {
203 printf("invalid pthread_mach_thread_np usage");
204 abort();
205 }
206
207 return (thread_self_trap());
208 }
209