aboutsummaryrefslogtreecommitdiff
path: root/src/gdb_main.c
diff options
context:
space:
mode:
authorGareth McMullin2013-04-14 19:47:11 -0700
committerGareth McMullin2013-05-18 15:33:58 +1200
commit5020d1f05db920cd0633982016c0b1978a310d20 (patch)
tree0de2e1b9ac2864f42d9440894f921cb9eeae16cb /src/gdb_main.c
parentaca421d0bbd021c4b0e320195692d9760d9ecdcd (diff)
Move semihosting support to cortexm.c.
Try to implement more syscalls.
Diffstat (limited to 'src/gdb_main.c')
-rw-r--r--src/gdb_main.c59
1 files changed, 10 insertions, 49 deletions
diff --git a/src/gdb_main.c b/src/gdb_main.c
index 887b9ac..69d5ed1 100644
--- a/src/gdb_main.c
+++ b/src/gdb_main.c
@@ -76,7 +76,6 @@ gdb_main(void)
int size;
bool single_step = false;
char last_activity = 0;
- uint32_t semihost_read_bytes = 0;
DEBUG("Entring GDB protocol main loop\n");
/* GDB protocol main loop */
@@ -161,6 +160,7 @@ gdb_main(void)
break;
}
+ last_activity = pbuf[0];
/* Wait for target halt */
while(!(sig = target_halt_wait(cur_target))) {
unsigned char c = gdb_if_getchar_to(0);
@@ -171,42 +171,9 @@ gdb_main(void)
}
SET_RUN_STATE(0);
- uint32_t arm_regs[cur_target->regs_size];
- uint32_t semihost_buf[4];
- target_regs_read(cur_target, arm_regs);
- target_mem_read_bytes(cur_target, (uint8_t *)semihost_buf, arm_regs[15], 2);
- /* Is this a semihosting breakpoint? */
- if ((semihost_buf[0] & 0xFFFF) == 0xBEAB) {
- last_activity = pbuf[0];
- semihost_read_bytes = 0;
- target_mem_read_words(cur_target, semihost_buf, arm_regs[1], sizeof(semihost_buf));
-
- switch (arm_regs[0]) {
- case 0x09: /* SYS_ISTTY */
- arm_regs[0] = 1; /* it's a tty */
- target_regs_write(cur_target, arm_regs);
- /* fall-through */
- case 0x01: /* SYS_OPEN */
- case 0x0C: /* SYS_FLEN */
- /* pretend it's successful, r0 is non-zero already */
- goto continue_activity;
- case 0x13: /* SYS_ERRNO */
- arm_regs[0] = 4; /* EINTR */
- target_regs_write(cur_target, arm_regs);
- goto continue_activity;
- case 0x05: /* SYS_WRITE */
- gdb_putpacket_f("Fwrite,1,%08X,%08X",
- semihost_buf[1], semihost_buf[2]);
- arm_regs[0] = 0; /* pretend it's always successful */
- target_regs_write(cur_target, arm_regs);
- continue;
- case 0x06: /* SYS_READ */
- gdb_putpacket_f("Fread,0,%08X,%08X",
- semihost_buf[1], semihost_buf[2]);
- semihost_read_bytes = semihost_buf[2];
- continue;
- }
- }
+ /* Negative signal indicates we're in a syscall */
+ if (sig < 0)
+ break;
/* Report reason for halt */
if(target_check_hw_wp(cur_target, &watch_addr)) {
@@ -218,23 +185,17 @@ gdb_main(void)
break;
}
case 'F': { /* Semihosting call finished */
- int bytes, errcode, items;
+ int retcode, errcode, items;
char c, *p;
if (pbuf[1] == '-')
p = &pbuf[2];
else
p = &pbuf[1];
- items = sscanf(p, "%x,%x,%c", &bytes, &errcode, &c);
-
- if (semihost_read_bytes) {
- uint32_t arm_regs[cur_target->regs_size];
- target_regs_read(cur_target, arm_regs);
- if (items == 3 && c == 'C')
- arm_regs[0] = -1;
- else
- arm_regs[0] = semihost_read_bytes - bytes;
- target_regs_write(cur_target, arm_regs);
- }
+ items = sscanf(p, "%x,%x,%c", &retcode, &errcode, &c);
+ if (pbuf[1] == '-')
+ retcode = -retcode;
+
+ target_hostio_reply(cur_target, retcode, errcode);
/* if break is requested */
if (items == 3 && c == 'C') {