From 5c77ebb1fb694f3c410d555305ea0a8b075bf016 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Thu, 16 May 2019 14:20:39 +0200 Subject: [PATCH] hw: factor out x86 specific bootinfo Ref #3326 --- repos/base-hw/src/bootstrap/platform.cc | 3 +-- repos/base-hw/src/bootstrap/platform.h | 5 ++--- .../src/bootstrap/spec/x86_64/platform.cc | 3 ++- repos/base-hw/src/core/kernel/cpu.cc | 4 +++- repos/base-hw/src/core/platform.cc | 4 ++-- repos/base-hw/src/core/platform.h | 3 ++- .../base-hw/src/core/spec/x86_64/muen/board.h | 10 ++-------- .../src/core/spec/x86_64/platform_support.cc | 8 ++++---- repos/base-hw/src/include/hw/boot_info.h | 16 ++++++---------- .../src/include/hw/spec/arm/arndale_board.h | 1 + .../src/include/hw/spec/arm/boot_info.h | 19 +++++++++++++++++++ .../src/include/hw/spec/arm/imx53_qsb_board.h | 1 + .../hw/spec/arm/imx6q_sabrelite_board.h | 1 + .../include/hw/spec/arm/imx7d_sabre_board.h | 2 +- .../include/hw/spec/arm/nit6_solox_board.h | 1 + .../src/include/hw/spec/arm/odroid_xu_board.h | 2 +- .../src/include/hw/spec/arm/panda_board.h | 1 + .../src/include/hw/spec/arm/pbxa9_board.h | 1 + .../src/include/hw/spec/arm/rpi_board.h | 1 + .../include/hw/spec/arm/usb_armory_board.h | 1 + .../src/include/hw/spec/arm/wand_quad_board.h | 1 + .../src/include/hw/spec/arm/zynq_qemu_board.h | 1 + .../base-hw/src/include/hw/spec/riscv/board.h | 1 + .../src/include/hw/spec/riscv/boot_info.h | 19 +++++++++++++++++++ .../include/hw/{ => spec/x86_64}/acpi_rsdp.h | 6 +++--- .../hw/{ => spec/x86_64}/framebuffer.h | 6 +++--- .../src/include/hw/spec/x86_64/pc_board.h | 15 +++++++++++++++ 27 files changed, 96 insertions(+), 40 deletions(-) create mode 100644 repos/base-hw/src/include/hw/spec/arm/boot_info.h create mode 100644 repos/base-hw/src/include/hw/spec/riscv/boot_info.h rename repos/base-hw/src/include/hw/{ => spec/x86_64}/acpi_rsdp.h (82%) rename repos/base-hw/src/include/hw/{ => spec/x86_64}/framebuffer.h (79%) diff --git a/repos/base-hw/src/bootstrap/platform.cc b/repos/base-hw/src/bootstrap/platform.cc index 4fc5fdf12..a0374464c 100644 --- a/repos/base-hw/src/bootstrap/platform.cc +++ b/repos/base-hw/src/bootstrap/platform.cc @@ -196,8 +196,7 @@ Platform::Platform() *construct_at(bi_base, (addr_t)&core_pd->table, (addr_t)&core_pd->array, core_pd->mappings, boot_modules, - board.core_mmio, board.acpi_rsdp, - board.framebuffer, board.cpus); + board.core_mmio, board.cpus, board.info); /* add all left RAM to bootinfo */ ram_alloc.for_each_free_region([&] (Memory_region const & r) { diff --git a/repos/base-hw/src/bootstrap/platform.h b/repos/base-hw/src/bootstrap/platform.h index dd79d55f8..958f55626 100644 --- a/repos/base-hw/src/bootstrap/platform.h +++ b/repos/base-hw/src/bootstrap/platform.h @@ -27,7 +27,7 @@ namespace Bootstrap { using Genode::addr_t; using Genode::size_t; - using Hw::Boot_info; + using Boot_info = Hw::Boot_info<::Board::Boot_info>; using Hw::Mmio_space; using Hw::Mapping; using Hw::Memory_region; @@ -45,9 +45,8 @@ class Bootstrap::Platform Memory_region_array early_ram_regions { }; Memory_region_array late_ram_regions { }; Mmio_space const core_mmio; - Hw::Acpi_rsdp acpi_rsdp { }; - Hw::Framebuffer framebuffer { }; unsigned cpus { NR_OF_CPUS }; + ::Board::Boot_info info { }; Board(); }; 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 927b60b39..902290665 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc @@ -69,6 +69,7 @@ Bootstrap::Platform::Board::Board() Memory_region { __initial_bx & ~0xFFFUL, get_page_size() }) { + Hw::Acpi_rsdp & acpi_rsdp = info.acpi_rsdp; static constexpr size_t initial_map_max = 1024 * 1024 * 1024; auto lambda = [&] (addr_t base, addr_t size) { @@ -117,7 +118,7 @@ Bootstrap::Platform::Board::Board() acpi_rsdp = rsdp; }, [&] (Hw::Framebuffer const &fb) { - framebuffer = fb; + info.framebuffer = fb; }); } else if (__initial_ax == Multiboot_info::MAGIC) { for (unsigned i = 0; true; i++) { diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index 3d372dceb..007e97a94 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -186,5 +187,6 @@ Cpu & Cpu_pool::cpu(unsigned const id) } +using Boot_info = Hw::Boot_info; Cpu_pool::Cpu_pool() -: _count(reinterpret_cast(Hw::Mm::boot_info().base)->cpus) { } +: _count(reinterpret_cast(Hw::Mm::boot_info().base)->cpus) { } diff --git a/repos/base-hw/src/core/platform.cc b/repos/base-hw/src/core/platform.cc index 43b6f3a9a..c4350620c 100644 --- a/repos/base-hw/src/core/platform.cc +++ b/repos/base-hw/src/core/platform.cc @@ -40,8 +40,8 @@ using namespace Genode; ** Platform ** **************/ -Hw::Boot_info const & Platform::_boot_info() { - return *reinterpret_cast(Hw::Mm::boot_info().base); } +Hw::Boot_info const & Platform::_boot_info() { + return *reinterpret_cast*>(Hw::Mm::boot_info().base); } addr_t Platform::mmio_to_virt(addr_t mmio) { return _boot_info().mmio_space.virt_addr(mmio); } diff --git a/repos/base-hw/src/core/platform.h b/repos/base-hw/src/core/platform.h index 8586f03d9..e96f89816 100644 --- a/repos/base-hw/src/core/platform.h +++ b/repos/base-hw/src/core/platform.h @@ -34,6 +34,7 @@ #include #include #include +#include namespace Genode { class Address_space; @@ -50,7 +51,7 @@ class Genode::Platform : public Genode::Platform_generic Phys_allocator _irq_alloc; /* IRQ allocator */ Rom_fs _rom_fs { }; /* ROM file system */ - static Hw::Boot_info const &_boot_info(); + static Hw::Boot_info const &_boot_info(); static Hw::Memory_region_array const & _core_virt_regions(); /** diff --git a/repos/base-hw/src/core/spec/x86_64/muen/board.h b/repos/base-hw/src/core/spec/x86_64/muen/board.h index 64f78b303..3ae097478 100644 --- a/repos/base-hw/src/core/spec/x86_64/muen/board.h +++ b/repos/base-hw/src/core/spec/x86_64/muen/board.h @@ -14,11 +14,10 @@ #ifndef _CORE__SPEC__X86_64__MUEN__BOARD_H_ #define _CORE__SPEC__X86_64__MUEN__BOARD_H_ -#include +#include namespace Board { - struct Serial; - enum Dummies { UART_BASE, UART_CLOCK }; + using namespace Hw::Pc_board; enum { TIMER_BASE_ADDR = 0xe00010000, @@ -34,9 +33,4 @@ namespace Board { }; } - -struct Board::Serial : Genode::X86_uart { - Serial(Genode::addr_t, Genode::size_t, unsigned); -}; - #endif /* _CORE__SPEC__X86_64__MUEN__BOARD_H_ */ 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 4dd10785c..02d64c3aa 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 @@ -21,9 +21,9 @@ using namespace Genode; void Platform::_init_additional_platform_info(Xml_generator &xml) { xml.node("acpi", [&] () { - uint32_t const revision = _boot_info().acpi_rsdp.revision; - uint32_t const rsdt = _boot_info().acpi_rsdp.rsdt; - uint64_t const xsdt = _boot_info().acpi_rsdp.xsdt; + uint32_t const revision = _boot_info().plat_info.acpi_rsdp.revision; + uint32_t const rsdt = _boot_info().plat_info.acpi_rsdp.rsdt; + uint64_t const xsdt = _boot_info().plat_info.acpi_rsdp.xsdt; if (revision && (rsdt || xsdt)) { xml.attribute("revision", revision); @@ -36,7 +36,7 @@ void Platform::_init_additional_platform_info(Xml_generator &xml) }); xml.node("boot", [&] () { xml.node("framebuffer", [&] () { - Hw::Framebuffer const &boot_fb = _boot_info().framebuffer; + Hw::Framebuffer const &boot_fb = _boot_info().plat_info.framebuffer; xml.attribute("phys", String<32>(Hex(boot_fb.addr))); xml.attribute("width", boot_fb.width); xml.attribute("height", boot_fb.height); diff --git a/repos/base-hw/src/include/hw/boot_info.h b/repos/base-hw/src/include/hw/boot_info.h index 2b1bf3fb3..df6e05ed0 100644 --- a/repos/base-hw/src/include/hw/boot_info.h +++ b/repos/base-hw/src/include/hw/boot_info.h @@ -14,12 +14,11 @@ #ifndef _SRC__LIB__HW__BOOT_INFO_H_ #define _SRC__LIB__HW__BOOT_INFO_H_ -#include #include -#include -namespace Hw { struct Boot_info; } +namespace Hw { template struct Boot_info; } +template struct Hw::Boot_info { using Mapping_pool = Array; @@ -30,22 +29,19 @@ struct Hw::Boot_info Mapping const boot_modules; Mmio_space const mmio_space; Memory_region_array ram_regions { }; - Acpi_rsdp const acpi_rsdp; - Framebuffer const framebuffer; unsigned const cpus; + PLAT_INFO const plat_info; Boot_info(addr_t const table, addr_t const table_alloc, Mapping_pool const elf_mappings, Mapping const boot_modules, Mmio_space const mmio_space, - Acpi_rsdp const &acpi_rsdp, - Framebuffer const &fb, - unsigned const &cpus) + unsigned const cpus, + PLAT_INFO const &plat_info) : table(table), table_allocator(table_alloc), elf_mappings(elf_mappings), boot_modules(boot_modules), - mmio_space(mmio_space), acpi_rsdp(acpi_rsdp), framebuffer(fb), - cpus(cpus) {} + mmio_space(mmio_space), cpus(cpus), plat_info(plat_info) {} }; #endif /* _SRC__LIB__HW__BOOT_INFO_H_ */ diff --git a/repos/base-hw/src/include/hw/spec/arm/arndale_board.h b/repos/base-hw/src/include/hw/spec/arm/arndale_board.h index 776d25249..14792e701 100644 --- a/repos/base-hw/src/include/hw/spec/arm/arndale_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/arndale_board.h @@ -16,6 +16,7 @@ #include #include +#include #include namespace Hw::Arndale_board { diff --git a/repos/base-hw/src/include/hw/spec/arm/boot_info.h b/repos/base-hw/src/include/hw/spec/arm/boot_info.h new file mode 100644 index 000000000..6d0bb7de7 --- /dev/null +++ b/repos/base-hw/src/include/hw/spec/arm/boot_info.h @@ -0,0 +1,19 @@ +/* + * \brief Boot information for ARM + * \author Stefan Kalkowski + * \date 2019-05-16 + */ + +/* + * Copyright (C) 2019 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _SRC__LIB__HW__SPEC__ARM__BOOT_INFO_H_ +#define _SRC__LIB__HW__SPEC__ARM__BOOT_INFO_H_ + +namespace Board { struct Boot_info {}; } + +#endif /* _SRC__LIB__HW__SPEC__ARM__BOOT_INFO_H_ */ diff --git a/repos/base-hw/src/include/hw/spec/arm/imx53_qsb_board.h b/repos/base-hw/src/include/hw/spec/arm/imx53_qsb_board.h index 3406a9b9b..6d1983d9c 100644 --- a/repos/base-hw/src/include/hw/spec/arm/imx53_qsb_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/imx53_qsb_board.h @@ -16,6 +16,7 @@ #include #include +#include namespace Hw::Imx53_qsb_board { using namespace Imx53_qsb; diff --git a/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h b/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h index fb466b6e8..a45d059c1 100644 --- a/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h @@ -16,6 +16,7 @@ #include #include +#include #include #include diff --git a/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h b/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h index 0be552497..8646c4516 100644 --- a/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h @@ -16,7 +16,7 @@ #include #include - +#include #include namespace Hw::Imx7d_sabre_board { diff --git a/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h b/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h index 0bcf19097..3f20ca707 100644 --- a/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h @@ -16,6 +16,7 @@ #include #include +#include #include #include diff --git a/repos/base-hw/src/include/hw/spec/arm/odroid_xu_board.h b/repos/base-hw/src/include/hw/spec/arm/odroid_xu_board.h index 6018c1013..d731ae7fc 100644 --- a/repos/base-hw/src/include/hw/spec/arm/odroid_xu_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/odroid_xu_board.h @@ -16,7 +16,7 @@ #include #include - +#include #include namespace Hw::Odroid_xu_board { diff --git a/repos/base-hw/src/include/hw/spec/arm/panda_board.h b/repos/base-hw/src/include/hw/spec/arm/panda_board.h index 4dc6070b6..6b293cae4 100644 --- a/repos/base-hw/src/include/hw/spec/arm/panda_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/panda_board.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/repos/base-hw/src/include/hw/spec/arm/pbxa9_board.h b/repos/base-hw/src/include/hw/spec/arm/pbxa9_board.h index e1ec4ad1d..e77ecb274 100644 --- a/repos/base-hw/src/include/hw/spec/arm/pbxa9_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/pbxa9_board.h @@ -16,6 +16,7 @@ #include #include +#include #include #include diff --git a/repos/base-hw/src/include/hw/spec/arm/rpi_board.h b/repos/base-hw/src/include/hw/spec/arm/rpi_board.h index 3a264f06c..384ff648d 100644 --- a/repos/base-hw/src/include/hw/spec/arm/rpi_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/rpi_board.h @@ -16,6 +16,7 @@ #include #include +#include namespace Hw::Rpi_board { using namespace Rpi; diff --git a/repos/base-hw/src/include/hw/spec/arm/usb_armory_board.h b/repos/base-hw/src/include/hw/spec/arm/usb_armory_board.h index 4b046d4ef..5bb4c4348 100644 --- a/repos/base-hw/src/include/hw/spec/arm/usb_armory_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/usb_armory_board.h @@ -16,6 +16,7 @@ #include #include +#include namespace Hw::Usb_armory_board { using namespace Usb_armory; diff --git a/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h b/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h index 53d086881..23d5b681d 100644 --- a/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace Hw::Wand_quad_board { diff --git a/repos/base-hw/src/include/hw/spec/arm/zynq_qemu_board.h b/repos/base-hw/src/include/hw/spec/arm/zynq_qemu_board.h index 43a46cfb8..a3c95a3aa 100644 --- a/repos/base-hw/src/include/hw/spec/arm/zynq_qemu_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/zynq_qemu_board.h @@ -18,6 +18,7 @@ #include #include #include +#include namespace Hw::Zynq_qemu_board { using namespace Zynq_qemu; diff --git a/repos/base-hw/src/include/hw/spec/riscv/board.h b/repos/base-hw/src/include/hw/spec/riscv/board.h index 5212da7ba..4a7faea0b 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/board.h +++ b/repos/base-hw/src/include/hw/spec/riscv/board.h @@ -14,6 +14,7 @@ #ifndef _SRC__INCLUDE__HW__SPEC__RISCV__BOARD_H_ #define _SRC__INCLUDE__HW__SPEC__RISCV__BOARD_H_ +#include #include #include #include diff --git a/repos/base-hw/src/include/hw/spec/riscv/boot_info.h b/repos/base-hw/src/include/hw/spec/riscv/boot_info.h new file mode 100644 index 000000000..6dc23353b --- /dev/null +++ b/repos/base-hw/src/include/hw/spec/riscv/boot_info.h @@ -0,0 +1,19 @@ +/* + * \brief Boot information for RISCV + * \author Stefan Kalkowski + * \date 2019-05-16 + */ + +/* + * Copyright (C) 2019 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _SRC__LIB__HW__SPEC__RISCV__BOOT_INFO_H_ +#define _SRC__LIB__HW__SPEC__RISCV__BOOT_INFO_H_ + +namespace Board { struct Boot_info {}; } + +#endif /* _SRC__LIB__HW__SPEC__RISCV__BOOT_INFO_H_ */ diff --git a/repos/base-hw/src/include/hw/acpi_rsdp.h b/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h similarity index 82% rename from repos/base-hw/src/include/hw/acpi_rsdp.h rename to repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h index 0da13936c..849157cd7 100644 --- a/repos/base-hw/src/include/hw/acpi_rsdp.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h @@ -11,8 +11,8 @@ * under the terms of the GNU Affero General Public License version 3. */ -#ifndef _SRC__LIB__HW__ACPI_RSDP_H -#define _SRC__LIB__HW__ACPI_RSDP_H +#ifndef _SRC__LIB__HW__SPEC__X86_64__ACPI_RSDP_H +#define _SRC__LIB__HW__SPEC__X86_64__ACPI_RSDP_H #include @@ -37,4 +37,4 @@ struct Hw::Acpi_rsdp } } __attribute__((packed)); -#endif /* _SRC__LIB__HW__ACPI_RSDP_H */ +#endif /* _SRC__LIB__HW__SPEC__X86_64__ACPI_RSDP_H */ diff --git a/repos/base-hw/src/include/hw/framebuffer.h b/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h similarity index 79% rename from repos/base-hw/src/include/hw/framebuffer.h rename to repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h index 22e65a48b..6924719d8 100644 --- a/repos/base-hw/src/include/hw/framebuffer.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h @@ -11,8 +11,8 @@ * under the terms of the GNU Affero General Public License version 3. */ -#ifndef _SRC__LIB__HW__FRAMEBUFFER_H -#define _SRC__LIB__HW__FRAMEBUFFER_H +#ifndef _SRC__LIB__HW__SPEC__X86_64__FRAMEBUFFER_H +#define _SRC__LIB__HW__SPEC__X86_64__FRAMEBUFFER_H #include @@ -30,4 +30,4 @@ struct Hw::Framebuffer Genode::uint8_t type; } __attribute__((packed)); -#endif /* _SRC__LIB__HW__FRAMEBUFFER_H */ +#endif /* _SRC__LIB__HW__SPEC__X86_64__FRAMEBUFFER_H */ 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 8eb1b136f..4d171f2e4 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 @@ -15,8 +15,11 @@ #define _SRC__INCLUDE__HW__SPEC__X86_64__PC_BOARD_H_ #include +#include +#include namespace Hw::Pc_board { + struct Boot_info; struct Serial; enum Dummies { UART_BASE, UART_CLOCK }; } @@ -27,4 +30,16 @@ struct Hw::Pc_board::Serial : Genode::X86_uart Serial(Genode::addr_t, Genode::size_t, unsigned); }; + +struct Hw::Pc_board::Boot_info +{ + Acpi_rsdp acpi_rsdp { }; + Framebuffer framebuffer { }; + + Boot_info() {} + Boot_info(Acpi_rsdp const &acpi_rsdp, + Framebuffer const &fb) + : acpi_rsdp(acpi_rsdp), framebuffer(fb) {} +}; + #endif /* _SRC__BOOTSTRAP__SPEC__X86_64__BOARD_H_ */