gdb: don't access target fields directly.

This commit is contained in:
Gareth McMullin 2015-03-29 18:06:13 -07:00
parent c2cde32716
commit 21d464293c
2 changed files with 19 additions and 16 deletions

View File

@ -77,9 +77,10 @@ gdb_main(void)
/* Implementation of these is mandatory! */ /* Implementation of these is mandatory! */
case 'g': { /* 'g': Read general registers */ case 'g': { /* 'g': Read general registers */
ERROR_IF_NO_TARGET(); ERROR_IF_NO_TARGET();
uint8_t arm_regs[cur_target->regs_size]; uint8_t arm_regs[target_regs_size(cur_target)];
target_regs_read(cur_target, arm_regs); target_regs_read(cur_target, arm_regs);
gdb_putpacket(hexify(pbuf, (void*)arm_regs, cur_target->regs_size), cur_target->regs_size * 2); gdb_putpacket(hexify(pbuf, arm_regs, sizeof(arm_regs)),
sizeof(arm_regs) * 2);
break; break;
} }
case 'm': { /* 'm addr,len': Read len bytes from addr */ case 'm': { /* 'm addr,len': Read len bytes from addr */
@ -97,8 +98,8 @@ gdb_main(void)
} }
case 'G': { /* 'G XX': Write general registers */ case 'G': { /* 'G XX': Write general registers */
ERROR_IF_NO_TARGET(); ERROR_IF_NO_TARGET();
uint8_t arm_regs[cur_target->regs_size]; uint8_t arm_regs[target_regs_size(cur_target)];
unhexify(arm_regs, &pbuf[1], cur_target->regs_size); unhexify(arm_regs, &pbuf[1], sizeof(arm_regs));
target_regs_write(cur_target, arm_regs); target_regs_write(cur_target, arm_regs);
gdb_putpacketz("OK"); gdb_putpacketz("OK");
break; break;
@ -327,11 +328,11 @@ handle_q_packet(char *packet, int len)
cur_target = target_attach(last_target, cur_target = target_attach(last_target,
gdb_target_destroy_callback); gdb_target_destroy_callback);
} }
if((!cur_target) || (!cur_target->xml_mem_map)) { if (!cur_target) {
gdb_putpacketz("E01"); gdb_putpacketz("E01");
return; return;
} }
handle_q_string_reply(cur_target->xml_mem_map, packet + 23); handle_q_string_reply(target_mem_map(cur_target), packet + 23);
} else if (strncmp (packet, "qXfer:features:read:target.xml:", 31) == 0) { } else if (strncmp (packet, "qXfer:features:read:target.xml:", 31) == 0) {
/* Read target description */ /* Read target description */
@ -340,11 +341,11 @@ handle_q_packet(char *packet, int len)
cur_target = target_attach(last_target, cur_target = target_attach(last_target,
gdb_target_destroy_callback); gdb_target_destroy_callback);
} }
if((!cur_target) || (!cur_target->tdesc)) { if (!cur_target) {
gdb_putpacketz("E01"); gdb_putpacketz("E01");
return; return;
} }
handle_q_string_reply(cur_target->tdesc, packet + 31); handle_q_string_reply(target_tdesc(cur_target), packet + 31);
} else if (sscanf(packet, "qCRC:%" PRIx32 ",%" PRIx32, &addr, &alen) == 2) { } else if (sscanf(packet, "qCRC:%" PRIx32 ",%" PRIx32, &addr, &alen) == 2) {
if(!cur_target) { if(!cur_target) {
gdb_putpacketz("E01"); gdb_putpacketz("E01");
@ -450,10 +451,6 @@ handle_z_packet(char *packet, int plen)
sscanf(packet + 2, ",%" PRIx32 ",%d", &addr, &len); sscanf(packet + 2, ",%" PRIx32 ",%d", &addr, &len);
switch(type) { switch(type) {
case 1: /* Hardware breakpoint */ case 1: /* Hardware breakpoint */
if(!cur_target->set_hw_bp) { /* Not supported */
gdb_putpacketz("");
return;
}
if(set) if(set)
ret = target_set_hw_bp(cur_target, addr); ret = target_set_hw_bp(cur_target, addr);
else else
@ -463,10 +460,6 @@ handle_z_packet(char *packet, int plen)
case 2: case 2:
case 3: case 3:
case 4: case 4:
if(!cur_target->set_hw_wp) { /* Not supported */
gdb_putpacketz("");
return;
}
if(set) if(set)
ret = target_set_hw_wp(cur_target, type, addr, len); ret = target_set_hw_wp(cur_target, type, addr, len);
else else

View File

@ -108,6 +108,16 @@ target *target_attach(target *t, target_destroy_callback destroy_cb);
#define target_hostio_reply(target, recode, errcode) \ #define target_hostio_reply(target, recode, errcode) \
(target)->hostio_reply((target), (retcode), (errcode)) (target)->hostio_reply((target), (retcode), (errcode))
/* Accessor functions */
#define target_regs_size(target) \
((target)->regs_size)
#define target_mem_map(target) \
((target)->xml_mem_map ? (target)->xml_mem_map : "")
#define target_tdesc(target) \
((target)->tdesc ? (target)->tdesc : "")
struct target_s { struct target_s {
/* Notify controlling debugger if target is lost */ /* Notify controlling debugger if target is lost */
target_destroy_callback destroy_callback; target_destroy_callback destroy_callback;