int server_waiting;
-static int extended_protocol;
+int extended_protocol;
static int response_needed;
static int exit_requested;
last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
- if (last_status.kind != TARGET_WAITKIND_STOPPED)
- return signal_pid;
-
- do
+ if (last_status.kind == TARGET_WAITKIND_STOPPED)
{
- (*the_target->resume) (&resume_info, 1);
+ do
+ {
+ (*the_target->resume) (&resume_info, 1);
- last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
- if (last_status.kind != TARGET_WAITKIND_STOPPED)
- return signal_pid;
+ last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
+ if (last_status.kind != TARGET_WAITKIND_STOPPED)
+ break;
- current_thread->last_resume_kind = resume_stop;
- current_thread->last_status = last_status;
+ current_thread->last_resume_kind = resume_stop;
+ current_thread->last_status = last_status;
+ }
+ while (last_status.value.sig != GDB_SIGNAL_TRAP);
}
- while (last_status.value.sig != GDB_SIGNAL_TRAP);
-
+ target_arch_setup ();
return signal_pid;
}
(assuming success). */
last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0);
+ target_arch_setup ();
+
if (last_status.kind != TARGET_WAITKIND_EXITED
&& last_status.kind != TARGET_WAITKIND_SIGNALLED)
{
else
buf[0] = 'l';
- return remote_escape_output (data, len, (unsigned char *) buf + 1, &out_len,
- PBUFSIZ - 2) + 1;
+ return remote_escape_output (data, len, 1, (unsigned char *) buf + 1,
+ &out_len, PBUFSIZ - 2) + 1;
}
/* Handle btrace enabling in BTS format. */
return NULL;
}
+/* Handle btrace enabling in Intel(R) Processor Trace format. */
+
+static const char *
+handle_btrace_enable_pt (struct thread_info *thread)
+{
+ if (thread->btrace != NULL)
+ return "E.Btrace already enabled.";
+
+ current_btrace_conf.format = BTRACE_FORMAT_PT;
+ thread->btrace = target_enable_btrace (thread->entry.id,
+ ¤t_btrace_conf);
+ if (thread->btrace == NULL)
+ return "E.Could not enable btrace.";
+
+ return NULL;
+}
+
/* Handle btrace disabling. */
static const char *
if (strcmp (op, "bts") == 0)
err = handle_btrace_enable_bts (thread);
+ else if (strcmp (op, "pt") == 0)
+ err = handle_btrace_enable_pt (thread);
else if (strcmp (op, "off") == 0)
err = handle_btrace_disable (thread);
else
- err = "E.Bad Qbtrace operation. Use bts or off.";
+ err = "E.Bad Qbtrace operation. Use bts, pt, or off.";
if (err != 0)
strcpy (own_buf, err);
current_btrace_conf.bts.size = (unsigned int) size;
}
+ else if (strncmp (op, "pt:size=", strlen ("pt:size=")) == 0)
+ {
+ unsigned long size;
+ char *endp = NULL;
+
+ errno = 0;
+ size = strtoul (op + strlen ("pt:size="), &endp, 16);
+ if (endp == NULL || *endp != 0 || errno != 0 || size > UINT_MAX)
+ {
+ strcpy (own_buf, "E.Bad size value.");
+ return -1;
+ }
+
+ current_btrace_conf.pt.size = (unsigned int) size;
+ }
else
{
strcpy (own_buf, "E.Bad Qbtrace configuration option.");
res = prepare_to_access_memory ();
if (res == 0)
{
- res = read_inferior_memory (memaddr, myaddr, len);
+ if (set_desired_thread (1))
+ res = read_inferior_memory (memaddr, myaddr, len);
+ else
+ res = 1;
done_accessing_memory ();
return res == 0 ? len : -1;
ret = prepare_to_access_memory ();
if (ret == 0)
{
- ret = write_inferior_memory (memaddr, myaddr, len);
+ if (set_desired_thread (1))
+ ret = write_inferior_memory (memaddr, myaddr, len);
+ else
+ ret = EIO;
done_accessing_memory ();
}
return ret;
if (the_target->read_auxv == NULL || writebuf != NULL)
return -2;
- if (annex[0] != '\0' || !target_running ())
+ if (annex[0] != '\0' || current_thread == NULL)
return -1;
return (*the_target->read_auxv) (offset, readbuf, len);
if (writebuf != NULL)
return -2;
- if (annex[0] != '\0' || !target_running ())
+ if (annex[0] != '\0' || current_thread == NULL)
return -1;
total_len = 64;
if (document == NULL)
return -1;
- strcpy (document, "<library-list>\n");
+ strcpy (document, "<library-list version=\"1.0\">\n");
p = document + strlen (document);
for_each_inferior_with_data (&all_dlls, emit_dll_description, &p);
if (writebuf != NULL)
return -2;
- if (!target_running () || the_target->qxfer_libraries_svr4 == NULL)
+ if (current_thread == NULL || the_target->qxfer_libraries_svr4 == NULL)
return -1;
return the_target->qxfer_libraries_svr4 (annex, readbuf, writebuf, offset, len);
if (the_target->qxfer_siginfo == NULL)
return -2;
- if (annex[0] != '\0' || !target_running ())
+ if (annex[0] != '\0' || current_thread == NULL)
return -1;
return (*the_target->qxfer_siginfo) (annex, readbuf, writebuf, offset, len);
if (the_target->qxfer_spu == NULL)
return -2;
- if (!target_running ())
+ if (current_thread == NULL)
return -1;
return (*the_target->qxfer_spu) (annex, readbuf, writebuf, offset, len);
if (writebuf != NULL)
return -2;
- if (annex[0] != '\0' || !target_running () || current_traceframe == -1)
+ if (annex[0] != '\0' || current_thread == NULL || current_traceframe == -1)
return -1;
if (traceframe_read_sdata (current_traceframe, offset,
if (writebuf != NULL)
return -2;
- if (!target_running () || annex[0] != '\0')
+ if (annex[0] != '\0')
return -1;
if (offset == 0)
if (the_target->read_loadmap == NULL)
return -2;
- if (!target_running ())
+ if (current_thread == NULL)
return -1;
return (*the_target->read_loadmap) (annex, offset, readbuf, len);
if (the_target->read_btrace == NULL || writebuf != NULL)
return -2;
- if (!target_running ())
- return -1;
-
if (ptid_equal (general_thread, null_ptid)
|| ptid_equal (general_thread, minus_one_ptid))
{
if (the_target->read_btrace_conf == NULL || writebuf != NULL)
return -2;
- if (annex[0] != '\0' || !target_running ())
+ if (annex[0] != '\0')
return -1;
if (ptid_equal (general_thread, null_ptid)
static void
supported_btrace_packets (char *buf)
{
+ int btrace_supported = 0;
+
if (target_supports_btrace (BTRACE_FORMAT_BTS))
{
strcat (buf, ";Qbtrace:bts+");
strcat (buf, ";Qbtrace-conf:bts:size+");
+
+ btrace_supported = 1;
}
- else
+
+ if (target_supports_btrace (BTRACE_FORMAT_PT))
+ {
+ strcat (buf, ";Qbtrace:pt+");
+ strcat (buf, ";Qbtrace-conf:pt:size+");
+
+ btrace_supported = 1;
+ }
+
+ if (!btrace_supported)
return;
strcat (buf, ";Qbtrace:off+");
if (target_supports_tracepoints ())
tracepoint_look_up_symbols ();
- if (target_running () && the_target->look_up_symbols != NULL)
+ if (current_thread != NULL && the_target->look_up_symbols != NULL)
(*the_target->look_up_symbols) ();
strcpy (own_buf, "OK");
if (the_target->pid_to_exec_file != NULL)
strcat (own_buf, ";qXfer:exec-file:read+");
- /* Reinitialize the target as needed for the new connection. */
+ /* Reinitialize components as needed for the new connection. */
+ hostio_handle_new_gdb_connection ();
target_handle_new_gdb_connection ();
return;
if (i < n)
resume_info[i] = default_action;
- set_desired_thread (0);
-
resume (resume_info, n);
free (resume_info);
return;
int n = 0;
int valid_cont_thread;
- set_desired_thread (0);
-
valid_cont_thread = (!ptid_equal (cont_thread, null_ptid)
&& !ptid_equal (cont_thread, minus_one_ptid));
}
CATCH (exception, RETURN_MASK_ERROR)
{
+ fflush (stdout);
+ fprintf (stderr, "gdbserver: %s\n", exception.message);
+
if (response_needed)
{
write_enn (own_buf);
putpkt (own_buf);
}
+
+ if (run_once)
+ throw_quit ("Quit");
}
END_CATCH
}
(struct thread_info *) find_inferior_id (&all_threads,
general_thread);
if (thread == NULL)
- {
- thread = get_first_thread ();
- thread_id = thread->entry.id;
- }
+ thread = get_first_thread ();
+ thread_id = thread->entry.id;
}
general_thread = thread_id;
set_desired_thread (1);
+ gdb_assert (current_thread != NULL);
}
else if (own_buf[1] == 'c')
cont_thread = thread_id;
{
struct regcache *regcache;
- set_desired_thread (1);
- regcache = get_thread_regcache (current_thread, 1);
- registers_to_string (regcache, own_buf);
+ if (!set_desired_thread (1))
+ write_enn (own_buf);
+ else
+ {
+ regcache = get_thread_regcache (current_thread, 1);
+ registers_to_string (regcache, own_buf);
+ }
}
break;
case 'G':
{
struct regcache *regcache;
- set_desired_thread (1);
- regcache = get_thread_regcache (current_thread, 1);
- registers_from_string (regcache, &own_buf[1]);
- write_ok (own_buf);
+ if (!set_desired_thread (1))
+ write_enn (own_buf);
+ else
+ {
+ regcache = get_thread_regcache (current_thread, 1);
+ registers_from_string (regcache, &own_buf[1]);
+ write_ok (own_buf);
+ }
}
break;
case 'm':
/* Wait till we are at 1st instruction in prog. */
if (program_argv != NULL)
- start_inferior (program_argv);
+ {
+ start_inferior (program_argv);
+ if (last_status.kind == TARGET_WAITKIND_STOPPED)
+ {
+ /* Stopped at the first instruction of the target
+ process. */
+ general_thread = last_ptid;
+ }
+ else
+ {
+ /* Something went wrong. */
+ general_thread = null_ptid;
+ }
+ }
else
{
last_status.kind = TARGET_WAITKIND_EXITED;