From 0212f94809fb680bfb3208e101b08af3b2f77f65 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Mon, 6 Feb 2023 14:43:20 +0100 Subject: [PATCH] hw: eliminate -DNR_OF_CPUS, use constant instead Fix genodelabs/genode#4752 --- repos/base-hw/lib/mk/bootstrap-hw.inc | 4 ---- repos/base-hw/lib/mk/core-hw.inc | 4 ---- .../arm_v7/bootstrap-hw-imx6q_sabrelite.mk | 2 -- .../spec/arm_v7/bootstrap-hw-imx7d_sabre.mk | 2 -- .../mk/spec/arm_v7/bootstrap-hw-nit6_solox.mk | 2 -- .../arm_v7/bootstrap-hw-virt_qemu_arm_v7a.mk | 2 -- .../mk/spec/arm_v7/bootstrap-hw-wand_quad.mk | 2 -- .../mk/spec/arm_v7/core-hw-imx6q_sabrelite.mk | 2 -- .../lib/mk/spec/arm_v7/core-hw-imx7d_sabre.mk | 2 -- .../lib/mk/spec/arm_v7/core-hw-nit6_solox.mk | 2 -- .../lib/mk/spec/arm_v7/core-hw-pbxa9.mk | 2 -- .../spec/arm_v7/core-hw-virt_qemu_arm_v7a.mk | 2 -- .../lib/mk/spec/arm_v7/core-hw-wand_quad.mk | 2 -- .../arm_v8/bootstrap-hw-virt_qemu_arm_v8a.mk | 2 -- .../spec/arm_v8/core-hw-virt_qemu_arm_v8a.mk | 2 -- .../base-hw/lib/mk/spec/cortex_a8/core-hw.inc | 2 -- .../lib/mk/spec/x86_64/bootstrap-hw-pc.mk | 2 -- .../base-hw/lib/mk/spec/x86_64/core-hw-pc.mk | 2 -- .../bootstrap/board/virt_qemu_arm_v7a/board.h | 2 ++ .../board/virt_qemu_arm_v7a/platform.cc | 2 +- .../bootstrap/board/virt_qemu_arm_v8a/board.h | 2 ++ repos/base-hw/src/bootstrap/init.cc | 7 +++++++ repos/base-hw/src/bootstrap/platform.h | 2 +- repos/base-hw/src/bootstrap/spec/arm/crt0.s | 17 +++++++-------- .../bootstrap/spec/arm_64/cortex_a53_mmu.cc | 3 ++- .../base-hw/src/bootstrap/spec/arm_64/crt0.s | 15 ++++--------- .../base-hw/src/bootstrap/spec/x86_64/crt0.s | 21 ++++--------------- .../src/bootstrap/spec/x86_64/platform.cc | 4 ++-- repos/base-hw/src/core/board/pc/board.h | 11 +++++++--- .../src/core/board/virt_qemu_arm_v7a/board.h | 3 ++- .../src/core/board/virt_qemu_arm_v8a/board.h | 1 + repos/base-hw/src/core/core_log_out.cc | 2 +- repos/base-hw/src/core/kernel/cpu.cc | 2 +- repos/base-hw/src/core/kernel/cpu.h | 2 +- .../spec/arm_v7/virtualization/kernel/vm.cc | 2 +- .../spec/arm_v8/virtualization/kernel/vm.cc | 3 ++- repos/base-hw/src/core/spec/x86_64/pic.h | 4 ++-- repos/base-hw/src/include/hw/boot_info.h | 4 ++-- .../src/include/hw/spec/arm/imx53_qsb_board.h | 1 + .../hw/spec/arm/imx6q_sabrelite_board.h | 1 + .../include/hw/spec/arm/imx7d_sabre_board.h | 1 + .../include/hw/spec/arm/nit6_solox_board.h | 1 + .../src/include/hw/spec/arm/pbxa9_board.h | 1 + .../src/include/hw/spec/arm/wand_quad_board.h | 1 + .../src/include/hw/spec/x86_64/pc_board.h | 2 ++ 45 files changed, 62 insertions(+), 95 deletions(-) diff --git a/repos/base-hw/lib/mk/bootstrap-hw.inc b/repos/base-hw/lib/mk/bootstrap-hw.inc index bdd5310976..e7f16a3b18 100644 --- a/repos/base-hw/lib/mk/bootstrap-hw.inc +++ b/repos/base-hw/lib/mk/bootstrap-hw.inc @@ -25,10 +25,6 @@ REP_INC_DIR += src/bootstrap REP_INC_DIR += src/include REP_INC_DIR += src/core/include # for boot_modules.h only -# configure multiprocessor mode -NR_OF_CPUS ?= 1 -CC_OPT += -Wa,--defsym -Wa,NR_OF_CPUS=$(NR_OF_CPUS) -DNR_OF_CPUS=$(NR_OF_CPUS) - TMP := $(call select_from_repositories,lib/mk/bootstrap-hw.inc) BASE_HW_DIR := $(TMP:%/lib/mk/bootstrap-hw.inc=%) diff --git a/repos/base-hw/lib/mk/core-hw.inc b/repos/base-hw/lib/mk/core-hw.inc index 0620bda505..a875b20eb8 100644 --- a/repos/base-hw/lib/mk/core-hw.inc +++ b/repos/base-hw/lib/mk/core-hw.inc @@ -66,10 +66,6 @@ SRC_CC += heartbeat.cc # provide Genode version information include $(BASE_DIR)/src/core/version.inc -# configure multiprocessor mode -NR_OF_CPUS ?= 1 -CC_OPT += -Wa,--defsym -Wa,NR_OF_CPUS=$(NR_OF_CPUS) -DNR_OF_CPUS=$(NR_OF_CPUS) - TMP := $(call select_from_repositories,lib/mk/core-hw.inc) BASE_HW_DIR := $(TMP:%/lib/mk/core-hw.inc=%) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx6q_sabrelite.mk b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx6q_sabrelite.mk index 4878dd9a36..d1e16e1c87 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx6q_sabrelite.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx6q_sabrelite.mk @@ -9,6 +9,4 @@ SRC_CC += bootstrap/spec/arm/imx6_platform.cc SRC_CC += bootstrap/spec/arm/arm_v7_cpu.cc SRC_CC += hw/spec/32bit/memory_map.cc -NR_OF_CPUS = 4 - include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx7d_sabre.mk b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx7d_sabre.mk index 2a44a29f7f..6d0686bfe1 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx7d_sabre.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-imx7d_sabre.mk @@ -7,8 +7,6 @@ SRC_CC += bootstrap/spec/arm/arm_v7_cpu.cc SRC_CC += hw/spec/32bit/memory_map.cc SRC_S += bootstrap/spec/arm/crt0.s -NR_OF_CPUS = 2 - # # we need more specific compiler hints for some 'special' assembly code # override -march=armv7-a because it conflicts with -mcpu=cortex-a7 diff --git a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-nit6_solox.mk b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-nit6_solox.mk index d8c5505031..e89221e775 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-nit6_solox.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-nit6_solox.mk @@ -9,6 +9,4 @@ SRC_CC += bootstrap/spec/arm/imx6_platform.cc SRC_CC += bootstrap/spec/arm/arm_v7_cpu.cc SRC_CC += hw/spec/32bit/memory_map.cc -NR_OF_CPUS = 1 - include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-virt_qemu_arm_v7a.mk b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-virt_qemu_arm_v7a.mk index b26a3dc66e..7cb4f677ef 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-virt_qemu_arm_v7a.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-virt_qemu_arm_v7a.mk @@ -7,8 +7,6 @@ SRC_CC += bootstrap/spec/arm/gicv2.cc SRC_CC += hw/spec/32bit/memory_map.cc SRC_S += bootstrap/spec/arm/crt0.s -NR_OF_CPUS = 2 - CC_MARCH = -march=armv7ve -mtune=cortex-a15 -mfpu=vfpv3 -mfloat-abi=softfp include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-wand_quad.mk b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-wand_quad.mk index f781159d87..c39493e5f9 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-wand_quad.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/bootstrap-hw-wand_quad.mk @@ -9,6 +9,4 @@ SRC_CC += bootstrap/spec/arm/imx6_platform.cc SRC_CC += bootstrap/spec/arm/arm_v7_cpu.cc SRC_CC += hw/spec/32bit/memory_map.cc -NR_OF_CPUS = 4 - include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx6q_sabrelite.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx6q_sabrelite.mk index 72fd584dc4..8f8f1f9581 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx6q_sabrelite.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx6q_sabrelite.mk @@ -12,7 +12,5 @@ REP_INC_DIR += src/core/board/imx6q_sabrelite # add C++ sources SRC_CC += platform_services.cc -NR_OF_CPUS = 4 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/cortex_a9/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx7d_sabre.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx7d_sabre.mk index 03ee443556..3fa2d274de 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx7d_sabre.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-imx7d_sabre.mk @@ -22,8 +22,6 @@ SRC_CC += vm_session_component.cc # add assembly sources SRC_S += spec/arm_v7/virtualization/exception_vector.s -NR_OF_CPUS = 2 - # # we need more specific compiler hints for some 'special' assembly code # override -march=armv7-a because it conflicts with -mcpu=cortex-a7 diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-nit6_solox.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-nit6_solox.mk index be2dae8788..34c095755c 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-nit6_solox.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-nit6_solox.mk @@ -12,7 +12,5 @@ REP_INC_DIR += src/core/board/nit6_solox # add C++ sources SRC_CC += platform_services.cc -NR_OF_CPUS = 1 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/cortex_a9/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-pbxa9.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-pbxa9.mk index 5777ac4245..6d5de20eef 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-pbxa9.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-pbxa9.mk @@ -11,7 +11,5 @@ REP_INC_DIR += src/core/board/pbxa9 # add C++ sources SRC_CC += platform_services.cc -NR_OF_CPUS = 1 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/cortex_a9/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-virt_qemu_arm_v7a.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-virt_qemu_arm_v7a.mk index e6830f1877..fd4f579d79 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-virt_qemu_arm_v7a.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-virt_qemu_arm_v7a.mk @@ -14,8 +14,6 @@ SRC_CC += vm_session_component.cc SRC_S += spec/arm_v7/virtualization/exception_vector.s -NR_OF_CPUS = 2 - CC_MARCH = -march=armv7ve -mtune=cortex-a15 -mfpu=vfpv3 -mfloat-abi=softfp include $(call select_from_repositories,lib/mk/spec/cortex_a15/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-wand_quad.mk b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-wand_quad.mk index 79bb04e4b9..947634bd56 100644 --- a/repos/base-hw/lib/mk/spec/arm_v7/core-hw-wand_quad.mk +++ b/repos/base-hw/lib/mk/spec/arm_v7/core-hw-wand_quad.mk @@ -12,7 +12,5 @@ REP_INC_DIR += src/core/board/wand_quad # add C++ sources SRC_CC += platform_services.cc -NR_OF_CPUS = 4 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/cortex_a9/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v8/bootstrap-hw-virt_qemu_arm_v8a.mk b/repos/base-hw/lib/mk/spec/arm_v8/bootstrap-hw-virt_qemu_arm_v8a.mk index 65ac7ac5cb..e9c640237c 100644 --- a/repos/base-hw/lib/mk/spec/arm_v8/bootstrap-hw-virt_qemu_arm_v8a.mk +++ b/repos/base-hw/lib/mk/spec/arm_v8/bootstrap-hw-virt_qemu_arm_v8a.mk @@ -7,8 +7,6 @@ SRC_CC += lib/base/arm_64/kernel/interface.cc SRC_CC += spec/64bit/memory_map.cc SRC_S += bootstrap/spec/arm_64/crt0.s -NR_OF_CPUS = 4 - vpath spec/64bit/memory_map.cc $(call select_from_repositories,src/lib/hw) include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/arm_v8/core-hw-virt_qemu_arm_v8a.mk b/repos/base-hw/lib/mk/spec/arm_v8/core-hw-virt_qemu_arm_v8a.mk index 41825db29d..faded1350f 100644 --- a/repos/base-hw/lib/mk/spec/arm_v8/core-hw-virt_qemu_arm_v8a.mk +++ b/repos/base-hw/lib/mk/spec/arm_v8/core-hw-virt_qemu_arm_v8a.mk @@ -13,7 +13,5 @@ SRC_CC += vm_session_component.cc #add assembly sources SRC_S += spec/arm_v8/virtualization/exception_vector.s -NR_OF_CPUS = 4 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/arm_v8/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/cortex_a8/core-hw.inc b/repos/base-hw/lib/mk/spec/cortex_a8/core-hw.inc index a71386347a..73faf7b9d9 100644 --- a/repos/base-hw/lib/mk/spec/cortex_a8/core-hw.inc +++ b/repos/base-hw/lib/mk/spec/cortex_a8/core-hw.inc @@ -8,8 +8,6 @@ SRC_CC += kernel/cpu_up.cc SRC_CC += kernel/lock.cc -NR_OF_CPUS = 1 - # include less specific configuration include $(call select_from_repositories,lib/mk/spec/arm_v7/core-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/x86_64/bootstrap-hw-pc.mk b/repos/base-hw/lib/mk/spec/x86_64/bootstrap-hw-pc.mk index c5e8b41d22..7ab8d022c4 100644 --- a/repos/base-hw/lib/mk/spec/x86_64/bootstrap-hw-pc.mk +++ b/repos/base-hw/lib/mk/spec/x86_64/bootstrap-hw-pc.mk @@ -6,6 +6,4 @@ SRC_S += bootstrap/spec/x86_64/crt0_translation_table.s SRC_CC += hw/spec/64bit/memory_map.cc -NR_OF_CPUS = 32 - include $(call select_from_repositories,lib/mk/bootstrap-hw.inc) diff --git a/repos/base-hw/lib/mk/spec/x86_64/core-hw-pc.mk b/repos/base-hw/lib/mk/spec/x86_64/core-hw-pc.mk index 0720a4f3f4..318083f6f9 100644 --- a/repos/base-hw/lib/mk/spec/x86_64/core-hw-pc.mk +++ b/repos/base-hw/lib/mk/spec/x86_64/core-hw-pc.mk @@ -39,7 +39,5 @@ SRC_CC += spec/64bit/memory_map.cc vpath spec/64bit/memory_map.cc $(call select_from_repositories,src/lib/hw) -NR_OF_CPUS = 32 - # include less specific configuration include $(call select_from_repositories,lib/mk/core-hw.inc) diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/board.h b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/board.h index 4956b88bfc..5c1cac0ce6 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/board.h +++ b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/board.h @@ -27,6 +27,8 @@ namespace Board { using Psci = Hw::Psci; using Pic = Hw::Gicv2; static constexpr bool NON_SECURE = true; + + enum { NR_OF_CPUS = 2 }; }; #endif /* _SRC__BOOTSTRAP__SPEC__VIRT__QEMU_H_ */ diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/platform.cc b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/platform.cc index cf8e55cc2f..ead6097701 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/platform.cc +++ b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v7a/platform.cc @@ -66,7 +66,7 @@ unsigned Bootstrap::Platform::enable_mmu() ::Board::Pic pic { }; /* primary cpu wakes up all others */ - if (primary_cpu && NR_OF_CPUS > 1) { + if (primary_cpu && ::Board::NR_OF_CPUS > 1) { Cpu::invalidate_data_cache(); primary_cpu = false; Cpu::wake_up_all_cpus(&_start_setup_stack); diff --git a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v8a/board.h b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v8a/board.h index 62a197fb70..81d127ec41 100644 --- a/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v8a/board.h +++ b/repos/base-hw/src/bootstrap/board/virt_qemu_arm_v8a/board.h @@ -31,6 +31,8 @@ namespace Board { static void wake_up_all_cpus(void*); }; + enum { NR_OF_CPUS = 4 }; + using Hw::Pic; }; diff --git a/repos/base-hw/src/bootstrap/init.cc b/repos/base-hw/src/bootstrap/init.cc index 0cc92720fb..9fcda2fec3 100644 --- a/repos/base-hw/src/bootstrap/init.cc +++ b/repos/base-hw/src/bootstrap/init.cc @@ -18,6 +18,13 @@ #include #include +using namespace Genode; + +static constexpr size_t STACK_SIZE = 0x2000; + +size_t bootstrap_stack_size = STACK_SIZE; +uint8_t bootstrap_stack[Board::NR_OF_CPUS][STACK_SIZE] +__attribute__((aligned(get_page_size()))); Bootstrap::Platform & Bootstrap::platform() { return *unmanaged_singleton(); } diff --git a/repos/base-hw/src/bootstrap/platform.h b/repos/base-hw/src/bootstrap/platform.h index bc6deebe25..54294748a3 100644 --- a/repos/base-hw/src/bootstrap/platform.h +++ b/repos/base-hw/src/bootstrap/platform.h @@ -46,7 +46,7 @@ class Bootstrap::Platform Memory_region_array early_ram_regions { }; Memory_region_array late_ram_regions { }; Mmio_space const core_mmio; - unsigned cpus { NR_OF_CPUS }; + unsigned cpus { ::Board::NR_OF_CPUS }; ::Board::Boot_info info { }; Board(); diff --git a/repos/base-hw/src/bootstrap/spec/arm/crt0.s b/repos/base-hw/src/bootstrap/spec/arm/crt0.s index 32c42286bc..8c9e6d3023 100644 --- a/repos/base-hw/src/bootstrap/spec/arm/crt0.s +++ b/repos/base-hw/src/bootstrap/spec/arm/crt0.s @@ -63,8 +63,10 @@ mrcne p15, 0, sp, c0, c0, 5 /* read multiprocessor affinity register */ andne sp, sp, #0xff /* set cpu id for non-boot cpu */ - adr r0, _start_stack /* load stack address into r0 */ - adr r1, _start_stack_size /* load stack size per cpu into r1 */ + adr r0, _bootstrap_stack_local /* load stack address into r0 */ + adr r1, _bootstrap_stack_size_local /* load stack size per cpu into r1 */ + ldr r0, [r0] + ldr r1, [r1] ldr r1, [r1] add sp, #1 /* calculate stack start for CPU */ @@ -101,11 +103,8 @@ _bss_local_end: .long _bss_end - _start_stack_size: - .long STACK_SIZE + _bootstrap_stack_local: + .long bootstrap_stack - .align 3 - _start_stack: - .rept NR_OF_CPUS - .space STACK_SIZE - .endr + _bootstrap_stack_size_local: + .long bootstrap_stack_size diff --git a/repos/base-hw/src/bootstrap/spec/arm_64/cortex_a53_mmu.cc b/repos/base-hw/src/bootstrap/spec/arm_64/cortex_a53_mmu.cc index 33c9c43eb4..92ca7e583d 100644 --- a/repos/base-hw/src/bootstrap/spec/arm_64/cortex_a53_mmu.cc +++ b/repos/base-hw/src/bootstrap/spec/arm_64/cortex_a53_mmu.cc @@ -145,7 +145,8 @@ unsigned Bootstrap::Platform::enable_mmu() Cpu::Ttbr::Baddr::masked((Genode::addr_t)core_pd->table_base); /* primary cpu wakes up all others */ - if (primary && NR_OF_CPUS > 1) Cpu::wake_up_all_cpus(&_crt0_start_secondary); + if (primary && ::Board::NR_OF_CPUS > 1) + Cpu::wake_up_all_cpus(&_crt0_start_secondary); while (Cpu::current_privilege_level() > Cpu::Current_el::EL1) { if (Cpu::current_privilege_level() == Cpu::Current_el::EL3) { diff --git a/repos/base-hw/src/bootstrap/spec/arm_64/crt0.s b/repos/base-hw/src/bootstrap/spec/arm_64/crt0.s index 046fc94b03..22e08a95ca 100644 --- a/repos/base-hw/src/bootstrap/spec/arm_64/crt0.s +++ b/repos/base-hw/src/bootstrap/spec/arm_64/crt0.s @@ -114,19 +114,12 @@ ** Initialize stack ** **********************/ - .set STACK_SIZE, 0x2000 - _cpu_number - ldr x1, =_crt0_start_stack - ldr x2, [x1] + ldr x1, =bootstrap_stack + ldr x2, =bootstrap_stack_size + ldr x2, [x2] + add x0, x0, #1 mul x0, x0, x2 add x1, x1, x0 mov sp, x1 bl init - - .p2align 4 - .rept NR_OF_CPUS - .space STACK_SIZE - .endr - _crt0_start_stack: - .quad STACK_SIZE diff --git a/repos/base-hw/src/bootstrap/spec/x86_64/crt0.s b/repos/base-hw/src/bootstrap/spec/x86_64/crt0.s index d158d6d68a..ba927a3f76 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/crt0.s +++ b/repos/base-hw/src/bootstrap/spec/x86_64/crt0.s @@ -143,16 +143,14 @@ __gdt: movq $1, %rcx lock xaddq %rcx, (%rax) - /* if more CPUs started than supported, then stop them */ - cmp $NR_OF_CPUS, %rcx - jge 1f - /* calculate stack depending on CPU counter */ - movq $STACK_SIZE, %rax + leaq bootstrap_stack_size@GOTPCREL(%rip),%rax + movq (%rax), %rax + movq (%rax), %rax inc %rcx mulq %rcx movq %rax, %rcx - leaq __bootstrap_stack@GOTPCREL(%rip),%rax + leaq bootstrap_stack@GOTPCREL(%rip),%rax movq (%rax), %rsp addq %rcx, %rsp @@ -182,10 +180,6 @@ __gdt: jmp 1b - .global bootstrap_stack_size - bootstrap_stack_size: - .quad STACK_SIZE - /****************************************** ** Global Descriptor Table (GDT) ** ** See Intel SDM Vol. 3A, section 3.5.1 ** @@ -236,14 +230,7 @@ __gdt: *********************************/ .bss - - /* stack of the temporary initial environment */ .p2align 12 - .globl __bootstrap_stack - __bootstrap_stack: - .rept NR_OF_CPUS - .space STACK_SIZE - .endr .globl __initial_ax __initial_ax: 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 3dace7cf8b..4eeca6dc6f 100644 --- a/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc +++ b/repos/base-hw/src/bootstrap/spec/x86_64/platform.cc @@ -31,7 +31,7 @@ extern "C" Genode::addr_t __initial_ax; extern "C" Genode::addr_t __initial_bx; /* pointer to stack base */ -extern "C" Genode::addr_t __bootstrap_stack; +extern "C" Genode::addr_t bootstrap_stack; /* number of booted CPUs */ extern "C" Genode::addr_t __cpus_booted; @@ -296,7 +296,7 @@ unsigned Bootstrap::Platform::enable_mmu() Cpu::Cr3::write(Cpu::Cr3::Pdb::masked((addr_t)core_pd->table_base)); - addr_t const stack_base = reinterpret_cast(&__bootstrap_stack); + addr_t const stack_base = reinterpret_cast(&bootstrap_stack); addr_t const this_stack = reinterpret_cast(&stack_base); addr_t const cpu_id = (this_stack - stack_base) / bootstrap_stack_size; diff --git a/repos/base-hw/src/core/board/pc/board.h b/repos/base-hw/src/core/board/pc/board.h index 27ef96c304..ea23d11889 100644 --- a/repos/base-hw/src/core/board/pc/board.h +++ b/repos/base-hw/src/core/board/pc/board.h @@ -17,15 +17,20 @@ /* base-hw internal includes */ #include +/* + * As long as Board::NR_OF_CPUS is used as constant within pic.h + * we sadly have to include Hw::Pc_board into the namespace + * before including pic.h. This will change as soon as the number + * O CPUs is only define per function +*/ +namespace Board { using namespace Hw::Pc_board; }; + /* base-hw Core includes */ #include #include #include namespace Board { - - using namespace Hw::Pc_board; - class Pic : public Local_interrupt_controller { }; enum { diff --git a/repos/base-hw/src/core/board/virt_qemu_arm_v7a/board.h b/repos/base-hw/src/core/board/virt_qemu_arm_v7a/board.h index c12a54cc67..1bc91cf43e 100644 --- a/repos/base-hw/src/core/board/virt_qemu_arm_v7a/board.h +++ b/repos/base-hw/src/core/board/virt_qemu_arm_v7a/board.h @@ -40,7 +40,8 @@ namespace Board { TIMER_IRQ = 30 /* PPI IRQ 14 */, VT_TIMER_IRQ = 27, VT_MAINTAINANCE_IRQ = 25, - VCPU_MAX = 16 + VCPU_MAX = 16, + NR_OF_CPUS = 2, }; }; diff --git a/repos/base-hw/src/core/board/virt_qemu_arm_v8a/board.h b/repos/base-hw/src/core/board/virt_qemu_arm_v8a/board.h index 0e72f97486..c79aaf5c66 100644 --- a/repos/base-hw/src/core/board/virt_qemu_arm_v8a/board.h +++ b/repos/base-hw/src/core/board/virt_qemu_arm_v8a/board.h @@ -34,6 +34,7 @@ namespace Board { using namespace Hw::Virt_qemu_board; enum { + NR_OF_CPUS = 4, TIMER_IRQ = 30, /* PPI IRQ 14 */ VT_TIMER_IRQ = 11 + 16, VT_MAINTAINANCE_IRQ = 9 + 16, diff --git a/repos/base-hw/src/core/core_log_out.cc b/repos/base-hw/src/core/core_log_out.cc index 70148f275a..bced5302fd 100644 --- a/repos/base-hw/src/core/core_log_out.cc +++ b/repos/base-hw/src/core/core_log_out.cc @@ -47,7 +47,7 @@ static inline bool running_in_kernel() { addr_t const stack_base = reinterpret_cast(&kernel_stack); static constexpr size_t stack_size = - NR_OF_CPUS * Kernel::Cpu::KERNEL_STACK_SIZE; + Board::NR_OF_CPUS * Kernel::Cpu::KERNEL_STACK_SIZE; /* check stack variable against kernel stack area */ return ((addr_t)&stack_base) >= stack_base && diff --git a/repos/base-hw/src/core/kernel/cpu.cc b/repos/base-hw/src/core/kernel/cpu.cc index cd7e57b5b9..91609ed1df 100644 --- a/repos/base-hw/src/core/kernel/cpu.cc +++ b/repos/base-hw/src/core/kernel/cpu.cc @@ -160,7 +160,7 @@ Cpu_job & Cpu::schedule() Genode::size_t kernel_stack_size = Cpu::KERNEL_STACK_SIZE; -Genode::uint8_t kernel_stack[NR_OF_CPUS][Cpu::KERNEL_STACK_SIZE] +Genode::uint8_t kernel_stack[Board::NR_OF_CPUS][Cpu::KERNEL_STACK_SIZE] __attribute__((aligned(Genode::get_page_size()))); diff --git a/repos/base-hw/src/core/kernel/cpu.h b/repos/base-hw/src/core/kernel/cpu.h index 35ab1b0014..cb24468270 100644 --- a/repos/base-hw/src/core/kernel/cpu.h +++ b/repos/base-hw/src/core/kernel/cpu.h @@ -201,7 +201,7 @@ class Kernel::Cpu_pool Inter_processor_work_list _global_work_list {}; unsigned _nr_of_cpus; - Genode::Constructible _cpus[NR_OF_CPUS]; + Genode::Constructible _cpus[Board::NR_OF_CPUS]; public: 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 416110121e..65ada78c56 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 @@ -65,7 +65,7 @@ struct Hypervisor::Host_context static Hypervisor::Host_context & host_context(Cpu & cpu) { static Genode::Constructible - host_context[NR_OF_CPUS]; + host_context[Board::NR_OF_CPUS]; if (!host_context[cpu.id()].constructed()) { host_context[cpu.id()].construct(); Hypervisor::Host_context & c = *host_context[cpu.id()]; 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 30b6962865..cc07859602 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 @@ -32,7 +32,8 @@ using Kernel::Vm; static Genode::Vm_state & host_context(Cpu & cpu) { - static Genode::Constructible host_context[NR_OF_CPUS]; + static Genode::Constructible + host_context[Board::NR_OF_CPUS]; if (!host_context[cpu.id()].constructed()) { host_context[cpu.id()].construct(); 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 3f61994192..f70fa85804 100644 --- a/repos/base-hw/src/core/spec/x86_64/pic.h +++ b/repos/base-hw/src/core/spec/x86_64/pic.h @@ -85,7 +85,7 @@ class Board::Global_interrupt_controller : public Genode::Mmio }; unsigned _irte_count = 0; /* number of redirection table entries */ - uint8_t _lapic_id[NR_OF_CPUS]; /* unique name of the LAPIC of each CPU */ + uint8_t _lapic_id[Board::NR_OF_CPUS]; /* unique name of the LAPIC of each CPU */ Irq_mode _irq_mode[IRQ_COUNT]; /** @@ -221,7 +221,7 @@ class Board::Local_interrupt_controller : public Genode::Mmio void store_apic_id(unsigned const cpu_id) { - if (cpu_id < NR_OF_CPUS) { + if (cpu_id < Board::NR_OF_CPUS) { Id::access_t const lapic_id = read(); _global_irq_ctrl.lapic_id(cpu_id, (unsigned char)((lapic_id >> 24) & 0xff)); } diff --git a/repos/base-hw/src/include/hw/boot_info.h b/repos/base-hw/src/include/hw/boot_info.h index d7c1c50ebb..32edb68adb 100644 --- a/repos/base-hw/src/include/hw/boot_info.h +++ b/repos/base-hw/src/include/hw/boot_info.h @@ -22,8 +22,8 @@ namespace Hw { template struct Boot_info; } template struct Hw::Boot_info { - using Mapping_pool = Genode::Array; - using Kernel_irqs = Genode::Array; + using Mapping_pool = Genode::Array; + using Kernel_irqs = Genode::Array; addr_t const table; addr_t const table_allocator; 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 785cdf8012..f2f5144998 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 @@ -26,6 +26,7 @@ namespace Hw::Imx53_qsb_board { enum { UART_BASE = UART_1_MMIO_BASE, UART_CLOCK = 0, /* ignored value */ + NR_OF_CPUS = 1, }; } diff --git a/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h b/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h index a45d059c1e..50a6e6b322 100644 --- a/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/imx6q_sabrelite_board.h @@ -31,6 +31,7 @@ namespace Hw::Imx6q_sabrelite_board { UART_BASE = UART_2_MMIO_BASE, UART_SIZE = UART_2_MMIO_SIZE, UART_CLOCK = 0, /* dummy value, not used */ + NR_OF_CPUS = 4 }; } diff --git a/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h b/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h index 8646c45163..6b0889100c 100644 --- a/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/imx7d_sabre_board.h @@ -29,6 +29,7 @@ namespace Hw::Imx7d_sabre_board { enum { UART_BASE = UART_1_MMIO_BASE, UART_CLOCK = 0, /* unsued value */ + NR_OF_CPUS = 2 }; } diff --git a/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h b/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h index 3f20ca7074..afb185c0de 100644 --- a/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/nit6_solox_board.h @@ -31,6 +31,7 @@ namespace Hw::Nit6_solox_board { UART_BASE = UART_1_MMIO_BASE, UART_SIZE = UART_1_MMIO_SIZE, UART_CLOCK = 0, /* dummy value, not used */ + NR_OF_CPUS = 1 }; } 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 0a9b71d4f8..fef34ee0ff 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 @@ -31,6 +31,7 @@ namespace Hw::Pbxa9_board { enum { UART_BASE = PL011_0_MMIO_BASE, UART_CLOCK = PL011_0_CLOCK, + NR_OF_CPUS = 1, }; } diff --git a/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h b/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h index 23d5b681d6..cd69302bc9 100644 --- a/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h +++ b/repos/base-hw/src/include/hw/spec/arm/wand_quad_board.h @@ -31,6 +31,7 @@ namespace Hw::Wand_quad_board { UART_BASE = UART_1_MMIO_BASE, UART_SIZE = UART_1_MMIO_SIZE, UART_CLOCK = 0, /* dummy value, not used */ + NR_OF_CPUS = 4 }; } 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 f450f93f11..352f51ac64 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 @@ -23,6 +23,8 @@ namespace Hw::Pc_board { struct Boot_info; struct Serial; enum Dummies { UART_BASE, UART_CLOCK }; + + enum { NR_OF_CPUS = 32 }; }