mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-13 00:20:06 +00:00
selftests/seccomp: add xtensa support
Xtensa syscall number can be obtained and changed through the struct user_pt_regs. Syscall return value register is fixed relatively to the current register window in the user_pt_regs, so it needs a bit of special treatment. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
da94a40f72
commit
768877beed
@ -122,6 +122,8 @@ struct seccomp_data {
|
|||||||
# define __NR_seccomp 358
|
# define __NR_seccomp 358
|
||||||
# elif defined(__s390__)
|
# elif defined(__s390__)
|
||||||
# define __NR_seccomp 348
|
# define __NR_seccomp 348
|
||||||
|
# elif defined(__xtensa__)
|
||||||
|
# define __NR_seccomp 337
|
||||||
# else
|
# else
|
||||||
# warning "seccomp syscall number unknown for this architecture"
|
# warning "seccomp syscall number unknown for this architecture"
|
||||||
# define __NR_seccomp 0xffff
|
# define __NR_seccomp 0xffff
|
||||||
@ -1622,6 +1624,14 @@ TEST_F(TRACE_poke, getpid_runs_normally)
|
|||||||
# define SYSCALL_SYSCALL_NUM regs[4]
|
# define SYSCALL_SYSCALL_NUM regs[4]
|
||||||
# define SYSCALL_RET regs[2]
|
# define SYSCALL_RET regs[2]
|
||||||
# define SYSCALL_NUM_RET_SHARE_REG
|
# define SYSCALL_NUM_RET_SHARE_REG
|
||||||
|
#elif defined(__xtensa__)
|
||||||
|
# define ARCH_REGS struct user_pt_regs
|
||||||
|
# define SYSCALL_NUM syscall
|
||||||
|
/*
|
||||||
|
* On xtensa syscall return value is in the register
|
||||||
|
* a2 of the current window which is not fixed.
|
||||||
|
*/
|
||||||
|
#define SYSCALL_RET(reg) a[(reg).windowbase * 4 + 2]
|
||||||
#else
|
#else
|
||||||
# error "Do not know how to find your architecture's registers and syscalls"
|
# error "Do not know how to find your architecture's registers and syscalls"
|
||||||
#endif
|
#endif
|
||||||
@ -1693,7 +1703,8 @@ void change_syscall(struct __test_metadata *_metadata,
|
|||||||
EXPECT_EQ(0, ret) {}
|
EXPECT_EQ(0, ret) {}
|
||||||
|
|
||||||
#if defined(__x86_64__) || defined(__i386__) || defined(__powerpc__) || \
|
#if defined(__x86_64__) || defined(__i386__) || defined(__powerpc__) || \
|
||||||
defined(__s390__) || defined(__hppa__) || defined(__riscv)
|
defined(__s390__) || defined(__hppa__) || defined(__riscv) || \
|
||||||
|
defined(__xtensa__)
|
||||||
{
|
{
|
||||||
regs.SYSCALL_NUM = syscall;
|
regs.SYSCALL_NUM = syscall;
|
||||||
}
|
}
|
||||||
@ -1736,6 +1747,9 @@ void change_syscall(struct __test_metadata *_metadata,
|
|||||||
if (syscall == -1)
|
if (syscall == -1)
|
||||||
#ifdef SYSCALL_NUM_RET_SHARE_REG
|
#ifdef SYSCALL_NUM_RET_SHARE_REG
|
||||||
TH_LOG("Can't modify syscall return on this architecture");
|
TH_LOG("Can't modify syscall return on this architecture");
|
||||||
|
|
||||||
|
#elif defined(__xtensa__)
|
||||||
|
regs.SYSCALL_RET(regs) = result;
|
||||||
#else
|
#else
|
||||||
regs.SYSCALL_RET = result;
|
regs.SYSCALL_RET = result;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user