mirror of https://gitee.com/openkylin/linux.git
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: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/lkml/20200912110820.597135-2-keescook@chromium.org Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
parent
05b52c6625
commit
a6a4d78419
|
@ -1698,64 +1698,64 @@ 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 ARCH_REGS struct user_regs_struct
|
||||
# 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 ARCH_REGS struct user_regs_struct
|
||||
# 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 ARCH_REGS struct pt_regs
|
||||
# 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 ARCH_REGS struct user_pt_regs
|
||||
# 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 ARCH_REGS struct user_regs_struct
|
||||
# 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]
|
||||
#else
|
||||
# define SYSCALL_NUM regs[9]
|
||||
#endif
|
||||
# define SYSCALL_RET a0
|
||||
# define ARCH_REGS struct pt_regs
|
||||
# if defined(__CSKYABIV2__)
|
||||
# define SYSCALL_NUM(_regs) (_regs).regs[3]
|
||||
# else
|
||||
# define SYSCALL_NUM(_regs) (_regs).regs[9]
|
||||
# endif
|
||||
# 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 ARCH_REGS struct user_regs_struct
|
||||
# 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 ARCH_REGS struct pt_regs
|
||||
# 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 ARCH_REGS s390_regs
|
||||
# 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_SYSCALL_NUM regs[4]
|
||||
# define SYSCALL_RET regs[2]
|
||||
# define ARCH_REGS struct pt_regs
|
||||
# define SYSCALL_NUM(_regs) (_regs).regs[2]
|
||||
# define SYSCALL_SYSCALL_NUM regs[4]
|
||||
# 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 ARCH_REGS struct user_pt_regs
|
||||
# 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 ARCH_REGS struct pt_regs
|
||||
# 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
|
||||
|
|
Loading…
Reference in New Issue