From 97fcdef351d468bf3078c17f7e4fbec8fcac029e Mon Sep 17 00:00:00 2001 From: NotYourFox Date: Wed, 15 Jan 2025 16:42:54 +0300 Subject: [PATCH] Changed cpu_full_halt to account for unlikely accidental hardware errors with IF desyncing from reflock state --- kernel/arch/amd64/cpu/control.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/kernel/arch/amd64/cpu/control.c b/kernel/arch/amd64/cpu/control.c index 02aecc1..41d8a73 100644 --- a/kernel/arch/amd64/cpu/control.c +++ b/kernel/arch/amd64/cpu/control.c @@ -20,16 +20,16 @@ #include "kreflock.h" #include "kstdlib.h" -static inline void __cpu_enable_interrupt() { +static inline void __cpu_enable_interrupts() { asm volatile("sti"); } -static inline void __cpu_disable_interrupt() { +static inline void __cpu_disable_interrupts() { asm volatile("cli"); } static reflock_t lock = - NEW_REFLOCK(__cpu_disable_interrupt, __cpu_enable_interrupt, false, true); + NEW_REFLOCK(__cpu_disable_interrupts, __cpu_enable_interrupts, false, true); bool cpu_interrupt_lock_acquired() { if (unlikely(!reflock_validate(&lock))) { @@ -68,7 +68,10 @@ void cpu_halt() { } void cpu_full_halt() { - reflock_acquire(&lock); + if (unlikely(!reflock_is_locked(&lock))) + reflock_acquire(&lock); + else + __cpu_disable_interrupts(); lock.allow_force_unlock = false; cpu_halt(); }