summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-25 02:44:11 -0400
committerIan Moffett <ian@osmora.org>2025-07-25 02:44:45 -0400
commitcf1bb5e566ad0e346af810b399d871a74031feb2 (patch)
tree7180f312516bb35327414366a24bc711b7b1740b /sys
parent4d68494efd7b03a0c91215dc28afcf314940e2ea (diff)
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 <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/amd64/amd64/machdep.c1
-rw-r--r--sys/include/arch/amd64/cdefs.h3
-rw-r--r--sys/include/arch/amd64/cpu.h16
3 files changed, 19 insertions, 1 deletions
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 <sys/cdefs.h>
+#include <machine/cpu.h>
/*
* 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 <sys/sched.h>
#include <sys/spinlock.h>
#include <machine/tss.h>
+#include <machine/cdefs.h>
#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_ */