1#include <enforce.h>
2#include <math/align.h>
3#include <mem/alloc.h>
4#include <stddef.h>
5
6void *valloc_aligned_full(size_t size, size_t align,
7 struct alloc_params params) {
8 uintptr_t raw =
9 (uintptr_t) valloc_full(size: size + align + sizeof(uintptr_t), params);
10 if (!raw)
11 return NULL;
12
13 uintptr_t aligned = ALIGN_UP(raw + sizeof(uintptr_t), align);
14 ((uintptr_t *) aligned)[-1] = raw;
15
16 enforce(IS_ALIGNED(aligned, align));
17 return (void *) aligned;
18}
19
20void vfree_aligned_full(void *ptr, enum alloc_behavior b) {
21 if (!ptr)
22 return;
23 uintptr_t raw = ((uintptr_t *) ptr)[-1];
24 vfree((void *) raw, b);
25}
26