:: commit a494a1d47a520494e094274e0e82c2f3b7a9ca84

mintsuki <mintsuki@protonmail.com> — 2022-01-05 15:03

parents: 8f84178dbe

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);
tab: 248 wrap: offon