Remove PageTable.opIndex and .opIndexAssign, use .entry
This commit is contained in:
parent
476ae7d6fd
commit
707d42bec4
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user