Fixed stuff to work with high kernel address.
parent
ec47899cc4
commit
c97b395c1e
|
@ -87,7 +87,7 @@ void paging_kernel_initialize(u64 KernelVirtualStart, u64 KernelPhysicalStart, u
|
||||||
void paging_temp_page_setup(T_LOAD_CONTEXT *LoadContext);
|
void paging_temp_page_setup(T_LOAD_CONTEXT *LoadContext);
|
||||||
const inline u64 paging_temp_page_get_virtual(void)
|
const inline u64 paging_temp_page_get_virtual(void)
|
||||||
{
|
{
|
||||||
return 0xFF000000 + 511 * 0x1000;
|
return 0xFFFFFFFF80000000 + 511 * 0x1000;
|
||||||
}
|
}
|
||||||
void paging_temp_page_set_physical(u64 Physical);
|
void paging_temp_page_set_physical(u64 Physical);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@ void kmain(u32 LoadContextAddress)
|
||||||
kprintf("[i] Welcome to Cucumber (x86-64)!\n");
|
kprintf("[i] Welcome to Cucumber (x86-64)!\n");
|
||||||
kprintf("[i] %s\n\n", CUCUMBER_VERION);
|
kprintf("[i] %s\n\n", CUCUMBER_VERION);
|
||||||
kprintf("[i] Load Context @%x \n", LoadContext);
|
kprintf("[i] Load Context @%x \n", LoadContext);
|
||||||
for(;;){}
|
|
||||||
if (!LoadContext->MultibootUsed)
|
if (!LoadContext->MultibootUsed)
|
||||||
PANIC("No Multiboot header provided by loader!");
|
PANIC("No Multiboot header provided by loader!");
|
||||||
|
|
||||||
|
@ -68,8 +67,7 @@ void kmain(u32 LoadContextAddress)
|
||||||
|
|
||||||
paging_kernel_initialize((u64)&_start, LoadContext->KernelPhysicalStart, LoadContext->KernelPhysicalEnd - LoadContext->KernelPhysicalStart);
|
paging_kernel_initialize((u64)&_start, LoadContext->KernelPhysicalStart, LoadContext->KernelPhysicalEnd - LoadContext->KernelPhysicalStart);
|
||||||
paging_temp_page_setup(LoadContext);
|
paging_temp_page_setup(LoadContext);
|
||||||
paging_minivmm_setup((u64)&_end, 0xFF000000 + 511 * 4096);
|
paging_minivmm_setup((u64)&_end, 0xFFFFFFFF80000000 + 511 * 0x1000);
|
||||||
|
|
||||||
// Let's create a new kernel stack
|
// Let's create a new kernel stack
|
||||||
u64 StackVirtual = paging_minivmm_allocate();
|
u64 StackVirtual = paging_minivmm_allocate();
|
||||||
kprintf("[i] New kernel stack 0x%x\n", StackVirtual);
|
kprintf("[i] New kernel stack 0x%x\n", StackVirtual);
|
||||||
|
@ -81,7 +79,6 @@ void kmain(u32 LoadContextAddress)
|
||||||
// (and prevent gcc from inlinin the function call)
|
// (and prevent gcc from inlinin the function call)
|
||||||
void (*kmain_newstack_ptr)() = kmain_newstack;
|
void (*kmain_newstack_ptr)() = kmain_newstack;
|
||||||
kmain_newstack_ptr();
|
kmain_newstack_ptr();
|
||||||
for(;;){}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void kmain_newstack(void)
|
void kmain_newstack(void)
|
||||||
|
|
|
@ -30,7 +30,7 @@ T_PAGING_ML4 *paging_get_ml4(void)
|
||||||
void paging_temp_page_setup(T_LOAD_CONTEXT *LoadContext)
|
void paging_temp_page_setup(T_LOAD_CONTEXT *LoadContext)
|
||||||
{
|
{
|
||||||
// Try using page 511 (last) from kernel table
|
// Try using page 511 (last) from kernel table
|
||||||
u64 PageVirtual = 0xFF000000 + 511 * 4096;
|
u64 PageVirtual = 0xFFFFFFFF80000000 + 511 * 4096;
|
||||||
u64 MaxMapped = 4096 * 512; // first 2Mib by loader
|
u64 MaxMapped = 4096 * 512; // first 2Mib by loader
|
||||||
|
|
||||||
u64 KernelSize = LoadContext->KernelPhysicalEnd - LoadContext->KernelPhysicalStart;
|
u64 KernelSize = LoadContext->KernelPhysicalEnd - LoadContext->KernelPhysicalStart;
|
||||||
|
@ -75,7 +75,7 @@ void paging_temp_page_set_physical(u64 Physical)
|
||||||
// TODO: check if smaller than maxphyaddr
|
// TODO: check if smaller than maxphyaddr
|
||||||
|
|
||||||
g_KernelPaging.TempPage->Physical = Physical >> 12;
|
g_KernelPaging.TempPage->Physical = Physical >> 12;
|
||||||
__asm__ volatile("invlpg %0" :: "m"(*(u32 *)g_KernelPaging.TempPageVirtual));
|
__asm__ volatile("invlpg %0" :: "m"(*(u64 *)g_KernelPaging.TempPageVirtual));
|
||||||
}
|
}
|
||||||
|
|
||||||
void paging_kernel_initialize(u64 KernelVirtualStart, u64 KernelPhysicalStart, u64 KernelSize)
|
void paging_kernel_initialize(u64 KernelVirtualStart, u64 KernelPhysicalStart, u64 KernelSize)
|
||||||
|
@ -113,6 +113,7 @@ void paging_minivmm_setup(u64 Start, u64 End)
|
||||||
g_MiniVMM.Start = Start;
|
g_MiniVMM.Start = Start;
|
||||||
g_MiniVMM.End = End;
|
g_MiniVMM.End = End;
|
||||||
g_MiniVMM.Top = Start;
|
g_MiniVMM.Top = Start;
|
||||||
|
kprintf("[i] MiniVMM: %x - %x.\n", Start, End);
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 paging_minivmm_allocate(void)
|
u64 paging_minivmm_allocate(void)
|
||||||
|
|
Loading…
Reference in New Issue