Message ID | 20210520111931.2597127-1-npiggin@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [1/2] powerpc/64s/syscall: Use pt_regs.trap to distinguish syscall ABI difference between sc and scv syscalls | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (3a81c0495fdb91fd9a9b4f617098c283131eeae1) |
snowpatch_ozlabs/checkpatch | warning | total: 0 errors, 2 warnings, 0 checks, 50 lines checked |
snowpatch_ozlabs/needsstable | warning | Please consider tagging this patch for stable! |
On Thu, May 20, 2021 at 09:19:30PM +1000, Nicholas Piggin wrote: > The sc and scv 0 system calls have different ABI conventions, and > ptracers need to know which system call type is being used if it wants > to look at the syscall registers. typo: s/if it wants/if they want/ > Document that pt_regs.trap can be used for this, and fix one in-tree user > to work with scv 0 syscalls. > > Fixes: 7fa95f9adaee ("powerpc/64s: system call support for scv/rfscv instructions") > Reported-by: "Dmitry V. Levin" <ldv@altlinux.org> > Suggested-by: "Dmitry V. Levin" <ldv@altlinux.org> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Also consider adding Cc: stable@vger.kernel.org # 5.9+ Besides that, looks good, thanks!
On Thu, 20 May 2021 21:19:30 +1000, Nicholas Piggin wrote: > The sc and scv 0 system calls have different ABI conventions, and > ptracers need to know which system call type is being used if it wants > to look at the syscall registers. > > Document that pt_regs.trap can be used for this, and fix one in-tree user > to work with scv 0 syscalls. Applied to powerpc/fixes. [1/2] powerpc/64s/syscall: Use pt_regs.trap to distinguish syscall ABI difference between sc and scv syscalls https://git.kernel.org/powerpc/c/5665bc35c1ed917ac8fd06cb651317bb47a65b10 [2/2] powerpc/64s/syscall: Fix ptrace syscall info with scv syscalls https://git.kernel.org/powerpc/c/d72500f992849d31ebae8f821a023660ddd0dcc2 cheers
diff --git a/Documentation/powerpc/syscall64-abi.rst b/Documentation/powerpc/syscall64-abi.rst index dabee3729e5a..56490c4c0c07 100644 --- a/Documentation/powerpc/syscall64-abi.rst +++ b/Documentation/powerpc/syscall64-abi.rst @@ -109,6 +109,16 @@ auxiliary vector. scv 0 syscalls will always behave as PPC_FEATURE2_HTM_NOSC. +ptrace +------ +When ptracing system calls (PTRACE_SYSCALL), the pt_regs.trap value contains +the system call type that can be used to distinguish between sc and scv 0 +system calls, and the different register conventions can be accounted for. + +If the value of (pt_regs.trap & 0xfff0) is 0xc00 then the system call was +performed with the sc instruction, if it is 0x3000 then the system call was +performed with the scv 0 instruction. + vsyscall ======== diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c index 98c3b647f54d..e3d5c77a8612 100644 --- a/tools/testing/selftests/seccomp/seccomp_bpf.c +++ b/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -1753,16 +1753,25 @@ TEST_F(TRACE_poke, getpid_runs_normally) # define SYSCALL_RET_SET(_regs, _val) \ do { \ typeof(_val) _result = (_val); \ - /* \ - * A syscall error is signaled by CR0 SO bit \ - * and the code is stored as a positive value. \ - */ \ - if (_result < 0) { \ - SYSCALL_RET(_regs) = -_result; \ - (_regs).ccr |= 0x10000000; \ - } else { \ + if ((_regs.trap & 0xfff0) == 0x3000) { \ + /* \ + * scv 0 system call uses -ve result \ + * for error, so no need to adjust. \ + */ \ SYSCALL_RET(_regs) = _result; \ - (_regs).ccr &= ~0x10000000; \ + } else { \ + /* \ + * A syscall error is signaled by the \ + * CR0 SO bit and the code is stored as \ + * a positive value. \ + */ \ + if (_result < 0) { \ + SYSCALL_RET(_regs) = -_result; \ + (_regs).ccr |= 0x10000000; \ + } else { \ + SYSCALL_RET(_regs) = _result; \ + (_regs).ccr &= ~0x10000000; \ + } \ } \ } while (0) # define SYSCALL_RET_SET_ON_PTRACE_EXIT
The sc and scv 0 system calls have different ABI conventions, and ptracers need to know which system call type is being used if it wants to look at the syscall registers. Document that pt_regs.trap can be used for this, and fix one in-tree user to work with scv 0 syscalls. Fixes: 7fa95f9adaee ("powerpc/64s: system call support for scv/rfscv instructions") Reported-by: "Dmitry V. Levin" <ldv@altlinux.org> Suggested-by: "Dmitry V. Levin" <ldv@altlinux.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- Documentation/powerpc/syscall64-abi.rst | 10 +++++++ tools/testing/selftests/seccomp/seccomp_bpf.c | 27 ++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-)