diff options
Diffstat (limited to 'kernel/l0/frame.c')
-rw-r--r-- | kernel/l0/frame.c | 85 |
1 files changed, 0 insertions, 85 deletions
diff --git a/kernel/l0/frame.c b/kernel/l0/frame.c deleted file mode 100644 index 489d010..0000000 --- a/kernel/l0/frame.c +++ /dev/null @@ -1,85 +0,0 @@ -#include <frame.h> -#include <dbglog.h> - -#include <mutex.h> - -// TODO: buddy allocator -// this is a simple bitmap allocator - -#define INDEX_FROM_BIT(a) ((a)/(8*4)) -#define OFFSET_FROM_BIT(a) ((a)%(8*4)) - -static uint32_t *frame_bitset; -static uint32_t nframes, nused_frames; -static uint32_t begin_search_at; - -void frame_init_allocator(size_t total_ram, void** kernel_data_end) { - nframes = PAGE_ID(total_ram); - - frame_bitset = (uint32_t*)ALIGN4_UP((size_t)*kernel_data_end); - *kernel_data_end = (void*)frame_bitset + ALIGN4_UP(nframes / 8); - - for (size_t i = 0; i < ALIGN4_UP(nframes / 8)/4; i++) - frame_bitset[i] = 0; - - nused_frames = 0; - - size_t kernel_pages = PAGE_ALIGN_UP((size_t)*kernel_data_end - K_HIGHHALF_ADDR)/PAGE_SIZE; - for (size_t i = 0; i < kernel_pages; i++) { - size_t idx = INDEX_FROM_BIT(i); - size_t ofs = OFFSET_FROM_BIT(i); - frame_bitset[idx] |= (0x1 << ofs); - nused_frames++; - } - begin_search_at = INDEX_FROM_BIT(kernel_pages); -} - -STATIC_MUTEX(frame_allocator_mutex); - -uint32_t frame_alloc(size_t n) { - if (n > 32) return 0; - - mutex_lock(&frame_allocator_mutex); - for (uint32_t i = begin_search_at; i < INDEX_FROM_BIT(nframes); i++) { - if (frame_bitset[i] == 0xFFFFFFFF) { - if (i == begin_search_at) begin_search_at++; - continue; - } - - for (uint32_t j = 0; j < 32 - n + 1; j++) { - uint32_t to_test = (0xFFFFFFFF >> (32 - n)) << j; - if (!(frame_bitset[i]&to_test)) { - frame_bitset[i] |= to_test; - nused_frames += n; - - mutex_unlock(&frame_allocator_mutex); - return i * 32 + j; - } - } - } - mutex_unlock(&frame_allocator_mutex); - return 0; -} - -void frame_free(uint32_t base, size_t n) { - mutex_lock(&frame_allocator_mutex); - - for (size_t i = 0; i < n; i++) { - uint32_t idx = INDEX_FROM_BIT(base + i); - uint32_t ofs = OFFSET_FROM_BIT(base + i); - if (frame_bitset[idx] & (0x1 << ofs)) { - frame_bitset[idx] &= ~(0x1 << ofs); - nused_frames--; - } - } - if (INDEX_FROM_BIT(base) < begin_search_at) - begin_search_at = INDEX_FROM_BIT(base); - - mutex_unlock(&frame_allocator_mutex); -} - -void dbg_print_frame_stats() { - dbg_printf("Used frames: %d/%d\n", nused_frames, nframes); -} - -/* vim: set ts=4 sw=4 tw=0 noet :*/ |