Fixed stuff to work with high kernel address.

alentours-dev
q3k 2012-07-08 11:19:00 +02:00
parent ec47899cc4
commit c97b395c1e
3 changed files with 5 additions and 7 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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)