From d357aada757aa7c3c595cd6ca36f8515e1a6368f Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 5 Nov 2022 22:45:35 -0400 Subject: [PATCH] Map HULK regions separately --- src/hulk/hurl.d | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/hulk/hurl.d b/src/hulk/hurl.d index 9f86a4d..3796063 100644 --- a/src/hulk/hurl.d +++ b/src/hulk/hurl.d @@ -36,19 +36,42 @@ struct hurl /* Turn on NXE (no execute enable) flag in the EFER MSR. */ wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_NXE); m_pt_base = allocate_pt(); - size_t hulk_binary_size = LinkerAddresses.hulk_binary_size; /* Identity map all physical RAM. */ map_range(0u, 0u, hippo.physical_address_limit, PT_WRITABLE | PT_NO_EXECUTE); - /* Map HULK binary region. */ - map_range(HULK_VIRTUAL_BASE_ADDRESS, - header.bootinfo.hulk_phys, - hulk_binary_size, - PT_WRITABLE); + ulong phys_address = header.bootinfo.hulk_phys; + ulong virt_address = HULK_VIRTUAL_BASE_ADDRESS; + /* Map HULK header region. */ + map_range(virt_address, + phys_address, + LinkerAddresses.hulk_header_size, + PT_NO_EXECUTE); + phys_address += LinkerAddresses.hulk_header_size; + virt_address += LinkerAddresses.hulk_header_size; + /* Map HULK text region. */ + map_range(virt_address, + phys_address, + LinkerAddresses.hulk_text_size, + 0u); + phys_address += LinkerAddresses.hulk_text_size; + virt_address += LinkerAddresses.hulk_text_size; + /* Map HULK rodata region. */ + map_range(virt_address, + phys_address, + LinkerAddresses.hulk_rodata_size, + PT_NO_EXECUTE); + phys_address += LinkerAddresses.hulk_rodata_size; + virt_address += LinkerAddresses.hulk_rodata_size; + /* Map HULK data region. */ + map_range(virt_address, + phys_address, + LinkerAddresses.hulk_data_size, + PT_WRITABLE | PT_NO_EXECUTE); + virt_address += LinkerAddresses.hulk_data_size; /* Map HULK BSS region. */ - map_range(HULK_VIRTUAL_BASE_ADDRESS + hulk_binary_size, + map_range(virt_address, header.bootinfo.bss_phys, LinkerAddresses.hulk_bss_size, PT_WRITABLE | PT_NO_EXECUTE);