From dc1996d2890a032e1f77c8d02e93e8f406adb867 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Wed, 11 Jan 2023 10:17:28 +0100 Subject: [PATCH] hw/x86: add interrupt controller re-init support Issue #4669 --- .../src/core/board/imx6q_sabrelite/board.h | 2 +- .../base-hw/src/core/board/nit6_solox/board.h | 2 +- repos/base-hw/src/core/board/pbxa9/board.h | 2 +- .../base-hw/src/core/board/wand_quad/board.h | 2 +- repos/base-hw/src/core/kernel/main.cc | 1 + .../src/core/spec/arm/trustzone_board.h | 2 +- .../src/core/spec/arm/virtualization/gicv2.h | 2 +- .../src/core/spec/arm/virtualization/gicv3.h | 2 +- repos/base-hw/src/core/spec/riscv/pic.h | 2 +- repos/base-hw/src/core/spec/x86_64/pic.cc | 27 ++++++++++++------- repos/base-hw/src/core/spec/x86_64/pic.h | 2 ++ 11 files changed, 28 insertions(+), 18 deletions(-) diff --git a/repos/base-hw/src/core/board/imx6q_sabrelite/board.h b/repos/base-hw/src/core/board/imx6q_sabrelite/board.h index c9128b9346..f9aff439c5 100644 --- a/repos/base-hw/src/core/board/imx6q_sabrelite/board.h +++ b/repos/base-hw/src/core/board/imx6q_sabrelite/board.h @@ -26,7 +26,7 @@ namespace Board { using namespace Hw::Imx6q_sabrelite_board; - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic : public Hw::Gicv2 { public: Pic(Global_interrupt_controller &) { } }; using L2_cache = Hw::Pl310; 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 7ccefd9544..54594b30f8 100644 --- a/repos/base-hw/src/core/board/nit6_solox/board.h +++ b/repos/base-hw/src/core/board/nit6_solox/board.h @@ -26,7 +26,7 @@ namespace Board { using namespace Hw::Nit6_solox_board; - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic : public Hw::Gicv2 { public: Pic(Global_interrupt_controller &) { } }; using L2_cache = Hw::Pl310; diff --git a/repos/base-hw/src/core/board/pbxa9/board.h b/repos/base-hw/src/core/board/pbxa9/board.h index 3b3d914eb1..2bd2291d4f 100644 --- a/repos/base-hw/src/core/board/pbxa9/board.h +++ b/repos/base-hw/src/core/board/pbxa9/board.h @@ -26,7 +26,7 @@ namespace Board { using namespace Hw::Pbxa9_board; - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic : public Hw::Gicv2 { public: Pic(Global_interrupt_controller &) { } }; L2_cache & l2_cache(); 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 1689d76fdb..288b9b0bc8 100644 --- a/repos/base-hw/src/core/board/wand_quad/board.h +++ b/repos/base-hw/src/core/board/wand_quad/board.h @@ -29,7 +29,7 @@ namespace Board { using L2_cache = Hw::Pl310; - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic : public Hw::Gicv2 { public: Pic(Global_interrupt_controller &) { } }; L2_cache & l2_cache(); diff --git a/repos/base-hw/src/core/kernel/main.cc b/repos/base-hw/src/core/kernel/main.cc index a3b4ccadd4..c9b371a0d1 100644 --- a/repos/base-hw/src/core/kernel/main.cc +++ b/repos/base-hw/src/core/kernel/main.cc @@ -144,6 +144,7 @@ void Kernel::main_initialize_and_handle_kernel_entry() kernel_initialized = false; Main::_instance->_serial.init(); + Main::_instance->_global_irq_ctrl.init(); } nr_of_initialized_cpus ++; 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 28f7a616e0..a40e3e791f 100644 --- a/repos/base-hw/src/core/spec/arm/trustzone_board.h +++ b/repos/base-hw/src/core/spec/arm/trustzone_board.h @@ -27,7 +27,7 @@ namespace Board { struct Vm_page_table {}; struct Vm_page_table_array {}; - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; struct Pic : Hw::Pic { struct Virtual_context {}; Pic(Global_interrupt_controller &) { } }; struct Vcpu_context { Vcpu_context(Kernel::Cpu &) {} }; } diff --git a/repos/base-hw/src/core/spec/arm/virtualization/gicv2.h b/repos/base-hw/src/core/spec/arm/virtualization/gicv2.h index e8500dadb1..3044f69789 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/gicv2.h +++ b/repos/base-hw/src/core/spec/arm/virtualization/gicv2.h @@ -18,7 +18,7 @@ namespace Board { - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic; }; 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 c79ce3ba8b..459ff18f5d 100644 --- a/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h +++ b/repos/base-hw/src/core/spec/arm/virtualization/gicv3.h @@ -18,7 +18,7 @@ namespace Board { - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic; }; diff --git a/repos/base-hw/src/core/spec/riscv/pic.h b/repos/base-hw/src/core/spec/riscv/pic.h index d85ec9751f..39ac46cb18 100644 --- a/repos/base-hw/src/core/spec/riscv/pic.h +++ b/repos/base-hw/src/core/spec/riscv/pic.h @@ -22,7 +22,7 @@ namespace Board { - class Global_interrupt_controller { }; + class Global_interrupt_controller { public: void init() {} }; class Pic; } 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 b267faa870..e3a85aa2d5 100644 --- a/repos/base-hw/src/core/spec/x86_64/pic.cc +++ b/repos/base-hw/src/core/spec/x86_64/pic.cc @@ -246,17 +246,24 @@ Global_interrupt_controller::Global_interrupt_controller() _irq_mode[i].trigger_mode = TRIGGER_LEVEL; _irq_mode[i].polarity = POLARITY_LOW; } - - /* remap all IRQs managed by I/O APIC */ - if (i < _irte_count) { - Irte::access_t irte = _create_irt_entry(i); - write(IOREDTBL + 2 * i + 1); - write((Iowin::access_t)(irte >> Iowin::ACCESS_WIDTH)); - write(IOREDTBL + 2 * i); - write((Iowin::access_t)(irte)); - } } -}; + + init(); +} + + +void Global_interrupt_controller::init() +{ + /* remap all IRQs managed by I/O APIC */ + for (unsigned i = 0; i < _irte_count; i++) + { + Irte::access_t irte = _create_irt_entry(i); + write(IOREDTBL + 2 * i + 1); + write((Iowin::access_t)(irte >> Iowin::ACCESS_WIDTH)); + write(IOREDTBL + 2 * i); + write((Iowin::access_t)(irte)); + } +} void Global_interrupt_controller::toggle_mask(unsigned const vector, 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 f70fa85804..37620200dd 100644 --- a/repos/base-hw/src/core/spec/x86_64/pic.h +++ b/repos/base-hw/src/core/spec/x86_64/pic.h @@ -114,6 +114,8 @@ class Board::Global_interrupt_controller : public Genode::Mmio Global_interrupt_controller(); + void init(); + /** * Set/unset mask bit of IRTE for given vector *