x86: ptrace vs -ENOSYS
When we're stopped at syscall entry tracing, ptrace can change the %rax value from -ENOSYS to something else. If no system call is actually made because the syscall number (now in orig_rax) is bad, then we now always reset %rax to -ENOSYS again. This changes it to leave the return value alone after entry tracing. That way, the %rax value set by ptrace is there to be seen in user mode (or in syscall exit tracing). This is consistent with what the 32-bit kernel does. Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
8ab32bb89b
Коммит
a31f8dd7ee
|
@ -319,19 +319,17 @@ badsys:
|
|||
/* Do syscall tracing */
|
||||
tracesys:
|
||||
SAVE_REST
|
||||
movq $-ENOSYS,RAX(%rsp)
|
||||
movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
|
||||
FIXUP_TOP_OF_STACK %rdi
|
||||
movq %rsp,%rdi
|
||||
call syscall_trace_enter
|
||||
LOAD_ARGS ARGOFFSET /* reload args from stack in case ptrace changed it */
|
||||
RESTORE_REST
|
||||
cmpq $__NR_syscall_max,%rax
|
||||
movq $-ENOSYS,%rcx
|
||||
cmova %rcx,%rax
|
||||
ja 1f
|
||||
ja int_ret_from_sys_call /* RAX(%rsp) set to -ENOSYS above */
|
||||
movq %r10,%rcx /* fixup for C */
|
||||
call *sys_call_table(,%rax,8)
|
||||
1: movq %rax,RAX-ARGOFFSET(%rsp)
|
||||
movq %rax,RAX-ARGOFFSET(%rsp)
|
||||
/* Use IRET because user could have changed frame */
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче