diff --git a/arch/x86/kernel/cpu.c b/arch/x86/kernel/cpu.c index edc389f0..4fbb4c24 100644 --- a/arch/x86/kernel/cpu.c +++ b/arch/x86/kernel/cpu.c @@ -898,8 +898,11 @@ void handle_interrupt(int vector, struct x86_user_context *regs) } } - check_signal(0, regs, 0); - check_need_resched(); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_signal(0, regs, 0); + check_need_resched(); + } set_cputime(0); --v->in_interrupt; @@ -915,8 +918,11 @@ void gpe_handler(struct x86_user_context *regs) panic("gpe_handler"); } set_signal(SIGSEGV, regs, NULL); - check_signal(0, regs, 0); - check_need_resched(); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_signal(0, regs, 0); + check_need_resched(); + } set_cputime(0); // panic("GPF"); } @@ -945,8 +951,11 @@ void debug_handler(struct x86_user_context *regs) memset(&info, '\0', sizeof info); info.si_code = si_code; set_signal(SIGTRAP, regs, &info); - check_signal(0, regs, 0); - check_need_resched(); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_signal(0, regs, 0); + check_need_resched(); + } set_cputime(0); } @@ -964,8 +973,11 @@ void int3_handler(struct x86_user_context *regs) memset(&info, '\0', sizeof info); info.si_code = TRAP_BRKPT; set_signal(SIGTRAP, regs, &info); - check_signal(0, regs, 0); - check_need_resched(); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_signal(0, regs, 0); + check_need_resched(); + } set_cputime(0); } diff --git a/kernel/mem.c b/kernel/mem.c index e072d7bd..2df09209 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -363,7 +363,10 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs) info._sifields._sigfault.si_addr = fault_addr; set_signal(SIGSEGV, regs, &info); } - check_signal(0, regs, 0); + if(interrupt_from_user(regs)){ + cpu_enable_interrupt(); + check_signal(0, regs, 0); + } goto out; }