forked from xamidev/pepperOS
alloc_stack ok (HHDM mapped from mmap)
This commit is contained in:
@@ -69,7 +69,7 @@ void paging_map_page(uint64_t* root_table, uint64_t virt, uint64_t phys, uint64_
|
||||
root_table[pml4_i] = VIRT_TO_PHYS(pdpt) | PTE_PRESENT | PTE_WRITABLE;
|
||||
}
|
||||
else {
|
||||
pdpt = (uint64_t *)PHYS_TO_VIRT(root_table[pml4_i] & ~0xFFFULL);
|
||||
pdpt = (uint64_t *)PHYS_TO_VIRT(root_table[pml4_i] & PTE_ADDR_MASK);
|
||||
}
|
||||
|
||||
// PDPT: same here
|
||||
@@ -79,7 +79,7 @@ void paging_map_page(uint64_t* root_table, uint64_t virt, uint64_t phys, uint64_
|
||||
pdpt[pdpt_i] = VIRT_TO_PHYS(pd) | PTE_PRESENT | PTE_WRITABLE;
|
||||
}
|
||||
else {
|
||||
pd = (uint64_t *)PHYS_TO_VIRT(pdpt[pdpt_i] & ~0xFFFULL);
|
||||
pd = (uint64_t *)PHYS_TO_VIRT(pdpt[pdpt_i] & PTE_ADDR_MASK);
|
||||
}
|
||||
|
||||
// PD: and here
|
||||
@@ -89,7 +89,7 @@ void paging_map_page(uint64_t* root_table, uint64_t virt, uint64_t phys, uint64_
|
||||
pd[pd_i] = VIRT_TO_PHYS(pt) | PTE_PRESENT | PTE_WRITABLE;
|
||||
}
|
||||
else {
|
||||
pt = (uint64_t *)PHYS_TO_VIRT(pd[pd_i] & ~0xFFFULL);
|
||||
pt = (uint64_t *)PHYS_TO_VIRT(pd[pd_i] & PTE_ADDR_MASK);
|
||||
}
|
||||
|
||||
// PT: finally, populate the page table entry
|
||||
@@ -102,13 +102,16 @@ void paging_map_page(uint64_t* root_table, uint64_t virt, uint64_t phys, uint64_
|
||||
uint64_t kernel_phys_base;
|
||||
uint64_t kernel_virt_base;
|
||||
|
||||
void paging_init(struct limine_kernel_address_response* kaddr, struct limine_framebuffer* fb)
|
||||
extern struct boot_context boot_ctx;
|
||||
|
||||
void paging_init()
|
||||
{
|
||||
// We should map the kernel, GDT, IDT, stack, framebuffer.
|
||||
// Optionally we could map ACPI tables (we can find them in the Limine memmap)
|
||||
|
||||
kernel_phys_base = kaddr->physical_base;
|
||||
kernel_virt_base = kaddr->virtual_base;
|
||||
kernel_phys_base = boot_ctx.kaddr->physical_base;
|
||||
kernel_virt_base = boot_ctx.kaddr->virtual_base;
|
||||
struct limine_framebuffer* fb = boot_ctx.fb;
|
||||
|
||||
DEBUG("Kernel lives at virt=0x%p phys=0x%p", kernel_virt_base, kernel_phys_base);
|
||||
|
||||
@@ -117,14 +120,38 @@ void paging_init(struct limine_kernel_address_response* kaddr, struct limine_fra
|
||||
// for debug
|
||||
uint64_t page_count = 0;
|
||||
|
||||
// HHDM map first 1 GB using given offset
|
||||
for (uint64_t i=0; i<0x40000000; i += PAGE_SIZE)
|
||||
// Find max physical address from limine memmap
|
||||
uint64_t max_phys = 0;
|
||||
for (uint64_t i=0; i<boot_ctx.mmap->entry_count; i++)
|
||||
{
|
||||
struct limine_memmap_entry* entry = boot_ctx.mmap->entries[i];
|
||||
if (entry->length == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
uint64_t top = entry->base + entry->length;
|
||||
if (top > max_phys)
|
||||
{
|
||||
max_phys = top;
|
||||
}
|
||||
//DEBUG("max_phys=0x%p", max_phys);
|
||||
}
|
||||
|
||||
// 4GB
|
||||
if (max_phys > 0x100000000)
|
||||
{
|
||||
DEBUG("WARNING: max_phys capped to 4GB (0x100000000) (from max_phys=%p)", max_phys);
|
||||
max_phys = 0x100000000;
|
||||
}
|
||||
|
||||
// HHDM map up to max_phys or 4GB, whichever is smaller, using given offset
|
||||
for (uint64_t i=0; i<max_phys; i += PAGE_SIZE)
|
||||
{
|
||||
//paging_kmap_page(i+hhdm_off, i, PTE_WRITABLE);
|
||||
paging_map_page(kernel_pml4, i+hhdm_off, i, PTE_WRITABLE);
|
||||
paging_map_page(kernel_pml4, i+hhdm_off, i, PTE_WRITABLE | PTE_PRESENT);
|
||||
page_count++;
|
||||
}
|
||||
DEBUG("Mapped %u pages for first 1GB (HHDM)", page_count); page_count = 0;
|
||||
DEBUG("Mapped %u pages up to 0x%p (HHDM)", page_count, max_phys); page_count = 0;
|
||||
|
||||
// Map the kernel (according to virt/phys_base given by Limine)
|
||||
// SOME DAY when we want a safer kernel we should map .text as Read/Exec
|
||||
|
||||
Reference in New Issue
Block a user