mirror of
https://github.com/limine-bootloader/limine
synced 2024-12-25 07:16:48 +03:00
term: Introduce quiet mode
This commit is contained in:
parent
4337ae1a32
commit
a937eb4202
@ -82,6 +82,7 @@ Some keys take *URIs* as values; these are described in the next section.
|
|||||||
* `EDITOR_HIGHLIGHTING` - If set to `no`, syntax highlighting in the editor will be disabled. Defaults to `yes`.
|
* `EDITOR_HIGHLIGHTING` - If set to `no`, syntax highlighting in the editor will be disabled. Defaults to `yes`.
|
||||||
* `EDITOR_VALIDATION` - If set to `no`, the editor will not alert you about invalid keys / syntax errors. Defaults to `yes`.
|
* `EDITOR_VALIDATION` - If set to `no`, the editor will not alert you about invalid keys / syntax errors. Defaults to `yes`.
|
||||||
* `VERBOSE` - If set to `yes`, print additional information during boot. Defaults to not verbose.
|
* `VERBOSE` - If set to `yes`, print additional information during boot. Defaults to not verbose.
|
||||||
|
* `QUIET` - If set to `yes`, enable quiet mode, where all screen output except panics and important warnings is suppressed.
|
||||||
* `RANDOMISE_MEMORY` - If set to `yes`, randomise the contents of RAM at bootup in order to find bugs related to non zeroed memory or for security reasons. This option will slow down boot time significantly.
|
* `RANDOMISE_MEMORY` - If set to `yes`, randomise the contents of RAM at bootup in order to find bugs related to non zeroed memory or for security reasons. This option will slow down boot time significantly.
|
||||||
* `RANDOMIZE_MEMORY` - Alias of `RANDOMISE_MEMORY`.
|
* `RANDOMIZE_MEMORY` - Alias of `RANDOMISE_MEMORY`.
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ static bool stage3_init(struct volume *part) {
|
|||||||
stage3_found = true;
|
stage3_found = true;
|
||||||
|
|
||||||
if (stage3->size != (size_t)limine_sys_size) {
|
if (stage3->size != (size_t)limine_sys_size) {
|
||||||
|
term_textmode();
|
||||||
print("limine.sys size incorrect.\n");
|
print("limine.sys size incorrect.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -55,6 +56,7 @@ static bool stage3_init(struct volume *part) {
|
|||||||
fclose(stage3);
|
fclose(stage3);
|
||||||
|
|
||||||
if (memcmp(build_id_s2 + 16, build_id_s3 + 16, 20) != 0) {
|
if (memcmp(build_id_s2 + 16, build_id_s3 + 16, 20) != 0) {
|
||||||
|
term_textmode();
|
||||||
print("limine.sys build ID mismatch.\n");
|
print("limine.sys build ID mismatch.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -76,11 +78,11 @@ void entry(uint8_t boot_drive, int boot_from) {
|
|||||||
if (!a20_enable())
|
if (!a20_enable())
|
||||||
panic("Could not enable A20 line");
|
panic("Could not enable A20 line");
|
||||||
|
|
||||||
|
term_notready();
|
||||||
|
|
||||||
init_e820();
|
init_e820();
|
||||||
init_memmap();
|
init_memmap();
|
||||||
|
|
||||||
term_textmode();
|
|
||||||
|
|
||||||
init_idt();
|
init_idt();
|
||||||
|
|
||||||
disk_create_index();
|
disk_create_index();
|
||||||
@ -98,14 +100,17 @@ void entry(uint8_t boot_drive, int boot_from) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!stage3_found)
|
if (!stage3_found) {
|
||||||
|
term_textmode();
|
||||||
print("\n"
|
print("\n"
|
||||||
"!! Stage 3 file not found!\n"
|
"!! Stage 3 file not found!\n"
|
||||||
"!! Have you copied limine.sys to the root or /boot directories of\n"
|
"!! Have you copied limine.sys to the root or /boot directories of\n"
|
||||||
"!! one of the partitions on the boot device?\n\n");
|
"!! one of the partitions on the boot device?\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (!stage3_loaded)
|
if (!stage3_loaded) {
|
||||||
panic("Failed to load stage 3.");
|
panic("Failed to load stage 3.");
|
||||||
|
}
|
||||||
|
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
void (*stage3)(int boot_from) = (void *)stage3_addr;
|
void (*stage3)(int boot_from) = (void *)stage3_addr;
|
||||||
|
@ -63,6 +63,8 @@ void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
|
|||||||
print("WARNING: Failed to disable watchdog timer!\n");
|
print("WARNING: Failed to disable watchdog timer!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term_notready();
|
||||||
|
|
||||||
init_memmap();
|
init_memmap();
|
||||||
|
|
||||||
disk_create_index();
|
disk_create_index();
|
||||||
@ -136,6 +138,9 @@ void stage3_common(void) {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
char *quiet_str = config_get_value(NULL, 0, "QUIET");
|
||||||
|
quiet = quiet_str != NULL && strcmp(quiet_str, "yes") == 0;
|
||||||
|
|
||||||
char *verbose_str = config_get_value(NULL, 0, "VERBOSE");
|
char *verbose_str = config_get_value(NULL, 0, "VERBOSE");
|
||||||
verbose = verbose_str != NULL && strcmp(verbose_str, "yes") == 0;
|
verbose = verbose_str != NULL && strcmp(verbose_str, "yes") == 0;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ extern struct volume *boot_volume;
|
|||||||
extern bool stage3_loaded;
|
extern bool stage3_loaded;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern bool verbose;
|
extern bool verbose, quiet;
|
||||||
|
|
||||||
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf);
|
bool parse_resolution(size_t *width, size_t *height, size_t *bpp, const char *buf);
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <lib/print.h>
|
#include <lib/print.h>
|
||||||
|
|
||||||
bool verbose = true;
|
bool verbose = true;
|
||||||
|
bool quiet = false;
|
||||||
|
|
||||||
uint8_t bcd_to_int(uint8_t val) {
|
uint8_t bcd_to_int(uint8_t val) {
|
||||||
return (val & 0x0f) + ((val & 0xf0) >> 4) * 10;
|
return (val & 0x0f) + ((val & 0xf0) >> 4) * 10;
|
||||||
|
@ -15,6 +15,8 @@ __attribute__((noreturn)) void panic(const char *fmt, ...) {
|
|||||||
|
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
quiet = false;
|
||||||
|
|
||||||
if (term_backend == NOT_READY) {
|
if (term_backend == NOT_READY) {
|
||||||
#if bios == 1
|
#if bios == 1
|
||||||
term_textmode();
|
term_textmode();
|
||||||
|
@ -14,11 +14,15 @@ void term_deinit(void) {
|
|||||||
gterm_deinit();
|
gterm_deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
term_backend = NOT_READY;
|
term_notready();
|
||||||
}
|
}
|
||||||
|
|
||||||
void term_vbe(size_t width, size_t height) {
|
void term_vbe(size_t width, size_t height) {
|
||||||
term_backend = NOT_READY;
|
term_notready();
|
||||||
|
|
||||||
|
if (quiet) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!gterm_init(&term_rows, &term_cols, width, height)) {
|
if (!gterm_init(&term_rows, &term_cols, width, height)) {
|
||||||
#if bios == 1
|
#if bios == 1
|
||||||
|
@ -48,6 +48,7 @@ void term_reinit(void);
|
|||||||
void term_deinit(void);
|
void term_deinit(void);
|
||||||
void term_vbe(size_t width, size_t height);
|
void term_vbe(size_t width, size_t height);
|
||||||
void term_textmode(void);
|
void term_textmode(void);
|
||||||
|
void term_notready(void);
|
||||||
void term_putchar(uint8_t c);
|
void term_putchar(uint8_t c);
|
||||||
void term_write(uint64_t buf, uint64_t count);
|
void term_write(uint64_t buf, uint64_t count);
|
||||||
|
|
||||||
@ -95,12 +96,10 @@ extern void (*term_callback)(uint64_t, uint64_t, uint64_t, uint64_t);
|
|||||||
extern bool term_autoflush;
|
extern bool term_autoflush;
|
||||||
|
|
||||||
inline void reset_term(void) {
|
inline void reset_term(void) {
|
||||||
if (term_backend != NOT_READY) {
|
term_autoflush = true;
|
||||||
term_autoflush = true;
|
enable_cursor();
|
||||||
enable_cursor();
|
clear(true);
|
||||||
clear(true);
|
term_double_buffer_flush();
|
||||||
term_double_buffer_flush();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,6 +16,66 @@ int term_backend = NOT_READY;
|
|||||||
size_t term_rows, term_cols;
|
size_t term_rows, term_cols;
|
||||||
bool term_runtime = false;
|
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_swap_palette = 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_rows = 100;
|
||||||
|
term_cols = 100;
|
||||||
|
}
|
||||||
|
|
||||||
void (*raw_putchar)(uint8_t c);
|
void (*raw_putchar)(uint8_t c);
|
||||||
void (*clear)(bool move);
|
void (*clear)(bool move);
|
||||||
void (*enable_cursor)(void);
|
void (*enable_cursor)(void);
|
||||||
@ -90,11 +150,16 @@ void term_reinit(void) {
|
|||||||
g_select = 0;
|
g_select = 0;
|
||||||
charsets[0] = CHARSET_DEFAULT;
|
charsets[0] = CHARSET_DEFAULT;
|
||||||
charsets[1] = CHARSET_DEC_SPECIAL;
|
charsets[1] = CHARSET_DEC_SPECIAL;
|
||||||
|
term_autoflush = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if bios == 1
|
#if bios == 1
|
||||||
void term_textmode(void) {
|
void term_textmode(void) {
|
||||||
term_backend = NOT_READY;
|
term_notready();
|
||||||
|
|
||||||
|
if (quiet) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
init_vga_textmode(&term_rows, &term_cols, true);
|
init_vga_textmode(&term_rows, &term_cols, true);
|
||||||
|
|
||||||
|
@ -456,6 +456,8 @@ failed_to_load_header_section:
|
|||||||
struct stivale2_header_tag_terminal *terminal_hdr_tag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_TERMINAL_ID);
|
struct stivale2_header_tag_terminal *terminal_hdr_tag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_TERMINAL_ID);
|
||||||
|
|
||||||
if (bits == 64 && terminal_hdr_tag != NULL) {
|
if (bits == 64 && terminal_hdr_tag != NULL) {
|
||||||
|
quiet = false;
|
||||||
|
|
||||||
if (bios &&
|
if (bios &&
|
||||||
((avtag == NULL && hdrtag == NULL) || (avtag != NULL && preference == 1))) {
|
((avtag == NULL && hdrtag == NULL) || (avtag != NULL && preference == 1))) {
|
||||||
term_textmode();
|
term_textmode();
|
||||||
|
Loading…
Reference in New Issue
Block a user