base-hw: EFI sys-table pointer in platform info

Ref #3430
This commit is contained in:
Martin Stein 2019-07-09 18:26:20 +02:00 committed by Christian Helmuth
parent 04e8ba716c
commit b87e21a392
4 changed files with 36 additions and 6 deletions

View File

@ -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 <typename FUNC_MEM, typename FUNC_ACPI, typename FUNC_FB>
void for_each_tag(FUNC_MEM mem_fn, FUNC_ACPI acpi_fn, FUNC_FB fb_fn)
template <typename FUNC_MEM,
typename FUNC_ACPI,
typename FUNC_FB,
typename FUNC_SYSTAB64>
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<Multiboot2_info::Size>();
@ -69,6 +86,10 @@ class Genode::Multiboot2_info : Mmio
if (tag.read<Tag::Type>() == Tag::Type::END)
return;
if (tag.read<Tag::Type>() == Tag::Type::EFI_SYSTEM_TABLE_64) {
Efi_system_table_64 const est(tag_addr);
systab64_fn(est.read<Efi_system_table_64::Pointer>());
}
if (tag.read<Tag::Type>() == Tag::Type::MEMORY) {
addr_t mem_start = tag_addr + (1UL << Tag::LOG2_SIZE) + 8;
addr_t const mem_end = tag_addr + tag.read<Tag::Size>();

View File

@ -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++) {

View File

@ -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;

View File

@ -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,