diff options
author | Stan Cox <scox@redhat.com> | 2018-06-04 10:20:49 -0400 |
---|---|---|
committer | Stan Cox <scox@redhat.com> | 2018-06-04 10:20:49 -0400 |
commit | c12a5089640109567e2e06f0c5d2d1bf4fb3f5eb (patch) | |
tree | e898e2fded595ab6342d3a3283cd4e3b5f8bd838 /gdb/gdbserver/remote-utils.c | |
parent | 23081219bfe58dd07b1e0a110728d7195155d0e2 (diff) | |
download | binutils-c12a5089640109567e2e06f0c5d2d1bf4fb3f5eb.zip binutils-c12a5089640109567e2e06f0c5d2d1bf4fb3f5eb.tar.gz binutils-c12a5089640109567e2e06f0c5d2d1bf4fb3f5eb.tar.bz2 |
Add client_state struct.
Collect per client specific global data items into struct client_state,
which is similar in purpose to remote.c::remote_state.
gdbserver/ChangeLog
* server.h (struct client_state): New.
* server.c (cont_thread, general_thread, multi_process)
(report_fork_events, report_vfork_events, report_exec_events)
(report_thread_events, swbreak_feature, hwbreak_feature)
(vCont_supported, disable_randomization, pass_signals)
(program_signals, program_signals_p, last_status, last_ptid, own_buf):
Moved to client_state.
* remote-utils.c (remote_debug, noack_mode)
(transport_is_reliable): Moved to client_state.
* tracepoint.c (current_traceframe): Moved to client_state.
Update all callers.
* server.c, remote-utils.c, tracepoint.c, fork-child.c,
linux-low.c, remote-utils.h, target.c: Use client_state.
Diffstat (limited to 'gdb/gdbserver/remote-utils.c')
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 129 |
1 files changed, 67 insertions, 62 deletions
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index 3b5a459..967b2f0e 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -115,11 +115,6 @@ static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; extern int using_threads; extern int debug_threads; -/* If true, then GDB has requested noack mode. */ -int noack_mode = 0; -/* If true, then we tell GDB to use noack mode by default. */ -int transport_is_reliable = 0; - #ifdef USE_WIN32API # define read(fd, buf, len) recv (fd, (char *) buf, len, 0) # define write(fd, buf, len) send (fd, (char *) buf, len, 0) @@ -222,6 +217,7 @@ handle_accept_event (int err, gdb_client_data client_data) void remote_prepare (const char *name) { + client_state &cs = get_client_state (); const char *port_str; #ifdef USE_WIN32API static int winsock_initialized; @@ -238,14 +234,14 @@ remote_prepare (const char *name) call to remote_open so start_inferior knows the connection is via stdio. */ remote_is_stdio = 1; - transport_is_reliable = 1; + cs.transport_is_reliable = 1; return; } port_str = strchr (name, ':'); if (port_str == NULL) { - transport_is_reliable = 0; + cs.transport_is_reliable = 0; return; } @@ -280,7 +276,7 @@ remote_prepare (const char *name) || listen (listen_desc, 1)) perror_with_name ("Can't bind address"); - transport_is_reliable = 1; + cs.transport_is_reliable = 1; } /* Open a connection to a remote debugger. @@ -485,9 +481,10 @@ try_rle (char *buf, int remaining, unsigned char *csum, char **p) char * write_ptid (char *buf, ptid_t ptid) { + client_state &cs = get_client_state (); int pid, tid; - if (multi_process) + if (cs.multi_process) { pid = ptid_get_pid (ptid); if (pid < 0) @@ -594,6 +591,7 @@ read_prim (void *buf, int count) static int putpkt_binary_1 (char *buf, int cnt, int is_notif) { + client_state &cs = get_client_state (); int i; unsigned char csum = 0; char *buf2; @@ -631,7 +629,7 @@ putpkt_binary_1 (char *buf, int cnt, int is_notif) return -1; } - if (noack_mode || is_notif) + if (cs.noack_mode || is_notif) { /* Don't expect an ack then. */ if (remote_debug) @@ -851,6 +849,7 @@ static unsigned char *readchar_bufp; static int readchar (void) { + client_state &cs = get_client_state (); int ch; if (readchar_bufcnt == 0) @@ -926,6 +925,7 @@ reschedule (void) int getpkt (char *buf) { + client_state &cs = get_client_state (); char *bp; unsigned char csum, c1, c2; int c; @@ -977,7 +977,7 @@ getpkt (char *buf) if (csum == (c1 << 4) + c2) break; - if (noack_mode) + if (cs.noack_mode) { fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, " @@ -993,7 +993,7 @@ getpkt (char *buf) return -1; } - if (!noack_mode) + if (!cs.noack_mode) { if (remote_debug) { @@ -1081,6 +1081,7 @@ void prepare_resume_reply (char *buf, ptid_t ptid, struct target_waitstatus *status) { + client_state &cs = get_client_state (); if (debug_threads) debug_printf ("Writing resume reply for %s:%d\n", target_pid_to_str (ptid), status->kind); @@ -1100,8 +1101,9 @@ prepare_resume_reply (char *buf, ptid_t ptid, const char **regp; struct regcache *regcache; - if ((status->kind == TARGET_WAITKIND_FORKED && report_fork_events) - || (status->kind == TARGET_WAITKIND_VFORKED && report_vfork_events)) + if ((status->kind == TARGET_WAITKIND_FORKED && cs.report_fork_events) + || (status->kind == TARGET_WAITKIND_VFORKED + && cs.report_vfork_events)) { enum gdb_signal signal = GDB_SIGNAL_TRAP; const char *event = (status->kind == TARGET_WAITKIND_FORKED @@ -1112,13 +1114,14 @@ prepare_resume_reply (char *buf, ptid_t ptid, buf = write_ptid (buf, status->value.related_pid); strcat (buf, ";"); } - else if (status->kind == TARGET_WAITKIND_VFORK_DONE && report_vfork_events) + else if (status->kind == TARGET_WAITKIND_VFORK_DONE + && cs.report_vfork_events) { enum gdb_signal signal = GDB_SIGNAL_TRAP; sprintf (buf, "T%02xvforkdone:;", signal); } - else if (status->kind == TARGET_WAITKIND_EXECD && report_exec_events) + else if (status->kind == TARGET_WAITKIND_EXECD && cs.report_exec_events) { enum gdb_signal signal = GDB_SIGNAL_TRAP; const char *event = "exec"; @@ -1138,7 +1141,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, buf += strlen (buf); } else if (status->kind == TARGET_WAITKIND_THREAD_CREATED - && report_thread_events) + && cs.report_thread_events) { enum gdb_signal signal = GDB_SIGNAL_TRAP; @@ -1186,12 +1189,12 @@ prepare_resume_reply (char *buf, ptid_t ptid, *buf++ = tohex ((addr >> (i - 1) * 4) & 0xf); *buf++ = ';'; } - else if (swbreak_feature && target_stopped_by_sw_breakpoint ()) + else if (cs.swbreak_feature && target_stopped_by_sw_breakpoint ()) { sprintf (buf, "swbreak:;"); buf += strlen (buf); } - else if (hwbreak_feature && target_stopped_by_hw_breakpoint ()) + else if (cs.hwbreak_feature && target_stopped_by_hw_breakpoint ()) { sprintf (buf, "hwbreak:;"); buf += strlen (buf); @@ -1219,13 +1222,13 @@ prepare_resume_reply (char *buf, ptid_t ptid, in GDB will claim this event belongs to inferior_ptid if we do not specify a thread, and there's no way for gdbserver to know what inferior_ptid is. */ - if (1 || !ptid_equal (general_thread, ptid)) + if (1 || !ptid_equal (cs.general_thread, ptid)) { int core = -1; /* In non-stop, don't change the general thread behind GDB's back. */ if (!non_stop) - general_thread = ptid; + cs.general_thread = ptid; sprintf (buf, "thread:"); buf += strlen (buf); buf = write_ptid (buf, ptid); @@ -1256,14 +1259,14 @@ prepare_resume_reply (char *buf, ptid_t ptid, } break; case TARGET_WAITKIND_EXITED: - if (multi_process) + if (cs.multi_process) sprintf (buf, "W%x;process:%x", status->value.integer, ptid_get_pid (ptid)); else sprintf (buf, "W%02x", status->value.integer); break; case TARGET_WAITKIND_SIGNALLED: - if (multi_process) + if (cs.multi_process) sprintf (buf, "X%x;process:%x", status->value.sig, ptid_get_pid (ptid)); else @@ -1435,6 +1438,7 @@ clear_symbol_cache (struct sym_cache **symcache_p) int look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb) { + client_state &cs = get_client_state (); char *p, *q; int len; struct sym_cache *sym; @@ -1456,14 +1460,14 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb) return 0; /* Send the request. */ - strcpy (own_buf, "qSymbol:"); - bin2hex ((const gdb_byte *) name, own_buf + strlen ("qSymbol:"), + strcpy (cs.own_buf, "qSymbol:"); + bin2hex ((const gdb_byte *) name, cs.own_buf + strlen ("qSymbol:"), strlen (name)); - if (putpkt (own_buf) < 0) + if (putpkt (cs.own_buf) < 0) return -1; /* FIXME: Eventually add buffer overflow checking (to getpkt?) */ - len = getpkt (own_buf); + len = getpkt (cs.own_buf); if (len < 0) return -1; @@ -1474,45 +1478,45 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb) while it figures out the address of the symbol. */ while (1) { - if (own_buf[0] == 'm') + if (cs.own_buf[0] == 'm') { CORE_ADDR mem_addr; unsigned char *mem_buf; unsigned int mem_len; - decode_m_packet (&own_buf[1], &mem_addr, &mem_len); + decode_m_packet (&cs.own_buf[1], &mem_addr, &mem_len); mem_buf = (unsigned char *) xmalloc (mem_len); if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0) - bin2hex (mem_buf, own_buf, mem_len); + bin2hex (mem_buf, cs.own_buf, mem_len); else - write_enn (own_buf); + write_enn (cs.own_buf); free (mem_buf); - if (putpkt (own_buf) < 0) + if (putpkt (cs.own_buf) < 0) return -1; } - else if (own_buf[0] == 'v') + else if (cs.own_buf[0] == 'v') { int new_len = -1; - handle_v_requests (own_buf, len, &new_len); + handle_v_requests (cs.own_buf, len, &new_len); if (new_len != -1) - putpkt_binary (own_buf, new_len); + putpkt_binary (cs.own_buf, new_len); else - putpkt (own_buf); + putpkt (cs.own_buf); } else break; - len = getpkt (own_buf); + len = getpkt (cs.own_buf); if (len < 0) return -1; } - if (!startswith (own_buf, "qSymbol:")) + if (!startswith (cs.own_buf, "qSymbol:")) { - warning ("Malformed response to qSymbol, ignoring: %s\n", own_buf); + warning ("Malformed response to qSymbol, ignoring: %s\n", cs.own_buf); return -1; } - p = own_buf + strlen ("qSymbol:"); + p = cs.own_buf + strlen ("qSymbol:"); q = p; while (*q && *q != ':') q++; @@ -1548,17 +1552,18 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp, int may_ask_gdb) int relocate_instruction (CORE_ADDR *to, CORE_ADDR oldloc) { + client_state &cs = get_client_state (); int len; ULONGEST written = 0; /* Send the request. */ - sprintf (own_buf, "qRelocInsn:%s;%s", paddress (oldloc), + sprintf (cs.own_buf, "qRelocInsn:%s;%s", paddress (oldloc), paddress (*to)); - if (putpkt (own_buf) < 0) + if (putpkt (cs.own_buf) < 0) return -1; /* FIXME: Eventually add buffer overflow checking (to getpkt?) */ - len = getpkt (own_buf); + len = getpkt (cs.own_buf); if (len < 0) return -1; @@ -1566,61 +1571,61 @@ relocate_instruction (CORE_ADDR *to, CORE_ADDR oldloc) wait for the qRelocInsn "response". That requires re-entering the main loop. For now, this is an adequate approximation; allow GDB to access memory. */ - while (own_buf[0] == 'm' || own_buf[0] == 'M' || own_buf[0] == 'X') + while (cs.own_buf[0] == 'm' || cs.own_buf[0] == 'M' || cs.own_buf[0] == 'X') { CORE_ADDR mem_addr; unsigned char *mem_buf = NULL; unsigned int mem_len; - if (own_buf[0] == 'm') + if (cs.own_buf[0] == 'm') { - decode_m_packet (&own_buf[1], &mem_addr, &mem_len); + decode_m_packet (&cs.own_buf[1], &mem_addr, &mem_len); mem_buf = (unsigned char *) xmalloc (mem_len); if (read_inferior_memory (mem_addr, mem_buf, mem_len) == 0) - bin2hex (mem_buf, own_buf, mem_len); + bin2hex (mem_buf, cs.own_buf, mem_len); else - write_enn (own_buf); + write_enn (cs.own_buf); } - else if (own_buf[0] == 'X') + else if (cs.own_buf[0] == 'X') { - if (decode_X_packet (&own_buf[1], len - 1, &mem_addr, + if (decode_X_packet (&cs.own_buf[1], len - 1, &mem_addr, &mem_len, &mem_buf) < 0 || write_inferior_memory (mem_addr, mem_buf, mem_len) != 0) - write_enn (own_buf); + write_enn (cs.own_buf); else - write_ok (own_buf); + write_ok (cs.own_buf); } else { - decode_M_packet (&own_buf[1], &mem_addr, &mem_len, &mem_buf); + decode_M_packet (&cs.own_buf[1], &mem_addr, &mem_len, &mem_buf); if (write_inferior_memory (mem_addr, mem_buf, mem_len) == 0) - write_ok (own_buf); + write_ok (cs.own_buf); else - write_enn (own_buf); + write_enn (cs.own_buf); } free (mem_buf); - if (putpkt (own_buf) < 0) + if (putpkt (cs.own_buf) < 0) return -1; - len = getpkt (own_buf); + len = getpkt (cs.own_buf); if (len < 0) return -1; } - if (own_buf[0] == 'E') + if (cs.own_buf[0] == 'E') { warning ("An error occurred while relocating an instruction: %s\n", - own_buf); + cs.own_buf); return -1; } - if (!startswith (own_buf, "qRelocInsn:")) + if (!startswith (cs.own_buf, "qRelocInsn:")) { warning ("Malformed response to qRelocInsn, ignoring: %s\n", - own_buf); + cs.own_buf); return -1; } - unpack_varlen_hex (own_buf + strlen ("qRelocInsn:"), &written); + unpack_varlen_hex (cs.own_buf + strlen ("qRelocInsn:"), &written); *to += written; return 0; |