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