summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAda Christine <adachristine18@gmail.com>2021-03-23 13:00:34 +0000
committerAda Christine <adachristine18@gmail.com>2021-03-23 13:00:34 +0000
commit90820d94b942cc3ecf62818e401e271217255b03 (patch)
tree710c90815f408b9408042f438c90b7b584fce902
parentc359af48545e2427a69eb955b0512706d4afa7e9 (diff)
loop to map pages
-rw-r--r--loader/loader_efi.c49
1 files changed, 13 insertions, 36 deletions
diff --git a/loader/loader_efi.c b/loader/loader_efi.c
index 42eacc2..e531521 100644
--- a/loader/loader_efi.c
+++ b/loader/loader_efi.c
@@ -74,44 +74,21 @@ static void map_page(void *map,
{
uint64_t *this_map = (uint64_t *)map;
uint64_t next_map;
-
- if (!this_map[page_table_index(virt, 4)])
- {
- next_map = new_page_table();
- this_map[page_table_index(virt, 4)] = next_map | 3;
- this_map = (uint64_t *)next_map;
- }
- else
- {
- next_map = this_map[page_table_index(virt, 4)];
- next_map &= PAGE_TABLE_ADDRESS_MASK;
- this_map = (uint64_t *)next_map;
- }
- if (!this_map[page_table_index(virt, 3)])
- {
- next_map = new_page_table();
- this_map[page_table_index(virt, 3)] = next_map | 3;
- this_map = (uint64_t *)next_map;
- }
- else
- {
- next_map = this_map[page_table_index(virt, 3)];
- next_map &= PAGE_TABLE_ADDRESS_MASK;
- this_map = (uint64_t *)next_map;
- }
-
- if (!this_map[page_table_index(virt, 2)])
- {
- next_map = new_page_table();
- this_map[page_table_index(virt, 2)] = next_map | 3;
- this_map = (uint64_t *)next_map;
- }
- else
+ for (int level = 4; level > 1; level--)
{
- next_map = this_map[page_table_index(virt, 2)];
- next_map &= PAGE_TABLE_ADDRESS_MASK;
- this_map = (uint64_t *)next_map;
+ if (!this_map[page_table_index(virt, level)])
+ {
+ next_map = new_page_table();
+ this_map[page_table_index(virt, level)] = next_map | 3;
+ this_map = (uint64_t *)next_map;
+ }
+ else
+ {
+ next_map = this_map[page_table_index(virt, level)];
+ next_map &= PAGE_TABLE_ADDRESS_MASK;
+ this_map = (uint64_t *)next_map;
+ }
}
this_map[page_table_index(virt, 1)] = phys | type;