14#define MAX_FREED_VADDRS 512
108#define KALLOC_REFILL(BUCKET) \
109 static void refill_##BUCKET(struct kalloc_cpu_cache* cc, \
110 uintptr_t* gflags) { \
112 spin_acquire(&kalloc_global_lock); \
113 void* page = alloc_page_locked(); \
114 spin_release(&kalloc_global_lock); \
116 for (int i = 0; i < (int)(BLOCK_SIZE / BUCKET); i++) { \
118 (void*)((uintptr_t)page + (size_t)i * BUCKET); \
119 *(void**)slot = cc->c_##BUCKET; \
120 cc->c_##BUCKET = slot; \
121 cc->c_##BUCKET##_count++; \
134#define KALLOC_SLAB_ALLOC(BUCKET) \
136 uint32_t cpu = get_current_core_data()->core_id; \
137 struct kalloc_cpu_cache* cc = &cpu_caches[cpu]; \
138 uintptr_t flags = lock_irqsave(&cc->lock); \
139 if (cc->c_##BUCKET##_count == 0) \
140 refill_##BUCKET(cc, &flags); \
141 void* slot = cc->c_##BUCKET; \
142 cc->c_##BUCKET = *(void**)slot; \
143 cc->c_##BUCKET##_count--; \
144 unlock_irqrestore(&cc->lock, flags); \
146 kalloc_metadata_t* meta = (kalloc_metadata_t*)slot; \
148 meta->magic = KALLOC_REDZONE_MAGIC; \
151 (void*)((uintptr_t)slot + sizeof(kalloc_metadata_t)); \
152 setup_redzone(red_before, KALLOC_REDZONE_SIZE); \
155 (void*)((uintptr_t)red_before + KALLOC_REDZONE_SIZE); \
156 void* red_after = (void*)((uintptr_t)data + size); \
157 setup_redzone(red_after, KALLOC_REDZONE_SIZE); \
167 size_t metadata_overhead =
170 if (
size + metadata_overhead <= 64) {
172 }
else if (
size + metadata_overhead <= 128) {
174 }
else if (
size + metadata_overhead <= 256) {
176 }
else if (
size + metadata_overhead <= 512) {
178 }
else if (
size + metadata_overhead <= 1024) {
180 }
else if (
size + metadata_overhead <= 2048) {
185 size_t total_size =
size + metadata_overhead;
237 LOG2_WARN(
"KALLOC",
"red zone overllaping");
244 LOG2_WARN(
"KALLOC",
"red zone overllaping");
248 size_t metadata_overhead =
251 if (
size + metadata_overhead <= 64) {
252 void*
slot = (
void*)meta;
258 }
else if (
size + metadata_overhead <= 128) {
259 void*
slot = (
void*)meta;
265 }
else if (
size + metadata_overhead <= 256) {
266 void*
slot = (
void*)meta;
272 }
else if (
size + metadata_overhead <= 512) {
273 void*
slot = (
void*)meta;
279 }
else if (
size + metadata_overhead <= 1024) {
280 void*
slot = (
void*)meta;
286 }
else if (
size + metadata_overhead <= 2048) {
287 void*
slot = (
void*)meta;
298 size_t total_size =
size + metadata_overhead;
299 memset(meta, 0, total_size);
349 LOG2_WARN(
"KALLOC",
"red zone overllaping");
356 LOG2_WARN(
"KALLOC",
"red zone overllaping");
360 size_t metadata_overhead =
363 if (
size + metadata_overhead <= 64) {
364 void*
slot = (
void*)meta;
370 }
else if (
size + metadata_overhead <= 128) {
371 void*
slot = (
void*)meta;
377 }
else if (
size + metadata_overhead <= 256) {
378 void*
slot = (
void*)meta;
384 }
else if (
size + metadata_overhead <= 512) {
385 void*
slot = (
void*)meta;
391 }
else if (
size + metadata_overhead <= 1024) {
392 void*
slot = (
void*)meta;
398 }
else if (
size + metadata_overhead <= 2048) {
399 void*
slot = (
void*)meta;
410 size_t total_size =
size + metadata_overhead;
411 memset(meta, 0, total_size);
each_core_data * get_current_core_data(void)
static void irq_restore(uintptr_t flags)
static uintptr_t irq_save(void)
static uintptr_t kalloc_next_addr
#define KALLOC_REFILL(BUCKET)
static uintptr_t vaddr_alloc_locked(size_t page_count)
static size_t freed_vaddr_count
static freed_t freed_vaddrs[512]
static void * alloc_page_locked(void)
static struct kalloc_cpu_cache cpu_caches[VOXIA_MAX_CORE]
#define KALLOC_SLAB_ALLOC(BUCKET)
static uintptr_t lock_irqsave(spinlock_t *lk)
static int check_redzone(void *ptr, size_t size)
static spinlock_t kalloc_global_lock
static void setup_redzone(void *ptr, size_t size)
static void unlock_irqrestore(spinlock_t *lk, uintptr_t flags)
void kfree(void *ptr, size_t size)
void * kalloc(size_t size)
#define KALLOC_REDZONE_SIZE
#define KALLOC_REDZONE_MAGIC
#define ALIGN_UP(x, align)
page_t paging_get_highest_page_map(void)
void vxMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t flags)
void paging_unmap_fill(page_t page_dir, uint64_t virt, size_t size)
void vxMultipleMmap(page_t page_dir, uint64_t virt, uint64_t phys, uint64_t size, uint64_t flags)
void * phys_base_alloc(uint64_t block)
void vxPhysBaseFree(void *ptr, uint64_t size)
#define LOG2_WARN(mod, fmt,...)
void spin_acquire(spinlock_t *lock)
void spin_release(spinlock_t *lock)
void memset(void *ptr, int value, size_t num)
uint8_t _pad[64 -(sizeof(void *) *6+sizeof(size_t) *6+sizeof(spinlock_t)) % 64]
virtual_memory_t * vma_find(struct virtual_memory_page *page, uintptr_t virt_addr)
void vma_register(struct virtual_memory_page *page, uintptr_t phys_address, uintptr_t virt_addr, size_t size)
void vma_unregister(struct virtual_memory_page *page, uintptr_t virt_addr)
struct virtual_memory_page * get_kernel_vmm_page()
struct virtual_memory virtual_memory_t
struct xhci_slot_ctx slot