1 /* libgdbr - LGPL - Copyright 2014 - defragger */
2 
3 #include "libgdbr.h"
4 #include "arch.h"
5 
6 #include <stdio.h>
7 
gdbr_init(libgdbr_t * g,bool is_server)8 int gdbr_init(libgdbr_t *g, bool is_server) {
9 	if (!g) {
10 		return -1;
11 	}
12 	memset (g, 0, sizeof (libgdbr_t));
13 	g->no_ack = false;
14 	g->stub_features.extended_mode = -1;
15 	g->stub_features.pkt_sz = 64;
16 	g->stub_features.P = true;
17 	g->remote_file_fd = -1;
18 	g->is_server = is_server;
19 	g->send_max = 2500;
20 	g->send_buff = (char *) calloc (g->send_max, 1);
21 	g->page_size = 4096;
22 	g->num_retries = 40; // safe number, should be ~10 seconds
23 	if (!g->send_buff) {
24 		return -1;
25 	}
26 	g->send_len = 0;
27 	g->read_max = 4096;
28 	g->read_buff = (char *) calloc (g->read_max, 1);
29 	if (!g->read_buff) {
30 		R_FREE (g->send_buff);
31 		return -1;
32 	}
33 	g->sock = r_socket_new (0);
34 	g->gdbr_lock = r_th_lock_new (true);
35 	g->gdbr_lock_depth = 0;
36 	g->last_code = MSG_OK;
37 	g->connected = 0;
38 	g->data_len = 0;
39 	g->data_max = 4096;
40 	g->data = calloc (g->data_max, 1);
41 	if (!g->data) {
42 		R_FREE (g->send_buff);
43 		R_FREE (g->read_buff);
44 		return -1;
45 	}
46 	g->remote_type = GDB_REMOTE_TYPE_GDB;
47 	g->isbreaked = false;
48 	return 0;
49 }
50 
gdbr_set_architecture(libgdbr_t * g,int arch,int bits)51 bool gdbr_set_architecture(libgdbr_t *g, int arch, int bits) {
52 	if (!g) {
53 		return false;
54 	}
55 	if (g->target.valid && g->registers) {
56 		return true;
57 	}
58 
59 	const char *regprofile = gdbr_get_reg_profile (arch, bits);
60 	if (!regprofile) {
61 		eprintf ("cannot find gdb reg_profile\n");
62 		return false;
63 	}
64 	if (!gdbr_set_reg_profile (g, regprofile)) {
65 		return false;
66 	}
67 	g->target.arch = arch;
68 	g->target.bits = bits;
69 	g->target.valid = true;
70 
71 	return true;
72 }
73 
gdbr_get_reg_profile(int arch,int bits)74 const char *gdbr_get_reg_profile(int arch, int bits) {
75 	switch (arch) {
76 	case R_SYS_ARCH_X86:
77 		if (bits == 32) {
78 #include "reg/x86_32.h"
79 		} else if (bits == 64) {
80 #include "reg/x86_64.h"
81 		} else {
82 			eprintf ("%s: unsupported x86 bits: %d\n", __func__, bits);
83 			return NULL;
84 		}
85 		break;
86 	case R_SYS_ARCH_ARM:
87 		if (bits == 32) {
88 #include "reg/arm32.h"
89 		} else if (bits == 64) {
90 #include "reg/arm64.h"
91 		} else {
92 			eprintf ("%s: unsupported arm bits: %d\n", __func__, bits);
93 			return NULL;
94 		}
95 		break;
96 	case R_SYS_ARCH_SH:
97 #include "reg/sh.h"
98 		break;
99 	case R_SYS_ARCH_LM32:
100 #include "reg/lm32.h"
101 		break;
102 	case R_SYS_ARCH_RISCV:
103 #include "reg/riscv.h"
104 		break;
105 	case R_SYS_ARCH_MIPS:
106 #include "reg/mips.h"
107 		break;
108 	case R_SYS_ARCH_AVR:
109 #include "reg/avr.h"
110 		break;
111 	case R_SYS_ARCH_V850:
112 #include "reg/v850.h"
113 		break;
114 	}
115 	return NULL;
116 }
117 
gdbr_set_reg_profile(libgdbr_t * g,const char * str)118 int gdbr_set_reg_profile(libgdbr_t *g, const char *str) {
119 	if (!g || !str) {
120 		return -1;
121 	}
122 	gdb_reg_t *registers = arch_parse_reg_profile (str);
123 	if (!registers) {
124 		eprintf ("cannot parse reg profile\n");
125 		return -1;
126 	}
127 	if (g->target.regprofile) {
128 		free (g->target.regprofile);
129 	}
130 	g->target.regprofile = strdup (str);
131 	if (g->registers) {
132 		free (g->registers);
133 	}
134 	g->registers = arch_parse_reg_profile (str);
135 
136 	return 0;
137 }
138 
gdbr_cleanup(libgdbr_t * g)139 int gdbr_cleanup(libgdbr_t *g) {
140 	if (!g) {
141 		return -1;
142 	}
143 	R_FREE (g->data);
144 	g->send_len = 0;
145 	R_FREE (g->send_buff);
146 	R_FREE (g->read_buff);
147 	r_socket_free (g->sock);
148 	r_th_lock_free (g->gdbr_lock);
149 	return 0;
150 }
151