Skip to content

Allocator API

include/mem/alloc.h View source View on GitHub
enum alloc_flags : uint16_t {
    ALLOC_FLAG_PREFER_CACHE_ALIGNED = (1 << 0),
    ALLOC_FLAG_NO_CACHE_ALIGN = 0,
    ALLOC_FLAG_FLEXIBLE_LOCALITY = (1 << 1),
    ALLOC_FLAG_STRICT_LOCALITY = 0,
    ALLOC_FLAG_PAGEABLE = (1 << 2),
    ALLOC_FLAG_NONPAGEABLE = 0,
    ALLOC_FLAG_MOVABLE = (1 << 3),
    ALLOC_FLAG_NONMOVABLE = 0,
    ALLOC_FLAG_CONTIGUOUS = (1 << 4),
    ALLOC_FLAG_NONCONTIGUOUS = 0,
    ALLOC_FLAG_ZERO_ON_ALLOC = (1 << 5),
    ALLOC_FLAG_NON_ZERO = 0,
    ALLOC_FLAG_CLASS_DEFAULT = (1 << ALLOC_CLASS_SHIFT),
    ALLOC_FLAG_CLASS_INTERLEAVED = (2 << ALLOC_CLASS_SHIFT),
    ALLOC_FLAG_CLASS_HIGH_BANDWIDTH = (3 << ALLOC_CLASS_SHIFT),
};
enum alloc_behavior : uint16_t {
    ALLOC_BEHAVIOR_NORMAL,
    ALLOC_BEHAVIOR_ATOMIC,
    ALLOC_BEHAVIOR_NO_WAIT,
    ALLOC_BEHAVIOR_NO_RECLAIM,
    ALLOC_BEHAVIOR_FAULT_SAFE,
    ALLOC_BEHAVIOR_FLAG_FAST = 1 << ALLOC_BEHAVIOR_FLAG_SHIFT,
    ALLOC_BEHAVIOR_FLAG_MINIMAL = 1 << (ALLOC_BEHAVIOR_FLAG_SHIFT + 1),
};
bool alloc_flags_valid(enum alloc_flags flags);
enum alloc_behavior alloc_behavior_base(enum alloc_behavior raw);
bool alloc_behavior_may_fault(enum alloc_behavior raw);
bool alloc_behavior_may_block(enum alloc_behavior raw);
bool alloc_behavior_is_isr_safe(enum alloc_behavior raw);
bool alloc_behavior_no_reclaim(enum alloc_behavior raw);
bool alloc_behavior_is_fast(enum alloc_behavior raw);
bool alloc_flag_behavior_verify(enum alloc_flags f, enum alloc_behavior behavior);
void alloc_request_sanitize(enum alloc_flags *f, enum alloc_behavior *b);
void * kmalloc_new(size_t size, enum alloc_flags flags, enum alloc_behavior behavior);
void kfree_new(void *ptr, enum alloc_behavior behavior);
void * kmalloc_from_domain(size_t domain, size_t size);
void * kmalloc_internal(size_t size, enum alloc_flags flags, enum alloc_behavior behavior);
void * krealloc_internal(void *ptr, size_t size, enum alloc_flags flags, enum alloc_behavior behavior);
void kfree_internal(void *ptr, enum alloc_behavior behavior);
size_t ksize(void *ptr);
void * kmalloc_aligned_internal(size_t size, size_t align, enum alloc_flags flags, enum alloc_behavior behavior);
void kfree_aligned_internal(void *ptr, enum alloc_behavior behavior);
void kfree_defer_irq(void *ptr);
#define ALLOC_LOCALITY_SHIFT 9
#define ALLOC_CLASS_SHIFT 12
#define ALLOC_CLASS_MASK 0xF
#define ALLOC_LOCALITY_MAX 7
#define ALLOC_LOCALITY_MIN 0
#define ALLOC_LOCALITY_MASK 0x7
#define ALLOC_LOCALITY_FROM_FLAGS(flags) \
    (((flags) >> ALLOC_LOCALITY_SHIFT) & ALLOC_LOCALITY_MASK)
#define ALLOC_LOCALITY_TO_FLAGS(locality) \
    (((locality) & ALLOC_LOCALITY_MASK) << ALLOC_LOCALITY_SHIFT)
#define ALLOC_FLAG_TEST(flags, mask) (flags & mask)
#define ALLOC_FLAG_CLASS(flags) \
    ((flags >> ALLOC_CLASS_SHIFT) & ALLOC_CLASS_MASK)
#define ALLOC_FLAGS_NONE 0
#define ALLOC_FLAGS_UNAVAILABLE_BITS 0x40
#define ALLOC_FLAGS_DEFAULT \
    (ALLOC_FLAG_CLASS_DEFAULT | ALLOC_FLAG_FLEXIBLE_LOCALITY | \
     ALLOC_FLAG_NONMOVABLE | ALLOC_FLAG_NONPAGEABLE | \
     ALLOC_FLAG_NO_CACHE_ALIGN | ALLOC_LOCALITY_TO_FLAGS(ALLOC_LOCALITY_MIN))
#define ALLOC_FLAGS_ZERO (ALLOC_FLAGS_DEFAULT | ALLOC_FLAG_ZERO_ON_ALLOC)
#define ALLOC_FLAGS_PAGEABLE \
    ALLOC_FLAG_PAGEABLE | ALLOC_FLAG_CLASS_DEFAULT | \
        ALLOC_FLAG_FLEXIBLE_LOCALITY
#define ALLOC_BEHAVIOR_FLAG_SHIFT 4
#define ALLOC_BEHAVIOR_MASK (0xF)
#define ALLOC_BEHAVIOR_AVAILABLE_SHIFT 12
#define ALLOC_BEHAVIOR_DEFAULT ALLOC_BEHAVIOR_NORMAL