From ec563ea8e4fce8d186dcf3dfaa18c1dfc7e899d7 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 22 Feb 2020 17:52:51 -0800 Subject: [PATCH] Allow multiple calls to console::status_* functions --- src/boot/console.cpp | 55 +++++++++++++++++++++++++++++--------------- src/boot/console.h | 13 +++++++---- src/boot/main.cpp | 5 ++-- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/boot/console.cpp b/src/boot/console.cpp index ca00bea..5571fac 100644 --- a/src/boot/console.cpp +++ b/src/boot/console.cpp @@ -18,6 +18,10 @@ namespace boot { size_t ROWS = 0; size_t COLS = 0; +static constexpr int level_ok = 0; +static constexpr int level_warn = 1; +static constexpr int level_fail = 2; + console *console::s_console = nullptr; static const wchar_t digits[] = {u'0', u'1', u'2', u'3', u'4', u'5', @@ -26,7 +30,8 @@ static const wchar_t digits[] = {u'0', u'1', u'2', u'3', u'4', u'5', console::console(uefi::boot_services *bs, uefi::protos::simple_text_output *out) : m_rows(0), m_cols(0), - m_current_status_line(0), + m_status_level(0), + m_status_line(0), m_out(out) { pick_mode(bs); @@ -251,20 +256,25 @@ console::print(const wchar_t *fmt, ...) void console::status_begin(const wchar_t *message) { - m_current_status_line = m_out->mode->cursor_row; - m_out->set_cursor_position(0, m_current_status_line); + m_status_line = m_out->mode->cursor_row; + m_status_level = level_ok; + + m_out->set_cursor_position(0, m_status_line); m_out->set_attribute(uefi::attribute::light_gray); m_out->output_string(message); m_out->output_string(L"\r\n"); } void -console::status_ok() const +console::status_end() { + if (m_status_level > level_ok) + return; + int row = m_out->mode->cursor_row; int col = m_out->mode->cursor_column; - m_out->set_cursor_position(50, m_current_status_line); + m_out->set_cursor_position(50, m_status_line); m_out->set_attribute(uefi::attribute::light_gray); m_out->output_string(L"["); @@ -277,21 +287,26 @@ console::status_ok() const } void -console::status_fail(const wchar_t *message, const wchar_t *error) const +console::status_warn(const wchar_t *message, const wchar_t *error) { int row = m_out->mode->cursor_row; - m_out->set_cursor_position(50, m_current_status_line); - m_out->set_attribute(uefi::attribute::light_gray); - m_out->output_string(L"["); - m_out->set_attribute(uefi::attribute::light_red); - m_out->output_string(L"failed"); - m_out->set_attribute(uefi::attribute::light_gray); - m_out->output_string(L"]"); + if (m_status_level <= level_warn) { + m_status_level = level_warn; + + m_out->set_cursor_position(50, m_status_line); + + m_out->set_attribute(uefi::attribute::light_gray); + m_out->output_string(L"["); + m_out->set_attribute(uefi::attribute::brown); + m_out->output_string(L" warn "); + m_out->set_attribute(uefi::attribute::light_gray); + m_out->output_string(L"]"); + } m_out->set_cursor_position(4, row); - m_out->set_attribute(uefi::attribute::red); + m_out->set_attribute(uefi::attribute::yellow); m_out->output_string(message); if (error) { @@ -304,21 +319,23 @@ console::status_fail(const wchar_t *message, const wchar_t *error) const } void -console::status_warn(const wchar_t *message, const wchar_t *error) const +console::status_fail(const wchar_t *message, const wchar_t *error) { + m_status_level = level_fail; + int row = m_out->mode->cursor_row; - m_out->set_cursor_position(50, m_current_status_line); + m_out->set_cursor_position(50, m_status_line); m_out->set_attribute(uefi::attribute::light_gray); m_out->output_string(L"["); - m_out->set_attribute(uefi::attribute::brown); - m_out->output_string(L" warn "); + m_out->set_attribute(uefi::attribute::light_red); + m_out->output_string(L"failed"); m_out->set_attribute(uefi::attribute::light_gray); m_out->output_string(L"]"); m_out->set_cursor_position(4, row); - m_out->set_attribute(uefi::attribute::yellow); + m_out->set_attribute(uefi::attribute::red); m_out->output_string(message); if (error) { diff --git a/src/boot/console.h b/src/boot/console.h index 7645072..f54fac2 100644 --- a/src/boot/console.h +++ b/src/boot/console.h @@ -12,9 +12,9 @@ public: console(uefi::boot_services *bs, uefi::protos::simple_text_output *out); void status_begin(const wchar_t *message); - void status_fail(const wchar_t *message, const wchar_t *error=nullptr) const; - void status_warn(const wchar_t *message, const wchar_t *error=nullptr) const; - void status_ok() const; + void status_warn(const wchar_t *message, const wchar_t *error=nullptr); + void status_fail(const wchar_t *message, const wchar_t *error=nullptr); + void status_end(); size_t print_hex(uint32_t n) const; size_t print_dec(uint32_t n) const; @@ -22,7 +22,7 @@ public: size_t print_long_dec(uint64_t n) const; size_t printf(const wchar_t *fmt, ...) const; - static const console & get() { return *s_console; } + static console & get() { return *s_console; } static size_t print(const wchar_t *fmt, ...); private: @@ -30,7 +30,10 @@ private: size_t vprintf(const wchar_t *fmt, va_list args) const; size_t m_rows, m_cols; - int m_current_status_line; + + int m_status_level; + int m_status_line; + uefi::protos::simple_text_output *m_out; static console *s_console; diff --git a/src/boot/main.cpp b/src/boot/main.cpp index 0efdaf7..79f9bbd 100644 --- a/src/boot/main.cpp +++ b/src/boot/main.cpp @@ -108,7 +108,7 @@ bootloader_main_uefi(uefi::system_table *st, console &con) con.status_begin(L"Initializing pointer fixup for virtualization"); memory::init_pointer_fixup(bs, rs); - con.status_ok(); + con.status_end(); // Find ACPI tables. Ignore ACPI 1.0 if a 2.0 table is found. // @@ -133,9 +133,8 @@ bootloader_main_uefi(uefi::system_table *st, console &con) error::raise(uefi::status::not_found, L"Could not find ACPI table"); } else if (acpi_table & 1) { con.status_warn(L"Only found ACPI 1.0 table"); - } else { - con.status_ok(); } + con.status_end(); while(1); return uefi::status::success;