forked from PoliEcho-holding-org/kern
void*********************
This commit is contained in:
+33
-32
@@ -17,46 +17,47 @@ void* kcalloc(size_t count, size_t size);
|
||||
|
||||
// powers of 2
|
||||
#define KMALLOC_MAX_SIZE 17
|
||||
#define LOWEST_POWER 3
|
||||
|
||||
union per_cpu_freelist_cache {
|
||||
void* freelists[KMALLOC_MAX_SIZE];
|
||||
void** freelists[KMALLOC_MAX_SIZE];
|
||||
struct {
|
||||
void* kmalloc_8;
|
||||
void* kmalloc_16;
|
||||
void* kmalloc_32;
|
||||
void* kmalloc_64;
|
||||
void* kmalloc_128;
|
||||
void* kmalloc_256;
|
||||
void* kmalloc_512;
|
||||
void* kmalloc_1024;
|
||||
void* kmalloc_2048;
|
||||
void* kmalloc_4096;
|
||||
void* kmalloc_8192;
|
||||
void* kmalloc_16384;
|
||||
void* kmalloc_32768;
|
||||
void* kmalloc_65536;
|
||||
void* kmalloc_131072;
|
||||
void** kmalloc_8;
|
||||
void** kmalloc_16;
|
||||
void** kmalloc_32;
|
||||
void** kmalloc_64;
|
||||
void** kmalloc_128;
|
||||
void** kmalloc_256;
|
||||
void** kmalloc_512;
|
||||
void** kmalloc_1024;
|
||||
void** kmalloc_2048;
|
||||
void** kmalloc_4096;
|
||||
void** kmalloc_8192;
|
||||
void** kmalloc_16384;
|
||||
void** kmalloc_32768;
|
||||
void** kmalloc_65536;
|
||||
void** kmalloc_131072;
|
||||
};
|
||||
};
|
||||
|
||||
union partial_list {
|
||||
void* freelists[KMALLOC_MAX_SIZE];
|
||||
void** freelists[KMALLOC_MAX_SIZE];
|
||||
struct {
|
||||
void* kmalloc_8;
|
||||
void* kmalloc_16;
|
||||
void* kmalloc_32;
|
||||
void* kmalloc_64;
|
||||
void* kmalloc_128;
|
||||
void* kmalloc_256;
|
||||
void* kmalloc_512;
|
||||
void* kmalloc_1024;
|
||||
void* kmalloc_2048;
|
||||
void* kmalloc_4096;
|
||||
void* kmalloc_8192;
|
||||
void* kmalloc_16384;
|
||||
void* kmalloc_32768;
|
||||
void* kmalloc_65536;
|
||||
void* kmalloc_131072;
|
||||
void** kmalloc_8;
|
||||
void** kmalloc_16;
|
||||
void** kmalloc_32;
|
||||
void** kmalloc_64;
|
||||
void** kmalloc_128;
|
||||
void** kmalloc_256;
|
||||
void** kmalloc_512;
|
||||
void** kmalloc_1024;
|
||||
void** kmalloc_2048;
|
||||
void** kmalloc_4096;
|
||||
void** kmalloc_8192;
|
||||
void** kmalloc_16384;
|
||||
void** kmalloc_32768;
|
||||
void** kmalloc_65536;
|
||||
void** kmalloc_131072;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
+29
-2
@@ -1,5 +1,7 @@
|
||||
#include "kernel.h"
|
||||
#include "types.h"
|
||||
#include <kmalloc.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
// this file contains SLUB inspired HEAP allocator
|
||||
|
||||
@@ -46,7 +48,32 @@ void* kmalloc(size_t size) {
|
||||
: "eax", "edx");
|
||||
|
||||
// freelists_all_cpus[core_id];
|
||||
// TODO enable when we actualy know how many CPUs we have
|
||||
if () {
|
||||
// TODO disable when we actualy know how many CPUs we have
|
||||
core_id = 0;
|
||||
|
||||
size_t alloc_index;
|
||||
{
|
||||
uint8_t leading_zeros = __builtin_clzll(size);
|
||||
if (__builtin_popcountll(size) == 1) {
|
||||
alloc_index = leading_zeros;
|
||||
} else {
|
||||
alloc_index = sizeof(size) * CHAR_BIT - leading_zeros;
|
||||
}
|
||||
if (alloc_index > KMALLOC_MAX_SIZE) {
|
||||
// NOT IMPLEMENTED
|
||||
printk("Cannot allocate [%lu] bytes: \e[1MNOT "
|
||||
"IMPLEMENTED!\e[8M\n",
|
||||
size);
|
||||
return NULL;
|
||||
}
|
||||
alloc_index -= LOWEST_POWER;
|
||||
}
|
||||
void** selected_freelist =
|
||||
freelists_all_cpus[core_id].freelists[alloc_index];
|
||||
if (selected_freelist != NULL) {
|
||||
// fast path
|
||||
void** second_item_in_list = *selected_freelist;
|
||||
} else {
|
||||
// slower path
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user