1f08c3bdfSopenharmony_ci/* 2f08c3bdfSopenharmony_ci * simple example ptrace() code to help build basis for other tests 3f08c3bdfSopenharmony_ci * 4f08c3bdfSopenharmony_ci * Copyright (c) 2009 Analog Devices Inc. 5f08c3bdfSopenharmony_ci * 6f08c3bdfSopenharmony_ci * Licensed under the GPL-2 or later 7f08c3bdfSopenharmony_ci */ 8f08c3bdfSopenharmony_ci 9f08c3bdfSopenharmony_ci#define _GNU_SOURCE 10f08c3bdfSopenharmony_ci 11f08c3bdfSopenharmony_ci#include <config.h> 12f08c3bdfSopenharmony_ci 13f08c3bdfSopenharmony_ci#include <errno.h> 14f08c3bdfSopenharmony_ci#include <stdbool.h> 15f08c3bdfSopenharmony_ci#include <stdio.h> 16f08c3bdfSopenharmony_ci#include <stdlib.h> 17f08c3bdfSopenharmony_ci#include <unistd.h> 18f08c3bdfSopenharmony_ci#include <sys/ptrace.h> 19f08c3bdfSopenharmony_ci#include <sys/syscall.h> 20f08c3bdfSopenharmony_ci#include "ptrace.h" 21f08c3bdfSopenharmony_ci 22f08c3bdfSopenharmony_ci#include "test.h" 23f08c3bdfSopenharmony_ci#include "spawn_ptrace_child.h" 24f08c3bdfSopenharmony_ci 25f08c3bdfSopenharmony_ci#include "syscalls.h" 26f08c3bdfSopenharmony_ci 27f08c3bdfSopenharmony_cichar *TCID = "simple_tracer"; 28f08c3bdfSopenharmony_ciint TST_TOTAL = 0; 29f08c3bdfSopenharmony_ci 30f08c3bdfSopenharmony_ci#define _decode(name, val) \ 31f08c3bdfSopenharmony_ci({ \ 32f08c3bdfSopenharmony_ci if (sizeof(long) == 4) \ 33f08c3bdfSopenharmony_ci printf(name ":%08lx ", val); \ 34f08c3bdfSopenharmony_ci else if (sizeof(long) == 8) \ 35f08c3bdfSopenharmony_ci printf(name ":%016lx ", val); \ 36f08c3bdfSopenharmony_ci else \ 37f08c3bdfSopenharmony_ci printf(name ":%lx ", val); \ 38f08c3bdfSopenharmony_ci val; \ 39f08c3bdfSopenharmony_ci}) 40f08c3bdfSopenharmony_ci#define decode(reg) _decode(#reg, pt->reg) 41f08c3bdfSopenharmony_ci#define decode_user(name, offset) \ 42f08c3bdfSopenharmony_ci _decode(name, vptrace(PTRACE_PEEKUSER, pid, offset, NULL)); 43f08c3bdfSopenharmony_ci#define decode_sysnum(nr) printf("%s ", get_sysnum(nr)) 44f08c3bdfSopenharmony_cistatic void decode_regs(struct pt_regs *pt) 45f08c3bdfSopenharmony_ci{ 46f08c3bdfSopenharmony_ci#if defined(__bfin__) 47f08c3bdfSopenharmony_ci long nr = decode_user("orig_p0", PT_ORIG_P0); 48f08c3bdfSopenharmony_ci decode(p0); 49f08c3bdfSopenharmony_ci decode(r0); 50f08c3bdfSopenharmony_ci decode(r1); 51f08c3bdfSopenharmony_ci decode(r2); 52f08c3bdfSopenharmony_ci decode(r3); 53f08c3bdfSopenharmony_ci decode(r4); 54f08c3bdfSopenharmony_ci decode(r5); 55f08c3bdfSopenharmony_ci decode_sysnum(nr); 56f08c3bdfSopenharmony_ci puts(""); 57f08c3bdfSopenharmony_ci#elif defined(__i386__) 58f08c3bdfSopenharmony_ci long nr = decode_user("orig_eax", 4 * ORIG_EAX); 59f08c3bdfSopenharmony_ci decode(eax); 60f08c3bdfSopenharmony_ci decode(ebx); 61f08c3bdfSopenharmony_ci decode(ecx); 62f08c3bdfSopenharmony_ci decode(edx); 63f08c3bdfSopenharmony_ci decode(esi); 64f08c3bdfSopenharmony_ci decode(edi); 65f08c3bdfSopenharmony_ci decode(ebp); 66f08c3bdfSopenharmony_ci decode_sysnum(nr); 67f08c3bdfSopenharmony_ci puts(""); 68f08c3bdfSopenharmony_ci#elif defined(__x86_64__) 69f08c3bdfSopenharmony_ci long nr = decode_user("orig_rax", 8 * ORIG_RAX); 70f08c3bdfSopenharmony_ci decode(rax); 71f08c3bdfSopenharmony_ci decode(rbx); 72f08c3bdfSopenharmony_ci decode(rcx); 73f08c3bdfSopenharmony_ci decode(rdx); 74f08c3bdfSopenharmony_ci decode(rsi); 75f08c3bdfSopenharmony_ci decode(rdi); 76f08c3bdfSopenharmony_ci decode(rbp); 77f08c3bdfSopenharmony_ci decode_sysnum(nr); 78f08c3bdfSopenharmony_ci puts(""); 79f08c3bdfSopenharmony_ci#elif defined(__sparc__) 80f08c3bdfSopenharmony_ci#define G1 u_regs[0] 81f08c3bdfSopenharmony_ci#define G2 u_regs[1] 82f08c3bdfSopenharmony_ci#define G3 u_regs[2] 83f08c3bdfSopenharmony_ci#define G4 u_regs[3] 84f08c3bdfSopenharmony_ci#define G5 u_regs[4] 85f08c3bdfSopenharmony_ci#define G6 u_regs[5] 86f08c3bdfSopenharmony_ci#define G7 u_regs[6] 87f08c3bdfSopenharmony_ci#define O0 u_regs[7] 88f08c3bdfSopenharmony_ci#define O1 u_regs[8] 89f08c3bdfSopenharmony_ci#define O2 u_regs[9] 90f08c3bdfSopenharmony_ci#define O3 u_regs[10] 91f08c3bdfSopenharmony_ci#define O4 u_regs[11] 92f08c3bdfSopenharmony_ci#define O5 u_regs[12] 93f08c3bdfSopenharmony_ci#define O6 u_regs[13] 94f08c3bdfSopenharmony_ci#define O7 u_regs[14] 95f08c3bdfSopenharmony_ci decode(G1); 96f08c3bdfSopenharmony_ci decode(G2); 97f08c3bdfSopenharmony_ci decode(G3); 98f08c3bdfSopenharmony_ci decode(G4); 99f08c3bdfSopenharmony_ci decode(G5); 100f08c3bdfSopenharmony_ci decode(G6); 101f08c3bdfSopenharmony_ci decode(G7); 102f08c3bdfSopenharmony_ci decode(O0); 103f08c3bdfSopenharmony_ci decode(O1); 104f08c3bdfSopenharmony_ci decode(O2); 105f08c3bdfSopenharmony_ci decode(O3); 106f08c3bdfSopenharmony_ci decode(O4); 107f08c3bdfSopenharmony_ci decode(O5); 108f08c3bdfSopenharmony_ci decode(O6); 109f08c3bdfSopenharmony_ci decode(O7); 110f08c3bdfSopenharmony_ci decode_sysnum(pt->G1); 111f08c3bdfSopenharmony_ci puts(""); 112f08c3bdfSopenharmony_ci#else 113f08c3bdfSopenharmony_ci#warning "no idea how to decode your arch" 114f08c3bdfSopenharmony_ci puts("no idea how to decode your arch"); 115f08c3bdfSopenharmony_ci#endif 116f08c3bdfSopenharmony_ci} 117f08c3bdfSopenharmony_ci 118f08c3bdfSopenharmony_ciint main(int argc, char *argv[]) 119f08c3bdfSopenharmony_ci{ 120f08c3bdfSopenharmony_ci struct pt_regs pt_regs; 121f08c3bdfSopenharmony_ci long ret; 122f08c3bdfSopenharmony_ci int status; 123f08c3bdfSopenharmony_ci 124f08c3bdfSopenharmony_ci make_a_baby(argc, argv); 125f08c3bdfSopenharmony_ci 126f08c3bdfSopenharmony_ci while (1) { 127f08c3bdfSopenharmony_ci ret = vptrace(PTRACE_GETREGS, pid, NULL, &pt_regs); 128f08c3bdfSopenharmony_ci if (ret) 129f08c3bdfSopenharmony_ci break; 130f08c3bdfSopenharmony_ci decode_regs(&pt_regs); 131f08c3bdfSopenharmony_ci 132f08c3bdfSopenharmony_ci ret = vptrace(PTRACE_SYSCALL, pid, NULL, NULL); 133f08c3bdfSopenharmony_ci if (ret) 134f08c3bdfSopenharmony_ci break; 135f08c3bdfSopenharmony_ci 136f08c3bdfSopenharmony_ci if (waitpid(pid, &status, 0) == -1) 137f08c3bdfSopenharmony_ci break; 138f08c3bdfSopenharmony_ci } 139f08c3bdfSopenharmony_ci 140f08c3bdfSopenharmony_ci /* hopefully this worked */ 141f08c3bdfSopenharmony_ci vptrace(PTRACE_KILL, pid, NULL, NULL); 142f08c3bdfSopenharmony_ci 143f08c3bdfSopenharmony_ci tst_exit(); 144f08c3bdfSopenharmony_ci} 145