2 * Enhanced Seccomp PPC Specific Code
4 * Copyright (c) 2015 Freescale <bogdan.purcareata@freescale.com>
5 * Author: Bogdan Purcareata <bogdan.purcareata@freescale.com>
10 * This library is free software; you can redistribute it and/or modify it
11 * under the terms of version 2.1 of the GNU Lesser General Public License as
12 * published by the Free Software Foundation.
14 * This library is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, see <http://www.gnu.org/licenses>.
30 /* NOTE: based on Linux 4.5-rc4 */
31 const struct arch_syscall_def ppc_syscall_table
[] = { \
33 { "_newselect", 142 },
41 { "afs_syscall", 137 },
43 { "arm_fadvise64_64", __PNR_arm_fadvise64_64
},
44 { "arm_sync_file_range", __PNR_arm_sync_file_range
},
45 { "arch_prctl", __PNR_arch_prctl
},
50 { "breakpoint", __PNR_breakpoint
},
52 { "cachectl", __PNR_cachectl
},
53 { "cacheflush", __PNR_cacheflush
},
59 { "chown32", __PNR_chown32
},
61 { "clock_adjtime", 347 },
62 { "clock_getres", 247 },
63 { "clock_gettime", 246 },
64 { "clock_nanosleep", 248 },
65 { "clock_settime", 245 },
69 { "copy_file_range", 379 },
71 { "create_module", 127 },
72 { "delete_module", 129 },
76 { "epoll_create", 236 },
77 { "epoll_create1", 315 },
79 { "epoll_ctl_old", __PNR_epoll_ctl_old
},
80 { "epoll_pwait", 303 },
81 { "epoll_wait", 238 },
82 { "epoll_wait_old", __PNR_epoll_wait_old
},
88 { "exit_group", 234 },
91 { "fadvise64_64", 254 },
93 { "fanotify_init", 323 },
94 { "fanotify_mark", 324 },
99 { "fchown32", __PNR_fchown32
},
103 { "fdatasync", 148 },
104 { "fgetxattr", 214 },
105 { "finit_module", 353 },
106 { "flistxattr", 217 },
109 { "fremovexattr", 220 },
110 { "fsetxattr", 211 },
113 { "fstatat64", 291 },
115 { "fstatfs64", 253 },
119 { "ftruncate64", 194 },
121 { "futimesat", 290 },
122 { "get_kernel_syms", 130 },
123 { "get_mempolicy", 260 },
124 { "get_robust_list", 299 },
125 { "get_thread_area", __PNR_get_thread_area
},
129 { "getdents64", 202 },
131 { "getegid32", __PNR_getegid32
},
133 { "geteuid32", __PNR_geteuid32
},
135 { "getgid32", __PNR_getgid32
},
137 { "getgroups32", __PNR_getgroups32
},
138 { "getitimer", 105 },
139 { "getpeername", 332 },
145 { "getpriority", 96 },
146 { "getrandom", 359 },
147 { "getresgid", 170 },
148 { "getresgid32", __PNR_getresgid32
},
149 { "getresuid", 165 },
150 { "getresuid32", __PNR_getresuid32
},
154 { "getsockname", 331 },
155 { "getsockopt", 340 },
157 { "gettimeofday", 78 },
159 { "getuid32", __PNR_getuid32
},
163 { "init_module", 128 },
164 { "inotify_add_watch", 276 },
165 { "inotify_init", 275 },
166 { "inotify_init1", 318 },
167 { "inotify_rm_watch", 277 },
168 { "io_cancel", 231 },
169 { "io_destroy", 228 },
170 { "io_getevents", 229 },
172 { "io_submit", 230 },
176 { "ioprio_get", 274 },
177 { "ioprio_set", 273 },
180 { "kexec_file_load", __PNR_kexec_file_load
},
181 { "kexec_load", 268 },
185 { "lchown32", __PNR_lchown32
},
186 { "lgetxattr", 213 },
190 { "listxattr", 215 },
191 { "llistxattr", 216 },
193 { "lookup_dcookie", 235 },
194 { "lremovexattr", 219 },
196 { "lsetxattr", 210 },
201 { "membarrier", 365 },
202 { "memfd_create", 360 },
203 { "migrate_pages", 258 },
214 { "modify_ldt", 123 },
216 { "move_pages", 301 },
219 { "mq_getsetattr", 267 },
220 { "mq_notify", 266 },
222 { "mq_timedreceive", 265 },
223 { "mq_timedsend", 264 },
224 { "mq_unlink", 263 },
226 { "msgctl", __PNR_msgctl
},
227 { "msgget", __PNR_msgget
},
228 { "msgrcv", __PNR_msgrcv
},
229 { "msgsnd", __PNR_msgsnd
},
231 { "multiplexer", 201 },
233 { "munlockall", 153 },
235 { "name_to_handle_at", 345 },
236 { "nanosleep", 162 },
237 { "newfstatat", __PNR_newfstatat
},
238 { "nfsservctl", 168 },
242 { "oldolduname", 59 },
245 { "oldwait4", __PNR_oldwait4
},
247 { "open_by_handle_at", 346 },
250 { "pciconfig_iobase", 200 },
251 { "pciconfig_read", 198 },
252 { "pciconfig_write", 199 },
253 { "perf_event_open", 319 },
254 { "personality", 136 },
257 { "pivot_root", 203 },
263 { "prlimit64", 325 },
264 { "process_vm_readv", 351 },
265 { "process_vm_writev", 352 },
273 { "query_module", 166 },
276 { "readahead", 191 },
279 { "readlinkat", 296 },
286 { "remap_file_pages", 239 },
287 { "removexattr", 218 },
290 { "renameat2", 357 },
291 { "request_key", 270 },
292 { "restart_syscall", 0 },
294 { "rt_sigaction", 173 },
295 { "rt_sigpending", 175 },
296 { "rt_sigprocmask", 174 },
297 { "rt_sigqueueinfo", 177 },
298 { "rt_sigreturn", 172 },
299 { "rt_sigsuspend", 178 },
300 { "rt_sigtimedwait", 176 },
301 { "rt_tgsigqueueinfo", 322 },
303 { "s390_pci_mmio_read", __PNR_s390_pci_mmio_read
},
304 { "s390_pci_mmio_write", __PNR_s390_pci_mmio_write
},
305 { "s390_runtime_instr", __PNR_s390_runtime_instr
},
306 { "sched_get_priority_max", 159 },
307 { "sched_get_priority_min", 160 },
308 { "sched_getaffinity", 223 },
309 { "sched_getattr", 356 },
310 { "sched_getparam", 155 },
311 { "sched_getscheduler", 157 },
312 { "sched_rr_get_interval", 161 },
313 { "sched_setaffinity", 222 },
314 { "sched_setattr", 355 },
315 { "sched_setparam", 154 },
316 { "sched_setscheduler", 156 },
317 { "sched_yield", 158 },
319 { "security", __PNR_security
},
321 { "semctl", __PNR_semctl
},
322 { "semget", __PNR_semget
},
323 { "semop", __PNR_semop
},
324 { "semtimedop", __PNR_semtimedop
},
327 { "sendfile64", 226 },
331 { "set_mempolicy", 261 },
332 { "set_robust_list", 300 },
333 { "set_thread_area", __PNR_set_thread_area
},
334 { "set_tid_address", 232 },
335 { "set_tls", __PNR_set_tls
},
336 { "setdomainname", 121 },
338 { "setfsgid32", __PNR_setfsgid32
},
340 { "setfsuid32", __PNR_setfsuid32
},
342 { "setgid32", __PNR_setgid32
},
344 { "setgroups32", __PNR_setgroups32
},
345 { "sethostname", 74 },
346 { "setitimer", 104 },
349 { "setpriority", 97 },
351 { "setregid32", __PNR_setregid32
},
352 { "setresgid", 169 },
353 { "setresgid32", __PNR_setresgid32
},
354 { "setresuid", 164 },
355 { "setresuid32", __PNR_setresuid32
},
357 { "setreuid32", __PNR_setreuid32
},
360 { "setsockopt", 339 },
361 { "settimeofday", 79 },
363 { "setuid32", __PNR_setuid32
},
366 { "shmat", __PNR_shmat
},
367 { "shmctl", __PNR_shmctl
},
368 { "shmdt", __PNR_shmdt
},
369 { "shmget", __PNR_shmget
},
372 { "sigaltstack", 185 },
375 { "signalfd4", 313 },
376 { "sigpending", 73 },
377 { "sigprocmask", 126 },
378 { "sigreturn", 119 },
379 { "sigsuspend", 72 },
381 { "socketcall", 102 },
382 { "socketpair", 333 },
384 { "spu_create", 279 },
393 { "subpage_prot", 310 },
394 { "swapcontext", 249 },
397 { "switch_endian", 363 },
399 { "symlinkat", 295 },
401 { "sync_file_range", __PNR_sync_file_range
},
402 { "sync_file_range2", 308 },
404 { "syscall", __PNR_syscall
},
405 { "sys_debug_setcontext", 256 },
409 { "sysmips", __PNR_sysmips
},
413 { "timer_create", 240 },
414 { "timer_delete", 244 },
415 { "timer_getoverrun", 243 },
416 { "timer_gettime", 242 },
417 { "timer_settime", 241 },
418 { "timerfd", __PNR_timerfd
},
419 { "timerfd_create", 306 },
420 { "timerfd_gettime", 312 },
421 { "timerfd_settime", 311 },
425 { "truncate64", 193 },
427 { "ugetrlimit", 190 },
437 { "userfaultfd", 364 },
438 { "usr26", __PNR_usr26
},
439 { "usr32", __PNR_usr32
},
442 { "utimensat", 304 },
447 { "vm86old", __PNR_vm86old
},
449 { "vserver", __PNR_vserver
},
455 { NULL
, __NR_SCMP_ERROR
},
459 * Resolve a syscall name to a number
460 * @param name the syscall name
462 * Resolve the given syscall name to the syscall number using the syscall table.
463 * Returns the syscall number on success, including negative pseudo syscall
464 * numbers; returns __NR_SCMP_ERROR on failure.
467 int ppc_syscall_resolve_name(const char *name
)
470 const struct arch_syscall_def
*table
= ppc_syscall_table
;
472 /* XXX - plenty of room for future improvement here */
473 for (iter
= 0; table
[iter
].name
!= NULL
; iter
++) {
474 if (strcmp(name
, table
[iter
].name
) == 0)
475 return table
[iter
].num
;
478 return __NR_SCMP_ERROR
;
482 * Resolve a syscall number to a name
483 * @param num the syscall number
485 * Resolve the given syscall number to the syscall name using the syscall table.
486 * Returns a pointer to the syscall name string on success, including pseudo
487 * syscall names; returns NULL on failure.
490 const char *ppc_syscall_resolve_num(int num
)
493 const struct arch_syscall_def
*table
= ppc_syscall_table
;
495 /* XXX - plenty of room for future improvement here */
496 for (iter
= 0; table
[iter
].num
!= __NR_SCMP_ERROR
; iter
++) {
497 if (num
== table
[iter
].num
)
498 return table
[iter
].name
;
505 * Iterate through the syscall table and return the syscall name
506 * @param spot the offset into the syscall table
508 * Return the syscall name at position @spot or NULL on failure. This function
509 * should only ever be used internally by libseccomp.
512 const char *ppc_syscall_iterate_name(unsigned int spot
)
514 /* XXX - no safety checks here */
515 return ppc_syscall_table
[spot
].name
;