5 #include "ke/spinlock.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);
18 kePrint("Out of kernel space.\n");
22 for (i
= 0; i
< (memsize
+ 0xFFF) / 0x1000; ++i
)
24 uintptr_t paddr
= mmAllocPhysicalMemory(0, 0, 0x1000);
27 kePrint("Out of kernel space.\n");
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
);
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());
60 for (i
= 0; i
< (memsize
+ 0xFFF) / 0x1000; ++i
)
62 uintptr_t vaddr
= (uintptr_t)addr
+ i
* 0x1000;
63 uintptr_t paddr
= mmKernelGetPhysAddress(vaddr
);
65 mmFreePhysicalMemory(paddr
, 0x1000);
66 mmMapKernelMemory(paddr
, vaddr
, MM_MAP_READ
| MM_MAP_WRITE
);
69 keUnlockSpinlock(mmGetMemoryLock());
70 keSetExecutionLevel(oldlevel
);
73 void *realloc(void *ptr
, size_t size
)
76 if (ptr
) srcsize
= *(uint32_t*)((uintptr_t)ptr
- 4);
79 void *newdata
= malloc(size
);
80 memcpy(newdata
, ptr
, srcsize
);