mirror of
https://github.com/limine-bootloader/limine
synced 2024-12-12 17:47:19 +03:00
term: Move fallback logic from panic.s2.c to term.s2.c
This commit is contained in:
parent
8f84178dbe
commit
a494a1d47a
@ -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: ");
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user