Allow multiple calls to console::status_* functions
This commit is contained in:
@@ -18,6 +18,10 @@ namespace boot {
|
|||||||
size_t ROWS = 0;
|
size_t ROWS = 0;
|
||||||
size_t COLS = 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;
|
console *console::s_console = nullptr;
|
||||||
|
|
||||||
static const wchar_t digits[] = {u'0', u'1', u'2', u'3', u'4', u'5',
|
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) :
|
console::console(uefi::boot_services *bs, uefi::protos::simple_text_output *out) :
|
||||||
m_rows(0),
|
m_rows(0),
|
||||||
m_cols(0),
|
m_cols(0),
|
||||||
m_current_status_line(0),
|
m_status_level(0),
|
||||||
|
m_status_line(0),
|
||||||
m_out(out)
|
m_out(out)
|
||||||
{
|
{
|
||||||
pick_mode(bs);
|
pick_mode(bs);
|
||||||
@@ -251,20 +256,25 @@ console::print(const wchar_t *fmt, ...)
|
|||||||
void
|
void
|
||||||
console::status_begin(const wchar_t *message)
|
console::status_begin(const wchar_t *message)
|
||||||
{
|
{
|
||||||
m_current_status_line = m_out->mode->cursor_row;
|
m_status_line = m_out->mode->cursor_row;
|
||||||
m_out->set_cursor_position(0, m_current_status_line);
|
m_status_level = level_ok;
|
||||||
|
|
||||||
|
m_out->set_cursor_position(0, m_status_line);
|
||||||
m_out->set_attribute(uefi::attribute::light_gray);
|
m_out->set_attribute(uefi::attribute::light_gray);
|
||||||
m_out->output_string(message);
|
m_out->output_string(message);
|
||||||
m_out->output_string(L"\r\n");
|
m_out->output_string(L"\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
console::status_ok() const
|
console::status_end()
|
||||||
{
|
{
|
||||||
|
if (m_status_level > level_ok)
|
||||||
|
return;
|
||||||
|
|
||||||
int row = m_out->mode->cursor_row;
|
int row = m_out->mode->cursor_row;
|
||||||
int col = m_out->mode->cursor_column;
|
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->set_attribute(uefi::attribute::light_gray);
|
||||||
m_out->output_string(L"[");
|
m_out->output_string(L"[");
|
||||||
@@ -277,21 +287,26 @@ console::status_ok() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
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);
|
if (m_status_level <= level_warn) {
|
||||||
m_out->output_string(L"[");
|
m_status_level = level_warn;
|
||||||
m_out->set_attribute(uefi::attribute::light_red);
|
|
||||||
m_out->output_string(L"failed");
|
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::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_cursor_position(4, row);
|
||||||
|
|
||||||
m_out->set_attribute(uefi::attribute::red);
|
m_out->set_attribute(uefi::attribute::yellow);
|
||||||
m_out->output_string(message);
|
m_out->output_string(message);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -304,21 +319,23 @@ console::status_fail(const wchar_t *message, const wchar_t *error) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
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;
|
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->set_attribute(uefi::attribute::light_gray);
|
||||||
m_out->output_string(L"[");
|
m_out->output_string(L"[");
|
||||||
m_out->set_attribute(uefi::attribute::brown);
|
m_out->set_attribute(uefi::attribute::light_red);
|
||||||
m_out->output_string(L" warn ");
|
m_out->output_string(L"failed");
|
||||||
m_out->set_attribute(uefi::attribute::light_gray);
|
m_out->set_attribute(uefi::attribute::light_gray);
|
||||||
m_out->output_string(L"]");
|
m_out->output_string(L"]");
|
||||||
|
|
||||||
m_out->set_cursor_position(4, row);
|
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);
|
m_out->output_string(message);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ public:
|
|||||||
console(uefi::boot_services *bs, uefi::protos::simple_text_output *out);
|
console(uefi::boot_services *bs, uefi::protos::simple_text_output *out);
|
||||||
|
|
||||||
void status_begin(const wchar_t *message);
|
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);
|
||||||
void status_warn(const wchar_t *message, const wchar_t *error=nullptr) const;
|
void status_fail(const wchar_t *message, const wchar_t *error=nullptr);
|
||||||
void status_ok() const;
|
void status_end();
|
||||||
|
|
||||||
size_t print_hex(uint32_t n) const;
|
size_t print_hex(uint32_t n) const;
|
||||||
size_t print_dec(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 print_long_dec(uint64_t n) const;
|
||||||
size_t printf(const wchar_t *fmt, ...) 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, ...);
|
static size_t print(const wchar_t *fmt, ...);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -30,7 +30,10 @@ private:
|
|||||||
size_t vprintf(const wchar_t *fmt, va_list args) const;
|
size_t vprintf(const wchar_t *fmt, va_list args) const;
|
||||||
|
|
||||||
size_t m_rows, m_cols;
|
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;
|
uefi::protos::simple_text_output *m_out;
|
||||||
|
|
||||||
static console *s_console;
|
static console *s_console;
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ bootloader_main_uefi(uefi::system_table *st, console &con)
|
|||||||
|
|
||||||
con.status_begin(L"Initializing pointer fixup for virtualization");
|
con.status_begin(L"Initializing pointer fixup for virtualization");
|
||||||
memory::init_pointer_fixup(bs, rs);
|
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.
|
// 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");
|
error::raise(uefi::status::not_found, L"Could not find ACPI table");
|
||||||
} else if (acpi_table & 1) {
|
} else if (acpi_table & 1) {
|
||||||
con.status_warn(L"Only found ACPI 1.0 table");
|
con.status_warn(L"Only found ACPI 1.0 table");
|
||||||
} else {
|
|
||||||
con.status_ok();
|
|
||||||
}
|
}
|
||||||
|
con.status_end();
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
return uefi::status::success;
|
return uefi::status::success;
|
||||||
|
|||||||
Reference in New Issue
Block a user