1 /* radare - LGPL - Copyright 2010-2020 pancake */
2 
3 #include <r_debug.h>
4 
r_debug_arg_get(RDebug * dbg,const char * cc,int num)5 R_API ut64 r_debug_arg_get(RDebug *dbg, const char *cc, int num) {
6 	r_return_val_if_fail (dbg, UT64_MAX);
7 	if (!cc) {
8 		cc = r_anal_syscc_default (dbg->anal);
9 	}
10 	if (dbg->anal) {
11 		if (!R_STR_ISEMPTY (cc)) {
12 			if (!strcmp (cc, "stdcall") || !strcmp (cc, "pascal")) {
13 				ut64 sp = r_debug_reg_get (dbg, "SP");
14 				if (dbg->bits == 64) {
15 					ut64 n64;
16 					sp += 8; // skip return address, assume we are inside the call
17 					sp += 8 * num;
18 					dbg->iob.read_at (dbg->iob.io, sp, (ut8*)&n64, sizeof(ut64));
19 					// TODO: honor endianness of platform
20 					return (ut64)n64;
21 				} else {
22 					sp += 4; // skip return address, assume we are inside the call
23 					sp += 4 * num;
24 					ut32 n32;
25 					dbg->iob.read_at (dbg->iob.io, sp, (ut8*)&n32, sizeof(ut32));
26 					// TODO: honor endianness of platform
27 					return (ut64)n32;
28 				}
29 			}
30 			const char *rn = r_anal_cc_arg (dbg->anal, cc, num);
31 			if (rn) {
32 				return r_debug_reg_get (dbg, rn);
33 			}
34 		}
35 	}
36 	char reg[32];
37 	snprintf (reg, sizeof (reg) - 1, "A%d", num);
38 	return r_debug_reg_get (dbg, reg);
39 }
40 
r_debug_arg_set(RDebug * dbg,const char * cc,int num,ut64 val)41 R_API bool r_debug_arg_set(RDebug *dbg, const char *cc, int num, ut64 val) {
42 	r_return_val_if_fail (dbg, false);
43 	if (!R_STR_ISEMPTY (cc)) {
44 		cc = r_anal_syscc_default (dbg->anal);
45 	}
46 	const char *rn = r_anal_cc_arg (dbg->anal, cc, num);
47 	if (rn) {
48 		r_debug_reg_set (dbg, rn, val);
49 		return true;
50 	}
51 	char reg[32];
52 	snprintf (reg, sizeof (reg) - 1, "A%d", num);
53 	r_debug_reg_set (dbg, reg, val);
54 	return true;
55 }
56