xref: /xnu-12377.41.6/osfmk/kern/misc_protos.h (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1 /*
2  * Copyright (c) 2000-2016 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * @OSF_COPYRIGHT@
30  */
31 /*
32  * NOTICE: This file was modified by McAfee Research in 2004 to introduce
33  * support for mandatory and extensible security protections.  This notice
34  * is included in support of clause 2.2 (b) of the Apple Public License,
35  * Version 2.0.
36  */
37 
38 #ifndef _MISC_PROTOS_H_
39 #define _MISC_PROTOS_H_
40 
41 #include <stdarg.h>
42 #include <string.h>
43 #include <machine/setjmp.h>
44 #include <mach/boolean.h>
45 #include <mach/message.h>
46 #include <mach/machine/vm_types.h>
47 #include <ipc/ipc_types.h>
48 #include <kern/debug.h>
49 #include <libkern/copyio.h>
50 
51 #ifndef MIN
52 #define MIN(a, b) (((a)<(b))?(a):(b))
53 #endif /* MIN */
54 #ifndef MAX
55 #define MAX(a, b) (((a)>(b))?(a):(b))
56 #endif  /* MAX */
57 
58 /* Set a bit in a bit array */
59 extern void setbit(
60 	int             which,
61 	int             *bitmap);
62 
63 /* Clear a bit in a bit array */
64 extern void clrbit(
65 	int             which,
66 	int             *bitmap);
67 
68 /* Find the first set bit in a bit array */
69 extern int ffsbit(
70 	int             *bitmap);
71 extern int ffs(
72 	unsigned int    mask);
73 extern int ffsll(
74 	unsigned long long mask);
75 
76 /* Find the last set bit in a bit array */
77 extern int fls(
78 	unsigned int    mask);
79 extern int flsll(
80 	unsigned long long mask);
81 
82 /*
83  * Test if indicated bit is set in bit string.
84  */
85 extern int testbit(
86 	int             which,
87 	int             *bitmap);
88 
89 /*
90  * Move an aligned 32 or 64-bit word from user space to kernel space
91  * using a single read instruction
92  */
93 extern int copyin_atomic32(
94 	const user_addr_t   user_addr,
95 	uint32_t            *kernel_addr);
96 
97 extern int copyin_atomic64(
98 	const user_addr_t   user_addr,
99 	uint64_t            *kernel_addr);
100 
101 #if CONFIG_DTRACE
102 extern int dtrace_nofault_copy8(
103 	const uintptr_t     kernel_addr,
104 	uint8_t             *value);
105 
106 extern int dtrace_nofault_copy16(
107 	const uintptr_t     kernel_addr,
108 	uint16_t            *value);
109 
110 extern int dtrace_nofault_copy32(
111 	const uintptr_t     kernel_addr,
112 	uint32_t            *value);
113 
114 extern int dtrace_nofault_copy64(
115 	const uintptr_t     kernel_addr,
116 	uint64_t            *value);
117 #endif /* CONFIG_DTRACE */
118 
119 /*
120  * Does an atomic copyin at the specified user_address and compares
121  * it to the passed in value, and if it matches, waits.
122  *
123  * This is used to implement adaptive spinning for userspace synchronization
124  *
125  * Returns:
126  * 0:       the value mached, and it paused efficiently for the platform
127  * ESTALE:  the value didn't match, and it returned immediately
128  * other:   the copyin failed (EFAULT, EINVAL, ...)
129  */
130 extern int copyin_atomic32_wait_if_equals(
131 	const user_addr_t   user_addr,
132 	uint32_t            value);
133 
134 /*
135  * Move a 32 or 64-bit word from kernel space to user space
136  * using a single write instruction
137  */
138 extern int copyout_atomic32(
139 	uint32_t            u32,
140 	user_addr_t         user_addr);
141 
142 extern int copyout_atomic64(
143 	uint64_t            u64,
144 	user_addr_t         user_addr);
145 
146 /* Move a NUL-terminated string from a user space to kernel space */
147 extern int copyinstr(
148 	const user_addr_t   user_addr,
149 	char                *kernel_addr,
150 	vm_size_t           max,
151 	vm_size_t           *actual);
152 
153 /* Move arbitrarily-aligned data from a user space to kernel space */
154 extern int copyinmsg(
155 	const user_addr_t   user_addr,
156 	void                *kernel_addr,
157 	mach_msg_size_t     nbytes);
158 
159 /* Move arbitrarily-aligned data from a kernel space to user space */
160 extern int copyoutmsg(
161 	const void      *kernel_addr,
162 	user_addr_t     user_addr,
163 	mach_msg_size_t nbytes);
164 
165 #if HAS_MTE
166 /*
167  * Retrieves the associated MTE tag, if any, for a user space address.
168  * Returns the input pointer with any associated MTE tag merged to the
169  * architecturally specified bitfield in `out`.
170  */
171 int copyin_mte_load_tag(const user_addr_t src, user_addr_t* out);
172 
173 #endif /* HAS_MTE */
174 
175 #if (DEBUG || DEVELOPMENT)
176 extern int verify_write(const void *source, void *dst, size_t size);
177 #endif
178 extern int sscanf(const char *input, const char *fmt, ...) __scanflike(2, 3);
179 
180 /* sprintf() is being deprecated. Please use snprintf() instead. */
181 extern integer_t sprintf(char *buf, const char *fmt, ...) __printflike(2, 3) __deprecated;
182 
183 extern int printf(const char *format, ...) __printflike(1, 2);
184 extern int vprintf(const char *format, va_list ap) __printflike(1, 0);
185 
186 #if KERNEL_PRIVATE
187 int     _consume_printf_args(int, ...);
188 #endif
189 
190 #if CONFIG_NO_PRINTF_STRINGS
191 #if KERNEL_PRIVATE
192 #define printf(x, ...)  _consume_printf_args( 0, ## __VA_ARGS__ )
193 #else
194 #define printf(x, ...)  do {} while (0)
195 #endif
196 #endif
197 
198 extern int paniclog_append_noflush(const char *format, ...) __printflike(1, 2);
199 
200 extern int kdb_printf(const char *format, ...) __printflike(1, 2);
201 
202 extern int kdb_log(const char *format, ...) __printflike(1, 2);
203 
204 extern int kdb_printf_unbuffered(const char *format, ...) __printflike(1, 2);
205 
206 extern int snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
207 extern int scnprintf(char *, size_t, const char *, ...) __printflike(3, 4);
208 extern const char *tsnprintf(char *, size_t, const char *, ...) __printflike(3, 4);
209 
210 extern void log(int level, char *fmt, ...) __printflike(2, 3);
211 
212 void
213 _doprnt(
214 	const char     *fmt,
215 	va_list        *argp,
216 	void          (*putc)(char),
217 	int             radix) __printflike(1, 0);
218 
219 void
220 _doprnt_log(
221 	const char     *fmt,
222 	va_list        *argp,
223 	void          (*putc)(char),
224 	int             radix) __printflike(1, 0);
225 
226 int
227 __doprnt(
228 	const char     *fmt,
229 	va_list         argp,
230 	void          (*putc)(int, void *),
231 	void           *arg,
232 	int             radix,
233 	int             is_log) __printflike(1, 0);
234 
235 extern void console_write_char(char);
236 
237 extern void conslog_putc(char);
238 
239 extern void cons_putc_locked(char);
240 
241 extern void consdebug_putc(char);
242 
243 extern void consdebug_log(char);
244 
245 extern void consdebug_putc_unbuffered(char);
246 
247 extern void console_write_unbuffered(char);
248 
249 extern void console_write(char *, int);
250 
251 extern void console_suspend(void);
252 
253 extern void console_resume(void);
254 
255 extern int console_read_char(void);
256 
257 extern int console_try_read_char(void);
258 
259 extern int _setjmp(
260 	jmp_buf_t       *jmp_buf);
261 
262 extern int _longjmp(
263 	jmp_buf_t       *jmp_buf,
264 	int             value);
265 
266 extern void bootstrap_create(void);
267 
268 extern kern_return_t    kernel_set_special_port(
269 	host_priv_t     host_priv,
270 	int             which,
271 	ipc_port_t      port);
272 
273 extern kern_return_t    kernel_get_special_port(
274 	host_priv_t     host_priv,
275 	int             which,
276 	ipc_port_t      *portp);
277 
278 user_addr_t get_useraddr(void);
279 
280 /* symbol lookup */
281 #ifndef __cplusplus
282 struct kmod_info_t;
283 #endif
284 
285 extern uint64_t early_random(void);
286 
287 #endif  /* _MISC_PROTOS_H_ */
288