:: commit 935a392a3603b1fca10b96f5a6d3840b33598c8d

mintsuki <mintsuki@protonmail.com> — 2021-11-05 02:22

parents: d28e93f257

elf: Drop lower half program headers for PMRs

diff --git a/stage23/lib/elf.c b/stage23/lib/elf.c
index 361c55d5..e398cb8c 100644
--- a/stage23/lib/elf.c
+++ b/stage23/lib/elf.c
@@ -393,6 +393,10 @@ static void elf64_get_ranges(uint8_t *elf, uint64_t slide, bool use_paddr, struc
         if (phdr.p_type != PT_LOAD)
             continue;
 
+        if (!use_paddr && phdr.p_vaddr < FIXED_HIGHER_HALF_OFFSET_64) {
+            continue;
+        }
+
         ranges_count++;
     }
 
@@ -413,6 +417,10 @@ static void elf64_get_ranges(uint8_t *elf, uint64_t slide, bool use_paddr, struc
             load_addr = phdr.p_paddr;
         } else {
             load_addr = phdr.p_vaddr;
+
+            if (phdr.p_vaddr < FIXED_HIGHER_HALF_OFFSET_64) {
+                continue;
+            }
         }
 
         load_addr += slide;
@@ -469,8 +477,14 @@ int elf64_load(uint8_t *elf, uint64_t *entry_point, uint64_t *top, uint64_t *_sl
             memcpy(&phdr, elf + (hdr.phoff + i * sizeof(struct elf64_phdr)),
                        sizeof(struct elf64_phdr));
 
-            if (phdr.p_type != PT_LOAD)
+            if (phdr.p_type != PT_LOAD) {
                 continue;
+            }
+
+            // Drop entries not in the higher half
+            if (phdr.p_vaddr < FIXED_HIGHER_HALF_OFFSET_64) {
+                continue;
+            }
 
             if (phdr.p_vaddr < min_vaddr) {
                 min_vaddr = phdr.p_vaddr;
@@ -527,7 +541,7 @@ final:
         } else {
             load_addr = phdr.p_vaddr;
 
-            if (phdr.p_vaddr >= 0xffffffff80000000) {
+            if (phdr.p_vaddr >= FIXED_HIGHER_HALF_OFFSET_64) {
                 higher_half = true;
 
                 if (fully_virtual) {
@@ -535,6 +549,9 @@ final:
                 } else {
                     load_addr = phdr.p_vaddr - FIXED_HIGHER_HALF_OFFSET_64;
                 }
+            } else if (ranges) {
+                // Drop lower half
+                continue;
             }
         }
 
tab: 248 wrap: offon