Message ID | 20160415151103.GB11180@ls3530.dhcp.wdf.sap.corp (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Hi Paul, On 15.04.2016 17:11, Helge Deller wrote: > This patch (v3) adds support for the parisc and parisc64 architectures > to libseccomp. Linux kernel 4.5.2-1 with full seccomp support for parisc/hppa is now publically available in debian: https://buildd.debian.org/status/package.php?p=linux&suite=sid Any chance to get this patch (v3) applied to the libseccomp git tree now ? Thanks, Helge > I didn't split up the patch, because it's pretty trivial. > Those parisc-specific files gets added: > src/arch-parisc-syscalls.c > src/arch-parisc.c > src/arch-parisc.h > src/arch-parisc64.c > > All other changes are trivial because they simply add parisc-specific > case statements in variouse switch statements. > > I did ran a "make check" on parisc and all testcases suceeded. > All live testcases succeed as well when running "./regression -T live". > > The patch applies cleanly to current libseccomp git head. > > Changes between v2 and v1 of this patch: > - Enabled seccomp mode 2 regression tests on parisc. Kernel support for hppa > was added in kernel 4.6-rc1 and backported into the kernel v4.5.2 stable > series. > > Changes between v3 and v2 of this patch: > - Stipped out patch which reports if a check was skipped because valgrind > isn't installed. > - Added tuxcall pseudo syscall for 19-sim-missing_syscalls testcase > - Added sysmips pseudo syscall for 29-sim-pseudo_syscall testcase > > Thanks, > Helge > > Signed-off-by: Helge Deller <deller@gmx.de> > > diffstat: > include/seccomp.h.in | 6 > src/Makefile.am | 2 > src/arch-parisc-syscalls.c | 424 ++++++++++++++++++++++++++++++++++++++ > src/arch-parisc.c | 22 + > src/arch-parisc.h | 38 +++ > src/arch-parisc64.c | 22 + > src/arch-syscall-dump.c | 5 > src/arch.c | 13 + > src/gen_pfc.c | 4 > src/python/libseccomp.pxd | 2 > src/python/seccomp.pyx | 8 > tests/26-sim-arch_all_be_basic.c | 6 > tests/26-sim-arch_all_be_basic.py | 2 > tests/regression | 3 > tools/scmp_arch_detect.c | 6 > tools/scmp_bpf_sim.c | 4 > tools/util.c | 4 > 17 files changed, 570 insertions(+), 1 deletion(-) > > diff --git a/include/seccomp.h.in b/include/seccomp.h.in > index 6bf6751..5b9057f 100644 > --- a/include/seccomp.h.in > +++ b/include/seccomp.h.in > @@ -185,6 +185,12 @@ struct scmp_arg_cmp { > #define SCMP_ARCH_S390X AUDIT_ARCH_S390X > > /** > + * The PA-RISC hppa architecture tokens > + */ > +#define SCMP_ARCH_PARISC AUDIT_ARCH_PARISC > +#define SCMP_ARCH_PARISC64 AUDIT_ARCH_PARISC64 > + > +/** > * Convert a syscall name into the associated syscall number > * @param x the syscall name > */ > diff --git a/src/Makefile.am b/src/Makefile.am > index c2d805e..dcc79d9 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -35,6 +35,8 @@ SOURCES_ALL = \ > arch-mips.h arch-mips.c arch-mips-syscalls.c \ > arch-mips64.h arch-mips64.c arch-mips64-syscalls.c \ > arch-mips64n32.h arch-mips64n32.c arch-mips64n32-syscalls.c \ > + arch-parisc.h arch-parisc.c arch-parisc-syscalls.c \ > + arch-parisc64.h arch-parisc64.c \ > arch-ppc.h arch-ppc.c arch-ppc-syscalls.c \ > arch-ppc64.h arch-ppc64.c arch-ppc64-syscalls.c \ > arch-s390.h arch-s390.c arch-s390-syscalls.c \ > diff --git a/src/arch-parisc-syscalls.c b/src/arch-parisc-syscalls.c > new file mode 100644 > index 0000000..78474e1 > --- /dev/null > +++ b/src/arch-parisc-syscalls.c > @@ -0,0 +1,424 @@ > +/* > + * Copyright 2016 > + * Author: Helge Deller <deller@gmx.de> > + */ > + > +#include <string.h> > + > +#include <seccomp.h> > + > +#include "arch.h" > +#include "arch-parisc.h" > + > +#ifndef __NR_Linux > +#define __NR_Linux 0 > +#endif > + > +/* NOTE: based on Linux 4.3 */ > +const struct arch_syscall_def parisc_syscall_table[] = { \ > + { "_llseek", (__NR_Linux + 140) }, > + { "_newselect", (__NR_Linux + 142) }, > + { "_sysctl", (__NR_Linux + 149) }, > + { "accept4", (__NR_Linux + 320) }, > + { "accept", (__NR_Linux + 35) }, > + { "access", (__NR_Linux + 33) }, > + { "acct", (__NR_Linux + 51) }, > + { "acl_get", (__NR_Linux + 204) }, > + { "acl_set", (__NR_Linux + 205) }, > + { "add_key", (__NR_Linux + 264) }, > + { "adjtimex", (__NR_Linux + 124) }, > + { "afs_syscall", (__NR_Linux + 137) }, > + { "alarm", (__NR_Linux + 27) }, > + { "alloc_hugepages", (__NR_Linux + 220) }, > + { "attrctl", (__NR_Linux + 203) }, > + { "bdflush", (__NR_Linux + 134) }, > + { "bind", (__NR_Linux + 22) }, > + { "bpf", (__NR_Linux + 341) }, > + { "brk", (__NR_Linux + 45) }, > + { "capget", (__NR_Linux + 106) }, > + { "capset", (__NR_Linux + 107) }, > + { "chdir", (__NR_Linux + 12) }, > + { "chmod", (__NR_Linux + 15) }, > + { "chown", (__NR_Linux + 180) }, > + { "chroot", (__NR_Linux + 61) }, > + { "clock_adjtime", (__NR_Linux + 324) }, > + { "clock_getres", (__NR_Linux + 257) }, > + { "clock_gettime", (__NR_Linux + 256) }, > + { "clock_nanosleep", (__NR_Linux + 258) }, > + { "clock_settime", (__NR_Linux + 255) }, > + { "clone", (__NR_Linux + 120) }, > + { "close", (__NR_Linux + 6) }, > + { "connect", (__NR_Linux + 31) }, > + { "create_module", (__NR_Linux + 127) }, > + { "creat", (__NR_Linux + 8) }, > + { "delete_module", (__NR_Linux + 129) }, > + { "dup2", (__NR_Linux + 63) }, > + { "dup3", (__NR_Linux + 312) }, > + { "dup", (__NR_Linux + 41) }, > + { "epoll_create1", (__NR_Linux + 311) }, > + { "epoll_create", (__NR_Linux + 224) }, > + { "epoll_ctl", (__NR_Linux + 225) }, > + { "epoll_pwait", (__NR_Linux + 297) }, > + { "epoll_wait", (__NR_Linux + 226) }, > + { "eventfd2", (__NR_Linux + 310) }, > + { "eventfd", (__NR_Linux + 304) }, > + { "execveat", (__NR_Linux + 342) }, > + { "execve", (__NR_Linux + 11) }, > + { "exit_group", (__NR_Linux + 222) }, > + { "exit", (__NR_Linux + 1) }, > + { "faccessat", (__NR_Linux + 287) }, > + { "fadvise64_64", (__NR_Linux + 236) }, > + { "fallocate", (__NR_Linux + 305) }, > + { "fanotify_init", (__NR_Linux + 322) }, > + { "fanotify_mark", (__NR_Linux + 323) }, > + { "fchdir", (__NR_Linux + 133) }, > + { "fchmodat", (__NR_Linux + 286) }, > + { "fchmod", (__NR_Linux + 94) }, > + { "fchownat", (__NR_Linux + 278) }, > + { "fchown", (__NR_Linux + 95) }, > + { "fcntl64", (__NR_Linux + 202) }, > + { "fcntl", (__NR_Linux + 55) }, > + { "fdatasync", (__NR_Linux + 148) }, > + { "fgetxattr", (__NR_Linux + 243) }, > + { "finit_module", (__NR_Linux + 333) }, > + { "flistxattr", (__NR_Linux + 246) }, > + { "flock", (__NR_Linux + 143) }, > + { "fork", (__NR_Linux + 2) }, > + { "free_hugepages", (__NR_Linux + 221) }, > + { "fremovexattr", (__NR_Linux + 249) }, > + { "fsetxattr", (__NR_Linux + 240) }, > + { "fstat64", (__NR_Linux + 112) }, > + { "fstatat64", (__NR_Linux + 280) }, > + { "fstatfs64", (__NR_Linux + 299) }, > + { "fstatfs", (__NR_Linux + 100) }, > + { "fstat", (__NR_Linux + 28) }, > + { "fsync", (__NR_Linux + 118) }, > + { "ftruncate64", (__NR_Linux + 200) }, > + { "ftruncate", (__NR_Linux + 93) }, > + { "futex", (__NR_Linux + 210) }, > + { "futimesat", (__NR_Linux + 279) }, > + { "getcpu", (__NR_Linux + 296) }, > + { "getcwd", (__NR_Linux + 110) }, > + { "getdents64", (__NR_Linux + 201) }, > + { "getdents", (__NR_Linux + 141) }, > + { "getegid", (__NR_Linux + 50) }, > + { "geteuid", (__NR_Linux + 49) }, > + { "getgid", (__NR_Linux + 47) }, > + { "getgroups", (__NR_Linux + 80) }, > + { "getitimer", (__NR_Linux + 105) }, > + { "get_kernel_syms", (__NR_Linux + 130) }, > + { "get_mempolicy", (__NR_Linux + 261) }, > + { "getpeername", (__NR_Linux + 53) }, > + { "getpgid", (__NR_Linux + 132) }, > + { "getpgrp", (__NR_Linux + 65) }, > + { "getpid", (__NR_Linux + 20) }, > + { "getpmsg", (__NR_Linux + 196) }, > + { "getppid", (__NR_Linux + 64) }, > + { "getpriority", (__NR_Linux + 96) }, > + { "getrandom", (__NR_Linux + 339) }, > + { "getresgid", (__NR_Linux + 171) }, > + { "getresuid", (__NR_Linux + 165) }, > + { "getrlimit", (__NR_Linux + 76) }, > + { "get_robust_list", (__NR_Linux + 290) }, > + { "getrusage", (__NR_Linux + 77) }, > + { "getsid", (__NR_Linux + 147) }, > + { "getsockname", (__NR_Linux + 44) }, > + { "getsockopt", (__NR_Linux + 182) }, > + { "get_thread_area", (__NR_Linux + 214) }, > + { "gettid", (__NR_Linux + 206) }, > + { "gettimeofday", (__NR_Linux + 78) }, > + { "getuid", (__NR_Linux + 24) }, > + { "getxattr", (__NR_Linux + 241) }, > + { "init_module", (__NR_Linux + 128) }, > + { "inotify_add_watch", (__NR_Linux + 270) }, > + { "inotify_init1", (__NR_Linux + 314) }, > + { "inotify_init", (__NR_Linux + 269) }, > + { "inotify_rm_watch", (__NR_Linux + 271) }, > + { "io_cancel", (__NR_Linux + 219) }, > + { "ioctl", (__NR_Linux + 54) }, > + { "io_destroy", (__NR_Linux + 216) }, > + { "io_getevents", (__NR_Linux + 217) }, > + { "ioprio_get", (__NR_Linux + 268) }, > + { "ioprio_set", (__NR_Linux + 267) }, > + { "io_setup", (__NR_Linux + 215) }, > + { "io_submit", (__NR_Linux + 218) }, > + { "kcmp", (__NR_Linux + 332) }, > + { "kexec_load", (__NR_Linux + 300) }, > + { "keyctl", (__NR_Linux + 266) }, > + { "kill", (__NR_Linux + 37) }, > + { "lchown", (__NR_Linux + 16) }, > + { "lgetxattr", (__NR_Linux + 242) }, > + { "linkat", (__NR_Linux + 283) }, > + { "link", (__NR_Linux + 9) }, > + { "listen", (__NR_Linux + 32) }, > + { "listxattr", (__NR_Linux + 244) }, > + { "llistxattr", (__NR_Linux + 245) }, > + { "lookup_dcookie", (__NR_Linux + 223) }, > + { "lremovexattr", (__NR_Linux + 248) }, > + { "lseek", (__NR_Linux + 19) }, > + { "lsetxattr", (__NR_Linux + 239) }, > + { "lstat64", (__NR_Linux + 198) }, > + { "lstat", (__NR_Linux + 84) }, > + { "madvise", (__NR_Linux + 119) }, > + { "mbind", (__NR_Linux + 260) }, > + { "memfd_create", (__NR_Linux + 340) }, > + { "migrate_pages", (__NR_Linux + 272) }, > + { "mincore", (__NR_Linux + 72) }, > + { "mkdirat", (__NR_Linux + 276) }, > + { "mkdir", (__NR_Linux + 39) }, > + { "mknodat", (__NR_Linux + 277) }, > + { "mknod", (__NR_Linux + 14) }, > + { "mlockall", (__NR_Linux + 152) }, > + { "mlock", (__NR_Linux + 150) }, > + { "mmap2", (__NR_Linux + 89) }, > + { "mmap", (__NR_Linux + 90) }, > + { "mount", (__NR_Linux + 21) }, > + { "move_pages", (__NR_Linux + 295) }, > + { "mprotect", (__NR_Linux + 125) }, > + { "mq_getsetattr", (__NR_Linux + 234) }, > + { "mq_notify", (__NR_Linux + 233) }, > + { "mq_open", (__NR_Linux + 229) }, > + { "mq_timedreceive", (__NR_Linux + 232) }, > + { "mq_timedsend", (__NR_Linux + 231) }, > + { "mq_unlink", (__NR_Linux + 230) }, > + { "mremap", (__NR_Linux + 163) }, > + { "msgctl", (__NR_Linux + 191) }, > + { "msgget", (__NR_Linux + 190) }, > + { "msgrcv", (__NR_Linux + 189) }, > + { "msgsnd", (__NR_Linux + 188) }, > + { "msync", (__NR_Linux + 144) }, > + { "munlockall", (__NR_Linux + 153) }, > + { "munlock", (__NR_Linux + 151) }, > + { "munmap", (__NR_Linux + 91) }, > + { "name_to_handle_at", (__NR_Linux + 325) }, > + { "nanosleep", (__NR_Linux + 162) }, > + { "nfsservctl", (__NR_Linux + 169) }, > + { "nice", (__NR_Linux + 34) }, > + { "openat", (__NR_Linux + 275) }, > + { "open_by_handle_at", (__NR_Linux + 326) }, > + { "open", (__NR_Linux + 5) }, > + { "pause", (__NR_Linux + 29) }, > + { "perf_event_open", (__NR_Linux + 318) }, > + { "personality", (__NR_Linux + 136) }, > + { "pipe2", (__NR_Linux + 313) }, > + { "pipe", (__NR_Linux + 42) }, > + { "pivot_root", (__NR_Linux + 67) }, > + { "poll", (__NR_Linux + 168) }, > + { "ppoll", (__NR_Linux + 274) }, > + { "prctl", (__NR_Linux + 172) }, > + { "pread64", (__NR_Linux + 108) }, > + { "preadv", (__NR_Linux + 315) }, > + { "prlimit64", (__NR_Linux + 321) }, > + { "process_vm_readv", (__NR_Linux + 330) }, > + { "process_vm_writev", (__NR_Linux + 331) }, > + { "pselect6", (__NR_Linux + 273) }, > + { "ptrace", (__NR_Linux + 26) }, > + { "putpmsg", (__NR_Linux + 197) }, > + { "pwrite64", (__NR_Linux + 109) }, > + { "pwritev", (__NR_Linux + 316) }, > + { "query_module", (__NR_Linux + 167) }, > + { "quotactl", (__NR_Linux + 131) }, > + { "readahead", (__NR_Linux + 207) }, > + { "readlinkat", (__NR_Linux + 285) }, > + { "readlink", (__NR_Linux + 85) }, > + { "read", (__NR_Linux + 3) }, > + { "readv", (__NR_Linux + 145) }, > + { "reboot", (__NR_Linux + 88) }, > + { "recvfrom", (__NR_Linux + 123) }, > + { "recvmmsg", (__NR_Linux + 319) }, > + { "recvmsg", (__NR_Linux + 184) }, > + { "recv", (__NR_Linux + 98) }, > + { "remap_file_pages", (__NR_Linux + 227) }, > + { "removexattr", (__NR_Linux + 247) }, > + { "renameat2", (__NR_Linux + 337) }, > + { "renameat", (__NR_Linux + 282) }, > + { "rename", (__NR_Linux + 38) }, > + { "request_key", (__NR_Linux + 265) }, > + { "restart_syscall", (__NR_Linux + 0) }, > + { "rmdir", (__NR_Linux + 40) }, > + { "rt_sigaction", (__NR_Linux + 174) }, > + { "rt_sigpending", (__NR_Linux + 176) }, > + { "rt_sigprocmask", (__NR_Linux + 175) }, > + { "rt_sigqueueinfo", (__NR_Linux + 178) }, > + { "rt_sigreturn", (__NR_Linux + 173) }, > + { "rt_sigsuspend", (__NR_Linux + 179) }, > + { "rt_sigtimedwait", (__NR_Linux + 177) }, > + { "rt_tgsigqueueinfo", (__NR_Linux + 317) }, > + { "sched_getaffinity", (__NR_Linux + 212) }, > + { "sched_getattr", (__NR_Linux + 335) }, > + { "sched_getparam", (__NR_Linux + 155) }, > + { "sched_get_priority_max", (__NR_Linux + 159) }, > + { "sched_get_priority_min", (__NR_Linux + 160) }, > + { "sched_getscheduler", (__NR_Linux + 157) }, > + { "sched_rr_get_interval", (__NR_Linux + 161) }, > + { "sched_setaffinity", (__NR_Linux + 211) }, > + { "sched_setattr", (__NR_Linux + 334) }, > + { "sched_setparam", (__NR_Linux + 154) }, > + { "sched_setscheduler", (__NR_Linux + 156) }, > + { "sched_yield", (__NR_Linux + 158) }, > + { "seccomp", (__NR_Linux + 338) }, > + { "semctl", (__NR_Linux + 187) }, > + { "semget", (__NR_Linux + 186) }, > + { "semop", (__NR_Linux + 185) }, > + { "semtimedop", (__NR_Linux + 228) }, > + { "sendfile64", (__NR_Linux + 209) }, > + { "sendfile", (__NR_Linux + 122) }, > + { "sendmmsg", (__NR_Linux + 329) }, > + { "sendmsg", (__NR_Linux + 183) }, > + { "send", (__NR_Linux + 58) }, > + { "sendto", (__NR_Linux + 82) }, > + { "setdomainname", (__NR_Linux + 121) }, > + { "setfsgid", (__NR_Linux + 139) }, > + { "setfsuid", (__NR_Linux + 138) }, > + { "setgid", (__NR_Linux + 46) }, > + { "setgroups", (__NR_Linux + 81) }, > + { "sethostname", (__NR_Linux + 74) }, > + { "setitimer", (__NR_Linux + 104) }, > + { "set_mempolicy", (__NR_Linux + 262) }, > + { "setns", (__NR_Linux + 328) }, > + { "setpgid", (__NR_Linux + 57) }, > + { "setpriority", (__NR_Linux + 97) }, > + { "setregid", (__NR_Linux + 71) }, > + { "setresgid", (__NR_Linux + 170) }, > + { "setresuid", (__NR_Linux + 164) }, > + { "setreuid", (__NR_Linux + 70) }, > + { "setrlimit", (__NR_Linux + 75) }, > + { "set_robust_list", (__NR_Linux + 289) }, > + { "setsid", (__NR_Linux + 66) }, > + { "setsockopt", (__NR_Linux + 181) }, > + { "set_thread_area", (__NR_Linux + 213) }, > + { "set_tid_address", (__NR_Linux + 237) }, > + { "settimeofday", (__NR_Linux + 79) }, > + { "setuid", (__NR_Linux + 23) }, > + { "setxattr", (__NR_Linux + 238) }, > + { "sgetmask", (__NR_Linux + 68) }, > + { "shmat", (__NR_Linux + 192) }, > + { "shmctl", (__NR_Linux + 195) }, > + { "shmdt", (__NR_Linux + 193) }, > + { "shmget", (__NR_Linux + 194) }, > + { "shutdown", (__NR_Linux + 117) }, > + { "sigaltstack", (__NR_Linux + 166) }, > + { "signalfd4", (__NR_Linux + 309) }, > + { "signalfd", (__NR_Linux + 302) }, > + { "signal", (__NR_Linux + 48) }, > + { "sigpending", (__NR_Linux + 73) }, > + { "sigprocmask", (__NR_Linux + 126) }, > + { "socket", (__NR_Linux + 17) }, > + { "socketpair", (__NR_Linux + 56) }, > + { "splice", (__NR_Linux + 291) }, > + { "ssetmask", (__NR_Linux + 69) }, > + { "stat64", (__NR_Linux + 101) }, > + { "statfs64", (__NR_Linux + 298) }, > + { "statfs", (__NR_Linux + 99) }, > + { "stat", (__NR_Linux + 18) }, > + { "stime", (__NR_Linux + 25) }, > + { "swapoff", (__NR_Linux + 115) }, > + { "swapon", (__NR_Linux + 87) }, > + { "symlinkat", (__NR_Linux + 284) }, > + { "symlink", (__NR_Linux + 83) }, > + { "sync_file_range", (__NR_Linux + 292) }, > + { "syncfs", (__NR_Linux + 327) }, > + { "sync", (__NR_Linux + 36) }, > + { "sysfs", (__NR_Linux + 135) }, > + { "sysmips", __PNR_sysmips }, > + { "sysinfo", (__NR_Linux + 116) }, > + { "syslog", (__NR_Linux + 103) }, > + { "tee", (__NR_Linux + 293) }, > + { "tgkill", (__NR_Linux + 259) }, > + { "time", (__NR_Linux + 13) }, > + { "timer_create", (__NR_Linux + 250) }, > + { "timer_delete", (__NR_Linux + 254) }, > + { "timerfd_create", (__NR_Linux + 306) }, > + { "timerfd_gettime", (__NR_Linux + 308) }, > + { "timerfd", (__NR_Linux + 303) }, > + { "timerfd_settime", (__NR_Linux + 307) }, > + { "timer_getoverrun", (__NR_Linux + 253) }, > + { "timer_gettime", (__NR_Linux + 252) }, > + { "timer_settime", (__NR_Linux + 251) }, > + { "times", (__NR_Linux + 43) }, > + { "tkill", (__NR_Linux + 208) }, > + { "truncate64", (__NR_Linux + 199) }, > + { "truncate", (__NR_Linux + 92) }, > + { "tuxcall", __PNR_tuxcall }, > + { "umask", (__NR_Linux + 60) }, > + { "umount2", (__NR_Linux + 52) }, > + { "uname", (__NR_Linux + 59) }, > + { "unlinkat", (__NR_Linux + 281) }, > + { "unlink", (__NR_Linux + 10) }, > + { "unshare", (__NR_Linux + 288) }, > + { "uselib", (__NR_Linux + 86) }, > + { "ustat", (__NR_Linux + 62) }, > + { "utime", (__NR_Linux + 30) }, > + { "utimensat", (__NR_Linux + 301) }, > + { "utimes", (__NR_Linux + 336) }, > + { "vfork", (__NR_Linux + 113) }, > + { "vhangup", (__NR_Linux + 111) }, > + { "vmsplice", (__NR_Linux + 294) }, > + { "vserver", (__NR_Linux + 263) }, > + { "wait4", (__NR_Linux + 114) }, > + { "waitid", (__NR_Linux + 235) }, > + { "waitpid", (__NR_Linux + 7) }, > + { "write", (__NR_Linux + 4) }, > + { "writev", (__NR_Linux + 146) }, > + { NULL, __NR_SCMP_ERROR }, > +}; > + > +/** > + * Resolve a syscall name to a number > + * @param name the syscall name > + * > + * Resolve the given syscall name to the syscall number using the syscall table. > + * Returns the syscall number on success, including negative pseudo syscall > + * numbers; returns __NR_SCMP_ERROR on failure. > + * > + */ > +int parisc_syscall_resolve_name(const char *name) > +{ > + unsigned int iter; > + const struct arch_syscall_def *table = parisc_syscall_table; > + > + /* XXX - plenty of room for future improvement here */ > + for (iter = 0; table[iter].name != NULL; iter++) { > + if (strcmp(name, table[iter].name) == 0) > + return table[iter].num; > + } > + > + return __NR_SCMP_ERROR; > +} > + > +/** > + * Resolve a syscall number to a name > + * @param num the syscall number > + * > + * Resolve the given syscall number to the syscall name using the syscall table. > + * Returns a pointer to the syscall name string on success, including pseudo > + * syscall names; returns NULL on failure. > + * > + */ > +const char *parisc_syscall_resolve_num(int num) > +{ > + unsigned int iter; > + const struct arch_syscall_def *table = parisc_syscall_table; > + > + /* XXX - plenty of room for future improvement here */ > + for (iter = 0; table[iter].num != __NR_SCMP_ERROR; iter++) { > + if (num == table[iter].num) > + return table[iter].name; > + } > + > + return NULL; > +} > + > +/** > + * Iterate through the syscall table and return the syscall name > + * @param spot the offset into the syscall table > + * > + * Return the syscall name at position @spot or NULL on failure. This function > + * should only ever be used internally by libseccomp. > + * > + */ > +const char *parisc_syscall_iterate_name(unsigned int spot) > +{ > + /* XXX - no safety checks here */ > + return parisc_syscall_table[spot].name; > +} > diff --git a/src/arch-parisc.c b/src/arch-parisc.c > new file mode 100644 > index 0000000..6407f8a > --- /dev/null > +++ b/src/arch-parisc.c > @@ -0,0 +1,22 @@ > +/* > + * Copyright 2016 > + * Author: Helge Deller <deller@gmx.de> > + */ > + > +#include <stdlib.h> > +#include <errno.h> > +#include <linux/audit.h> > + > +#include "arch.h" > +#include "arch-parisc.h" > + > +const struct arch_def arch_def_parisc = { > + .token = SCMP_ARCH_PARISC, > + .token_bpf = AUDIT_ARCH_PARISC, > + .size = ARCH_SIZE_32, > + .endian = ARCH_ENDIAN_BIG, > + .syscall_resolve_name = parisc_syscall_resolve_name, > + .syscall_resolve_num = parisc_syscall_resolve_num, > + .syscall_rewrite = NULL, > + .rule_add = NULL, > +}; > diff --git a/src/arch-parisc.h b/src/arch-parisc.h > new file mode 100644 > index 0000000..b9fe1df > --- /dev/null > +++ b/src/arch-parisc.h > @@ -0,0 +1,38 @@ > +/** > + * Enhanced Seccomp PARISC Specific Code > + * > + * Copyright (c) 2016 Helge Deller <deller@gmx.de> > + * > + */ > + > +/* > + * This library is free software; you can redistribute it and/or modify it > + * under the terms of version 2.1 of the GNU Lesser General Public License as > + * published by the Free Software Foundation. > + * > + * This library is distributed in the hope that it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License > + * for more details. > + * > + * You should have received a copy of the GNU Lesser General Public License > + * along with this library; if not, see <http://www.gnu.org/licenses>. > + */ > + > +#ifndef _ARCH_PARISC_H > +#define _ARCH_PARISC_H > + > +#include <inttypes.h> > + > +#include "arch.h" > +#include "system.h" > + > +extern const struct arch_def arch_def_parisc; > +extern const struct arch_def arch_def_parisc64; > + > +int parisc_syscall_resolve_name(const char *name); > +const char *parisc_syscall_resolve_num(int num); > + > +const char *parisc_syscall_iterate_name(unsigned int spot); > + > +#endif > diff --git a/src/arch-parisc64.c b/src/arch-parisc64.c > new file mode 100644 > index 0000000..b75a182 > --- /dev/null > +++ b/src/arch-parisc64.c > @@ -0,0 +1,22 @@ > +/* > + * Copyright 2016 > + * Author: Helge Deller <deller@gmx.de> > +*/ > + > +#include <stdlib.h> > +#include <errno.h> > +#include <linux/audit.h> > + > +#include "arch.h" > +#include "arch-parisc.h" > + > +const struct arch_def arch_def_parisc64 = { > + .token = SCMP_ARCH_PARISC64, > + .token_bpf = AUDIT_ARCH_PARISC64, > + .size = ARCH_SIZE_64, > + .endian = ARCH_ENDIAN_BIG, > + .syscall_resolve_name = parisc_syscall_resolve_name, > + .syscall_resolve_num = parisc_syscall_resolve_num, > + .syscall_rewrite = NULL, > + .rule_add = NULL, > +}; > diff --git a/src/arch-syscall-dump.c b/src/arch-syscall-dump.c > index 636fd9a..c95b899 100644 > --- a/src/arch-syscall-dump.c > +++ b/src/arch-syscall-dump.c > @@ -38,6 +38,7 @@ > #include "arch-mips64.h" > #include "arch-mips64n32.h" > #include "arch-aarch64.h" > +#include "arch-parisc.h" > #include "arch-ppc.h" > #include "arch-ppc64.h" > #include "arch-s390.h" > @@ -116,6 +117,10 @@ int main(int argc, char *argv[]) > case SCMP_ARCH_MIPSEL64N32: > sys_name = mips64n32_syscall_iterate_name(iter); > break; > + case SCMP_ARCH_PARISC: > + case SCMP_ARCH_PARISC64: > + sys_name = parisc_syscall_iterate_name(iter); > + break; > case SCMP_ARCH_PPC: > sys_name = ppc_syscall_iterate_name(iter); > break; > diff --git a/src/arch.c b/src/arch.c > index 0f24d1c..f5a898d 100644 > --- a/src/arch.c > +++ b/src/arch.c > @@ -38,6 +38,7 @@ > #include "arch-mips.h" > #include "arch-mips64.h" > #include "arch-mips64n32.h" > +#include "arch-parisc.h" > #include "arch-ppc.h" > #include "arch-ppc64.h" > #include "arch-s390.h" > @@ -79,6 +80,10 @@ const struct arch_def *arch_def_native = &arch_def_mips64n32; > #elif __MIPSEL__ > const struct arch_def *arch_def_native = &arch_def_mipsel64n32; > #endif /* _MIPS_SIM_NABI32 */ > +#elif __hppa64__ /* hppa64 must be checked before hppa */ > +const struct arch_def *arch_def_native = &arch_def_parisc64; > +#elif __hppa__ > +const struct arch_def *arch_def_native = &arch_def_parisc; > #elif __PPC64__ > #ifdef __BIG_ENDIAN__ > const struct arch_def *arch_def_native = &arch_def_ppc64; > @@ -139,6 +144,10 @@ const struct arch_def *arch_def_lookup(uint32_t token) > return &arch_def_mips64n32; > case SCMP_ARCH_MIPSEL64N32: > return &arch_def_mipsel64n32; > + case SCMP_ARCH_PARISC: > + return &arch_def_parisc; > + case SCMP_ARCH_PARISC64: > + return &arch_def_parisc64; > case SCMP_ARCH_PPC: > return &arch_def_ppc; > case SCMP_ARCH_PPC64: > @@ -185,6 +194,10 @@ const struct arch_def *arch_def_lookup_name(const char *arch_name) > return &arch_def_mips64n32; > else if (strcmp(arch_name, "mipsel64n32") == 0) > return &arch_def_mipsel64n32; > + else if (strcmp(arch_name, "parisc64") == 0) > + return &arch_def_parisc64; > + else if (strcmp(arch_name, "parisc") == 0) > + return &arch_def_parisc; > else if (strcmp(arch_name, "ppc") == 0) > return &arch_def_ppc; > else if (strcmp(arch_name, "ppc64") == 0) > diff --git a/src/gen_pfc.c b/src/gen_pfc.c > index 99c3297..b9c122e 100644 > --- a/src/gen_pfc.c > +++ b/src/gen_pfc.c > @@ -71,6 +71,10 @@ static const char *_pfc_arch(const struct arch_def *arch) > return "mips64n32"; > case SCMP_ARCH_MIPSEL64N32: > return "mipsel64n32"; > + case SCMP_ARCH_PARISC: > + return "parisc"; > + case SCMP_ARCH_PARISC64: > + return "parisc64"; > case SCMP_ARCH_PPC64: > return "ppc64"; > case SCMP_ARCH_PPC64LE: > diff --git a/src/python/libseccomp.pxd b/src/python/libseccomp.pxd > index 15c94f8..500da15 100644 > --- a/src/python/libseccomp.pxd > +++ b/src/python/libseccomp.pxd > @@ -43,6 +43,8 @@ cdef extern from "seccomp.h": > SCMP_ARCH_MIPSEL > SCMP_ARCH_MIPSEL64 > SCMP_ARCH_MIPSEL64N32 > + SCMP_ARCH_PARISC > + SCMP_ARCH_PARISC64 > SCMP_ARCH_PPC > SCMP_ARCH_PPC64 > SCMP_ARCH_PPC64LE > diff --git a/src/python/seccomp.pyx b/src/python/seccomp.pyx > index c87bc3f..cb17642 100644 > --- a/src/python/seccomp.pyx > +++ b/src/python/seccomp.pyx > @@ -147,6 +147,8 @@ cdef class Arch: > MIPSEL - MIPS little endian O32 ABI > MIPSEL64 - MIPS little endian 64-bit ABI > MIPSEL64N32 - MIPS little endian N32 ABI > + PARISC - 32-bit PA-RISC > + PARISC64 - 64-bit PA-RISC > PPC64 - 64-bit PowerPC > PPC - 32-bit PowerPC > """ > @@ -165,6 +167,8 @@ cdef class Arch: > MIPSEL = libseccomp.SCMP_ARCH_MIPSEL > MIPSEL64 = libseccomp.SCMP_ARCH_MIPSEL64 > MIPSEL64N32 = libseccomp.SCMP_ARCH_MIPSEL64N32 > + PARISC = libseccomp.SCMP_ARCH_PARISC > + PARISC64 = libseccomp.SCMP_ARCH_PARISC64 > PPC = libseccomp.SCMP_ARCH_PPC > PPC64 = libseccomp.SCMP_ARCH_PPC64 > PPC64LE = libseccomp.SCMP_ARCH_PPC64LE > @@ -205,6 +209,10 @@ cdef class Arch: > self._token = libseccomp.SCMP_ARCH_MIPSEL64 > elif arch == libseccomp.SCMP_ARCH_MIPSEL64N32: > self._token = libseccomp.SCMP_ARCH_MIPSEL64N32 > + elif arch == libseccomp.SCMP_ARCH_PARISC: > + self._token = libseccomp.SCMP_ARCH_PARISC > + elif arch == libseccomp.SCMP_ARCH_PARISC64: > + self._token = libseccomp.SCMP_ARCH_PARISC64 > elif arch == libseccomp.SCMP_ARCH_PPC: > self._token = libseccomp.SCMP_ARCH_PPC > elif arch == libseccomp.SCMP_ARCH_PPC64: > diff --git a/tests/26-sim-arch_all_be_basic.c b/tests/26-sim-arch_all_be_basic.c > index d2c191c..d31ce12 100644 > --- a/tests/26-sim-arch_all_be_basic.c > +++ b/tests/26-sim-arch_all_be_basic.c > @@ -52,6 +52,12 @@ int main(int argc, char *argv[]) > rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mips64n32")); > if (rc != 0) > goto out; > + rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc")); > + if (rc != 0) > + goto out; > + rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc64")); > + if (rc != 0) > + goto out; > rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("ppc")); > if (rc != 0) > goto out; > diff --git a/tests/26-sim-arch_all_be_basic.py b/tests/26-sim-arch_all_be_basic.py > index b0b660a..3a177b4 100755 > --- a/tests/26-sim-arch_all_be_basic.py > +++ b/tests/26-sim-arch_all_be_basic.py > @@ -33,6 +33,8 @@ def test(args): > f.add_arch(Arch("mips")) > f.add_arch(Arch("mips64")) > f.add_arch(Arch("mips64n32")) > + f.add_arch(Arch("parisc")) > + f.add_arch(Arch("parisc64")) > f.add_arch(Arch("ppc")) > f.add_arch(Arch("ppc64")) > f.add_arch(Arch("s390")) > diff --git a/tests/regression b/tests/regression > index 53d26b2..5949459 100755 > --- a/tests/regression > +++ b/tests/regression > @@ -28,6 +28,7 @@ GLBL_ARCH_LE_SUPPORT=" \ > ppc64le" > GLBL_ARCH_BE_SUPPORT=" \ > mips mips64 mips64n32 \ > + parisc parisc64 \ > ppc ppc64 \ > s390 s390x" > > @@ -701,7 +702,7 @@ function run_test_live() { > > # setup the arch specific return values > case "$arch" in > - x86|x86_64|x32|arm|aarch64|ppc|ppc64|ppc64le|ppc|s390|s390x) > + x86|x86_64|x32|arm|aarch64|parisc|parisc64|ppc|ppc64|ppc64le|ppc|s390|s390x) > rc_kill=159 > rc_allow=160 > rc_trap=161 > diff --git a/tools/scmp_arch_detect.c b/tools/scmp_arch_detect.c > index 4b452d1..ad43f2d 100644 > --- a/tools/scmp_arch_detect.c > +++ b/tools/scmp_arch_detect.c > @@ -99,6 +99,12 @@ int main(int argc, char *argv[]) > case SCMP_ARCH_MIPSEL64N32: > printf("mipsel64n32\n"); > break; > + case SCMP_ARCH_PARISC: > + printf("parisc\n"); > + break; > + case SCMP_ARCH_PARISC64: > + printf("parisc64\n"); > + break; > case SCMP_ARCH_PPC: > printf("ppc\n"); > break; > diff --git a/tools/scmp_bpf_sim.c b/tools/scmp_bpf_sim.c > index a0cf6d1..3d3204a 100644 > --- a/tools/scmp_bpf_sim.c > +++ b/tools/scmp_bpf_sim.c > @@ -265,6 +265,10 @@ int main(int argc, char *argv[]) > arch = AUDIT_ARCH_MIPS64N32; > else if (strcmp(optarg, "mipsel64n32") == 0) > arch = AUDIT_ARCH_MIPSEL64N32; > + else if (strcmp(optarg, "parisc") == 0) > + arch = AUDIT_ARCH_PARISC; > + else if (strcmp(optarg, "parisc64") == 0) > + arch = AUDIT_ARCH_PARISC64; > else if (strcmp(optarg, "ppc") == 0) > arch = AUDIT_ARCH_PPC; > else if (strcmp(optarg, "ppc64") == 0) > diff --git a/tools/util.c b/tools/util.c > index cc48647..7122335 100644 > --- a/tools/util.c > +++ b/tools/util.c > @@ -62,6 +62,10 @@ > #elif __MIPSEL__ > #define ARCH_NATIVE AUDIT_ARCH_MIPSEL64N32 > #endif /* _MIPS_SIM_NABI32 */ > +#elif __hppa64__ > +#define ARCH_NATIVE AUDIT_ARCH_PARISC64 > +#elif __hppa__ > +#define ARCH_NATIVE AUDIT_ARCH_PARISC > #elif __PPC64__ > #ifdef __BIG_ENDIAN__ > #define ARCH_NATIVE AUDIT_ARCH_PPC64 > -- > To unsubscribe from this list: send the line "unsubscribe linux-parisc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sat, Apr 30, 2016 at 4:51 PM, Helge Deller <deller@gmx.de> wrote: > Hi Paul, > > On 15.04.2016 17:11, Helge Deller wrote: >> This patch (v3) adds support for the parisc and parisc64 architectures >> to libseccomp. > > Linux kernel 4.5.2-1 with full seccomp support for parisc/hppa is > now publically available in debian: > https://buildd.debian.org/status/package.php?p=linux&suite=sid > > Any chance to get this patch (v3) applied to the libseccomp git tree now ? Hi Helge, I apologize for the delay, but I finally got around to merging your code and noticed a problem: you're missing the parisc enablement code in src/arch-syscall-check.c which has hidden a number of issues with the parsic{64} syscall table (run 'make check'). Could you add the missing code to arch-syscall-check.c and update the syscall table? Thanks, -Paul >> I didn't split up the patch, because it's pretty trivial. >> Those parisc-specific files gets added: >> src/arch-parisc-syscalls.c >> src/arch-parisc.c >> src/arch-parisc.h >> src/arch-parisc64.c >> >> All other changes are trivial because they simply add parisc-specific >> case statements in variouse switch statements. >> >> I did ran a "make check" on parisc and all testcases suceeded. >> All live testcases succeed as well when running "./regression -T live". >> >> The patch applies cleanly to current libseccomp git head. >> >> Changes between v2 and v1 of this patch: >> - Enabled seccomp mode 2 regression tests on parisc. Kernel support for hppa >> was added in kernel 4.6-rc1 and backported into the kernel v4.5.2 stable >> series. >> >> Changes between v3 and v2 of this patch: >> - Stipped out patch which reports if a check was skipped because valgrind >> isn't installed. >> - Added tuxcall pseudo syscall for 19-sim-missing_syscalls testcase >> - Added sysmips pseudo syscall for 29-sim-pseudo_syscall testcase >> >> Thanks, >> Helge >> >> Signed-off-by: Helge Deller <deller@gmx.de> >> >> diffstat: >> include/seccomp.h.in | 6 >> src/Makefile.am | 2 >> src/arch-parisc-syscalls.c | 424 ++++++++++++++++++++++++++++++++++++++ >> src/arch-parisc.c | 22 + >> src/arch-parisc.h | 38 +++ >> src/arch-parisc64.c | 22 + >> src/arch-syscall-dump.c | 5 >> src/arch.c | 13 + >> src/gen_pfc.c | 4 >> src/python/libseccomp.pxd | 2 >> src/python/seccomp.pyx | 8 >> tests/26-sim-arch_all_be_basic.c | 6 >> tests/26-sim-arch_all_be_basic.py | 2 >> tests/regression | 3 >> tools/scmp_arch_detect.c | 6 >> tools/scmp_bpf_sim.c | 4 >> tools/util.c | 4 >> 17 files changed, 570 insertions(+), 1 deletion(-)
diff --git a/include/seccomp.h.in b/include/seccomp.h.in index 6bf6751..5b9057f 100644 --- a/include/seccomp.h.in +++ b/include/seccomp.h.in @@ -185,6 +185,12 @@ struct scmp_arg_cmp { #define SCMP_ARCH_S390X AUDIT_ARCH_S390X /** + * The PA-RISC hppa architecture tokens + */ +#define SCMP_ARCH_PARISC AUDIT_ARCH_PARISC +#define SCMP_ARCH_PARISC64 AUDIT_ARCH_PARISC64 + +/** * Convert a syscall name into the associated syscall number * @param x the syscall name */ diff --git a/src/Makefile.am b/src/Makefile.am index c2d805e..dcc79d9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,6 +35,8 @@ SOURCES_ALL = \ arch-mips.h arch-mips.c arch-mips-syscalls.c \ arch-mips64.h arch-mips64.c arch-mips64-syscalls.c \ arch-mips64n32.h arch-mips64n32.c arch-mips64n32-syscalls.c \ + arch-parisc.h arch-parisc.c arch-parisc-syscalls.c \ + arch-parisc64.h arch-parisc64.c \ arch-ppc.h arch-ppc.c arch-ppc-syscalls.c \ arch-ppc64.h arch-ppc64.c arch-ppc64-syscalls.c \ arch-s390.h arch-s390.c arch-s390-syscalls.c \ diff --git a/src/arch-parisc-syscalls.c b/src/arch-parisc-syscalls.c new file mode 100644 index 0000000..78474e1 --- /dev/null +++ b/src/arch-parisc-syscalls.c @@ -0,0 +1,424 @@ +/* + * Copyright 2016 + * Author: Helge Deller <deller@gmx.de> + */ + +#include <string.h> + +#include <seccomp.h> + +#include "arch.h" +#include "arch-parisc.h" + +#ifndef __NR_Linux +#define __NR_Linux 0 +#endif + +/* NOTE: based on Linux 4.3 */ +const struct arch_syscall_def parisc_syscall_table[] = { \ + { "_llseek", (__NR_Linux + 140) }, + { "_newselect", (__NR_Linux + 142) }, + { "_sysctl", (__NR_Linux + 149) }, + { "accept4", (__NR_Linux + 320) }, + { "accept", (__NR_Linux + 35) }, + { "access", (__NR_Linux + 33) }, + { "acct", (__NR_Linux + 51) }, + { "acl_get", (__NR_Linux + 204) }, + { "acl_set", (__NR_Linux + 205) }, + { "add_key", (__NR_Linux + 264) }, + { "adjtimex", (__NR_Linux + 124) }, + { "afs_syscall", (__NR_Linux + 137) }, + { "alarm", (__NR_Linux + 27) }, + { "alloc_hugepages", (__NR_Linux + 220) }, + { "attrctl", (__NR_Linux + 203) }, + { "bdflush", (__NR_Linux + 134) }, + { "bind", (__NR_Linux + 22) }, + { "bpf", (__NR_Linux + 341) }, + { "brk", (__NR_Linux + 45) }, + { "capget", (__NR_Linux + 106) }, + { "capset", (__NR_Linux + 107) }, + { "chdir", (__NR_Linux + 12) }, + { "chmod", (__NR_Linux + 15) }, + { "chown", (__NR_Linux + 180) }, + { "chroot", (__NR_Linux + 61) }, + { "clock_adjtime", (__NR_Linux + 324) }, + { "clock_getres", (__NR_Linux + 257) }, + { "clock_gettime", (__NR_Linux + 256) }, + { "clock_nanosleep", (__NR_Linux + 258) }, + { "clock_settime", (__NR_Linux + 255) }, + { "clone", (__NR_Linux + 120) }, + { "close", (__NR_Linux + 6) }, + { "connect", (__NR_Linux + 31) }, + { "create_module", (__NR_Linux + 127) }, + { "creat", (__NR_Linux + 8) }, + { "delete_module", (__NR_Linux + 129) }, + { "dup2", (__NR_Linux + 63) }, + { "dup3", (__NR_Linux + 312) }, + { "dup", (__NR_Linux + 41) }, + { "epoll_create1", (__NR_Linux + 311) }, + { "epoll_create", (__NR_Linux + 224) }, + { "epoll_ctl", (__NR_Linux + 225) }, + { "epoll_pwait", (__NR_Linux + 297) }, + { "epoll_wait", (__NR_Linux + 226) }, + { "eventfd2", (__NR_Linux + 310) }, + { "eventfd", (__NR_Linux + 304) }, + { "execveat", (__NR_Linux + 342) }, + { "execve", (__NR_Linux + 11) }, + { "exit_group", (__NR_Linux + 222) }, + { "exit", (__NR_Linux + 1) }, + { "faccessat", (__NR_Linux + 287) }, + { "fadvise64_64", (__NR_Linux + 236) }, + { "fallocate", (__NR_Linux + 305) }, + { "fanotify_init", (__NR_Linux + 322) }, + { "fanotify_mark", (__NR_Linux + 323) }, + { "fchdir", (__NR_Linux + 133) }, + { "fchmodat", (__NR_Linux + 286) }, + { "fchmod", (__NR_Linux + 94) }, + { "fchownat", (__NR_Linux + 278) }, + { "fchown", (__NR_Linux + 95) }, + { "fcntl64", (__NR_Linux + 202) }, + { "fcntl", (__NR_Linux + 55) }, + { "fdatasync", (__NR_Linux + 148) }, + { "fgetxattr", (__NR_Linux + 243) }, + { "finit_module", (__NR_Linux + 333) }, + { "flistxattr", (__NR_Linux + 246) }, + { "flock", (__NR_Linux + 143) }, + { "fork", (__NR_Linux + 2) }, + { "free_hugepages", (__NR_Linux + 221) }, + { "fremovexattr", (__NR_Linux + 249) }, + { "fsetxattr", (__NR_Linux + 240) }, + { "fstat64", (__NR_Linux + 112) }, + { "fstatat64", (__NR_Linux + 280) }, + { "fstatfs64", (__NR_Linux + 299) }, + { "fstatfs", (__NR_Linux + 100) }, + { "fstat", (__NR_Linux + 28) }, + { "fsync", (__NR_Linux + 118) }, + { "ftruncate64", (__NR_Linux + 200) }, + { "ftruncate", (__NR_Linux + 93) }, + { "futex", (__NR_Linux + 210) }, + { "futimesat", (__NR_Linux + 279) }, + { "getcpu", (__NR_Linux + 296) }, + { "getcwd", (__NR_Linux + 110) }, + { "getdents64", (__NR_Linux + 201) }, + { "getdents", (__NR_Linux + 141) }, + { "getegid", (__NR_Linux + 50) }, + { "geteuid", (__NR_Linux + 49) }, + { "getgid", (__NR_Linux + 47) }, + { "getgroups", (__NR_Linux + 80) }, + { "getitimer", (__NR_Linux + 105) }, + { "get_kernel_syms", (__NR_Linux + 130) }, + { "get_mempolicy", (__NR_Linux + 261) }, + { "getpeername", (__NR_Linux + 53) }, + { "getpgid", (__NR_Linux + 132) }, + { "getpgrp", (__NR_Linux + 65) }, + { "getpid", (__NR_Linux + 20) }, + { "getpmsg", (__NR_Linux + 196) }, + { "getppid", (__NR_Linux + 64) }, + { "getpriority", (__NR_Linux + 96) }, + { "getrandom", (__NR_Linux + 339) }, + { "getresgid", (__NR_Linux + 171) }, + { "getresuid", (__NR_Linux + 165) }, + { "getrlimit", (__NR_Linux + 76) }, + { "get_robust_list", (__NR_Linux + 290) }, + { "getrusage", (__NR_Linux + 77) }, + { "getsid", (__NR_Linux + 147) }, + { "getsockname", (__NR_Linux + 44) }, + { "getsockopt", (__NR_Linux + 182) }, + { "get_thread_area", (__NR_Linux + 214) }, + { "gettid", (__NR_Linux + 206) }, + { "gettimeofday", (__NR_Linux + 78) }, + { "getuid", (__NR_Linux + 24) }, + { "getxattr", (__NR_Linux + 241) }, + { "init_module", (__NR_Linux + 128) }, + { "inotify_add_watch", (__NR_Linux + 270) }, + { "inotify_init1", (__NR_Linux + 314) }, + { "inotify_init", (__NR_Linux + 269) }, + { "inotify_rm_watch", (__NR_Linux + 271) }, + { "io_cancel", (__NR_Linux + 219) }, + { "ioctl", (__NR_Linux + 54) }, + { "io_destroy", (__NR_Linux + 216) }, + { "io_getevents", (__NR_Linux + 217) }, + { "ioprio_get", (__NR_Linux + 268) }, + { "ioprio_set", (__NR_Linux + 267) }, + { "io_setup", (__NR_Linux + 215) }, + { "io_submit", (__NR_Linux + 218) }, + { "kcmp", (__NR_Linux + 332) }, + { "kexec_load", (__NR_Linux + 300) }, + { "keyctl", (__NR_Linux + 266) }, + { "kill", (__NR_Linux + 37) }, + { "lchown", (__NR_Linux + 16) }, + { "lgetxattr", (__NR_Linux + 242) }, + { "linkat", (__NR_Linux + 283) }, + { "link", (__NR_Linux + 9) }, + { "listen", (__NR_Linux + 32) }, + { "listxattr", (__NR_Linux + 244) }, + { "llistxattr", (__NR_Linux + 245) }, + { "lookup_dcookie", (__NR_Linux + 223) }, + { "lremovexattr", (__NR_Linux + 248) }, + { "lseek", (__NR_Linux + 19) }, + { "lsetxattr", (__NR_Linux + 239) }, + { "lstat64", (__NR_Linux + 198) }, + { "lstat", (__NR_Linux + 84) }, + { "madvise", (__NR_Linux + 119) }, + { "mbind", (__NR_Linux + 260) }, + { "memfd_create", (__NR_Linux + 340) }, + { "migrate_pages", (__NR_Linux + 272) }, + { "mincore", (__NR_Linux + 72) }, + { "mkdirat", (__NR_Linux + 276) }, + { "mkdir", (__NR_Linux + 39) }, + { "mknodat", (__NR_Linux + 277) }, + { "mknod", (__NR_Linux + 14) }, + { "mlockall", (__NR_Linux + 152) }, + { "mlock", (__NR_Linux + 150) }, + { "mmap2", (__NR_Linux + 89) }, + { "mmap", (__NR_Linux + 90) }, + { "mount", (__NR_Linux + 21) }, + { "move_pages", (__NR_Linux + 295) }, + { "mprotect", (__NR_Linux + 125) }, + { "mq_getsetattr", (__NR_Linux + 234) }, + { "mq_notify", (__NR_Linux + 233) }, + { "mq_open", (__NR_Linux + 229) }, + { "mq_timedreceive", (__NR_Linux + 232) }, + { "mq_timedsend", (__NR_Linux + 231) }, + { "mq_unlink", (__NR_Linux + 230) }, + { "mremap", (__NR_Linux + 163) }, + { "msgctl", (__NR_Linux + 191) }, + { "msgget", (__NR_Linux + 190) }, + { "msgrcv", (__NR_Linux + 189) }, + { "msgsnd", (__NR_Linux + 188) }, + { "msync", (__NR_Linux + 144) }, + { "munlockall", (__NR_Linux + 153) }, + { "munlock", (__NR_Linux + 151) }, + { "munmap", (__NR_Linux + 91) }, + { "name_to_handle_at", (__NR_Linux + 325) }, + { "nanosleep", (__NR_Linux + 162) }, + { "nfsservctl", (__NR_Linux + 169) }, + { "nice", (__NR_Linux + 34) }, + { "openat", (__NR_Linux + 275) }, + { "open_by_handle_at", (__NR_Linux + 326) }, + { "open", (__NR_Linux + 5) }, + { "pause", (__NR_Linux + 29) }, + { "perf_event_open", (__NR_Linux + 318) }, + { "personality", (__NR_Linux + 136) }, + { "pipe2", (__NR_Linux + 313) }, + { "pipe", (__NR_Linux + 42) }, + { "pivot_root", (__NR_Linux + 67) }, + { "poll", (__NR_Linux + 168) }, + { "ppoll", (__NR_Linux + 274) }, + { "prctl", (__NR_Linux + 172) }, + { "pread64", (__NR_Linux + 108) }, + { "preadv", (__NR_Linux + 315) }, + { "prlimit64", (__NR_Linux + 321) }, + { "process_vm_readv", (__NR_Linux + 330) }, + { "process_vm_writev", (__NR_Linux + 331) }, + { "pselect6", (__NR_Linux + 273) }, + { "ptrace", (__NR_Linux + 26) }, + { "putpmsg", (__NR_Linux + 197) }, + { "pwrite64", (__NR_Linux + 109) }, + { "pwritev", (__NR_Linux + 316) }, + { "query_module", (__NR_Linux + 167) }, + { "quotactl", (__NR_Linux + 131) }, + { "readahead", (__NR_Linux + 207) }, + { "readlinkat", (__NR_Linux + 285) }, + { "readlink", (__NR_Linux + 85) }, + { "read", (__NR_Linux + 3) }, + { "readv", (__NR_Linux + 145) }, + { "reboot", (__NR_Linux + 88) }, + { "recvfrom", (__NR_Linux + 123) }, + { "recvmmsg", (__NR_Linux + 319) }, + { "recvmsg", (__NR_Linux + 184) }, + { "recv", (__NR_Linux + 98) }, + { "remap_file_pages", (__NR_Linux + 227) }, + { "removexattr", (__NR_Linux + 247) }, + { "renameat2", (__NR_Linux + 337) }, + { "renameat", (__NR_Linux + 282) }, + { "rename", (__NR_Linux + 38) }, + { "request_key", (__NR_Linux + 265) }, + { "restart_syscall", (__NR_Linux + 0) }, + { "rmdir", (__NR_Linux + 40) }, + { "rt_sigaction", (__NR_Linux + 174) }, + { "rt_sigpending", (__NR_Linux + 176) }, + { "rt_sigprocmask", (__NR_Linux + 175) }, + { "rt_sigqueueinfo", (__NR_Linux + 178) }, + { "rt_sigreturn", (__NR_Linux + 173) }, + { "rt_sigsuspend", (__NR_Linux + 179) }, + { "rt_sigtimedwait", (__NR_Linux + 177) }, + { "rt_tgsigqueueinfo", (__NR_Linux + 317) }, + { "sched_getaffinity", (__NR_Linux + 212) }, + { "sched_getattr", (__NR_Linux + 335) }, + { "sched_getparam", (__NR_Linux + 155) }, + { "sched_get_priority_max", (__NR_Linux + 159) }, + { "sched_get_priority_min", (__NR_Linux + 160) }, + { "sched_getscheduler", (__NR_Linux + 157) }, + { "sched_rr_get_interval", (__NR_Linux + 161) }, + { "sched_setaffinity", (__NR_Linux + 211) }, + { "sched_setattr", (__NR_Linux + 334) }, + { "sched_setparam", (__NR_Linux + 154) }, + { "sched_setscheduler", (__NR_Linux + 156) }, + { "sched_yield", (__NR_Linux + 158) }, + { "seccomp", (__NR_Linux + 338) }, + { "semctl", (__NR_Linux + 187) }, + { "semget", (__NR_Linux + 186) }, + { "semop", (__NR_Linux + 185) }, + { "semtimedop", (__NR_Linux + 228) }, + { "sendfile64", (__NR_Linux + 209) }, + { "sendfile", (__NR_Linux + 122) }, + { "sendmmsg", (__NR_Linux + 329) }, + { "sendmsg", (__NR_Linux + 183) }, + { "send", (__NR_Linux + 58) }, + { "sendto", (__NR_Linux + 82) }, + { "setdomainname", (__NR_Linux + 121) }, + { "setfsgid", (__NR_Linux + 139) }, + { "setfsuid", (__NR_Linux + 138) }, + { "setgid", (__NR_Linux + 46) }, + { "setgroups", (__NR_Linux + 81) }, + { "sethostname", (__NR_Linux + 74) }, + { "setitimer", (__NR_Linux + 104) }, + { "set_mempolicy", (__NR_Linux + 262) }, + { "setns", (__NR_Linux + 328) }, + { "setpgid", (__NR_Linux + 57) }, + { "setpriority", (__NR_Linux + 97) }, + { "setregid", (__NR_Linux + 71) }, + { "setresgid", (__NR_Linux + 170) }, + { "setresuid", (__NR_Linux + 164) }, + { "setreuid", (__NR_Linux + 70) }, + { "setrlimit", (__NR_Linux + 75) }, + { "set_robust_list", (__NR_Linux + 289) }, + { "setsid", (__NR_Linux + 66) }, + { "setsockopt", (__NR_Linux + 181) }, + { "set_thread_area", (__NR_Linux + 213) }, + { "set_tid_address", (__NR_Linux + 237) }, + { "settimeofday", (__NR_Linux + 79) }, + { "setuid", (__NR_Linux + 23) }, + { "setxattr", (__NR_Linux + 238) }, + { "sgetmask", (__NR_Linux + 68) }, + { "shmat", (__NR_Linux + 192) }, + { "shmctl", (__NR_Linux + 195) }, + { "shmdt", (__NR_Linux + 193) }, + { "shmget", (__NR_Linux + 194) }, + { "shutdown", (__NR_Linux + 117) }, + { "sigaltstack", (__NR_Linux + 166) }, + { "signalfd4", (__NR_Linux + 309) }, + { "signalfd", (__NR_Linux + 302) }, + { "signal", (__NR_Linux + 48) }, + { "sigpending", (__NR_Linux + 73) }, + { "sigprocmask", (__NR_Linux + 126) }, + { "socket", (__NR_Linux + 17) }, + { "socketpair", (__NR_Linux + 56) }, + { "splice", (__NR_Linux + 291) }, + { "ssetmask", (__NR_Linux + 69) }, + { "stat64", (__NR_Linux + 101) }, + { "statfs64", (__NR_Linux + 298) }, + { "statfs", (__NR_Linux + 99) }, + { "stat", (__NR_Linux + 18) }, + { "stime", (__NR_Linux + 25) }, + { "swapoff", (__NR_Linux + 115) }, + { "swapon", (__NR_Linux + 87) }, + { "symlinkat", (__NR_Linux + 284) }, + { "symlink", (__NR_Linux + 83) }, + { "sync_file_range", (__NR_Linux + 292) }, + { "syncfs", (__NR_Linux + 327) }, + { "sync", (__NR_Linux + 36) }, + { "sysfs", (__NR_Linux + 135) }, + { "sysmips", __PNR_sysmips }, + { "sysinfo", (__NR_Linux + 116) }, + { "syslog", (__NR_Linux + 103) }, + { "tee", (__NR_Linux + 293) }, + { "tgkill", (__NR_Linux + 259) }, + { "time", (__NR_Linux + 13) }, + { "timer_create", (__NR_Linux + 250) }, + { "timer_delete", (__NR_Linux + 254) }, + { "timerfd_create", (__NR_Linux + 306) }, + { "timerfd_gettime", (__NR_Linux + 308) }, + { "timerfd", (__NR_Linux + 303) }, + { "timerfd_settime", (__NR_Linux + 307) }, + { "timer_getoverrun", (__NR_Linux + 253) }, + { "timer_gettime", (__NR_Linux + 252) }, + { "timer_settime", (__NR_Linux + 251) }, + { "times", (__NR_Linux + 43) }, + { "tkill", (__NR_Linux + 208) }, + { "truncate64", (__NR_Linux + 199) }, + { "truncate", (__NR_Linux + 92) }, + { "tuxcall", __PNR_tuxcall }, + { "umask", (__NR_Linux + 60) }, + { "umount2", (__NR_Linux + 52) }, + { "uname", (__NR_Linux + 59) }, + { "unlinkat", (__NR_Linux + 281) }, + { "unlink", (__NR_Linux + 10) }, + { "unshare", (__NR_Linux + 288) }, + { "uselib", (__NR_Linux + 86) }, + { "ustat", (__NR_Linux + 62) }, + { "utime", (__NR_Linux + 30) }, + { "utimensat", (__NR_Linux + 301) }, + { "utimes", (__NR_Linux + 336) }, + { "vfork", (__NR_Linux + 113) }, + { "vhangup", (__NR_Linux + 111) }, + { "vmsplice", (__NR_Linux + 294) }, + { "vserver", (__NR_Linux + 263) }, + { "wait4", (__NR_Linux + 114) }, + { "waitid", (__NR_Linux + 235) }, + { "waitpid", (__NR_Linux + 7) }, + { "write", (__NR_Linux + 4) }, + { "writev", (__NR_Linux + 146) }, + { NULL, __NR_SCMP_ERROR }, +}; + +/** + * Resolve a syscall name to a number + * @param name the syscall name + * + * Resolve the given syscall name to the syscall number using the syscall table. + * Returns the syscall number on success, including negative pseudo syscall + * numbers; returns __NR_SCMP_ERROR on failure. + * + */ +int parisc_syscall_resolve_name(const char *name) +{ + unsigned int iter; + const struct arch_syscall_def *table = parisc_syscall_table; + + /* XXX - plenty of room for future improvement here */ + for (iter = 0; table[iter].name != NULL; iter++) { + if (strcmp(name, table[iter].name) == 0) + return table[iter].num; + } + + return __NR_SCMP_ERROR; +} + +/** + * Resolve a syscall number to a name + * @param num the syscall number + * + * Resolve the given syscall number to the syscall name using the syscall table. + * Returns a pointer to the syscall name string on success, including pseudo + * syscall names; returns NULL on failure. + * + */ +const char *parisc_syscall_resolve_num(int num) +{ + unsigned int iter; + const struct arch_syscall_def *table = parisc_syscall_table; + + /* XXX - plenty of room for future improvement here */ + for (iter = 0; table[iter].num != __NR_SCMP_ERROR; iter++) { + if (num == table[iter].num) + return table[iter].name; + } + + return NULL; +} + +/** + * Iterate through the syscall table and return the syscall name + * @param spot the offset into the syscall table + * + * Return the syscall name at position @spot or NULL on failure. This function + * should only ever be used internally by libseccomp. + * + */ +const char *parisc_syscall_iterate_name(unsigned int spot) +{ + /* XXX - no safety checks here */ + return parisc_syscall_table[spot].name; +} diff --git a/src/arch-parisc.c b/src/arch-parisc.c new file mode 100644 index 0000000..6407f8a --- /dev/null +++ b/src/arch-parisc.c @@ -0,0 +1,22 @@ +/* + * Copyright 2016 + * Author: Helge Deller <deller@gmx.de> + */ + +#include <stdlib.h> +#include <errno.h> +#include <linux/audit.h> + +#include "arch.h" +#include "arch-parisc.h" + +const struct arch_def arch_def_parisc = { + .token = SCMP_ARCH_PARISC, + .token_bpf = AUDIT_ARCH_PARISC, + .size = ARCH_SIZE_32, + .endian = ARCH_ENDIAN_BIG, + .syscall_resolve_name = parisc_syscall_resolve_name, + .syscall_resolve_num = parisc_syscall_resolve_num, + .syscall_rewrite = NULL, + .rule_add = NULL, +}; diff --git a/src/arch-parisc.h b/src/arch-parisc.h new file mode 100644 index 0000000..b9fe1df --- /dev/null +++ b/src/arch-parisc.h @@ -0,0 +1,38 @@ +/** + * Enhanced Seccomp PARISC Specific Code + * + * Copyright (c) 2016 Helge Deller <deller@gmx.de> + * + */ + +/* + * This library is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License as + * published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, see <http://www.gnu.org/licenses>. + */ + +#ifndef _ARCH_PARISC_H +#define _ARCH_PARISC_H + +#include <inttypes.h> + +#include "arch.h" +#include "system.h" + +extern const struct arch_def arch_def_parisc; +extern const struct arch_def arch_def_parisc64; + +int parisc_syscall_resolve_name(const char *name); +const char *parisc_syscall_resolve_num(int num); + +const char *parisc_syscall_iterate_name(unsigned int spot); + +#endif diff --git a/src/arch-parisc64.c b/src/arch-parisc64.c new file mode 100644 index 0000000..b75a182 --- /dev/null +++ b/src/arch-parisc64.c @@ -0,0 +1,22 @@ +/* + * Copyright 2016 + * Author: Helge Deller <deller@gmx.de> +*/ + +#include <stdlib.h> +#include <errno.h> +#include <linux/audit.h> + +#include "arch.h" +#include "arch-parisc.h" + +const struct arch_def arch_def_parisc64 = { + .token = SCMP_ARCH_PARISC64, + .token_bpf = AUDIT_ARCH_PARISC64, + .size = ARCH_SIZE_64, + .endian = ARCH_ENDIAN_BIG, + .syscall_resolve_name = parisc_syscall_resolve_name, + .syscall_resolve_num = parisc_syscall_resolve_num, + .syscall_rewrite = NULL, + .rule_add = NULL, +}; diff --git a/src/arch-syscall-dump.c b/src/arch-syscall-dump.c index 636fd9a..c95b899 100644 --- a/src/arch-syscall-dump.c +++ b/src/arch-syscall-dump.c @@ -38,6 +38,7 @@ #include "arch-mips64.h" #include "arch-mips64n32.h" #include "arch-aarch64.h" +#include "arch-parisc.h" #include "arch-ppc.h" #include "arch-ppc64.h" #include "arch-s390.h" @@ -116,6 +117,10 @@ int main(int argc, char *argv[]) case SCMP_ARCH_MIPSEL64N32: sys_name = mips64n32_syscall_iterate_name(iter); break; + case SCMP_ARCH_PARISC: + case SCMP_ARCH_PARISC64: + sys_name = parisc_syscall_iterate_name(iter); + break; case SCMP_ARCH_PPC: sys_name = ppc_syscall_iterate_name(iter); break; diff --git a/src/arch.c b/src/arch.c index 0f24d1c..f5a898d 100644 --- a/src/arch.c +++ b/src/arch.c @@ -38,6 +38,7 @@ #include "arch-mips.h" #include "arch-mips64.h" #include "arch-mips64n32.h" +#include "arch-parisc.h" #include "arch-ppc.h" #include "arch-ppc64.h" #include "arch-s390.h" @@ -79,6 +80,10 @@ const struct arch_def *arch_def_native = &arch_def_mips64n32; #elif __MIPSEL__ const struct arch_def *arch_def_native = &arch_def_mipsel64n32; #endif /* _MIPS_SIM_NABI32 */ +#elif __hppa64__ /* hppa64 must be checked before hppa */ +const struct arch_def *arch_def_native = &arch_def_parisc64; +#elif __hppa__ +const struct arch_def *arch_def_native = &arch_def_parisc; #elif __PPC64__ #ifdef __BIG_ENDIAN__ const struct arch_def *arch_def_native = &arch_def_ppc64; @@ -139,6 +144,10 @@ const struct arch_def *arch_def_lookup(uint32_t token) return &arch_def_mips64n32; case SCMP_ARCH_MIPSEL64N32: return &arch_def_mipsel64n32; + case SCMP_ARCH_PARISC: + return &arch_def_parisc; + case SCMP_ARCH_PARISC64: + return &arch_def_parisc64; case SCMP_ARCH_PPC: return &arch_def_ppc; case SCMP_ARCH_PPC64: @@ -185,6 +194,10 @@ const struct arch_def *arch_def_lookup_name(const char *arch_name) return &arch_def_mips64n32; else if (strcmp(arch_name, "mipsel64n32") == 0) return &arch_def_mipsel64n32; + else if (strcmp(arch_name, "parisc64") == 0) + return &arch_def_parisc64; + else if (strcmp(arch_name, "parisc") == 0) + return &arch_def_parisc; else if (strcmp(arch_name, "ppc") == 0) return &arch_def_ppc; else if (strcmp(arch_name, "ppc64") == 0) diff --git a/src/gen_pfc.c b/src/gen_pfc.c index 99c3297..b9c122e 100644 --- a/src/gen_pfc.c +++ b/src/gen_pfc.c @@ -71,6 +71,10 @@ static const char *_pfc_arch(const struct arch_def *arch) return "mips64n32"; case SCMP_ARCH_MIPSEL64N32: return "mipsel64n32"; + case SCMP_ARCH_PARISC: + return "parisc"; + case SCMP_ARCH_PARISC64: + return "parisc64"; case SCMP_ARCH_PPC64: return "ppc64"; case SCMP_ARCH_PPC64LE: diff --git a/src/python/libseccomp.pxd b/src/python/libseccomp.pxd index 15c94f8..500da15 100644 --- a/src/python/libseccomp.pxd +++ b/src/python/libseccomp.pxd @@ -43,6 +43,8 @@ cdef extern from "seccomp.h": SCMP_ARCH_MIPSEL SCMP_ARCH_MIPSEL64 SCMP_ARCH_MIPSEL64N32 + SCMP_ARCH_PARISC + SCMP_ARCH_PARISC64 SCMP_ARCH_PPC SCMP_ARCH_PPC64 SCMP_ARCH_PPC64LE diff --git a/src/python/seccomp.pyx b/src/python/seccomp.pyx index c87bc3f..cb17642 100644 --- a/src/python/seccomp.pyx +++ b/src/python/seccomp.pyx @@ -147,6 +147,8 @@ cdef class Arch: MIPSEL - MIPS little endian O32 ABI MIPSEL64 - MIPS little endian 64-bit ABI MIPSEL64N32 - MIPS little endian N32 ABI + PARISC - 32-bit PA-RISC + PARISC64 - 64-bit PA-RISC PPC64 - 64-bit PowerPC PPC - 32-bit PowerPC """ @@ -165,6 +167,8 @@ cdef class Arch: MIPSEL = libseccomp.SCMP_ARCH_MIPSEL MIPSEL64 = libseccomp.SCMP_ARCH_MIPSEL64 MIPSEL64N32 = libseccomp.SCMP_ARCH_MIPSEL64N32 + PARISC = libseccomp.SCMP_ARCH_PARISC + PARISC64 = libseccomp.SCMP_ARCH_PARISC64 PPC = libseccomp.SCMP_ARCH_PPC PPC64 = libseccomp.SCMP_ARCH_PPC64 PPC64LE = libseccomp.SCMP_ARCH_PPC64LE @@ -205,6 +209,10 @@ cdef class Arch: self._token = libseccomp.SCMP_ARCH_MIPSEL64 elif arch == libseccomp.SCMP_ARCH_MIPSEL64N32: self._token = libseccomp.SCMP_ARCH_MIPSEL64N32 + elif arch == libseccomp.SCMP_ARCH_PARISC: + self._token = libseccomp.SCMP_ARCH_PARISC + elif arch == libseccomp.SCMP_ARCH_PARISC64: + self._token = libseccomp.SCMP_ARCH_PARISC64 elif arch == libseccomp.SCMP_ARCH_PPC: self._token = libseccomp.SCMP_ARCH_PPC elif arch == libseccomp.SCMP_ARCH_PPC64: diff --git a/tests/26-sim-arch_all_be_basic.c b/tests/26-sim-arch_all_be_basic.c index d2c191c..d31ce12 100644 --- a/tests/26-sim-arch_all_be_basic.c +++ b/tests/26-sim-arch_all_be_basic.c @@ -52,6 +52,12 @@ int main(int argc, char *argv[]) rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("mips64n32")); if (rc != 0) goto out; + rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc")); + if (rc != 0) + goto out; + rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("parisc64")); + if (rc != 0) + goto out; rc = seccomp_arch_add(ctx, seccomp_arch_resolve_name("ppc")); if (rc != 0) goto out; diff --git a/tests/26-sim-arch_all_be_basic.py b/tests/26-sim-arch_all_be_basic.py index b0b660a..3a177b4 100755 --- a/tests/26-sim-arch_all_be_basic.py +++ b/tests/26-sim-arch_all_be_basic.py @@ -33,6 +33,8 @@ def test(args): f.add_arch(Arch("mips")) f.add_arch(Arch("mips64")) f.add_arch(Arch("mips64n32")) + f.add_arch(Arch("parisc")) + f.add_arch(Arch("parisc64")) f.add_arch(Arch("ppc")) f.add_arch(Arch("ppc64")) f.add_arch(Arch("s390")) diff --git a/tests/regression b/tests/regression index 53d26b2..5949459 100755 --- a/tests/regression +++ b/tests/regression @@ -28,6 +28,7 @@ GLBL_ARCH_LE_SUPPORT=" \ ppc64le" GLBL_ARCH_BE_SUPPORT=" \ mips mips64 mips64n32 \ + parisc parisc64 \ ppc ppc64 \ s390 s390x" @@ -701,7 +702,7 @@ function run_test_live() { # setup the arch specific return values case "$arch" in - x86|x86_64|x32|arm|aarch64|ppc|ppc64|ppc64le|ppc|s390|s390x) + x86|x86_64|x32|arm|aarch64|parisc|parisc64|ppc|ppc64|ppc64le|ppc|s390|s390x) rc_kill=159 rc_allow=160 rc_trap=161 diff --git a/tools/scmp_arch_detect.c b/tools/scmp_arch_detect.c index 4b452d1..ad43f2d 100644 --- a/tools/scmp_arch_detect.c +++ b/tools/scmp_arch_detect.c @@ -99,6 +99,12 @@ int main(int argc, char *argv[]) case SCMP_ARCH_MIPSEL64N32: printf("mipsel64n32\n"); break; + case SCMP_ARCH_PARISC: + printf("parisc\n"); + break; + case SCMP_ARCH_PARISC64: + printf("parisc64\n"); + break; case SCMP_ARCH_PPC: printf("ppc\n"); break; diff --git a/tools/scmp_bpf_sim.c b/tools/scmp_bpf_sim.c index a0cf6d1..3d3204a 100644 --- a/tools/scmp_bpf_sim.c +++ b/tools/scmp_bpf_sim.c @@ -265,6 +265,10 @@ int main(int argc, char *argv[]) arch = AUDIT_ARCH_MIPS64N32; else if (strcmp(optarg, "mipsel64n32") == 0) arch = AUDIT_ARCH_MIPSEL64N32; + else if (strcmp(optarg, "parisc") == 0) + arch = AUDIT_ARCH_PARISC; + else if (strcmp(optarg, "parisc64") == 0) + arch = AUDIT_ARCH_PARISC64; else if (strcmp(optarg, "ppc") == 0) arch = AUDIT_ARCH_PPC; else if (strcmp(optarg, "ppc64") == 0) diff --git a/tools/util.c b/tools/util.c index cc48647..7122335 100644 --- a/tools/util.c +++ b/tools/util.c @@ -62,6 +62,10 @@ #elif __MIPSEL__ #define ARCH_NATIVE AUDIT_ARCH_MIPSEL64N32 #endif /* _MIPS_SIM_NABI32 */ +#elif __hppa64__ +#define ARCH_NATIVE AUDIT_ARCH_PARISC64 +#elif __hppa__ +#define ARCH_NATIVE AUDIT_ARCH_PARISC #elif __PPC64__ #ifdef __BIG_ENDIAN__ #define ARCH_NATIVE AUDIT_ARCH_PPC64
This patch (v3) adds support for the parisc and parisc64 architectures to libseccomp. I didn't split up the patch, because it's pretty trivial. Those parisc-specific files gets added: src/arch-parisc-syscalls.c src/arch-parisc.c src/arch-parisc.h src/arch-parisc64.c All other changes are trivial because they simply add parisc-specific case statements in variouse switch statements. I did ran a "make check" on parisc and all testcases suceeded. All live testcases succeed as well when running "./regression -T live". The patch applies cleanly to current libseccomp git head. Changes between v2 and v1 of this patch: - Enabled seccomp mode 2 regression tests on parisc. Kernel support for hppa was added in kernel 4.6-rc1 and backported into the kernel v4.5.2 stable series. Changes between v3 and v2 of this patch: - Stipped out patch which reports if a check was skipped because valgrind isn't installed. - Added tuxcall pseudo syscall for 19-sim-missing_syscalls testcase - Added sysmips pseudo syscall for 29-sim-pseudo_syscall testcase Thanks, Helge Signed-off-by: Helge Deller <deller@gmx.de> diffstat: include/seccomp.h.in | 6 src/Makefile.am | 2 src/arch-parisc-syscalls.c | 424 ++++++++++++++++++++++++++++++++++++++ src/arch-parisc.c | 22 + src/arch-parisc.h | 38 +++ src/arch-parisc64.c | 22 + src/arch-syscall-dump.c | 5 src/arch.c | 13 + src/gen_pfc.c | 4 src/python/libseccomp.pxd | 2 src/python/seccomp.pyx | 8 tests/26-sim-arch_all_be_basic.c | 6 tests/26-sim-arch_all_be_basic.py | 2 tests/regression | 3 tools/scmp_arch_detect.c | 6 tools/scmp_bpf_sim.c | 4 tools/util.c | 4 17 files changed, 570 insertions(+), 1 deletion(-) -- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html