18a0f6d8cSDmitry Chagin /*- 28a0f6d8cSDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 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__ 44*4d496ab4SDmitry Chagin #include <amd64/linux/linux.h> 458a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h> 468a0f6d8cSDmitry Chagin #elif __aarch64__ 47*4d496ab4SDmitry Chagin #include <arm64/linux/linux.h> 488a0f6d8cSDmitry Chagin #elif __i386__ 49*4d496ab4SDmitry Chagin #include <i386/linux/linux.h> 508a0f6d8cSDmitry Chagin #endif 518a0f6d8cSDmitry Chagin 523606a213SDmitry Chagin #include <compat/linux/linux.h> 53*4d496ab4SDmitry 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) { 81*4d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 82*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 83*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 84*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 85*4d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 86*4d496ab4SDmitry Chagin #endif 87*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 88*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 89*4d496ab4SDmitry Chagin #endif 90*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_futimesat 91*4d496ab4SDmitry Chagin case LINUX_SYS_linux_futimesat: 92*4d496ab4SDmitry Chagin #endif 93*4d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 94*4d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdirat: 95*4d496ab4SDmitry Chagin case LINUX_SYS_linux_mknodat: 96*4d496ab4SDmitry Chagin case LINUX_SYS_linux_openat: 97*4d496ab4SDmitry Chagin case LINUX_SYS_linux_readlinkat: 98*4d496ab4SDmitry Chagin case LINUX_SYS_linux_renameat: 99*4d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 100*4d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 101*4d496ab4SDmitry Chagin putchar('('); 102*4d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 103*4d496ab4SDmitry Chagin c = ','; 104*4d496ab4SDmitry Chagin ip++; 105*4d496ab4SDmitry Chagin narg--; 106*4d496ab4SDmitry Chagin break; 107*4d496ab4SDmitry Chagin } 108*4d496ab4SDmitry Chagin switch (ktr->ktr_code) { 109*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_access 110*4d496ab4SDmitry Chagin case LINUX_SYS_linux_access: 111*4d496ab4SDmitry Chagin #endif 112*4d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 113*4d496ab4SDmitry Chagin print_number(ip, narg, c); 114*4d496ab4SDmitry Chagin putchar(','); 115*4d496ab4SDmitry Chagin print_mask_arg(sysdecode_access_mode, *ip); 116*4d496ab4SDmitry Chagin ip++; 117*4d496ab4SDmitry Chagin narg--; 118*4d496ab4SDmitry Chagin break; 119*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_chmod 120*4d496ab4SDmitry Chagin case LINUX_SYS_linux_chmod: 121*4d496ab4SDmitry Chagin #endif 122*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 123*4d496ab4SDmitry Chagin print_number(ip, narg, c); 124*4d496ab4SDmitry Chagin putchar(','); 125*4d496ab4SDmitry Chagin decode_filemode(*ip); 126*4d496ab4SDmitry Chagin ip++; 127*4d496ab4SDmitry Chagin narg--; 128*4d496ab4SDmitry Chagin break; 129*4d496ab4SDmitry Chagin case LINUX_SYS_linux_mknodat: 130*4d496ab4SDmitry Chagin print_number(ip, narg, c); 131*4d496ab4SDmitry Chagin putchar(','); 132*4d496ab4SDmitry Chagin decode_filemode(*ip); 133*4d496ab4SDmitry Chagin ip++; 134*4d496ab4SDmitry Chagin narg--; 135*4d496ab4SDmitry Chagin break; 136*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_mkdir 137*4d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdir: 138*4d496ab4SDmitry Chagin #endif 139*4d496ab4SDmitry Chagin case LINUX_SYS_linux_mkdirat: 140*4d496ab4SDmitry Chagin print_number(ip, narg, c); 141*4d496ab4SDmitry Chagin putchar(','); 142*4d496ab4SDmitry Chagin decode_filemode(*ip); 143*4d496ab4SDmitry Chagin ip++; 144*4d496ab4SDmitry Chagin narg--; 145*4d496ab4SDmitry Chagin break; 146*4d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 147*4d496ab4SDmitry Chagin case LINUX_SYS_linux_renameat: 148*4d496ab4SDmitry Chagin case LINUX_SYS_linux_symlinkat: 149*4d496ab4SDmitry Chagin print_number(ip, narg, c); 150*4d496ab4SDmitry Chagin putchar(','); 151*4d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 152*4d496ab4SDmitry Chagin ip++; 153*4d496ab4SDmitry Chagin narg--; 154*4d496ab4SDmitry Chagin print_number(ip, narg, c); 155*4d496ab4SDmitry Chagin break; 156*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 157*4d496ab4SDmitry Chagin print_number(ip, narg, c); 158*4d496ab4SDmitry Chagin print_number(ip, narg, c); 159*4d496ab4SDmitry Chagin print_number(ip, narg, c); 160*4d496ab4SDmitry Chagin break; 161*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 162*4d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 163*4d496ab4SDmitry Chagin #endif 164*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 165*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 166*4d496ab4SDmitry Chagin #endif 167*4d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 168*4d496ab4SDmitry Chagin print_number(ip, narg, c); 169*4d496ab4SDmitry Chagin print_number(ip, narg, c); 170*4d496ab4SDmitry Chagin break; 171*4d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 172*4d496ab4SDmitry Chagin print_number(ip, narg, c); 173*4d496ab4SDmitry 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; 213*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_open 214*4d496ab4SDmitry Chagin case LINUX_SYS_linux_open: 215*4d496ab4SDmitry Chagin #endif 216*4d496ab4SDmitry Chagin case LINUX_SYS_linux_openat: 217*4d496ab4SDmitry Chagin print_number(ip, narg, c); 218*4d496ab4SDmitry Chagin putchar(','); 219*4d496ab4SDmitry Chagin print_mask_arg(sysdecode_linux_open_flags, ip[0]); 220*4d496ab4SDmitry Chagin if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) { 221*4d496ab4SDmitry Chagin putchar(','); 222*4d496ab4SDmitry Chagin decode_filemode(ip[1]); 223*4d496ab4SDmitry Chagin } 224*4d496ab4SDmitry Chagin ip += 2; 225*4d496ab4SDmitry Chagin narg -= 2; 226*4d496ab4SDmitry 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 } 258*4d496ab4SDmitry Chagin switch (ktr->ktr_code) { 259*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchownat: 260*4d496ab4SDmitry Chagin case LINUX_SYS_linux_faccessat: 261*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fchmodat: 262*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_newfstatat 263*4d496ab4SDmitry Chagin case LINUX_SYS_linux_newfstatat: 264*4d496ab4SDmitry Chagin #endif 265*4d496ab4SDmitry Chagin #ifdef LINUX_SYS_linux_fstatat64 266*4d496ab4SDmitry Chagin case LINUX_SYS_linux_fstatat64: 267*4d496ab4SDmitry Chagin #endif 268*4d496ab4SDmitry Chagin case LINUX_SYS_linux_linkat: 269*4d496ab4SDmitry Chagin case LINUX_SYS_linux_unlinkat: 270*4d496ab4SDmitry Chagin case LINUX_SYS_linux_utimensat: 271*4d496ab4SDmitry Chagin putchar(','); 272*4d496ab4SDmitry Chagin print_mask_arg0(sysdecode_linux_atflags, *ip); 273*4d496ab4SDmitry Chagin ip++; 274*4d496ab4SDmitry Chagin narg--; 275*4d496ab4SDmitry Chagin break; 276*4d496ab4SDmitry 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) { 297*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 298*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 299*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 300*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 301*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_futimesat: 302*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 303*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdirat: 304*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_mknodat: 305*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_openat: 306*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_readlinkat: 307*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_renameat: 308*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 309*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 310*4d496ab4SDmitry Chagin putchar('('); 311*4d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 312*4d496ab4SDmitry Chagin c = ','; 313*4d496ab4SDmitry Chagin ip++; 314*4d496ab4SDmitry Chagin narg--; 315*4d496ab4SDmitry Chagin break; 316*4d496ab4SDmitry Chagin } 317*4d496ab4SDmitry Chagin switch (ktr->ktr_code) { 318*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_access: 319*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 320*4d496ab4SDmitry Chagin print_number(ip, narg, c); 321*4d496ab4SDmitry Chagin putchar(','); 322*4d496ab4SDmitry Chagin print_mask_arg(sysdecode_access_mode, *ip); 323*4d496ab4SDmitry Chagin ip++; 324*4d496ab4SDmitry Chagin narg--; 325*4d496ab4SDmitry Chagin break; 326*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_chmod: 327*4d496ab4SDmitry Chagin case LINUX32_SYS_fchmod: 328*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 329*4d496ab4SDmitry Chagin print_number(ip, narg, c); 330*4d496ab4SDmitry Chagin putchar(','); 331*4d496ab4SDmitry Chagin decode_filemode(*ip); 332*4d496ab4SDmitry Chagin ip++; 333*4d496ab4SDmitry Chagin narg--; 334*4d496ab4SDmitry Chagin break; 335*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_mknodat: 336*4d496ab4SDmitry Chagin print_number(ip, narg, c); 337*4d496ab4SDmitry Chagin putchar(','); 338*4d496ab4SDmitry Chagin decode_filemode(*ip); 339*4d496ab4SDmitry Chagin ip++; 340*4d496ab4SDmitry Chagin narg--; 341*4d496ab4SDmitry Chagin break; 342*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdir: 343*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_mkdirat: 344*4d496ab4SDmitry Chagin print_number(ip, narg, c); 345*4d496ab4SDmitry Chagin putchar(','); 346*4d496ab4SDmitry Chagin decode_filemode(*ip); 347*4d496ab4SDmitry Chagin ip++; 348*4d496ab4SDmitry Chagin narg--; 349*4d496ab4SDmitry Chagin break; 350*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 351*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_renameat: 352*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_symlinkat: 353*4d496ab4SDmitry Chagin print_number(ip, narg, c); 354*4d496ab4SDmitry Chagin putchar(','); 355*4d496ab4SDmitry Chagin print_integer_arg_valid(sysdecode_atfd, *ip); 356*4d496ab4SDmitry Chagin ip++; 357*4d496ab4SDmitry Chagin narg--; 358*4d496ab4SDmitry Chagin print_number(ip, narg, c); 359*4d496ab4SDmitry Chagin break; 360*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 361*4d496ab4SDmitry Chagin print_number(ip, narg, c); 362*4d496ab4SDmitry Chagin print_number(ip, narg, c); 363*4d496ab4SDmitry Chagin print_number(ip, narg, c); 364*4d496ab4SDmitry Chagin break; 365*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 366*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 367*4d496ab4SDmitry Chagin print_number(ip, narg, c); 368*4d496ab4SDmitry Chagin print_number(ip, narg, c); 369*4d496ab4SDmitry Chagin break; 370*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 371*4d496ab4SDmitry Chagin print_number(ip, narg, c); 372*4d496ab4SDmitry 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; 415*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_open: 416*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_openat: 417*4d496ab4SDmitry Chagin print_number(ip, narg, c); 418*4d496ab4SDmitry Chagin putchar(','); 419*4d496ab4SDmitry Chagin print_mask_arg(sysdecode_linux_open_flags, ip[0]); 420*4d496ab4SDmitry Chagin if ((ip[0] & LINUX_O_CREAT) == LINUX_O_CREAT) { 421*4d496ab4SDmitry Chagin putchar(','); 422*4d496ab4SDmitry Chagin decode_filemode(ip[1]); 423*4d496ab4SDmitry Chagin } 424*4d496ab4SDmitry Chagin ip += 2; 425*4d496ab4SDmitry Chagin narg -= 2; 426*4d496ab4SDmitry 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 } 458*4d496ab4SDmitry Chagin switch (ktr->ktr_code) { 459*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchownat: 460*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_faccessat: 461*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fchmodat: 462*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_fstatat64: 463*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_linkat: 464*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_unlinkat: 465*4d496ab4SDmitry Chagin case LINUX32_SYS_linux_utimensat: 466*4d496ab4SDmitry Chagin putchar(','); 467*4d496ab4SDmitry Chagin print_mask_arg0(sysdecode_linux_atflags, *ip); 468*4d496ab4SDmitry Chagin ip++; 469*4d496ab4SDmitry Chagin narg--; 470*4d496ab4SDmitry Chagin break; 471*4d496ab4SDmitry 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