Remove PageTable.opIndex and .opIndexAssign, use .entry

This commit is contained in:
josh committed 2022-10-26 21:58:22 -04:00
1 parent 476ae7d6fd
commit 707d42bec4
3 files changed
+25 -36

No files matched your search

+11 -10
View File
@@ -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;
}
+3 -19
View File
@@ -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;
}