Commit 768877be authored by Max Filippov's avatar Max Filippov
Browse files

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: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent da94a40f
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -122,6 +122,8 @@ struct seccomp_data {
#  define __NR_seccomp 358
# elif defined(__s390__)
#  define __NR_seccomp 348
# elif defined(__xtensa__)
#  define __NR_seccomp 337
# else
#  warning "seccomp syscall number unknown for this architecture"
#  define __NR_seccomp 0xffff
@@ -1622,6 +1624,14 @@ TEST_F(TRACE_poke, getpid_runs_normally)
# define SYSCALL_SYSCALL_NUM regs[4]
# define SYSCALL_RET	regs[2]
# 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
# error "Do not know how to find your architecture's registers and syscalls"
#endif
@@ -1693,7 +1703,8 @@ void change_syscall(struct __test_metadata *_metadata,
	EXPECT_EQ(0, ret) {}

#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;
	}
@@ -1736,6 +1747,9 @@ void change_syscall(struct __test_metadata *_metadata,
	if (syscall == -1)
#ifdef SYSCALL_NUM_RET_SHARE_REG
		TH_LOG("Can't modify syscall return on this architecture");

#elif defined(__xtensa__)
		regs.SYSCALL_RET(regs) = result;
#else
		regs.SYSCALL_RET = result;
#endif