:: commit 402577ad22c1e33783b2d0eab00b8fe4b9088789

mintsuki <mintsuki@protonmail.com> — 2021-12-12 17:48

parents: 760e1b20c4

misc: Implement .no_unwind section

diff --git a/stage23/lib/blib.h b/stage23/lib/blib.h
index 83d1a228..6b200407 100644
--- a/stage23/lib/blib.h
+++ b/stage23/lib/blib.h
@@ -84,4 +84,6 @@ __attribute__((noreturn)) void stage3_common(void);
 
 __attribute__((noreturn)) void common_spinup(void *fnptr, int args, ...);
 
+#define no_unwind __attribute__((section(".no_unwind")))
+
 #endif
diff --git a/stage23/lib/config.c b/stage23/lib/config.c
index 182e9f35..3ae11a58 100644
--- a/stage23/lib/config.c
+++ b/stage23/lib/config.c
@@ -13,9 +13,8 @@
 
 #define SEPARATOR '\n'
 
-extern bool *bad_config;
-
 bool config_ready = false;
+no_unwind bool bad_config = false;
 
 static char *config_addr;
 
@@ -80,7 +79,7 @@ static bool is_directory(char *buf, size_t limit,
         case NOT_CHILD:
             return false;
         case INDIRECT_CHILD:
-            *bad_config = true;
+            bad_config = true;
             panic(true, "config: Malformed config file. Parentless child.");
         case DIRECT_CHILD:
             return true;
diff --git a/stage23/lib/config.h b/stage23/lib/config.h
index 7f0703d0..9ea2f016 100644
--- a/stage23/lib/config.h
+++ b/stage23/lib/config.h
@@ -6,6 +6,7 @@
 #include <lib/part.h>
 
 extern bool config_ready;
+extern bool bad_config;
 
 struct menu_entry {
     char name[64];
diff --git a/stage23/linker.ld b/stage23/linker.ld
index 348ba608..47f1a4ca 100644
--- a/stage23/linker.ld
+++ b/stage23/linker.ld
@@ -41,6 +41,7 @@ SECTIONS
     .stage3.data : {
         *(.rodata*)
         *(.full_map*)
+        *(.no_unwind*)
         data_begin = .;
         *(.data*)
         limine_sys_size = . - 0x8000;
diff --git a/stage23/linker_dbg.ld b/stage23/linker_dbg.ld
index de357ff7..6049592c 100644
--- a/stage23/linker_dbg.ld
+++ b/stage23/linker_dbg.ld
@@ -41,6 +41,7 @@ SECTIONS
     .stage3.data : {
         *(.rodata*)
         *(.full_map*)
+        *(.no_unwind*)
         data_begin = .;
         *(.data*)
         limine_sys_size = . - 0x8000;
diff --git a/stage23/linker_nomap.ld b/stage23/linker_nomap.ld
index 29f663a2..37fa1bc3 100644
--- a/stage23/linker_nomap.ld
+++ b/stage23/linker_nomap.ld
@@ -41,6 +41,7 @@ SECTIONS
     .stage3.data : {
         *(.rodata*)
         full_map = .;
+        *(.no_unwind*)
         data_begin = .;
         *(.data*)
         limine_sys_size = . - 0x8000;
diff --git a/stage23/linker_stage2only.ld b/stage23/linker_stage2only.ld
index 3ca08f4f..eb61d100 100644
--- a/stage23/linker_stage2only.ld
+++ b/stage23/linker_stage2only.ld
@@ -24,6 +24,7 @@ SECTIONS
 
     .stage2.data : {
         *.s2.o(.rodata*)
+        *.s2.o(.no_unwind*)
         data_begin = .;
         *.s2.o(.data*)
         stage2_map = .;
diff --git a/stage23/linker_uefi.ld b/stage23/linker_uefi.ld
index fe53bcc4..45e981d2 100644
--- a/stage23/linker_uefi.ld
+++ b/stage23/linker_uefi.ld
@@ -38,6 +38,7 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+   *(.no_unwind*)
    data_begin = .;
    *(.data*)
    *(.sdata)
diff --git a/stage23/linker_uefi32.ld b/stage23/linker_uefi32.ld
index fce652fd..08a26ea3 100644
--- a/stage23/linker_uefi32.ld
+++ b/stage23/linker_uefi32.ld
@@ -38,6 +38,7 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+   *(.no_unwind*)
    data_begin = .;
    *(.data)
    *(.data1)
diff --git a/stage23/linker_uefi32_nomap.ld b/stage23/linker_uefi32_nomap.ld
index 6e0228e2..302f9f10 100644
--- a/stage23/linker_uefi32_nomap.ld
+++ b/stage23/linker_uefi32_nomap.ld
@@ -38,6 +38,7 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+   *(.no_unwind*)
    data_begin = .;
    *(.data)
    *(.data1)
diff --git a/stage23/linker_uefi_nomap.ld b/stage23/linker_uefi_nomap.ld
index fcbceb2a..2caa6d1b 100644
--- a/stage23/linker_uefi_nomap.ld
+++ b/stage23/linker_uefi_nomap.ld
@@ -38,6 +38,7 @@ SECTIONS
    *(.rodata*)
    *(.got.plt)
    *(.got)
+   *(.no_unwind*)
    data_begin = .;
    *(.data*)
    *(.sdata)
diff --git a/stage23/menu.c b/stage23/menu.c
index b23caf6f..a24cf03f 100644
--- a/stage23/menu.c
+++ b/stage23/menu.c
@@ -583,14 +583,8 @@ static uint8_t *rewound_data;
 extern symbol data_begin;
 extern symbol data_end;
 
-bool *bad_config = NULL;
-
 __attribute__((noreturn, used))
 static void _menu(bool timeout_enabled) {
-    if (bad_config == NULL) {
-        bad_config = ext_mem_alloc(1);
-    }
-
     size_t data_size = (uintptr_t)data_end - (uintptr_t)data_begin;
 
     if (rewound_memmap != NULL) {
@@ -605,7 +599,7 @@ static void _menu(bool timeout_enabled) {
         memcpy(rewound_data, data_begin, data_size);
     }
 
-    if (*bad_config == false) {
+    if (bad_config == false) {
         volume_iterate_parts(boot_volume,
             if (!init_config_disk(_PART)) {
                 boot_volume = _PART;
tab: 248 wrap: offon