- Implemented execp*.
[planlOS.git] / system / kernel / ke / dumbmalloc.c
blob694d53caf75f4c7ecf00781e9970f58e9b01c89e
2 #include "mm/memory.h"
3 #include "ke/debug.h"
4 #include "ke/level.h"
5 #include "ke/spinlock.h"
6 #include <string.h>
8 void *malloc(size_t size)
10 uint32_t memsize = size + 4;
11 KeExecLevel oldlevel = keSetExecutionLevel(KE_LEVEL_HIGH);
12 keLockSpinlock(mmGetMemoryLock());
14 uintptr_t vaddr = mmFindFreeKernelPages(MM_MAX_KERNEL_PAGE,
15 MM_MIN_KERNEL_PAGE, 1, (memsize + 0xFFF) & ~0xFFF);
16 if (!vaddr)
18 kePrint("Out of kernel space.\n");
19 return 0;
21 uint32_t i;
22 for (i = 0; i < (memsize + 0xFFF) / 0x1000; ++i)
24 uintptr_t paddr = mmAllocPhysicalMemory(0, 0, 0x1000);
25 if (!paddr)
27 kePrint("Out of kernel space.\n");
28 return 0;
30 mmMapKernelMemory(paddr, vaddr + i * 0x1000, MM_MAP_READ | MM_MAP_WRITE);
33 keUnlockSpinlock(mmGetMemoryLock());
34 keSetExecutionLevel(oldlevel);
36 *(uint32_t*)vaddr = size;
38 memset((void*)(vaddr + 4), 0xF0, size);
40 return (void*)(vaddr + 4);
43 void *calloc(size_t nmemb, size_t size)
45 void *data = malloc(nmemb * size);
46 memset(data, 0, nmemb * size);
47 return data;
50 void free(void *ptr)
52 if (!ptr) return;
53 uintptr_t addr = (uintptr_t)ptr - 4;
54 uint32_t memsize = *(uint32_t*)addr + 4;
56 KeExecLevel oldlevel = keSetExecutionLevel(KE_LEVEL_HIGH);
57 keLockSpinlock(mmGetMemoryLock());
59 uint32_t i;
60 for (i = 0; i < (memsize + 0xFFF) / 0x1000; ++i)
62 uintptr_t vaddr = (uintptr_t)addr + i * 0x1000;
63 uintptr_t paddr = mmKernelGetPhysAddress(vaddr);
64 if (paddr != 0)
65 mmFreePhysicalMemory(paddr, 0x1000);
66 mmMapKernelMemory(0, vaddr, 0);
69 keUnlockSpinlock(mmGetMemoryLock());
70 keSetExecutionLevel(oldlevel);
73 void *realloc(void *ptr, size_t size)
75 uint32_t srcsize = 0;
76 if (ptr) srcsize = *(uint32_t*)((uintptr_t)ptr - 4);
77 if (size > srcsize)
79 void *newdata = malloc(size);
80 memcpy(newdata, ptr, srcsize);
81 free(ptr);
82 return newdata;
84 else
85 return ptr;