diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/libdebugger/rtems-debugger-server.c | 104 |
1 files changed, 82 insertions, 22 deletions
diff --git a/cpukit/libdebugger/rtems-debugger-server.c b/cpukit/libdebugger/rtems-debugger-server.c index 975ec23a30..b7b9727d84 100644 --- a/cpukit/libdebugger/rtems-debugger-server.c +++ b/cpukit/libdebugger/rtems-debugger-server.c @@ -154,6 +154,26 @@ hex_encode(int val) return "0123456789abcdef"[val & 0xf]; } +static inline uintptr_t +hex_decode_addr(const uint8_t* data) +{ + uintptr_t ui = 0; + size_t i; + if (data[0] == '-') { + if (data[1] == '1') + ui = (uintptr_t) -1; + } + else { + for (i = 0; i < (sizeof(ui) * 2); ++i) { + int v = hex_decode(data[i]); + if (v < 0) + break; + ui = (ui << 4) | v; + } + } + return ui; +} + static inline DB_UINT hex_decode_uint(const uint8_t* data) { @@ -1438,10 +1458,10 @@ remote_read_memory(uint8_t* buffer, int size) if (comma == NULL) remote_packet_out_str(r_E01); else { - DB_UINT addr; + uintptr_t addr; DB_UINT length; int r; - addr = hex_decode_uint(&buffer[1]); + addr = hex_decode_addr(&buffer[1]); length = hex_decode_uint((const uint8_t*) comma + 1); remote_packet_out_reset(); r = rtems_debugger_target_start_memory_access(); @@ -1468,10 +1488,10 @@ remote_write_memory(uint8_t* buffer, int size) comma = strchr((const char*) buffer, ','); colon = strchr((const char*) buffer, ':'); if (comma != NULL && colon != NULL) { - DB_UINT addr; + uintptr_t addr; DB_UINT length; int r; - addr = hex_decode_uint(&buffer[1]); + addr = hex_decode_addr(&buffer[1]); length = hex_decode_uint((const uint8_t*) comma + 1); r = rtems_debugger_target_start_memory_access(); if (r == 0) { @@ -1519,9 +1539,9 @@ remote_breakpoints(bool insert, uint8_t* buffer, int size) comma2 = strchr(comma1 + 1, ','); if (comma2 != NULL) { uint32_t capabilities; - DB_UINT addr; + uintptr_t addr; DB_UINT kind; - addr = hex_decode_uint((const uint8_t*) comma1 + 1); + addr = hex_decode_addr((const uint8_t*) comma1 + 1); kind = hex_decode_uint((const uint8_t*)comma2 + 1); capabilities = rtems_debugger_target_capabilities(); switch (buffer[1]) { @@ -1658,18 +1678,30 @@ rtems_debugger_events(rtems_task_argument arg) rtems_debugger_target_enable(); - while (rtems_debugger_server_events_running()) { - rtems_debugger_server_events_wait(); - if (rtems_debugger_verbose()) - rtems_debugger_printf("rtems-db: event woken\n"); - if (!rtems_debugger_server_events_running()) - break; + if (rtems_debugger_server_flag(RTEMS_DEBUGGER_FLAG_BREAK_WAITER)) { + rtems_debugger->flags &= ~RTEMS_DEBUGGER_FLAG_BREAK_WAITER; r = rtems_debugger_thread_system_suspend(); - if (r < 0) - break; - r = remote_stop_reason(NULL, 0); - if (r < 0) - break; + if (rtems_debugger_verbose()) + rtems_debugger_printf("rtems-db: break waiter\n"); + rtems_debugger_server_events_signal(); + if (rtems_debugger_verbose()) + rtems_debugger_printf("rtems-db: break waiter: signalled\n"); + } + + if (r == 0) { + while (rtems_debugger_server_events_running()) { + rtems_debugger_server_events_wait(); + if (rtems_debugger_verbose()) + rtems_debugger_printf("rtems-db: event woken\n"); + if (!rtems_debugger_server_events_running()) + break; + r = rtems_debugger_thread_system_suspend(); + if (r < 0) + break; + r = remote_stop_reason(NULL, 0); + if (r < 0) + break; + } } if (r < 0) @@ -1953,6 +1985,30 @@ rtems_debugger_server_crash(void) } int +rtems_debugger_break(bool wait) +{ + int r = 0; + if (!rtems_debugger_running()) { + errno = EIO; + r = -1; + } else { + rtems_debugger_lock(); + if (rtems_debugger_server_events_running()) { + rtems_debugger_server_events_signal(); + } else if ( + wait && !rtems_debugger_server_flag(RTEMS_DEBUGGER_FLAG_BREAK_WAITER)) { + rtems_debugger->flags |= RTEMS_DEBUGGER_FLAG_BREAK_WAITER; + rtems_debugger_server_events_wait(); + } else { + errno = EIO; + r = -1; + } + rtems_debugger_unlock(); + } + return r; +} + +int rtems_debugger_stop(void) { return rtems_debugger_destroy(); @@ -1978,10 +2034,14 @@ rtems_debugger_set_verbose(bool on) int rtems_debugger_remote_debug(bool state) { - rtems_debugger_lock(); - rtems_debugger->remote_debug = state; - rtems_debugger_printf("rtems-db: remote-debug is %s\n", - rtems_debugger->remote_debug ? "on" : "off"); - rtems_debugger_unlock(); + if (rtems_debugger_running()) { + rtems_debugger_lock(); + rtems_debugger->remote_debug = state; + rtems_debugger_printf("rtems-db: remote-debug is %s\n", + rtems_debugger->remote_debug ? "on" : "off"); + rtems_debugger_unlock(); + } else { + rtems_debugger_printf("rtems-db: debug server not running\n"); + } return 0; } |