xref: /xnu-8020.101.4/osfmk/kern/misc_protos.h (revision e7776783b89a353188416a9a346c6cdb4928faad)
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 /*
102  * Does an atomic copyin at the specified user_address and compares
103  * it to the passed in value, and if it matches, waits.
104  *
105  * This is used to implement adaptive spinning for userspace synchronization
106  *
107  * Returns:
108  * 0:       the value mached, and it paused efficiently for the platform
109  * ESTALE:  the value didn't match, and it returned immediately
110  * other:   the copyin failed (EFAULT, EINVAL, ...)
111  */
112 extern int copyin_atomic32_wait_if_equals(
113 	const user_addr_t   user_addr,
114 	uint32_t            value);
115 
116 /*
117  * Move a 32 or 64-bit word from kernel space to user space
118  * using a single write instruction
119  */
120 extern int copyout_atomic32(
121 	uint32_t            u32,
122 	user_addr_t         user_addr);
123 
124 extern int copyout_atomic64(
125 	uint64_t            u64,
126 	user_addr_t         user_addr);
127 
128 /* Move a NUL-terminated string from a user space to kernel space */
129 extern int copyinstr(
130 	const user_addr_t   user_addr,
131 	char                *kernel_addr,
132 	vm_size_t           max,
133 	vm_size_t           *actual);
134 
135 /* Move arbitrarily-aligned data from a user space to kernel space */
136 extern int copyinmsg(
137 	const user_addr_t   user_addr,
138 	char                *kernel_addr,
139 	mach_msg_size_t     nbytes);
140 
141 /* Move arbitrarily-aligned data from a kernel space to user space */
142 extern int copyoutmsg(
143 	const char      *kernel_addr,
144 	user_addr_t     user_addr,
145 	mach_msg_size_t nbytes);
146 
147 #if (DEBUG || DEVELOPMENT)
148 extern int verify_write(const void *source, void *dst, size_t size);
149 #endif
150 extern int sscanf(const char *input, const char *fmt, ...) __scanflike(2, 3);
151 
152 /* sprintf() is being deprecated. Please use snprintf() instead. */
153 extern integer_t sprintf(char *buf, const char *fmt, ...) __printflike(2, 3) __deprecated;
154 
155 extern int printf(const char *format, ...) __printflike(1, 2);
156 extern int vprintf(const char *format, va_list ap) __printflike(1, 0);
157 
158 #if KERNEL_PRIVATE
159 int     _consume_printf_args(int, ...);
160 #endif
161 
162 #if CONFIG_NO_PRINTF_STRINGS
163 #if KERNEL_PRIVATE
164 #define printf(x, ...)  _consume_printf_args( 0, ## __VA_ARGS__ )
165 #else
166 #define printf(x, ...)  do {} while (0)
167 #endif
168 #endif
169 
170 extern int paniclog_append_noflush(const char *format, ...) __printflike(1, 2);
171 
172 extern int kdb_printf(const char *format, ...) __printflike(1, 2);
173 
174 extern int kdb_log(const char *format, ...) __printflike(1, 2);
175 
176 extern int kdb_printf_unbuffered(const char *format, ...) __printflike(1, 2);
177 
178 extern int snprintf(char *, size_t, const char *, ...) __printflike(3, 4);
179 extern int scnprintf(char *, size_t, const char *, ...) __printflike(3, 4);
180 
181 extern void log(int level, char *fmt, ...) __printflike(2, 3);
182 
183 void
184 _doprnt(
185 	const char     *fmt,
186 	va_list        *argp,
187 	void          (*putc)(char),
188 	int             radix) __printflike(1, 0);
189 
190 void
191 _doprnt_log(
192 	const char     *fmt,
193 	va_list        *argp,
194 	void          (*putc)(char),
195 	int             radix) __printflike(1, 0);
196 
197 int
198 __doprnt(
199 	const char     *fmt,
200 	va_list         argp,
201 	void          (*putc)(int, void *),
202 	void           *arg,
203 	int             radix,
204 	int             is_log) __printflike(1, 0);
205 
206 extern void console_write_char(char);
207 
208 extern void conslog_putc(char);
209 
210 extern void cons_putc_locked(char);
211 
212 extern void consdebug_putc(char);
213 
214 extern void consdebug_log(char);
215 
216 extern void consdebug_putc_unbuffered(char);
217 
218 extern void console_write_unbuffered(char);
219 
220 extern void console_write(char *, int);
221 
222 extern void console_suspend(void);
223 
224 extern void console_resume(void);
225 
226 extern int console_read_char(void);
227 
228 extern int console_try_read_char(void);
229 
230 extern int _setjmp(
231 	jmp_buf_t       *jmp_buf);
232 
233 extern int _longjmp(
234 	jmp_buf_t       *jmp_buf,
235 	int             value);
236 
237 extern void bootstrap_create(void);
238 
239 extern kern_return_t    kernel_set_special_port(
240 	host_priv_t     host_priv,
241 	int             which,
242 	ipc_port_t      port);
243 
244 extern kern_return_t    kernel_get_special_port(
245 	host_priv_t     host_priv,
246 	int             which,
247 	ipc_port_t      *portp);
248 
249 user_addr_t get_useraddr(void);
250 
251 /* symbol lookup */
252 #ifndef __cplusplus
253 struct kmod_info_t;
254 #endif
255 
256 extern uint64_t early_random(void);
257 
258 #endif  /* _MISC_PROTOS_H_ */
259