Use hulk.pagetable from hello
This commit is contained in:
parent
555ec9b627
commit
4a431f7d93
@ -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))
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user