diff options
author | Marvin Borner | 2020-01-20 23:12:54 +0100 |
---|---|---|
committer | Marvin Borner | 2020-01-20 23:12:54 +0100 |
commit | 391ed256d21a6ae2e2456d1809f357e6e96e15d1 (patch) | |
tree | 0fe9ffb3c59bbfeb3d8a04ab7fc6efba60d81e79 /src/kernel/lib/stdlib | |
parent | d5d1749257ff8b9aa6b5ace4b4720b484a2860f3 (diff) |
Added pure awesomeness
Actually quite some days of work but ok
Diffstat (limited to 'src/kernel/lib/stdlib')
-rw-r--r-- | src/kernel/lib/stdlib/atoi.c | 2 | ||||
-rw-r--r-- | src/kernel/lib/stdlib/htoa.c | 4 | ||||
-rw-r--r-- | src/kernel/lib/stdlib/htoi.c | 2 | ||||
-rw-r--r-- | src/kernel/lib/stdlib/itoa.c | 10 | ||||
-rw-r--r-- | src/kernel/lib/stdlib/liballoc.c | 785 | ||||
-rw-r--r-- | src/kernel/lib/stdlib/liballoc.h | 30 |
6 files changed, 9 insertions, 824 deletions
diff --git a/src/kernel/lib/stdlib/atoi.c b/src/kernel/lib/stdlib/atoi.c index 4044972..bcdd395 100644 --- a/src/kernel/lib/stdlib/atoi.c +++ b/src/kernel/lib/stdlib/atoi.c @@ -16,7 +16,7 @@ int atoi(char *str) int ret = 0; for (; i < s_str; i++) { - ret += (str[i] - '0') * pow(10, (s_str - i) - 1); + ret += (str[i] - '0') * pow(10, (int) ((s_str - i) - 1)); } if (negative) ret *= -1; diff --git a/src/kernel/lib/stdlib/htoa.c b/src/kernel/lib/stdlib/htoa.c index 660e26c..ccb01f1 100644 --- a/src/kernel/lib/stdlib/htoa.c +++ b/src/kernel/lib/stdlib/htoa.c @@ -1,12 +1,12 @@ #include <stdint.h> #include <kernel/lib/string.h> -#include <kernel/lib/stdlib.h> +#include <kernel/memory/kheap.h> static const char HTOA_TABLE[] = "0123456789ABCDEF"; char *htoa(uint32_t n) { - char *ret = kmalloc(10); + char *ret = (char *) kmalloc(10); int i = 0; while (n) { diff --git a/src/kernel/lib/stdlib/htoi.c b/src/kernel/lib/stdlib/htoi.c index f2d4702..cc77e16 100644 --- a/src/kernel/lib/stdlib/htoi.c +++ b/src/kernel/lib/stdlib/htoi.c @@ -16,7 +16,7 @@ int htoi(char *str) else if (c >= 'A' && c <= 'F') aux = (c - 'A') + 10; - ret += aux * pow(16, (s_str - i) - 1); + ret += aux * pow(16, (int) ((s_str - i) - 1)); } return ret; diff --git a/src/kernel/lib/stdlib/itoa.c b/src/kernel/lib/stdlib/itoa.c index 67273b3..ea03aa2 100644 --- a/src/kernel/lib/stdlib/itoa.c +++ b/src/kernel/lib/stdlib/itoa.c @@ -1,8 +1,8 @@ #include <kernel/lib/math.h> #include <stdint.h> #include <kernel/lib/string.h> -#include <kernel/lib/stdlib.h> -#include <kernel/paging/paging.h> +#include <kernel/memory/kheap.h> +#include <kernel/memory/paging.h> static const char ITOA_TABLE[] = "0123456789"; @@ -12,7 +12,7 @@ char *itoa(int n) return "0"; // kmalloc isn't available if (!n) { - char *ret = kmalloc(2); + char *ret = (char *) kmalloc(2); ret[0] = '0'; ret[1] = 0; return ret; @@ -23,7 +23,7 @@ char *itoa(int n) int sz; for (sz = 0; n % pow(10, sz) != n; sz++) {} - char *ret = kmalloc(sz + 1); + char *ret = (char *) kmalloc((uint32_t) (sz + 1)); for (int i = 0; i < sz; i++) { int digit = (n % pow(10, i + 1)) / pow(10, i); @@ -32,7 +32,7 @@ char *itoa(int n) ret[sz] = 0; if (negative) { - char *aux = kmalloc(sz + 2); + char *aux = (char *) kmalloc((uint32_t) (sz + 2)); strcpy(aux, ret); aux[sz] = '-'; aux[sz + 1] = 0; diff --git a/src/kernel/lib/stdlib/liballoc.c b/src/kernel/lib/stdlib/liballoc.c deleted file mode 100644 index c1a5de1..0000000 --- a/src/kernel/lib/stdlib/liballoc.c +++ /dev/null @@ -1,785 +0,0 @@ -/** - * TODO: This file suffers from major ugliness and needs a cleanup! - */ - -#include <stddef.h> -#include <stdint.h> -#include <kernel/paging/paging.h> - -int liballoc_lock() -{ - // asm ("cli"); - return 0; -} - -int liballoc_unlock() -{ - // asm ("sti"); - return 0; -} - -void *liballoc_alloc(size_t p) -{ - uint32_t ptr = paging_alloc_pages((uint32_t) p); - return (void *) ptr; -} - -int liballoc_free(void *ptr, size_t p) -{ - paging_set_free((uint32_t) ptr, (uint32_t) p); - return 0; -} - -#define ALIGNMENT 16ul -#define ALIGN_TYPE char -#define ALIGN_INFO sizeof(ALIGN_TYPE) * 16 - -#define ALIGN(ptr) \ - if ( ALIGNMENT > 1 ) { \ - uintptr_t diff; \ - ptr = (void*) ((uintptr_t) ptr + ALIGN_INFO); \ - diff = (uintptr_t) ptr & (ALIGNMENT - 1); \ - if (diff != 0) { \ - diff = ALIGNMENT - diff; \ - ptr = (void*) ((uintptr_t) ptr + diff); \ - } \ - *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)) = diff + ALIGN_INFO; \ - } - -#define UNALIGN(ptr) \ - if (ALIGNMENT > 1) { \ - uintptr_t diff = *((ALIGN_TYPE*) ((uintptr_t) ptr - ALIGN_INFO)); \ - if (diff < (ALIGNMENT + ALIGN_INFO)) { \ - ptr = (void*) ((uintptr_t) ptr - diff); \ - } \ - } - -#define LIBALLOC_MAGIC 0x900df00d -#define LIBALLOC_DEAD 0xbaadf00d - -struct liballoc_major { - struct liballoc_major *prev; - struct liballoc_major *next; - unsigned int pages; - unsigned int size; - unsigned int usage; - struct liballoc_minor *first; -}; - -struct liballoc_minor { - struct liballoc_minor *prev; - struct liballoc_minor *next; - struct liballoc_major *block; - unsigned int magic; - unsigned int size; - unsigned int req_size; -}; - -static struct liballoc_major *l_mem_root = NULL; -static struct liballoc_major *l_best_bet = NULL; - -static unsigned int l_page_size = 4096; -static unsigned int l_page_count = 16; -static unsigned long long l_allocated = 0; -static unsigned long long l_in_use = 0; -static long long l_warning_count = 0; -static long long l_error_count = 0; -static long long l_possible_overruns = 0; -static struct liballoc_major *l_mem_root_user = NULL; -static struct liballoc_major *l_best_bet_user = NULL; - -static unsigned long long l_allocated_user = 0; -static unsigned long long l_in_use_user = 0; -static long long l_warning_count_user = 0; -static long long l_error_count_user = 0; -static long long l_possible_overruns_user = 0; - -static void *liballoc_memset(void *s, int c, size_t n) -{ - unsigned int i; - for (i = 0; i < n; i++) - ((char *) s)[i] = c; - - return s; -} - -static void *liballoc_memcpy(void *s1, const void *s2, size_t n) -{ - char *cdest; - char *csrc; - unsigned int *ldest = (unsigned int *) s1; - unsigned int *lsrc = (unsigned int *) s2; - - while (n >= sizeof(unsigned int)) { - *ldest++ = *lsrc++; - n -= sizeof(unsigned int); - } - - cdest = (char *) ldest; - csrc = (char *) lsrc; - - while (n > 0) { - *cdest++ = *csrc++; - n -= 1; - } - return s1; -} - -static struct liballoc_major *allocate_new_page(unsigned int size, unsigned int shared) -{ - unsigned int st; - struct liballoc_major *maj; - - st = size + sizeof(struct liballoc_major); - st += sizeof(struct liballoc_minor); - - if ((st % l_page_size) == 0) - st = st / (l_page_size); - else - st = st / (l_page_size) + 1; - - if (st < l_page_count) st = l_page_count; - - maj = (struct liballoc_major *) liballoc_alloc(st); - if (shared == 1) paging_set_user((uint32_t) maj, st); - - if (maj == NULL) { - if (shared == 1) - l_warning_count_user += 1; - else - l_warning_count += 1; - return NULL; - } - - maj->prev = NULL; - maj->next = NULL; - maj->pages = st; - maj->size = st * l_page_size; - maj->usage = sizeof(struct liballoc_major); - maj->first = NULL; - - if (shared == 1) - l_allocated_user += maj->size; - else - l_allocated += maj->size; - - return maj; -} - -/** - * KERNEL SECTION -*/ - -void *kmalloc(size_t req_size) -{ - int started_bet = 0; - unsigned long long best_size = 0; - void *p = NULL; - uintptr_t diff; - struct liballoc_major *maj; - struct liballoc_minor *min; - struct liballoc_minor *new_min; - unsigned long size = req_size; - - if (ALIGNMENT > 1) { - size += ALIGNMENT + ALIGN_INFO; - } - - liballoc_lock(); - - if (size == 0) { - l_warning_count += 1; - liballoc_unlock(); - return kmalloc(1); - } - - if (l_mem_root == NULL) { - l_mem_root = allocate_new_page(size, 0); - if (l_mem_root == NULL) { - liballoc_unlock(); - return NULL; - } - } - - maj = l_mem_root; - started_bet = 0; - - if (l_best_bet != NULL) { - best_size = l_best_bet->size - l_best_bet->usage; - - if (best_size > (size + sizeof(struct liballoc_minor))) { - maj = l_best_bet; - started_bet = 1; - } - } - - while (maj != NULL) { - diff = maj->size - maj->usage; - if (best_size < diff) { - l_best_bet = maj; - best_size = diff; - } - - // Use-case 1 - if (diff < (size + sizeof(struct liballoc_minor))) { - if (maj->next != NULL) { - maj = maj->next; - continue; - } - - if (started_bet == 1) { - maj = l_mem_root; - started_bet = 0; - continue; - } - - maj->next = allocate_new_page(size, 0); - if (maj->next == NULL) break; - maj->next->prev = maj; - maj = maj->next; - } - - // Use-case 2 - if (maj->first == NULL) { - maj->first = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->next = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - - // Use-case 3 - diff = (uintptr_t) (maj->first); - diff -= (uintptr_t) maj; - diff -= sizeof(struct liballoc_major); - - if (diff >= (size + sizeof(struct liballoc_minor))) { - maj->first->prev = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - maj->first->prev->next = maj->first; - maj->first = maj->first->prev; - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - - // Use-case 4 - min = maj->first; - while (min != NULL) { - if (min->next == NULL) { - diff = (uintptr_t) (maj) + maj->size; - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - if (diff >= (size + sizeof(struct liballoc_minor))) { - min->next = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - min->next->prev = min; - min = min->next; - min->next = NULL; - min->magic = LIBALLOC_MAGIC; - min->block = maj; - min->size = size; - min->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use += size; - p = (void *) ((uintptr_t) min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - if (min->next != NULL) { - diff = (uintptr_t) (min->next); - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - - if (diff >= (size + sizeof(struct liballoc_minor))) { - new_min = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - new_min->magic = LIBALLOC_MAGIC; - new_min->next = min->next; - new_min->prev = min; - new_min->size = size; - new_min->req_size = req_size; - new_min->block = maj; - min->next->prev = new_min; - min->next = new_min; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use += size; - p = (void *) ((uintptr_t) new_min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - return p; - } - } - - min = min->next; - } - - // Use-case 5 - if (maj->next == NULL) { - if (started_bet == 1) { - maj = l_mem_root; - started_bet = 0; - continue; - } - maj->next = allocate_new_page(size, 0); - if (maj->next == NULL) break; - maj->next->prev = maj; - } - maj = maj->next; - } - - liballoc_unlock(); - - return NULL; -} - -void kfree(void *ptr) -{ - struct liballoc_minor *min; - struct liballoc_major *maj; - - if (ptr == NULL) { - l_warning_count += 1; - return; - } - - UNALIGN(ptr); - liballoc_lock(); - - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_error_count += 1; - - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possible_overruns += 1; - } - - liballoc_unlock(); - return; - } - - maj = min->block; - l_in_use -= min->size; - maj->usage -= (min->size + sizeof(struct liballoc_minor)); - min->magic = LIBALLOC_DEAD; - - if (min->next != NULL) min->next->prev = min->prev; - if (min->prev != NULL) min->prev->next = min->next; - if (min->prev == NULL) maj->first = min->next; - if (maj->first == NULL) { - if (l_mem_root == maj) l_mem_root = maj->next; - if (l_best_bet == maj) l_best_bet = NULL; - if (maj->prev != NULL) maj->prev->next = maj->next; - if (maj->next != NULL) maj->next->prev = maj->prev; - l_allocated -= maj->size; - liballoc_free(maj, maj->pages); - } else { - if (l_best_bet != NULL) { - int best_size = l_best_bet->size - l_best_bet->usage; - int majSize = maj->size - maj->usage; - if (majSize > best_size) l_best_bet = maj; - } - } - liballoc_unlock(); -} - -void *kcalloc(size_t nobj, size_t size) -{ - int real_size; - void *p; - - real_size = nobj * size; - - p = kmalloc(real_size); - - liballoc_memset(p, 0, real_size); - - return p; -} - -void *krealloc(void *p, size_t size) -{ - void *ptr; - struct liballoc_minor *min; - unsigned int real_size; - - if (size == 0) { - kfree(p); - return NULL; - } - - if (p == NULL) return kmalloc(size); - - ptr = p; - UNALIGN(ptr); - liballoc_lock(); - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_error_count += 1; - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possible_overruns += 1; - } - - liballoc_unlock(); - return NULL; - } - - real_size = min->req_size; - - if (real_size >= size) { - min->req_size = size; - liballoc_unlock(); - return p; - } - - liballoc_unlock(); - - ptr = kmalloc(size); - liballoc_memcpy(ptr, p, real_size); - kfree(p); - - return ptr; -} - -/** - * USER SECTION -*/ - -void *umalloc(size_t req_size) -{ - paging_switch_directory(1); - int started_bet = 0; - unsigned long long best_size = 0; - void *p = NULL; - uintptr_t diff; - struct liballoc_major *maj; - struct liballoc_minor *min; - struct liballoc_minor *new_min; - unsigned long size = req_size; - - if (ALIGNMENT > 1) { - size += ALIGNMENT + ALIGN_INFO; - } - - liballoc_lock(); - - if (size == 0) { - l_warning_count_user += 1; - liballoc_unlock(); - return umalloc(1); - } - - if (l_mem_root_user == NULL) { - l_mem_root_user = allocate_new_page(size, 1); - if (l_mem_root_user == NULL) { - liballoc_unlock(); - paging_switch_directory(0); - return NULL; - } - } - - maj = l_mem_root_user; - started_bet = 0; - - if (l_best_bet_user != NULL) { - best_size = l_best_bet_user->size - l_best_bet_user->usage; - - if (best_size > (size + sizeof(struct liballoc_minor))) { - maj = l_best_bet_user; - started_bet = 1; - } - } - - while (maj != NULL) { - diff = maj->size - maj->usage; - if (best_size < diff) { - l_best_bet_user = maj; - best_size = diff; - } - - // Use-case 1 - if (diff < (size + sizeof(struct liballoc_minor))) { - if (maj->next != NULL) { - maj = maj->next; - continue; - } - - if (started_bet == 1) { - maj = l_mem_root_user; - started_bet = 0; - continue; - } - - maj->next = allocate_new_page(size, 1); - if (maj->next == NULL) break; - maj->next->prev = maj; - maj = maj->next; - } - - // Use-case 2 - if (maj->first == NULL) { - maj->first = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->next = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use_user += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - paging_switch_directory(0); - return p; - } - - // Use-case 3 - diff = (uintptr_t) (maj->first); - diff -= (uintptr_t) maj; - diff -= sizeof(struct liballoc_major); - - if (diff >= (size + sizeof(struct liballoc_minor))) { - maj->first->prev = (struct liballoc_minor *) ((uintptr_t) maj + sizeof(struct liballoc_major)); - maj->first->prev->next = maj->first; - maj->first = maj->first->prev; - maj->first->magic = LIBALLOC_MAGIC; - maj->first->prev = NULL; - maj->first->block = maj; - maj->first->size = size; - maj->first->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use_user += size; - p = (void *) ((uintptr_t) (maj->first) + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - paging_switch_directory(0); - return p; - } - - // Use-case 4 - min = maj->first; - while (min != NULL) { - if (min->next == NULL) { - diff = (uintptr_t) (maj) + maj->size; - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - if (diff >= (size + sizeof(struct liballoc_minor))) { - min->next = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - min->next->prev = min; - min = min->next; - min->next = NULL; - min->magic = LIBALLOC_MAGIC; - min->block = maj; - min->size = size; - min->req_size = req_size; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use_user += size; - p = (void *) ((uintptr_t) min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - paging_switch_directory(0); - return p; - } - } - - if (min->next != NULL) { - diff = (uintptr_t) (min->next); - diff -= (uintptr_t) min; - diff -= sizeof(struct liballoc_minor); - diff -= min->size; - - if (diff >= (size + sizeof(struct liballoc_minor))) { - new_min = (struct liballoc_minor *) ((uintptr_t) min + sizeof(struct liballoc_minor) + min->size); - new_min->magic = LIBALLOC_MAGIC; - new_min->next = min->next; - new_min->prev = min; - new_min->size = size; - new_min->req_size = req_size; - new_min->block = maj; - min->next->prev = new_min; - min->next = new_min; - maj->usage += size + sizeof(struct liballoc_minor); - l_in_use_user += size; - p = (void *) ((uintptr_t) new_min + sizeof(struct liballoc_minor)); - ALIGN(p); - liballoc_unlock(); - paging_switch_directory(0); - return p; - } - } - - min = min->next; - } - - // Use-case 5 - if (maj->next == NULL) { - if (started_bet == 1) { - maj = l_mem_root_user; - started_bet = 0; - continue; - } - maj->next = allocate_new_page(size, 1); - if (maj->next == NULL) break; - maj->next->prev = maj; - } - maj = maj->next; - } - - liballoc_unlock(); - - paging_switch_directory(0); - return NULL; -} - -void ufree(void *ptr) -{ - paging_switch_directory(1); - struct liballoc_minor *min; - struct liballoc_major *maj; - - if (ptr == NULL) { - l_warning_count_user += 1; - paging_switch_directory(0); - return; - } - - UNALIGN(ptr); - liballoc_lock(); - - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_error_count_user += 1; - - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possible_overruns_user += 1; - } - - liballoc_unlock(); - paging_switch_directory(0); - return; - } - - maj = min->block; - l_in_use_user -= min->size; - maj->usage -= (min->size + sizeof(struct liballoc_minor)); - min->magic = LIBALLOC_DEAD; - - if (min->next != NULL) min->next->prev = min->prev; - if (min->prev != NULL) min->prev->next = min->next; - if (min->prev == NULL) maj->first = min->next; - if (maj->first == NULL) { - if (l_mem_root_user == maj) l_mem_root_user = maj->next; - if (l_best_bet_user == maj) l_best_bet_user = NULL; - if (maj->prev != NULL) maj->prev->next = maj->next; - if (maj->next != NULL) maj->next->prev = maj->prev; - l_allocated_user -= maj->size; - liballoc_free(maj, maj->pages); - } else { - if (l_best_bet_user != NULL) { - int best_size = l_best_bet_user->size - l_best_bet_user->usage; - int majSize = maj->size - maj->usage; - if (majSize > best_size) l_best_bet_user = maj; - } - } - liballoc_unlock(); - paging_switch_directory(0); -} - -void *ucalloc(size_t nobj, size_t size) -{ - paging_switch_directory(1); - int real_size; - void *p; - - real_size = nobj * size; - - p = umalloc(real_size); - - liballoc_memset(p, 0, real_size); - - paging_switch_directory(0); - return p; -} - -void *urealloc(void *p, size_t size) -{ - paging_switch_directory(1); - void *ptr; - struct liballoc_minor *min; - unsigned int real_size; - - if (size == 0) { - ufree(p); - paging_switch_directory(0); - return NULL; - } - - if (p == NULL) return umalloc(size); - - ptr = p; - UNALIGN(ptr); - liballoc_lock(); - min = (struct liballoc_minor *) ((uintptr_t) ptr - sizeof(struct liballoc_minor)); - - if (min->magic != LIBALLOC_MAGIC) { - l_error_count_user += 1; - if (((min->magic & 0xFFFFFF) == (LIBALLOC_MAGIC & 0xFFFFFF)) || - ((min->magic & 0xFFFF) == (LIBALLOC_MAGIC & 0xFFFF)) || - ((min->magic & 0xFF) == (LIBALLOC_MAGIC & 0xFF))) { - l_possible_overruns_user += 1; - } - - liballoc_unlock(); - paging_switch_directory(0); - return NULL; - } - - real_size = min->req_size; - - if (real_size >= size) { - min->req_size = size; - liballoc_unlock(); - paging_switch_directory(0); - return p; - } - - liballoc_unlock(); - - ptr = umalloc(size); - liballoc_memcpy(ptr, p, real_size); - ufree(p); - - paging_switch_directory(0); - return ptr; -}
\ No newline at end of file diff --git a/src/kernel/lib/stdlib/liballoc.h b/src/kernel/lib/stdlib/liballoc.h deleted file mode 100644 index 37a1624..0000000 --- a/src/kernel/lib/stdlib/liballoc.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef MELVIX_ALLOC_H -#define MELVIX_ALLOC_H - -#include <stddef.h> - -int liballoc_lock(); - -int liballoc_unlock(); - -void *liballoc_alloc(size_t); - -int liballoc_free(void *, size_t); - -void *kmalloc(size_t); - -void *krealloc(void *, size_t); - -void *kcalloc(size_t, size_t); - -void kfree(void *); - -void *umalloc(size_t); - -void *urealloc(void *, size_t); - -void *ucalloc(size_t, size_t); - -void ufree(void *); - -#endif |