diff --git a/common/entry.s2.c b/common/entry.s2.c index d13029f0..986c838f 100644 --- a/common/entry.s2.c +++ b/common/entry.s2.c @@ -75,8 +75,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 +#include +#include +#include +#include +#include + +// --- 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