#ifndef _KASAN_INTERNAL_H_
#define _KASAN_INTERNAL_H_
#include <stdbool.h>
#include <mach/mach_vm.h>
#include <kern/zalloc.h>
typedef uintptr_t uptr;
#define KASAN_DEBUG 1
#define FAKESTACK 1
#define MEMINTRINSICS 1
#define FAKESTACK_QUARANTINE (1 && FAKESTACK)
#define QUARANTINE_ENTRIES 5000
#define QUARANTINE_MAXSIZE (10UL * 1024 * 1024)
#ifndef KASAN
# error KASAN undefined
#endif
#ifndef KASAN_SHIFT
# error KASAN_SHIFT undefined
#endif
#define ADDRESS_FOR_SHADOW(x) (((x) - KASAN_SHIFT) << 3)
#define SHADOW_FOR_ADDRESS(x) (uint8_t *)(((x) >> 3) + KASAN_SHIFT)
#define NOINLINE __attribute__ ((noinline))
#define ALWAYS_INLINE inline __attribute__((always_inline))
#define CLANG_MIN_VERSION(x) (defined(__apple_build_version__) && (__apple_build_version__ >= (x)))
#define BIT(x) (1U << (x))
enum kasan_access_type {
TYPE_LOAD = BIT(0),
TYPE_STORE = BIT(1),
TYPE_KFREE = BIT(2),
TYPE_ZFREE = BIT(3),
TYPE_FSFREE = BIT(4),
TYPE_MEMLD = BIT(5),
TYPE_MEMSTR = BIT(6),
TYPE_STRINGLD = BIT(7),
TYPE_STRINGSTR = BIT(8),
TYPE_TEST = BIT(15),
TYPE_LDSTR = TYPE_LOAD|TYPE_STORE,
TYPE_FREE = TYPE_KFREE|TYPE_ZFREE|TYPE_FSFREE,
TYPE_MEM = TYPE_MEMLD|TYPE_MEMSTR,
TYPE_STRING = TYPE_STRINGLD|TYPE_STRINGSTR,
TYPE_LOAD_ALL = TYPE_LOAD|TYPE_MEMLD|TYPE_STRINGLD,
TYPE_STORE_ALL = TYPE_STORE|TYPE_MEMSTR|TYPE_STRINGSTR,
TYPE_ALL = ~0U
};
bool kasan_range_poisoned(vm_offset_t base, vm_size_t size, vm_offset_t *first_invalid);
void kasan_check_range(const void *x, size_t sz, unsigned access_type);
void kasan_test(int testno, int fail);
void kasan_handle_test(void);
void kasan_unpoison_curstack(void);
void kasan_free_internal(void **addrp, vm_size_t *sizep, int type, zone_t *, vm_size_t user_size, int locked, bool doquarantine);
void kasan_poison(vm_offset_t base, vm_size_t size, vm_size_t leftrz, vm_size_t rightrz, uint8_t flags);
void kasan_unpoison(void *base, vm_size_t size);
void kasan_lock(boolean_t *b);
void kasan_unlock(boolean_t b);
void kasan_init_fakestack(void);
void kasan_init_dybl(void);
bool kasan_is_blacklisted(unsigned type);
void kasan_dybl_load_kext(uintptr_t addr, const char *kextname);
void kasan_dybl_unload_kext(uintptr_t addr);
void kasan_arch_init(void);
extern vm_address_t kernel_vbase;
extern vm_address_t kernel_vtop;
extern long shadow_pages_used;
struct asan_global_source_location {
const char *filename;
int line_no;
int column_no;
};
struct asan_global {
uptr addr;
uptr size;
uptr size_with_redzone;
const char *name;
const char *module;
uptr has_dynamic_init;
struct asan_global_source_location *location;
#if CLANG_MIN_VERSION(8020000)
uptr odr_indicator;
#endif
};
#if defined(__x86_64__)
# define _JBLEN ((9 * 2) + 3 + 16)
#endif
typedef int jmp_buf[_JBLEN];
void _longjmp(jmp_buf env, int val);
int _setjmp(jmp_buf env);
#endif