1*8a0f6d8cSDmitry Chagin /*- 2*8a0f6d8cSDmitry Chagin * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*8a0f6d8cSDmitry Chagin * 4*8a0f6d8cSDmitry Chagin * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org> 5*8a0f6d8cSDmitry Chagin * 6*8a0f6d8cSDmitry Chagin * Redistribution and use in source and binary forms, with or without 7*8a0f6d8cSDmitry Chagin * modification, are permitted provided that the following conditions 8*8a0f6d8cSDmitry Chagin * are met: 9*8a0f6d8cSDmitry Chagin * 1. Redistributions of source code must retain the above copyright 10*8a0f6d8cSDmitry Chagin * notice, this list of conditions and the following disclaimer. 11*8a0f6d8cSDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 12*8a0f6d8cSDmitry Chagin * notice, this list of conditions and the following disclaimer in the 13*8a0f6d8cSDmitry Chagin * documentation and/or other materials provided with the distribution. 14*8a0f6d8cSDmitry Chagin * 15*8a0f6d8cSDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*8a0f6d8cSDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*8a0f6d8cSDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*8a0f6d8cSDmitry Chagin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*8a0f6d8cSDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*8a0f6d8cSDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*8a0f6d8cSDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*8a0f6d8cSDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*8a0f6d8cSDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*8a0f6d8cSDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*8a0f6d8cSDmitry Chagin * SUCH DAMAGE. 26*8a0f6d8cSDmitry Chagin */ 27*8a0f6d8cSDmitry Chagin 28*8a0f6d8cSDmitry Chagin #include <sys/cdefs.h> 29*8a0f6d8cSDmitry Chagin __FBSDID("$FreeBSD$"); 30*8a0f6d8cSDmitry Chagin 31*8a0f6d8cSDmitry Chagin #include <sys/param.h> 32*8a0f6d8cSDmitry Chagin #include <sys/uio.h> 33*8a0f6d8cSDmitry Chagin #include <sys/ktrace.h> 34*8a0f6d8cSDmitry Chagin #include <stddef.h> 35*8a0f6d8cSDmitry Chagin #include <sysdecode.h> 36*8a0f6d8cSDmitry Chagin 37*8a0f6d8cSDmitry Chagin #include "kdump.h" 38*8a0f6d8cSDmitry Chagin 39*8a0f6d8cSDmitry Chagin #ifdef __amd64__ 40*8a0f6d8cSDmitry Chagin #include <amd64/linux/linux_syscall.h> 41*8a0f6d8cSDmitry Chagin #include <amd64/linux32/linux32_syscall.h> 42*8a0f6d8cSDmitry Chagin #elif __aarch64__ 43*8a0f6d8cSDmitry Chagin #include <arm64/linux/linux_syscall.h> 44*8a0f6d8cSDmitry Chagin #elif __i386__ 45*8a0f6d8cSDmitry Chagin #include <i386/linux/linux_syscall.h> 46*8a0f6d8cSDmitry Chagin #endif 47*8a0f6d8cSDmitry Chagin 48*8a0f6d8cSDmitry Chagin static void 49*8a0f6d8cSDmitry Chagin print_linux_signal(int signo) 50*8a0f6d8cSDmitry Chagin { 51*8a0f6d8cSDmitry Chagin const char *signame; 52*8a0f6d8cSDmitry Chagin 53*8a0f6d8cSDmitry Chagin signame = sysdecode_linux_signal(signo); 54*8a0f6d8cSDmitry Chagin if (signame != NULL) 55*8a0f6d8cSDmitry Chagin printf("%s", signame); 56*8a0f6d8cSDmitry Chagin else 57*8a0f6d8cSDmitry Chagin printf("SIG %d", signo); 58*8a0f6d8cSDmitry Chagin } 59*8a0f6d8cSDmitry Chagin 60*8a0f6d8cSDmitry Chagin void 61*8a0f6d8cSDmitry Chagin ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip, 62*8a0f6d8cSDmitry Chagin int *resnarg, char *resc) 63*8a0f6d8cSDmitry Chagin { 64*8a0f6d8cSDmitry Chagin int narg = ktr->ktr_narg; 65*8a0f6d8cSDmitry Chagin register_t *ip, *first; 66*8a0f6d8cSDmitry Chagin int quad_align, quad_slots; 67*8a0f6d8cSDmitry Chagin char c; 68*8a0f6d8cSDmitry Chagin 69*8a0f6d8cSDmitry Chagin ip = first = &ktr->ktr_args[0]; 70*8a0f6d8cSDmitry Chagin c = *resc; 71*8a0f6d8cSDmitry Chagin quad_align = 0; 72*8a0f6d8cSDmitry Chagin quad_slots = 1; 73*8a0f6d8cSDmitry Chagin switch (ktr->ktr_code) { 74*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_gettime: 75*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_settime: 76*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_clock_getres: 77*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_timer_create: 78*8a0f6d8cSDmitry Chagin putchar('('); 79*8a0f6d8cSDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 80*8a0f6d8cSDmitry Chagin c = ','; 81*8a0f6d8cSDmitry Chagin ip++; 82*8a0f6d8cSDmitry Chagin narg--; 83*8a0f6d8cSDmitry Chagin break; 84*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_kill: 85*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_tkill: 86*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_sigqueueinfo: 87*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 88*8a0f6d8cSDmitry Chagin putchar(','); 89*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 90*8a0f6d8cSDmitry Chagin ip++; 91*8a0f6d8cSDmitry Chagin narg--; 92*8a0f6d8cSDmitry Chagin break; 93*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_tgkill: 94*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_tgsigqueueinfo: 95*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 96*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 97*8a0f6d8cSDmitry Chagin putchar(','); 98*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 99*8a0f6d8cSDmitry Chagin ip++; 100*8a0f6d8cSDmitry Chagin narg--; 101*8a0f6d8cSDmitry Chagin break; 102*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_rt_sigaction: 103*8a0f6d8cSDmitry Chagin putchar('('); 104*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 105*8a0f6d8cSDmitry Chagin ip++; 106*8a0f6d8cSDmitry Chagin narg--; 107*8a0f6d8cSDmitry Chagin c = ','; 108*8a0f6d8cSDmitry Chagin break; 109*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_ftruncate: 110*8a0f6d8cSDmitry Chagin case LINUX_SYS_linux_truncate: 111*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 112*8a0f6d8cSDmitry Chagin print_number64(first, ip, narg, c); 113*8a0f6d8cSDmitry Chagin break; 114*8a0f6d8cSDmitry Chagin } 115*8a0f6d8cSDmitry Chagin *resc = c; 116*8a0f6d8cSDmitry Chagin *resip = ip; 117*8a0f6d8cSDmitry Chagin *resnarg = narg; 118*8a0f6d8cSDmitry Chagin } 119*8a0f6d8cSDmitry Chagin 120*8a0f6d8cSDmitry Chagin #if defined(__amd64__) 121*8a0f6d8cSDmitry Chagin void 122*8a0f6d8cSDmitry Chagin ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip, 123*8a0f6d8cSDmitry Chagin int *resnarg, char *resc) 124*8a0f6d8cSDmitry Chagin { 125*8a0f6d8cSDmitry Chagin int narg = ktr->ktr_narg; 126*8a0f6d8cSDmitry Chagin register_t *ip, *first; 127*8a0f6d8cSDmitry Chagin int quad_align, quad_slots; 128*8a0f6d8cSDmitry Chagin char c; 129*8a0f6d8cSDmitry Chagin 130*8a0f6d8cSDmitry Chagin ip = first = &ktr->ktr_args[0]; 131*8a0f6d8cSDmitry Chagin c = *resc; 132*8a0f6d8cSDmitry Chagin quad_align = 0; 133*8a0f6d8cSDmitry Chagin quad_slots = 2; 134*8a0f6d8cSDmitry Chagin switch (ktr->ktr_code) { 135*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_gettime: 136*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_settime: 137*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_getres: 138*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_timer_create: 139*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_gettime64: 140*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_settime64: 141*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_clock_getres_time64: 142*8a0f6d8cSDmitry Chagin putchar('('); 143*8a0f6d8cSDmitry Chagin sysdecode_linux_clockid(stdout, *ip); 144*8a0f6d8cSDmitry Chagin c = ','; 145*8a0f6d8cSDmitry Chagin ip++; 146*8a0f6d8cSDmitry Chagin narg--; 147*8a0f6d8cSDmitry Chagin break; 148*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_kill: 149*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_tkill: 150*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_sigqueueinfo: 151*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 152*8a0f6d8cSDmitry Chagin putchar(','); 153*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 154*8a0f6d8cSDmitry Chagin ip++; 155*8a0f6d8cSDmitry Chagin narg--; 156*8a0f6d8cSDmitry Chagin break; 157*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_tgkill: 158*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_tgsigqueueinfo: 159*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 160*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 161*8a0f6d8cSDmitry Chagin putchar(','); 162*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 163*8a0f6d8cSDmitry Chagin ip++; 164*8a0f6d8cSDmitry Chagin narg--; 165*8a0f6d8cSDmitry Chagin break; 166*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_signal: 167*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_sigaction: 168*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_rt_sigaction: 169*8a0f6d8cSDmitry Chagin putchar('('); 170*8a0f6d8cSDmitry Chagin print_linux_signal(*ip); 171*8a0f6d8cSDmitry Chagin ip++; 172*8a0f6d8cSDmitry Chagin narg--; 173*8a0f6d8cSDmitry Chagin c = ','; 174*8a0f6d8cSDmitry Chagin break; 175*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_ftruncate: 176*8a0f6d8cSDmitry Chagin case LINUX32_SYS_linux_truncate: 177*8a0f6d8cSDmitry Chagin print_number(ip, narg, c); 178*8a0f6d8cSDmitry Chagin print_number64(first, ip, narg, c); 179*8a0f6d8cSDmitry Chagin break; 180*8a0f6d8cSDmitry Chagin } 181*8a0f6d8cSDmitry Chagin *resc = c; 182*8a0f6d8cSDmitry Chagin *resip = ip; 183*8a0f6d8cSDmitry Chagin *resnarg = narg; 184*8a0f6d8cSDmitry Chagin } 185*8a0f6d8cSDmitry Chagin #endif /* __amd64__ */ 186