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