From 1c5e9467f56bc00b257004eaac49ab8bd074f8d4 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 17 Nov 2021 04:33:47 -0600 Subject: [PATCH] Add support for more targets. --- toys/pending/strace.c | 105 +++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/toys/pending/strace.c b/toys/pending/strace.c index 16871e5b..b1cc7323 100644 --- a/toys/pending/strace.c +++ b/toys/pending/strace.c @@ -1,6 +1,8 @@ /* strace.c - Trace system calls. * * Copyright 2020 The Android Open Source Project + * + * See https://man7.org/linux/man-pages/man2/syscall.2.html USE_STRACE(NEWTOY(strace, "^p#s#v", TOYFLAG_USR|TOYFLAG_SBIN)) @@ -24,41 +26,40 @@ config STRACE #include "toys.h" GLOBALS( - long s; - long p; + long s, p; - // 216 for x86-64. - char regs_buf[256]; + char ioctl[32], *fmt; + long regs[256/sizeof(long)], syscall; pid_t pid; - char *fmt; - char ioctl[32]; int arg; ) struct user_regs_struct regs; -#if defined(__x86_64__) -#define REGS ((struct user_regs_struct *) &TT.regs_buf) -#define REG_SYSCALL REGS->orig_rax -#define REG_ARG0 REGS->rdi -#define REG_ARG1 REGS->rsi -#define REG_ARG2 REGS->rdx -#define REG_ARG3 REGS->r10 -#define REG_ARG4 REGS->r8 -#define REG_ARG5 REGS->r9 -#define REG_RESULT REGS->rax + +// Syscall args from https://man7.org/linux/man-pages/man2/syscall.2.html +// REG_ORDER is args 0-6, SYSCALL, RESULT +#if defined(__ARM_EABI__) +static const char REG_ORDER[] = {0,1,2,3,4,5,7,0}; +#elif defined(__ARM_ARCH) && __ARM_ARCH == 8 +static const char REG_ORDER[] = {0,1,2,3,4,5,8,0}; #elif defined(__i386__) -#define REGS ((struct user_regs_struct *) &TT.regs_buf) -#define REG_SYSCALL REGS->orig_eax -#define REG_ARG0 REGS->ebx -#define REG_ARG1 REGS->ecx -#define REG_ARG2 REGS->edx -#define REG_ARG3 REGS->esi -#define REG_ARG4 REGS->edi -#define REG_ARG5 REGS->ebp -#define REG_RESULT REGS->eax +// ebx,ecx,edx,esi,edi,ebp,orig_eax,eax +static const char REG_ORDER[] = {0,1,2,3,4,5,11,6}; +#elif defined(__m68k__) +// d1,d2,d3,d4,d5,a0,orig_d0,d0 +static const char REG_ORDER[] = {0,1,2,3,4,7,16,14); +#elif defined(__PPC__) || defined(__PPC64__) +static const char REG_ORDER[] = {3,4,5,6,7,8,0,3}; +#elif defined(__s390__) // also covers s390x +// r2,r3,r4,r5,r6,r7,r1,r2 but mask+addr before r0 so +2 +static const char REG_ORDER[] = {4,5,6,7,8,9,3,4}; +#elif defined(__sh__) +static const char REG_ORDER[] = {4,5,6,7,0,1,3,0}; +#elif defined(__x86_64__) +// rdi,rsi,rdx,r10,r8,r9,orig_rax,rax +static const char REG_ORDER[] = {14,13,12,7,9,8,15,10}; #else -// TODO: arm/arm64 #error unsupported architecture #endif @@ -169,29 +170,17 @@ static void xptrace(int req, pid_t pid, void *addr, void *data) static void get_regs() { - xptrace(PTRACE_GETREGS, TT.pid, 0, &TT.regs_buf); -} - -static long get_arg() -{ - switch (TT.arg) { - case 0: return REG_ARG0; - case 1: return REG_ARG1; - case 2: return REG_ARG2; - case 3: return REG_ARG3; - case 4: return REG_ARG4; - case 5: return REG_ARG5; - default: error_exit("no arg %d", TT.arg); - } + xptrace(PTRACE_GETREGS, TT.pid, 0, TT.regs); } -static void ptrace_struct(long addr, void* dst, size_t bytes) +static void ptrace_struct(long addr, void *dst, size_t bytes) { int offset = 0, i; + long v; for (i=0; i= -4095UL) + fprintf(stderr, "-1 %s (%s)", strerrno(-result), strerror(-result)); + else if (TT.syscall==__NR_mmap || TT.syscall==__NR_brk) print_ptr(result); + else fprintf(stderr, "%ld", result); fputc('\n', stderr); } -- 2.39.2