Example #1
0
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;
}
Example #2
0
void *__wrap_malloc(size_t size) {
	if (EarlyMallocEnabled) {
		return early_malloc(size);
	}
	enter_kernel();
	void *mem = __real_malloc(size);
	leave_kernel();
	return mem;
}
Example #3
0
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;
}