Commit a6a4d784 authored by Kees Cook's avatar Kees Cook
Browse files

selftests/seccomp: Refactor arch register macros to avoid xtensa special case



To avoid an xtensa special-case, refactor all arch register macros to
take the register variable instead of depending on the macro expanding
as a struct member name.

Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Link: https://lore.kernel.org/lkml/20200912110820.597135-2-keescook@chromium.org


Acked-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 05b52c66
Loading
Loading
Loading
Loading
+47 −50
Original line number Diff line number Diff line
@@ -1699,63 +1699,63 @@ TEST_F(TRACE_poke, getpid_runs_normally)

#if defined(__x86_64__)
# define ARCH_REGS		struct user_regs_struct
# define SYSCALL_NUM	orig_rax
# define SYSCALL_RET	rax
# define SYSCALL_NUM(_regs)	(_regs).orig_rax
# define SYSCALL_RET(_regs)	(_regs).rax
#elif defined(__i386__)
# define ARCH_REGS		struct user_regs_struct
# define SYSCALL_NUM	orig_eax
# define SYSCALL_RET	eax
# define SYSCALL_NUM(_regs)	(_regs).orig_eax
# define SYSCALL_RET(_regs)	(_regs).eax
#elif defined(__arm__)
# define ARCH_REGS		struct pt_regs
# define SYSCALL_NUM	ARM_r7
# define SYSCALL_RET	ARM_r0
# define SYSCALL_NUM(_regs)	(_regs).ARM_r7
# define SYSCALL_RET(_regs)	(_regs).ARM_r0
#elif defined(__aarch64__)
# define ARCH_REGS		struct user_pt_regs
# define SYSCALL_NUM	regs[8]
# define SYSCALL_RET	regs[0]
# define SYSCALL_NUM(_regs)	(_regs).regs[8]
# define SYSCALL_RET(_regs)	(_regs).regs[0]
#elif defined(__riscv) && __riscv_xlen == 64
# define ARCH_REGS		struct user_regs_struct
# define SYSCALL_NUM	a7
# define SYSCALL_RET	a0
# define SYSCALL_NUM(_regs)	(_regs).a7
# define SYSCALL_RET(_regs)	(_regs).a0
#elif defined(__csky__)
# define ARCH_REGS		struct pt_regs
#  if defined(__CSKYABIV2__)
# define SYSCALL_NUM	regs[3]
#   define SYSCALL_NUM(_regs)	(_regs).regs[3]
#  else
# define SYSCALL_NUM	regs[9]
#   define SYSCALL_NUM(_regs)	(_regs).regs[9]
#  endif
# define SYSCALL_RET	a0
# define SYSCALL_RET(_regs)	(_regs).a0
#elif defined(__hppa__)
# define ARCH_REGS		struct user_regs_struct
# define SYSCALL_NUM	gr[20]
# define SYSCALL_RET	gr[28]
# define SYSCALL_NUM(_regs)	(_regs).gr[20]
# define SYSCALL_RET(_regs)	(_regs).gr[28]
#elif defined(__powerpc__)
# define ARCH_REGS		struct pt_regs
# define SYSCALL_NUM	gpr[0]
# define SYSCALL_RET	gpr[3]
# define SYSCALL_NUM(_regs)	(_regs).gpr[0]
# define SYSCALL_RET(_regs)	(_regs).gpr[3]
#elif defined(__s390__)
# define ARCH_REGS		s390_regs
# define SYSCALL_NUM   gprs[2]
# define SYSCALL_RET   gprs[2]
# define SYSCALL_NUM(_regs)	(_regs).gprs[2]
# define SYSCALL_RET(_regs)	(_regs).gprs[2]
# define SYSCALL_NUM_RET_SHARE_REG
#elif defined(__mips__)
# define ARCH_REGS		struct pt_regs
# define SYSCALL_NUM	regs[2]
# define SYSCALL_NUM(_regs)	(_regs).regs[2]
# define SYSCALL_SYSCALL_NUM	regs[4]
# define SYSCALL_RET	regs[2]
# define SYSCALL_RET(_regs)	(_regs).regs[2]
# define SYSCALL_NUM_RET_SHARE_REG
#elif defined(__xtensa__)
# define ARCH_REGS		struct user_pt_regs
# define SYSCALL_NUM	syscall
# define SYSCALL_NUM(_regs)	(_regs).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]
#define SYSCALL_RET(_regs)	(_regs).a[(_regs).windowbase * 4 + 2]
#elif defined(__sh__)
# define ARCH_REGS		struct pt_regs
# define SYSCALL_NUM	gpr[3]
# define SYSCALL_RET	gpr[0]
# define SYSCALL_NUM(_regs)	(_regs).gpr[3]
# define SYSCALL_RET(_regs)	(_regs).gpr[0]
#else
# error "Do not know how to find your architecture's registers and syscalls"
#endif
@@ -1804,10 +1804,10 @@ int get_syscall(struct __test_metadata *_metadata, pid_t tracee)
#endif

#if defined(__mips__)
	if (regs.SYSCALL_NUM == __NR_O32_Linux)
	if (SYSCALL_NUM(regs) == __NR_O32_Linux)
		return regs.SYSCALL_SYSCALL_NUM;
#endif
	return regs.SYSCALL_NUM;
	return SYSCALL_NUM(regs);
}

/* Architecture-specific syscall changing routine. */
@@ -1830,14 +1830,14 @@ void change_syscall(struct __test_metadata *_metadata,
	defined(__s390__) || defined(__hppa__) || defined(__riscv) || \
	defined(__xtensa__) || defined(__csky__) || defined(__sh__)
	{
		regs.SYSCALL_NUM = syscall;
		SYSCALL_NUM(regs) = syscall;
	}
#elif defined(__mips__)
	{
		if (regs.SYSCALL_NUM == __NR_O32_Linux)
		if (SYSCALL_NUM(regs) == __NR_O32_Linux)
			regs.SYSCALL_SYSCALL_NUM = syscall;
		else
			regs.SYSCALL_NUM = syscall;
			SYSCALL_NUM(regs) = syscall;
	}

#elif defined(__arm__)
@@ -1871,11 +1871,8 @@ 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;
		SYSCALL_RET(regs) = result;
#endif

#ifdef HAVE_GETREGS