xref: /NextBSD/lib/libmach/mach/mach_misc.c (revision 33da5adc555b3bc29986eeadca03829e4ad06b1e)
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