diff --git a/src/kernel/core/arch/x86/arch_int.c b/src/kernel/core/arch/x86/arch_int.c index 1bc2b73d81..2ebe1cfef0 100755 --- a/src/kernel/core/arch/x86/arch_int.c +++ b/src/kernel/core/arch/x86/arch_int.c @@ -164,13 +164,11 @@ void i386_handle_trap(struct iframe frame); void i386_handle_trap(struct iframe frame) { - int ret = B_HANDLED_INTERRUPT; struct thread *thread = thread_get_current_thread(); + int ret = B_HANDLED_INTERRUPT; - if (thread) { + if (thread) i386_push_iframe(thread, &frame); - thread->arch_info.current_iframe = &frame; - } // if(frame.vector != 0x20) // dprintf("i386_handle_trap: vector 0x%x, ip 0x%x, cpu %d\n", frame.vector, frame.eip, smp_get_current_cpu()); @@ -255,11 +253,13 @@ i386_handle_trap(struct iframe frame) } break; } - + if (ret == B_INVOKE_SCHEDULER) { - int state = disable_interrupts(); + cpu_status state = disable_interrupts(); GRAB_THREAD_LOCK(); + scheduler_reschedule(); + RELEASE_THREAD_LOCK(); restore_interrupts(state); }