X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/3903760236c30e3b5ace7a4eefac3a269d68957c..e8c3f78193f1895ea514044358b93b1add9322f3:/bsd/libkern/libkern.h diff --git a/bsd/libkern/libkern.h b/bsd/libkern/libkern.h index 4e6606007..73545298d 100644 --- a/bsd/libkern/libkern.h +++ b/bsd/libkern/libkern.h @@ -77,7 +77,12 @@ #include #include #include +#include +#include +#if defined(__arm__) || defined(__arm64__) +#include /* for _ARM_ARCH_* */ +#endif #ifdef __APPLE_API_OBSOLETE /* BCD conversions. */ @@ -140,6 +145,9 @@ ulmin(u_int32_t a, u_int32_t b) /* Prototypes for non-quad routines. */ extern int ffs(int); +extern int ffsll(unsigned long long); +extern int fls(int); +extern int flsll(unsigned long long); extern u_int32_t random(void); extern int scanc(u_int, u_char *, const u_char *, int); extern int skpc(int, int, char *); @@ -149,11 +157,12 @@ extern quad_t strtoq(const char *, char **, int); extern u_quad_t strtouq(const char *, char **, int); extern char *strsep(char **, const char *); extern void *memchr(const void *, int, size_t); +extern void url_decode(char *str); int snprintf(char *, size_t, const char *, ...) __printflike(3,4); /* sprintf() is being deprecated. Please use snprintf() instead. */ -int sprintf(char *bufp, const char *, ...) __deprecated; +int sprintf(char *bufp, const char *, ...) __deprecated __printflike(2,3); int sscanf(const char *, char const *, ...) __scanflike(2,3); int printf(const char *, ...) __printflike(1,2); @@ -172,30 +181,41 @@ int _consume_printf_args(int, ...); uint16_t crc16(uint16_t crc, const void *bufp, size_t len); uint32_t crc32(uint32_t crc, const void *bufp, size_t len); +#if XNU_KERNEL_PRIVATE +#if KASAN +uint16_t __nosan_crc16(uint16_t crc, const void *bufp, size_t len); +#else +static inline uint16_t +__nosan_crc16(uint16_t crc, const void *bufp, size_t len) { return crc16(crc, bufp, len); } +#endif +#endif + int copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done); int copyinstr(const user_addr_t uaddr, void *kaddr, size_t len, size_t *done); int copyoutstr(const void *kaddr, user_addr_t udaddr, size_t len, size_t *done); -int copyin(const user_addr_t uaddr, void *kaddr, size_t len); -int copyout(const void *kaddr, user_addr_t udaddr, size_t len); #if XNU_KERNEL_PRIVATE extern int copyin_word(const user_addr_t user_addr, uint64_t *kernel_addr, vm_size_t nbytes); #endif int vsscanf(const char *, char const *, va_list); -extern int vprintf(const char *, va_list); -extern int vsnprintf(char *, size_t, const char *, va_list); +extern int vprintf(const char *, va_list) __printflike(1,0); +extern int vsnprintf(char *, size_t, const char *, va_list) __printflike(3,0); #if XNU_KERNEL_PRIVATE -extern int vprintf_log_locked(const char *, va_list); +extern int vprintf_log_locked(const char *, va_list) __printflike(1,0); extern void osobject_retain(void * object); extern void osobject_release(void * object); #endif /* vsprintf() is being deprecated. Please use vsnprintf() instead. */ -extern int vsprintf(char *bufp, const char *, va_list) __deprecated; +extern int vsprintf(char *bufp, const char *, va_list) __deprecated __printflike(2,0); #ifdef KERNEL_PRIVATE +#ifdef __arm__ +void flush_inner_dcaches(void); +void clean_inner_dcaches(void); +#endif extern void invalidate_icache(vm_offset_t, unsigned, int); extern void flush_dcache(vm_offset_t, unsigned, int); #else @@ -209,10 +229,29 @@ extern void flush_dcache64(addr64_t, unsigned, int); static inline int clz(unsigned int num) { +#if (__arm__ || __arm64__) + // On ARM, clz(0) is defined to return number of bits in the input type + return __builtin_clz(num); +#else // On Intel, clz(0) is undefined return num ? __builtin_clz(num) : sizeof(num) * CHAR_BIT; +#endif } +#if XNU_KERNEL_PRIVATE + +/* + * Define a function that for whatever reason needs to exist, but must never be + * called. + */ +#define UNSUPPORTED_API(funcname, ...) \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \ + funcname(__VA_ARGS__) { panic(__func__ ": unsupported API\n"); } \ + _Pragma("clang diagnostic pop") + +#endif + __END_DECLS #endif /* _LIBKERN_LIBKERN_H_ */