* Test code for seccomp bpf.
  */
 
+#include <sys/types.h>
 #include <asm/siginfo.h>
 #define __have_siginfo_t 1
 #define __have_sigval_t 1
 #include <linux/filter.h>
 #include <sys/prctl.h>
 #include <sys/ptrace.h>
-#include <sys/types.h>
 #include <sys/user.h>
 #include <linux/prctl.h>
 #include <linux/ptrace.h>
 # define ARCH_REGS     s390_regs
 # define SYSCALL_NUM   gprs[2]
 # define SYSCALL_RET   gprs[2]
+#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 SYSCALL_NUM_RET_SHARE_REG
 #else
 # error "Do not know how to find your architecture's registers and syscalls"
 #endif
 /* Use PTRACE_GETREGS and PTRACE_SETREGS when available. This is useful for
  * architectures without HAVE_ARCH_TRACEHOOK (e.g. User-mode Linux).
  */
-#if defined(__x86_64__) || defined(__i386__)
+#if defined(__x86_64__) || defined(__i386__) || defined(__mips__)
 #define HAVE_GETREGS
 #endif
 
        }
 #endif
 
+#if defined(__mips__)
+       if (regs.SYSCALL_NUM == __NR_O32_Linux)
+               return regs.SYSCALL_SYSCALL_NUM;
+#endif
        return regs.SYSCALL_NUM;
 }
 
        {
                regs.SYSCALL_NUM = syscall;
        }
+#elif defined(__mips__)
+       {
+               if (regs.SYSCALL_NUM == __NR_O32_Linux)
+                       regs.SYSCALL_SYSCALL_NUM = syscall;
+               else
+                       regs.SYSCALL_NUM = syscall;
+       }
 
 #elif defined(__arm__)
 # ifndef PTRACE_SET_SYSCALL
 
        /* If syscall is skipped, change return value. */
        if (syscall == -1)
+#ifdef SYSCALL_NUM_RET_SHARE_REG
+               TH_LOG("Can't modify syscall return on this architecture");
+#else
                regs.SYSCALL_RET = 1;
+#endif
 
 #ifdef HAVE_GETREGS
        ret = ptrace(PTRACE_SETREGS, tracee, 0, ®s);
        ret = prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &self->prog, 0, 0);
        ASSERT_EQ(0, ret);
 
+#ifdef SYSCALL_NUM_RET_SHARE_REG
+       /* gettid has been skipped */
+       EXPECT_EQ(-1, syscall(__NR_gettid));
+#else
        /* gettid has been skipped and an altered return value stored. */
        EXPECT_EQ(1, syscall(__NR_gettid));
+#endif
        EXPECT_NE(self->mytid, syscall(__NR_gettid));
 }