diff options
-rw-r--r-- | src/sys/arch/amd64/cpu/cpu_conf.c | 12 | ||||
-rw-r--r-- | src/sys/arch/amd64/cpu/trap.S | 6 | ||||
-rw-r--r-- | src/sys/include/arch/amd64/mdcpu.h | 2 |
3 files changed, 20 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) diff --git a/src/sys/include/arch/amd64/mdcpu.h b/src/sys/include/arch/amd64/mdcpu.h index b9d5e72..ddc0da2 100644 --- a/src/sys/include/arch/amd64/mdcpu.h +++ b/src/sys/include/arch/amd64/mdcpu.h @@ -35,6 +35,8 @@ #include <machine/tss.h> #include <machine/gdt.h> +#define HALT_VECTOR 0x90 + #define md_spinwait() __ASMV("pause") #define md_intoff() __ASMV("cli") #define md_inton() __ASMV("sti") |