Rizin
unix-like reverse engineering framework and cli tools
emit_trace.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2011 pancake <pancake@nopcode.org>
2 // SPDX-License-Identifier: LGPL-3.0-only
3 
4 #include <rz_egg.h>
5 #define attsyntax 0
6 
7 #define EMIT_NAME emit_trace
8 #define RZ_ARCH "trace"
9 #define RZ_SZ 8
10 #define RZ_SP "sp"
11 #define RZ_BP "bp"
12 #define RZ_AX "a0"
13 #define RZ_GP \
14  { "a0", "a1", "a2", "a3", "a4" }
15 #define RZ_TMP "t0"
16 #define RZ_NGP 5
17 
18 // no attsyntax for arm
19 static char *regs[] = RZ_GP;
20 
21 static void emit_init(RzEgg *egg) {
22  /* TODO */
23 }
24 
25 static char *emit_syscall(RzEgg *egg, int num) {
26  char buf[32];
27  snprintf(buf, sizeof(buf), "syscall (%d)\n", num);
28  return strdup(buf);
29 }
30 
31 static void emit_frame(RzEgg *egg, int sz) {
32  rz_egg_printf(egg, "frame (%d)\n", sz);
33 }
34 
35 static void emit_frame_end(RzEgg *egg, int sz, int ctx) {
36  rz_egg_printf(egg, "frame_end (%d, %d)\n", sz, ctx);
37 }
38 
39 static void emit_comment(RzEgg *egg, const char *fmt, ...) {
40  va_list ap;
41  char buf[1024];
42  va_start(ap, fmt);
43  vsnprintf(buf, sizeof(buf), fmt, ap);
44  rz_egg_printf(egg, "# %s\n", buf);
45  va_end(ap);
46 }
47 
48 static void emit_equ(RzEgg *egg, const char *key, const char *value) {
49  rz_egg_printf(egg, "equ (%s, %s)\n", key, value);
50 }
51 
52 static void emit_syscall_args(RzEgg *egg, int nargs) {
53  rz_egg_printf(egg, "syscall_args (%d)\n", nargs);
54 }
55 
56 static void emit_set_string(RzEgg *egg, const char *dstvar, const char *str, int j) {
57  // what is j?
58  rz_egg_printf(egg, "set (\"%s\", \"%s\", %d)\n", dstvar, str, j);
59 }
60 
61 static void emit_call(RzEgg *egg, const char *str, int atr) {
62  if (atr) {
63  rz_egg_printf(egg, "call ([%s])\n", str);
64  } else {
65  rz_egg_printf(egg, "call (%s)\n", str);
66  }
67 }
68 
69 static void emit_jmp(RzEgg *egg, const char *str, int atr) {
70  if (atr) {
71  rz_egg_printf(egg, "goto ([%s])\n", str);
72  } else {
73  rz_egg_printf(egg, "goto (%s)\n", str);
74  }
75 }
76 
77 static void emit_arg(RzEgg *egg, int xs, int num, const char *str) {
78  // TODO: enhance output here
79  rz_egg_printf(egg, "arg.%d.%d=%s\n", xs, num, str);
80 }
81 
82 static void emit_get_result(RzEgg *egg, const char *ocn) {
83  rz_egg_printf(egg, "get_result (%s)\n", ocn);
84 }
85 
86 static void emit_restore_stack(RzEgg *egg, int size) {
87  rz_egg_printf(egg, "restore_stack (%d)\n", size);
88  // XXX: must die.. or add emit_store_stack. not needed by ARM
89  // rz_egg_printf (egg, " add sp, %d\n", size);
90 }
91 
92 static void emit_get_while_end(RzEgg *egg, char *str, const char *ctxpush, const char *label) {
93  rz_egg_printf(egg, "get_while_end (%s, %s, %s)\n", str, ctxpush, label);
94 }
95 
96 static void emit_while_end(RzEgg *egg, const char *labelback) {
97  rz_egg_printf(egg, "while_end (%s)\n", labelback);
98 }
99 
100 static void emit_get_var(RzEgg *egg, int type, char *out, int idx) {
101  switch (type) {
102  case 0: sprintf(out, "fp,$%d", -idx); break; /* variable */
103  case 1: sprintf(out, "sp,$%d", idx); break; /* argument */ // XXX: MUST BE r0, r1, r2, ..
104  }
105 }
106 
107 static void emit_trap(RzEgg *egg) {
108  rz_egg_printf(egg, "trap\n");
109 }
110 
111 // TODO atoi here?
112 static void emit_load_ptr(RzEgg *egg, const char *dst) {
113  rz_egg_printf(egg, "loadptr (%s)\n", dst);
114 }
115 
116 static void emit_branch(RzEgg *egg, char *b, char *g, char *e, char *n, int sz, const char *dst) {
117  // This function signature is bad
118  char *p, str[64];
119  char *arg = NULL;
120  char *op = "beq";
121  /* NOTE that jb/ja are inverted to fit cmp opcode */
122  if (b) {
123  *b = '\0';
124  op = e ? "bge" : "bgt";
125  arg = b + 1;
126  } else if (g) {
127  *g = '\0';
128  op = e ? "ble" : "blt";
129  arg = g + 1;
130  }
131  if (!arg) {
132  if (e) {
133  arg = e + 1;
134  op = "bne";
135  } else {
136  arg = "0";
137  op = n ? "bne" : "beq";
138  }
139  }
140 
141  if (*arg == '=') {
142  arg++; /* for <=, >=, ... */
143  }
144  p = rz_egg_mkvar(egg, str, arg, 0);
145  rz_egg_printf(egg, "%s (%s) => (%s)\n", op, p, dst);
146  free(p);
147 }
148 
149 // XXX: sz must be char
150 static void emit_load(RzEgg *egg, const char *dst, int sz) {
151  rz_egg_printf(egg, "load (\"%s\", %c)\n", dst, sz);
152 }
153 
154 static void emit_mathop(RzEgg *egg, int ch, int vs, int type, const char *eq, const char *p) {
155  char *op;
156  switch (ch) {
157  case '^': op = "eor"; break;
158  case '&': op = "and"; break;
159  case '|': op = "orr"; break;
160  case '-': op = "sub"; break;
161  case '+': op = "add"; break;
162  case '*': op = "mul"; break;
163  case '/': op = "div"; break;
164  default: op = "mov"; break;
165  }
166  if (!eq) {
167  eq = RZ_AX;
168  }
169  if (!p) {
170  p = RZ_AX;
171  }
172 #if 0
173  // TODO:
174  eprintf ("TYPE = %c\n", type);
175  eprintf (" %s%c %c%s, %s\n", op, vs, type, eq, p);
176  eprintf (" %s %s, [%s]\n", op, p, eq);
177 #endif
178  if (type == '*') {
179  rz_egg_printf(egg, "%s (%s, [%s])\n", op, p, eq);
180  } else {
181  rz_egg_printf(egg, "%s (%s, %s)\n", op, p, eq);
182  }
183 }
184 
185 static const char *emit_regs(RzEgg *egg, int idx) {
186  return regs[idx % RZ_NGP];
187 }
188 
190  .retvar = "a0",
191  .arch = RZ_ARCH,
192  .size = RZ_SZ,
193  .jmp = emit_jmp,
194  .call = emit_call,
195  .init = emit_init,
196  .equ = emit_equ,
197  .regs = emit_regs,
198  //.sc = emit_sc,
199  .trap = emit_trap,
200  .frame = emit_frame,
201  .frame_end = emit_frame_end,
202  .comment = emit_comment,
203  .push_arg = emit_arg,
204  .restore_stack = emit_restore_stack,
205  .get_result = emit_get_result,
206  .syscall_args = emit_syscall_args,
207  .set_string = emit_set_string,
208  .get_var = emit_get_var,
209  .while_end = emit_while_end,
210  .get_while_end = emit_get_while_end,
211  .branch = emit_branch,
212  .load = emit_load,
213  .load_ptr = emit_load_ptr,
214  .mathop = emit_mathop,
215  .syscall = emit_syscall,
216 };
ut8 op
Definition: 6502dis.c:13
#define e(frag)
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
static int value
Definition: cmd_api.c:93
#define NULL
Definition: cris-opc.c:27
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len key
Definition: sflib.h:118
RZ_API void rz_egg_printf(RzEgg *egg, const char *fmt,...)
Definition: egg.c:336
RZ_API char * rz_egg_mkvar(RzEgg *egg, char *out, const char *_str, int delta)
Definition: egg_lang.c:538
static void emit_comment(RzEgg *egg, const char *fmt,...)
Definition: emit_trace.c:39
static void emit_branch(RzEgg *egg, char *b, char *g, char *e, char *n, int sz, const char *dst)
Definition: emit_trace.c:116
static void emit_jmp(RzEgg *egg, const char *str, int atr)
Definition: emit_trace.c:69
#define EMIT_NAME
Definition: emit_trace.c:7
static void emit_call(RzEgg *egg, const char *str, int atr)
Definition: emit_trace.c:61
#define RZ_AX
Definition: emit_trace.c:12
#define RZ_ARCH
Definition: emit_trace.c:8
#define RZ_SZ
Definition: emit_trace.c:9
static void emit_init(RzEgg *egg)
Definition: emit_trace.c:21
static char * regs[]
Definition: emit_trace.c:19
static char * emit_syscall(RzEgg *egg, int num)
Definition: emit_trace.c:25
static void emit_frame_end(RzEgg *egg, int sz, int ctx)
Definition: emit_trace.c:35
static void emit_get_while_end(RzEgg *egg, char *str, const char *ctxpush, const char *label)
Definition: emit_trace.c:92
static void emit_trap(RzEgg *egg)
Definition: emit_trace.c:107
static void emit_restore_stack(RzEgg *egg, int size)
Definition: emit_trace.c:86
static void emit_while_end(RzEgg *egg, const char *labelback)
Definition: emit_trace.c:96
static void emit_get_var(RzEgg *egg, int type, char *out, int idx)
Definition: emit_trace.c:100
static void emit_load(RzEgg *egg, const char *dst, int sz)
Definition: emit_trace.c:150
#define RZ_GP
Definition: emit_trace.c:13
#define RZ_NGP
Definition: emit_trace.c:16
static const char * emit_regs(RzEgg *egg, int idx)
Definition: emit_trace.c:185
static void emit_arg(RzEgg *egg, int xs, int num, const char *str)
Definition: emit_trace.c:77
static void emit_mathop(RzEgg *egg, int ch, int vs, int type, const char *eq, const char *p)
Definition: emit_trace.c:154
static void emit_syscall_args(RzEgg *egg, int nargs)
Definition: emit_trace.c:52
static void emit_get_result(RzEgg *egg, const char *ocn)
Definition: emit_trace.c:82
static void emit_set_string(RzEgg *egg, const char *dstvar, const char *str, int j)
Definition: emit_trace.c:56
static void emit_frame(RzEgg *egg, int sz)
Definition: emit_trace.c:31
static void emit_load_ptr(RzEgg *egg, const char *dst)
Definition: emit_trace.c:112
static void emit_equ(RzEgg *egg, const char *key, const char *value)
Definition: emit_trace.c:48
struct @667 g
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
voidpf void uLong size
Definition: ioapi.h:138
voidpf void * buf
Definition: ioapi.h:138
snprintf
Definition: kernel.h:364
sprintf
Definition: kernel.h:365
vsnprintf
Definition: kernel.h:366
void * p
Definition: libc.cpp:67
static static fork const void static count static fd const char const char static newpath char char char static envp time_t static t const char static mode static whence const char static dir time_t static t unsigned static seconds const char struct utimbuf static buf static inc static sig const char static mode static oldfd struct tms static buf static getgid static geteuid const char static filename static arg static mask struct ustat static ubuf static getppid static setsid static egid sigset_t static set struct timeval struct timezone static tz fd_set fd_set fd_set struct timeval static timeout const char char static bufsiz const char static swapflags void static offset const char static length static mode static who const char struct statfs static buf unsigned unsigned num
Definition: sflib.h:126
return strdup("=SP r13\n" "=LR r14\n" "=PC r15\n" "=A0 r0\n" "=A1 r1\n" "=A2 r2\n" "=A3 r3\n" "=ZF zf\n" "=SF nf\n" "=OF vf\n" "=CF cf\n" "=SN or0\n" "gpr lr .32 56 0\n" "gpr pc .32 60 0\n" "gpr cpsr .32 64 0 ____tfiae_________________qvczn\n" "gpr or0 .32 68 0\n" "gpr tf .1 64.5 0 thumb\n" "gpr ef .1 64.9 0 endian\n" "gpr jf .1 64.24 0 java\n" "gpr qf .1 64.27 0 sticky_overflow\n" "gpr vf .1 64.28 0 overflow\n" "gpr cf .1 64.29 0 carry\n" "gpr zf .1 64.30 0 zero\n" "gpr nf .1 64.31 0 negative\n" "gpr itc .4 64.10 0 if_then_count\n" "gpr gef .4 64.16 0 great_or_equal\n" "gpr r0 .32 0 0\n" "gpr r1 .32 4 0\n" "gpr r2 .32 8 0\n" "gpr r3 .32 12 0\n" "gpr r4 .32 16 0\n" "gpr r5 .32 20 0\n" "gpr r6 .32 24 0\n" "gpr r7 .32 28 0\n" "gpr r8 .32 32 0\n" "gpr r9 .32 36 0\n" "gpr r10 .32 40 0\n" "gpr r11 .32 44 0\n" "gpr r12 .32 48 0\n" "gpr r13 .32 52 0\n" "gpr r14 .32 56 0\n" "gpr r15 .32 60 0\n" "gpr r16 .32 64 0\n" "gpr r17 .32 68 0\n")
char * dst
Definition: lz4.h:724
int n
Definition: mipsasm.c:19
int type
Definition: mipsasm.c:17
int idx
Definition: setup.py:197
#define eprintf(x, y...)
Definition: rlcc.c:7
#define b(i)
Definition: sha256.c:42
Definition: dis.h:35
Definition: dis.c:32