signal: check_signal must be called after check_need_resched.
This commit is contained in:
@@ -252,8 +252,8 @@ SYSCALL_DECLARE(rt_sigreturn)
|
|||||||
regs->gpr.rflags &= ~RFLAGS_TF;
|
regs->gpr.rflags &= ~RFLAGS_TF;
|
||||||
info.si_code = TRAP_TRACE;
|
info.si_code = TRAP_TRACE;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
check_signal(0, regs, 0);
|
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
check_signal(0, regs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ksigsp.fpregs && xsavesize){
|
if(ksigsp.fpregs && xsavesize){
|
||||||
@@ -820,8 +820,8 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi
|
|||||||
regs->gpr.rflags &= ~RFLAGS_TF;
|
regs->gpr.rflags &= ~RFLAGS_TF;
|
||||||
info.si_code = TRAP_TRACE;
|
info.si_code = TRAP_TRACE;
|
||||||
set_signal(SIGTRAP, regs, &info);
|
set_signal(SIGTRAP, regs, &info);
|
||||||
check_signal(0, regs, 0);
|
|
||||||
check_need_resched();
|
check_need_resched();
|
||||||
|
check_signal(0, regs, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
10
kernel/mem.c
10
kernel/mem.c
@@ -1212,10 +1212,6 @@ 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);
|
|
||||||
}
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1224,7 +1220,11 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs)
|
|||||||
out:
|
out:
|
||||||
dkprintf("%s: addr: %p, reason: %lx, regs: %p -> error: %d\n",
|
dkprintf("%s: addr: %p, reason: %lx, regs: %p -> error: %d\n",
|
||||||
__FUNCTION__, fault_addr, reason, regs, error);
|
__FUNCTION__, fault_addr, reason, regs, error);
|
||||||
check_need_resched();
|
if(interrupt_from_user(regs)){
|
||||||
|
cpu_enable_interrupt();
|
||||||
|
check_need_resched();
|
||||||
|
check_signal(0, regs, 0);
|
||||||
|
}
|
||||||
set_cputime(0);
|
set_cputime(0);
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
if (thread->profile)
|
if (thread->profile)
|
||||||
|
|||||||
@@ -9429,11 +9429,6 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
|
|||||||
|
|
||||||
save_syscall_return_value(num, l);
|
save_syscall_return_value(num, l);
|
||||||
|
|
||||||
if (!list_empty(&thread->sigpending) ||
|
|
||||||
!list_empty(&thread->sigcommon->sigpending)) {
|
|
||||||
check_signal(l, NULL, num);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PROFILE_ENABLE
|
#ifdef PROFILE_ENABLE
|
||||||
{
|
{
|
||||||
unsigned long ts = rdtsc();
|
unsigned long ts = rdtsc();
|
||||||
@@ -9472,6 +9467,11 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
|
|||||||
}
|
}
|
||||||
#endif /* POSTK_DEBUG_TEMP_FIX_60 && POSTK_DEBUG_TEMP_FIX_56 */
|
#endif /* POSTK_DEBUG_TEMP_FIX_60 && POSTK_DEBUG_TEMP_FIX_56 */
|
||||||
|
|
||||||
|
if (!list_empty(&thread->sigpending) ||
|
||||||
|
!list_empty(&thread->sigcommon->sigpending)) {
|
||||||
|
check_signal(l, NULL, num);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DISABLE_SCHED_YIELD
|
#ifdef DISABLE_SCHED_YIELD
|
||||||
if (num != __NR_sched_yield)
|
if (num != __NR_sched_yield)
|
||||||
#endif // DISABLE_SCHED_YIELD
|
#endif // DISABLE_SCHED_YIELD
|
||||||
|
|||||||
Reference in New Issue
Block a user