term: Move fallback logic from panic.s2.c to term.s2.c
diff --git a/stage23/lib/panic.s2.c b/stage23/lib/panic.s2.c
index 8c841d60..70c2ebdf 100644
--- a/stage23/lib/panic.s2.c
+++ b/stage23/lib/panic.s2.c
@@ -14,100 +14,6 @@
#include <mm/pmm.h>
#include <menu.h>
-#if bios == 1
-void fallback_raw_putchar(uint8_t c) {
- struct rm_regs r = {0};
- r.eax = 0x0e00 | c;
- rm_int(0x10, &r, &r);
-}
-
-void fallback_clear(bool move) {
- (void)move;
- struct rm_regs r = {0};
- rm_int(0x11, &r, &r);
- switch ((r.eax >> 4) & 3) {
- case 0:
- r.eax = 3;
- break;
- case 1:
- r.eax = 1;
- break;
- case 2:
- r.eax = 3;
- break;
- case 3:
- r.eax = 7;
- break;
- }
- rm_int(0x10, &r, &r);
-}
-
-void fallback_set_cursor_pos(size_t x, size_t y) {
- struct rm_regs r = {0};
- r.eax = 0x0200;
- r.ebx = 0;
- r.edx = (y << 8) + x;
- rm_int(0x10, &r, &r);
-}
-
-void fallback_get_cursor_pos(size_t *x, size_t *y) {
- struct rm_regs r = {0};
- r.eax = 0x0300;
- r.ebx = 0;
- rm_int(0x10, &r, &r);
- *x = r.edx & 0xff;
- *y = r.edx >> 8;
-}
-
-#elif uefi == 1
-static int cursor_x = 0, cursor_y = 0;
-
-void fallback_raw_putchar(uint8_t c) {
- CHAR16 string[2];
- string[0] = c;
- string[1] = 0;
- gST->ConOut->OutputString(gST->ConOut, string);
- switch (c) {
- case 0x08:
- if (cursor_x > 0)
- cursor_x--;
- break;
- case 0x0A:
- cursor_x = 0;
- break;
- case 0x0D:
- if (cursor_y < 24)
- cursor_y++;
- break;
- default:
- if (++cursor_x > 80) {
- cursor_x = 0;
- if (cursor_y < 24)
- cursor_y++;
- }
- }
-}
-
-void fallback_clear(bool move) {
- (void)move;
- gST->ConOut->ClearScreen(gST->ConOut);
- cursor_x = cursor_y = 0;
-}
-
-void fallback_set_cursor_pos(size_t x, size_t y) {
- if (x >= 80 || y >= 25)
- return;
- gST->ConOut->SetCursorPosition(gST->ConOut, x, y);
- cursor_x = x;
- cursor_y = y;
-}
-
-void fallback_get_cursor_pos(size_t *x, size_t *y) {
- *x = cursor_x;
- *y = cursor_y;
-}
-#endif
-
noreturn void panic(bool allow_menu, const char *fmt, ...) {
va_list args;
@@ -124,23 +30,7 @@ noreturn void panic(bool allow_menu, const char *fmt, ...) {
}
if (term_backend == NOT_READY) {
-#if uefi == 1
- if (!efi_boot_services_exited) {
- gST->ConOut->Reset(gST->ConOut, false);
- gST->ConOut->SetMode(gST->ConOut, 0);
- cursor_x = cursor_y = 0;
-#elif bios == 1
- fallback_clear(true);
-#endif
- term_notready();
- raw_putchar = fallback_raw_putchar;
- clear = fallback_clear;
- set_cursor_pos = fallback_set_cursor_pos;
- get_cursor_pos = fallback_get_cursor_pos;
- term_backend = FALLBACK;
-#if uefi == 1
- }
-#endif
+ term_fallback();
}
print("\033[31mPANIC\033[37;1m\033[0m: ");
diff --git a/stage23/lib/term.h b/stage23/lib/term.h
index 7c4ab431..13a9a2d3 100644
--- a/stage23/lib/term.h
+++ b/stage23/lib/term.h
@@ -45,6 +45,8 @@ extern size_t term_rows, term_cols;
extern bool term_runtime;
extern bool early_term;
+void term_fallback(void);
+
void term_reinit(void);
void term_deinit(void);
void term_vbe(size_t width, size_t height);
diff --git a/stage23/lib/term.s2.c b/stage23/lib/term.s2.c
index aa2667cd..c0543796 100644
--- a/stage23/lib/term.s2.c
+++ b/stage23/lib/term.s2.c
@@ -77,6 +77,120 @@ void term_notready(void) {
term_cols = 100;
}
+#if bios == 1
+void fallback_raw_putchar(uint8_t c) {
+ struct rm_regs r = {0};
+ r.eax = 0x0e00 | c;
+ rm_int(0x10, &r, &r);
+}
+
+void fallback_clear(bool move) {
+ (void)move;
+ struct rm_regs r = {0};
+ rm_int(0x11, &r, &r);
+ switch ((r.eax >> 4) & 3) {
+ case 0:
+ r.eax = 3;
+ break;
+ case 1:
+ r.eax = 1;
+ break;
+ case 2:
+ r.eax = 3;
+ break;
+ case 3:
+ r.eax = 7;
+ break;
+ }
+ rm_int(0x10, &r, &r);
+}
+
+void fallback_set_cursor_pos(size_t x, size_t y) {
+ struct rm_regs r = {0};
+ r.eax = 0x0200;
+ r.ebx = 0;
+ r.edx = (y << 8) + x;
+ rm_int(0x10, &r, &r);
+}
+
+void fallback_get_cursor_pos(size_t *x, size_t *y) {
+ struct rm_regs r = {0};
+ r.eax = 0x0300;
+ r.ebx = 0;
+ rm_int(0x10, &r, &r);
+ *x = r.edx & 0xff;
+ *y = r.edx >> 8;
+}
+
+#elif uefi == 1
+static int cursor_x = 0, cursor_y = 0;
+
+void fallback_raw_putchar(uint8_t c) {
+ CHAR16 string[2];
+ string[0] = c;
+ string[1] = 0;
+ gST->ConOut->OutputString(gST->ConOut, string);
+ switch (c) {
+ case 0x08:
+ if (cursor_x > 0)
+ cursor_x--;
+ break;
+ case 0x0A:
+ cursor_x = 0;
+ break;
+ case 0x0D:
+ if (cursor_y < 24)
+ cursor_y++;
+ break;
+ default:
+ if (++cursor_x > 80) {
+ cursor_x = 0;
+ if (cursor_y < 24)
+ cursor_y++;
+ }
+ }
+}
+
+void fallback_clear(bool move) {
+ (void)move;
+ gST->ConOut->ClearScreen(gST->ConOut);
+ cursor_x = cursor_y = 0;
+}
+
+void fallback_set_cursor_pos(size_t x, size_t y) {
+ if (x >= 80 || y >= 25)
+ return;
+ gST->ConOut->SetCursorPosition(gST->ConOut, x, y);
+ cursor_x = x;
+ cursor_y = y;
+}
+
+void fallback_get_cursor_pos(size_t *x, size_t *y) {
+ *x = cursor_x;
+ *y = cursor_y;
+}
+#endif
+
+void term_fallback(void) {
+#if uefi == 1
+ if (!efi_boot_services_exited) {
+ gST->ConOut->Reset(gST->ConOut, false);
+ gST->ConOut->SetMode(gST->ConOut, 0);
+ cursor_x = cursor_y = 0;
+#elif bios == 1
+ fallback_clear(true);
+#endif
+ term_notready();
+ raw_putchar = fallback_raw_putchar;
+ clear = fallback_clear;
+ set_cursor_pos = fallback_set_cursor_pos;
+ get_cursor_pos = fallback_get_cursor_pos;
+ term_backend = FALLBACK;
+#if uefi == 1
+ }
+#endif
+}
+
void (*raw_putchar)(uint8_t c);
void (*clear)(bool move);
void (*enable_cursor)(void);
