:: commit 0693d86cb01284e04a700b206023f141202b7395

mintsuki <mintsuki@protonmail.com> — 2023-09-11 21:48

parents: 7d527d867c

misc/bios: Update and improve linker script and related files

diff --git a/common/entry_asm.s2.asm_bios_ia32 b/common/entry_asm.s2.asm_bios_ia32
index d7503160..50c7029c 100644
--- a/common/entry_asm.s2.asm_bios_ia32
+++ b/common/entry_asm.s2.asm_bios_ia32
@@ -3,7 +3,7 @@ extern bss_end
 extern entry
 extern gdt
 
-section .entry
+section .entry progbits alloc exec nowrite align=16
 
 global _start
 _start:
diff --git a/common/linker_bios.ld.in b/common/linker_bios.ld.in
index 4ef31e2a..704bf92c 100644
--- a/common/linker_bios.ld.in
+++ b/common/linker_bios.ld.in
@@ -5,8 +5,10 @@ ENTRY(_start)
 PHDRS
 {
     text_s2   PT_LOAD    FLAGS((1 << 0) | (1 << 2)) ;
+    rodata_s2 PT_LOAD    FLAGS((1 << 2)) ;
     data_s2   PT_LOAD    FLAGS((1 << 1) | (1 << 2)) ;
     text_s3   PT_LOAD    FLAGS((1 << 0) | (1 << 2)) ;
+    rodata_s3 PT_LOAD    FLAGS((1 << 2)) ;
     data_s3   PT_LOAD    FLAGS((1 << 1) | (1 << 2)) ;
 }
 
@@ -21,17 +23,13 @@ SECTIONS
         *libgcc*.a:*(.text .text.*)
     } :text_s2
 
-    .data.stage2 : {
+    .rodata.stage2 : {
+        *.s2.o(.rodata .rodata.*)
+        *libgcc*.a:*(.rodata .rodata.*)
+
         build_id_s2 = .;
         KEEP(*build-id.s2.o(*))
 
-        *.s2.o(.no_unwind)
-        s2_data_begin = .;
-        *.s2.o(.data .data.*)
-        *libgcc*.a:*(.data .data.*)
-        s2_data_end = .;
-        *.s2.o(.rodata .rodata.*)
-        *libgcc*.a:*(.rodata .rodata.*)
 #ifdef LINKER_STAGE2ONLY
         /* stage2 missing symbols overrides */
         stage2_map = .;
@@ -54,6 +52,15 @@ SECTIONS
         *(.stage2_map)
 #endif
 #endif
+    } :rodata_s2
+
+    .data.stage2 : {
+        s2_data_begin = .;
+        *.s2.o(.data .data.*)
+        *libgcc*.a:*(.data .data.*)
+        s2_data_end = .;
+
+        *.s2.o(.no_unwind)
     } :data_s2
 
 #ifndef LINKER_STAGE2ONLY
@@ -62,19 +69,25 @@ SECTIONS
         *(.text .text.*)
     } :text_s3
 
-    .data.stage3 : {
+    .rodata.stage3 : {
+        *(.rodata .rodata.*)
+
         build_id_s3 = .;
         KEEP(*build-id.s3.o(*))
 
-        *(.rodata .rodata.*)
 #ifdef LINKER_NOMAP
         full_map = .;
 #else
         *(.full_map)
 #endif
-        *(.no_unwind)
+    } :rodata_s3
+
+    .data.stage3 : {
         data_begin = .;
         *(.data .data.*)
+        data_end = .;
+
+        *(.no_unwind)
     } :data_s3
 #endif
 
@@ -88,7 +101,6 @@ SECTIONS
         *(.bss .bss.*)
         *(COMMON)
         bss_end = .;
-        data_end = .;
     } :data_s3
 
     /DISCARD/ : {
diff --git a/common/menu.c b/common/menu.c
index 696703e5..9691e8c4 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -585,6 +585,7 @@ static size_t rewound_memmap_entries = 0;
 static no_unwind uint8_t *rewound_data;
 #if defined (BIOS)
 static no_unwind uint8_t *rewound_s2_data;
+static no_unwind uint8_t *rewound_bss;
 #endif
 
 extern symbol data_begin;
@@ -592,6 +593,8 @@ extern symbol data_end;
 #if defined (BIOS)
 extern symbol s2_data_begin;
 extern symbol s2_data_end;
+extern symbol bss_begin;
+extern symbol bss_end;
 #endif
 
 static void menu_init_term(void) {
@@ -629,12 +632,14 @@ noreturn void _menu(bool first_run) {
     size_t data_size = (uintptr_t)data_end - (uintptr_t)data_begin;
 #if defined (BIOS)
     size_t s2_data_size = (uintptr_t)s2_data_end - (uintptr_t)s2_data_begin;
+    size_t bss_size = (uintptr_t)bss_end - (uintptr_t)bss_begin;
 #endif
 
     if (rewound_memmap != NULL) {
         memcpy(data_begin, rewound_data, data_size);
 #if defined (BIOS)
         memcpy(s2_data_begin, rewound_s2_data, s2_data_size);
+        memcpy(bss_begin, rewound_bss, bss_size);
 #endif
         memcpy(memmap, rewound_memmap, rewound_memmap_entries * sizeof(struct memmap_entry));
         memmap_entries = rewound_memmap_entries;
@@ -642,6 +647,7 @@ noreturn void _menu(bool first_run) {
         rewound_data = ext_mem_alloc(data_size);
 #if defined (BIOS)
         rewound_s2_data = ext_mem_alloc(s2_data_size);
+        rewound_bss = ext_mem_alloc(bss_size);
 #endif
         rewound_memmap = ext_mem_alloc(256 * sizeof(struct memmap_entry));
         memcpy(rewound_memmap, memmap, memmap_entries * sizeof(struct memmap_entry));
@@ -649,6 +655,7 @@ noreturn void _menu(bool first_run) {
         memcpy(rewound_data, data_begin, data_size);
 #if defined (BIOS)
         memcpy(rewound_s2_data, s2_data_begin, s2_data_size);
+        memcpy(rewound_bss, bss_begin, bss_size);
 #endif
     }
 
tab: 248 wrap: offon