summaryrefslogtreecommitdiffstats
path: root/cpukit/libdebugger/rtems-debugger-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libdebugger/rtems-debugger-server.c')
-rw-r--r--cpukit/libdebugger/rtems-debugger-server.c104
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;
}