Previously the seccomp would only support strict mode on O32 userland
programs when the kernel had support for both O32 and N32 ABIs. Remove
kludge and support both ABIs.

With this patch in place, the seccomp_bpf self test now passes
global.mode_strict_support with N32 userland.

Suggested-by: Paul Burton <[email protected]>
Signed-off-by: Matt Redfearn <[email protected]>
---

Changes in v2: None

 arch/mips/include/asm/seccomp.h | 47 +++++++++++++++++++++++------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/arch/mips/include/asm/seccomp.h b/arch/mips/include/asm/seccomp.h
index 1d8a2e2c75c1..684fb3a12ed3 100644
--- a/arch/mips/include/asm/seccomp.h
+++ b/arch/mips/include/asm/seccomp.h
@@ -2,27 +2,32 @@
 
 #include <linux/unistd.h>
 
-/*
- * Kludge alert:
- *
- * The generic seccomp code currently allows only a single compat ABI. Until
- * this is fixed we priorize O32 as the compat ABI over N32.
- */
-#ifdef CONFIG_MIPS32_O32
-
-#define __NR_seccomp_read_32           4003
-#define __NR_seccomp_write_32          4004
-#define __NR_seccomp_exit_32           4001
-#define __NR_seccomp_sigreturn_32      4193    /* rt_sigreturn */
-
-#elif defined(CONFIG_MIPS32_N32)
-
-#define __NR_seccomp_read_32           6000
-#define __NR_seccomp_write_32          6001
-#define __NR_seccomp_exit_32           6058
-#define __NR_seccomp_sigreturn_32      6211    /* rt_sigreturn */
-
-#endif /* CONFIG_MIPS32_O32 */
+#ifdef CONFIG_COMPAT
+static inline const int *get_compat_mode1_syscalls(void)
+{
+       static const int syscalls_O32[] = {
+               __NR_O32_Linux + 3, __NR_O32_Linux + 4,
+               __NR_O32_Linux + 1, __NR_O32_Linux + 193,
+               0, /* null terminated */
+       };
+       static const int syscalls_N32[] = {
+               __NR_N32_Linux + 0, __NR_N32_Linux + 1,
+               __NR_N32_Linux + 58, __NR_N32_Linux + 211,
+               0, /* null terminated */
+       };
+
+       if (config_enabled(CONFIG_MIPS32_O32) && 
test_thread_flag(TIF_32BIT_REGS))
+               return syscalls_O32;
+
+       if (config_enabled(CONFIG_MIPS32_N32))
+               return syscalls_N32;
+
+       BUG();
+}
+
+#define get_compat_mode1_syscalls get_compat_mode1_syscalls
+
+#endif /* CONFIG_COMPAT */
 
 #include <asm-generic/seccomp.h>
 
-- 
2.5.0

Reply via email to