selftests/seccomp: Refactor arch register macros to avoid xtensa special case
authorKees Cook <keescook@chromium.org>
Sat, 12 Sep 2020 11:08:06 +0000 (04:08 -0700)
committerKees Cook <keescook@chromium.org>
Sat, 19 Sep 2020 07:59:22 +0000 (00:59 -0700)
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>
tools/testing/selftests/seccomp/seccomp_bpf.c

index 6ddef9f..a261643 100644 (file)
@@ -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