[S390] ptrace inferior call interactions with TIF_SYSCALL
The TIF_SYSCALL bit needs to be cleared if the debugger changes the state of the ptraced process in regard to the presence of a system call. Otherwise the system call will be restarted although the debugger set up an inferior call. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
5f894cbb68
commit
d9ae6772d3
@ -460,9 +460,9 @@ void do_signal(struct pt_regs *regs)
|
|||||||
regs->svc_code >> 16);
|
regs->svc_code >> 16);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* No longer in a system call */
|
|
||||||
clear_thread_flag(TIF_SYSCALL);
|
|
||||||
}
|
}
|
||||||
|
/* No longer in a system call */
|
||||||
|
clear_thread_flag(TIF_SYSCALL);
|
||||||
|
|
||||||
if ((is_compat_task() ?
|
if ((is_compat_task() ?
|
||||||
handle_signal32(signr, &ka, &info, oldset, regs) :
|
handle_signal32(signr, &ka, &info, oldset, regs) :
|
||||||
@ -486,6 +486,7 @@ void do_signal(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* No handlers present - check for system call restart */
|
/* No handlers present - check for system call restart */
|
||||||
|
clear_thread_flag(TIF_SYSCALL);
|
||||||
if (current_thread_info()->system_call) {
|
if (current_thread_info()->system_call) {
|
||||||
regs->svc_code = current_thread_info()->system_call;
|
regs->svc_code = current_thread_info()->system_call;
|
||||||
switch (regs->gprs[2]) {
|
switch (regs->gprs[2]) {
|
||||||
@ -500,9 +501,6 @@ void do_signal(struct pt_regs *regs)
|
|||||||
regs->gprs[2] = regs->orig_gpr2;
|
regs->gprs[2] = regs->orig_gpr2;
|
||||||
set_thread_flag(TIF_SYSCALL);
|
set_thread_flag(TIF_SYSCALL);
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
clear_thread_flag(TIF_SYSCALL);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user