From 4a431f7d9305a5c0df49b718bed321132ef57f62 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 26 Oct 2022 00:05:49 -0400 Subject: [PATCH] Use hulk.pagetable from hello --- src/hello/hello.d | 43 +++++++++++++++++++------------------------ src/hos/page_table.d | 33 --------------------------------- 2 files changed, 19 insertions(+), 57 deletions(-) delete mode 100644 src/hos/page_table.d diff --git a/src/hello/hello.d b/src/hello/hello.d index f1f4007..c8ae8f3 100644 --- a/src/hello/hello.d +++ b/src/hello/hello.d @@ -8,7 +8,7 @@ import hello.console; import hello.scratch; import hulk.bootinfo; import hulk.header; -import hos.page_table; +import hulk.pagetable; import hos.cpu; import hos.memory; import ldc.llvmasm; @@ -238,9 +238,9 @@ private void get_memory_map(ulong * bss_phys, ulong * stack_phys, ulong * physic /** * Allocate a new page table. */ -private PageTableEntry * new_page_table() +private PageTable * new_page_table() { - PageTableEntry * pt = cast(PageTableEntry *)scratch.alloc(1u); + PageTable * pt = cast(PageTable *)scratch.alloc(1u); memset64(pt, 0u, 512); return pt; } @@ -252,19 +252,18 @@ private PageTableEntry * new_page_table() * @param dest_page Destination page address. * @param pt_base Page table base address. */ -private void map4k(ulong source_page, ulong dest_page, PageTableEntry * pt_base) +private void map4k(ulong source_page, ulong dest_page, PageTable * pt_base) { - PageTableEntry * pt = pt_base; - PageTableEntry * next_pt; + PageTable * pt = pt_base; for (size_t level = 0; level < 4u; level++) { - size_t pt_index = PageTableEntry.page_table_index(source_page, level); - if (pt[pt_index].present()) + if ((*pt)[source_page, level].present) { - pt = pt[pt_index].next(); + pt = (*pt)[source_page, level].follow(); } else { + PageTable * next_pt; ulong addr; if (level < 3u) { @@ -275,8 +274,7 @@ private void map4k(ulong source_page, ulong dest_page, PageTableEntry * pt_base) { addr = dest_page; } - pt[pt_index] = PageTableEntry(addr, - 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u); + (*pt)[source_page, level] = PageTableEntry(addr, PT_WRITABLE | PT_PRESENT); pt = next_pt; } } @@ -290,7 +288,7 @@ private void map4k(ulong source_page, ulong dest_page, PageTableEntry * pt_base) * @param size Region size. * @param pt_base Page table base address. */ -private void map4kregion(ulong source, ulong dest, size_t size, PageTableEntry * pt_base) +private void map4kregion(ulong source, ulong dest, size_t size, PageTable * pt_base) { ulong end = source + size; while (source < end) @@ -308,29 +306,26 @@ private void map4kregion(ulong source, ulong dest, size_t size, PageTableEntry * * @param dest_page Destination page address. * @param pt_base Page table base address. */ -private void map2m(ulong source_page, ulong dest_page, PageTableEntry * pt_base) +private void map2m(ulong source_page, ulong dest_page, PageTable * pt_base) { - PageTableEntry * pt = pt_base; - PageTableEntry * next_pt; + PageTable * pt = pt_base; for (size_t level = 0; level < 3u; level++) { - size_t pt_index = PageTableEntry.page_table_index(source_page, level); - if (pt[pt_index].present()) + if ((*pt)[source_page, level].present) { - pt = pt[pt_index].next(); + pt = (*pt)[source_page, level].follow(); } else { + PageTable * next_pt; if (level < 2u) { next_pt = new_page_table(); - pt[pt_index] = PageTableEntry(cast(ulong)next_pt, - 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u); + (*pt)[source_page, level] = PageTableEntry(next_pt, PT_WRITABLE | PT_PRESENT); } else { - pt[pt_index] = PageTableEntry(dest_page, - 0u, 0u, 1u, 0u, 0u, 0u, 1u, 1u); + (*pt)[source_page, level] = PageTableEntry(dest_page, PT_HUGE_PAGE | PT_WRITABLE | PT_PRESENT); } pt = next_pt; } @@ -342,7 +337,7 @@ private void map2m(ulong source_page, ulong dest_page, PageTableEntry * pt_base) * * @param pt_base Page table base address. */ -private void map_hulk(PageTableEntry * pt_base, ulong bss_phys, ulong stack_phys) +private void map_hulk(PageTable * pt_base, ulong bss_phys, ulong stack_phys) { /* Map HULK bin region. */ ulong virt = hulk_virt_base_address(); @@ -362,7 +357,7 @@ private void map_hulk(PageTableEntry * pt_base, ulong bss_phys, ulong stack_phys */ private void build_page_tables(ulong physical_address_limit, ulong bss_phys, ulong stack_phys) { - PageTableEntry * pt_base = new_page_table(); + PageTable * pt_base = new_page_table(); /* Map physical RAM. */ for (size_t addr = 0u; addr < physical_address_limit; addr += (2u * 1024u * 1024u)) { diff --git a/src/hos/page_table.d b/src/hos/page_table.d deleted file mode 100644 index 59a0767..0000000 --- a/src/hos/page_table.d +++ /dev/null @@ -1,33 +0,0 @@ -struct PageTableEntry -{ - ulong entry; - - this(ulong address, ulong no_execute, ulong global, - ulong huge, ulong disable_cache, ulong write_through, ulong user, - ulong writable, ulong present) - { - entry = (present | - (writable << 1) | - (user << 2) | - (write_through << 3) | - (disable_cache << 4) | - (huge << 7) | - (global << 8) | - (no_execute << 63)) | address; - } - - bool present() - { - return (entry & 0x1u) != 0u; - } - - PageTableEntry * next() - { - return cast(PageTableEntry *)(entry & 0x7FFF_FFFF_FFFF_F000u); - } - - static ulong page_table_index(ulong address, size_t level) - { - return ((address >> (39u - 9u * level)) & 0x1FFu); - } -}