18a0f6d8cSDmitry Chagin /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 38a0f6d8cSDmitry Chagin * 48a0f6d8cSDmitry Chagin * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org> 58a0f6d8cSDmitry Chagin * 68a0f6d8cSDmitry Chagin * Redistribution and use in source and binary forms, with or without 78a0f6d8cSDmitry Chagin * modification, are permitted provided that the following conditions 88a0f6d8cSDmitry Chagin * are met: 98a0f6d8cSDmitry Chagin * 1. Redistributions of source code must retain the above copyright 108a0f6d8cSDmitry Chagin * notice, this list of conditions and the following disclaimer. 118a0f6d8cSDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 128a0f6d8cSDmitry Chagin * notice, this list of conditions and the following disclaimer in the 138a0f6d8cSDmitry Chagin * documentation and/or other materials provided with the distribution. 148a0f6d8cSDmitry Chagin * 158a0f6d8cSDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 168a0f6d8cSDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 178a0f6d8cSDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 188a0f6d8cSDmitry Chagin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 198a0f6d8cSDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 208a0f6d8cSDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 218a0f6d8cSDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 228a0f6d8cSDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 238a0f6d8cSDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 248a0f6d8cSDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 258a0f6d8cSDmitry Chagin * SUCH DAMAGE. 268a0f6d8cSDmitry Chagin */ 278a0f6d8cSDmitry Chagin 288a0f6d8cSDmitry Chagin #include <sys/cdefs.h> 298a0f6d8cSDmitry Chagin __FBSDID("$FreeBSD$"); 308a0f6d8cSDmitry Chagin 318a0f6d8cSDmitry Chagin #include <sys/param.h> 328a0f6d8cSDmitry Chagin #include <sys/uio.h> 338a0f6d8cSDmitry Chagin #include <sys/ktrace.h> 343606a213SDmitry Chagin #include <err.h> 353606a213SDmitry Chagin #include <errno.h> 368a0f6d8cSDmitry Chagin #include <stddef.h> 373606a213SDmitry Chagin #include <stdlib.h> 383606a213SDmitry Chagin #include <string.h> 398a0f6d8cSDmitry Chagin #include <sysdecode.h> 408a0f6d8cSDmitry Chagin 418a0f6d8cSDmitry Chagin #include "kdump.h" 428a0f6d8cSDmitry Chagin 438a0f6d8cSDmitry Chagin #ifdef __amd64__ 444d496ab4SDmitry Chagin #include <amd64/linux/linux.h> 458a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h> 468a0f6d8cSDmitry Chagin #elif __aarch64__ 474d496ab4SDmitry Chagin #include <arm64/linux/linux.h> 488a0f6d8cSDmitry Chagin #elif __i386__ 494d496ab4SDmitry Chagin #include <i386/linux/linux.h> 508a0f6d8cSDmitry Chagin #endif 518a0f6d8cSDmitry Chagin 523606a213SDmitry Chagin #include <compat/linux/linux.h> 534d496ab4SDmitry Chagin #include <compat/linux/linux_file.h> 543606a213SDmitry Chagin 558a0f6d8cSDmitry Chagin static void 568a0f6d8cSDmitry Chagin print_linux_signal(int signo) 578a0f6d8cSDmitry Chagin { 588a0f6d8cSDmitry Chagin const char *signame; 598a0f6d8cSDmitry Chagin 608a0f6d8cSDmitry Chagin signame = sysdecode_linux_signal(signo); 618a0f6d8cSDmitry Chagin if (signame != NULL) 628a0f6d8cSDmitry Chagin printf("%s", signame); 638a0f6d8cSDmitry Chagin else 648a0f6d8cSDmitry Chagin printf("SIG %d", signo); 658a0f6d8cSDmitry Chagin } 668a0f6d8cSDmitry Chagin 678a0f6d8cSDmitry Chagin void 688a0f6d8cSDmitry Chagin ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip, 698a0f6d8cSDmitry Chagin int *resnarg, char *resc) 708a0f6d8cSDmitry Chagin { 718a0f6d8cSDmitry Chagin int narg = ktr->ktr_narg; 728a0f6d8cSDmitry Chagin register_t *ip, *first; 738a0f6d8cSDmitry Chagin int quad_align, quad_slots; 748a0f6d8cSDmitry Chagin char c; 758a0f6d8cSDmitry Chagin 768a0f6d8cSDmitry Chagin ip = first = &ktr->ktr_args[0]; 778a0f6d8cSDmitry Chagin c = *resc; 788a0f6d8cSDmitry Chagin quad_align = 0; 798a0f6d8cSDmitry Chagin quad_slots = 1; 808a0f6d8cSDmitry Chagin switch (ktr->ktr_code) { 814d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 824d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 834d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 844d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 854d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 864d496ab4SDmitry Chagin #endif 874d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 884d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 894d496ab4SDmitry Chagin #endif 904d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_futimesat 914d496ab4SDmitry Chagin case LINUX_SYS_linux_futimesat: 924d496ab4SDmitry Chagin #endif 934d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 944d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdirat: 954d496ab4SDmitry Chagin case LINUX_SYS_linux_mknodat: 964d496ab4SDmitry Chagin case LINUX_SYS_linux_openat: 974d496ab4SDmitry Chagin case LINUX_SYS_linux_readlinkat: 984d496ab4SDmitry Chagin case LINUX_SYS_linux_renameat: 994d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 1004d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 1014d496ab4SDmitry Chagin putchar('('); 1024d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 1034d496ab4SDmitry Chagin c = ','; 1044d496ab4SDmitry Chagin ip++; 1054d496ab4SDmitry Chagin narg--; 1064d496ab4SDmitry Chagin break; 1074d496ab4SDmitry Chagin } 1084d496ab4SDmitry Chagin switch (ktr->ktr_code) { 1094d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_access 1104d496ab4SDmitry Chagin case LINUX_SYS_linux_access: 1114d496ab4SDmitry Chagin #endif 1124d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 1134d496ab4SDmitry Chagin print_number(ip, narg, c); 1144d496ab4SDmitry Chagin putchar(','); 1154d496ab4SDmitry Chagin print_mask_arg(sysdecode_access_mode, *ip); 1164d496ab4SDmitry Chagin ip++; 1174d496ab4SDmitry Chagin narg--; 1184d496ab4SDmitry Chagin break; 1194d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_chmod 1204d496ab4SDmitry Chagin case LINUX_SYS_linux_chmod: 1214d496ab4SDmitry Chagin #endif 1224d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 1234d496ab4SDmitry Chagin print_number(ip, narg, c); 1244d496ab4SDmitry Chagin putchar(','); 1254d496ab4SDmitry Chagin decode_filemode(*ip); 1264d496ab4SDmitry Chagin ip++; 1274d496ab4SDmitry Chagin narg--; 1284d496ab4SDmitry Chagin break; 1294d496ab4SDmitry Chagin case LINUX_SYS_linux_mknodat: 1304d496ab4SDmitry Chagin print_number(ip, narg, c); 1314d496ab4SDmitry Chagin putchar(','); 1324d496ab4SDmitry Chagin decode_filemode(*ip); 1334d496ab4SDmitry Chagin ip++; 1344d496ab4SDmitry Chagin narg--; 1354d496ab4SDmitry Chagin break; 1364d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_mkdir 1374d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdir: 1384d496ab4SDmitry Chagin #endif 1394d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdirat: 1404d496ab4SDmitry Chagin print_number(ip, narg, c); 1414d496ab4SDmitry Chagin putchar(','); 1424d496ab4SDmitry Chagin decode_filemode(*ip); 1434d496ab4SDmitry Chagin ip++; 1444d496ab4SDmitry Chagin narg--; 1454d496ab4SDmitry Chagin break; 1464d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 1474d496ab4SDmitry Chagin case LINUX_SYS_linux_renameat: 1484d496ab4SDmitry Chagin case LINUX_SYS_linux_symlinkat: 1494d496ab4SDmitry Chagin print_number(ip, narg, c); 1504d496ab4SDmitry Chagin putchar(','); 1514d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 1524d496ab4SDmitry Chagin ip++; 1534d496ab4SDmitry Chagin narg--; 1544d496ab4SDmitry Chagin print_number(ip, narg, c); 1554d496ab4SDmitry Chagin break; 1564d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 1574d496ab4SDmitry Chagin print_number(ip, narg, c); 1584d496ab4SDmitry Chagin print_number(ip, narg, c); 1594d496ab4SDmitry Chagin print_number(ip, narg, c); 1604d496ab4SDmitry Chagin break; 1614d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 1624d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 1634d496ab4SDmitry Chagin #endif 1644d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 1654d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 1664d496ab4SDmitry Chagin #endif 1674d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 1684d496ab4SDmitry Chagin print_number(ip, narg, c); 1694d496ab4SDmitry Chagin print_number(ip, narg, c); 1704d496ab4SDmitry Chagin break; 1714d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 1724d496ab4SDmitry Chagin print_number(ip, narg, c); 1734d496ab4SDmitry Chagin break; 1748a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_gettime: 1758a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_settime: 1768a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_getres: 1778a0f6d8cSDmitry Chagin case LINUX_SYS_linux_timer_create: 1788a0f6d8cSDmitry Chagin putchar('('); 1798a0f6d8cSDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 1808a0f6d8cSDmitry Chagin c = ','; 1818a0f6d8cSDmitry Chagin ip++; 1828a0f6d8cSDmitry Chagin narg--; 1838a0f6d8cSDmitry Chagin break; 18439de84b6SDmitry Chagin case LINUX_SYS_linux_clock_nanosleep: 18539de84b6SDmitry Chagin putchar('('); 18639de84b6SDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 18739de84b6SDmitry Chagin putchar(','); 18839de84b6SDmitry Chagin ip++; 18939de84b6SDmitry Chagin narg--; 19039de84b6SDmitry Chagin print_mask_arg0(sysdecode_linux_clock_flags, *ip); 19139de84b6SDmitry Chagin c = ','; 19239de84b6SDmitry Chagin ip++; 19339de84b6SDmitry Chagin narg--; 19439de84b6SDmitry Chagin break; 1958a0f6d8cSDmitry Chagin case LINUX_SYS_linux_kill: 1968a0f6d8cSDmitry Chagin case LINUX_SYS_linux_tkill: 1978a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_sigqueueinfo: 1988a0f6d8cSDmitry Chagin print_number(ip, narg, c); 1998a0f6d8cSDmitry Chagin putchar(','); 2008a0f6d8cSDmitry Chagin print_linux_signal(*ip); 2018a0f6d8cSDmitry Chagin ip++; 2028a0f6d8cSDmitry Chagin narg--; 2038a0f6d8cSDmitry Chagin break; 2048a0f6d8cSDmitry Chagin case LINUX_SYS_linux_tgkill: 2058a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_tgsigqueueinfo: 2068a0f6d8cSDmitry Chagin print_number(ip, narg, c); 2078a0f6d8cSDmitry Chagin print_number(ip, narg, c); 2088a0f6d8cSDmitry Chagin putchar(','); 2098a0f6d8cSDmitry Chagin print_linux_signal(*ip); 2108a0f6d8cSDmitry Chagin ip++; 2118a0f6d8cSDmitry Chagin narg--; 2128a0f6d8cSDmitry Chagin break; 2134d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open 2144d496ab4SDmitry Chagin case LINUX_SYS_linux_open: 2154d496ab4SDmitry Chagin #endif 2164d496ab4SDmitry Chagin case LINUX_SYS_linux_openat: 2174d496ab4SDmitry Chagin print_number(ip, narg, c); 2184d496ab4SDmitry Chagin putchar(','); 2194d496ab4SDmitry Chagin print_mask_arg(sysdecode_linux_open_flags, ip[0]); 2204d496ab4SDmitry Chagin if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) { 2214d496ab4SDmitry Chagin putchar(','); 2224d496ab4SDmitry Chagin decode_filemode(ip[1]); 2234d496ab4SDmitry Chagin } 2244d496ab4SDmitry Chagin ip += 2; 2254d496ab4SDmitry Chagin narg -= 2; 2264d496ab4SDmitry Chagin break; 2278a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_sigaction: 2288a0f6d8cSDmitry Chagin putchar('('); 2298a0f6d8cSDmitry Chagin print_linux_signal(*ip); 2308a0f6d8cSDmitry Chagin ip++; 2318a0f6d8cSDmitry Chagin narg--; 2328a0f6d8cSDmitry Chagin c = ','; 2338a0f6d8cSDmitry Chagin break; 2348a0f6d8cSDmitry Chagin case LINUX_SYS_linux_ftruncate: 2358a0f6d8cSDmitry Chagin case LINUX_SYS_linux_truncate: 2368a0f6d8cSDmitry Chagin print_number(ip, narg, c); 2378a0f6d8cSDmitry Chagin print_number64(first, ip, narg, c); 2388a0f6d8cSDmitry Chagin break; 239b9b86b67SDmitry Chagin case LINUX_SYS_linux_getitimer: 240b9b86b67SDmitry Chagin case LINUX_SYS_linux_setitimer: 241b9b86b67SDmitry Chagin putchar('('); 242b9b86b67SDmitry Chagin print_integer_arg(sysdecode_itimer, *ip); 243b9b86b67SDmitry Chagin ip++; 244b9b86b67SDmitry Chagin narg--; 245b9b86b67SDmitry Chagin c = ','; 246b9b86b67SDmitry Chagin break; 247f587a2a7SDmitry Chagin case LINUX_SYS_linux_rt_sigprocmask: 248f587a2a7SDmitry Chagin #ifdef LINUX_SYS_linux_sigprocmask 249f587a2a7SDmitry Chagin case LINUX_SYS_linux_sigprocmask: 250f587a2a7SDmitry Chagin #endif 251f587a2a7SDmitry Chagin putchar('('); 252f587a2a7SDmitry Chagin print_integer_arg(sysdecode_linux_sigprocmask_how, *ip); 253f587a2a7SDmitry Chagin ip++; 254f587a2a7SDmitry Chagin narg--; 255f587a2a7SDmitry Chagin c = ','; 256f587a2a7SDmitry Chagin break; 2578a0f6d8cSDmitry Chagin } 2584d496ab4SDmitry Chagin switch (ktr->ktr_code) { 2594d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 2604d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 2614d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 2624d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 2634d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 2644d496ab4SDmitry Chagin #endif 2654d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 2664d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 2674d496ab4SDmitry Chagin #endif 2684d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 2694d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 2704d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 2714d496ab4SDmitry Chagin putchar(','); 2724d496ab4SDmitry Chagin print_mask_arg0(sysdecode_linux_atflags, *ip); 2734d496ab4SDmitry Chagin ip++; 2744d496ab4SDmitry Chagin narg--; 2754d496ab4SDmitry Chagin break; 2764d496ab4SDmitry Chagin } 2778a0f6d8cSDmitry Chagin *resc = c; 2788a0f6d8cSDmitry Chagin *resip = ip; 2798a0f6d8cSDmitry Chagin *resnarg = narg; 2808a0f6d8cSDmitry Chagin } 2818a0f6d8cSDmitry Chagin 2828a0f6d8cSDmitry Chagin #if defined(__amd64__) 2838a0f6d8cSDmitry Chagin void 2848a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip, 2858a0f6d8cSDmitry Chagin int *resnarg, char *resc) 2868a0f6d8cSDmitry Chagin { 2878a0f6d8cSDmitry Chagin int narg = ktr->ktr_narg; 2888a0f6d8cSDmitry Chagin register_t *ip, *first; 2898a0f6d8cSDmitry Chagin int quad_align, quad_slots; 2908a0f6d8cSDmitry Chagin char c; 2918a0f6d8cSDmitry Chagin 2928a0f6d8cSDmitry Chagin ip = first = &ktr->ktr_args[0]; 2938a0f6d8cSDmitry Chagin c = *resc; 2948a0f6d8cSDmitry Chagin quad_align = 0; 2958a0f6d8cSDmitry Chagin quad_slots = 2; 2968a0f6d8cSDmitry Chagin switch (ktr->ktr_code) { 2974d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 2984d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 2994d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 3004d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 3014d496ab4SDmitry Chagin case LINUX32_SYS_linux_futimesat: 3024d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 3034d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdirat: 3044d496ab4SDmitry Chagin case LINUX32_SYS_linux_mknodat: 3054d496ab4SDmitry Chagin case LINUX32_SYS_linux_openat: 3064d496ab4SDmitry Chagin case LINUX32_SYS_linux_readlinkat: 3074d496ab4SDmitry Chagin case LINUX32_SYS_linux_renameat: 3084d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 3094d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 3104d496ab4SDmitry Chagin putchar('('); 3114d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 3124d496ab4SDmitry Chagin c = ','; 3134d496ab4SDmitry Chagin ip++; 3144d496ab4SDmitry Chagin narg--; 3154d496ab4SDmitry Chagin break; 3164d496ab4SDmitry Chagin } 3174d496ab4SDmitry Chagin switch (ktr->ktr_code) { 3184d496ab4SDmitry Chagin case LINUX32_SYS_linux_access: 3194d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 3204d496ab4SDmitry Chagin print_number(ip, narg, c); 3214d496ab4SDmitry Chagin putchar(','); 3224d496ab4SDmitry Chagin print_mask_arg(sysdecode_access_mode, *ip); 3234d496ab4SDmitry Chagin ip++; 3244d496ab4SDmitry Chagin narg--; 3254d496ab4SDmitry Chagin break; 3264d496ab4SDmitry Chagin case LINUX32_SYS_linux_chmod: 3274d496ab4SDmitry Chagin case LINUX32_SYS_fchmod: 3284d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 3294d496ab4SDmitry Chagin print_number(ip, narg, c); 3304d496ab4SDmitry Chagin putchar(','); 3314d496ab4SDmitry Chagin decode_filemode(*ip); 3324d496ab4SDmitry Chagin ip++; 3334d496ab4SDmitry Chagin narg--; 3344d496ab4SDmitry Chagin break; 3354d496ab4SDmitry Chagin case LINUX32_SYS_linux_mknodat: 3364d496ab4SDmitry Chagin print_number(ip, narg, c); 3374d496ab4SDmitry Chagin putchar(','); 3384d496ab4SDmitry Chagin decode_filemode(*ip); 3394d496ab4SDmitry Chagin ip++; 3404d496ab4SDmitry Chagin narg--; 3414d496ab4SDmitry Chagin break; 3424d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdir: 3434d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdirat: 3444d496ab4SDmitry Chagin print_number(ip, narg, c); 3454d496ab4SDmitry Chagin putchar(','); 3464d496ab4SDmitry Chagin decode_filemode(*ip); 3474d496ab4SDmitry Chagin ip++; 3484d496ab4SDmitry Chagin narg--; 3494d496ab4SDmitry Chagin break; 3504d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 3514d496ab4SDmitry Chagin case LINUX32_SYS_linux_renameat: 3524d496ab4SDmitry Chagin case LINUX32_SYS_linux_symlinkat: 3534d496ab4SDmitry Chagin print_number(ip, narg, c); 3544d496ab4SDmitry Chagin putchar(','); 3554d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 3564d496ab4SDmitry Chagin ip++; 3574d496ab4SDmitry Chagin narg--; 3584d496ab4SDmitry Chagin print_number(ip, narg, c); 3594d496ab4SDmitry Chagin break; 3604d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 3614d496ab4SDmitry Chagin print_number(ip, narg, c); 3624d496ab4SDmitry Chagin print_number(ip, narg, c); 3634d496ab4SDmitry Chagin print_number(ip, narg, c); 3644d496ab4SDmitry Chagin break; 3654d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 3664d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 3674d496ab4SDmitry Chagin print_number(ip, narg, c); 3684d496ab4SDmitry Chagin print_number(ip, narg, c); 3694d496ab4SDmitry Chagin break; 3704d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 3714d496ab4SDmitry Chagin print_number(ip, narg, c); 3724d496ab4SDmitry Chagin break; 3738a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_gettime: 3748a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_settime: 3758a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_getres: 3768a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_timer_create: 3778a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_gettime64: 3788a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_settime64: 3798a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_getres_time64: 3808a0f6d8cSDmitry Chagin putchar('('); 3818a0f6d8cSDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 3828a0f6d8cSDmitry Chagin c = ','; 3838a0f6d8cSDmitry Chagin ip++; 3848a0f6d8cSDmitry Chagin narg--; 3858a0f6d8cSDmitry Chagin break; 38639de84b6SDmitry Chagin case LINUX32_SYS_linux_clock_nanosleep: 38739de84b6SDmitry Chagin putchar('('); 38839de84b6SDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 38939de84b6SDmitry Chagin putchar(','); 39039de84b6SDmitry Chagin ip++; 39139de84b6SDmitry Chagin narg--; 39239de84b6SDmitry Chagin print_mask_arg0(sysdecode_linux_clock_flags, *ip); 39339de84b6SDmitry Chagin c = ','; 39439de84b6SDmitry Chagin ip++; 39539de84b6SDmitry Chagin narg--; 39639de84b6SDmitry Chagin break; 3978a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_kill: 3988a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_tkill: 3998a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_sigqueueinfo: 4008a0f6d8cSDmitry Chagin print_number(ip, narg, c); 4018a0f6d8cSDmitry Chagin putchar(','); 4028a0f6d8cSDmitry Chagin print_linux_signal(*ip); 4038a0f6d8cSDmitry Chagin ip++; 4048a0f6d8cSDmitry Chagin narg--; 4058a0f6d8cSDmitry Chagin break; 4068a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_tgkill: 4078a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_tgsigqueueinfo: 4088a0f6d8cSDmitry Chagin print_number(ip, narg, c); 4098a0f6d8cSDmitry Chagin print_number(ip, narg, c); 4108a0f6d8cSDmitry Chagin putchar(','); 4118a0f6d8cSDmitry Chagin print_linux_signal(*ip); 4128a0f6d8cSDmitry Chagin ip++; 4138a0f6d8cSDmitry Chagin narg--; 4148a0f6d8cSDmitry Chagin break; 4154d496ab4SDmitry Chagin case LINUX32_SYS_linux_open: 4164d496ab4SDmitry Chagin case LINUX32_SYS_linux_openat: 4174d496ab4SDmitry Chagin print_number(ip, narg, c); 4184d496ab4SDmitry Chagin putchar(','); 4194d496ab4SDmitry Chagin print_mask_arg(sysdecode_linux_open_flags, ip[0]); 4204d496ab4SDmitry Chagin if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) { 4214d496ab4SDmitry Chagin putchar(','); 4224d496ab4SDmitry Chagin decode_filemode(ip[1]); 4234d496ab4SDmitry Chagin } 4244d496ab4SDmitry Chagin ip += 2; 4254d496ab4SDmitry Chagin narg -= 2; 4264d496ab4SDmitry Chagin break; 4278a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_signal: 4288a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_sigaction: 4298a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_sigaction: 4308a0f6d8cSDmitry Chagin putchar('('); 4318a0f6d8cSDmitry Chagin print_linux_signal(*ip); 4328a0f6d8cSDmitry Chagin ip++; 4338a0f6d8cSDmitry Chagin narg--; 4348a0f6d8cSDmitry Chagin c = ','; 4358a0f6d8cSDmitry Chagin break; 4368a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_ftruncate: 4378a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_truncate: 4388a0f6d8cSDmitry Chagin print_number(ip, narg, c); 4398a0f6d8cSDmitry Chagin print_number64(first, ip, narg, c); 4408a0f6d8cSDmitry Chagin break; 441b9b86b67SDmitry Chagin case LINUX32_SYS_linux_getitimer: 442b9b86b67SDmitry Chagin case LINUX32_SYS_linux_setitimer: 443b9b86b67SDmitry Chagin putchar('('); 444b9b86b67SDmitry Chagin print_integer_arg(sysdecode_itimer, *ip); 445b9b86b67SDmitry Chagin ip++; 446b9b86b67SDmitry Chagin narg--; 447b9b86b67SDmitry Chagin c = ','; 448b9b86b67SDmitry Chagin break; 449f587a2a7SDmitry Chagin case LINUX32_SYS_linux_rt_sigprocmask: 450f587a2a7SDmitry Chagin case LINUX32_SYS_linux_sigprocmask: 451f587a2a7SDmitry Chagin putchar('('); 452f587a2a7SDmitry Chagin print_integer_arg(sysdecode_linux_sigprocmask_how, *ip); 453f587a2a7SDmitry Chagin ip++; 454f587a2a7SDmitry Chagin narg--; 455f587a2a7SDmitry Chagin c = ','; 456f587a2a7SDmitry Chagin break; 4578a0f6d8cSDmitry Chagin } 4584d496ab4SDmitry Chagin switch (ktr->ktr_code) { 4594d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 4604d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 4614d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 4624d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 4634d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 4644d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 4654d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 4664d496ab4SDmitry Chagin putchar(','); 4674d496ab4SDmitry Chagin print_mask_arg0(sysdecode_linux_atflags, *ip); 4684d496ab4SDmitry Chagin ip++; 4694d496ab4SDmitry Chagin narg--; 4704d496ab4SDmitry Chagin break; 4714d496ab4SDmitry Chagin } 4728a0f6d8cSDmitry Chagin *resc = c; 4738a0f6d8cSDmitry Chagin *resip = ip; 4748a0f6d8cSDmitry Chagin *resnarg = narg; 4758a0f6d8cSDmitry Chagin } 4768a0f6d8cSDmitry Chagin #endif /* __amd64__ */ 4773606a213SDmitry Chagin 4783606a213SDmitry Chagin static void 4793606a213SDmitry Chagin ktrsigset(const char *name, const l_sigset_t *mask, size_t sz) 4803606a213SDmitry Chagin { 4813606a213SDmitry Chagin unsigned long i, c; 4823606a213SDmitry Chagin 4833606a213SDmitry Chagin printf("%s [ ", name); 4843606a213SDmitry Chagin c = 0; 4853606a213SDmitry Chagin for (i = 1; i <= sz * CHAR_BIT; i++) { 4863606a213SDmitry Chagin if (!LINUX_SIGISMEMBER(*mask, i)) 4873606a213SDmitry Chagin continue; 4883606a213SDmitry Chagin if (c != 0) 4893606a213SDmitry Chagin printf(", "); 4903606a213SDmitry Chagin printf("%s", sysdecode_linux_signal(i)); 4913606a213SDmitry Chagin c++; 4923606a213SDmitry Chagin } 4933606a213SDmitry Chagin if (c == 0) 4943606a213SDmitry Chagin printf("empty ]\n"); 4953606a213SDmitry Chagin else 4963606a213SDmitry Chagin printf(" ]\n"); 4973606a213SDmitry Chagin } 4983606a213SDmitry Chagin 4993606a213SDmitry Chagin bool 5003606a213SDmitry Chagin ktrstruct_linux(const char *name, const char *data, size_t datalen) 5013606a213SDmitry Chagin { 5023606a213SDmitry Chagin l_sigset_t mask; 5033606a213SDmitry Chagin 5043606a213SDmitry Chagin if (strcmp(name, "l_sigset_t") == 0) { 5053606a213SDmitry Chagin /* Old Linux sigset_t is one word size. */ 5063606a213SDmitry Chagin if (datalen < sizeof(int) || datalen > sizeof(l_sigset_t)) 5073606a213SDmitry Chagin return (false); 5083606a213SDmitry Chagin memcpy(&mask, data, datalen); 5093606a213SDmitry Chagin ktrsigset(name, &mask, datalen); 5103606a213SDmitry Chagin } else 5113606a213SDmitry Chagin return (false); 5123606a213SDmitry Chagin 5133606a213SDmitry Chagin return (true); 5143606a213SDmitry Chagin } 515