#ifndef _LINUX_KFUNC__H_
#define _LINUX_KFUNC__H_
#include <linux/compiler_attributes.h>
#include <linux/compiler_types.h>
#include <linux/types.h>
#ifdef RESPECTRE_PLUGIN
#include <linux/nospec.h>
#endif
#ifdef AUTOSLAB_PLUGIN
#include <linux/autoslab.h>
#endif
void __context__(void *, int);
void __context_error__(const void *, const void *, int) __attribute__((error("context error")));
/* duplicated from include/linux/slab.h */
struct kmem_cache *kmem_cache_create_usercopy_typename_typesize_print(
const char *name, const char *typename,
unsigned int typesize, unsigned int size, unsigned int align,
slab_flags_t flags,
unsigned int useroffset, unsigned int usersize,
void (*ctor)(void *),
ssize_t (*print)(char *buffer, size_t buflen, void *obj, const char *name));
void kfree(const void *objp);
void kfree_sensitive(const void *objp);
#ifdef CONFIG_PAX_SIZE_OVERFLOW
__nocapture(1, 3, 4) noinline __preserve_most __nothrow __used
void report_size_overflow(const char *file, unsigned int line, const char *func, const char *ssa_name, u64 low, u64 high, bool is_extra);
#endif
#ifdef CONFIG_PAX_MEMORY_STACKLEAK
// __compiletime_error("don't call this from C!")
__leaf noinline noinstr __preserve_most __no_stack_protector __nothrow __used
void pax_track_stack(void);
#endif
#ifdef CONFIG_PAX_LATENT_ENTROPY
extern volatile unsigned long latent_entropy;
#endif
#ifdef CONFIG_PAX_KERNEXEC
#include <asm/kernexec.h>
#endif
#ifdef CONFIG_PAX_PRIVATE_KSTACKS
//__opens(nolocal)
__maybe_used
void *alloc_nolocal(size_t size, size_t align);
//__closes(nolocal)
__maybe_used
void free_nolocal(void *var, size_t size);
#endif
#ifdef CONFIG_PAX_AUTOSLAB_PLUGIN_AUTOSTACK
__maybe_used
void *convert_autostack(void *autostack, size_t size, gfp_t flags);
__maybe_used
void free_autostack(const void *autostack, size_t size);
#endif
#endif