diff --git a/arch/x86/kernel/cpu.c b/arch/x86/kernel/cpu.c index 4432ddd5..82ee53f7 100644 --- a/arch/x86/kernel/cpu.c +++ b/arch/x86/kernel/cpu.c @@ -510,6 +510,11 @@ void cpu_halt(void) asm volatile("hlt"); } +void cpu_safe_halt(void) +{ + asm volatile("sti; hlt"); +} + void cpu_enable_interrupt(void) { asm volatile("sti"); diff --git a/kernel/process.c b/kernel/process.c index 3a9a6314..aabfc5b4 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -1546,16 +1546,16 @@ void release_process(struct process *proc) static void idle(void) { - //unsigned int flags; - //flags = ihk_mc_spinlock_lock(&cpu_status_lock); - //ihk_mc_spinlock_unlock(&cpu_status_lock, flags); cpu_local_var(status) = CPU_STATUS_IDLE; + cpu_enable_interrupt(); while (1) { - cpu_enable_interrupt(); schedule(); - //cpu_local_var(status) = CPU_STATUS_IDLE; - cpu_halt(); + cpu_disable_interrupt(); + if (cpu_local_var(status) == CPU_STATUS_IDLE) + cpu_safe_halt(); + else + cpu_enable_interrupt(); } } diff --git a/lib/include/ihk/cpu.h b/lib/include/ihk/cpu.h index 7d9e5de3..b0b4a936 100644 --- a/lib/include/ihk/cpu.h +++ b/lib/include/ihk/cpu.h @@ -19,6 +19,7 @@ void cpu_enable_interrupt(void); void cpu_disable_interrupt(void); void cpu_halt(void); +void cpu_safe_halt(void); void cpu_restore_interrupt(unsigned long); void cpu_pause(void);