From cf1bb5e566ad0e346af810b399d871a74031feb2 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Fri, 25 Jul 2025 02:44:11 -0400 Subject: kernel/amd64: Keep track of which cores are online Give each core a bit that indicates whether the core is online or halted. We also provide a cpu_halt() which marks the core as offline. Signed-off-by: Ian Moffett --- sys/arch/amd64/amd64/machdep.c | 1 + sys/include/arch/amd64/cdefs.h | 3 ++- sys/include/arch/amd64/cpu.h | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'sys') diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c index efd1af8..19dcf44 100644 --- a/sys/arch/amd64/amd64/machdep.c +++ b/sys/arch/amd64/amd64/machdep.c @@ -418,6 +418,7 @@ cpu_startup(struct cpu_info *ci) setup_vectors(ci); try_mitigate_spectre(); + ci->online = 1; cpu_get_info(ci); cpu_enable_smep(); diff --git a/sys/include/arch/amd64/cdefs.h b/sys/include/arch/amd64/cdefs.h index a49736b..d038a15 100644 --- a/sys/include/arch/amd64/cdefs.h +++ b/sys/include/arch/amd64/cdefs.h @@ -31,6 +31,7 @@ #define _AMD64_CDEFS_H_ #include +#include /* * Please use CLI wisely, it is a good idea to use @@ -40,7 +41,7 @@ #define md_pause() __ASMV("rep; nop") /* (F3 90) PAUSE */ #define md_intoff() __ASMV("cli") /* Clear interrupts */ #define md_inton() __ASMV("sti") /* Enable interrupts */ -#define md_hlt() __ASMV("hlt") /* Halt the processor */ +#define md_hlt() cpu_halt() /* Halt the processor */ /* * AMD64 specific defines diff --git a/sys/include/arch/amd64/cpu.h b/sys/include/arch/amd64/cpu.h index 046b621..116661b 100644 --- a/sys/include/arch/amd64/cpu.h +++ b/sys/include/arch/amd64/cpu.h @@ -36,6 +36,7 @@ #include #include #include +#include #define CPU_IRQ(IRQ_N) (BIT((IRQ_N)) & 0xFF) @@ -51,6 +52,7 @@ struct cpu_info { uint8_t family : 4; /* CPU family ID */ uint8_t has_x2apic : 1; uint8_t tlb_shootdown : 1; + uint8_t online : 1; /* CPU online */ uint8_t ipl; size_t lapic_tmr_freq; uint8_t irq_mask; @@ -80,4 +82,18 @@ void mp_bootstrap_aps(struct cpu_info *ci); extern struct cpu_info g_bsp_ci; +__always_inline static inline void +cpu_halt(void) +{ + struct cpu_info *ci = this_cpu(); + + if (ci != NULL) + ci->online = 0; + + __ASMV("hlt"); + + if (ci != NULL) + ci->online = 1; +} + #endif /* !_MACHINE_CPU_H_ */ -- cgit v1.2.3