#include "kmalloc.h" #include "kernel.h" #include "spinlock.h" static uint8_t data[KMALLOC_MEM_SIZE]; // bytes static uint32_t next; static uint32_t first; static uint8_t init=0; // will be initialized on first call to kballoc() // static void kmallocinit() { next=&(data[0]); first=next; //TODO: optionally tell gcc to align this itself. if(next%4096) { next+=4096; next/=4096; next*=4096; } // klog("kmalloc_init: 0x%08X",next); init=1; } // kernel block memory allocation // uint32_t kballoc(uint32_t size) { size*=4096; spinlock_spin(SPINLOCK_ALLOC); if(!init)kmallocinit(); uint32_t old=next; next+=size; spinlock_release(SPINLOCK_ALLOC); if(next>=first+KMALLOC_MEM_SIZE) { kpanic("kballoc ran out of memory! maybe increase KMALLOC_MEM_SIZE in kmalloc.c?"); } klog("(%d) : 0x%08X (~%dKB left)",size,old,(KMALLOC_MEM_SIZE-next+first)/1024); return old; } //TODO: allow freeing memory!! uint32_t kbfree(uint32_t pos) { kpanic("kbfree NOT IMPLEMENTED YET"); }