diff --git a/src/hello/hello.d b/src/hello/hello.d index 1707dfe..d532115 100644 --- a/src/hello/hello.d +++ b/src/hello/hello.d @@ -257,9 +257,11 @@ private void map4k(ulong source_page, ulong dest_page, PageTable * pt_base) PageTable * pt = pt_base; for (size_t level = 0; level < 4u; level++) { - if ((*pt)[source_page, level].present) + PageTableEntry * ppte = pt.entry(source_page, level); + PageTableEntry pte = *ppte; + if (pte.present) { - pt = (*pt)[source_page, level].follow(); + pt = pte.follow(); } else { @@ -274,7 +276,7 @@ private void map4k(ulong source_page, ulong dest_page, PageTable * pt_base) { addr = dest_page; } - (*pt)[source_page, level] = PageTableEntry(addr, PT_WRITABLE | PT_PRESENT); + *ppte = PageTableEntry(addr, PT_WRITABLE | PT_PRESENT); pt = next_pt; } } @@ -311,9 +313,11 @@ private void map2m(ulong source_page, ulong dest_page, PageTable * pt_base) PageTable * pt = pt_base; for (size_t level = 0; level < 3u; level++) { - if ((*pt)[source_page, level].present) + PageTableEntry * ppte = pt.entry(source_page, level); + PageTableEntry pte = *ppte; + if (pte.present) { - pt = (*pt)[source_page, level].follow(); + pt = pte.follow(); } else { @@ -321,11 +325,11 @@ private void map2m(ulong source_page, ulong dest_page, PageTable * pt_base) if (level < 2u) { next_pt = new_page_table(); - (*pt)[source_page, level] = PageTableEntry(next_pt, PT_WRITABLE | PT_PRESENT); + *ppte = PageTableEntry(next_pt, PT_WRITABLE | PT_PRESENT); } else { - (*pt)[source_page, level] = PageTableEntry(dest_page, PT_HUGE_PAGE | PT_WRITABLE | PT_PRESENT); + *ppte = PageTableEntry(dest_page, PT_HUGE_PAGE | PT_WRITABLE | PT_PRESENT); } pt = next_pt; } diff --git a/src/hulk/hurl.d b/src/hulk/hurl.d index 5716424..621ca08 100644 --- a/src/hulk/hurl.d +++ b/src/hulk/hurl.d @@ -68,23 +68,24 @@ struct hurl PageTable * pt = m_pt_base; for (size_t level = 0; level < 4u; level++) { + PageTableEntry * ppte = pt.entry(virtual, level); if (level < 3u) { - PageTableEntry entry = (*pt)[virtual, level]; - if (entry.present) + PageTableEntry pte = *ppte; + if (pte.present) { - pt = entry.follow(); + pt = pte.follow(); } else { PageTable * next_pt = allocate_pt(); - (*pt)[virtual, level] = PageTableEntry(next_pt, PT_WRITABLE | PT_PRESENT); + *ppte = PageTableEntry(next_pt, PT_WRITABLE | PT_PRESENT); pt = next_pt; } } else { - (*pt)[virtual, level] = PageTableEntry(physical, flags | PT_PRESENT); + *ppte = PageTableEntry(physical, flags | PT_PRESENT); } } } @@ -115,17 +116,17 @@ struct hurl PageTable * pt = m_pt_base; for (size_t level = 0; level < 4u; level++) { - PageTableEntry entry = (*pt)[address, level]; - klog.writefln("Level %u, index %u, entry = 0x%x", level, pt.pt_index(cast(ulong)address, level), entry); - if (entry.present) + PageTableEntry pte = *pt.entry(address, level); + klog.writefln("Level %u, index %u, entry = 0x%x", level, pt.index(address, level), pte); + if (pte.present) { - pt = entry.follow(); + pt = pte.follow(); } else { break; } - if (entry.huge) + if (pte.huge) { break; } diff --git a/src/hulk/pagetable.d b/src/hulk/pagetable.d index e1263e4..ecab009 100644 --- a/src/hulk/pagetable.d +++ b/src/hulk/pagetable.d @@ -126,25 +126,9 @@ struct PageTable * @param level * Page table level (0-4). */ - public PageTableEntry opIndex(T)(T address, ulong level) + public PageTableEntry * entry(T)(T address, ulong level) { - return entries[pt_index(cast(ulong)address, level)]; - } - - /** - * Assign the PageTableEntry for the given address and page table level. - * - * @param pte - * PageTableEntry value to assign. - * @param address - * Address to look up the page table entry (ulong or pointer). - * @param level - * Page table level (0-4). - */ - public PageTableEntry opIndexAssign(T)(PageTableEntry pte, T address, ulong level) - { - entries[pt_index(cast(ulong)address, level)] = pte; - return pte; + return &entries[index(cast(ulong)address, level)]; } /** @@ -156,7 +140,7 @@ struct PageTable * @param level * Page table level (0-4). */ - public ulong pt_index(T)(T address, ulong level) + public ulong index(T)(T address, ulong level) { return (cast(ulong)address >> (39u - (9u * level))) & 0x1FFu; }