summaryrefslogtreecommitdiff
path: root/kernel/src/mem/heap.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 06:56:01 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 08:45:09 +0100
commit239900af293f192931391dc5579afab39a43e6c6 (patch)
tree72d7f87ee6adf5aa84b78436197e03e61fba8d97 /kernel/src/mem/heap.c
parentaaa23fffd02fb49cdbc56a480dbb5a8fa95bff38 (diff)
clang-format
Diffstat (limited to 'kernel/src/mem/heap.c')
-rw-r--r--kernel/src/mem/heap.c63
1 files changed, 39 insertions, 24 deletions
diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c
index b49eefb..537a2fe 100644
--- a/kernel/src/mem/heap.c
+++ b/kernel/src/mem/heap.c
@@ -1,6 +1,5 @@
#include <types.h>
#include <heap.h>
-
#include <libk/math.h>
#include <paging.h>
#include <libk/serial_stdio.h>
@@ -8,17 +7,18 @@
kheap_t main_kheap;
-void kheap_init(kheap_t* kheap)
+void kheap_init(kheap_t *kheap)
{
kheap->fblock = NULL;
}
-void kheap_add_block(kheap_t* kheap, uint64_t addr, uint32_t size, uint32_t bsize)
+void kheap_add_block(kheap_t *kheap, uint64_t addr, uint32_t size,
+ uint32_t bsize)
{
kheapblock_t *kheapblock;
// store size & bsize into kheapblock
- kheapblock = (kheapblock_t*)addr;
+ kheapblock = (kheapblock_t *)addr;
kheapblock->size = size - (uint32_t)sizeof(kheapblock_t);
kheapblock->bsize = bsize;
@@ -28,14 +28,15 @@ void kheap_add_block(kheap_t* kheap, uint64_t addr, uint32_t size, uint32_t bsiz
// block count & bitmap
uint32_t bcnt = kheapblock->size / kheapblock->bsize;
- uint8_t* bm = (uint8_t*)&kheapblock[1];
+ uint8_t *bm = (uint8_t *)&kheapblock[1];
// clear bitmap
for (size_t i = 0; i < bcnt; i++) {
bm[i] = 0;
}
- uint32_t bcnt_used = upper_div((bcnt + (uint32_t)sizeof(kheapblock_t)), bsize);
+ uint32_t bcnt_used =
+ upper_div((bcnt + (uint32_t)sizeof(kheapblock_t)), bsize);
for (size_t i = 0; i < bcnt_used; i++) {
bm[i] = 5;
}
@@ -43,13 +44,15 @@ void kheap_add_block(kheap_t* kheap, uint64_t addr, uint32_t size, uint32_t bsiz
kheapblock->used = bcnt_used;
}
-void* kheap_alloc(kheap_t* kheap, uint32_t size)
+void *kheap_alloc(kheap_t *kheap, uint32_t size)
{
- kheapblock_t* kheapblock;
+ kheapblock_t *kheapblock;
// find kheapblock that has enough space
- for (kheapblock = kheap->fblock; kheapblock; kheapblock = kheapblock->next) {
- if (kheapblock->size - (kheapblock->used * kheapblock->bsize) < size) {
+ for (kheapblock = kheap->fblock; kheapblock;
+ kheapblock = kheapblock->next) {
+ if (kheapblock->size - (kheapblock->used * kheapblock->bsize) <
+ size) {
continue;
}
@@ -57,12 +60,12 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
bool ind1 = ((size % 4096) == 0);
bool ind2 = (kheapblock->bsize == 4096);
if (ind1 + ind2 == 1) {
- continue;
+ continue;
}
uint32_t bcnt = kheapblock->size / kheapblock->bsize;
uint32_t bneed = upper_div(size, kheapblock->bsize);
- uint8_t* bm = (uint8_t*)&kheapblock[1];
+ uint8_t *bm = (uint8_t *)&kheapblock[1];
// find empty block
for (size_t i = 0; i < bcnt; i++) {
@@ -72,7 +75,9 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
// find bneed consecutive empty blocks
size_t j;
- for (j = 0; bm[i + j] == 0 && j < bneed && i + j < bcnt; j++);
+ for (j = 0; bm[i + j] == 0 && j < bneed && i + j < bcnt;
+ j++)
+ ;
if (j != bneed) {
i += j - 1;
continue;
@@ -80,7 +85,8 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
// using id for the block that is different from previous or next block
uint8_t idp = bm[i - 1], idn = bm[i + j], id;
- for (id = idp + 1; id == idn || id == 0; id++);
+ for (id = idp + 1; id == idn || id == 0; id++)
+ ;
// mark blocks as used
for (j = 0; j < bneed; j++) {
@@ -89,24 +95,31 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
kheapblock->used += bneed;
- return (void*)(i * kheapblock->bsize + (uintptr_t)&kheapblock[0]);
+ return (void *)(i * kheapblock->bsize +
+ (uintptr_t)&kheapblock[0]);
}
}
printf("Error: there is no remaining memory in kheap\n");
return NULL;
}
-void kheap_free(kheap_t* kheap, void* pointer)
+void kheap_free(kheap_t *kheap, void *pointer)
{
- kheapblock_t* kheapblock;
- for (kheapblock = kheap->fblock; kheapblock; kheapblock = kheapblock->next) {
- if ((uintptr_t)(pointer) > (uintptr_t)kheapblock && (uintptr_t)(pointer) < (uintptr_t)kheapblock + sizeof(kheapblock_t) + kheapblock->size) {
+ kheapblock_t *kheapblock;
+ for (kheapblock = kheap->fblock; kheapblock;
+ kheapblock = kheapblock->next) {
+ if ((uintptr_t)(pointer) > (uintptr_t)kheapblock &&
+ (uintptr_t)(pointer) < (uintptr_t)kheapblock +
+ sizeof(kheapblock_t) +
+ kheapblock->size) {
// found block
// get index of bitmap entry
- uintptr_t pointer_offset = (uintptr_t)pointer - (uintptr_t)&kheapblock[0];
- uint32_t bi = (uint32_t)pointer_offset / kheapblock->bsize;
- uint8_t* bm = (uint8_t*)&kheapblock[1];
+ uintptr_t pointer_offset =
+ (uintptr_t)pointer - (uintptr_t)&kheapblock[0];
+ uint32_t bi =
+ (uint32_t)pointer_offset / kheapblock->bsize;
+ uint8_t *bm = (uint8_t *)&kheapblock[1];
uint8_t id = bm[bi];
uint32_t max = kheapblock->size / kheapblock->bsize;
@@ -126,6 +139,8 @@ void kheap_free(kheap_t* kheap, void* pointer)
void init_heap()
{
kheap_init(&main_kheap);
- kheap_add_block(&main_kheap, HEAP1_VMEM_ADDR, HEAP1_SIZE, HEAP1_BLOCK_SIZE);
- kheap_add_block(&main_kheap, HEAP2_VMEM_ADDR, HEAP2_SIZE, HEAP2_BLOCK_SIZE);
+ kheap_add_block(&main_kheap, HEAP1_VMEM_ADDR, HEAP1_SIZE,
+ HEAP1_BLOCK_SIZE);
+ kheap_add_block(&main_kheap, HEAP2_VMEM_ADDR, HEAP2_SIZE,
+ HEAP2_BLOCK_SIZE);
}