limine/common/lib/panic.s2.c

86 lines
1.6 KiB
C
Raw Normal View History

2021-12-11 21:58:00 +03:00
#include <stddef.h>
#include <stdbool.h>
2021-12-31 12:58:05 +03:00
#include <stdnoreturn.h>
#include <lib/print.h>
#include <lib/real.h>
#include <lib/trace.h>
#if defined (UEFI)
2021-05-19 09:44:00 +03:00
# include <efi.h>
#endif
2022-08-27 00:44:47 +03:00
#include <lib/misc.h>
#include <lib/readline.h>
#include <lib/gterm.h>
#include <lib/term.h>
#include <mm/pmm.h>
2021-12-11 21:58:00 +03:00
#include <menu.h>
2021-12-31 12:58:05 +03:00
noreturn void panic(bool allow_menu, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
2021-11-20 23:47:51 +03:00
quiet = false;
2022-09-23 21:59:02 +03:00
if (
#if defined (BIOS)
stage3_loaded == true &&
#endif
term_backend == _NOT_READY) {
2022-09-20 10:54:35 +03:00
term_fallback();
}
2022-09-23 21:59:02 +03:00
if (
#if defined (BIOS)
stage3_loaded == true &&
#endif
term_backend != FALLBACK) {
print("\033[31mPANIC\033[37;1m\033[0m: ");
} else {
print("PANIC: ");
}
vprint(fmt, args);
va_end(args);
print("\n");
print_stacktrace(NULL);
2021-12-11 21:58:00 +03:00
if (
#if defined (BIOS)
2021-12-11 21:58:00 +03:00
stage3_loaded == true &&
#endif
allow_menu == true) {
print("Press a key to return to menu.");
getchar();
// This fixes a crash
term_notready();
2021-12-11 21:58:00 +03:00
menu(false);
/*
fb_clear(&fbinfo);
// release all uefi memory and return to firmware
pmm_release_uefi_mem();
gBS->Exit(efi_image_handle, EFI_ABORTED, 0, NULL);
2021-12-11 21:58:00 +03:00
*/
} else {
#if defined (BIOS)
2021-12-11 21:58:00 +03:00
print("Press CTRL+ALT+DEL to reboot.");
rm_hcf();
#elif defined (UEFI)
print("System halted.");
for (;;) {
#if defined (__x86_64__) || defined (__i386__)
asm ("hlt");
#elif defined (__aarch64__) || defined (__riscv64)
asm ("wfi");
#else
#error Unknown architecture
#endif
}
2021-03-02 12:23:43 +03:00
#endif
2021-12-11 21:58:00 +03:00
}
}