diff --git a/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h b/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h index 329e14e37..2ca517b44 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h +++ b/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h @@ -31,8 +31,12 @@ class Genode::Multiboot2_info : Mmio struct Type : Register <0x00, 32> { enum { - END = 0, MEMORY = 6, FRAMEBUFFER = 8, - ACPI_RSDP_V1 = 14, ACPI_RSDP_V2 = 15 + END = 0, + MEMORY = 6, + FRAMEBUFFER = 8, + EFI_SYSTEM_TABLE_64 = 12, + ACPI_RSDP_V1 = 14, + ACPI_RSDP_V2 = 15, }; }; struct Size : Register <0x04, 32> { }; @@ -40,6 +44,13 @@ class Genode::Multiboot2_info : Mmio Tag(addr_t addr) : Mmio(addr) { } }; + struct Efi_system_table_64 : Tag + { + struct Pointer : Register <0x08, 64> { }; + + Efi_system_table_64(addr_t addr) : Tag(addr) { } + }; + public: enum { MAGIC = 0x36d76289UL }; @@ -56,8 +67,14 @@ class Genode::Multiboot2_info : Mmio Multiboot2_info(addr_t mbi) : Mmio(mbi) { } - template - void for_each_tag(FUNC_MEM mem_fn, FUNC_ACPI acpi_fn, FUNC_FB fb_fn) + template + void for_each_tag(FUNC_MEM mem_fn, + FUNC_ACPI acpi_fn, + FUNC_FB fb_fn, + FUNC_SYSTAB64 systab64_fn) { addr_t const size = read(); @@ -69,6 +86,10 @@ class Genode::Multiboot2_info : Mmio if (tag.read() == Tag::Type::END) return; + if (tag.read() == Tag::Type::EFI_SYSTEM_TABLE_64) { + Efi_system_table_64 const est(tag_addr); + systab64_fn(est.read()); + } if (tag.read() == Tag::Type::MEMORY) { addr_t mem_start = tag_addr + (1UL << Tag::LOG2_SIZE) + 8; addr_t const mem_end = tag_addr + tag.read(); diff --git a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc index fbc2553b5..62716c781 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc @@ -119,6 +119,9 @@ Bootstrap::Platform::Board::Board() }, [&] (Hw::Framebuffer const &fb) { info.framebuffer = fb; + }, + [&] (uint64_t const efi_sys_tab) { + info.efi_system_table = efi_sys_tab; }); } else if (__initial_ax == Multiboot_info::MAGIC) { for (unsigned i = 0; true; i++) { diff --git a/repos/base-hw/src/core/spec/x86_64/platform_support.cc b/repos/base-hw/src/core/spec/x86_64/platform_support.cc index 02d64c3aa..247b3ca05 100644 --- a/repos/base-hw/src/core/spec/x86_64/platform_support.cc +++ b/repos/base-hw/src/core/spec/x86_64/platform_support.cc @@ -20,6 +20,11 @@ using namespace Genode; void Platform::_init_additional_platform_info(Xml_generator &xml) { + if (_boot_info().plat_info.efi_system_table != 0) { + xml.node("efi-system-table", [&] () { + xml.attribute("address", String<32>(Hex(_boot_info().plat_info.efi_system_table))); + }); + } xml.node("acpi", [&] () { uint32_t const revision = _boot_info().plat_info.acpi_rsdp.revision; uint32_t const rsdt = _boot_info().plat_info.acpi_rsdp.rsdt; diff --git a/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h b/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h index 4d171f2e4..6db6e57fd 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/pc_board.h @@ -33,8 +33,9 @@ struct Hw::Pc_board::Serial : Genode::X86_uart struct Hw::Pc_board::Boot_info { - Acpi_rsdp acpi_rsdp { }; - Framebuffer framebuffer { }; + Acpi_rsdp acpi_rsdp { }; + Framebuffer framebuffer { }; + Genode::addr_t efi_system_table { 0 }; Boot_info() {} Boot_info(Acpi_rsdp const &acpi_rsdp,