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