:: commit 9f10f1aa4adf34b8a076de629dbcd1d59f581751

mintsuki <mintsuki@protonmail.com> — 2022-06-17 18:29

parents: 564044ec36

term: Move notready and fallback backends to stage 2

diff --git a/common/entry.s2.c b/common/entry.s2.c
index 14d48479..66c1a7ba 100644
--- a/common/entry.s2.c
+++ b/common/entry.s2.c
@@ -77,8 +77,12 @@ enum {
 
 noreturn void entry(uint8_t boot_drive, int boot_from) {
     // XXX DO NOT MOVE A20 ENABLE CALL
-    if (!a20_enable())
+    if (!a20_enable()) {
+        term_fallback();
         panic(false, "Could not enable A20 line");
+    }
+
+    term_fallback();
 
     init_e820();
     init_memmap();
diff --git a/common/lib/term.c b/common/lib/term.c
index 717dedae..f816895c 100644
--- a/common/lib/term.c
+++ b/common/lib/term.c
@@ -87,183 +87,6 @@ int term_backend = NOT_READY;
 size_t term_rows, term_cols;
 bool term_runtime = false;
 
-static void notready_raw_putchar(uint8_t c) {
-    (void)c;
-}
-static void notready_clear(bool move) {
-    (void)move;
-}
-static void notready_void(void) {}
-static void notready_set_cursor_pos(size_t x, size_t y) {
-    (void)x; (void)y;
-}
-static void notready_get_cursor_pos(size_t *x, size_t *y) {
-    *x = 0;
-    *y = 0;
-}
-static void notready_size_t(size_t n) {
-    (void)n;
-}
-static bool notready_disable(void) {
-    return false;
-}
-static void notready_move_character(size_t a, size_t b, size_t c, size_t d) {
-    (void)a; (void)b; (void)c; (void)d;
-}
-static uint64_t notready_context_size(void) {
-    return 0;
-}
-static void notready_uint64_t(uint64_t n) {
-    (void)n;
-}
-
-void term_notready(void) {
-    term_backend = NOT_READY;
-
-    raw_putchar = notready_raw_putchar;
-    clear = notready_clear;
-    enable_cursor = notready_void;
-    disable_cursor = notready_disable;
-    set_cursor_pos = notready_set_cursor_pos;
-    get_cursor_pos = notready_get_cursor_pos;
-    set_text_fg = notready_size_t;
-    set_text_bg = notready_size_t;
-    set_text_fg_bright = notready_size_t;
-    set_text_bg_bright = notready_size_t;
-    set_text_fg_default = notready_void;
-    set_text_bg_default = notready_void;
-    scroll_disable = notready_disable;
-    scroll_enable = notready_void;
-    term_move_character = notready_move_character;
-    term_scroll = notready_void;
-    term_revscroll = notready_void;
-    term_swap_palette = notready_void;
-    term_save_state = notready_void;
-    term_restore_state = notready_void;
-    term_double_buffer_flush = notready_void;
-    term_context_size = notready_context_size;
-    term_context_save = notready_uint64_t;
-    term_context_restore = notready_uint64_t;
-    term_full_refresh = notready_void;
-
-    term_cols = 80;
-    term_rows = 24;
-}
-
-#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);
diff --git a/common/lib/term.s2.c b/common/lib/term.s2.c
new file mode 100644
index 00000000..876c320c
--- /dev/null
+++ b/common/lib/term.s2.c
@@ -0,0 +1,187 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <lib/term.h>
+#include <lib/blib.h>
+#include <lib/real.h>
+
+// --- fallback ---
+
+#if bios == 1
+static void fallback_raw_putchar(uint8_t c) {
+    struct rm_regs r = {0};
+    r.eax = 0x0e00 | c;
+    rm_int(0x10, &r, &r);
+}
+
+static 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);
+}
+
+static 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);
+}
+
+static 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;
+
+static 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++;
+            }
+    }
+}
+
+static void fallback_clear(bool move) {
+    (void)move;
+    gST->ConOut->ClearScreen(gST->ConOut);
+    cursor_x = cursor_y = 0;
+}
+
+static 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;
+}
+
+static 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
+}
+
+// --- notready ---
+
+static void notready_raw_putchar(uint8_t c) {
+    (void)c;
+}
+static void notready_clear(bool move) {
+    (void)move;
+}
+static void notready_void(void) {}
+static void notready_set_cursor_pos(size_t x, size_t y) {
+    (void)x; (void)y;
+}
+static void notready_get_cursor_pos(size_t *x, size_t *y) {
+    *x = 0;
+    *y = 0;
+}
+static void notready_size_t(size_t n) {
+    (void)n;
+}
+static bool notready_disable(void) {
+    return false;
+}
+static void notready_move_character(size_t a, size_t b, size_t c, size_t d) {
+    (void)a; (void)b; (void)c; (void)d;
+}
+static uint64_t notready_context_size(void) {
+    return 0;
+}
+static void notready_uint64_t(uint64_t n) {
+    (void)n;
+}
+
+void term_notready(void) {
+    term_backend = NOT_READY;
+
+    raw_putchar = notready_raw_putchar;
+    clear = notready_clear;
+    enable_cursor = notready_void;
+    disable_cursor = notready_disable;
+    set_cursor_pos = notready_set_cursor_pos;
+    get_cursor_pos = notready_get_cursor_pos;
+    set_text_fg = notready_size_t;
+    set_text_bg = notready_size_t;
+    set_text_fg_bright = notready_size_t;
+    set_text_bg_bright = notready_size_t;
+    set_text_fg_default = notready_void;
+    set_text_bg_default = notready_void;
+    scroll_disable = notready_disable;
+    scroll_enable = notready_void;
+    term_move_character = notready_move_character;
+    term_scroll = notready_void;
+    term_revscroll = notready_void;
+    term_swap_palette = notready_void;
+    term_save_state = notready_void;
+    term_restore_state = notready_void;
+    term_double_buffer_flush = notready_void;
+    term_context_size = notready_context_size;
+    term_context_save = notready_uint64_t;
+    term_context_restore = notready_uint64_t;
+    term_full_refresh = notready_void;
+
+    term_cols = 80;
+    term_rows = 24;
+}
diff --git a/common/linker_bios.ld.in b/common/linker_bios.ld.in
index 267c63e2..5911b48c 100644
--- a/common/linker_bios.ld.in
+++ b/common/linker_bios.ld.in
@@ -41,7 +41,6 @@ SECTIONS
         term_write = .;
         term_textmode = .;
         term_vbe = .;
-        term_fallback = .;
         stage3_addr = .;
         data_begin = .;
 #else
tab: 248 wrap: offon