@ -898,8 +898,11 @@ void handle_interrupt(int vector, struct x86_user_context *regs)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
check_signal(0, regs, 0);
|
check_signal(0, regs, 0);
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
}
|
||||||
set_cputime(0);
|
set_cputime(0);
|
||||||
|
|
||||||
--v->in_interrupt;
|
--v->in_interrupt;
|
||||||
@ -915,8 +918,11 @@ void gpe_handler(struct x86_user_context *regs)
|
|||||||
panic("gpe_handler");
|
panic("gpe_handler");
|
||||||
}
|
}
|
||||||
set_signal(SIGSEGV, regs, NULL);
|
set_signal(SIGSEGV, regs, NULL);
|
||||||
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
check_signal(0, regs, 0);
|
check_signal(0, regs, 0);
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
}
|
||||||
set_cputime(0);
|
set_cputime(0);
|
||||||
// panic("GPF");
|
// panic("GPF");
|
||||||
}
|
}
|
||||||
@ -945,8 +951,11 @@ void debug_handler(struct x86_user_context *regs)
|
|||||||
memset(&info, '\0', sizeof info);
|
memset(&info, '\0', sizeof info);
|
||||||
info.si_code = si_code;
|
info.si_code = si_code;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
check_signal(0, regs, 0);
|
check_signal(0, regs, 0);
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
}
|
||||||
set_cputime(0);
|
set_cputime(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,8 +973,11 @@ void int3_handler(struct x86_user_context *regs)
|
|||||||
memset(&info, '\0', sizeof info);
|
memset(&info, '\0', sizeof info);
|
||||||
info.si_code = TRAP_BRKPT;
|
info.si_code = TRAP_BRKPT;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
check_signal(0, regs, 0);
|
check_signal(0, regs, 0);
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
}
|
||||||
set_cputime(0);
|
set_cputime(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -363,7 +363,10 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs)
|
|||||||
info._sifields._sigfault.si_addr = fault_addr;
|
info._sifields._sigfault.si_addr = fault_addr;
|
||||||
set_signal(SIGSEGV, regs, &info);
|
set_signal(SIGSEGV, regs, &info);
|
||||||
}
|
}
|
||||||
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
check_signal(0, regs, 0);
|
check_signal(0, regs, 0);
|
||||||
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user