uint64_t *create_pml4(void) { uint64_t *pml4, *pdpt, *pd; pml4 = (uint64_t *)early_malloc(1); if (pml4 == 0) { return 0; } memset(pml4, 0, 0x1000); pdpt = (uint64_t *)early_malloc(1); if (pdpt == 0) { return 0; } memset(pdpt, 0, 0x1000); pd = (uint64_t *)early_malloc(1); if (pd == 0) { return 0; } memset(pd, 0, 0x1000); pml4[511] = PAGE_PRESENT | PAGE_READ_WRITE | ((uintptr_t)pdpt - START_KERNEL_MAP); pdpt[510] = PAGE_PRESENT | PAGE_READ_WRITE | ((uintptr_t)pd - START_KERNEL_MAP); for (int j = 0; j <= kernel_page_directory_num; ++j) { uint64_t *pt = (uint64_t *)early_malloc(1); if (pt == 0) { return 0; } memset(pt, 0, 0x1000); for (int i = 0; i < 512; ++i) { pt[i] = PAGE_PRESENT | PAGE_READ_WRITE | (((uintptr_t)i << 12) + (j * 0x200000)); } pd[j] = PAGE_PRESENT | PAGE_READ_WRITE | ((intptr_t)pt - START_KERNEL_MAP); } return pml4; }
void *__wrap_malloc(size_t size) { if (EarlyMallocEnabled) { return early_malloc(size); } enter_kernel(); void *mem = __real_malloc(size); leave_kernel(); return mem; }
bool init_tss(void) { uintptr_t stack = early_malloc(1); if (stack == 0) { return false; } memset((void *)stack, 0, 0x1000); tss.rsp0 = stack + 0x1000; stack = early_malloc(1); if (stack == 0) { return false; } memset((void *)stack, 0, 0x1000); tss.ist[0] = stack + 0x1000; set_tss_desc((uintptr_t)&tss); __asm__ volatile("ltr %w0" ::"r"(TASK_STATE_SEGMENT)); return true; }