8 from StringIO
import StringIO
15 "Debugguer binding for GDBServer protocol"
17 general_registers_order = []
18 general_registers_size = {}
22 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
23 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
24 server.bind((
'localhost', port))
32 return chr(sum(map(ord, data)) % 256).encode(
"hex")
36 data = self.sock.recv(4096)
38 while (len(data) == 4096
or data ==
""):
43 data = self.sock.recv(4096)
46 logging.debug(
"<- %r", all_data)
54 while (buf.tell() < buf.len):
59 raise NotImplementedError(
"Resend packet")
66 checksum = buf.read(2)
68 raise ValueError(
"Incorrect checksum")
70 msgs.append(packet_data)
75 self.send_queue.append(
"O" + s.encode(
"hex"))
80 msg = self.recv_queue.pop(0)
82 msg_type = buf.read(1)
84 self.send_queue.append(
"+")
87 if msg.startswith(
"qSupported"):
88 self.send_queue.append(
"PacketSize=3fff")
89 elif msg.startswith(
"qC"):
91 self.send_queue.append(
"")
92 elif msg.startswith(
"qAttached"):
94 self.send_queue.append(
"")
95 elif msg.startswith(
"qTStatus"):
97 self.send_queue.append(
"")
98 elif msg.startswith(
"qfThreadInfo"):
100 self.send_queue.append(
"")
102 raise NotImplementedError()
104 elif msg_type ==
"H":
106 self.send_queue.append(
"OK")
108 elif msg_type ==
"?":
110 self.send_queue.append(self.
status)
112 elif msg_type ==
"g":
116 elif msg_type ==
"p":
118 reg_num = int(buf.read(), 16)
121 elif msg_type ==
"P":
123 reg_num, value = buf.read().split(
"=")
124 reg_num = int(reg_num, 16)
125 value = int(value.decode(
"hex")[::-1].encode(
"hex"), 16)
127 self.send_queue.append(
"OK")
129 elif msg_type ==
"m":
131 addr, size = map(
lambda x: int(x, 16), buf.read().split(
","))
132 self.send_queue.append(self.
read_memory(addr, size))
134 elif msg_type ==
"k":
140 elif msg_type ==
"!":
142 self.send_queue.append(
"OK")
144 elif msg_type ==
"v":
147 self.send_queue.append(
"")
149 elif msg_type ==
"s":
152 self.send_queue.append(
"S05")
154 elif msg_type ==
"Z":
156 bp_type = buf.read(1)
159 assert(buf.read(1) ==
",")
161 lambda x: int(x, 16), buf.read().split(
","))
164 raise NotImplementedError(
"Bigger size")
165 self.dbg.add_breakpoint(addr)
166 self.send_queue.append(
"OK")
170 assert(buf.read(1) ==
",")
172 lambda x: int(x, 16), buf.read().split(
","))
174 self.dbg.add_memory_breakpoint(addr, size,
177 self.send_queue.append(
"OK")
179 elif bp_type
in [
"2",
"3",
"4"]:
181 assert(buf.read(1) ==
",")
182 read = bp_type
in [
"3",
"4"]
183 write = bp_type
in [
"2",
"4"]
185 lambda x: int(x, 16), buf.read().split(
","))
187 self.dbg.add_memory_breakpoint(addr, size,
190 self.send_queue.append(
"OK")
193 raise ValueError(
"Impossible value")
195 elif msg_type ==
"z":
197 bp_type = buf.read(1)
200 assert(buf.read(1) ==
",")
202 lambda x: int(x, 16), buf.read().split(
","))
205 raise NotImplementedError(
"Bigger size")
206 dbgsoft = self.dbg.get_breakpoint_by_addr(addr)
207 assert(len(dbgsoft) == 1)
208 self.dbg.remove_breakpoint(dbgsoft[0])
209 self.send_queue.append(
"OK")
213 assert(buf.read(1) ==
",")
215 lambda x: int(x, 16), buf.read().split(
","))
216 self.dbg.remove_memory_breakpoint_by_addr_access(
217 addr, read=
True, write=
True)
218 self.send_queue.append(
"OK")
220 elif bp_type
in [
"2",
"3",
"4"]:
222 assert(buf.read(1) ==
",")
223 read = bp_type
in [
"3",
"4"]
224 write = bp_type
in [
"2",
"4"]
226 lambda x: int(x, 16), buf.read().split(
","))
228 self.dbg.remove_memory_breakpoint_by_addr_access(
229 addr, read=read, write=write)
230 self.send_queue.append(
"OK")
233 raise ValueError(
"Impossible value")
235 elif msg_type ==
"c":
242 self.send_queue.append(
"S05")
243 elif isinstance(ret, ExceptionHandle):
244 if ret == ExceptionHandle.memoryBreakpoint():
246 self.send_queue.append(
"S05")
248 raise NotImplementedError(
"Unknown Except")
254 self.send_queue.append(
"S05")
256 raise NotImplementedError()
259 raise NotImplementedError(
260 "Not implemented: message type '%s'" % msg_type)
268 logging.debug(
"-> %r", data)
309 raise NotImplementedError(
"Unknown size")
311 return struct.pack(pack_token, reg_value).encode(
"hex")
315 self.dbg.set_reg_value(reg_name, value)
318 return self.dbg.get_reg_value(reg_name)
321 except_flag_vm = self.dbg.myjit.vm.get_exception()
323 return self.dbg.get_mem_raw(addr, size).encode(
"hex")
325 self.dbg.myjit.vm.set_exception(except_flag_vm)
331 "Extend GdbServer for x86 32bits purposes"
333 general_registers_order = [
"EAX",
"ECX",
"EDX",
"EBX",
"ESP",
"EBP",
"ESI",
334 "EDI",
"EIP",
"EFLAGS",
"CS",
"SS",
"DS",
"ES",
337 general_registers_size = {
"EAX": 4,
355 "tf",
"i_f",
"nt",
"rf",
"vm",
"ac",
"vif",
"vip",
"i_d"]
358 sup_func = super(GdbServer_x86_32, self).read_register_by_name
361 if reg_name ==
"EIP":
362 return self.dbg.myjit.pc
365 if reg_name ==
"EFLAGS":
368 "cf", 1,
"pf", 0,
"af", 0,
"zf",
"nf",
"tf",
"i_f",
"df",
"of"]
369 eflags_args += [
"nt", 0,
"rf",
"vm",
"ac",
"vif",
"vip",
"i_d"]
370 eflags_args += [0] * 10
372 for i, arg
in enumerate(eflags_args):
373 if isinstance(arg, str):
375 to_add = sup_func(arg)
384 return sup_func(reg_name)
389 "Extend GdbServer for msp430 purposes"
391 general_registers_order = [
"PC",
"SP",
"SR",
"R3",
"R4",
"R5",
"R6",
"R7",
392 "R8",
"R9",
"R10",
"R11",
"R12",
"R13",
"R14",
395 general_registers_size = {
"PC": 2,
413 sup_func = super(GdbServer_msp430, self).read_register_by_name
419 o |= sup_func(
'scg1')
421 o |= sup_func(
'scg0')
425 o |= sup_func(
'cpuoff')
437 return sup_func(reg_name)
def read_register_by_name
def read_register_by_name
dictionary general_registers_size
def report_general_register_values
def read_register_by_name
list general_registers_order