diff --git a/repos/base-hw/include/drivers/defs/imx53_trustzone.h b/repos/base-hw/include/drivers/defs/imx53_trustzone.h index 8a65fea024..a3531048c9 100644 --- a/repos/base-hw/include/drivers/defs/imx53_trustzone.h +++ b/repos/base-hw/include/drivers/defs/imx53_trustzone.h @@ -17,8 +17,8 @@ /* Genode includes */ #include -namespace Trustzone -{ +namespace Trustzone { + enum { /** * Currently, we limit secure RAM to 256 MB only, diff --git a/repos/base-hw/include/hw_native_pd/hw_native_pd.h b/repos/base-hw/include/hw_native_pd/hw_native_pd.h index 922504ab9b..884344cd19 100644 --- a/repos/base-hw/include/hw_native_pd/hw_native_pd.h +++ b/repos/base-hw/include/hw_native_pd/hw_native_pd.h @@ -17,6 +17,7 @@ #include #include + struct Genode::Pd_session::Native_pd : Interface { virtual void upgrade_cap_slab() = 0; diff --git a/repos/base-hw/include/kernel/interface.h b/repos/base-hw/include/kernel/interface.h index b7c12a9607..17abb6020c 100644 --- a/repos/base-hw/include/kernel/interface.h +++ b/repos/base-hw/include/kernel/interface.h @@ -18,8 +18,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + /** * Kernel names of the kernel calls */ diff --git a/repos/base-hw/include/kernel/types.h b/repos/base-hw/include/kernel/types.h index a07a052c90..ef28b7da3e 100644 --- a/repos/base-hw/include/kernel/types.h +++ b/repos/base-hw/include/kernel/types.h @@ -18,8 +18,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + using addr_t = Genode::addr_t; using size_t = Genode::size_t; using capid_t = Genode::uint16_t; diff --git a/repos/base-hw/include/spec/arm/cpu/vm_state_trustzone.h b/repos/base-hw/include/spec/arm/cpu/vm_state_trustzone.h index 14aec20c7b..e9c0bee6d5 100644 --- a/repos/base-hw/include/spec/arm/cpu/vm_state_trustzone.h +++ b/repos/base-hw/include/spec/arm/cpu/vm_state_trustzone.h @@ -18,14 +18,15 @@ /* Genode includes */ #include -namespace Genode -{ +namespace Genode { + /** * CPU context of a virtual machine */ struct Vm_state; } + struct Genode::Vm_state : Genode::Cpu_state_modes { Genode::addr_t dfar; diff --git a/repos/base-hw/include/spec/arm/cpu/vm_state_virtualization.h b/repos/base-hw/include/spec/arm/cpu/vm_state_virtualization.h index ed49e04645..66ddee7341 100644 --- a/repos/base-hw/include/spec/arm/cpu/vm_state_virtualization.h +++ b/repos/base-hw/include/spec/arm/cpu/vm_state_virtualization.h @@ -17,14 +17,15 @@ /* Genode includes */ #include -namespace Genode -{ +namespace Genode { + /** * CPU context of a virtual machine */ struct Vm_state; } + struct Genode::Vm_state : Genode::Cpu_state_modes { Genode::uint64_t vttbr { 0 }; @@ -61,7 +62,8 @@ struct Genode::Vm_state : Genode::Cpu_state_modes /** * Timer related registers */ - struct Timer { + struct Timer + { Genode::uint64_t offset { 0 }; Genode::uint64_t compare { 0 }; Genode::uint32_t control { 0 }; diff --git a/repos/base-hw/include/spec/arm/kernel/interface_support.h b/repos/base-hw/include/spec/arm/kernel/interface_support.h index 3ffca0f4cb..f0cfa20c40 100644 --- a/repos/base-hw/include/spec/arm/kernel/interface_support.h +++ b/repos/base-hw/include/spec/arm/kernel/interface_support.h @@ -17,8 +17,7 @@ /* Genode includes */ #include -namespace Kernel -{ +namespace Kernel { typedef Genode::uint32_t Call_arg; typedef Genode::uint32_t Call_ret; typedef Genode::uint64_t Call_ret_64; diff --git a/repos/base-hw/include/spec/arm_64/cpu/vm_state_virtualization.h b/repos/base-hw/include/spec/arm_64/cpu/vm_state_virtualization.h index ef0a8ac143..a0f18e5722 100644 --- a/repos/base-hw/include/spec/arm_64/cpu/vm_state_virtualization.h +++ b/repos/base-hw/include/spec/arm_64/cpu/vm_state_virtualization.h @@ -17,8 +17,8 @@ /* Genode includes */ #include -namespace Genode -{ +namespace Genode { + /** * CPU context of a virtual machine */ @@ -27,6 +27,7 @@ namespace Genode using uint128_t = __uint128_t; } + struct Genode::Vm_state : Genode::Cpu_state { Genode::uint64_t pstate { 0 }; diff --git a/repos/base-hw/include/spec/arm_64/kernel/interface_support.h b/repos/base-hw/include/spec/arm_64/kernel/interface_support.h index 16e4fafeef..5326ad2e83 100644 --- a/repos/base-hw/include/spec/arm_64/kernel/interface_support.h +++ b/repos/base-hw/include/spec/arm_64/kernel/interface_support.h @@ -17,8 +17,7 @@ /* Genode includes */ #include -namespace Kernel -{ +namespace Kernel { typedef Genode::uint64_t Call_arg; typedef Genode::uint64_t Call_ret; typedef Genode::uint64_t Call_ret_64; diff --git a/repos/base-hw/include/spec/riscv/cpu/cpu_state.h b/repos/base-hw/include/spec/riscv/cpu/cpu_state.h index 76d1cab6df..03bc4df156 100644 --- a/repos/base-hw/include/spec/riscv/cpu/cpu_state.h +++ b/repos/base-hw/include/spec/riscv/cpu/cpu_state.h @@ -19,6 +19,7 @@ namespace Genode { struct Cpu_state; } + struct Genode::Cpu_state { enum Cpu_exception { diff --git a/repos/base-hw/include/spec/riscv/kernel/interface_support.h b/repos/base-hw/include/spec/riscv/kernel/interface_support.h index 0fe140d76b..8c1ad36336 100644 --- a/repos/base-hw/include/spec/riscv/kernel/interface_support.h +++ b/repos/base-hw/include/spec/riscv/kernel/interface_support.h @@ -17,8 +17,7 @@ /* Genode includes */ #include -namespace Kernel -{ +namespace Kernel { typedef Genode::uint64_t Call_arg; typedef Genode::uint64_t Call_ret; typedef Genode::uint64_t Call_ret_64; diff --git a/repos/base-hw/include/spec/x86_64/kernel/interface_support.h b/repos/base-hw/include/spec/x86_64/kernel/interface_support.h index a8a2a48355..d3bff559cc 100644 --- a/repos/base-hw/include/spec/x86_64/kernel/interface_support.h +++ b/repos/base-hw/include/spec/x86_64/kernel/interface_support.h @@ -17,8 +17,7 @@ /* Genode includes */ #include -namespace Kernel -{ +namespace Kernel { typedef Genode::uint64_t Call_arg; typedef Genode::uint64_t Call_ret; typedef Genode::uint64_t Call_ret_64; diff --git a/repos/base-hw/src/bootstrap/board/imx53_qsb/board.h b/repos/base-hw/src/bootstrap/board/imx53_qsb/board.h index 4633e6167e..e65079f3af 100644 --- a/repos/base-hw/src/bootstrap/board/imx53_qsb/board.h +++ b/repos/base-hw/src/bootstrap/board/imx53_qsb/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Imx53_qsb_board; using Hw::Pic; diff --git a/repos/base-hw/src/bootstrap/board/imx53_qsb/platform.cc b/repos/base-hw/src/bootstrap/board/imx53_qsb/platform.cc index 0390d312be..bb684bba63 100644 --- a/repos/base-hw/src/bootstrap/board/imx53_qsb/platform.cc +++ b/repos/base-hw/src/bootstrap/board/imx53_qsb/platform.cc @@ -20,11 +20,12 @@ bool Board::secure_irq(unsigned) { return true; } Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM0_BASE, RAM0_SIZE }, - Memory_region { RAM1_BASE, RAM1_SIZE }), - core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, - Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, - Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }) +: + early_ram_regions(Memory_region { RAM0_BASE, RAM0_SIZE }, + Memory_region { RAM1_BASE, RAM1_SIZE }), + core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, + Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, + Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }) { Aipstz aipstz_1(AIPS_1_MMIO_BASE); Aipstz aipstz_2(AIPS_2_MMIO_BASE); diff --git a/repos/base-hw/src/bootstrap/board/imx53_qsb/platform_trustzone.cc b/repos/base-hw/src/bootstrap/board/imx53_qsb/platform_trustzone.cc index cbb5326750..912a06bc12 100644 --- a/repos/base-hw/src/bootstrap/board/imx53_qsb/platform_trustzone.cc +++ b/repos/base-hw/src/bootstrap/board/imx53_qsb/platform_trustzone.cc @@ -18,6 +18,7 @@ using namespace Board; + bool Board::secure_irq(unsigned i) { if (i == EPIT_1_IRQ) return true; @@ -33,12 +34,13 @@ bool Board::secure_irq(unsigned i) Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE, - Trustzone::SECURE_RAM_SIZE }), - core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, - Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, - Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, - Memory_region { CSU_BASE, CSU_SIZE }) +: + early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE, + Trustzone::SECURE_RAM_SIZE }), + core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, + Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, + Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, + Memory_region { CSU_BASE, CSU_SIZE }) { Aipstz aipstz_1(AIPS_1_MMIO_BASE); Aipstz aipstz_2(AIPS_2_MMIO_BASE); diff --git a/repos/base-hw/src/bootstrap/board/imx6q_sabrelite/board.h b/repos/base-hw/src/bootstrap/board/imx6q_sabrelite/board.h index 42dac5740c..995b75149a 100644 --- a/repos/base-hw/src/bootstrap/board/imx6q_sabrelite/board.h +++ b/repos/base-hw/src/bootstrap/board/imx6q_sabrelite/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Imx6q_sabrelite_board; using Pic = Hw::Gicv2; struct L2_cache; @@ -170,6 +171,7 @@ namespace Board { }; } + struct Board::L2_cache : Hw::Pl310 { L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio) diff --git a/repos/base-hw/src/bootstrap/board/imx7d_sabre/board.h b/repos/base-hw/src/bootstrap/board/imx7d_sabre/board.h index 86204a6eaa..b4c8446e8b 100644 --- a/repos/base-hw/src/bootstrap/board/imx7d_sabre/board.h +++ b/repos/base-hw/src/bootstrap/board/imx7d_sabre/board.h @@ -20,6 +20,7 @@ #include namespace Board { + using namespace Hw::Imx7d_sabre_board; using Pic = Hw::Gicv2; static constexpr bool NON_SECURE = true; diff --git a/repos/base-hw/src/bootstrap/board/imx7d_sabre/platform.cc b/repos/base-hw/src/bootstrap/board/imx7d_sabre/platform.cc index f3b4b6e048..17e4a1ad5f 100644 --- a/repos/base-hw/src/bootstrap/board/imx7d_sabre/platform.cc +++ b/repos/base-hw/src/bootstrap/board/imx7d_sabre/platform.cc @@ -20,10 +20,12 @@ extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */ using namespace Board; + Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }), - core_mmio(Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, - Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }) +: + early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }), + core_mmio(Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, + Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }) { Aipstz aipstz_1(AIPS_1_MMIO_BASE); Aipstz aipstz_2(AIPS_2_MMIO_BASE); diff --git a/repos/base-hw/src/bootstrap/board/imx8q_evk/board.h b/repos/base-hw/src/bootstrap/board/imx8q_evk/board.h index 0f2cbec441..4dc5f6de44 100644 --- a/repos/base-hw/src/bootstrap/board/imx8q_evk/board.h +++ b/repos/base-hw/src/bootstrap/board/imx8q_evk/board.h @@ -20,6 +20,7 @@ #include namespace Board { + using namespace Hw::Imx8q_evk_board; struct Cpu : Hw::Arm_64_cpu diff --git a/repos/base-hw/src/bootstrap/board/imx8q_evk/platform.cc b/repos/base-hw/src/bootstrap/board/imx8q_evk/platform.cc index 0e41a386d9..7823ac7ac0 100644 --- a/repos/base-hw/src/bootstrap/board/imx8q_evk/platform.cc +++ b/repos/base-hw/src/bootstrap/board/imx8q_evk/platform.cc @@ -19,13 +19,14 @@ * some code does not feel happy with addresses being zero */ Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }), - late_ram_regions(Memory_region { }), - core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, - Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, - ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, - Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE, - ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE }) +: + early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }), + late_ram_regions(Memory_region { }), + core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, + Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, + ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, + Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE, + ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE }) { ::Board::Pic pic {}; diff --git a/repos/base-hw/src/bootstrap/board/nit6_solox/board.h b/repos/base-hw/src/bootstrap/board/nit6_solox/board.h index eccb76fc5e..b6df2e5c1d 100644 --- a/repos/base-hw/src/bootstrap/board/nit6_solox/board.h +++ b/repos/base-hw/src/bootstrap/board/nit6_solox/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Nit6_solox_board; using Pic = Hw::Gicv2; struct L2_cache; @@ -231,6 +232,7 @@ namespace Board { }; } + struct Board::L2_cache : Hw::Pl310 { L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio) diff --git a/repos/base-hw/src/bootstrap/board/pbxa9/board.h b/repos/base-hw/src/bootstrap/board/pbxa9/board.h index fc541a9828..e01da0fcdc 100644 --- a/repos/base-hw/src/bootstrap/board/pbxa9/board.h +++ b/repos/base-hw/src/bootstrap/board/pbxa9/board.h @@ -22,6 +22,7 @@ #include namespace Board { + using namespace Hw::Pbxa9_board; using Pic = Hw::Gicv2; diff --git a/repos/base-hw/src/bootstrap/board/pbxa9/platform.cc b/repos/base-hw/src/bootstrap/board/pbxa9/platform.cc index 91e47d614a..8746729b57 100644 --- a/repos/base-hw/src/bootstrap/board/pbxa9/platform.cc +++ b/repos/base-hw/src/bootstrap/board/pbxa9/platform.cc @@ -17,14 +17,16 @@ using namespace Board; Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }, - Memory_region { RAM_1_BASE, RAM_1_SIZE }), - core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, - CORTEX_A9_PRIVATE_MEM_SIZE }, - Memory_region { PL011_0_MMIO_BASE, - PL011_0_MMIO_SIZE }, - Memory_region { PL310_MMIO_BASE, - PL310_MMIO_SIZE }) { } +: + early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE }, + Memory_region { RAM_1_BASE, RAM_1_SIZE }), + core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, + CORTEX_A9_PRIVATE_MEM_SIZE }, + Memory_region { PL011_0_MMIO_BASE, + PL011_0_MMIO_SIZE }, + Memory_region { PL310_MMIO_BASE, + PL310_MMIO_SIZE }) +{ } bool Board::Cpu::errata(Board::Cpu::Errata) { return false; } diff --git a/repos/base-hw/src/bootstrap/board/rpi/board.h b/repos/base-hw/src/bootstrap/board/rpi/board.h index 002147d4b4..cc3000b8fb 100644 --- a/repos/base-hw/src/bootstrap/board/rpi/board.h +++ b/repos/base-hw/src/bootstrap/board/rpi/board.h @@ -21,8 +21,7 @@ namespace Board { using namespace Hw::Rpi_board; } -constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { - return 0; } +constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 0; } constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; } diff --git a/repos/base-hw/src/bootstrap/board/rpi/platform.cc b/repos/base-hw/src/bootstrap/board/rpi/platform.cc index d42b724b2c..3060a1a8b4 100644 --- a/repos/base-hw/src/bootstrap/board/rpi/platform.cc +++ b/repos/base-hw/src/bootstrap/board/rpi/platform.cc @@ -17,22 +17,25 @@ using namespace Rpi; + /** * Leave out the first page (being 0x0) from bootstraps RAM allocator, * some code does not feel happy with addresses being zero */ Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_0_BASE + 0x1000, - RAM_0_SIZE - 0x1000 }), - late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }), - core_mmio(Memory_region { PL011_0_MMIO_BASE, - PL011_0_MMIO_SIZE }, - Memory_region { SYSTEM_TIMER_MMIO_BASE, - SYSTEM_TIMER_MMIO_SIZE }, - Memory_region { IRQ_CONTROLLER_BASE, - IRQ_CONTROLLER_SIZE }, - Memory_region { USB_DWC_OTG_BASE, - USB_DWC_OTG_SIZE }) {} +: + early_ram_regions(Memory_region { RAM_0_BASE + 0x1000, + RAM_0_SIZE - 0x1000 }), + late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }), + core_mmio(Memory_region { PL011_0_MMIO_BASE, + PL011_0_MMIO_SIZE }, + Memory_region { SYSTEM_TIMER_MMIO_BASE, + SYSTEM_TIMER_MMIO_SIZE }, + Memory_region { IRQ_CONTROLLER_BASE, + IRQ_CONTROLLER_SIZE }, + Memory_region { USB_DWC_OTG_BASE, + USB_DWC_OTG_SIZE }) +{ } unsigned Bootstrap::Platform::enable_mmu() @@ -43,7 +46,8 @@ unsigned Bootstrap::Platform::enable_mmu() Cpu::Cpsr::init(); - struct Ctr : Cpu::Ctr { + struct Ctr : Cpu::Ctr + { struct P : Bitfield<23, 1> { }; /* page mapping restriction on */ }; diff --git a/repos/base-hw/src/bootstrap/board/rpi3/board.h b/repos/base-hw/src/bootstrap/board/rpi3/board.h index f6f3e1a943..8d272d7ac5 100644 --- a/repos/base-hw/src/bootstrap/board/rpi3/board.h +++ b/repos/base-hw/src/bootstrap/board/rpi3/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using namespace Hw::Rpi3_board; struct Cpu : Hw::Arm_64_cpu diff --git a/repos/base-hw/src/bootstrap/board/rpi3/platform.cc b/repos/base-hw/src/bootstrap/board/rpi3/platform.cc index bb6cfd3cf8..5b34d91e72 100644 --- a/repos/base-hw/src/bootstrap/board/rpi3/platform.cc +++ b/repos/base-hw/src/bootstrap/board/rpi3/platform.cc @@ -18,18 +18,21 @@ * some code does not feel happy with addresses being zero */ Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { ::Board::RAM_BASE + 0x1000, - ::Board::RAM_SIZE - 0x1000 }), - late_ram_regions(Memory_region { ::Board::RAM_BASE, 0x1000 }), - core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, - Memory_region { ::Board::LOCAL_IRQ_CONTROLLER_BASE, - ::Board::LOCAL_IRQ_CONTROLLER_SIZE }, - Memory_region { ::Board::IRQ_CONTROLLER_BASE, - ::Board::IRQ_CONTROLLER_SIZE }) {} +: + early_ram_regions(Memory_region { ::Board::RAM_BASE + 0x1000, + ::Board::RAM_SIZE - 0x1000 }), + late_ram_regions(Memory_region { ::Board::RAM_BASE, 0x1000 }), + core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, + Memory_region { ::Board::LOCAL_IRQ_CONTROLLER_BASE, + ::Board::LOCAL_IRQ_CONTROLLER_SIZE }, + Memory_region { ::Board::IRQ_CONTROLLER_BASE, + ::Board::IRQ_CONTROLLER_SIZE }) +{ } extern unsigned int _crt0_qemu_start_secondary_cpus; + void Board::Cpu::wake_up_all_cpus(void * ip) { /* start when in qemu */ diff --git a/repos/base-hw/src/bootstrap/board/usb_armory/board.h b/repos/base-hw/src/bootstrap/board/usb_armory/board.h index 30eb816e72..17540a22bb 100644 --- a/repos/base-hw/src/bootstrap/board/usb_armory/board.h +++ b/repos/base-hw/src/bootstrap/board/usb_armory/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Usb_armory_board; using Hw::Pic; diff --git a/repos/base-hw/src/bootstrap/board/usb_armory/platform.cc b/repos/base-hw/src/bootstrap/board/usb_armory/platform.cc index 2de5cc9f2a..e055ae8f59 100644 --- a/repos/base-hw/src/bootstrap/board/usb_armory/platform.cc +++ b/repos/base-hw/src/bootstrap/board/usb_armory/platform.cc @@ -18,6 +18,7 @@ using namespace Board; + bool Board::secure_irq(unsigned i) { if (i == EPIT_1_IRQ) return true; @@ -28,12 +29,13 @@ bool Board::secure_irq(unsigned i) Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE, - Trustzone::SECURE_RAM_SIZE }), - core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, - Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, - Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, - Memory_region { CSU_BASE, CSU_SIZE }) +: + early_ram_regions(Memory_region { Trustzone::SECURE_RAM_BASE, + Trustzone::SECURE_RAM_SIZE }), + core_mmio(Memory_region { UART_1_MMIO_BASE, UART_1_MMIO_SIZE }, + Memory_region { EPIT_1_MMIO_BASE, EPIT_1_MMIO_SIZE }, + Memory_region { IRQ_CONTROLLER_BASE, IRQ_CONTROLLER_SIZE }, + Memory_region { CSU_BASE, CSU_SIZE }) { Aipstz aipstz_1(AIPS_1_MMIO_BASE); Aipstz aipstz_2(AIPS_2_MMIO_BASE); diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu/board.h b/repos/base-hw/src/bootstrap/board/virt_qemu/board.h index d78d0dc576..4956b88bfc 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu/board.h +++ b/repos/base-hw/src/bootstrap/board/virt_qemu/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Virt_qemu_board; using Psci = Hw::Psci; diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu/platform.cc b/repos/base-hw/src/bootstrap/board/virt_qemu/platform.cc index d99e2a2fcc..cf8e55cc2f 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu/platform.cc +++ b/repos/base-hw/src/bootstrap/board/virt_qemu/platform.cc @@ -18,16 +18,19 @@ extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */ using namespace Board; + Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }), - late_ram_regions(Memory_region { }), - core_mmio(Memory_region { UART_BASE, UART_SIZE }, - Memory_region { Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, - Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, - Memory_region { Cpu_mmio::IRQ_CONTROLLER_CPU_BASE, - Cpu_mmio::IRQ_CONTROLLER_CPU_SIZE }, - Memory_region { Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE, - Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_SIZE }) {} +: + early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }), + late_ram_regions(Memory_region { }), + core_mmio(Memory_region { UART_BASE, UART_SIZE }, + Memory_region { Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, + Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, + Memory_region { Cpu_mmio::IRQ_CONTROLLER_CPU_BASE, + Cpu_mmio::IRQ_CONTROLLER_CPU_SIZE }, + Memory_region { Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE, + Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_SIZE }) +{ } static inline void switch_to_supervisor_mode(unsigned cpu_id) diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu_64/board.h b/repos/base-hw/src/bootstrap/board/virt_qemu_64/board.h index 78f130316c..62a197fb70 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu_64/board.h +++ b/repos/base-hw/src/bootstrap/board/virt_qemu_64/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Virt_qemu_board; using Psci = Hw::Psci; diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu_64/platform.cc b/repos/base-hw/src/bootstrap/board/virt_qemu_64/platform.cc index f5e2573dec..b321bfde51 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu_64/platform.cc +++ b/repos/base-hw/src/bootstrap/board/virt_qemu_64/platform.cc @@ -13,14 +13,16 @@ #include + Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }), - late_ram_regions(Memory_region { }), - core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, - Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, - ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, - Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE, - ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE }) +: + early_ram_regions(Memory_region { ::Board::RAM_BASE, ::Board::RAM_SIZE }), + late_ram_regions(Memory_region { }), + core_mmio(Memory_region { ::Board::UART_BASE, ::Board::UART_SIZE }, + Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE, + ::Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_SIZE }, + Memory_region { ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE, + ::Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE }) { ::Board::Pic pic {}; } diff --git a/repos/base-hw/src/bootstrap/board/wand_quad/board.h b/repos/base-hw/src/bootstrap/board/wand_quad/board.h index 226e9f32d1..c52d24e810 100644 --- a/repos/base-hw/src/bootstrap/board/wand_quad/board.h +++ b/repos/base-hw/src/bootstrap/board/wand_quad/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Wand_quad_board; using Pic = Hw::Gicv2; @@ -206,6 +207,7 @@ namespace Board { }; } + struct Board::L2_cache : Hw::Pl310 { L2_cache(Genode::addr_t mmio) : Hw::Pl310(mmio) diff --git a/repos/base-hw/src/bootstrap/board/zynq_qemu/board.h b/repos/base-hw/src/bootstrap/board/zynq_qemu/board.h index 8b9920be62..f379ac192f 100644 --- a/repos/base-hw/src/bootstrap/board/zynq_qemu/board.h +++ b/repos/base-hw/src/bootstrap/board/zynq_qemu/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Zynq_qemu_board; using Pic = Hw::Gicv2; static constexpr bool NON_SECURE = false; diff --git a/repos/base-hw/src/bootstrap/board/zynq_qemu/platform.cc b/repos/base-hw/src/bootstrap/board/zynq_qemu/platform.cc index a9fb7ed065..d420e61111 100644 --- a/repos/base-hw/src/bootstrap/board/zynq_qemu/platform.cc +++ b/repos/base-hw/src/bootstrap/board/zynq_qemu/platform.cc @@ -17,22 +17,26 @@ using namespace Board; + Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_0_BASE + 0x1000, - RAM_0_SIZE - 0x1000 }), - late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }), - core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, - CORTEX_A9_PRIVATE_MEM_SIZE }, - Memory_region { UART_BASE, - UART_SIZE }, - Memory_region { PL310_MMIO_BASE, - PL310_MMIO_SIZE }) { } +: + early_ram_regions(Memory_region { RAM_0_BASE + 0x1000, + RAM_0_SIZE - 0x1000 }), + late_ram_regions(Memory_region { RAM_0_BASE, 0x1000 }), + core_mmio(Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, + CORTEX_A9_PRIVATE_MEM_SIZE }, + Memory_region { UART_BASE, + UART_SIZE }, + Memory_region { PL310_MMIO_BASE, + PL310_MMIO_SIZE }) +{ } -bool Cpu::errata(Board::Cpu::Errata) { - return false; } +bool Cpu::errata(Board::Cpu::Errata) { return false; } -void Cpu::wake_up_all_cpus(void* ip) { + +void Cpu::wake_up_all_cpus(void* ip) +{ struct Wakeup_generator : Genode::Mmio { struct Core1_boot_addr : Register<0x0, 32> { }; diff --git a/repos/base-hw/src/bootstrap/init.cc b/repos/base-hw/src/bootstrap/init.cc index b9b2479730..0cc92720fb 100644 --- a/repos/base-hw/src/bootstrap/init.cc +++ b/repos/base-hw/src/bootstrap/init.cc @@ -18,11 +18,14 @@ #include #include + Bootstrap::Platform & Bootstrap::platform() { return *unmanaged_singleton(); } + extern "C" void init() __attribute__ ((noreturn)); + extern "C" void init() { Bootstrap::Platform & p = Bootstrap::platform(); diff --git a/repos/base-hw/src/bootstrap/lock.cc b/repos/base-hw/src/bootstrap/lock.cc index 763e6e8df3..7683a037f2 100644 --- a/repos/base-hw/src/bootstrap/lock.cc +++ b/repos/base-hw/src/bootstrap/lock.cc @@ -32,11 +32,13 @@ void Genode::Lock::lock() _state = LOCKED; } + void Genode::Mutex::acquire() { _lock.lock(); } + void Genode::Mutex::release() { _lock.unlock(); diff --git a/repos/base-hw/src/bootstrap/log.cc b/repos/base-hw/src/bootstrap/log.cc index 6183b08c5c..fedee7e2cd 100644 --- a/repos/base-hw/src/bootstrap/log.cc +++ b/repos/base-hw/src/bootstrap/log.cc @@ -55,8 +55,7 @@ struct Buffer }; -Genode::Log &Genode::Log::log() { - return unmanaged_singleton()->log; } +Genode::Log &Genode::Log::log() { return unmanaged_singleton()->log; } void Genode::raw_write_string(char const *str) { log(str); } diff --git a/repos/base-hw/src/bootstrap/platform.cc b/repos/base-hw/src/bootstrap/platform.cc index 86584d1f21..1b337f764b 100644 --- a/repos/base-hw/src/bootstrap/platform.cc +++ b/repos/base-hw/src/bootstrap/platform.cc @@ -19,8 +19,10 @@ using namespace Bootstrap; + extern unsigned _bss_end; + /***************************** ** Platform::Ram_allocator ** *****************************/ @@ -57,10 +59,11 @@ void Platform::Ram_allocator::remove(Memory_region const & region) { ******************/ Platform::Pd::Pd(Platform::Ram_allocator & alloc) -: table_base(alloc.alloc_aligned(sizeof(Table), Table::ALIGNM_LOG2)), - array_base(alloc.alloc_aligned(sizeof(Table_array), Table::ALIGNM_LOG2)), - table(*Genode::construct_at(table_base)), - array(*Genode::construct_at(array_base)) +: + table_base(alloc.alloc_aligned(sizeof(Table), Table::ALIGNM_LOG2)), + array_base(alloc.alloc_aligned(sizeof(Table_array), Table::ALIGNM_LOG2)), + table(*Genode::construct_at
(table_base)), + array(*Genode::construct_at(array_base)) { using namespace Genode; addr_t const table_virt_base = Hw::Mm::core_page_tables().base; @@ -156,15 +159,18 @@ void Platform::start_core(unsigned cpu_id) } -static constexpr Genode::Boot_modules_header & header() { - return *((Genode::Boot_modules_header*) &_boot_modules_headers_begin); } +static constexpr Genode::Boot_modules_header & header() +{ + return *((Genode::Boot_modules_header*) &_boot_modules_headers_begin); +} Platform::Platform() -: bootstrap_region((addr_t)&_prog_img_beg, - ((addr_t)&_prog_img_end - (addr_t)&_prog_img_beg)), - core_elf_addr(header().base), - core_elf(core_elf_addr) +: + bootstrap_region((addr_t)&_prog_img_beg, + ((addr_t)&_prog_img_end - (addr_t)&_prog_img_beg)), + core_elf_addr(header().base), + core_elf(core_elf_addr) { using namespace Genode; diff --git a/repos/base-hw/src/bootstrap/platform.h b/repos/base-hw/src/bootstrap/platform.h index 336442bf47..f6992fb09b 100644 --- a/repos/base-hw/src/bootstrap/platform.h +++ b/repos/base-hw/src/bootstrap/platform.h @@ -36,6 +36,7 @@ namespace Bootstrap { extern Platform & platform(); } + class Bootstrap::Platform { private: @@ -66,8 +67,10 @@ class Bootstrap::Platform public: Ram_allocator() - : Genode::Allocator_avl_base(&_slab, sizeof(Base::Block)), - _slab(this, (Block *)&_first_slab) {} + : + Genode::Allocator_avl_base(&_slab, sizeof(Base::Block)), + _slab(this, (Block *)&_first_slab) + { } void * alloc_aligned(size_t size, unsigned align); bool alloc(size_t size, void **out_addr) override; diff --git a/repos/base-hw/src/bootstrap/spec/arm/arm_v6_cpu.cc b/repos/base-hw/src/bootstrap/spec/arm/arm_v6_cpu.cc index 4f78ff8317..834999bf8a 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/arm_v6_cpu.cc +++ b/repos/base-hw/src/bootstrap/spec/arm/arm_v6_cpu.cc @@ -15,6 +15,7 @@ #include + void Board::Cpu::invalidate_data_cache() { asm volatile ("mcr p15, 0, %[rd], c7, c6, 0" :: [rd]"r"(0) : ); } diff --git a/repos/base-hw/src/bootstrap/spec/arm/cortex_a8_page_table.h b/repos/base-hw/src/bootstrap/spec/arm/cortex_a8_page_table.h index 2b9faf99e1..5c792864dd 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/cortex_a8_page_table.h +++ b/repos/base-hw/src/bootstrap/spec/arm/cortex_a8_page_table.h @@ -16,11 +16,14 @@ #include + constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 2; } + constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; } + void Hw::Page_table::_table_changed(unsigned long, unsigned long) { } #endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A8_PAGE_TABLE_H_ */ diff --git a/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_actlr.h b/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_actlr.h index c1d98353dd..8e2751a118 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_actlr.h +++ b/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_actlr.h @@ -18,6 +18,7 @@ namespace Bootstrap { struct Actlr; } + struct Bootstrap::Actlr : Board::Cpu::Actlr { struct Fw : Bitfield<0, 1> { }; diff --git a/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_page_table.h b/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_page_table.h index 78ae9461e2..d142158a14 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_page_table.h +++ b/repos/base-hw/src/bootstrap/spec/arm/cortex_a9_page_table.h @@ -16,11 +16,14 @@ #include + constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 2; } + constexpr bool Hw::Page_table::Descriptor_base::_smp() { return true; } + void Hw::Page_table::_table_changed(unsigned long, unsigned long) { } #endif /* _SRC__BOOTSTRAP__SPEC__ARM__CORTEX_A9_PAGE_TABLE_H_ */ diff --git a/repos/base-hw/src/bootstrap/spec/arm/cpu.h b/repos/base-hw/src/bootstrap/spec/arm/cpu.h index 25aeb6bc23..90171cac9e 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/cpu.h +++ b/repos/base-hw/src/bootstrap/spec/arm/cpu.h @@ -18,6 +18,7 @@ namespace Board { struct Cpu; } + struct Board::Cpu : Hw::Arm_cpu { struct Sctlr : Hw::Arm_cpu::Sctlr diff --git a/repos/base-hw/src/bootstrap/spec/arm/gicv2.cc b/repos/base-hw/src/bootstrap/spec/arm/gicv2.cc index f3f483a48e..d2c78ed9c0 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/gicv2.cc +++ b/repos/base-hw/src/bootstrap/spec/arm/gicv2.cc @@ -14,10 +14,11 @@ #include Hw::Gicv2::Gicv2() -: _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE), - _cpui (Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE), - _last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)), - _max_irq(_distr.max_irq()) +: + _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE), + _cpui (Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE), + _last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)), + _max_irq(_distr.max_irq()) { static bool distributor_initialized = false; bool use_group_1 = Board::NON_SECURE && diff --git a/repos/base-hw/src/bootstrap/spec/arm/gicv3.cc b/repos/base-hw/src/bootstrap/spec/arm/gicv3.cc index afe8f0e87a..36d5c55a38 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/gicv3.cc +++ b/repos/base-hw/src/bootstrap/spec/arm/gicv3.cc @@ -14,11 +14,12 @@ #include Hw::Pic::Pic() -: _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE), - _redistr(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE), - _redistr_sgi(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE + - Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE / 2), - _max_irq(_distr.max_irq()) +: + _distr(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE), + _redistr(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE), + _redistr_sgi(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE + + Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_SIZE / 2), + _max_irq(_distr.max_irq()) { /* disable device */ _distr.write(0); diff --git a/repos/base-hw/src/bootstrap/spec/arm/imx6_platform.cc b/repos/base-hw/src/bootstrap/spec/arm/imx6_platform.cc index 91dd8cf20b..b77e33f5d9 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/imx6_platform.cc +++ b/repos/base-hw/src/bootstrap/spec/arm/imx6_platform.cc @@ -19,13 +19,14 @@ using namespace Board; Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }), - core_mmio(Memory_region { UART_BASE, - UART_SIZE }, - Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, - CORTEX_A9_PRIVATE_MEM_SIZE }, - Memory_region { PL310_MMIO_BASE, - PL310_MMIO_SIZE }) +: + early_ram_regions(Memory_region { RAM_BASE, RAM_SIZE }), + core_mmio(Memory_region { UART_BASE, + UART_SIZE }, + Memory_region { CORTEX_A9_PRIVATE_MEM_BASE, + CORTEX_A9_PRIVATE_MEM_SIZE }, + Memory_region { PL310_MMIO_BASE, + PL310_MMIO_SIZE }) { Aipstz aipstz_1(AIPS_1_MMIO_BASE); Aipstz aipstz_2(AIPS_2_MMIO_BASE); diff --git a/repos/base-hw/src/bootstrap/spec/arm/imx_aipstz.h b/repos/base-hw/src/bootstrap/spec/arm/imx_aipstz.h index 8eccfc4c45..5d6906561c 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/imx_aipstz.h +++ b/repos/base-hw/src/bootstrap/spec/arm/imx_aipstz.h @@ -17,8 +17,8 @@ #include -namespace Bootstrap -{ +namespace Bootstrap { + /** * AHB to IP Bridge * @@ -28,6 +28,7 @@ namespace Bootstrap class Aipstz; } + class Bootstrap::Aipstz : public Genode::Mmio { private: diff --git a/repos/base-hw/src/bootstrap/spec/arm/imx_csu.h b/repos/base-hw/src/bootstrap/spec/arm/imx_csu.h index 8acd28dff5..51793ce9af 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/imx_csu.h +++ b/repos/base-hw/src/bootstrap/spec/arm/imx_csu.h @@ -19,6 +19,7 @@ namespace Bootstrap { struct Csu; } + struct Bootstrap::Csu : Genode::Mmio { template @@ -33,6 +34,7 @@ struct Bootstrap::Csu : Genode::Mmio struct Slave_b : Register::template Bitfield<16, 9> { }; }; + struct Master : public Register<0x218, 32> { enum { diff --git a/repos/base-hw/src/bootstrap/spec/arm/imx_tzic.cc b/repos/base-hw/src/bootstrap/spec/arm/imx_tzic.cc index 019acc3f62..b9b4e78b1d 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/imx_tzic.cc +++ b/repos/base-hw/src/bootstrap/spec/arm/imx_tzic.cc @@ -13,7 +13,9 @@ #include -Hw::Pic::Pic() : Genode::Mmio(Board::IRQ_CONTROLLER_BASE) +Hw::Pic::Pic() +: + Genode::Mmio(Board::IRQ_CONTROLLER_BASE) { for (unsigned i = 0; i < NR_OF_IRQ; i++) { write(!Board::secure_irq(i), i); diff --git a/repos/base-hw/src/bootstrap/spec/riscv/platform.cc b/repos/base-hw/src/bootstrap/spec/riscv/platform.cc index 278d94bd76..a142e6ff70 100644 --- a/repos/base-hw/src/bootstrap/spec/riscv/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/riscv/platform.cc @@ -16,8 +16,12 @@ using namespace Board; + Bootstrap::Platform::Board::Board() -: early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE } ), core_mmio() {} +: + early_ram_regions(Memory_region { RAM_0_BASE, RAM_0_SIZE } ), + core_mmio() +{ } unsigned Bootstrap::Platform::enable_mmu() diff --git a/repos/base-hw/src/bootstrap/spec/x86_64/multiboot.h b/repos/base-hw/src/bootstrap/spec/x86_64/multiboot.h index 0b835a50c6..5c83d806dd 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/multiboot.h +++ b/repos/base-hw/src/bootstrap/spec/x86_64/multiboot.h @@ -20,11 +20,13 @@ namespace Genode { class Multiboot_info; } + class Genode::Multiboot_info : Mmio { private: - struct Flags : Register<0x00, 32> { + struct Flags : Register<0x00, 32> + { struct Mem_map : Bitfield<6, 1> { }; }; @@ -40,7 +42,8 @@ class Genode::Multiboot_info : Mmio Multiboot_info(addr_t mbi) : Mmio(mbi) { } Multiboot_info(addr_t mbi, bool strip); - struct Mmap : Genode::Mmio { + struct Mmap : Genode::Mmio + { struct Size : Register <0x00, 32> { }; struct Addr : Register <0x04, 64> { }; struct Length : Register <0x0c, 64> { }; @@ -52,8 +55,8 @@ class Genode::Multiboot_info : Mmio /** * Physical ram regions */ - addr_t phys_ram_mmap_base(unsigned i, bool solely_within_4k_base = true) { - + addr_t phys_ram_mmap_base(unsigned i, bool solely_within_4k_base = true) + { if (!read()) return 0; 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 2ca517b449..af10f76946 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h +++ b/repos/base-hw/src/bootstrap/spec/x86_64/multiboot2.h @@ -25,7 +25,8 @@ class Genode::Multiboot2_info : Mmio struct Size : Register <0x0, 32> { }; - struct Tag : Genode::Mmio { + struct Tag : Genode::Mmio + { enum { LOG2_SIZE = 3 }; struct Type : Register <0x00, 32> @@ -55,7 +56,8 @@ class Genode::Multiboot2_info : Mmio enum { MAGIC = 0x36d76289UL }; - struct Memory : Genode::Mmio { + struct Memory : Genode::Mmio + { enum { SIZE = 3 * 8 }; struct Addr : Register <0x00, 64> { }; 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 c267549290..4b631ad67c 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc @@ -23,8 +23,10 @@ using namespace Genode; + /* contains Multiboot MAGIC value (either version 1 or 2) */ extern "C" Genode::addr_t __initial_ax; + /* contains physical pointer to multiboot */ extern "C" Genode::addr_t __initial_bx; @@ -44,6 +46,7 @@ enum { AP_BOOT_CODE_PAGE = 0x1000 }; extern "C" void * _start; extern "C" void * _ap; + static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size) { if (area && area_size && area < area + area_size) { @@ -62,12 +65,13 @@ static Hw::Acpi_rsdp search_rsdp(addr_t area, addr_t area_size) Bootstrap::Platform::Board::Board() -: core_mmio(Memory_region { 0, 0x1000 }, - Memory_region { Hw::Cpu_memory_map::lapic_phys_base(), 0x1000 }, - Memory_region { Hw::Cpu_memory_map::MMIO_IOAPIC_BASE, - Hw::Cpu_memory_map::MMIO_IOAPIC_SIZE }, - Memory_region { __initial_bx & ~0xFFFUL, - get_page_size() }) +: + core_mmio(Memory_region { 0, 0x1000 }, + Memory_region { Hw::Cpu_memory_map::lapic_phys_base(), 0x1000 }, + Memory_region { Hw::Cpu_memory_map::MMIO_IOAPIC_BASE, + Hw::Cpu_memory_map::MMIO_IOAPIC_SIZE }, + 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; @@ -219,33 +223,40 @@ Bootstrap::Platform::Board::Board() addr_t ap_code_size = (addr_t)&_start - (addr_t)&_ap; memcpy((void *)AP_BOOT_CODE_PAGE, &_ap, ap_code_size); } - } + struct Lapic : Mmio { struct Svr : Register<0x0f0, 32> { struct APIC_enable : Bitfield<8, 1> { }; }; - struct Icr_low : Register<0x300, 32> { + + struct Icr_low : Register<0x300, 32> + { struct Vector : Bitfield< 0, 8> { }; - struct Delivery_mode : Bitfield< 8, 3> { + struct Delivery_mode : Bitfield< 8, 3> + { enum Mode { INIT = 5, SIPI = 6 }; }; struct Delivery_status : Bitfield<12, 1> { }; struct Level_assert : Bitfield<14, 1> { }; - struct Dest_shorthand : Bitfield<18, 2> { + struct Dest_shorthand : Bitfield<18, 2> + { enum { ALL_OTHERS = 3 }; }; }; - struct Icr_high : Register<0x310, 32> { + + struct Icr_high : Register<0x310, 32> + { struct Destination : Bitfield<24, 8> { }; }; Lapic(addr_t const addr) : Mmio(addr) { } }; + static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame, Lapic::Icr_low::Delivery_mode::Mode const mode) { @@ -268,6 +279,7 @@ static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame, lapic.write(icr_low); } + unsigned Bootstrap::Platform::enable_mmu() { using ::Board::Cpu; @@ -325,4 +337,6 @@ addr_t Bios_data_area::_mmio_base_virt() { return 0x1ff000; } Board::Serial::Serial(addr_t, size_t, unsigned baudrate) -:X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate) {} +: + X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate) +{ } diff --git a/repos/base-hw/src/core/board/imx7d_sabre/board.h b/repos/base-hw/src/core/board/imx7d_sabre/board.h index c44902a7d2..7857af7ca9 100644 --- a/repos/base-hw/src/core/board/imx7d_sabre/board.h +++ b/repos/base-hw/src/core/board/imx7d_sabre/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Imx7d_sabre_board; struct Virtual_local_pic {}; diff --git a/repos/base-hw/src/core/board/imx8q_evk/board.h b/repos/base-hw/src/core/board/imx8q_evk/board.h index 9143a9746a..547a610671 100644 --- a/repos/base-hw/src/core/board/imx8q_evk/board.h +++ b/repos/base-hw/src/core/board/imx8q_evk/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Imx8q_evk_board; enum { diff --git a/repos/base-hw/src/core/board/nit6_solox/board.h b/repos/base-hw/src/core/board/nit6_solox/board.h index 2d94bfb603..aa51e989b6 100644 --- a/repos/base-hw/src/core/board/nit6_solox/board.h +++ b/repos/base-hw/src/core/board/nit6_solox/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using namespace Hw::Nit6_solox_board; using Pic = Hw::Gicv2; diff --git a/repos/base-hw/src/core/board/pbxa9/board.h b/repos/base-hw/src/core/board/pbxa9/board.h index b163f5ea93..ef6dd2520f 100644 --- a/repos/base-hw/src/core/board/pbxa9/board.h +++ b/repos/base-hw/src/core/board/pbxa9/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using namespace Hw::Pbxa9_board; using Pic = Hw::Gicv2; diff --git a/repos/base-hw/src/core/board/rpi/board.h b/repos/base-hw/src/core/board/rpi/board.h index c90278fd80..6bce04f89a 100644 --- a/repos/base-hw/src/core/board/rpi/board.h +++ b/repos/base-hw/src/core/board/rpi/board.h @@ -19,8 +19,6 @@ #include #include -namespace Board { - using namespace Hw::Rpi_board; -}; +namespace Board { using namespace Hw::Rpi_board; }; #endif /* _CORE__SPEC__RPI__BOARD_H_ */ diff --git a/repos/base-hw/src/core/board/rpi3/board.h b/repos/base-hw/src/core/board/rpi3/board.h index 71872bdd39..0ebf150b18 100644 --- a/repos/base-hw/src/core/board/rpi3/board.h +++ b/repos/base-hw/src/core/board/rpi3/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using namespace Hw::Rpi3_board; enum { TIMER_IRQ = 1 }; diff --git a/repos/base-hw/src/core/board/virt_qemu/board.h b/repos/base-hw/src/core/board/virt_qemu/board.h index eb93acf57b..1bb7a48eaa 100644 --- a/repos/base-hw/src/core/board/virt_qemu/board.h +++ b/repos/base-hw/src/core/board/virt_qemu/board.h @@ -23,6 +23,7 @@ namespace Kernel { class Cpu; } namespace Board { + using namespace Hw::Virt_qemu_board; struct Virtual_local_pic {}; diff --git a/repos/base-hw/src/core/board/virt_qemu_64/board.h b/repos/base-hw/src/core/board/virt_qemu_64/board.h index abbc95ef10..d75c326c95 100644 --- a/repos/base-hw/src/core/board/virt_qemu_64/board.h +++ b/repos/base-hw/src/core/board/virt_qemu_64/board.h @@ -15,7 +15,6 @@ #define _SRC__CORE__SPEC__VIRT_QEMU_64_H_ #include -//#include #include #include #include @@ -24,6 +23,7 @@ #include namespace Board { + using namespace Hw::Virt_qemu_board; enum { @@ -42,11 +42,13 @@ namespace Board { using Vm_state = Genode::Vm_state; }; + namespace Kernel { class Cpu; class Vm; }; + struct Board::Vcpu_context { struct Vm_irq : Kernel::Irq @@ -77,8 +79,7 @@ struct Board::Vcpu_context void disable(); }; - Vcpu_context(Kernel::Cpu & cpu) - : pic_irq(cpu), vtimer_irq(cpu) {} + Vcpu_context(Kernel::Cpu & cpu) : pic_irq(cpu), vtimer_irq(cpu) { } Pic::Virtual_context pic {}; Pic_maintainance_irq pic_irq; diff --git a/repos/base-hw/src/core/board/wand_quad/board.h b/repos/base-hw/src/core/board/wand_quad/board.h index 792a86c476..7c1195d0c4 100644 --- a/repos/base-hw/src/core/board/wand_quad/board.h +++ b/repos/base-hw/src/core/board/wand_quad/board.h @@ -20,6 +20,7 @@ #include namespace Board { + using namespace Hw::Wand_quad_board; using L2_cache = Hw::Pl310; diff --git a/repos/base-hw/src/core/board/zynq_qemu/board.h b/repos/base-hw/src/core/board/zynq_qemu/board.h index 3864ed38b7..a9012bae72 100644 --- a/repos/base-hw/src/core/board/zynq_qemu/board.h +++ b/repos/base-hw/src/core/board/zynq_qemu/board.h @@ -21,6 +21,7 @@ #include namespace Board { + using namespace Hw::Zynq_qemu_board; using Pic = Hw::Gicv2; diff --git a/repos/base-hw/src/core/core_log_out.cc b/repos/base-hw/src/core/core_log_out.cc index 965d07b206..2d555f12c1 100644 --- a/repos/base-hw/src/core/core_log_out.cc +++ b/repos/base-hw/src/core/core_log_out.cc @@ -23,5 +23,8 @@ void Genode::Core_log::out(char const c) { Kernel::log(c); } -void Genode::raw_write_string(char const *str) { - while (char c = *str++) Kernel::log(c); } +void Genode::raw_write_string(char const *str) +{ + while (char c = *str++) + Kernel::log(c); +} diff --git a/repos/base-hw/src/core/core_region_map.cc b/repos/base-hw/src/core/core_region_map.cc index 1defc1368b..27aeaeb8ff 100644 --- a/repos/base-hw/src/core/core_region_map.cc +++ b/repos/base-hw/src/core/core_region_map.cc @@ -23,6 +23,7 @@ using namespace Genode; + Region_map::Local_addr Core_region_map::attach(Dataspace_capability ds_cap, size_t size, off_t offset, bool use_local_addr, diff --git a/repos/base-hw/src/core/cpu_thread_allocator.h b/repos/base-hw/src/core/cpu_thread_allocator.h index 834cfe028f..b4fec6298b 100644 --- a/repos/base-hw/src/core/cpu_thread_allocator.h +++ b/repos/base-hw/src/core/cpu_thread_allocator.h @@ -21,54 +21,54 @@ /* core includes */ #include -namespace Genode +namespace Genode { class Cpu_thread_allocator; } + + +/** + * Thread allocator for cores CPU service + * + * Normally one would use a SLAB for threads because usually they + * are tiny objects, but in 'base-hw' they contain the whole kernel + * object in addition. Thus we use the given allocator directly. + */ +class Genode::Cpu_thread_allocator : public Allocator { - /** - * Thread allocator for cores CPU service - * - * Normally one would use a SLAB for threads because usually they - * are tiny objects, but in 'base-hw' they contain the whole kernel - * object in addition. Thus we use the given allocator directly. - */ - class Cpu_thread_allocator : public Allocator - { - private: + private: - /* - * Noncopyable - */ - Cpu_thread_allocator(Cpu_thread_allocator const &); - Cpu_thread_allocator &operator = (Cpu_thread_allocator const &); + /* + * Noncopyable + */ + Cpu_thread_allocator(Cpu_thread_allocator const &); + Cpu_thread_allocator &operator = (Cpu_thread_allocator const &); - Allocator &_alloc; + Allocator &_alloc; - public: + public: - /** - * Constructor - * - * \param alloc allocator backend - */ - Cpu_thread_allocator(Allocator &alloc) : _alloc(alloc) { } + /** + * Constructor + * + * \param alloc allocator backend + */ + Cpu_thread_allocator(Allocator &alloc) : _alloc(alloc) { } - /************************* - ** Allocator interface ** - *************************/ + /************************* + ** Allocator interface ** + *************************/ - bool alloc(size_t size, void **out_addr) override { - return _alloc.alloc(size, out_addr); } + bool alloc(size_t size, void **out_addr) override { + return _alloc.alloc(size, out_addr); } - void free(void *addr, size_t size) override { - _alloc.free(addr, size); } + void free(void *addr, size_t size) override { + _alloc.free(addr, size); } - size_t consumed() const override { ASSERT_NEVER_CALLED; } + size_t consumed() const override { ASSERT_NEVER_CALLED; } - size_t overhead(size_t) const override { ASSERT_NEVER_CALLED; } + size_t overhead(size_t) const override { ASSERT_NEVER_CALLED; } - bool need_size_for_free() const override { - return _alloc.need_size_for_free(); } - }; -} + bool need_size_for_free() const override { + return _alloc.need_size_for_free(); } +}; #endif /* _CORE__CPU_THREAD_ALLOCATOR_H_ */ diff --git a/repos/base-hw/src/core/env.cc b/repos/base-hw/src/core/env.cc index 45d47fc5f2..6a4f6498fa 100644 --- a/repos/base-hw/src/core/env.cc +++ b/repos/base-hw/src/core/env.cc @@ -16,4 +16,5 @@ using namespace Genode; + void Genode::upgrade_capability_slab() { ASSERT_NEVER_CALLED; } diff --git a/repos/base-hw/src/core/irq_session_component.cc b/repos/base-hw/src/core/irq_session_component.cc index ef8efec5a5..9364fa4d2c 100644 --- a/repos/base-hw/src/core/irq_session_component.cc +++ b/repos/base-hw/src/core/irq_session_component.cc @@ -63,12 +63,11 @@ Irq_session_component::~Irq_session_component() Irq_session_component::Irq_session_component(Range_allocator &irq_alloc, const char * const args) -: _irq_args(args), - _irq_number(Platform::irq(_irq_args.irq_number())), - _irq_alloc(irq_alloc), - _kobj(), _is_msi(false), _address(0), _value(0) +: + _irq_args(args), _irq_number(Platform::irq(_irq_args.irq_number())), + _irq_alloc(irq_alloc), _kobj(), _is_msi(false), _address(0), _value(0) { - const long mmconf = + long const mmconf = Arg_string::find_arg(args, "device_config_phys").long_value(0); if (mmconf) { diff --git a/repos/base-hw/src/core/kernel/configuration.h b/repos/base-hw/src/core/kernel/configuration.h index 4d370ff8ca..b62aaf72d9 100644 --- a/repos/base-hw/src/core/kernel/configuration.h +++ b/repos/base-hw/src/core/kernel/configuration.h @@ -16,8 +16,8 @@ #include -namespace Kernel -{ +namespace Kernel { + enum { DEFAULT_STACK_SIZE = 16 * 1024, DEFAULT_TRANSLATION_TABLE_MAX = 128, diff --git a/repos/base-hw/src/core/kernel/core_interface.h b/repos/base-hw/src/core/kernel/core_interface.h index b1b6f303ad..80ee2e24cf 100644 --- a/repos/base-hw/src/core/kernel/core_interface.h +++ b/repos/base-hw/src/core/kernel/core_interface.h @@ -22,8 +22,8 @@ namespace Genode { class Native_utcb; } -namespace Kernel -{ +namespace Kernel { + class Pd; class Thread; class Signal_receiver; diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index 21a568de08..f1d1f83cca 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -27,6 +27,7 @@ using namespace Kernel; + Kernel::Cpu_pool &Kernel::cpu_pool() { return *unmanaged_singleton(); } @@ -80,19 +81,24 @@ void Cpu_job::affinity(Cpu &cpu) void Cpu_job::quota(unsigned const q) { - if (_cpu) { _cpu->scheduler().quota(*this, q); } - else { Cpu_share::quota(q); } + if (_cpu) + _cpu->scheduler().quota(*this, q); + else + Cpu_share::quota(q); } Cpu_job::Cpu_job(Cpu_priority const p, unsigned const q) : - Cpu_share(p, q), _cpu(0) { } + Cpu_share(p, q), _cpu(0) +{ } Cpu_job::~Cpu_job() { - if (!_cpu) { return; } + if (!_cpu) + return; + _cpu->scheduler().remove(*this); } @@ -103,8 +109,10 @@ Cpu_job::~Cpu_job() extern "C" void idle_thread_main(void); + Cpu::Idle_thread::Idle_thread(Cpu &cpu) -: Thread("idle") +: + Thread("idle") { regs->ip = (addr_t)&idle_thread_main; @@ -115,12 +123,13 @@ Cpu::Idle_thread::Idle_thread(Cpu &cpu) void Cpu::schedule(Job * const job) { - if (_id == executing_id()) { _scheduler.ready(job->share()); } + if (_id == executing_id()) + _scheduler.ready(job->share()); else { _scheduler.ready_check(job->share()); - if (_scheduler.need_to_schedule()) { + + if (_scheduler.need_to_schedule()) trigger_ip_interrupt(); - } } } @@ -128,7 +137,10 @@ void Cpu::schedule(Job * const job) bool Cpu::interrupt(unsigned const irq_id) { Irq * const irq = object(irq_id); - if (!irq) return false; + + if (!irq) + return false; + irq->occurred(); return true; } @@ -159,18 +171,21 @@ Genode::uint8_t kernel_stack[NR_OF_CPUS][Cpu::KERNEL_STACK_SIZE] __attribute__((aligned(Genode::get_page_size()))); -addr_t Cpu::stack_start() { - return (addr_t)&kernel_stack + KERNEL_STACK_SIZE * (_id+1); } +addr_t Cpu::stack_start() +{ + return (addr_t)&kernel_stack + KERNEL_STACK_SIZE * (_id + 1); +} -Cpu::Cpu(unsigned const id, - Inter_processor_work_list & global_work_list) +Cpu::Cpu(unsigned const id, Inter_processor_work_list & global_work_list) : _id(id), _timer(*this), _scheduler(_idle, _quota(), _fill()), _idle(*this), _ipi_irq(*this), _global_work_list(global_work_list) -{ _arch_init(); } +{ + _arch_init(); +} /************** @@ -193,5 +208,9 @@ 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/kernel/cpu.h b/repos/base-hw/src/core/kernel/cpu.h index 802fdeee96..e007ce6f17 100644 --- a/repos/base-hw/src/core/kernel/cpu.h +++ b/repos/base-hw/src/core/kernel/cpu.h @@ -24,8 +24,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + /** * Class for kernel data that is needed to manage a specific CPU */ diff --git a/repos/base-hw/src/core/kernel/cpu_context.h b/repos/base-hw/src/core/kernel/cpu_context.h index a9ecc262e3..188260ec47 100644 --- a/repos/base-hw/src/core/kernel/cpu_context.h +++ b/repos/base-hw/src/core/kernel/cpu_context.h @@ -19,8 +19,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + class Cpu; /** @@ -29,6 +29,7 @@ namespace Kernel class Cpu_job; } + class Kernel::Cpu_job : private Cpu_share { private: diff --git a/repos/base-hw/src/core/kernel/cpu_mp.cc b/repos/base-hw/src/core/kernel/cpu_mp.cc index db252c05ea..6867da4a8e 100644 --- a/repos/base-hw/src/core/kernel/cpu_mp.cc +++ b/repos/base-hw/src/core/kernel/cpu_mp.cc @@ -15,6 +15,7 @@ using namespace Kernel; + void Cpu::Ipi::occurred() { /* lambda to iterate over a work-list and execute all work items */ @@ -39,7 +40,8 @@ void Cpu::Ipi::occurred() void Cpu::trigger_ip_interrupt() { /* check whether there is still an IPI send */ - if (_ipi_irq.pending) return; + if (_ipi_irq.pending) + return; _pic.send_ipi(_id); _ipi_irq.pending = true; @@ -47,5 +49,8 @@ void Cpu::trigger_ip_interrupt() Cpu::Ipi::Ipi(Cpu & cpu) -: Irq(Board::Pic::IPI, cpu), cpu(cpu) { - cpu.pic().unmask(Board::Pic::IPI, cpu.id()); } +: + Irq(Board::Pic::IPI, cpu), cpu(cpu) +{ + cpu.pic().unmask(Board::Pic::IPI, cpu.id()); +} diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.cc b/repos/base-hw/src/core/kernel/cpu_scheduler.cc index cee5d60c7a..587fa0ced2 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.cc +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.cc @@ -40,8 +40,10 @@ void Cpu_scheduler::_next_round() void Cpu_scheduler::_consumed(unsigned const q) { - if (_residual > q) { _residual -= q; } - else { _next_round(); } + if (_residual > q) + _residual -= q; + else + _next_round(); } @@ -62,18 +64,27 @@ void Cpu_scheduler::_next_fill() void Cpu_scheduler::_head_claimed(unsigned const r) { - if (!_head->_quota) { return; } + if (!_head->_quota) + return; + _head->_claim = r > _head->_quota ? _head->_quota : r; - if (_head->_claim || !_head->_ready) { return; } + + if (_head->_claim || !_head->_ready) + return; + _rcl[_head->_prio].to_tail(&_head->_claim_item); } void Cpu_scheduler::_head_filled(unsigned const r) { - if (_fills.head() != &_head->_fill_item) { return; } - if (r) { _head->_fill = r; } - else { _next_fill(); } + if (_fills.head() != &_head->_fill_item) + return; + + if (r) + _head->_fill = r; + else + _next_fill(); } @@ -81,9 +92,15 @@ bool Cpu_scheduler::_claim_for_head() { for (signed p = Prio::MAX; p > Prio::MIN - 1; p--) { Double_list_item *const item { _rcl[p].head() }; - if (!item) { continue; } + + if (!item) + continue; + Cpu_share &share { item->payload() }; - if (!share._claim) { continue; } + + if (!share._claim) + continue; + _set_head(share, share._claim, 1); return 1; } @@ -94,9 +111,9 @@ bool Cpu_scheduler::_claim_for_head() bool Cpu_scheduler::_fill_for_head() { Double_list_item *const item { _fills.head() }; - if (!item) { + if (!item) return 0; - } + Share &share = item->payload(); _set_head(share, share._fill, 0); return 1; @@ -106,7 +123,9 @@ bool Cpu_scheduler::_fill_for_head() unsigned Cpu_scheduler::_trim_consumption(unsigned &q) { q = Genode::min(Genode::min(q, _head_quota), _residual); - if (!_head_yields) { return _head_quota - q; } + if (!_head_yields) + return _head_quota - q; + _head_yields = false; return 0; } @@ -114,22 +133,31 @@ unsigned Cpu_scheduler::_trim_consumption(unsigned &q) void Cpu_scheduler::_quota_introduction(Share &s) { - if (s._ready) { _rcl[s._prio].insert_tail(&s._claim_item); } - else { _ucl[s._prio].insert_tail(&s._claim_item); } + if (s._ready) + _rcl[s._prio].insert_tail(&s._claim_item); + else + _ucl[s._prio].insert_tail(&s._claim_item); } void Cpu_scheduler::_quota_revokation(Share &s) { - if (s._ready) { _rcl[s._prio].remove(&s._claim_item); } - else { _ucl[s._prio].remove(&s._claim_item); } + if (s._ready) + _rcl[s._prio].remove(&s._claim_item); + else + _ucl[s._prio].remove(&s._claim_item); } void Cpu_scheduler::_quota_adaption(Share &s, unsigned const q) { - if (q) { if (s._claim > q) { s._claim = q; } } - else { _quota_revokation(s); } + if (q) { + if (s._claim > q) + s._claim = q; + } else { + _quota_revokation(s); + } + } @@ -142,13 +170,21 @@ void Cpu_scheduler::update(time_t time) /* do not detract the quota if the head context was removed even now */ if (_head) { unsigned const r = _trim_consumption(duration); - if (_head_claims) { _head_claimed(r); } - else { _head_filled(r); } + + if (_head_claims) + _head_claimed(r); + else + _head_filled(r); + _consumed(duration); } - if (_claim_for_head()) { return; } - if (_fill_for_head()) { return; } + if (_claim_for_head()) + return; + + if (_fill_for_head()) + return; + _set_head(_idle, _fill, 0); } @@ -159,9 +195,9 @@ void Cpu_scheduler::ready_check(Share &s1) ready(s1); - if (_need_to_schedule) { + if (_need_to_schedule) return; - } + Share * s2 = _head; if (!s1._claim) { _need_to_schedule = s2 == &_idle; @@ -191,10 +227,16 @@ void Cpu_scheduler::ready(Share &s) s._ready = 1; s._fill = _fill; _fills.insert_tail(&s._fill_item); - if (!s._quota) { return; } + + if (!s._quota) + return; + _ucl[s._prio].remove(&s._claim_item); - if (s._claim) { _rcl[s._prio].insert_head(&s._claim_item); } - else { _rcl[s._prio].insert_tail(&s._claim_item); } + + if (s._claim) + _rcl[s._prio].insert_head(&s._claim_item); + else + _rcl[s._prio].insert_tail(&s._claim_item); } @@ -206,7 +248,10 @@ void Cpu_scheduler::unready(Share &s) s._ready = 0; _fills.remove(&s._fill_item); - if (!s._quota) { return; } + + if (!s._quota) + return; + _rcl[s._prio].remove(&s._claim_item); _ucl[s._prio].insert_tail(&s._claim_item); } @@ -224,19 +269,32 @@ void Cpu_scheduler::remove(Share &s) assert(&s != &_idle); _need_to_schedule = true; - if (&s == _head) _head = nullptr; - if (s._ready) { _fills.remove(&s._fill_item); } - if (!s._quota) { return; } - if (s._ready) { _rcl[s._prio].remove(&s._claim_item); } - else { _ucl[s._prio].remove(&s._claim_item); } + + if (&s == _head) + _head = nullptr; + + if (s._ready) + _fills.remove(&s._fill_item); + + if (!s._quota) + return; + + if (s._ready) + _rcl[s._prio].remove(&s._claim_item); + else + _ucl[s._prio].remove(&s._claim_item); } void Cpu_scheduler::insert(Share &s) { assert(!s._ready); + _need_to_schedule = true; - if (!s._quota) { return; } + + if (!s._quota) + return; + s._claim = s._quota; _ucl[s._prio].insert_head(&s._claim_item); } @@ -245,8 +303,12 @@ void Cpu_scheduler::insert(Share &s) void Cpu_scheduler::quota(Share &s, unsigned const q) { assert(&s != &_idle); - if (s._quota) { _quota_adaption(s, q); } - else if (q) { _quota_introduction(s); } + + if (s._quota) + _quota_adaption(s, q); + else if (q) + _quota_introduction(s); + s._quota = q; } @@ -258,7 +320,9 @@ Cpu_share &Cpu_scheduler::head() const } -Cpu_scheduler::Cpu_scheduler(Share &i, unsigned const q, - unsigned const f) -: _idle(i), _quota(q), _residual(q), _fill(f) -{ _set_head(i, f, 0); } +Cpu_scheduler::Cpu_scheduler(Share &i, unsigned const q, unsigned const f) +: + _idle(i), _quota(q), _residual(q), _fill(f) +{ + _set_head(i, f, 0); +} diff --git a/repos/base-hw/src/core/kernel/cpu_scheduler.h b/repos/base-hw/src/core/kernel/cpu_scheduler.h index 8e9b18a35a..9fc8837733 100644 --- a/repos/base-hw/src/core/kernel/cpu_scheduler.h +++ b/repos/base-hw/src/core/kernel/cpu_scheduler.h @@ -20,8 +20,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + /** * Priority of an unconsumed CPU claim versus other unconsumed CPU claims */ @@ -38,6 +38,7 @@ namespace Kernel class Cpu_scheduler; } + class Kernel::Cpu_priority { private: @@ -69,6 +70,7 @@ class Kernel::Cpu_priority operator signed() const { return _value; } }; + class Kernel::Cpu_share { friend class Cpu_scheduler; diff --git a/repos/base-hw/src/core/kernel/double_list.h b/repos/base-hw/src/core/kernel/double_list.h index 4f4001a001..14b71f2eb8 100644 --- a/repos/base-hw/src/core/kernel/double_list.h +++ b/repos/base-hw/src/core/kernel/double_list.h @@ -14,8 +14,8 @@ #ifndef _CORE__KERNEL__DOUBLE_LIST_H_ #define _CORE__KERNEL__DOUBLE_LIST_H_ -namespace Kernel -{ +namespace Kernel { + /** * Ability to be an item in a double connected list */ @@ -29,6 +29,7 @@ namespace Kernel class Double_list; } + template class Kernel::Double_list_item { @@ -47,6 +48,7 @@ class Kernel::Double_list_item T &payload() { return _payload; } }; + template class Kernel::Double_list { @@ -129,7 +131,9 @@ class Kernel::Double_list */ void head_to_tail() { - if (!_head || _head == _tail) { return; } + if (!_head || _head == _tail) + return; + _head->_prev = _tail; _tail->_next = _head; _head = _head->_next; diff --git a/repos/base-hw/src/core/kernel/init.cc b/repos/base-hw/src/core/kernel/init.cc index af1f7a5b94..b4ad204f18 100644 --- a/repos/base-hw/src/core/kernel/init.cc +++ b/repos/base-hw/src/core/kernel/init.cc @@ -26,9 +26,11 @@ using namespace Kernel; + static_assert(sizeof(Genode::sizet_arithm_t) >= 2 * sizeof(size_t), "Bad result type for size_t arithmetics."); + Pd &Kernel::core_pd() { return unmanaged_singleton()->kernel_pd(); } diff --git a/repos/base-hw/src/core/kernel/ipc_node.cc b/repos/base-hw/src/core/kernel/ipc_node.cc index c7648e24fc..29d06ce0d5 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.cc +++ b/repos/base-hw/src/core/kernel/ipc_node.cc @@ -85,14 +85,17 @@ void Ipc_node::_cancel_inbuf_request() void Ipc_node::_announced_request_cancelled(Ipc_node &node) { - if (_caller == &node) _caller = nullptr; - else _request_queue.remove(node._request_queue_item); + if (_caller == &node) + _caller = nullptr; + else + _request_queue.remove(node._request_queue_item); } void Ipc_node::_outbuf_request_cancelled() { - if (_callee == nullptr) return; + if (_callee == nullptr) + return; _callee = nullptr; _state = INACTIVE; @@ -100,7 +103,10 @@ void Ipc_node::_outbuf_request_cancelled() } -bool Ipc_node::_helps_outbuf_dst() { return (_state == AWAIT_REPLY) && _help; } +bool Ipc_node::_helps_outbuf_dst() +{ + return (_state == AWAIT_REPLY) && _help; +} bool Ipc_node::can_send_request() @@ -122,8 +128,10 @@ void Ipc_node::send_request(Ipc_node &callee, bool help) } -Thread &Ipc_node::helping_sink() { - return _helps_outbuf_dst() ? _callee->helping_sink() : _thread; } +Thread &Ipc_node::helping_sink() +{ + return _helps_outbuf_dst() ? _callee->helping_sink() : _thread; +} bool Ipc_node::can_await_request() diff --git a/repos/base-hw/src/core/kernel/ipc_node.h b/repos/base-hw/src/core/kernel/ipc_node.h index 4750e0712d..b8e25ea4b7 100644 --- a/repos/base-hw/src/core/kernel/ipc_node.h +++ b/repos/base-hw/src/core/kernel/ipc_node.h @@ -18,8 +18,8 @@ /* Genode includes */ #include -namespace Kernel -{ +namespace Kernel { + class Thread; /** @@ -138,12 +138,15 @@ class Kernel::Ipc_node template void for_each_helper(F f) { /* if we have a helper in the receive buffer, call 'f' for it */ - if (_caller && _caller->_help) f(_caller->_thread); + if (_caller && _caller->_help) + f(_caller->_thread); /* call 'f' for each helper in our request queue */ _request_queue.for_each([f] (Queue_item &item) { Ipc_node &node { item.object() }; - if (node._help) f(node._thread); + + if (node._help) + f(node._thread); }); } diff --git a/repos/base-hw/src/core/kernel/irq.cc b/repos/base-hw/src/core/kernel/irq.cc index 2e2d2ab8dd..75ed7dcf7b 100644 --- a/repos/base-hw/src/core/kernel/irq.cc +++ b/repos/base-hw/src/core/kernel/irq.cc @@ -17,12 +17,16 @@ #include -void Kernel::Irq::disable() const { - cpu_pool().executing_cpu().pic().mask(_irq_nr); } +void Kernel::Irq::disable() const +{ + cpu_pool().executing_cpu().pic().mask(_irq_nr); +} -void Kernel::Irq::enable() const { - cpu_pool().executing_cpu().pic().unmask(_irq_nr, Cpu::executing_id()); } +void Kernel::Irq::enable() const +{ + cpu_pool().executing_cpu().pic().unmask(_irq_nr, Cpu::executing_id()); +} Kernel::Irq::Pool &Kernel::User_irq::_pool() @@ -36,7 +40,8 @@ Kernel::User_irq::User_irq(unsigned const irq, Genode::Irq_session::Trigger trigger, Genode::Irq_session::Polarity polarity, Signal_context & context) -: Irq(irq, _pool()), _context(context) +: + Irq(irq, _pool()), _context(context) { disable(); cpu_pool().executing_cpu().pic().irq_mode(_irq_nr, trigger, polarity); diff --git a/repos/base-hw/src/core/kernel/irq.h b/repos/base-hw/src/core/kernel/irq.h index c71e59c932..c7ccf5ecbb 100644 --- a/repos/base-hw/src/core/kernel/irq.h +++ b/repos/base-hw/src/core/kernel/irq.h @@ -25,8 +25,8 @@ /* core includes */ #include -namespace Kernel -{ +namespace Kernel { + /** * Kernel back-end interface of an interrupt */ @@ -38,8 +38,9 @@ namespace Kernel class User_irq; } -namespace Genode -{ + +namespace Genode { + /** * Core front-end of a user interrupt */ @@ -78,7 +79,11 @@ class Kernel::Irq : Genode::Avl_node * \param pool pool this interrupt shall belong to */ Irq(unsigned const irq, Pool &pool) - : _irq_nr(irq), _pool(pool) { _pool.insert(this); } + : + _irq_nr(irq), _pool(pool) + { + _pool.insert(this); + } virtual ~Irq() { _pool.remove(this); } diff --git a/repos/base-hw/src/core/kernel/lock.h b/repos/base-hw/src/core/kernel/lock.h index 3abb5f1332..6c7c5c9fb6 100644 --- a/repos/base-hw/src/core/kernel/lock.h +++ b/repos/base-hw/src/core/kernel/lock.h @@ -15,8 +15,8 @@ #ifndef _CORE__SPEC__SMP__KERNEL__LOCK_H_ #define _CORE__SPEC__SMP__KERNEL__LOCK_H_ -namespace Kernel -{ +namespace Kernel { + class Lock; Lock & data_lock(); diff --git a/repos/base-hw/src/core/kernel/object.cc b/repos/base-hw/src/core/kernel/object.cc index c44250853a..4f5da18b88 100644 --- a/repos/base-hw/src/core/kernel/object.cc +++ b/repos/base-hw/src/core/kernel/object.cc @@ -17,88 +17,95 @@ Object::Object(Thread &obj) _obj { (void *)&obj } { } + Object::Object(Irq &obj) : _type { IRQ }, _obj { (void *)&obj } { } + Object::Object(Signal_receiver &obj) : _type { SIGNAL_RECEIVER }, _obj { (void *)&obj } { } + Object::Object(Signal_context &obj) : _type { SIGNAL_CONTEXT }, _obj { (void *)&obj } { } + Object::Object(Pd &obj) : _type { PD }, _obj { (void *)&obj } { } + Object::Object(Vm &obj) : _type { VM }, _obj { (void *)&obj } { } + Object::~Object() { for (Object_identity * oi = first(); oi; oi = first()) oi->invalidate(); } + namespace Kernel { template <> Pd *Object::obj() const { - if (_type != PD) { - return nullptr; } + if (_type != PD) + return nullptr; return reinterpret_cast(_obj); } template <> Irq *Object::obj() const { - if (_type != IRQ) { - return nullptr; } + if (_type != IRQ) + return nullptr; return reinterpret_cast(_obj); } template <> Signal_receiver *Object::obj() const { - if (_type != SIGNAL_RECEIVER) { - return nullptr; } + if (_type != SIGNAL_RECEIVER) + return nullptr; return reinterpret_cast(_obj); } template <> Signal_context *Object::obj() const { - if (_type != SIGNAL_CONTEXT) { - return nullptr; } + if (_type != SIGNAL_CONTEXT) + return nullptr; return reinterpret_cast(_obj); } template <> Thread *Object::obj() const { - if (_type != THREAD) { - return nullptr; } + if (_type != THREAD) + return nullptr; return reinterpret_cast(_obj); } template <> Vm *Object::obj() const { - if (_type != VM) { - return nullptr; } + if (_type != VM) + return nullptr; return reinterpret_cast(_obj); } @@ -122,7 +129,11 @@ void Object_identity::invalidate() Object_identity::Object_identity(Object & object) -: _object(&object) { _object->insert(this); } +: + _object(&object) +{ + _object->insert(this); +} Object_identity::~Object_identity() { invalidate(); } @@ -135,11 +146,16 @@ Object_identity::~Object_identity() { invalidate(); } Object_identity_reference * Object_identity_reference::find(Pd &pd) { - if (!_identity) return nullptr; + if (!_identity) + return nullptr; for (Object_identity_reference * oir = _identity->first(); - oir; oir = oir->next()) - if (&pd == &(oir->_pd)) return oir; + oir; oir = oir->next()) { + + if (&pd == &(oir->_pd)) + return oir; + } + return nullptr; } @@ -149,9 +165,12 @@ Object_identity_reference::find(capid_t capid) { using Avl_node_base = Genode::Avl_node; - if (capid == _capid) return this; + if (capid == _capid) + return this; + Object_identity_reference * subtree = Avl_node_base::child(capid > _capid); + return (subtree) ? subtree->find(capid) : nullptr; } @@ -165,17 +184,23 @@ Object_identity_reference * Object_identity_reference::factory(void * dst, } -void Object_identity_reference::invalidate() { - if (_identity) _identity->remove(this); +void Object_identity_reference::invalidate() +{ + if (_identity) + _identity->remove(this); + _identity = nullptr; } Object_identity_reference::Object_identity_reference(Object_identity *oi, Pd &pd) -: _capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0) +: + _capid(pd.capid_alloc().alloc()), _identity(oi), _pd(pd), _in_utcbs(0) { - if (_identity) _identity->insert(this); + if (_identity) + _identity->insert(this); + _pd.cap_tree().insert(this); } @@ -188,5 +213,7 @@ Object_identity_reference::~Object_identity_reference() } -Object_identity_reference * Object_identity_reference_tree::find(capid_t id) { - return (first()) ? first()->find(id) : nullptr; } +Object_identity_reference * Object_identity_reference_tree::find(capid_t id) +{ + return (first()) ? first()->find(id) : nullptr; +} diff --git a/repos/base-hw/src/core/kernel/object.h b/repos/base-hw/src/core/kernel/object.h index 954ba2ef07..4f7b231558 100644 --- a/repos/base-hw/src/core/kernel/object.h +++ b/repos/base-hw/src/core/kernel/object.h @@ -25,8 +25,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + /* * Forward declarations */ @@ -118,9 +118,8 @@ class Kernel::Object : private Object_identity_list }; -class Kernel::Object_identity -: public Object_identity_list::Element, - public Kernel::Object_identity_reference_list +class Kernel::Object_identity : public Object_identity_list::Element, + public Kernel::Object_identity_reference_list { private: @@ -145,8 +144,9 @@ class Kernel::Object_identity class Kernel::Object_identity_reference -: public Genode::Avl_node, - public Genode::List::Element +: + public Genode::Avl_node, + public Genode::List::Element { private: @@ -171,8 +171,10 @@ class Kernel::Object_identity_reference ***************/ template - KOBJECT * object() { - return _identity ? _identity->object() : nullptr; } + KOBJECT * object() + { + return _identity ? _identity->object() : nullptr; + } Object_identity_reference * factory(void * dst, Pd &pd); @@ -204,7 +206,8 @@ class Kernel::Object_identity_reference class Kernel::Object_identity_reference_tree -: public Genode::Avl_tree +: + public Genode::Avl_tree { public: diff --git a/repos/base-hw/src/core/kernel/pd.h b/repos/base-hw/src/core/kernel/pd.h index e9956e36d5..8755754fe2 100644 --- a/repos/base-hw/src/core/kernel/pd.h +++ b/repos/base-hw/src/core/kernel/pd.h @@ -24,12 +24,11 @@ #include -namespace Genode { - class Platform_pd; -} +namespace Genode { class Platform_pd; } + + +namespace Kernel { -namespace Kernel -{ class Cpu; /** @@ -68,8 +67,8 @@ class Kernel::Pd */ Pd(Hw::Page_table &table, Genode::Platform_pd &platform_pd) - : _table(table), _platform_pd(platform_pd), - mmu_regs((addr_t)&table) + : + _table(table), _platform_pd(platform_pd), mmu_regs((addr_t)&table) { capid_t invalid = _capid_alloc.alloc(); assert(invalid == cap_id_invalid()); @@ -87,9 +86,9 @@ class Kernel::Pd oir->~Object_identity_reference(); } - static capid_t syscall_create(Genode::Kernel_object & p, - Hw::Page_table & tt, - Genode::Platform_pd & pd) + static capid_t syscall_create(Genode::Kernel_object &p, + Hw::Page_table &tt, + Genode::Platform_pd &pd) { return call(call_id_new_pd(), (Call_arg)&p, (Call_arg)&tt, (Call_arg)&pd); @@ -120,7 +119,9 @@ class Kernel::Pd template<> inline Kernel::Core_object_identity::Core_object_identity(Kernel::Pd & pd) -: Object_identity(pd.kernel_object()), - Object_identity_reference(this, pd.core_pd() ? pd : core_pd()) { } +: + Object_identity(pd.kernel_object()), + Object_identity_reference(this, pd.core_pd() ? pd : core_pd()) +{ } #endif /* _CORE__KERNEL__PD_H_ */ diff --git a/repos/base-hw/src/core/kernel/perf_counter.h b/repos/base-hw/src/core/kernel/perf_counter.h index c641abbce6..fc0f5e1957 100644 --- a/repos/base-hw/src/core/kernel/perf_counter.h +++ b/repos/base-hw/src/core/kernel/perf_counter.h @@ -14,8 +14,8 @@ #ifndef _CORE__KERNEL__PERF_COUNTER_H_ #define _CORE__KERNEL__PERF_COUNTER_H_ -namespace Kernel -{ +namespace Kernel { + /** * Performance counter */ diff --git a/repos/base-hw/src/core/kernel/signal_receiver.cc b/repos/base-hw/src/core/kernel/signal_receiver.cc index 6c9bdac28d..2e192d3ffe 100644 --- a/repos/base-hw/src/core/kernel/signal_receiver.cc +++ b/repos/base-hw/src/core/kernel/signal_receiver.cc @@ -33,6 +33,7 @@ void Signal_handler::cancel_waiting() Signal_handler::Signal_handler(Thread &thread) : _thread { thread } { } + Signal_handler::~Signal_handler() { cancel_waiting(); } @@ -42,7 +43,8 @@ Signal_handler::~Signal_handler() { cancel_waiting(); } void Signal_context_killer::cancel_waiting() { - if (_context) { _context->_killer_cancelled(); } + if (_context) + _context->_killer_cancelled(); } @@ -61,7 +63,8 @@ Signal_context_killer::~Signal_context_killer() { cancel_waiting(); } void Signal_context::_deliverable() { - if (_submits) { _receiver._add_deliverable(*this); } + if (_submits) + _receiver._add_deliverable(*this); } @@ -77,27 +80,36 @@ void Signal_context::_killer_cancelled() { _killer = 0; } bool Signal_context::can_submit(unsigned const n) const { - if (_killed || _submits >= (unsigned)~0 - n) { return false; } + if (_killed || _submits >= (unsigned)~0 - n) + return false; + return true; } void Signal_context::submit(unsigned const n) { - if (_killed || _submits >= (unsigned)~0 - n) { return; } + if (_killed || _submits >= (unsigned)~0 - n) + return; + _submits += n; - if (_ack) { _deliverable(); } + + if (_ack) + _deliverable(); } void Signal_context::ack() { - if (_ack) { return; } + if (_ack) + return; + if (!_killed) { _ack = 1; _deliverable(); return; } + if (_killer) { _killer->_context = 0; _killer->_thread.signal_context_kill_done(); @@ -110,7 +122,9 @@ bool Signal_context::can_kill() const { /* check if in a kill operation or already killed */ if (_killed) { - if (_ack) { return true; } + if (_ack) + return true; + return false; } return true; @@ -120,14 +134,15 @@ bool Signal_context::can_kill() const void Signal_context::kill(Signal_context_killer &k) { /* check if in a kill operation or already killed */ - if (_killed) { + if (_killed) return; - } + /* kill directly if there is no unacknowledged delivery */ if (_ack) { _killed = 1; return; } + /* wait for delivery acknowledgement */ _killer = &k; _killed = 1; @@ -138,14 +153,17 @@ void Signal_context::kill(Signal_context_killer &k) Signal_context::~Signal_context() { - if (_killer) { _killer->_thread.signal_context_kill_failed(); } + if (_killer) + _killer->_thread.signal_context_kill_failed(); + _receiver._context_destructed(*this); } Signal_context::Signal_context(Signal_receiver & r, addr_t const imprint) -: _receiver(r), - _imprint(imprint) +: + _receiver(r), + _imprint(imprint) { r._add_context(*this); } @@ -157,9 +175,9 @@ Signal_context::Signal_context(Signal_receiver & r, addr_t const imprint) void Signal_receiver::_add_deliverable(Signal_context &c) { - if (!c._deliver_fe.enqueued()) { + if (!c._deliver_fe.enqueued()) _deliver.enqueue(c._deliver_fe); - } + _listen(); } @@ -169,7 +187,8 @@ void Signal_receiver::_listen() while (1) { /* check for deliverable signals and waiting handlers */ - if (_deliver.empty() || _handlers.empty()) { return; } + if (_deliver.empty() || _handlers.empty()) + return; /* create a signal data-object */ typedef Genode::Signal_context * Signal_imprint; @@ -196,7 +215,10 @@ void Signal_receiver::_listen() void Signal_receiver::_context_destructed(Signal_context &c) { _contexts.remove(c._contexts_fe); - if (!c._deliver_fe.enqueued()) { return; } + + if (!c._deliver_fe.enqueued()) + return; + _deliver.remove(c._deliver_fe); } @@ -211,14 +233,18 @@ void Signal_receiver::_add_context(Signal_context &c) { bool Signal_receiver::can_add_handler(Signal_handler const &h) const { - if (h._receiver) { return false; } + if (h._receiver) + return false; + return true; } void Signal_receiver::add_handler(Signal_handler &h) { - if (h._receiver) { return; } + if (h._receiver) + return; + _handlers.enqueue(h._handlers_fe); h._receiver = this; h._thread.signal_wait_for_signal(); diff --git a/repos/base-hw/src/core/kernel/signal_receiver.h b/repos/base-hw/src/core/kernel/signal_receiver.h index f66c649e7e..39f47a8d3a 100644 --- a/repos/base-hw/src/core/kernel/signal_receiver.h +++ b/repos/base-hw/src/core/kernel/signal_receiver.h @@ -21,8 +21,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + class Thread; /** @@ -77,6 +77,7 @@ class Kernel::Signal_handler void cancel_waiting(); }; + class Kernel::Signal_context_killer { friend class Signal_context; @@ -104,6 +105,7 @@ class Kernel::Signal_context_killer void cancel_waiting(); }; + class Kernel::Signal_context { friend class Signal_receiver; @@ -216,6 +218,7 @@ class Kernel::Signal_context Object &kernel_object() { return _kernel_object; } }; + class Kernel::Signal_receiver { friend class Signal_context; diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc index 944752d5e8..1c45c55566 100644 --- a/repos/base-hw/src/core/kernel/thread.cc +++ b/repos/base-hw/src/core/kernel/thread.cc @@ -114,7 +114,8 @@ void Thread::ipc_copy_msg(Thread &sender) Thread::Tlb_invalidation::Tlb_invalidation(Thread & caller, Pd & pd, addr_t addr, size_t size, unsigned cnt) -: caller(caller), pd(pd), addr(addr), size(size), cnt(cnt) +: + caller(caller), pd(pd), addr(addr), size(size), cnt(cnt) { cpu_pool().work_list().insert(&_le); caller._become_inactive(AWAITS_RESTART); @@ -122,7 +123,8 @@ Thread::Tlb_invalidation::Tlb_invalidation(Thread & caller, Pd & pd, Thread::Destroy::Destroy(Thread & caller, Genode::Kernel_object & to_delete) -: caller(caller), thread_to_destroy(to_delete) +: + caller(caller), thread_to_destroy(to_delete) { thread_to_destroy->_cpu->work_list().insert(&_le); caller._become_inactive(AWAITS_RESTART); @@ -229,6 +231,7 @@ void Thread::_deactivate_used_shares() thread._deactivate_used_shares(); }); } + void Thread::_activate_used_shares() { Cpu_job::_activate_own_share(); @@ -236,6 +239,7 @@ void Thread::_activate_used_shares() thread._activate_used_shares(); }); } + void Thread::_become_active() { if (_state != ACTIVE && !_paused) { _activate_used_shares(); } @@ -820,7 +824,8 @@ Thread::Thread(unsigned const priority, unsigned const quota, : Kernel::Object { *this }, Cpu_job(priority, quota), _ipc_node(*this), _state(AWAITS_START), - _label(label), _core(core), regs(core) { } + _label(label), _core(core), regs(core) +{ } Thread::~Thread() { _ipc_free_recv_caps(); } @@ -842,7 +847,8 @@ Genode::uint8_t __initial_stack_base[DEFAULT_STACK_SIZE]; *****************/ Core_thread::Core_thread() -: Core_object("core") +: + Core_object("core") { using namespace Genode; diff --git a/repos/base-hw/src/core/kernel/thread.h b/repos/base-hw/src/core/kernel/thread.h index 5f2f1218b9..a393f09e82 100644 --- a/repos/base-hw/src/core/kernel/thread.h +++ b/repos/base-hw/src/core/kernel/thread.h @@ -32,9 +32,7 @@ /* base-local includes */ #include - -namespace Kernel -{ +namespace Kernel { struct Thread_fault; class Thread; class Core_thread; @@ -114,8 +112,7 @@ class Kernel::Thread : private Kernel::Object, public Cpu_job, private Timeout enum { START_VERBOSE = 0 }; - enum State - { + enum State { ACTIVE = 1, AWAITS_START = 2, AWAITS_IPC = 3, diff --git a/repos/base-hw/src/core/kernel/timer.cc b/repos/base-hw/src/core/kernel/timer.cc index ffc1536268..cfb79a2468 100644 --- a/repos/base-hw/src/core/kernel/timer.cc +++ b/repos/base-hw/src/core/kernel/timer.cc @@ -24,7 +24,9 @@ void Timer::Irq::occurred() { _cpu.scheduler().timeout(); } Timer::Irq::Irq(unsigned id, Cpu &cpu) -: Kernel::Irq(id, cpu.irq_pool()), _cpu(cpu) {} +: + Kernel::Irq(id, cpu.irq_pool()), _cpu(cpu) +{ } time_t Timer::timeout_max_us() const @@ -39,10 +41,10 @@ void Timer::set_timeout(Timeout * const timeout, time_t const duration) * Remove timeout if it is already in use. Timeouts may get overridden as * result of an update. */ - if (timeout->_listed) { + if (timeout->_listed) _timeout_list.remove(timeout); - } else { - timeout->_listed = true; } + else + timeout->_listed = true; /* set timeout parameters */ timeout->_end = time() + duration; @@ -84,8 +86,12 @@ void Timer::process_timeouts() time_t t = time(); while (true) { Timeout * const timeout = _timeout_list.first(); - if (!timeout) { break; } - if (timeout->_end > t) { break; } + if (!timeout) + break; + + if (timeout->_end > t) + break; + _timeout_list.remove(timeout); timeout->_listed = false; timeout->timeout_triggered(); @@ -94,8 +100,9 @@ void Timer::process_timeouts() Timer::Timer(Cpu & cpu) -: _device(cpu.id()), _irq(interrupt_id(), cpu), - _last_timeout_duration(_max_value()) +: + _device(cpu.id()), _irq(interrupt_id(), cpu), + _last_timeout_duration(_max_value()) { /* * The timer frequency should allow a good accuracy on the smallest diff --git a/repos/base-hw/src/core/kernel/timer.h b/repos/base-hw/src/core/kernel/timer.h index 1f7348c757..50ed898b11 100644 --- a/repos/base-hw/src/core/kernel/timer.h +++ b/repos/base-hw/src/core/kernel/timer.h @@ -23,13 +23,13 @@ #include -namespace Kernel -{ +namespace Kernel { class Cpu; class Timeout; class Timer; } + /** * A timeout causes a kernel pass and the call of a timeout specific handle */ @@ -53,6 +53,7 @@ class Kernel::Timeout : Genode::List::Element virtual ~Timeout() { } }; + /** * A timer manages a continuous time and timeouts on it */ diff --git a/repos/base-hw/src/core/kernel/vm.h b/repos/base-hw/src/core/kernel/vm.h index 2e23731316..c428c0b839 100644 --- a/repos/base-hw/src/core/kernel/vm.h +++ b/repos/base-hw/src/core/kernel/vm.h @@ -24,8 +24,8 @@ namespace Genode { class Vm_state; } #include -namespace Kernel -{ +namespace Kernel { + /** * Kernel backend for a virtual machine */ @@ -128,7 +128,9 @@ class Kernel::Vm : private Kernel::Object, public Cpu_job void pause() { - if (_scheduled != INACTIVE) Cpu_job::_deactivate_own_share(); + if (_scheduled != INACTIVE) + Cpu_job::_deactivate_own_share(); + _scheduled = INACTIVE; } diff --git a/repos/base-hw/src/core/kernel_log.cc b/repos/base-hw/src/core/kernel_log.cc index 354fd5a672..712ec991ba 100644 --- a/repos/base-hw/src/core/kernel_log.cc +++ b/repos/base-hw/src/core/kernel_log.cc @@ -32,6 +32,9 @@ void Kernel::log(char const c) static Serial serial { Genode::Platform::mmio_to_virt(UART_BASE), UART_CLOCK, BAUD_RATE }; - if (c == ASCII_LINE_FEED) serial.put_char(ASCII_CARRIAGE_RETURN); + + if (c == ASCII_LINE_FEED) + serial.put_char(ASCII_CARRIAGE_RETURN); + serial.put_char(c); } diff --git a/repos/base-hw/src/core/native_pd_component.cc b/repos/base-hw/src/core/native_pd_component.cc index a8193b1e49..710c28d792 100644 --- a/repos/base-hw/src/core/native_pd_component.cc +++ b/repos/base-hw/src/core/native_pd_component.cc @@ -16,14 +16,22 @@ using namespace Genode; -void Native_pd_component::upgrade_cap_slab() { + +void Native_pd_component::upgrade_cap_slab() +{ _pd_session._pd->upgrade_slab(_pd_session._sliced_heap); - //throw Out_of_ram(); } Native_pd_component::Native_pd_component(Pd_session_component &pd, char const *) -: _pd_session(pd) { _pd_session._ep.manage(this); } +: + _pd_session(pd) +{ + _pd_session._ep.manage(this); +} -Native_pd_component::~Native_pd_component() { _pd_session._ep.dissolve(this); } +Native_pd_component::~Native_pd_component() +{ + _pd_session._ep.dissolve(this); +} diff --git a/repos/base-hw/src/core/native_utcb.cc b/repos/base-hw/src/core/native_utcb.cc index 54582c4498..ff48120683 100644 --- a/repos/base-hw/src/core/native_utcb.cc +++ b/repos/base-hw/src/core/native_utcb.cc @@ -16,6 +16,7 @@ #include + Genode::Native_utcb * Genode::utcb_main_thread() { return (Genode::Native_utcb*) Hw::Mm::core_utcb_main_thread().base; } diff --git a/repos/base-hw/src/core/object.h b/repos/base-hw/src/core/object.h index 9b5b397984..6b8c04d751 100644 --- a/repos/base-hw/src/core/object.h +++ b/repos/base-hw/src/core/object.h @@ -25,6 +25,7 @@ #include namespace Genode { + /** * Represents a kernel object in core * @@ -50,10 +51,12 @@ class Genode::Kernel_object : public Genode::Constructible Kernel_object(bool syscall, ARGS &&... args) - : _cap(Capability_space::import(syscall ? T::syscall_create(*this, args...) - : Kernel::cap_id_invalid())) + : + _cap(Capability_space::import(syscall ? T::syscall_create(*this, args...) + : Kernel::cap_id_invalid())) { - if (!syscall) Genode::Constructible>::construct(args...); + if (!syscall) + Genode::Constructible>::construct(args...); } ~Kernel_object() diff --git a/repos/base-hw/src/core/pager.cc b/repos/base-hw/src/core/pager.cc index 938423e210..5c012f9398 100644 --- a/repos/base-hw/src/core/pager.cc +++ b/repos/base-hw/src/core/pager.cc @@ -53,6 +53,7 @@ void Pager_object::wake_up() if (pt) pt->restart(); } + void Pager_object::start_paging(Kernel_object & receiver) { using Object = Kernel_object; @@ -62,8 +63,10 @@ void Pager_object::start_paging(Kernel_object & receive Entry::cap(Object::_cap); } + void Pager_object::exception_handler(Signal_context_capability) { } + void Pager_object::unresolved_page_fault_occurred() { Platform_thread * const pt = (Platform_thread *)badge(); @@ -72,6 +75,7 @@ void Pager_object::unresolved_page_fault_occurred() "' thread='", pt->label(), "' ", pt->fault_info()); } + void Pager_object::print(Output &out) const { Platform_thread * const pt = (Platform_thread *)badge(); @@ -80,6 +84,7 @@ void Pager_object::print(Output &out) const "' thread='", pt->label(), "'"); } + Pager_object::Pager_object(Cpu_session_capability cpu_session_cap, Thread_capability thread_cap, addr_t const badge, Affinity::Location, Session_label const &, @@ -106,7 +111,9 @@ Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &) Thread(Weight::DEFAULT_WEIGHT, "pager_ep", PAGER_EP_STACK_SIZE, Type::NORMAL), _kobj(true) -{ start(); } +{ + start(); +} Pager_capability Pager_entrypoint::manage(Pager_object &o) diff --git a/repos/base-hw/src/core/pager.h b/repos/base-hw/src/core/pager.h index 3f09cf9f7f..e7648bf89b 100644 --- a/repos/base-hw/src/core/pager.h +++ b/repos/base-hw/src/core/pager.h @@ -30,8 +30,8 @@ #include #include -namespace Genode -{ +namespace Genode { + /** * Interface used by generic region_map code */ @@ -67,10 +67,12 @@ struct Genode::Mapping : Hw::Mapping unsigned size_log2, bool writeable, bool executable) - : Hw::Mapping(phys, virt, 1 << size_log2, - { writeable ? Hw::RW : Hw::RO, - executable ? Hw::EXEC : Hw::NO_EXEC, Hw::USER, - Hw::NO_GLOBAL, io ? Hw::DEVICE : Hw::RAM, cacheable }) {} + : + Hw::Mapping(phys, virt, 1 << size_log2, + { writeable ? Hw::RW : Hw::RO, + executable ? Hw::EXEC : Hw::NO_EXEC, Hw::USER, + Hw::NO_GLOBAL, io ? Hw::DEVICE : Hw::RAM, cacheable }) + { } void prepare_map_operation() const {} }; diff --git a/repos/base-hw/src/core/platform.cc b/repos/base-hw/src/core/platform.cc index b100ce054a..0a15025c2d 100644 --- a/repos/base-hw/src/core/platform.cc +++ b/repos/base-hw/src/core/platform.cc @@ -44,12 +44,15 @@ using namespace Genode; 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); } + addr_t Platform::core_page_table() { return (addr_t)_boot_info().table; } + Hw::Page_table::Allocator & Platform::core_page_table_allocator() { using Allocator = Hw::Page_table::Allocator; @@ -59,6 +62,7 @@ Hw::Page_table::Allocator & Platform::core_page_table_allocator() virt_addr); } + void Platform::_init_io_mem_alloc() { /* add entire adress space minus the RAM memory regions */ diff --git a/repos/base-hw/src/core/platform.h b/repos/base-hw/src/core/platform.h index 4a8288f931..c10c8d8a10 100644 --- a/repos/base-hw/src/core/platform.h +++ b/repos/base-hw/src/core/platform.h @@ -41,6 +41,7 @@ namespace Genode { class Platform; }; + class Genode::Platform : public Genode::Platform_generic { private: diff --git a/repos/base-hw/src/core/platform_pd.cc b/repos/base-hw/src/core/platform_pd.cc index fcc3c22c7f..10f796b79d 100644 --- a/repos/base-hw/src/core/platform_pd.cc +++ b/repos/base-hw/src/core/platform_pd.cc @@ -29,8 +29,10 @@ using Hw::Page_table; ** Hw::Address_space implementation ** **************************************/ -Core_mem_allocator &Hw::Address_space::_cma() { - return static_cast(platform().core_mem_alloc()); } +Core_mem_allocator &Hw::Address_space::_cma() +{ + return static_cast(platform().core_mem_alloc()); +} void *Hw::Address_space::_table_alloc() @@ -90,19 +92,23 @@ void Hw::Address_space::flush(addr_t virt, size_t size, Core_local_addr) Hw::Address_space::Address_space(Page_table & tt, Page_table::Allocator & tt_alloc, Platform_pd & pd) -: _tt(tt), - _tt_phys(Platform::core_page_table()), - _tt_alloc(tt_alloc), - _kobj(false, *(Page_table*)translation_table_phys(), pd) {} +: + _tt(tt), + _tt_phys(Platform::core_page_table()), + _tt_alloc(tt_alloc), + _kobj(false, *(Page_table*)translation_table_phys(), pd) +{ } Hw::Address_space::Address_space(Platform_pd & pd) -: _tt(*construct_at(_table_alloc(), *((Page_table*)Hw::Mm::core_page_tables().base))), - _tt_phys((addr_t)_cma().phys_addr(&_tt)), - _tt_array(new (_cma()) Array([] (void * virt) { - return (addr_t)_cma().phys_addr(virt);})), - _tt_alloc(_tt_array->alloc()), - _kobj(true, *(Page_table*)translation_table_phys(), pd) { } +: + _tt(*construct_at(_table_alloc(), *((Page_table*)Hw::Mm::core_page_tables().base))), + _tt_phys((addr_t)_cma().phys_addr(&_tt)), + _tt_array(new (_cma()) Array([] (void * virt) { + return (addr_t)_cma().phys_addr(virt);})), + _tt_alloc(_tt_array->alloc()), + _kobj(true, *(Page_table*)translation_table_phys(), pd) +{ } Hw::Address_space::~Address_space() @@ -152,11 +158,14 @@ void Platform_pd::assign_parent(Native_capability parent) Platform_pd::Platform_pd(Page_table & tt, Page_table::Allocator & alloc) -: Hw::Address_space(tt, alloc, *this), _label("core") { } +: + Hw::Address_space(tt, alloc, *this), _label("core") +{ } Platform_pd::Platform_pd(Allocator &, char const *label) -: Hw::Address_space(*this), _label(label) +: + Hw::Address_space(*this), _label(label) { if (!_kobj.cap().valid()) { error("failed to create kernel object"); @@ -164,6 +173,7 @@ Platform_pd::Platform_pd(Allocator &, char const *label) } } + Platform_pd::~Platform_pd() { /* invalidate weak pointers to this object */ @@ -176,5 +186,7 @@ Platform_pd::~Platform_pd() *************************************/ Core_platform_pd::Core_platform_pd() -: Platform_pd(*(Hw::Page_table*)Hw::Mm::core_page_tables().base, - Platform::core_page_table_allocator()) { } +: + Platform_pd(*(Hw::Page_table*)Hw::Mm::core_page_tables().base, + Platform::core_page_table_allocator()) +{ } diff --git a/repos/base-hw/src/core/platform_pd.h b/repos/base-hw/src/core/platform_pd.h index aa7ecd6532..d15e869761 100644 --- a/repos/base-hw/src/core/platform_pd.h +++ b/repos/base-hw/src/core/platform_pd.h @@ -25,8 +25,8 @@ #include #include -namespace Hw -{ +namespace Hw { + using namespace Kernel; using namespace Genode; @@ -36,8 +36,9 @@ namespace Hw class Address_space; } -namespace Genode -{ + +namespace Genode { + class Platform_thread; /* forward declaration */ class Cap_space; @@ -72,11 +73,11 @@ class Hw::Address_space : public Genode::Address_space using Table = Hw::Page_table; using Array = Table::Allocator::Array; - Genode::Mutex _mutex { }; /* table lock */ - Table & _tt; /* table virt addr */ - Genode::addr_t _tt_phys; /* table phys addr */ - Array * _tt_array = nullptr; - Table::Allocator & _tt_alloc; /* table allocator */ + Genode::Mutex _mutex { }; /* table lock */ + Table &_tt; /* table virt addr */ + Genode::addr_t _tt_phys; /* table phys addr */ + Array *_tt_array = nullptr; + Table::Allocator &_tt_alloc; /* table allocator */ static inline Genode::Core_mem_allocator &_cma(); diff --git a/repos/base-hw/src/core/platform_thread.cc b/repos/base-hw/src/core/platform_thread.cc index 673546a8fd..82df2e1fd2 100644 --- a/repos/base-hw/src/core/platform_thread.cc +++ b/repos/base-hw/src/core/platform_thread.cc @@ -29,6 +29,7 @@ using namespace Genode; + void Platform_thread::_init() { } diff --git a/repos/base-hw/src/core/platform_thread.h b/repos/base-hw/src/core/platform_thread.h index 783b215229..698d34c600 100644 --- a/repos/base-hw/src/core/platform_thread.h +++ b/repos/base-hw/src/core/platform_thread.h @@ -38,12 +38,13 @@ namespace Genode { class Rm_client; class Platform_thread; class Platform_pd; +} + + +class Genode::Platform_thread : Noncopyable +{ + private: - /** - * Userland interface for the management of kernel thread-objects - */ - class Platform_thread : Noncopyable - { /* * Noncopyable */ @@ -92,137 +93,136 @@ namespace Genode { virt_prio); } - public: + public: - /** - * Constructor for core threads - * - * \param label debugging label - * \param utcb virtual address of UTCB within core - */ - Platform_thread(Label const &label, Native_utcb &utcb); + /** + * Constructor for core threads + * + * \param label debugging label + * \param utcb virtual address of UTCB within core + */ + Platform_thread(Label const &label, Native_utcb &utcb); - /** - * Constructor for threads outside of core - * - * \param quota CPU quota that shall be granted to the thread - * \param label debugging label - * \param virt_prio unscaled processor-scheduling priority - * \param utcb core local pointer to userland stack - */ - Platform_thread(size_t const quota, Label const &label, - unsigned const virt_prio, Affinity::Location, - addr_t const utcb); + /** + * Constructor for threads outside of core + * + * \param quota CPU quota that shall be granted to the thread + * \param label debugging label + * \param virt_prio unscaled processor-scheduling priority + * \param utcb core local pointer to userland stack + */ + Platform_thread(size_t const quota, Label const &label, + unsigned const virt_prio, Affinity::Location, + addr_t const utcb); - /** - * Destructor - */ - ~Platform_thread(); + /** + * Destructor + */ + ~Platform_thread(); - /** - * Return information about current fault - */ - Kernel::Thread_fault fault_info() { return _kobj->fault(); } + /** + * Return information about current fault + */ + Kernel::Thread_fault fault_info() { return _kobj->fault(); } - /** - * Join a protection domain - * - * \param pd platform pd object pointer - * \param main_thread wether thread is the first in protection domain - * \param address_space corresponding Genode address space - * - * This function has no effect when called more twice for a - * given thread. - */ - void join_pd(Platform_pd *const pd, bool const main_thread, - Weak_ptr address_space); + /** + * Join a protection domain + * + * \param pd platform pd object pointer + * \param main_thread wether thread is the first in protection domain + * \param address_space corresponding Genode address space + * + * This function has no effect when called more twice for a + * given thread. + */ + void join_pd(Platform_pd *const pd, bool const main_thread, + Weak_ptr address_space); - /** - * Run this thread - * - * \param ip initial instruction pointer - * \param sp initial stack pointer - */ - int start(void * const ip, void * const sp); + /** + * Run this thread + * + * \param ip initial instruction pointer + * \param sp initial stack pointer + */ + int start(void * const ip, void * const sp); - void restart(); + void restart(); - /** - * Pause this thread - */ - void pause() { Kernel::pause_thread(*_kobj); } + /** + * Pause this thread + */ + void pause() { Kernel::pause_thread(*_kobj); } - /** - * Enable/disable single stepping - */ - void single_step(bool) { } + /** + * Enable/disable single stepping + */ + void single_step(bool) { } - /** - * Resume this thread - */ - void resume() { Kernel::resume_thread(*_kobj); } + /** + * Resume this thread + */ + void resume() { Kernel::resume_thread(*_kobj); } - /** - * Set CPU quota of the thread to 'quota' - */ - void quota(size_t const quota); + /** + * Set CPU quota of the thread to 'quota' + */ + void quota(size_t const quota); - /** - * Get raw thread state - */ - Thread_state state(); + /** + * Get raw thread state + */ + Thread_state state(); - /** - * Override raw thread state - */ - void state(Thread_state s); + /** + * Override raw thread state + */ + void state(Thread_state s); - /** - * Return unique identification of this thread as faulter - */ - unsigned long pager_object_badge() { return (unsigned long)this; } + /** + * Return unique identification of this thread as faulter + */ + unsigned long pager_object_badge() { return (unsigned long)this; } - /** - * Set the executing CPU for this thread - * - * \param location targeted location in affinity space - */ - void affinity(Affinity::Location const & location); + /** + * Set the executing CPU for this thread + * + * \param location targeted location in affinity space + */ + void affinity(Affinity::Location const & location); - /** - * Get the executing CPU for this thread - */ - Affinity::Location affinity() const; + /** + * Get the executing CPU for this thread + */ + Affinity::Location affinity() const; - /** - * Return the address space to which the thread is bound - */ - Weak_ptr& address_space(); + /** + * Return the address space to which the thread is bound + */ + Weak_ptr& address_space(); - /** - * Return execution time consumed by the thread - */ - Trace::Execution_time execution_time() const - { - Genode::uint64_t execution_time = - const_cast(this)->_kobj->execution_time(); - return { execution_time, 0, _quota, _priority }; } + /** + * Return execution time consumed by the thread + */ + Trace::Execution_time execution_time() const + { + Genode::uint64_t execution_time = + const_cast(this)->_kobj->execution_time(); + return { execution_time, 0, _quota, _priority }; } - /*************** - ** Accessors ** - ***************/ + /*************** + ** Accessors ** + ***************/ - Label label() const { return _label; }; + Label label() const { return _label; }; - void pager(Pager_object &pager); + void pager(Pager_object &pager); - Pager_object &pager(); + Pager_object &pager(); - Platform_pd * pd() const { return _pd; } + Platform_pd * pd() const { return _pd; } - Ram_dataspace_capability utcb() const { return _utcb; } - }; -} + Ram_dataspace_capability utcb() const { return _utcb; } +}; #endif /* _CORE__PLATFORM_THREAD_H_ */ diff --git a/repos/base-hw/src/core/ram_dataspace_support.cc b/repos/base-hw/src/core/ram_dataspace_support.cc index fd06127ac6..7259d2ff9c 100644 --- a/repos/base-hw/src/core/ram_dataspace_support.cc +++ b/repos/base-hw/src/core/ram_dataspace_support.cc @@ -22,9 +22,13 @@ using namespace Genode; + void Ram_dataspace_factory::_export_ram_ds(Dataspace_component &) { } + + void Ram_dataspace_factory::_revoke_ram_ds(Dataspace_component &) { } + void Ram_dataspace_factory::_clear_ds (Dataspace_component &ds) { size_t page_rounded_size = (ds.size() + get_page_size() - 1) & get_page_mask(); diff --git a/repos/base-hw/src/core/region_map_support.cc b/repos/base-hw/src/core/region_map_support.cc index b045056cfc..7dcd7d8a45 100644 --- a/repos/base-hw/src/core/region_map_support.cc +++ b/repos/base-hw/src/core/region_map_support.cc @@ -31,8 +31,8 @@ void Pager_entrypoint::entry() { Untyped_capability cap; - while (1) - { + while (1) { + if (cap.valid()) Kernel::ack_signal(Capability_space::capid(cap)); /* receive fault */ diff --git a/repos/base-hw/src/core/signal_source_component.h b/repos/base-hw/src/core/signal_source_component.h index 103927fa50..f9cc6c6972 100644 --- a/repos/base-hw/src/core/signal_source_component.h +++ b/repos/base-hw/src/core/signal_source_component.h @@ -55,8 +55,9 @@ struct Genode::Signal_source_component : private Kernel_object(true), - Signal_source_pool::Entry(Kernel_object::cap()) + : + Kernel_object(true), + Signal_source_pool::Entry(Kernel_object::cap()) { } void submit(Signal_context_component *, unsigned long) { ASSERT_NEVER_CALLED; } diff --git a/repos/base-hw/src/core/spec/arm/bcm2835_pic.cc b/repos/base-hw/src/core/spec/arm/bcm2835_pic.cc index 5105a65eec..fbedcf214c 100644 --- a/repos/base-hw/src/core/spec/arm/bcm2835_pic.cc +++ b/repos/base-hw/src/core/spec/arm/bcm2835_pic.cc @@ -17,6 +17,7 @@ using namespace Genode; + bool Board::Pic::Usb_dwc_otg::_need_trigger_sof(uint32_t host_frame, uint32_t scheduled_frame) { @@ -37,7 +38,8 @@ bool Board::Pic::Usb_dwc_otg::_need_trigger_sof(uint32_t host_frame, Board::Pic::Usb_dwc_otg::Usb_dwc_otg() -: Mmio(Platform::mmio_to_virt(Board::USB_DWC_OTG_BASE)) +: + Mmio(Platform::mmio_to_virt(Board::USB_DWC_OTG_BASE)) { write(0); write(false); @@ -71,7 +73,11 @@ bool Board::Pic::Usb_dwc_otg::handle_sof() Board::Pic::Pic() -: Mmio(Platform::mmio_to_virt(Board::IRQ_CONTROLLER_BASE)) { mask(); } +: + Mmio(Platform::mmio_to_virt(Board::IRQ_CONTROLLER_BASE)) +{ + mask(); +} bool Board::Pic::take_request(unsigned &irq) diff --git a/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.cc b/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.cc index 5a1b1a6a41..b9650028f8 100644 --- a/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.cc +++ b/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.cc @@ -24,7 +24,9 @@ using Device = Board::Timer; Board::Timer::Timer(unsigned) -: Mmio(Platform::mmio_to_virt(Board::SYSTEM_TIMER_MMIO_BASE)) { } +: + Mmio(Platform::mmio_to_virt(Board::SYSTEM_TIMER_MMIO_BASE)) +{ } void Timer::_start_one_shot(time_t const ticks) diff --git a/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.h b/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.h index 78dac49ce0..3a70315375 100644 --- a/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.h +++ b/repos/base-hw/src/core/spec/arm/bcm2835_system_timer.h @@ -19,6 +19,7 @@ namespace Board { class Timer; } + /** * Timer driver for core * diff --git a/repos/base-hw/src/core/spec/arm/bcm2837_pic.cc b/repos/base-hw/src/core/spec/arm/bcm2837_pic.cc index 14418c6346..a013f42263 100644 --- a/repos/base-hw/src/core/spec/arm/bcm2837_pic.cc +++ b/repos/base-hw/src/core/spec/arm/bcm2837_pic.cc @@ -17,7 +17,9 @@ Board::Pic::Pic() -: Genode::Mmio(Genode::Platform::mmio_to_virt(Board::LOCAL_IRQ_CONTROLLER_BASE)) { } +: + Genode::Mmio(Genode::Platform::mmio_to_virt(Board::LOCAL_IRQ_CONTROLLER_BASE)) +{ } bool Board::Pic::take_request(unsigned & irq) diff --git a/repos/base-hw/src/core/spec/arm/bcm2837_pic.h b/repos/base-hw/src/core/spec/arm/bcm2837_pic.h index 64e6fe2dec..3454aa2ba5 100644 --- a/repos/base-hw/src/core/spec/arm/bcm2837_pic.h +++ b/repos/base-hw/src/core/spec/arm/bcm2837_pic.h @@ -18,6 +18,7 @@ namespace Board { class Pic; } + class Board::Pic : Genode::Mmio { public: @@ -29,7 +30,6 @@ class Board::Pic : Genode::Mmio private: - template struct Core_timer_irq_control : Register<0x40+CPU_NUM*0x4, 32> { diff --git a/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.cc b/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.cc index bf7736f525..5ad0ced3f4 100644 --- a/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.cc +++ b/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.cc @@ -33,7 +33,8 @@ enum { Board::Timer::Timer(unsigned) -: Mmio(Platform::mmio_to_virt(Board::Cpu_mmio::PRIVATE_TIMER_MMIO_BASE)) +: + Mmio(Platform::mmio_to_virt(Board::Cpu_mmio::PRIVATE_TIMER_MMIO_BASE)) { enum { PRESCALER = Board::CORTEX_A9_PRIVATE_TIMER_DIV - 1 }; diff --git a/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.h b/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.h index 2a5831aea5..45ca3d4768 100644 --- a/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.h +++ b/repos/base-hw/src/core/spec/arm/cortex_a9_private_timer.h @@ -19,6 +19,7 @@ namespace Board { class Timer; } + /** * Timer driver for core */ diff --git a/repos/base-hw/src/core/spec/arm/cpu.cc b/repos/base-hw/src/core/spec/arm/cpu.cc index 379260e877..7f71255193 100644 --- a/repos/base-hw/src/core/spec/arm/cpu.cc +++ b/repos/base-hw/src/core/spec/arm/cpu.cc @@ -21,6 +21,7 @@ using namespace Genode; + Arm_cpu::Context::Context(bool privileged) { using Psr = Arm_cpu::Psr; diff --git a/repos/base-hw/src/core/spec/arm/cpu_support.h b/repos/base-hw/src/core/spec/arm/cpu_support.h index 13a35d9965..c69e8f1d88 100644 --- a/repos/base-hw/src/core/spec/arm/cpu_support.h +++ b/repos/base-hw/src/core/spec/arm/cpu_support.h @@ -30,11 +30,13 @@ namespace Kernel { struct Thread_fault; } + namespace Genode { using sizet_arithm_t = Genode::uint64_t; struct Arm_cpu; } + struct Genode::Arm_cpu : public Hw::Arm_cpu { struct Fpu_context diff --git a/repos/base-hw/src/core/spec/arm/generic_timer.h b/repos/base-hw/src/core/spec/arm/generic_timer.h index b82d82137d..c06f18ee9c 100644 --- a/repos/base-hw/src/core/spec/arm/generic_timer.h +++ b/repos/base-hw/src/core/spec/arm/generic_timer.h @@ -19,6 +19,7 @@ namespace Board { class Timer; } + struct Board::Timer { unsigned long _freq(); diff --git a/repos/base-hw/src/core/spec/arm/gicv2.cc b/repos/base-hw/src/core/spec/arm/gicv2.cc index 311cfe7581..ff6ab9ff7b 100644 --- a/repos/base-hw/src/core/spec/arm/gicv2.cc +++ b/repos/base-hw/src/core/spec/arm/gicv2.cc @@ -17,8 +17,11 @@ using namespace Genode; + Hw::Gicv2::Gicv2() -: _distr(Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE)), - _cpui (Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE)), - _last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)), - _max_irq(_distr.max_irq()) { } +: + _distr(Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE)), + _cpui (Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_CPU_BASE)), + _last_iar(Cpu_interface::Iar::Irq_id::bits(spurious_id)), + _max_irq(_distr.max_irq()) +{ } diff --git a/repos/base-hw/src/core/spec/arm/gicv3.cc b/repos/base-hw/src/core/spec/arm/gicv3.cc index c0b2f284f5..6ca86a3842 100644 --- a/repos/base-hw/src/core/spec/arm/gicv3.cc +++ b/repos/base-hw/src/core/spec/arm/gicv3.cc @@ -17,17 +17,20 @@ using namespace Genode; + static inline Genode::addr_t redistributor_addr() { return Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_REDIST_BASE + (Cpu::executing_id() * 0x20000)); }; + Hw::Pic::Pic() -: _distr(Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE)), - _redistr(redistributor_addr()), - _redistr_sgi(redistributor_addr() + 0x10000), - _max_irq(_distr.max_irq()) +: + _distr(Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_DISTR_BASE)), + _redistr(redistributor_addr()), + _redistr_sgi(redistributor_addr() + 0x10000), + _max_irq(_distr.max_irq()) { _redistributor_init(); _cpui.init(); diff --git a/repos/base-hw/src/core/spec/arm/imx_epit.cc b/repos/base-hw/src/core/spec/arm/imx_epit.cc index 0a9be0a014..e226969be8 100644 --- a/repos/base-hw/src/core/spec/arm/imx_epit.cc +++ b/repos/base-hw/src/core/spec/arm/imx_epit.cc @@ -27,7 +27,8 @@ unsigned Timer::interrupt_id() const { return Board::EPIT_1_IRQ; } Board::Timer::Timer(unsigned) -: Mmio(Platform::mmio_to_virt(Board::EPIT_1_MMIO_BASE)) +: + Mmio(Platform::mmio_to_virt(Board::EPIT_1_MMIO_BASE)) { reset(); diff --git a/repos/base-hw/src/core/spec/arm/imx_epit.h b/repos/base-hw/src/core/spec/arm/imx_epit.h index b2c8f739bc..8a901dd29d 100644 --- a/repos/base-hw/src/core/spec/arm/imx_epit.h +++ b/repos/base-hw/src/core/spec/arm/imx_epit.h @@ -19,6 +19,7 @@ namespace Board { class Timer; } + /** * Timer driver for core */ diff --git a/repos/base-hw/src/core/spec/arm/imx_tzic.cc b/repos/base-hw/src/core/spec/arm/imx_tzic.cc index 46b8dde556..a0c9a2eade 100644 --- a/repos/base-hw/src/core/spec/arm/imx_tzic.cc +++ b/repos/base-hw/src/core/spec/arm/imx_tzic.cc @@ -17,4 +17,5 @@ using namespace Genode; + Hw::Pic::Pic() : Mmio(Platform::mmio_to_virt(Board::IRQ_CONTROLLER_BASE)) { } diff --git a/repos/base-hw/src/core/spec/arm/kernel/cpu.cc b/repos/base-hw/src/core/spec/arm/kernel/cpu.cc index cbaa57f0ea..f4f8edd2b1 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/cpu.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/cpu.cc @@ -16,6 +16,7 @@ #include #include + void Kernel::Cpu::_arch_init() { /* enable performance counter */ diff --git a/repos/base-hw/src/core/spec/arm/kernel/lock.cc b/repos/base-hw/src/core/spec/arm/kernel/lock.cc index 3b9f7635e0..ae59d9ba36 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/lock.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/lock.cc @@ -19,6 +19,7 @@ #include #include + Kernel::Lock & Kernel::data_lock() { static Kernel::Lock lock; diff --git a/repos/base-hw/src/core/spec/arm/kernel/pd.cc b/repos/base-hw/src/core/spec/arm/kernel/pd.cc index 3f3d233a59..867dc2d074 100644 --- a/repos/base-hw/src/core/spec/arm/kernel/pd.cc +++ b/repos/base-hw/src/core/spec/arm/kernel/pd.cc @@ -14,6 +14,7 @@ #include #include + bool Kernel::Pd::invalidate_tlb(Cpu & cpu, addr_t, size_t) { /* invalidate the TLB on the local CPU only */ diff --git a/repos/base-hw/src/core/spec/arm/platform_support.cc b/repos/base-hw/src/core/spec/arm/platform_support.cc index 495814e91c..5bef5904c3 100644 --- a/repos/base-hw/src/core/spec/arm/platform_support.cc +++ b/repos/base-hw/src/core/spec/arm/platform_support.cc @@ -16,12 +16,16 @@ using namespace Genode; + void Platform::_init_io_port_alloc() { }; + void Platform::_init_additional_platform_info(Genode::Xml_generator&) { } + long Platform::irq(long const user_irq) { return user_irq; } + bool Platform::get_msi_params(const addr_t /* mmconf */, addr_t & /* address */, addr_t & /* data */, unsigned & /* irq_number */) { diff --git a/repos/base-hw/src/core/spec/arm/trustzone_board.h b/repos/base-hw/src/core/spec/arm/trustzone_board.h index 6f589b4269..59f5bf595c 100644 --- a/repos/base-hw/src/core/spec/arm/trustzone_board.h +++ b/repos/base-hw/src/core/spec/arm/trustzone_board.h @@ -19,6 +19,7 @@ namespace Kernel { class Cpu; } namespace Board { + using Genode::Vm_state; enum { VCPU_MAX = 1 }; diff --git a/repos/base-hw/src/core/spec/arm/virtualization/board.h b/repos/base-hw/src/core/spec/arm/virtualization/board.h index 9c48030135..b9f1fd8a28 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/board.h +++ b/repos/base-hw/src/core/spec/arm/virtualization/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using Vm_page_table = Hw::Level_1_stage_2_translation_table; using Vm_page_table_array = Vm_page_table::Allocator::Array; @@ -28,11 +29,13 @@ namespace Board { using Vm_state = Genode::Vm_state; }; + namespace Kernel { class Cpu; class Vm; }; + struct Board::Vcpu_context { struct Vm_irq : Kernel::Irq diff --git a/repos/base-hw/src/core/spec/arm/virtualization/gicv2.cc b/repos/base-hw/src/core/spec/arm/virtualization/gicv2.cc index 9d3cb8fe22..39e7687c06 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/gicv2.cc +++ b/repos/base-hw/src/core/spec/arm/virtualization/gicv2.cc @@ -18,8 +18,11 @@ using Board::Pic; + Pic::Gich::Gich() -: Genode::Mmio(Genode::Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE)) { } +: + Genode::Mmio(Genode::Platform::mmio_to_virt(Board::Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_BASE)) +{ } bool Pic::ack_virtual_irq(Pic::Virtual_context & c) diff --git a/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h b/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h index 0302bf3348..9b6e84ead3 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h +++ b/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h @@ -18,6 +18,7 @@ namespace Board { class Pic; }; + class Board::Pic : public Hw::Pic { public: diff --git a/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc b/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc index 877ab64ba4..54c740bc99 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc +++ b/repos/base-hw/src/core/spec/arm/virtualization/platform_services.cc @@ -24,8 +24,10 @@ #include #include + extern Genode::addr_t hypervisor_exception_vector; + /* * Add ARM virtualization specific vm service */ diff --git a/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc b/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc index 3481024396..03c6a76993 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm/virtualization/vm_session_component.cc @@ -23,6 +23,7 @@ using namespace Genode; + static Core_mem_allocator & cma() { return static_cast(platform().core_mem_alloc()); } @@ -104,16 +105,17 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint &ds_ep, Region_map ®ion_map, unsigned, Trace::Source_registry &) -: Ram_quota_guard(resources.ram_quota), - Cap_quota_guard(resources.cap_quota), - _ep(ds_ep), - _constrained_md_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _sliced_heap(_constrained_md_ram_alloc, region_map), - _region_map(region_map), - _table(*construct_at(_alloc_table())), - _table_array(*(new (cma()) Board::Vm_page_table_array([] (void * virt) { - return (addr_t)cma().phys_addr(virt);}))), - _id({(unsigned)alloc().alloc(), cma().phys_addr(&_table)}) +: + Ram_quota_guard(resources.ram_quota), + Cap_quota_guard(resources.cap_quota), + _ep(ds_ep), + _constrained_md_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), + _sliced_heap(_constrained_md_ram_alloc, region_map), + _region_map(region_map), + _table(*construct_at(_alloc_table())), + _table_array(*(new (cma()) Board::Vm_page_table_array([] (void * virt) { + return (addr_t)cma().phys_addr(virt);}))), + _id({(unsigned)alloc().alloc(), cma().phys_addr(&_table)}) { /* configure managed VM area */ _map.add_range(0, 0UL - 0x1000); diff --git a/repos/base-hw/src/core/spec/arm_v6/cpu.h b/repos/base-hw/src/core/spec/arm_v6/cpu.h index eeb0f9187f..69c9776a82 100644 --- a/repos/base-hw/src/core/spec/arm_v6/cpu.h +++ b/repos/base-hw/src/core/spec/arm_v6/cpu.h @@ -20,6 +20,7 @@ namespace Genode { struct Cpu; } + struct Genode::Cpu : Arm_cpu { static inline void synchronization_barrier() {} diff --git a/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc b/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc index e8b0afe430..8f9515b288 100644 --- a/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc +++ b/repos/base-hw/src/core/spec/arm_v6/perf_counter.cc @@ -21,6 +21,7 @@ using namespace Genode; + /** * Performance Monitor Control Register */ diff --git a/repos/base-hw/src/core/spec/arm_v6/translation_table.h b/repos/base-hw/src/core/spec/arm_v6/translation_table.h index 300fd06571..8275337f11 100644 --- a/repos/base-hw/src/core/spec/arm_v6/translation_table.h +++ b/repos/base-hw/src/core/spec/arm_v6/translation_table.h @@ -19,11 +19,14 @@ #include #include + constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 0; } + constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; } + void Hw::Page_table::_table_changed(unsigned long addr, unsigned long size) { Genode::Arm_cpu::clean_data_cache_by_virt_region(addr, size); diff --git a/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc b/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc index 14c64eb956..85ed68bf62 100644 --- a/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc +++ b/repos/base-hw/src/core/spec/arm_v7/perf_counter.cc @@ -21,6 +21,7 @@ using namespace Genode; + /** * Performance Monitor Control Register */ diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc index cecf01d1a8..f343be265b 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/kernel/vm.cc @@ -24,12 +24,13 @@ Kernel::Vm::Vm(unsigned, Genode::Vm_state & state, Kernel::Signal_context & context, Identity & id) -: Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), - _state(state), - _context(context), - _id(id), - _vcpu_context(cpu_pool().primary_cpu()) +: + Kernel::Object { *this }, + Cpu_job(Cpu_priority::MIN, 0), + _state(state), + _context(context), + _id(id), + _vcpu_context(cpu_pool().primary_cpu()) { affinity(cpu_pool().primary_cpu()); } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc index b76e5972ae..1b3fa24c08 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/platform_services.cc @@ -23,8 +23,10 @@ #include #include + extern int monitor_mode_exception_vector; + /* * Add TrustZone specific vm service */ @@ -35,9 +37,12 @@ void Genode::platform_add_local_services(Rpc_entrypoint &ep, { static addr_t const phys_base = Platform::core_phys_addr((addr_t)&monitor_mode_exception_vector); + map_local(phys_base, Hw::Mm::system_exception_vector().base, 1, Hw::PAGE_FLAGS_KERN_TEXT); + static Vm_root vm_root(ep, sliced_heap, core_env().ram_allocator(), core_env().local_rm(), trace_sources); + static Core_service vm_service(local_services, vm_root); } diff --git a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc index dfc619ef26..f3a80a7735 100644 --- a/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc +++ b/repos/base-hw/src/core/spec/arm_v7/trustzone/vm_session_component.cc @@ -20,6 +20,7 @@ using namespace Genode; + static Board::Vm_page_table_array & dummy_array() { static Board::Vm_page_table_array a; @@ -58,15 +59,16 @@ Vm_session_component::Vm_session_component(Rpc_entrypoint &ep, Ram_allocator &ram_alloc, Region_map ®ion_map, unsigned, Trace::Source_registry &) -: Ram_quota_guard(resources.ram_quota), - Cap_quota_guard(resources.cap_quota), - _ep(ep), - _constrained_md_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), - _sliced_heap(_constrained_md_ram_alloc, region_map), - _region_map(region_map), - _table(*construct_at(_alloc_table())), - _table_array(dummy_array()), - _id({id_alloc++, nullptr}) +: + Ram_quota_guard(resources.ram_quota), + Cap_quota_guard(resources.cap_quota), + _ep(ep), + _constrained_md_ram_alloc(ram_alloc, _ram_quota_guard(), _cap_quota_guard()), + _sliced_heap(_constrained_md_ram_alloc, region_map), + _region_map(region_map), + _table(*construct_at(_alloc_table())), + _table_array(dummy_array()), + _id({id_alloc++, nullptr}) { if (_id.id) { error("Only one TrustZone VM available!"); diff --git a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc index e9e43c9cb4..fc2f45c0be 100644 --- a/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v7/virtualization/kernel/vm.cc @@ -19,8 +19,8 @@ #include #include -namespace Kernel -{ +namespace Kernel { + /** * ARM's virtual interrupt controller cpu interface */ @@ -39,7 +39,9 @@ namespace Kernel using namespace Kernel; -struct Host_context { + +struct Host_context +{ Cpu::Ttbr_64bit::access_t vttbr; Cpu::Hcr::access_t hcr; Cpu::Hstr::access_t hstr; @@ -54,6 +56,7 @@ struct Host_context { Cpu::Mair0::access_t mair0; Cpu::Dacr::access_t dacr; Cpu::Vmpidr::access_t vmpidr; + } vt_host_context; @@ -87,7 +90,8 @@ static Host_context & host_context(Cpu & cpu) Board::Vcpu_context::Vm_irq::Vm_irq(unsigned const irq, Cpu & cpu) -: Kernel::Irq(irq, cpu.irq_pool()) +: + Kernel::Irq(irq, cpu.irq_pool()) { } @@ -105,12 +109,18 @@ void Board::Vcpu_context::Vm_irq::occurred() Board::Vcpu_context::Pic_maintainance_irq::Pic_maintainance_irq(Cpu & cpu) -: Board::Vcpu_context::Vm_irq(Board::VT_MAINTAINANCE_IRQ, cpu) { +: + Board::Vcpu_context::Vm_irq(Board::VT_MAINTAINANCE_IRQ, cpu) +{ //FIXME Irq::enable only enables caller cpu - cpu.pic().unmask(_irq_nr, cpu.id()); } + cpu.pic().unmask(_irq_nr, cpu.id()); +} + Board::Vcpu_context::Virtual_timer_irq::Virtual_timer_irq(Cpu & cpu) -: irq(Board::VT_TIMER_IRQ, cpu) {} +: + irq(Board::VT_TIMER_IRQ, cpu) +{ } void Board::Vcpu_context::Virtual_timer_irq::enable() { irq.enable(); } @@ -128,12 +138,13 @@ Kernel::Vm::Vm(unsigned cpu, Genode::Vm_state & state, Kernel::Signal_context & context, Identity & id) -: Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), - _state(state), - _context(context), - _id(id), - _vcpu_context(cpu_pool().cpu(cpu)) +: + Kernel::Object { *this }, + Cpu_job(Cpu_priority::MIN, 0), + _state(state), + _context(context), + _id(id), + _vcpu_context(cpu_pool().cpu(cpu)) { affinity(cpu_pool().cpu(cpu)); } diff --git a/repos/base-hw/src/core/spec/arm_v8/cpu.cc b/repos/base-hw/src/core/spec/arm_v8/cpu.cc index 58c641fc9f..be92f665bf 100644 --- a/repos/base-hw/src/core/spec/arm_v8/cpu.cc +++ b/repos/base-hw/src/core/spec/arm_v8/cpu.cc @@ -57,12 +57,14 @@ void Genode::Cpu::mmu_fault(Genode::Cpu::Context &, using Asid_allocator = Genode::Bit_allocator<65536>; + static Asid_allocator &alloc() { return *unmanaged_singleton(); } Genode::Cpu::Mmu_context::Mmu_context(addr_t table) -: ttbr(Ttbr::Baddr::masked(table)) +: + ttbr(Ttbr::Baddr::masked(table)) { Ttbr::Asid::set(ttbr, (Genode::uint16_t)alloc().alloc()); } diff --git a/repos/base-hw/src/core/spec/arm_v8/cpu.h b/repos/base-hw/src/core/spec/arm_v8/cpu.h index e3b114cccc..2a7167a401 100644 --- a/repos/base-hw/src/core/spec/arm_v8/cpu.h +++ b/repos/base-hw/src/core/spec/arm_v8/cpu.h @@ -22,12 +22,15 @@ namespace Kernel { struct Thread_fault; } + namespace Genode { + struct Cpu; using sizet_arithm_t = __uint128_t; using uint128_t = __uint128_t; } + struct Genode::Cpu : Hw::Arm_64_cpu { enum Exception_entry { diff --git a/repos/base-hw/src/core/spec/arm_v8/kernel/cpu.cc b/repos/base-hw/src/core/spec/arm_v8/kernel/cpu.cc index 6954642b08..c9751ade8f 100644 --- a/repos/base-hw/src/core/spec/arm_v8/kernel/cpu.cc +++ b/repos/base-hw/src/core/spec/arm_v8/kernel/cpu.cc @@ -14,6 +14,7 @@ /* core includes */ #include + void Kernel::Cpu::_arch_init() { /* enable timer interrupt */ diff --git a/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc b/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc index 32530b33f8..6be51d226d 100644 --- a/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/arm_v8/kernel/thread.cc @@ -24,6 +24,7 @@ extern "C" void kernel_to_user_context_switch(void *, void *); using namespace Kernel; + void Thread::exception(Cpu & cpu) { switch (regs->exception_type) { diff --git a/repos/base-hw/src/core/spec/arm_v8/pd_session_support.cc b/repos/base-hw/src/core/spec/arm_v8/pd_session_support.cc index 6341934027..d204a82e47 100644 --- a/repos/base-hw/src/core/spec/arm_v8/pd_session_support.cc +++ b/repos/base-hw/src/core/spec/arm_v8/pd_session_support.cc @@ -18,6 +18,7 @@ using namespace Genode; using State = Genode::Pd_session::Managing_system_state; + State Pd_session_component::managing_system(State const & s) { State ret; @@ -32,5 +33,6 @@ State Pd_session_component::managing_system(State const & s) bool Pd_session_component::assign_pci(addr_t, uint16_t) { return true; } + void Pd_session_component::map(addr_t, addr_t) { } diff --git a/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc b/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc index 9d646ee735..0a3d96b1d2 100644 --- a/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc +++ b/repos/base-hw/src/core/spec/arm_v8/virtualization/kernel/vm.cc @@ -35,6 +35,7 @@ extern "C" void hypervisor_enter_vm(addr_t vm, addr_t host, static Genode::Vm_state & host_context(Cpu & cpu) { static Genode::Constructible host_context[NR_OF_CPUS]; + if (!host_context[cpu.id()].constructed()) { host_context[cpu.id()].construct(); Genode::Vm_state & c = *host_context[cpu.id()]; @@ -64,7 +65,8 @@ static Genode::Vm_state & host_context(Cpu & cpu) Board::Vcpu_context::Vm_irq::Vm_irq(unsigned const irq, Cpu & cpu) -: Kernel::Irq(irq, cpu.irq_pool()) +: + Kernel::Irq(irq, cpu.irq_pool()) { } @@ -82,12 +84,18 @@ void Board::Vcpu_context::Vm_irq::occurred() Board::Vcpu_context::Pic_maintainance_irq::Pic_maintainance_irq(Cpu & cpu) -: Board::Vcpu_context::Vm_irq(Board::VT_MAINTAINANCE_IRQ, cpu) { +: + Board::Vcpu_context::Vm_irq(Board::VT_MAINTAINANCE_IRQ, cpu) +{ //FIXME Irq::enable only enables caller cpu - cpu.pic().unmask(_irq_nr, cpu.id()); } + cpu.pic().unmask(_irq_nr, cpu.id()); +} + Board::Vcpu_context::Virtual_timer_irq::Virtual_timer_irq(Cpu & cpu) -: irq(Board::VT_TIMER_IRQ, cpu) {} +: + irq(Board::VT_TIMER_IRQ, cpu) +{ } void Board::Vcpu_context::Virtual_timer_irq::enable() { irq.enable(); } @@ -105,12 +113,13 @@ Vm::Vm(unsigned cpu, Genode::Vm_state & state, Kernel::Signal_context & context, Identity & id) -: Kernel::Object { *this }, - Cpu_job(Cpu_priority::MIN, 0), - _state(state), - _context(context), - _id(id), - _vcpu_context(cpu_pool().cpu(cpu)) +: + Kernel::Object { *this }, + Cpu_job(Cpu_priority::MIN, 0), + _state(state), + _context(context), + _id(id), + _vcpu_context(cpu_pool().cpu(cpu)) { affinity(cpu_pool().cpu(cpu)); @@ -189,6 +198,7 @@ void Vm::proceed(Cpu & cpu) hypervisor_enter_vm(guest, host, pic, vttbr_el2); } + void Vm::inject_irq(unsigned irq) { _state.irqs.last_irq = irq; diff --git a/repos/base-hw/src/core/spec/cortex_a15/cpu.cc b/repos/base-hw/src/core/spec/cortex_a15/cpu.cc index 406bad71c9..01e619a7bc 100644 --- a/repos/base-hw/src/core/spec/cortex_a15/cpu.cc +++ b/repos/base-hw/src/core/spec/cortex_a15/cpu.cc @@ -19,13 +19,17 @@ using Asid_allocator = Genode::Bit_allocator<256>; + static Asid_allocator &alloc() { return *unmanaged_singleton(); } Genode::Cpu::Mmu_context::Mmu_context(addr_t table) -: ttbr0(Ttbr_64bit::Ba::masked((Ttbr_64bit::access_t)table)) { - Ttbr_64bit::Asid::set(ttbr0, (Genode::uint8_t)alloc().alloc()); } +: + ttbr0(Ttbr_64bit::Ba::masked((Ttbr_64bit::access_t)table)) +{ + Ttbr_64bit::Asid::set(ttbr0, (Genode::uint8_t)alloc().alloc()); +} Genode::Cpu::Mmu_context::~Mmu_context() diff --git a/repos/base-hw/src/core/spec/cortex_a8/translation_table.h b/repos/base-hw/src/core/spec/cortex_a8/translation_table.h index 16ccccca57..b7b7043280 100644 --- a/repos/base-hw/src/core/spec/cortex_a8/translation_table.h +++ b/repos/base-hw/src/core/spec/cortex_a8/translation_table.h @@ -20,11 +20,14 @@ #include + constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 2; } + constexpr bool Hw::Page_table::Descriptor_base::_smp() { return false; } + void Hw::Page_table::_table_changed(unsigned long addr, unsigned long size) { /* diff --git a/repos/base-hw/src/core/spec/cortex_a9/board.cc b/repos/base-hw/src/core/spec/cortex_a9/board.cc index 20ee1dfc1d..c0dcf9b7dd 100644 --- a/repos/base-hw/src/core/spec/cortex_a9/board.cc +++ b/repos/base-hw/src/core/spec/cortex_a9/board.cc @@ -14,6 +14,7 @@ #include #include + Board::L2_cache & Board::l2_cache() { using namespace Genode; diff --git a/repos/base-hw/src/core/spec/cortex_a9/cpu.h b/repos/base-hw/src/core/spec/cortex_a9/cpu.h index ec508b6ef8..4f86aedd5c 100644 --- a/repos/base-hw/src/core/spec/cortex_a9/cpu.h +++ b/repos/base-hw/src/core/spec/cortex_a9/cpu.h @@ -21,6 +21,7 @@ namespace Genode { struct Cpu; } + struct Genode::Cpu : Arm_v7_cpu { /** diff --git a/repos/base-hw/src/core/spec/cortex_a9/translation_table.h b/repos/base-hw/src/core/spec/cortex_a9/translation_table.h index 89d97b8340..14201acffc 100644 --- a/repos/base-hw/src/core/spec/cortex_a9/translation_table.h +++ b/repos/base-hw/src/core/spec/cortex_a9/translation_table.h @@ -17,11 +17,14 @@ #include + constexpr unsigned Hw::Page_table::Descriptor_base::_device_tex() { return 2; } + constexpr bool Hw::Page_table::Descriptor_base::_smp() { return true; } + void Hw::Page_table::_table_changed(unsigned long, unsigned long) { } #endif /* _CORE__SPEC__CORTEX_A9__TRANSLATION_TABLE_H_ */ diff --git a/repos/base-hw/src/core/spec/riscv/cpu.h b/repos/base-hw/src/core/spec/riscv/cpu.h index d85ce509da..c00b94e3fe 100644 --- a/repos/base-hw/src/core/spec/riscv/cpu.h +++ b/repos/base-hw/src/core/spec/riscv/cpu.h @@ -26,8 +26,9 @@ namespace Kernel { struct Thread_fault; } -namespace Genode -{ + +namespace Genode { + /** * CPU driver for core */ @@ -36,8 +37,10 @@ namespace Genode typedef __uint128_t sizet_arithm_t; } + namespace Kernel { class Pd; } + class Genode::Cpu : public Hw::Riscv_cpu { public: diff --git a/repos/base-hw/src/core/spec/riscv/kernel/cpu.cc b/repos/base-hw/src/core/spec/riscv/kernel/cpu.cc index f06ad0c93c..e22f18f3e3 100644 --- a/repos/base-hw/src/core/spec/riscv/kernel/cpu.cc +++ b/repos/base-hw/src/core/spec/riscv/kernel/cpu.cc @@ -15,5 +15,6 @@ #include #include + void Kernel::Cpu::_arch_init() { Stvec::write(Hw::Mm::supervisor_exception_vector().base); } diff --git a/repos/base-hw/src/core/spec/riscv/kernel/pd.cc b/repos/base-hw/src/core/spec/riscv/kernel/pd.cc index a9d03b2248..8f7d00d38f 100644 --- a/repos/base-hw/src/core/spec/riscv/kernel/pd.cc +++ b/repos/base-hw/src/core/spec/riscv/kernel/pd.cc @@ -13,6 +13,7 @@ #include + bool Kernel::Pd::invalidate_tlb(Kernel::Cpu&, addr_t, size_t) { Genode::Cpu::sfence(); diff --git a/repos/base-hw/src/core/spec/riscv/kernel/thread.cc b/repos/base-hw/src/core/spec/riscv/kernel/thread.cc index 6024a7bb1f..c0cdf8fc87 100644 --- a/repos/base-hw/src/core/spec/riscv/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/riscv/kernel/thread.cc @@ -18,6 +18,7 @@ using namespace Kernel; + void Thread::Tlb_invalidation::execute() {} diff --git a/repos/base-hw/src/core/spec/riscv/pic.h b/repos/base-hw/src/core/spec/riscv/pic.h index 4d3497f7e4..58e72ea4a2 100644 --- a/repos/base-hw/src/core/spec/riscv/pic.h +++ b/repos/base-hw/src/core/spec/riscv/pic.h @@ -18,6 +18,7 @@ namespace Board { class Pic; } + /** * Dummy PIC driver for core */ diff --git a/repos/base-hw/src/core/spec/riscv/platform_support.cc b/repos/base-hw/src/core/spec/riscv/platform_support.cc index b64d2d97b0..4e1d0e9f7a 100644 --- a/repos/base-hw/src/core/spec/riscv/platform_support.cc +++ b/repos/base-hw/src/core/spec/riscv/platform_support.cc @@ -23,10 +23,13 @@ using namespace Genode; void Platform::_init_io_port_alloc() { } + void Platform::_init_additional_platform_info(Genode::Xml_generator&) { } + long Platform::irq(long const /* user_irq */) { return 0; } + bool Platform::get_msi_params(addr_t /* mmconf */, addr_t & /* address */, addr_t & /* data */, unsigned & /* irq_number */) { return false; } diff --git a/repos/base-hw/src/core/spec/riscv/timer.cc b/repos/base-hw/src/core/spec/riscv/timer.cc index 97711c2ad2..4b026c2612 100644 --- a/repos/base-hw/src/core/spec/riscv/timer.cc +++ b/repos/base-hw/src/core/spec/riscv/timer.cc @@ -26,8 +26,10 @@ Board::Timer::Timer(unsigned) asm volatile ("csrs sie, %0" : : "r"(STIE)); } + time_t Board::Timer::stime() const { return Hw::get_sys_timer(); } + void Timer::_start_one_shot(time_t const ticks) { _device.timeout = _device.stime() + ticks; @@ -43,8 +45,7 @@ time_t Timer::us_to_ticks(time_t const us) const { return us * Board::Timer::TICS_PER_MS; } -time_t Timer::_max_value() const { - return 0xffffffff; } +time_t Timer::_max_value() const { return 0xffffffff; } time_t Timer::_duration() const diff --git a/repos/base-hw/src/core/spec/x86_64/bios_data_area.cc b/repos/base-hw/src/core/spec/x86_64/bios_data_area.cc index 7f35bc5c4f..79ca36d108 100644 --- a/repos/base-hw/src/core/spec/x86_64/bios_data_area.cc +++ b/repos/base-hw/src/core/spec/x86_64/bios_data_area.cc @@ -17,4 +17,5 @@ using namespace Genode; + addr_t Bios_data_area::_mmio_base_virt() { return Platform::mmio_to_virt(0); } diff --git a/repos/base-hw/src/core/spec/x86_64/board.h b/repos/base-hw/src/core/spec/x86_64/board.h index 26562c0608..6a59f694a2 100644 --- a/repos/base-hw/src/core/spec/x86_64/board.h +++ b/repos/base-hw/src/core/spec/x86_64/board.h @@ -19,6 +19,7 @@ #include namespace Board { + using namespace Hw::Pc_board; enum { diff --git a/repos/base-hw/src/core/spec/x86_64/cpu.cc b/repos/base-hw/src/core/spec/x86_64/cpu.cc index 667a604a3e..0f6eea19f0 100644 --- a/repos/base-hw/src/core/spec/x86_64/cpu.cc +++ b/repos/base-hw/src/core/spec/x86_64/cpu.cc @@ -19,6 +19,7 @@ extern int __idt; extern int __idt_end; + /** * Pseudo Descriptor * @@ -43,7 +44,7 @@ Genode::Cpu::Context::Context(bool core) Genode::Cpu::Mmu_context::Mmu_context(addr_t const table) -: cr3(Cr3::Pdb::masked(table)) {} +: cr3(Cr3::Pdb::masked(table)) { } void Genode::Cpu::Tss::init() diff --git a/repos/base-hw/src/core/spec/x86_64/cpu.h b/repos/base-hw/src/core/spec/x86_64/cpu.h index 62e6451177..aae870cb83 100644 --- a/repos/base-hw/src/core/spec/x86_64/cpu.h +++ b/repos/base-hw/src/core/spec/x86_64/cpu.h @@ -33,7 +33,9 @@ namespace Kernel { struct Thread_fault; } + namespace Genode { + class Cpu; using sizet_arithm_t = __uint128_t; } @@ -41,8 +43,6 @@ namespace Genode { class Genode::Cpu : public Hw::X86_64_cpu { - protected: - public: /** diff --git a/repos/base-hw/src/core/spec/x86_64/fpu.h b/repos/base-hw/src/core/spec/x86_64/fpu.h index 6f5ab8a0fd..b3bf484f95 100644 --- a/repos/base-hw/src/core/spec/x86_64/fpu.h +++ b/repos/base-hw/src/core/spec/x86_64/fpu.h @@ -21,6 +21,7 @@ namespace Genode { class Fpu_context; } + class Genode::Fpu_context { addr_t _fxsave_addr { 0 }; diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc b/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc index 07d686da59..1aa3681990 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/cpu.cc @@ -16,6 +16,7 @@ #include #include + void Kernel::Cpu::_arch_init() { gdt.init((addr_t)&tss); diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc index ab03d55af0..8a8857a87b 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread.cc @@ -18,6 +18,7 @@ #include #include + void Kernel::Thread::Tlb_invalidation::execute() { /* invalidate cpu-local TLB */ diff --git a/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc b/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc index aedb2320a0..b16371d3ac 100644 --- a/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc +++ b/repos/base-hw/src/core/spec/x86_64/kernel/thread_exception.cc @@ -19,27 +19,33 @@ using namespace Kernel; + void Thread::exception(Cpu & cpu) { using Genode::Cpu_state; switch (regs->trapno) { + case Cpu_state::PAGE_FAULT: _mmu_exception(); return; + case Cpu_state::UNDEFINED_INSTRUCTION: Genode::raw(*this, ": undefined instruction at ip=", (void*)regs->ip); _die(); return; + case Cpu_state::SUPERVISOR_CALL: _call(); return; } + if (regs->trapno >= Cpu_state::INTERRUPTS_START && regs->trapno <= Cpu_state::INTERRUPTS_END) { _interrupt(cpu.id()); return; } + Genode::raw(*this, ": triggered unknown exception ", regs->trapno, " with error code ", regs->errcode, " at ip=", (void*)regs->ip, " sp=", (void*)regs->sp); diff --git a/repos/base-hw/src/core/spec/x86_64/pic.cc b/repos/base-hw/src/core/spec/x86_64/pic.cc index 9affd139fa..4d011de116 100644 --- a/repos/base-hw/src/core/spec/x86_64/pic.cc +++ b/repos/base-hw/src/core/spec/x86_64/pic.cc @@ -24,8 +24,10 @@ using namespace Genode; using namespace Board; + uint8_t Pic::lapic_ids[NR_OF_CPUS]; + enum { PIC_CMD_MASTER = 0x20, PIC_CMD_SLAVE = 0xa0, @@ -33,7 +35,10 @@ enum { PIC_DATA_SLAVE = 0xa1, }; -Pic::Pic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base())) + +Pic::Pic() +: + Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base())) { /* Start initialization sequence in cascade mode */ outb(PIC_CMD_MASTER, 0x11); @@ -62,6 +67,7 @@ Pic::Pic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base())) write(1); } + bool Pic::take_request(unsigned &irq) { irq = get_lowest_bit(); @@ -73,27 +79,32 @@ bool Pic::take_request(unsigned &irq) return true; } + void Pic::finish_request() { write(0); } + void Pic::unmask(unsigned const i, unsigned) { ioapic.toggle_mask(i, false); } + void Pic::mask(unsigned const i) { ioapic.toggle_mask(i, true); } + void Pic::irq_mode(unsigned irq_number, unsigned trigger, unsigned polarity) { ioapic.irq_mode(irq_number, trigger, polarity); } + inline unsigned Pic::get_lowest_bit(void) { unsigned bit, vec_base = 0; @@ -108,8 +119,9 @@ inline unsigned Pic::get_lowest_bit(void) return 0; } -void Pic::send_ipi(unsigned const cpu_id) { +void Pic::send_ipi(unsigned const cpu_id) +{ while (read()) asm volatile("pause" : : : "memory"); @@ -124,13 +136,15 @@ void Pic::send_ipi(unsigned const cpu_id) { /* program */ write(icr_high); write(icr_low); - } + Ioapic::Irq_mode Ioapic::_irq_mode[IRQ_COUNT]; + enum { REMAP_BASE = Board::VECTOR_REMAP_BASE }; + void Ioapic::irq_mode(unsigned irq_number, unsigned trigger, unsigned polarity) { @@ -198,7 +212,9 @@ Irte::access_t Ioapic::_create_irt_entry(unsigned const irq) } -Ioapic::Ioapic() : Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::MMIO_IOAPIC_BASE)) +Ioapic::Ioapic() +: + Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::MMIO_IOAPIC_BASE)) { write(IOAPICVER); _irte_count = read() + 1; @@ -231,9 +247,8 @@ void Ioapic::toggle_mask(unsigned const vector, bool const set) /* * Ignore toggle requests for vectors not handled by the I/O APIC. */ - if (vector < REMAP_BASE || vector >= REMAP_BASE + _irte_count) { + if (vector < REMAP_BASE || vector >= REMAP_BASE + _irte_count) return; - } const unsigned irq = vector - REMAP_BASE; @@ -245,7 +260,8 @@ void Ioapic::toggle_mask(unsigned const vector, bool const set) * flag and edge-triggered interrupts or: * http://yarchive.net/comp/linux/edge_triggered_interrupts.html */ - if (_edge_triggered(irq) && set) { return; } + if (_edge_triggered(irq) && set) + return; write(IOREDTBL + (2 * irq)); Irte::access_t irte = read(); diff --git a/repos/base-hw/src/core/spec/x86_64/pic.h b/repos/base-hw/src/core/spec/x86_64/pic.h index 3e0f191288..c3eb7d1ec2 100644 --- a/repos/base-hw/src/core/spec/x86_64/pic.h +++ b/repos/base-hw/src/core/spec/x86_64/pic.h @@ -21,8 +21,8 @@ /* core includes */ #include -namespace Board -{ +namespace Board { + /* * Redirection table entry */ @@ -41,6 +41,7 @@ namespace Board enum { IRQ_COUNT = 256 }; } + struct Board::Irte : Genode::Register<64> { struct Pol : Bitfield<13, 1> { }; @@ -48,6 +49,7 @@ struct Board::Irte : Genode::Register<64> struct Mask : Bitfield<16, 1> { }; }; + class Board::Ioapic : public Genode::Mmio { private: @@ -133,6 +135,7 @@ class Board::Ioapic : public Genode::Mmio }; }; + class Board::Pic : public Genode::Mmio { private: @@ -158,12 +161,15 @@ class Board::Pic : public Genode::Mmio /* * Interrupt control register */ - struct Icr_low : Register<0x300, 32, true> { + struct Icr_low : Register<0x300, 32, true> + { struct Vector : Bitfield< 0, 8> { }; struct Delivery_status : Bitfield<12, 1> { }; struct Level_assert : Bitfield<14, 1> { }; }; - struct Icr_high : Register<0x310, 32, true> { + + struct Icr_high : Register<0x310, 32, true> + { struct Destination : Bitfield<24, 8> { }; }; diff --git a/repos/base-hw/src/core/spec/x86_64/pit.cc b/repos/base-hw/src/core/spec/x86_64/pit.cc index aa1c5673bf..d52a75edb6 100644 --- a/repos/base-hw/src/core/spec/x86_64/pit.cc +++ b/repos/base-hw/src/core/spec/x86_64/pit.cc @@ -54,7 +54,8 @@ uint32_t Board::Timer::pit_calc_timer_freq(void) Board::Timer::Timer(unsigned) -: Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base())) +: + Mmio(Platform::mmio_to_virt(Hw::Cpu_memory_map::lapic_phys_base())) { /* Enable LAPIC timer in one-shot mode */ write(Board::TIMER_VECTOR_KERNEL); diff --git a/repos/base-hw/src/core/spec/x86_64/pit.h b/repos/base-hw/src/core/spec/x86_64/pit.h index 21f2886ada..c08094ea1e 100644 --- a/repos/base-hw/src/core/spec/x86_64/pit.h +++ b/repos/base-hw/src/core/spec/x86_64/pit.h @@ -25,6 +25,7 @@ namespace Board { class Timer; } + /** * LAPIC-based timer driver for core */ @@ -49,6 +50,7 @@ struct Board::Timer: Genode::Mmio struct Mask : Bitfield<16, 1> { }; struct Timer_mode : Bitfield<17, 2> { }; }; + struct Tmr_initial : Register <0x380, 32> { }; struct Tmr_current : Register <0x390, 32> { }; 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 7f5e805c26..70bdf6a40d 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 @@ -18,6 +18,7 @@ using namespace Genode; + void Platform::_init_additional_platform_info(Xml_generator &xml) { if (_boot_info().plat_info.efi_system_table != 0) { @@ -64,4 +65,6 @@ bool Platform::get_msi_params(addr_t, addr_t &, addr_t &, unsigned &) { Board::Serial::Serial(addr_t, size_t, unsigned baudrate) -:X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate) {} +: + X86_uart(Bios_data_area::singleton()->serial_port(), 0, baudrate) +{ } diff --git a/repos/base-hw/src/core/spec/x86_64/platform_support_common.cc b/repos/base-hw/src/core/spec/x86_64/platform_support_common.cc index c4128ba27e..e3fe495a18 100644 --- a/repos/base-hw/src/core/spec/x86_64/platform_support_common.cc +++ b/repos/base-hw/src/core/spec/x86_64/platform_support_common.cc @@ -19,6 +19,7 @@ using namespace Genode; + void Platform::_init_io_port_alloc() { _io_port_alloc.add_range(0, 0x10000); @@ -28,6 +29,8 @@ void Platform::_init_io_port_alloc() long Platform::irq(long const user_irq) { /* remap IRQ requests to fit I/O APIC configuration */ - if (user_irq) return user_irq + Board::VECTOR_REMAP_BASE; + if (user_irq) + return user_irq + Board::VECTOR_REMAP_BASE; + return Board::TIMER_VECTOR_USER; } diff --git a/repos/base-hw/src/core/spec/x86_64/port_io.h b/repos/base-hw/src/core/spec/x86_64/port_io.h index 921984edd9..10798a8650 100644 --- a/repos/base-hw/src/core/spec/x86_64/port_io.h +++ b/repos/base-hw/src/core/spec/x86_64/port_io.h @@ -16,8 +16,8 @@ #include -namespace Genode -{ +namespace Genode { + /** * Read byte from I/O port */ diff --git a/repos/base-hw/src/core/util.h b/repos/base-hw/src/core/util.h index 3f8f1e8a3f..78e1a3f4b4 100644 --- a/repos/base-hw/src/core/util.h +++ b/repos/base-hw/src/core/util.h @@ -17,8 +17,8 @@ #include -namespace Genode -{ +namespace Genode { + using Hw::get_page_mask; using Hw::trunc_page; using Hw::round_page; diff --git a/repos/base-hw/src/core/vm_session_component.cc b/repos/base-hw/src/core/vm_session_component.cc index a4d159e476..0f51ee5a67 100644 --- a/repos/base-hw/src/core/vm_session_component.cc +++ b/repos/base-hw/src/core/vm_session_component.cc @@ -23,6 +23,7 @@ using namespace Genode; + size_t Vm_session_component::_ds_size() { return align_addr(sizeof(Board::Vm_state), get_page_size_log2()); } diff --git a/repos/base-hw/src/core/vm_session_component.h b/repos/base-hw/src/core/vm_session_component.h index 3477267af5..6a1c7c9325 100644 --- a/repos/base-hw/src/core/vm_session_component.h +++ b/repos/base-hw/src/core/vm_session_component.h @@ -29,9 +29,8 @@ #include -namespace Genode { - class Vm_session_component; -} +namespace Genode { class Vm_session_component; } + class Genode::Vm_session_component : diff --git a/repos/base-hw/src/include/base/internal/align_at.h b/repos/base-hw/src/include/base/internal/align_at.h index 8a54af329f..9ae3dd6943 100644 --- a/repos/base-hw/src/include/base/internal/align_at.h +++ b/repos/base-hw/src/include/base/internal/align_at.h @@ -17,9 +17,7 @@ #include #include -namespace Genode { - template class Align_at; -} +namespace Genode { template class Align_at; } template diff --git a/repos/base-hw/src/include/base/internal/native_env.h b/repos/base-hw/src/include/base/internal/native_env.h index 51d58c10a3..fb2802498a 100644 --- a/repos/base-hw/src/include/base/internal/native_env.h +++ b/repos/base-hw/src/include/base/internal/native_env.h @@ -14,8 +14,8 @@ #ifndef _INCLUDE__BASE__INTERNAL__NATIVE_ENV_H_ #define _INCLUDE__BASE__INTERNAL__NATIVE_ENV_H_ -namespace Genode -{ +namespace Genode { + /** * Upgrade quota of the PD session's capability slab allocator */ diff --git a/repos/base-hw/src/include/base/internal/native_thread.h b/repos/base-hw/src/include/base/internal/native_thread.h index 8b2df7ae95..c2a1e7a4d1 100644 --- a/repos/base-hw/src/include/base/internal/native_thread.h +++ b/repos/base-hw/src/include/base/internal/native_thread.h @@ -18,7 +18,6 @@ #include namespace Genode { - struct Native_thread; class Platform_thread; } @@ -26,7 +25,7 @@ namespace Genode { struct Genode::Native_thread { - Platform_thread *platform_thread; + Platform_thread *platform_thread; Native_capability cap; }; diff --git a/repos/base-hw/src/include/base/internal/native_utcb.h b/repos/base-hw/src/include/base/internal/native_utcb.h index e2235ddd3e..0def1decce 100644 --- a/repos/base-hw/src/include/base/internal/native_utcb.h +++ b/repos/base-hw/src/include/base/internal/native_utcb.h @@ -28,7 +28,7 @@ #include namespace Genode { - + struct Native_utcb; /** @@ -168,11 +168,14 @@ class Genode::Native_utcb /** * Set the capability id 'cap_id' at the next index */ - void cap_add(Kernel::capid_t cap_id) { + void cap_add(Kernel::capid_t cap_id) + { if (_header().cap_cnt < MAX_CAP_ARGS) - _header().caps[_header().cap_cnt++] = cap_id; } + _header().caps[_header().cap_cnt++] = cap_id; + } }; + static_assert(sizeof(Genode::Native_utcb) == Genode::get_page_size(), "Native_utcb is not page-sized"); diff --git a/repos/base-hw/src/include/base/internal/parent_cap.h b/repos/base-hw/src/include/base/internal/parent_cap.h index f0efdb2c88..db721f92d9 100644 --- a/repos/base-hw/src/include/base/internal/parent_cap.h +++ b/repos/base-hw/src/include/base/internal/parent_cap.h @@ -19,6 +19,7 @@ namespace Hw { extern Genode::Untyped_capability _parent_cap; } + namespace Genode { static inline Parent_capability parent_cap() diff --git a/repos/base-hw/src/include/hw/boot_info.h b/repos/base-hw/src/include/hw/boot_info.h index df6e05ed0c..3cfdf08125 100644 --- a/repos/base-hw/src/include/hw/boot_info.h +++ b/repos/base-hw/src/include/hw/boot_info.h @@ -18,6 +18,7 @@ namespace Hw { template struct Boot_info; } + template struct Hw::Boot_info { @@ -39,9 +40,11 @@ struct Hw::Boot_info Mmio_space const mmio_space, 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), cpus(cpus), plat_info(plat_info) {} + : + table(table), table_allocator(table_alloc), + elf_mappings(elf_mappings), boot_modules(boot_modules), + 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/mapping.h b/repos/base-hw/src/include/hw/mapping.h index 2b0dea4b5a..f8b89ddb77 100644 --- a/repos/base-hw/src/include/hw/mapping.h +++ b/repos/base-hw/src/include/hw/mapping.h @@ -19,6 +19,7 @@ namespace Hw { class Mapping; } + class Hw::Mapping { protected: @@ -30,10 +31,10 @@ class Hw::Mapping public: - Mapping() {} + Mapping() { } Mapping(addr_t phys, addr_t virt, size_t size, Page_flags flags) - : _phys(phys, size), _virt(virt), _flags(flags) {} + : _phys(phys, size), _virt(virt), _flags(flags) { } void print(Genode::Output & out) const { diff --git a/repos/base-hw/src/include/hw/memory_map.h b/repos/base-hw/src/include/hw/memory_map.h index 377ee74226..85965996c4 100644 --- a/repos/base-hw/src/include/hw/memory_map.h +++ b/repos/base-hw/src/include/hw/memory_map.h @@ -36,6 +36,7 @@ namespace Hw { } } + struct Hw::Mmio_space : Hw::Memory_region_array { using Hw::Memory_region_array::Memory_region_array; diff --git a/repos/base-hw/src/include/hw/memory_region.h b/repos/base-hw/src/include/hw/memory_region.h index 4196e3a5d3..27cd76c350 100644 --- a/repos/base-hw/src/include/hw/memory_region.h +++ b/repos/base-hw/src/include/hw/memory_region.h @@ -19,18 +19,22 @@ #include namespace Hw { + struct Memory_region; using Memory_region_array = Array; } + struct Hw::Memory_region { Genode::addr_t base = 0; Genode::size_t size = 0; Memory_region(Genode::addr_t base, Genode::size_t size) - : base(trunc(base, get_page_size_log2())), - size(round(size, get_page_size_log2())) {} + : + base(trunc(base, get_page_size_log2())), + size(round(size, get_page_size_log2())) + { } Memory_region() {} diff --git a/repos/base-hw/src/include/hw/page_flags.h b/repos/base-hw/src/include/hw/page_flags.h index 872118f3bb..a427d67bd8 100644 --- a/repos/base-hw/src/include/hw/page_flags.h +++ b/repos/base-hw/src/include/hw/page_flags.h @@ -28,6 +28,7 @@ namespace Hw { struct Page_flags; } + struct Hw::Page_flags { Writeable writeable; @@ -57,6 +58,7 @@ struct Hw::Page_flags namespace Hw { + static constexpr Page_flags PAGE_FLAGS_KERN_IO { RW, NO_EXEC, KERN, GLOBAL, DEVICE, Genode::UNCACHED }; static constexpr Page_flags PAGE_FLAGS_KERN_DATA diff --git a/repos/base-hw/src/include/hw/page_table_allocator.h b/repos/base-hw/src/include/hw/page_table_allocator.h index db80a29128..0cbad5dc1a 100644 --- a/repos/base-hw/src/include/hw/page_table_allocator.h +++ b/repos/base-hw/src/include/hw/page_table_allocator.h @@ -101,7 +101,8 @@ class Hw::Page_table_allocator::Array template template class Hw::Page_table_allocator::Array::Allocator -: public Hw::Page_table_allocator +: + public Hw::Page_table_allocator { private: diff --git a/repos/base-hw/src/include/hw/spec/arm/cortex_a9.h b/repos/base-hw/src/include/hw/spec/arm/cortex_a9.h index ec4da8ee62..dd2dbd3356 100644 --- a/repos/base-hw/src/include/hw/spec/arm/cortex_a9.h +++ b/repos/base-hw/src/include/hw/spec/arm/cortex_a9.h @@ -18,6 +18,7 @@ namespace Hw { template struct Cortex_a9_mmio; } + template struct Hw::Cortex_a9_mmio { diff --git a/repos/base-hw/src/include/hw/spec/arm/cpu.h b/repos/base-hw/src/include/hw/spec/arm/cpu.h index 6b85e0b98c..2adfa30a2d 100644 --- a/repos/base-hw/src/include/hw/spec/arm/cpu.h +++ b/repos/base-hw/src/include/hw/spec/arm/cpu.h @@ -18,6 +18,7 @@ namespace Hw { struct Arm_cpu; } + struct Hw::Arm_cpu { /*************************************** diff --git a/repos/base-hw/src/include/hw/spec/arm/gicv2.h b/repos/base-hw/src/include/hw/spec/arm/gicv2.h index 97b5a532b2..c3edfc1a13 100644 --- a/repos/base-hw/src/include/hw/spec/arm/gicv2.h +++ b/repos/base-hw/src/include/hw/spec/arm/gicv2.h @@ -19,6 +19,7 @@ namespace Hw { class Gicv2; } + class Hw::Gicv2 { protected: diff --git a/repos/base-hw/src/include/hw/spec/arm/gicv3.h b/repos/base-hw/src/include/hw/spec/arm/gicv3.h index ff13a7f92c..b367b7ca6d 100644 --- a/repos/base-hw/src/include/hw/spec/arm/gicv3.h +++ b/repos/base-hw/src/include/hw/spec/arm/gicv3.h @@ -34,6 +34,7 @@ namespace Hw { class Pic; } __VA_ARGS__; \ }; + class Hw::Pic { protected: @@ -102,15 +103,12 @@ class Hw::Pic unsigned max_irq() { return 32 * (read() + 1) - 1; } - - Distributor(Genode::addr_t const base) : Genode::Mmio(base) { } }; struct Redistributor : Genode::Mmio { - struct Ctlr : Register<0x0, 32> { struct Uwp : Bitfield<31, 1> { }; @@ -146,8 +144,7 @@ class Hw::Pic struct Icfgr1 : Register<0xc04, 32> { }; Redistributor_sgi_ppi(Genode::addr_t const base) : Genode::Mmio(base) - { - } + { } }; struct Cpu_interface 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 6d1983d9ca..785cdf8012 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 @@ -19,6 +19,7 @@ #include namespace Hw::Imx53_qsb_board { + using namespace Imx53_qsb; using Serial = Genode::Imx_uart; diff --git a/repos/base-hw/src/include/hw/spec/arm/page_table.h b/repos/base-hw/src/include/hw/spec/arm/page_table.h index bec2d84b23..f3bfce9272 100644 --- a/repos/base-hw/src/include/hw/spec/arm/page_table.h +++ b/repos/base-hw/src/include/hw/spec/arm/page_table.h @@ -23,6 +23,7 @@ namespace Hw { class Page_table; } + class Hw::Page_table { private: 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 e77ecb274d..0a9b71d4f8 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 @@ -21,6 +21,7 @@ #include namespace Hw::Pbxa9_board { + using namespace Pbxa9; using L2_cache = Hw::Pl310; diff --git a/repos/base-hw/src/include/hw/spec/arm/pl310.h b/repos/base-hw/src/include/hw/spec/arm/pl310.h index 2b0de01570..4f9d22f63b 100644 --- a/repos/base-hw/src/include/hw/spec/arm/pl310.h +++ b/repos/base-hw/src/include/hw/spec/arm/pl310.h @@ -21,6 +21,7 @@ namespace Hw { struct Pl310; } + class Hw::Pl310 : public Genode::Mmio { protected: 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 384ff648d5..2d29508d5a 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 @@ -19,6 +19,7 @@ #include namespace Hw::Rpi_board { + using namespace Rpi; using Serial = Genode::Pl011_uart; 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 5bb4c43487..7ccd8e0adb 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 @@ -19,6 +19,7 @@ #include namespace Hw::Usb_armory_board { + using namespace Usb_armory; using Serial = Genode::Imx_uart; diff --git a/repos/base-hw/src/include/hw/spec/arm/virt_qemu_board.h b/repos/base-hw/src/include/hw/spec/arm/virt_qemu_board.h index 373291be27..75c997cfc0 100644 --- a/repos/base-hw/src/include/hw/spec/arm/virt_qemu_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/virt_qemu_board.h @@ -18,6 +18,7 @@ #include namespace Hw::Virt_qemu_board { + using Serial = Genode::Pl011_uart; enum { 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 a3c95a3aaa..041e248371 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 @@ -21,6 +21,7 @@ #include namespace Hw::Zynq_qemu_board { + using namespace Zynq_qemu; using L2_cache = Hw::Pl310; using Cpu_mmio = Hw::Cortex_a9_mmio; diff --git a/repos/base-hw/src/include/hw/spec/arm_64/cpu.h b/repos/base-hw/src/include/hw/spec/arm_64/cpu.h index 025cbd4a91..e280513406 100644 --- a/repos/base-hw/src/include/hw/spec/arm_64/cpu.h +++ b/repos/base-hw/src/include/hw/spec/arm_64/cpu.h @@ -33,6 +33,7 @@ namespace Hw { struct Arm_64_cpu; } + struct Hw::Arm_64_cpu { SYSTEM_REGISTER(64, Actlr_el1, actlr_el1); diff --git a/repos/base-hw/src/include/hw/spec/arm_64/imx8q_evk_board.h b/repos/base-hw/src/include/hw/spec/arm_64/imx8q_evk_board.h index 73cb1cf32c..401804a23d 100644 --- a/repos/base-hw/src/include/hw/spec/arm_64/imx8q_evk_board.h +++ b/repos/base-hw/src/include/hw/spec/arm_64/imx8q_evk_board.h @@ -18,6 +18,7 @@ #include namespace Hw::Imx8q_evk_board { + using Serial = Genode::Imx_uart; enum { diff --git a/repos/base-hw/src/include/hw/spec/arm_64/rpi3_board.h b/repos/base-hw/src/include/hw/spec/arm_64/rpi3_board.h index bdd2808527..f40088f329 100644 --- a/repos/base-hw/src/include/hw/spec/arm_64/rpi3_board.h +++ b/repos/base-hw/src/include/hw/spec/arm_64/rpi3_board.h @@ -18,6 +18,7 @@ #include namespace Hw::Rpi3_board { + using Serial = Genode::Bcm2835_mini_uart; enum { 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 fc69fbb596..cd580ab367 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/board.h +++ b/repos/base-hw/src/include/hw/spec/riscv/board.h @@ -24,8 +24,11 @@ namespace Hw::Riscv_board { using namespace Riscv; enum { UART_BASE, UART_CLOCK }; - struct Serial : Hw::Riscv_uart { - Serial(Genode::addr_t, Genode::size_t, unsigned) {} }; + + struct Serial : Hw::Riscv_uart + { + Serial(Genode::addr_t, Genode::size_t, unsigned) { } + }; } #endif /* _SRC__INCLUDE__HW__SPEC__RISCV__BOARD_H_ */ diff --git a/repos/base-hw/src/include/hw/spec/riscv/cpu.h b/repos/base-hw/src/include/hw/spec/riscv/cpu.h index b1d47ac191..4ba29a2902 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/cpu.h +++ b/repos/base-hw/src/include/hw/spec/riscv/cpu.h @@ -18,6 +18,7 @@ namespace Hw { struct Riscv_cpu; } + struct Hw::Riscv_cpu { /************************** diff --git a/repos/base-hw/src/include/hw/spec/riscv/machine_call.h b/repos/base-hw/src/include/hw/spec/riscv/machine_call.h index 49523a73e4..a19633e21d 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/machine_call.h +++ b/repos/base-hw/src/include/hw/spec/riscv/machine_call.h @@ -35,8 +35,7 @@ namespace Hw { } inline void put_char(unsigned long c) { - ecall(MCALL_CONSOLE_PUTCHAR, c, /* unused arg */ 0); - } + ecall(MCALL_CONSOLE_PUTCHAR, c, /* unused arg */ 0); } inline void set_sys_timer(unsigned long t) { ecall(MCALL_SET_TIMER, t, /* unused arg */ 0); } diff --git a/repos/base-hw/src/include/hw/spec/riscv/page_table.h b/repos/base-hw/src/include/hw/spec/riscv/page_table.h index ae013d6e4d..e95dbc9040 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/page_table.h +++ b/repos/base-hw/src/include/hw/spec/riscv/page_table.h @@ -20,8 +20,8 @@ #include #include -namespace Sv39 -{ +namespace Sv39 { + using namespace Genode; enum { @@ -50,6 +50,7 @@ namespace Sv39 struct Block_descriptor; } + struct Sv39::Descriptor : Register<64> { enum Descriptor_type { INVALID, TABLE, BLOCK }; @@ -103,6 +104,7 @@ struct Sv39::Descriptor : Register<64> return V::get(v); } }; + struct Sv39::Table_descriptor : Descriptor { static access_t create(void * const pa) @@ -118,6 +120,7 @@ struct Sv39::Table_descriptor : Descriptor } }; + struct Sv39::Block_descriptor : Descriptor { static access_t create(Hw::Page_flags const &f, addr_t const pa) @@ -133,6 +136,7 @@ struct Sv39::Block_descriptor : Descriptor } }; + template class Sv39::Level_x_translation_table { @@ -343,6 +347,7 @@ class Sv39::Level_x_translation_table } } __attribute__((aligned(1 << ALIGNM_LOG2))); + namespace Sv39 { /** @@ -390,6 +395,7 @@ namespace Sv39 { }; } + namespace Hw { struct Page_table : Sv39::Level_1_translation_table diff --git a/repos/base-hw/src/include/hw/spec/riscv/uart.h b/repos/base-hw/src/include/hw/spec/riscv/uart.h index 8f5e4ffee3..b819cdc5eb 100644 --- a/repos/base-hw/src/include/hw/spec/riscv/uart.h +++ b/repos/base-hw/src/include/hw/spec/riscv/uart.h @@ -20,6 +20,7 @@ namespace Hw { struct Riscv_uart; } + struct Hw::Riscv_uart { void put_char(char const c) diff --git a/repos/base-hw/src/include/hw/spec/x86_64/acpi.h b/repos/base-hw/src/include/hw/spec/x86_64/acpi.h index e1b78e7329..2f6db4af6d 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/acpi.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/acpi.h @@ -17,6 +17,7 @@ #include namespace Hw { + struct Acpi_generic; struct Apic_madt; @@ -30,6 +31,7 @@ namespace Hw { void for_each_apic_struct(Acpi_generic &, FUNC); } + /* ACPI spec 5.2.6 */ struct Hw::Acpi_generic { @@ -45,6 +47,7 @@ struct Hw::Acpi_generic } __attribute__((packed)); + struct Hw::Apic_madt { enum { LAPIC = 0, IO_APIC = 1 }; @@ -54,8 +57,8 @@ struct Hw::Apic_madt Apic_madt *next() const { return reinterpret_cast((Genode::uint8_t *)this + length); } - struct Ioapic : Genode::Mmio { - + struct Ioapic : Genode::Mmio + { struct Id : Register <0x02, 8> { }; struct Paddr : Register <0x04, 32> { }; struct Gsi_base : Register <0x08, 32> { }; @@ -63,9 +66,9 @@ struct Hw::Apic_madt Ioapic(Apic_madt const * a) : Mmio(reinterpret_cast(a)) { } }; - struct Lapic : Genode::Mmio { - - struct Flags : Register <0x04, 32> { enum { VALID = 1 }; }; + struct Lapic : Genode::Mmio + { + struct Flags : Register <0x04, 32> { enum { VALID = 1 }; }; Lapic(Apic_madt const * a) : Mmio(reinterpret_cast(a)) { } @@ -74,6 +77,7 @@ struct Hw::Apic_madt } __attribute__((packed)); + template void Hw::for_each_rsdt_entry(Hw::Acpi_generic &rsdt, FUNC fn) { @@ -90,6 +94,7 @@ void Hw::for_each_rsdt_entry(Hw::Acpi_generic &rsdt, FUNC fn) fn(entries[i]); } + template void Hw::for_each_xsdt_entry(Hw::Acpi_generic &xsdt, FUNC fn) { @@ -106,6 +111,7 @@ void Hw::for_each_xsdt_entry(Hw::Acpi_generic &xsdt, FUNC fn) fn(entries[i]); } + template void Hw::for_each_apic_struct(Hw::Acpi_generic &apic_madt, FUNC fn) { diff --git a/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h b/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h index dfc723c10b..0bcb44d6ae 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/acpi_rsdp.h @@ -1,5 +1,5 @@ /* - * \brief ACPI RSDP structure + * \brief ACPI RSDP structure * \author Alexander Boettcher * \date 2017-08-15 */ @@ -16,9 +16,8 @@ #include -namespace Hw { - struct Acpi_rsdp; -} +namespace Hw { struct Acpi_rsdp; } + struct Hw::Acpi_rsdp { @@ -31,10 +30,12 @@ struct Hw::Acpi_rsdp Genode::uint64_t xsdt { 0 }; Genode::uint32_t reserved { 0 }; - bool valid() { + bool valid() + { const char sign[] = "RSD PTR "; return signature == *(Genode::uint64_t *)sign; } + } __attribute__((packed)); #endif /* _SRC__LIB__HW__SPEC__X86_64__ACPI_RSDP_H */ diff --git a/repos/base-hw/src/include/hw/spec/x86_64/cpu.h b/repos/base-hw/src/include/hw/spec/x86_64/cpu.h index 100c4dc5e7..68cf5b8e5b 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/cpu.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/cpu.h @@ -18,6 +18,7 @@ namespace Hw { struct X86_64_cpu; } + struct Hw::X86_64_cpu { X86_64_CR_REGISTER(Cr0, cr0, diff --git a/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h b/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h index 6924719d8f..4eef31cae7 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/framebuffer.h @@ -16,18 +16,16 @@ #include -namespace Hw { - struct Framebuffer; -} +namespace Hw { struct Framebuffer; } struct Hw::Framebuffer { - Genode::uint64_t addr; - Genode::uint32_t pitch; - Genode::uint32_t width; - Genode::uint32_t height; - Genode::uint8_t bpp; - Genode::uint8_t type; + Genode::uint64_t addr; + Genode::uint32_t pitch; + Genode::uint32_t width; + Genode::uint32_t height; + Genode::uint8_t bpp; + Genode::uint8_t type; } __attribute__((packed)); #endif /* _SRC__LIB__HW__SPEC__X86_64__FRAMEBUFFER_H */ diff --git a/repos/base-hw/src/include/hw/spec/x86_64/page_table.h b/repos/base-hw/src/include/hw/spec/x86_64/page_table.h index 539fd10d7b..6094ee61dc 100644 --- a/repos/base-hw/src/include/hw/spec/x86_64/page_table.h +++ b/repos/base-hw/src/include/hw/spec/x86_64/page_table.h @@ -22,8 +22,7 @@ #include #include -namespace Hw -{ +namespace Hw { /** * IA-32e paging translates 48-bit linear addresses to 52-bit physical @@ -97,6 +96,7 @@ namespace Hw }; } + class Hw::Level_4_translation_table { private: @@ -246,6 +246,7 @@ class Hw::Level_4_translation_table { this->_range_op(vo, 0, size, Remove_func()); } + } __attribute__((aligned(1 << ALIGNM_LOG2))); @@ -305,10 +306,10 @@ class Hw::Page_directory bool const wc = flags.cacheable == Genode::Cache_attribute::WRITE_COMBINED; return Base::create(flags) - | Base::Ps::bits(1) - | G::bits(flags.global) - | Pa::masked(pa) - | Base::Pwt::bits(wc ? 1 : 0); + | Base::Ps::bits(1) + | G::bits(flags.global) + | Pa::masked(pa) + | Base::Pwt::bits(wc ? 1 : 0); } }; @@ -345,8 +346,7 @@ class Hw::Page_directory Page_flags const & flags; Allocator & alloc; - Insert_func(Page_flags const & flags, - Allocator & alloc) + Insert_func(Page_flags const & flags, Allocator & alloc) : flags(flags), alloc(alloc) { } void operator () (addr_t const vo, addr_t const pa, @@ -492,16 +492,14 @@ class Hw::Page_directory namespace Hw { - struct Level_3_translation_table : - Page_directory< - Level_4_translation_table, - SIZE_LOG2_2MB, SIZE_LOG2_1GB> + struct Level_3_translation_table + : + Page_directory< Level_4_translation_table, SIZE_LOG2_2MB, SIZE_LOG2_1GB> { } __attribute__((aligned(1 << ALIGNM_LOG2))); - struct Level_2_translation_table : - Page_directory< - Level_3_translation_table, - SIZE_LOG2_1GB, SIZE_LOG2_512GB> + struct Level_2_translation_table + : + Page_directory { } __attribute__((aligned(1 << ALIGNM_LOG2))); } 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 6db6e57fd7..f450f93f11 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 @@ -19,6 +19,7 @@ #include namespace Hw::Pc_board { + struct Boot_info; struct Serial; enum Dummies { UART_BASE, UART_CLOCK }; diff --git a/repos/base-hw/src/include/hw/util.h b/repos/base-hw/src/include/hw/util.h index 8c7e1f66d4..8774123321 100644 --- a/repos/base-hw/src/include/hw/util.h +++ b/repos/base-hw/src/include/hw/util.h @@ -17,8 +17,8 @@ #include -namespace Hw -{ +namespace Hw { + using Genode::addr_t; using Genode::size_t; using Genode::get_page_size; @@ -38,8 +38,8 @@ namespace Hw /** * Round up to the minimal page-size alignment */ - constexpr addr_t round_page(addr_t addr) - { return trunc_page(addr + get_page_size() - 1UL); } + constexpr addr_t round_page(addr_t addr) { + return trunc_page(addr + get_page_size() - 1UL); } /** * Return an address rounded down to a specific alignment diff --git a/repos/base-hw/src/lib/base/cache.cc b/repos/base-hw/src/lib/base/cache.cc index 1dd639a372..ed01de4e19 100644 --- a/repos/base-hw/src/lib/base/cache.cc +++ b/repos/base-hw/src/lib/base/cache.cc @@ -17,6 +17,7 @@ #include #include + void Genode::cache_coherent(Genode::addr_t addr, Genode::size_t size) { using namespace Genode; diff --git a/repos/base-hw/src/lib/base/capability.cc b/repos/base-hw/src/lib/base/capability.cc index f74dc8be37..66ed0c6bcb 100644 --- a/repos/base-hw/src/lib/base/capability.cc +++ b/repos/base-hw/src/lib/base/capability.cc @@ -24,6 +24,7 @@ using namespace Genode; static volatile int spinlock = SPINLOCK_UNLOCKED; + static uint8_t ref_counter[1 << (sizeof(Kernel::capid_t)*8)]; @@ -32,7 +33,8 @@ Native_capability::Native_capability() { } void Native_capability::_inc() { - if (!valid()) return; + if (!valid()) + return; spinlock_lock(&spinlock); ref_counter[(addr_t)_data]++; @@ -42,7 +44,8 @@ void Native_capability::_inc() void Native_capability::_dec() { - if (!valid()) return; + if (!valid()) + return; spinlock_lock(&spinlock); if (!--ref_counter[(addr_t)_data]) { Kernel::delete_cap((addr_t)_data); } @@ -70,10 +73,11 @@ void Native_capability::print(Genode::Output &out) const using Genode::print; print(out, "cap<"); - if (_data) { + + if (_data) print(out, (addr_t)_data); - } else { + else print(out, "invalid"); - } + print(out, ">"); } diff --git a/repos/base-hw/src/lib/base/native_utcb.cc b/repos/base-hw/src/lib/base/native_utcb.cc index 4275ddd490..e4a26b30c6 100644 --- a/repos/base-hw/src/lib/base/native_utcb.cc +++ b/repos/base-hw/src/lib/base/native_utcb.cc @@ -14,5 +14,6 @@ /* base-internal includes */ #include + Genode::Native_utcb * Genode::utcb_main_thread() { return (Genode::Native_utcb *)user_utcb_main_thread(); } diff --git a/repos/base-hw/src/lib/base/raw_write_string.cc b/repos/base-hw/src/lib/base/raw_write_string.cc index a523b4cae6..33ecb23533 100644 --- a/repos/base-hw/src/lib/base/raw_write_string.cc +++ b/repos/base-hw/src/lib/base/raw_write_string.cc @@ -14,5 +14,9 @@ #include #include -void Genode::raw_write_string(char const *str) { - while (char c = *str++) Kernel::print_char(c); } + +void Genode::raw_write_string(char const *str) +{ + while (char c = *str++) + Kernel::print_char(c); +} diff --git a/repos/base-hw/src/lib/base/signal_receiver.cc b/repos/base-hw/src/lib/base/signal_receiver.cc index fd38e0bb2a..94660af344 100644 --- a/repos/base-hw/src/lib/base/signal_receiver.cc +++ b/repos/base-hw/src/lib/base/signal_receiver.cc @@ -90,6 +90,7 @@ void Signal_receiver::_platform_begin_dissolve(Signal_context * const c) Kernel::kill_signal_context(Capability_space::capid(c->_cap)); } + void Signal_receiver::_platform_finish_dissolve(Signal_context *) { } @@ -98,7 +99,8 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c) /* ensure that the context isn't managed already */ Mutex::Guard contexts_guard(_contexts_mutex); Mutex::Guard context_guard(c->_mutex); - if (c->_receiver) { throw Context_already_in_use(); } + if (c->_receiver) + throw Context_already_in_use(); for (;;) { @@ -158,7 +160,8 @@ Signal Signal_receiver::pending_signal() Signal::Data result; _contexts.for_each_locked([&] (Signal_context &context) { - if (!context._pending) return false; + if (!context._pending) + return false; _contexts.head(context._next); context._pending = false; @@ -177,9 +180,8 @@ Signal Signal_receiver::pending_signal() } /* look for pending signals */ - if (Kernel::pending_signal(Capability_space::capid(_cap)) != 0) { + if (Kernel::pending_signal(Capability_space::capid(_cap)) != 0) return Signal(); - } /* read signal data */ Signal::Data * const data = diff --git a/repos/base-hw/src/lib/base/thread_bootstrap.cc b/repos/base-hw/src/lib/base/thread_bootstrap.cc index df7e82e0e1..deb70c52ac 100644 --- a/repos/base-hw/src/lib/base/thread_bootstrap.cc +++ b/repos/base-hw/src/lib/base/thread_bootstrap.cc @@ -69,7 +69,9 @@ void prepare_reinit_main_thread() { prepare_init_main_thread(); } __attribute__((optimize("-fno-delete-null-pointer-checks"))) Native_utcb *Thread::utcb() { - if (this) { return &_stack->utcb(); } + if (this) + return &_stack->utcb(); + return utcb_main_thread(); } @@ -82,6 +84,7 @@ void Thread::_thread_start() Genode::sleep_forever(); } + void Thread::_thread_bootstrap() { Kernel::capid_t capid = myself()->utcb()->cap_get(Native_utcb::THREAD_MYSELF); diff --git a/repos/base-hw/src/lib/base/thread_start.cc b/repos/base-hw/src/lib/base/thread_start.cc index 5eb38ded9a..30faa995bb 100644 --- a/repos/base-hw/src/lib/base/thread_start.cc +++ b/repos/base-hw/src/lib/base/thread_start.cc @@ -32,6 +32,7 @@ namespace Hw { extern Untyped_capability _main_thread_cap; } + /************ ** Thread ** ************/ @@ -55,7 +56,8 @@ void Thread::_init_platform_thread(size_t weight, Type type) addr_t const utcb_new = (addr_t)&_stack->utcb() - stack_area; Region_map * const rm = env_stack_area_region_map; - if (type == REINITIALIZED_MAIN) { rm->detach(utcb_new); } + if (type == REINITIALIZED_MAIN) + rm->detach(utcb_new); /* remap initial main-thread UTCB according to stack-area spec */ try { rm->attach_at(Hw::_main_thread_utcb_ds, utcb_new, utcb_size); } diff --git a/repos/base-hw/src/lib/base/vm_session.cc b/repos/base-hw/src/lib/base/vm_session.cc index c4a9cbfa22..8f07fb5625 100644 --- a/repos/base-hw/src/lib/base/vm_session.cc +++ b/repos/base-hw/src/lib/base/vm_session.cc @@ -24,14 +24,16 @@ struct Vcpu; static Genode::Registry> vcpus; -struct Vcpu { + +struct Vcpu +{ Vm_session_client::Vcpu_id const id; Capability const cap; - Vcpu(Vm_session::Vcpu_id const id, - Capability const cap) - : id(id), cap(cap) {} - virtual ~Vcpu() {} + Vcpu(Vm_session::Vcpu_id id, Capability cap) + : id(id), cap(cap) { } + + virtual ~Vcpu() { } }; diff --git a/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h b/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h index 65fc2cfeef..725f6eec2d 100644 --- a/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h +++ b/repos/base-hw/src/test/cpu_quota/include/sync_session/connection.h @@ -23,12 +23,15 @@ namespace Sync { class Connection; } + struct Sync::Connection : public Genode::Connection, public Genode::Rpc_client { explicit Connection(Genode::Env &env) - : Genode::Connection(env, session(env.parent(), "ram_quota=4K")), - Genode::Rpc_client(cap()) { } + : + Genode::Connection(env, session(env.parent(), "ram_quota=4K")), + Genode::Rpc_client(cap()) + { } void threshold(unsigned threshold) override { call(threshold); } void submit(Signal_context_capability signal) override { call(signal); } diff --git a/repos/base-hw/src/test/cpu_quota/include/sync_session/sync_session.h b/repos/base-hw/src/test/cpu_quota/include/sync_session/sync_session.h index 2f4253cae6..7ea1506b8b 100644 --- a/repos/base-hw/src/test/cpu_quota/include/sync_session/sync_session.h +++ b/repos/base-hw/src/test/cpu_quota/include/sync_session/sync_session.h @@ -19,14 +19,15 @@ #include #include -namespace Sync -{ +namespace Sync { + using Genode::Signal_context_capability; struct Session; using Session_capability = Genode::Capability; } + struct Sync::Session : Genode::Session { static const char *service_name() { return "Sync"; } diff --git a/repos/base-hw/src/test/cpu_quota/main.cc b/repos/base-hw/src/test/cpu_quota/main.cc index 849ffafc1b..7dc81e1e3d 100644 --- a/repos/base-hw/src/test/cpu_quota/main.cc +++ b/repos/base-hw/src/test/cpu_quota/main.cc @@ -22,6 +22,7 @@ using namespace Genode; + struct Single_signal { Signal_receiver receiver { }; diff --git a/repos/base-hw/src/test/cpu_scheduler/test.cc b/repos/base-hw/src/test/cpu_scheduler/test.cc index 460be1b535..dcd486597e 100644 --- a/repos/base-hw/src/test/cpu_scheduler/test.cc +++ b/repos/base-hw/src/test/cpu_scheduler/test.cc @@ -36,18 +36,21 @@ struct Data Data() : idle(0, 0), scheduler(idle, 1000, 100) { } }; + Data * data() { static Data d; return &d; } + void done() { Genode::log("done"); while (1) ; } + unsigned share_id(void * const pointer) { addr_t const address = (addr_t)pointer; @@ -57,12 +60,14 @@ unsigned share_id(void * const pointer) return (address - base) / sizeof(Cpu_share) + 1; } + Cpu_share * share(unsigned const id) { if (!id) { return &data()->idle; } return reinterpret_cast(&data()->shares[id - 1]); } + void create(unsigned const id) { Cpu_share * const s = share(id); @@ -82,6 +87,7 @@ void create(unsigned const id) data()->scheduler.insert(*s); } + void destroy(unsigned const id) { Cpu_share * const s = share(id); @@ -89,12 +95,14 @@ void destroy(unsigned const id) s->~Cpu_share(); } + unsigned time() { return data()->scheduler.quota() - data()->scheduler.residual(); } + void update_check(unsigned const l, unsigned const c, unsigned const t, unsigned const s, unsigned const q) { @@ -117,6 +125,7 @@ void update_check(unsigned const l, unsigned const c, unsigned const t, } } + void ready_check(unsigned const l, unsigned const s, bool const x) { data()->scheduler.ready_check(*share(s)); diff --git a/repos/base-hw/src/test/double_list/test.cc b/repos/base-hw/src/test/double_list/test.cc index 17d314bfa5..c10ca24a3e 100644 --- a/repos/base-hw/src/test/double_list/test.cc +++ b/repos/base-hw/src/test/double_list/test.cc @@ -29,8 +29,10 @@ using Kernel::Double_list_item; void * operator new(__SIZE_TYPE__, void * p) { return p; } + struct Item_load { char volatile x = 0, y = 0, z = 0; }; + struct Item : Item_load, Double_list_item { unsigned _id; @@ -40,6 +42,7 @@ struct Item : Item_load, Double_list_item void iteration() { Genode::log(_id); } }; + struct Data { static constexpr unsigned nr_of_items = 9; @@ -54,18 +57,21 @@ struct Data } }; + Data * data() { static Data d; return &d; } + void done() { Genode::log("done"); while (1) ; } + void check(unsigned i1, unsigned l) { Double_list_item * const li2 = data()->list.head(); @@ -85,12 +91,14 @@ void check(unsigned i1, unsigned l) } } + void print_each() { Genode::log("print each"); data()->list.for_each([] (Item &i) { i.iteration(); }); } + Item * item(unsigned const i) { return reinterpret_cast(&data()->items[i - 1]); }