X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Fserver.c;h=a425fbaa013702b727e2d7c94d630a1e957adaf2;hb=d9fa87f4f6e732f5feb41f2fa7dc6faddb1fb627;hp=36510ad1b2f1af84f3c67f6b65458aba3baeaf1f;hpb=aeb2e706e1b9c491d20c88c8ead1ae9df9cee04a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 36510ad1b2..a425fbaa01 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -18,32 +18,35 @@ #include "server.h" #include "gdbthread.h" -#include "common/agent.h" +#include "gdbsupport/agent.h" #include "notif.h" #include "tdesc.h" -#include "common/rsp-low.h" -#include "common/signals-state-save-restore.h" +#include "gdbsupport/rsp-low.h" +#include "gdbsupport/signals-state-save-restore.h" #include #include #if HAVE_SIGNAL_H #include #endif -#include "common/gdb_vecs.h" -#include "common/gdb_wait.h" -#include "common/btrace-common.h" -#include "common/filestuff.h" +#include "gdbsupport/gdb_vecs.h" +#include "gdbsupport/gdb_wait.h" +#include "gdbsupport/btrace-common.h" +#include "gdbsupport/filestuff.h" #include "tracepoint.h" #include "dll.h" #include "hostio.h" #include -#include "common/common-inferior.h" -#include "common/job-control.h" -#include "common/environ.h" +#include "gdbsupport/common-inferior.h" +#include "gdbsupport/job-control.h" +#include "gdbsupport/environ.h" #include "filenames.h" -#include "common/pathstuff.h" +#include "gdbsupport/pathstuff.h" +#ifdef USE_XML +#include "xml-builtin.h" +#endif -#include "common/selftest.h" -#include "common/scope-exit.h" +#include "gdbsupport/selftest.h" +#include "gdbsupport/scope-exit.h" #define require_running_or_return(BUF) \ if (!target_running ()) \ @@ -67,25 +70,19 @@ char *current_directory; static gdb_environ our_environ; -/* Start the inferior using a shell. */ - -/* We always try to start the inferior using a shell. */ +bool server_waiting; -int startup_with_shell = 1; - -int server_waiting; - -static int extended_protocol; -static int response_needed; -static int exit_requested; +static bool extended_protocol; +static bool response_needed; +static bool exit_requested; /* --once: Exit after the first connection has closed. */ -int run_once; +bool run_once; -/* Whether to report TARGET_WAITKING_NO_RESUMED events. */ -static int report_no_resumed; +/* Whether to report TARGET_WAITKIND_NO_RESUMED events. */ +static bool report_no_resumed; -int non_stop; +bool non_stop; static struct { /* Set the PROGRAM_PATH. Here we adjust the path of the provided @@ -129,10 +126,10 @@ unsigned long signal_pid; /* Set if you want to disable optional thread related packets support in gdbserver, for the sake of testing GDB against stubs that don't support them. */ -int disable_packet_vCont; -int disable_packet_Tthread; -int disable_packet_qC; -int disable_packet_qfThreadInfo; +bool disable_packet_vCont; +bool disable_packet_Tthread; +bool disable_packet_qC; +bool disable_packet_qfThreadInfo; static unsigned char *mem_buf; @@ -140,10 +137,8 @@ static unsigned char *mem_buf; relative to a single stop reply. We keep a queue of these to push to GDB in non-stop mode. */ -struct vstop_notif +struct vstop_notif : public notif_event { - struct notif_event base; - /* Thread or process that got the event. */ ptid_t ptid; @@ -155,8 +150,6 @@ struct vstop_notif btrace configuration. */ static struct btrace_config current_btrace_conf; -DEFINE_QUEUE_P (notif_event_p); - /* The client remote protocol state. */ static client_state g_client_state; @@ -174,32 +167,20 @@ get_client_state () static void queue_stop_reply (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = ptid; new_notif->status = *status; - notif_event_enque (¬if_stop, (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } -static int -remove_all_on_match_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +remove_all_on_match_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; - if (vstop_event->ptid.matches (filter_ptid)) - { - if (q->free_func != NULL) - q->free_func (event); - - QUEUE_remove_elem (notif_event_p, q, iter); - } - - return 1; + return vstop_event->ptid.matches (filter_ptid); } /* See server.h. */ @@ -207,8 +188,19 @@ remove_all_on_match_ptid (QUEUE (notif_event_p) *q, void discard_queued_stop_replies (ptid_t ptid) { - QUEUE_iterate (notif_event_p, notif_stop.queue, - remove_all_on_match_ptid, &ptid); + std::list::iterator iter, next, end; + end = notif_stop.queue.end (); + for (iter = notif_stop.queue.begin (); iter != end; iter = next) + { + next = iter; + ++next; + + if (remove_all_on_match_ptid (*iter, ptid)) + { + delete *iter; + notif_stop.queue.erase (iter); + } + } } static void @@ -219,27 +211,23 @@ vstop_notif_reply (struct notif_event *event, char *own_buf) prepare_resume_reply (own_buf, vstop->ptid, &vstop->status); } -/* QUEUE_iterate callback helper for in_queued_stop_replies. */ +/* Helper for in_queued_stop_replies. */ -static int -in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +in_queued_stop_replies_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; if (vstop_event->ptid.matches (filter_ptid)) - return 0; + return true; /* Don't resume fork children that GDB does not know about yet. */ if ((vstop_event->status.kind == TARGET_WAITKIND_FORKED || vstop_event->status.kind == TARGET_WAITKIND_VFORKED) && vstop_event->status.value.related_pid.matches (filter_ptid)) - return 0; + return true; - return 1; + return false; } /* See server.h. */ @@ -247,13 +235,18 @@ in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, int in_queued_stop_replies (ptid_t ptid) { - return !QUEUE_iterate (notif_event_p, notif_stop.queue, - in_queued_stop_replies_ptid, &ptid); + for (notif_event *event : notif_stop.queue) + { + if (in_queued_stop_replies_ptid (event, ptid)) + return true; + } + + return false; } struct notif_server notif_stop = { - "vStopped", "Stop", NULL, vstop_notif_reply, + "vStopped", "Stop", {}, vstop_notif_reply, }; static int @@ -262,7 +255,7 @@ target_running (void) return get_first_thread () != NULL; } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ const char * get_exec_wrapper () @@ -270,9 +263,9 @@ get_exec_wrapper () return !wrapper_argv.empty () ? wrapper_argv.c_str () : NULL; } -/* See common/common-inferior.h. */ +/* See gdbsupport/common-inferior.h. */ -char * +const char * get_exec_file (int err) { if (err && program_path.get () == NULL) @@ -754,7 +747,7 @@ handle_general_set (char *own_buf) return; } - non_stop = req; + non_stop = (req != 0); if (remote_debug) debug_printf ("[%s mode enabled]\n", req_str); @@ -930,7 +923,6 @@ get_features_xml (const char *annex) #ifdef USE_XML { - extern const char *const xml_builtin[][2]; int i; /* Look for the annex. */ @@ -1030,7 +1022,7 @@ gdb_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len) if (ret == 0) { if (set_desired_thread ()) - ret = write_inferior_memory (memaddr, myaddr, len); + ret = target_write_memory (memaddr, myaddr, len); else ret = EIO; done_accessing_memory (); @@ -1241,7 +1233,7 @@ handle_detach (char *own_buf) if (debug_threads) debug_printf ("Forcing non-stop mode\n"); - non_stop = 1; + non_stop = true; start_non_stop (1); } @@ -1410,7 +1402,7 @@ handle_monitor_command (char *mon, char *own_buf) else if (strcmp (mon, "help") == 0) monitor_show_help (); else if (strcmp (mon, "exit") == 0) - exit_requested = 1; + exit_requested = true; else { monitor_output ("Unknown monitor command.\n\n"); @@ -1617,22 +1609,6 @@ handle_qxfer_siginfo (const char *annex, return (*the_target->qxfer_siginfo) (annex, readbuf, writebuf, offset, len); } -/* Handle qXfer:spu:read and qXfer:spu:write. */ - -static int -handle_qxfer_spu (const char *annex, - gdb_byte *readbuf, const gdb_byte *writebuf, - ULONGEST offset, LONGEST len) -{ - if (the_target->qxfer_spu == NULL) - return -2; - - if (current_thread == NULL) - return -1; - - return (*the_target->qxfer_spu) (annex, readbuf, writebuf, offset, len); -} - /* Handle qXfer:statictrace:read. */ static int @@ -1989,7 +1965,6 @@ static const struct qxfer qxfer_packets[] = { "libraries-svr4", handle_qxfer_libraries_svr4 }, { "osdata", handle_qxfer_osdata }, { "siginfo", handle_qxfer_siginfo }, - { "spu", handle_qxfer_spu }, { "statictrace", handle_qxfer_statictrace }, { "threads", handle_qxfer_threads }, { "traceframe-info", handle_qxfer_traceframe_info }, @@ -2293,9 +2268,10 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) /* Two passes, to avoid nested strtok calls in target_process_qsupported. */ - for (p = strtok (p + 1, ";"); + char *saveptr; + for (p = strtok_r (p + 1, ";", &saveptr); p != NULL; - p = strtok (NULL, ";")) + p = strtok_r (NULL, ";", &saveptr)) { count++; qsupported = XRESIZEVEC (char *, qsupported, count); @@ -2358,7 +2334,7 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) { /* GDB supports and wants TARGET_WAITKIND_NO_RESUMED events. */ - report_no_resumed = 1; + report_no_resumed = true; } else { @@ -2401,9 +2377,6 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) if (the_target->read_auxv != NULL) strcat (own_buf, ";qXfer:auxv:read+"); - if (the_target->qxfer_spu != NULL) - strcat (own_buf, ";qXfer:spu:read+;qXfer:spu:write+"); - if (the_target->qxfer_siginfo != NULL) strcat (own_buf, ";qXfer:siginfo:read+;qXfer:siginfo:write+"); @@ -3247,14 +3220,13 @@ queue_stop_reply_callback (thread_info *thread) manage the thread's last_status field. */ if (the_target->thread_stopped == NULL) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = thread->id; new_notif->status = thread->last_status; /* Pass the last stop reply back to GDB, but don't notify yet. */ - notif_event_enque (¬if_stop, - (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } else { @@ -3662,27 +3634,26 @@ captured_main (int argc, char *argv[]) } else if (startswith (*next_arg, "--disable-packet=")) { - char *packets, *tok; - - packets = *next_arg += sizeof ("--disable-packet=") - 1; - for (tok = strtok (packets, ","); + char *packets = *next_arg += sizeof ("--disable-packet=") - 1; + char *saveptr; + for (char *tok = strtok_r (packets, ",", &saveptr); tok != NULL; - tok = strtok (NULL, ",")) + tok = strtok_r (NULL, ",", &saveptr)) { if (strcmp ("vCont", tok) == 0) - disable_packet_vCont = 1; + disable_packet_vCont = true; else if (strcmp ("Tthread", tok) == 0) - disable_packet_Tthread = 1; + disable_packet_Tthread = true; else if (strcmp ("qC", tok) == 0) - disable_packet_qC = 1; + disable_packet_qC = true; else if (strcmp ("qfThreadInfo", tok) == 0) - disable_packet_qfThreadInfo = 1; + disable_packet_qfThreadInfo = true; else if (strcmp ("threads", tok) == 0) { - disable_packet_vCont = 1; - disable_packet_Tthread = 1; - disable_packet_qC = 1; - disable_packet_qfThreadInfo = 1; + disable_packet_vCont = true; + disable_packet_Tthread = true; + disable_packet_qC = true; + disable_packet_qfThreadInfo = true; } else { @@ -3710,7 +3681,7 @@ captured_main (int argc, char *argv[]) else if (strcmp (*next_arg, "--no-startup-with-shell") == 0) startup_with_shell = false; else if (strcmp (*next_arg, "--once") == 0) - run_once = 1; + run_once = true; else if (strcmp (*next_arg, "--selftest") == 0) selftest = true; else if (startswith (*next_arg, "--selftest=")) @@ -3789,7 +3760,6 @@ captured_main (int argc, char *argv[]) initialize_event_loop (); if (target_supports_tracepoints ()) initialize_tracepoint (); - initialize_notif (); mem_buf = (unsigned char *) xmalloc (PBUFSIZ); @@ -3808,7 +3778,7 @@ captured_main (int argc, char *argv[]) int i, n; n = argc - (next_arg - argv); - program_path.set (gdb::unique_xmalloc_ptr (xstrdup (next_arg[0]))); + program_path.set (make_unique_xstrdup (next_arg[0])); for (i = 1; i < n; i++) program_args.push_back (xstrdup (next_arg[i])); program_args.push_back (NULL); @@ -4042,7 +4012,7 @@ process_serial_event (void) disable_async_io (); - response_needed = 0; + response_needed = false; packet_len = getpkt (cs.own_buf); if (packet_len <= 0) { @@ -4050,7 +4020,7 @@ process_serial_event (void) /* Force an event loop break. */ return -1; } - response_needed = 1; + response_needed = true; char ch = cs.own_buf[0]; switch (ch) @@ -4065,7 +4035,7 @@ process_serial_event (void) handle_detach (cs.own_buf); break; case '!': - extended_protocol = 1; + extended_protocol = true; write_ok (cs.own_buf); break; case '?': @@ -4280,7 +4250,7 @@ process_serial_event (void) break; } case 'k': - response_needed = 0; + response_needed = false; if (!target_running ()) /* The packet we received doesn't make sense - but we can't reply to it, either. */ @@ -4319,7 +4289,7 @@ process_serial_event (void) } break; case 'R': - response_needed = 0; + response_needed = false; /* Restarting the inferior is only supported in the extended protocol. */ @@ -4380,7 +4350,7 @@ process_serial_event (void) else putpkt (cs.own_buf); - response_needed = 0; + response_needed = false; if (exit_requested) return -1; @@ -4412,12 +4382,12 @@ handle_serial_event (int err, gdb_client_data client_data) static void push_stop_notification (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *vstop_notif = XNEW (struct vstop_notif); + struct vstop_notif *vstop_notif = new struct vstop_notif; vstop_notif->status = *status; vstop_notif->ptid = ptid; /* Push Stop notification. */ - notif_push (¬if_stop, (struct notif_event *) vstop_notif); + notif_push (¬if_stop, vstop_notif); } /* Event-loop callback for target events. */