misc: Implement .no_unwind section
This commit is contained in:
parent
88cd9dca7e
commit
f0cda17326
@ -84,4 +84,6 @@ __attribute__((noreturn)) void stage3_common(void);
|
|||||||
|
|
||||||
__attribute__((noreturn)) void common_spinup(void *fnptr, int args, ...);
|
__attribute__((noreturn)) void common_spinup(void *fnptr, int args, ...);
|
||||||
|
|
||||||
|
#define no_unwind __attribute__((section(".no_unwind")))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,9 +13,8 @@
|
|||||||
|
|
||||||
#define SEPARATOR '\n'
|
#define SEPARATOR '\n'
|
||||||
|
|
||||||
extern bool *bad_config;
|
|
||||||
|
|
||||||
bool config_ready = false;
|
bool config_ready = false;
|
||||||
|
no_unwind bool bad_config = false;
|
||||||
|
|
||||||
static char *config_addr;
|
static char *config_addr;
|
||||||
|
|
||||||
@ -80,7 +79,7 @@ static bool is_directory(char *buf, size_t limit,
|
|||||||
case NOT_CHILD:
|
case NOT_CHILD:
|
||||||
return false;
|
return false;
|
||||||
case INDIRECT_CHILD:
|
case INDIRECT_CHILD:
|
||||||
*bad_config = true;
|
bad_config = true;
|
||||||
panic(true, "config: Malformed config file. Parentless child.");
|
panic(true, "config: Malformed config file. Parentless child.");
|
||||||
case DIRECT_CHILD:
|
case DIRECT_CHILD:
|
||||||
return true;
|
return true;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <lib/part.h>
|
#include <lib/part.h>
|
||||||
|
|
||||||
extern bool config_ready;
|
extern bool config_ready;
|
||||||
|
extern bool bad_config;
|
||||||
|
|
||||||
struct menu_entry {
|
struct menu_entry {
|
||||||
char name[64];
|
char name[64];
|
||||||
|
@ -41,6 +41,7 @@ SECTIONS
|
|||||||
.stage3.data : {
|
.stage3.data : {
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.full_map*)
|
*(.full_map*)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
limine_sys_size = . - 0x8000;
|
limine_sys_size = . - 0x8000;
|
||||||
|
@ -41,6 +41,7 @@ SECTIONS
|
|||||||
.stage3.data : {
|
.stage3.data : {
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.full_map*)
|
*(.full_map*)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
limine_sys_size = . - 0x8000;
|
limine_sys_size = . - 0x8000;
|
||||||
|
@ -41,6 +41,7 @@ SECTIONS
|
|||||||
.stage3.data : {
|
.stage3.data : {
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
full_map = .;
|
full_map = .;
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
limine_sys_size = . - 0x8000;
|
limine_sys_size = . - 0x8000;
|
||||||
|
@ -24,6 +24,7 @@ SECTIONS
|
|||||||
|
|
||||||
.stage2.data : {
|
.stage2.data : {
|
||||||
*.s2.o(.rodata*)
|
*.s2.o(.rodata*)
|
||||||
|
*.s2.o(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*.s2.o(.data*)
|
*.s2.o(.data*)
|
||||||
stage2_map = .;
|
stage2_map = .;
|
||||||
|
@ -38,6 +38,7 @@ SECTIONS
|
|||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.got.plt)
|
*(.got.plt)
|
||||||
*(.got)
|
*(.got)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
*(.sdata)
|
*(.sdata)
|
||||||
|
@ -38,6 +38,7 @@ SECTIONS
|
|||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.got.plt)
|
*(.got.plt)
|
||||||
*(.got)
|
*(.got)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data)
|
*(.data)
|
||||||
*(.data1)
|
*(.data1)
|
||||||
|
@ -38,6 +38,7 @@ SECTIONS
|
|||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.got.plt)
|
*(.got.plt)
|
||||||
*(.got)
|
*(.got)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data)
|
*(.data)
|
||||||
*(.data1)
|
*(.data1)
|
||||||
|
@ -38,6 +38,7 @@ SECTIONS
|
|||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
*(.got.plt)
|
*(.got.plt)
|
||||||
*(.got)
|
*(.got)
|
||||||
|
*(.no_unwind*)
|
||||||
data_begin = .;
|
data_begin = .;
|
||||||
*(.data*)
|
*(.data*)
|
||||||
*(.sdata)
|
*(.sdata)
|
||||||
|
@ -583,14 +583,8 @@ static uint8_t *rewound_data;
|
|||||||
extern symbol data_begin;
|
extern symbol data_begin;
|
||||||
extern symbol data_end;
|
extern symbol data_end;
|
||||||
|
|
||||||
bool *bad_config = NULL;
|
|
||||||
|
|
||||||
__attribute__((noreturn, used))
|
__attribute__((noreturn, used))
|
||||||
static void _menu(bool timeout_enabled) {
|
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;
|
size_t data_size = (uintptr_t)data_end - (uintptr_t)data_begin;
|
||||||
|
|
||||||
if (rewound_memmap != NULL) {
|
if (rewound_memmap != NULL) {
|
||||||
@ -605,7 +599,7 @@ static void _menu(bool timeout_enabled) {
|
|||||||
memcpy(rewound_data, data_begin, data_size);
|
memcpy(rewound_data, data_begin, data_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*bad_config == false) {
|
if (bad_config == false) {
|
||||||
volume_iterate_parts(boot_volume,
|
volume_iterate_parts(boot_volume,
|
||||||
if (!init_config_disk(_PART)) {
|
if (!init_config_disk(_PART)) {
|
||||||
boot_volume = _PART;
|
boot_volume = _PART;
|
||||||
|
Loading…
Reference in New Issue
Block a user