summaryrefslogtreecommitdiff
path: root/src/sys/arch
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-09-26 23:42:10 -0400
committerIan Moffett <ian@osmora.org>2025-09-26 23:45:48 -0400
commit01dae750edc685b1a0c49c6b27fd5466b0f0ac31 (patch)
tree4b7a6469b5b76342b630c5dfa3f317be9ad81432 /src/sys/arch
parenta5ea47adbcacf70c24dbc00371e239d455e1764b (diff)
kern/amd64: cpu: Add CPU halt ISR for IPIs
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch')
-rw-r--r--src/sys/arch/amd64/cpu/cpu_conf.c12
-rw-r--r--src/sys/arch/amd64/cpu/trap.S6
2 files changed, 18 insertions, 0 deletions
diff --git a/src/sys/arch/amd64/cpu/cpu_conf.c b/src/sys/arch/amd64/cpu/cpu_conf.c
index 6ab4d6e..20a2cec 100644
--- a/src/sys/arch/amd64/cpu/cpu_conf.c
+++ b/src/sys/arch/amd64/cpu/cpu_conf.c
@@ -34,9 +34,20 @@
#include <machine/trap.h>
#include <machine/lapic.h>
#include <machine/gdt.h>
+#include <machine/mdcpu.h>
#include <string.h>
extern void syscall_isr(void);
+extern void core_halt_isr(void);
+void core_halt_handler(void);
+
+void
+core_halt_handler(void)
+{
+ for (;;) {
+ __ASMV("cli; hlt");
+ }
+}
/*
* Initialize interrupt vectors
@@ -57,6 +68,7 @@ init_vectors(void)
idt_set_desc(0xD, IDT_TRAP_GATE, ISR(general_prot), 0);
idt_set_desc(0xE, IDT_TRAP_GATE, ISR(page_fault), 0);
idt_set_desc(0x80, IDT_USER_GATE, ISR(syscall_isr), 0);
+ idt_set_desc(HALT_VECTOR, IDT_USER_GATE, ISR(core_halt_isr), 0);
}
void
diff --git a/src/sys/arch/amd64/cpu/trap.S b/src/sys/arch/amd64/cpu/trap.S
index 6e4d58c..e6b6b85 100644
--- a/src/sys/arch/amd64/cpu/trap.S
+++ b/src/sys/arch/amd64/cpu/trap.S
@@ -113,3 +113,9 @@ INTR_ENTRY(syscall_isr)
mov %rsp, %rdi
call trap_syscall
INTR_EXIT(syscall_isr)
+
+ .globl core_halt_isr
+INTR_ENTRY(core_halt_isr)
+ mov %rsp, %rdi
+ call core_halt_handler
+INTR_EXIT(core_halt_isr)