diff options
| author | Ada Christine <adachristine18@gmail.com> | 2021-03-23 13:00:34 +0000 |
|---|---|---|
| committer | Ada Christine <adachristine18@gmail.com> | 2021-03-23 13:00:34 +0000 |
| commit | 90820d94b942cc3ecf62818e401e271217255b03 (patch) | |
| tree | 710c90815f408b9408042f438c90b7b584fce902 /loader | |
| parent | c359af48545e2427a69eb955b0512706d4afa7e9 (diff) | |
loop to map pages
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader_efi.c | 49 |
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; |
