gdb_main: Formatting cleanup
This commit is contained in:
parent
804a1a4f43
commit
e424859ecb
154
src/gdb_main.c
154
src/gdb_main.c
@ -51,12 +51,10 @@ enum gdb_signal {
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const char *cmd_prefix;
|
const char *cmd_prefix;
|
||||||
void (*func)(const char *packet,int len);
|
void (*func)(const char *packet, int len);
|
||||||
}cmd_executer;
|
} cmd_executer;
|
||||||
|
|
||||||
|
static char pbuf[BUF_SIZE + 1];
|
||||||
|
|
||||||
static char pbuf[BUF_SIZE+1];
|
|
||||||
|
|
||||||
static target *cur_target;
|
static target *cur_target;
|
||||||
static target *last_target;
|
static target *last_target;
|
||||||
@ -119,7 +117,7 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
gdb_putpacket(hexify(pbuf, arm_regs, sizeof(arm_regs)),
|
gdb_putpacket(hexify(pbuf, arm_regs, sizeof(arm_regs)),
|
||||||
sizeof(arm_regs) * 2);
|
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 */
|
||||||
uint32_t addr, len;
|
uint32_t addr, len;
|
||||||
ERROR_IF_NO_TARGET();
|
ERROR_IF_NO_TARGET();
|
||||||
@ -134,9 +132,9 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
if (target_mem_read(cur_target, mem, addr, len))
|
if (target_mem_read(cur_target, mem, addr, len))
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
else
|
else
|
||||||
gdb_putpacket(hexify(pbuf, mem, len), len*2);
|
gdb_putpacket(hexify(pbuf, mem, len), len * 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
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[target_regs_size(cur_target)];
|
uint8_t arm_regs[target_regs_size(cur_target)];
|
||||||
@ -144,7 +142,7 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
target_regs_write(cur_target, arm_regs);
|
target_regs_write(cur_target, arm_regs);
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'M': { /* 'M addr,len:XX': Write len bytes to addr */
|
case 'M': { /* 'M addr,len:XX': Write len bytes to addr */
|
||||||
uint32_t addr, len;
|
uint32_t addr, len;
|
||||||
int hex;
|
int hex;
|
||||||
@ -163,7 +161,7 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
else
|
else
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 's': /* 's [addr]': Single step [start at addr] */
|
case 's': /* 's [addr]': Single step [start at addr] */
|
||||||
single_step = true;
|
single_step = true;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
@ -217,7 +215,7 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
gdb_putpacket_f("T%02X", GDB_SIGTRAP);
|
gdb_putpacket_f("T%02X", GDB_SIGTRAP);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optional GDB packet support */
|
/* Optional GDB packet support */
|
||||||
case 'p': { /* Read single register */
|
case 'p': { /* Read single register */
|
||||||
@ -226,32 +224,31 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
sscanf(pbuf, "p%" SCNx32, ®);
|
sscanf(pbuf, "p%" SCNx32, ®);
|
||||||
uint8_t val[8];
|
uint8_t val[8];
|
||||||
size_t s = target_reg_read(cur_target, reg, val, sizeof(val));
|
size_t s = target_reg_read(cur_target, reg, val, sizeof(val));
|
||||||
if (s > 0) {
|
if (s > 0)
|
||||||
gdb_putpacket(hexify(pbuf, val, s), s * 2);
|
gdb_putpacket(hexify(pbuf, val, s), s * 2);
|
||||||
} else {
|
else
|
||||||
gdb_putpacketz("EFF");
|
gdb_putpacketz("EFF");
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'P': { /* Write single register */
|
case 'P': { /* Write single register */
|
||||||
ERROR_IF_NO_TARGET();
|
ERROR_IF_NO_TARGET();
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
int n;
|
int n;
|
||||||
sscanf(pbuf, "P%" SCNx32 "=%n", ®, &n);
|
sscanf(pbuf, "P%" SCNx32 "=%n", ®, &n);
|
||||||
uint8_t val[strlen(&pbuf[n])/2];
|
// TODO: FIXME, VLAs considered harmful.
|
||||||
|
uint8_t val[strlen(&pbuf[n]) / 2];
|
||||||
unhexify(val, pbuf + n, sizeof(val));
|
unhexify(val, pbuf + n, sizeof(val));
|
||||||
if (target_reg_write(cur_target, reg, val, sizeof(val)) > 0) {
|
if (target_reg_write(cur_target, reg, val, sizeof(val)) > 0)
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
} else {
|
else
|
||||||
gdb_putpacketz("EFF");
|
gdb_putpacketz("EFF");
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'F': /* Semihosting call finished */
|
case 'F': /* Semihosting call finished */
|
||||||
if (in_syscall) {
|
if (in_syscall)
|
||||||
return hostio_reply(tc, pbuf, size);
|
return hostio_reply(tc, pbuf, size);
|
||||||
} else {
|
else {
|
||||||
DEBUG_GDB("*** F packet when not in syscall! '%s'\n", pbuf);
|
DEBUG_GDB("*** F packet when not in syscall! '%s'\n", pbuf);
|
||||||
gdb_putpacketz("");
|
gdb_putpacketz("");
|
||||||
}
|
}
|
||||||
@ -309,12 +306,12 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
}
|
}
|
||||||
DEBUG_GDB("X packet: addr = %" PRIx32 ", len = %" PRIx32 "\n",
|
DEBUG_GDB("X packet: addr = %" PRIx32 ", len = %" PRIx32 "\n",
|
||||||
addr, len);
|
addr, len);
|
||||||
if (target_mem_write(cur_target, addr, pbuf+bin, len))
|
if (target_mem_write(cur_target, addr, pbuf + bin, len))
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
else
|
else
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'q': /* General query packet */
|
case 'q': /* General query packet */
|
||||||
handle_q_packet(pbuf, size);
|
handle_q_packet(pbuf, size);
|
||||||
@ -337,35 +334,36 @@ int gdb_main_loop(struct target_controller *tc, bool in_syscall)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool exec_command(char *packet, int len, const cmd_executer *exec)
|
|
||||||
|
static bool exec_command(char *packet, int len, const cmd_executer *exec)
|
||||||
{
|
{
|
||||||
while(exec->cmd_prefix) {
|
while (exec->cmd_prefix) {
|
||||||
int l=strlen(exec->cmd_prefix);
|
const int l = strlen(exec->cmd_prefix);
|
||||||
if(!strncmp(packet,exec->cmd_prefix,l)) {
|
if (!strncmp(packet, exec->cmd_prefix, l)) {
|
||||||
exec->func(packet+l,len-l);
|
exec->func(packet + l, len - l);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
exec++;
|
++exec;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_q_rcmd(const char *packet,int len)
|
static void exec_q_rcmd(const char *packet,int len)
|
||||||
{
|
{
|
||||||
char *data;
|
char *data;
|
||||||
int datalen;
|
int datalen;
|
||||||
|
|
||||||
/* calculate size and allocate buffer for command */
|
/* calculate size and allocate buffer for command */
|
||||||
datalen = len/ 2;
|
datalen = len / 2;
|
||||||
data = alloca(datalen+1);
|
data = alloca(datalen + 1);
|
||||||
/* dehexify command */
|
/* dehexify command */
|
||||||
unhexify(data, packet, datalen);
|
unhexify(data, packet, datalen);
|
||||||
data[datalen] = 0; /* add terminating null */
|
data[datalen] = 0; /* add terminating null */
|
||||||
|
|
||||||
int c = command_process(cur_target, data);
|
int c = command_process(cur_target, data);
|
||||||
if(c < 0)
|
if (c < 0)
|
||||||
gdb_putpacketz("");
|
gdb_putpacketz("");
|
||||||
else if(c == 0)
|
else if (c == 0)
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
else
|
else
|
||||||
gdb_putpacket(hexify(pbuf, "Failed\n", strlen("Failed\n")),
|
gdb_putpacket(hexify(pbuf, "Failed\n", strlen("Failed\n")),
|
||||||
@ -376,23 +374,26 @@ static void
|
|||||||
handle_q_string_reply(const char *str, const char *param)
|
handle_q_string_reply(const char *str, const char *param)
|
||||||
{
|
{
|
||||||
unsigned long addr, len;
|
unsigned long addr, len;
|
||||||
|
const size_t str_len = strlen(str);
|
||||||
|
|
||||||
if (sscanf(param, "%08lx,%08lx", &addr, &len) != 2) {
|
if (sscanf(param, "%08lx,%08lx", &addr, &len) != 2) {
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (addr > strlen (str)) {
|
else if (addr > str_len) {
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(addr== strlen (str)) {
|
else if (addr == str_len) {
|
||||||
gdb_putpacketz("l");
|
gdb_putpacketz("l");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
unsigned long output_len=strlen(str)-addr;
|
unsigned long output_len = str_len - addr;
|
||||||
if(output_len>len) output_len=len;
|
if (output_len > len)
|
||||||
gdb_putpacket2("m",1,str+addr,output_len);
|
output_len = len;
|
||||||
|
gdb_putpacket2("m", 1, str + addr, output_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_q_supported(const char *packet, int len)
|
static void exec_q_supported(const char *packet, int len)
|
||||||
{
|
{
|
||||||
(void)packet;
|
(void)packet;
|
||||||
@ -400,12 +401,12 @@ static void exec_q_supported(const char *packet, int len)
|
|||||||
gdb_putpacket_f("PacketSize=%X;qXfer:memory-map:read+;qXfer:features:read+", BUF_SIZE);
|
gdb_putpacket_f("PacketSize=%X;qXfer:memory-map:read+;qXfer:features:read+", BUF_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_q_memory_map(const char *packet,int len)
|
static void exec_q_memory_map(const char *packet, int len)
|
||||||
{
|
{
|
||||||
(void)packet;
|
(void)packet;
|
||||||
(void)len;
|
(void)len;
|
||||||
/* Read target XML memory map */
|
/* Read target XML memory map */
|
||||||
if((!cur_target) && last_target) {
|
if ((!cur_target) && last_target) {
|
||||||
/* Attach to last target if detached. */
|
/* Attach to last target if detached. */
|
||||||
cur_target = target_attach(last_target,
|
cur_target = target_attach(last_target,
|
||||||
&gdb_controller);
|
&gdb_controller);
|
||||||
@ -423,7 +424,7 @@ static void exec_q_feature_read(const char *packet, int len)
|
|||||||
{
|
{
|
||||||
(void)len;
|
(void)len;
|
||||||
/* Read target description */
|
/* Read target description */
|
||||||
if((!cur_target) && last_target) {
|
if ((!cur_target) && last_target) {
|
||||||
/* Attach to last target if detached. */
|
/* Attach to last target if detached. */
|
||||||
cur_target = target_attach(last_target, &gdb_controller);
|
cur_target = target_attach(last_target, &gdb_controller);
|
||||||
}
|
}
|
||||||
@ -431,7 +432,7 @@ static void exec_q_feature_read(const char *packet, int len)
|
|||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
handle_q_string_reply(target_tdesc(cur_target), packet );
|
handle_q_string_reply(target_tdesc(cur_target), packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exec_q_crc(const char *packet, int len)
|
static void exec_q_crc(const char *packet, int len)
|
||||||
@ -439,7 +440,7 @@ static void exec_q_crc(const char *packet, int len)
|
|||||||
(void)len;
|
(void)len;
|
||||||
uint32_t addr, alen;
|
uint32_t addr, alen;
|
||||||
if (sscanf(packet, "%" PRIx32 ",%" PRIx32, &addr, &alen) == 2) {
|
if (sscanf(packet, "%" PRIx32 ",%" PRIx32, &addr, &alen) == 2) {
|
||||||
if(!cur_target) {
|
if (!cur_target) {
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -451,6 +452,7 @@ static void exec_q_crc(const char *packet, int len)
|
|||||||
gdb_putpacket_f("C%lx", crc);
|
gdb_putpacket_f("C%lx", crc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const cmd_executer q_commands[]=
|
static const cmd_executer q_commands[]=
|
||||||
{
|
{
|
||||||
{"qRcmd,", exec_q_rcmd},
|
{"qRcmd,", exec_q_rcmd},
|
||||||
@ -458,16 +460,14 @@ static const cmd_executer q_commands[]=
|
|||||||
{"qXfer:memory-map:read::", exec_q_memory_map},
|
{"qXfer:memory-map:read::", exec_q_memory_map},
|
||||||
{"qXfer:features:read:target.xml:",exec_q_feature_read},
|
{"qXfer:features:read:target.xml:",exec_q_feature_read},
|
||||||
{"qCRC:", exec_q_crc},
|
{"qCRC:", exec_q_crc},
|
||||||
|
{NULL, NULL},
|
||||||
{NULL,NULL},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_q_packet(char *packet, int len)
|
handle_q_packet(char *packet, int len)
|
||||||
{
|
{
|
||||||
if(exec_command(packet,len,q_commands)) {
|
if (exec_command(packet, len, q_commands))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
DEBUG_GDB("*** Unsupported packet: %s\n", packet);
|
DEBUG_GDB("*** Unsupported packet: %s\n", packet);
|
||||||
gdb_putpacket("", 0);
|
gdb_putpacket("", 0);
|
||||||
}
|
}
|
||||||
@ -493,35 +493,37 @@ handle_v_packet(char *packet, int plen)
|
|||||||
char cmdline[83];
|
char cmdline[83];
|
||||||
char *pcmdline = cmdline;
|
char *pcmdline = cmdline;
|
||||||
char *tok = packet + 4;
|
char *tok = packet + 4;
|
||||||
if (*tok == ';') tok++;
|
if (*tok == ';')
|
||||||
*cmdline='\0';
|
++tok;
|
||||||
|
cmdline[0] = '\0';
|
||||||
while(*tok != '\0') {
|
while(*tok != '\0') {
|
||||||
if(strlen(cmdline)+3 >= sizeof(cmdline)) break;
|
if (strlen(cmdline) + 3 >= sizeof(cmdline))
|
||||||
|
break;
|
||||||
if (*tok == ';') {
|
if (*tok == ';') {
|
||||||
*pcmdline++=' ';
|
*pcmdline++ = ' ';
|
||||||
*pcmdline='\0';
|
pcmdline[0] = '\0';
|
||||||
tok++;
|
tok++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (isxdigit(*tok) && isxdigit(*(tok+1))) {
|
if (isxdigit(tok[0]) && isxdigit(tok[1])) {
|
||||||
unhexify(pcmdline, tok, 2);
|
unhexify(pcmdline, tok, 2);
|
||||||
if ((*pcmdline == ' ') || (*pcmdline == '\\')) {
|
if ((*pcmdline == ' ') || (*pcmdline == '\\')) {
|
||||||
*(pcmdline+1)=*pcmdline;
|
pcmdline[1] = *pcmdline;
|
||||||
*pcmdline++='\\';
|
*pcmdline++ = '\\';
|
||||||
}
|
}
|
||||||
pcmdline++;
|
pcmdline++;
|
||||||
tok+=2;
|
tok += 2;
|
||||||
*pcmdline='\0';
|
pcmdline[0] = '\0';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Run target program. For us (embedded) this means reset. */
|
/* Run target program. For us (embedded) this means reset. */
|
||||||
if(cur_target) {
|
if (cur_target) {
|
||||||
target_set_cmdline(cur_target, cmdline);
|
target_set_cmdline(cur_target, cmdline);
|
||||||
target_reset(cur_target);
|
target_reset(cur_target);
|
||||||
gdb_putpacketz("T05");
|
gdb_putpacketz("T05");
|
||||||
} else if(last_target) {
|
} else if (last_target) {
|
||||||
cur_target = target_attach(last_target,
|
cur_target = target_attach(last_target,
|
||||||
&gdb_controller);
|
&gdb_controller);
|
||||||
|
|
||||||
@ -531,24 +533,29 @@ handle_v_packet(char *packet, int plen)
|
|||||||
target_reset(cur_target);
|
target_reset(cur_target);
|
||||||
morse(NULL, false);
|
morse(NULL, false);
|
||||||
gdb_putpacketz("T05");
|
gdb_putpacketz("T05");
|
||||||
} else gdb_putpacketz("E01");
|
} else
|
||||||
|
gdb_putpacketz("E01");
|
||||||
|
|
||||||
} else gdb_putpacketz("E01");
|
} else
|
||||||
|
gdb_putpacketz("E01");
|
||||||
|
|
||||||
} else if (sscanf(packet, "vFlashErase:%08lx,%08lx", &addr, &len) == 2) {
|
} else if (sscanf(packet, "vFlashErase:%08lx,%08lx", &addr, &len) == 2) {
|
||||||
/* Erase Flash Memory */
|
/* Erase Flash Memory */
|
||||||
DEBUG_GDB("Flash Erase %08lX %08lX\n", addr, len);
|
DEBUG_GDB("Flash Erase %08lX %08lX\n", addr, len);
|
||||||
if(!cur_target) { gdb_putpacketz("EFF"); return; }
|
if (!cur_target) {
|
||||||
|
gdb_putpacketz("EFF");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(!flash_mode) {
|
if (!flash_mode) {
|
||||||
/* Reset target if first flash command! */
|
/* Reset target if first flash command! */
|
||||||
/* This saves us if we're interrupted in IRQ context */
|
/* This saves us if we're interrupted in IRQ context */
|
||||||
target_reset(cur_target);
|
target_reset(cur_target);
|
||||||
flash_mode = 1;
|
flash_mode = 1;
|
||||||
}
|
}
|
||||||
if(target_flash_erase(cur_target, addr, len) == 0) {
|
if (target_flash_erase(cur_target, addr, len) == 0)
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
} else {
|
else {
|
||||||
flash_mode = 0;
|
flash_mode = 0;
|
||||||
gdb_putpacketz("EFF");
|
gdb_putpacketz("EFF");
|
||||||
}
|
}
|
||||||
@ -557,9 +564,9 @@ handle_v_packet(char *packet, int plen)
|
|||||||
/* Write Flash Memory */
|
/* Write Flash Memory */
|
||||||
len = plen - bin;
|
len = plen - bin;
|
||||||
DEBUG_GDB("Flash Write %08lX %08lX\n", addr, len);
|
DEBUG_GDB("Flash Write %08lX %08lX\n", addr, len);
|
||||||
if(cur_target && target_flash_write(cur_target, addr, (void*)packet + bin, len) == 0) {
|
if (cur_target && target_flash_write(cur_target, addr, (void*)packet + bin, len) == 0)
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
} else {
|
else {
|
||||||
flash_mode = 0;
|
flash_mode = 0;
|
||||||
gdb_putpacketz("EFF");
|
gdb_putpacketz("EFF");
|
||||||
}
|
}
|
||||||
@ -591,13 +598,12 @@ handle_z_packet(char *packet, int plen)
|
|||||||
else
|
else
|
||||||
ret = target_breakwatch_clear(cur_target, type, addr, len);
|
ret = target_breakwatch_clear(cur_target, type, addr, len);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0)
|
||||||
gdb_putpacketz("E01");
|
gdb_putpacketz("E01");
|
||||||
} else if (ret > 0) {
|
else if (ret > 0)
|
||||||
gdb_putpacketz("");
|
gdb_putpacketz("");
|
||||||
} else {
|
else
|
||||||
gdb_putpacketz("OK");
|
gdb_putpacketz("OK");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void gdb_main(void)
|
void gdb_main(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user