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);
|
||||
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);
|
||||
|
||||
|
|
|
@ -43,7 +43,6 @@ void kmain(u32 LoadContextAddress)
|
|||
kprintf("[i] Welcome to Cucumber (x86-64)!\n");
|
||||
kprintf("[i] %s\n\n", CUCUMBER_VERION);
|
||||
kprintf("[i] Load Context @%x \n", LoadContext);
|
||||
for(;;){}
|
||||
if (!LoadContext->MultibootUsed)
|
||||
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_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
|
||||
u64 StackVirtual = paging_minivmm_allocate();
|
||||
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)
|
||||
void (*kmain_newstack_ptr)() = kmain_newstack;
|
||||
kmain_newstack_ptr();
|
||||
for(;;){}
|
||||
}
|
||||
|
||||
void kmain_newstack(void)
|
||||
|
|
|
@ -30,7 +30,7 @@ T_PAGING_ML4 *paging_get_ml4(void)
|
|||
void paging_temp_page_setup(T_LOAD_CONTEXT *LoadContext)
|
||||
{
|
||||
// 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 KernelSize = LoadContext->KernelPhysicalEnd - LoadContext->KernelPhysicalStart;
|
||||
|
@ -75,7 +75,7 @@ void paging_temp_page_set_physical(u64 Physical)
|
|||
// TODO: check if smaller than maxphyaddr
|
||||
|
||||
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)
|
||||
|
@ -113,6 +113,7 @@ void paging_minivmm_setup(u64 Start, u64 End)
|
|||
g_MiniVMM.Start = Start;
|
||||
g_MiniVMM.End = End;
|
||||
g_MiniVMM.Top = Start;
|
||||
kprintf("[i] MiniVMM: %x - %x.\n", Start, End);
|
||||
}
|
||||
|
||||
u64 paging_minivmm_allocate(void)
|
||||
|
|
Loading…
Reference in New Issue