2004-02-25 Roland McGrath <roland@redhat.com>

* remote.c (remote_protocol_qPart_auxv): New variable.
	(init_all_packet_configs): Initialize it.
	(set_remote_protocol_qPart_auxv_packet_cmd): New function.
	(show_remote_protocol_qPart_auxv_packet_cmd): New function.
	(show_remote_cmd): Call it.
	(_initialize_remote): Initialize commands.
	(remote_xfer_partial): If enabled, use qPart:auxv:read:... query to
	service TARGET_OBJECT_AUXV requests.
This commit is contained in:
Roland McGrath 2004-02-25 20:41:00 +00:00
parent 66745969b0
commit 802188a76c
1 changed files with 117 additions and 56 deletions

View File

@ -292,7 +292,7 @@ init_remote_state (struct gdbarch *gdbarch)
little. */ little. */
if (rs->sizeof_g_packet > ((rs->remote_packet_size - 32) / 2)) if (rs->sizeof_g_packet > ((rs->remote_packet_size - 32) / 2))
rs->remote_packet_size = (rs->sizeof_g_packet * 2 + 32); rs->remote_packet_size = (rs->sizeof_g_packet * 2 + 32);
/* This one is filled in when a ``g'' packet is received. */ /* This one is filled in when a ``g'' packet is received. */
rs->actual_register_packet_size = 0; rs->actual_register_packet_size = 0;
@ -790,7 +790,7 @@ show_remote_protocol_e_packet_cmd (char *args, int from_tty,
{ {
show_packet_config_cmd (&remote_protocol_e); show_packet_config_cmd (&remote_protocol_e);
} }
/* Should we try the 'E' (step over range / w signal #) request? */ /* Should we try the 'E' (step over range / w signal #) request? */
static struct packet_config remote_protocol_E; static struct packet_config remote_protocol_E;
@ -808,7 +808,7 @@ show_remote_protocol_E_packet_cmd (char *args, int from_tty,
{ {
show_packet_config_cmd (&remote_protocol_E); show_packet_config_cmd (&remote_protocol_E);
} }
/* Should we try the 'P' (set register) request? */ /* Should we try the 'P' (set register) request? */
@ -960,7 +960,7 @@ static struct packet_config remote_protocol_binary_download;
This variable (NOT available to the user: auto-detect only!) This variable (NOT available to the user: auto-detect only!)
determines whether GDB will use the new, simpler "ThreadInfo" determines whether GDB will use the new, simpler "ThreadInfo"
query or the older, more complex syntax for thread queries. query or the older, more complex syntax for thread queries.
This is an auto-detect variable (set to true at each connect, This is an auto-detect variable (set to true at each connect,
and set to false when the target fails to recognize it). */ and set to false when the target fails to recognize it). */
static int use_threadinfo_query; static int use_threadinfo_query;
@ -981,6 +981,23 @@ show_remote_protocol_binary_download_cmd (char *args, int from_tty,
show_packet_config_cmd (&remote_protocol_binary_download); show_packet_config_cmd (&remote_protocol_binary_download);
} }
/* Should we try the 'qPart:auxv' (target auxiliary vector read) request? */
static struct packet_config remote_protocol_qPart_auxv;
static void
set_remote_protocol_qPart_auxv_packet_cmd (char *args, int from_tty,
struct cmd_list_element *c)
{
update_packet_config (&remote_protocol_qPart_auxv);
}
static void
show_remote_protocol_qPart_auxv_packet_cmd (char *args, int from_tty,
struct cmd_list_element *c)
{
show_packet_config_cmd (&remote_protocol_qPart_auxv);
}
/* Tokens for use by the asynchronous signal handlers for SIGINT */ /* Tokens for use by the asynchronous signal handlers for SIGINT */
static void *sigint_remote_twice_token; static void *sigint_remote_twice_token;
@ -1455,7 +1472,7 @@ pack_threadinfo_request (char *pkt, int mode, threadref *id)
fetch registers and its stack */ fetch registers and its stack */
#define TAG_DISPLAY 4 /* A short thing maybe to put on a window */ #define TAG_DISPLAY 4 /* A short thing maybe to put on a window */
#define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */ #define TAG_THREADNAME 8 /* string, maps 1-to-1 with a thread is */
#define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about #define TAG_MOREDISPLAY 16 /* Whatever the kernel wants to say about
the process */ the process */
static int static int
@ -1743,8 +1760,8 @@ remote_current_thread (ptid_t oldpid)
return oldpid; return oldpid;
} }
/* Find new threads for info threads command. /* Find new threads for info threads command.
* Original version, using John Metzler's thread protocol. * Original version, using John Metzler's thread protocol.
*/ */
static void static void
@ -1780,7 +1797,7 @@ remote_threads_info (void)
bufp = buf; bufp = buf;
getpkt (bufp, (rs->remote_packet_size), 0); getpkt (bufp, (rs->remote_packet_size), 0);
if (bufp[0] != '\0') /* q packet recognized */ if (bufp[0] != '\0') /* q packet recognized */
{ {
while (*bufp++ == 'm') /* reply contains one or more TID */ while (*bufp++ == 'm') /* reply contains one or more TID */
{ {
do do
@ -1804,12 +1821,12 @@ remote_threads_info (void)
return; return;
} }
/* /*
* Collect a descriptive string about the given thread. * Collect a descriptive string about the given thread.
* The target may say anything it wants to about the thread * The target may say anything it wants to about the thread
* (typically info about its blocked / runnable state, name, etc.). * (typically info about its blocked / runnable state, name, etc.).
* This string will appear in the info threads display. * This string will appear in the info threads display.
* *
* Optional: targets are not required to implement this function. * Optional: targets are not required to implement this function.
*/ */
@ -1969,9 +1986,9 @@ get_offsets (void)
if (symfile_objfile == NULL) if (symfile_objfile == NULL)
return; return;
offs = ((struct section_offsets *) offs = ((struct section_offsets *)
alloca (SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections))); alloca (SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)));
memcpy (offs, symfile_objfile->section_offsets, memcpy (offs, symfile_objfile->section_offsets,
SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections)); SIZEOF_N_SECTION_OFFSETS (symfile_objfile->num_sections));
offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr; offs->offsets[SECT_OFF_TEXT (symfile_objfile)] = text_addr;
@ -2070,6 +2087,7 @@ init_all_packet_configs (void)
/* Force remote_write_bytes to check whether target supports binary /* Force remote_write_bytes to check whether target supports binary
downloading. */ downloading. */
update_packet_config (&remote_protocol_binary_download); update_packet_config (&remote_protocol_binary_download);
update_packet_config (&remote_protocol_qPart_auxv);
} }
/* Symbol look-up. */ /* Symbol look-up. */
@ -2103,7 +2121,7 @@ remote_check_symbols (struct objfile *objfile)
if (sym == NULL) if (sym == NULL)
sprintf (msg, "qSymbol::%s", &reply[8]); sprintf (msg, "qSymbol::%s", &reply[8]);
else else
sprintf (msg, "qSymbol:%s:%s", sprintf (msg, "qSymbol:%s:%s",
paddr_nz (SYMBOL_VALUE_ADDRESS (sym)), paddr_nz (SYMBOL_VALUE_ADDRESS (sym)),
&reply[8]); &reply[8]);
putpkt (msg); putpkt (msg);
@ -2183,7 +2201,7 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
push_target (target); /* Switch to using remote target now */ push_target (target); /* Switch to using remote target now */
init_all_packet_configs (); init_all_packet_configs ();
general_thread = -2; general_thread = -2;
continue_thread = -2; continue_thread = -2;
@ -2259,10 +2277,10 @@ remote_open_1 (char *name, int from_tty, struct target_ops *target,
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
} }
#ifdef SOLIB_CREATE_INFERIOR_HOOK #ifdef SOLIB_CREATE_INFERIOR_HOOK
/* FIXME: need a master target_open vector from which all /* FIXME: need a master target_open vector from which all
remote_opens can be called, so that stuff like this can remote_opens can be called, so that stuff like this can
go there. Failing that, the following code must be copied go there. Failing that, the following code must be copied
to the open function for any remote target that wants to to the open function for any remote target that wants to
support svr4 shared libraries. */ support svr4 shared libraries. */
/* Set up to detect and load shared libraries. */ /* Set up to detect and load shared libraries. */
@ -2556,7 +2574,7 @@ remote_resume (ptid_t ptid, int step, enum target_signal siggnal)
too is not supported. But that would require another copy of too is not supported. But that would require another copy of
the code to issue the 'e' packet (and fall back to 's' if not the code to issue the 'e' packet (and fall back to 's' if not
supported) in remote_wait(). */ supported) in remote_wait(). */
if (siggnal != TARGET_SIGNAL_0) if (siggnal != TARGET_SIGNAL_0)
{ {
if (remote_protocol_E.support != PACKET_DISABLE) if (remote_protocol_E.support != PACKET_DISABLE)
@ -2838,7 +2856,7 @@ remote_console_output (char *msg)
/* Wait until the remote machine stops, then return, /* Wait until the remote machine stops, then return,
storing status in STATUS just as `wait' would. storing status in STATUS just as `wait' would.
Returns "pid", which in the case of a multi-threaded Returns "pid", which in the case of a multi-threaded
remote OS, is the thread-id. */ remote OS, is the thread-id. */
static ptid_t static ptid_t
@ -2896,7 +2914,7 @@ remote_wait (ptid_t ptid, struct target_waitstatus *status)
LONGEST pnum = 0; LONGEST pnum = 0;
/* If the packet contains a register number save it in pnum /* If the packet contains a register number save it in pnum
and set p1 to point to the character following it. and set p1 to point to the character following it.
Otherwise p1 points to p. */ Otherwise p1 points to p. */
/* If this packet is an awatch packet, don't parse the 'a' /* If this packet is an awatch packet, don't parse the 'a'
@ -2908,7 +2926,7 @@ remote_wait (ptid_t ptid, struct target_waitstatus *status)
pnum = strtol (p, &p_temp, 16); pnum = strtol (p, &p_temp, 16);
p1 = (unsigned char *) p_temp; p1 = (unsigned char *) p_temp;
} }
else else
p1 = p; p1 = p;
if (p1 == p) /* No register number present here */ if (p1 == p) /* No register number present here */
@ -3085,19 +3103,19 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status)
long pnum = 0; long pnum = 0;
/* If the packet contains a register number, save it in pnum /* If the packet contains a register number, save it in pnum
and set p1 to point to the character following it. and set p1 to point to the character following it.
Otherwise p1 points to p. */ Otherwise p1 points to p. */
/* If this packet is an awatch packet, don't parse the 'a' /* If this packet is an awatch packet, don't parse the 'a'
as a register number. */ as a register number. */
if (!strncmp (p, "awatch", strlen ("awatch")) != 0) if (!strncmp (p, "awatch", strlen ("awatch")) != 0)
{ {
/* Read the register number. */ /* Read the register number. */
pnum = strtol (p, &p_temp, 16); pnum = strtol (p, &p_temp, 16);
p1 = (unsigned char *) p_temp; p1 = (unsigned char *) p_temp;
} }
else else
p1 = p; p1 = p;
if (p1 == p) /* No register number present here */ if (p1 == p) /* No register number present here */
@ -3128,7 +3146,7 @@ remote_async_wait (ptid_t ptid, struct target_waitstatus *status)
p = p_temp; p = p_temp;
} }
} }
else else
{ {
struct packet_reg *reg = packet_reg_from_pnum (rs, pnum); struct packet_reg *reg = packet_reg_from_pnum (rs, pnum);
@ -3529,7 +3547,7 @@ check_binary_download (CORE_ADDR addr)
{ {
char *buf = alloca (rs->remote_packet_size); char *buf = alloca (rs->remote_packet_size);
char *p; char *p;
p = buf; p = buf;
*p++ = 'X'; *p++ = 'X';
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
@ -3537,7 +3555,7 @@ check_binary_download (CORE_ADDR addr)
p += hexnumstr (p, (ULONGEST) 0); p += hexnumstr (p, (ULONGEST) 0);
*p++ = ':'; *p++ = ':';
*p = '\0'; *p = '\0';
putpkt_binary (buf, (int) (p - buf)); putpkt_binary (buf, (int) (p - buf));
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
@ -3619,14 +3637,14 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
default: default:
internal_error (__FILE__, __LINE__, "bad switch"); internal_error (__FILE__, __LINE__, "bad switch");
} }
/* Append "<memaddr>". */ /* Append "<memaddr>". */
memaddr = remote_address_masked (memaddr); memaddr = remote_address_masked (memaddr);
p += hexnumstr (p, (ULONGEST) memaddr); p += hexnumstr (p, (ULONGEST) memaddr);
/* Append ",". */ /* Append ",". */
*p++ = ','; *p++ = ',';
/* Append <len>. Retain the location/size of <len>. It may need to /* Append <len>. Retain the location/size of <len>. It may need to
be adjusted once the packet body has been created. */ be adjusted once the packet body has been created. */
plen = p; plen = p;
@ -3636,7 +3654,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
/* Append ":". */ /* Append ":". */
*p++ = ':'; *p++ = ':';
*p = '\0'; *p = '\0';
/* Append the packet body. */ /* Append the packet body. */
payload_start = p; payload_start = p;
switch (remote_protocol_binary_download.support) switch (remote_protocol_binary_download.support)
@ -3665,7 +3683,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
} }
if (nr_bytes < todo) if (nr_bytes < todo)
{ {
/* Escape chars have filled up the buffer prematurely, /* Escape chars have filled up the buffer prematurely,
and we have actually sent fewer bytes than planned. and we have actually sent fewer bytes than planned.
Fix-up the length field of the packet. Use the same Fix-up the length field of the packet. Use the same
number of characters as before. */ number of characters as before. */
@ -3686,10 +3704,10 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
default: default:
internal_error (__FILE__, __LINE__, "bad switch"); internal_error (__FILE__, __LINE__, "bad switch");
} }
putpkt_binary (buf, (int) (p - buf)); putpkt_binary (buf, (int) (p - buf));
getpkt (buf, sizeof_buf, 0); getpkt (buf, sizeof_buf, 0);
if (buf[0] == 'E') if (buf[0] == 'E')
{ {
/* There is no correspondance between what the remote protocol /* There is no correspondance between what the remote protocol
@ -3699,7 +3717,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
errno = EIO; errno = EIO;
return 0; return 0;
} }
/* Return NR_BYTES, not TODO, in case escape chars caused us to send fewer /* Return NR_BYTES, not TODO, in case escape chars caused us to send fewer
bytes than we'd planned. */ bytes than we'd planned. */
return nr_bytes; return nr_bytes;
@ -4051,7 +4069,7 @@ read_frame (char *buf,
check_0 = readchar (remote_timeout); check_0 = readchar (remote_timeout);
if (check_0 >= 0) if (check_0 >= 0)
check_1 = readchar (remote_timeout); check_1 = readchar (remote_timeout);
if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT) if (check_0 == SERIAL_TIMEOUT || check_1 == SERIAL_TIMEOUT)
{ {
if (remote_debug) if (remote_debug)
@ -4092,7 +4110,7 @@ read_frame (char *buf,
/* The character before ``*'' is repeated. */ /* The character before ``*'' is repeated. */
if (repeat > 0 && repeat <= 255 if (repeat > 0 && repeat <= 255
&& bc > 0 && bc > 0
&& bc + repeat - 1 < sizeof_buf - 1) && bc + repeat - 1 < sizeof_buf - 1)
{ {
@ -4293,7 +4311,7 @@ extended_remote_mourn (void)
{ {
/* We do _not_ want to mourn the target like this; this will /* We do _not_ want to mourn the target like this; this will
remove the extended remote target from the target stack, remove the extended remote target from the target stack,
and the next time the user says "run" it'll fail. and the next time the user says "run" it'll fail.
FIXME: What is the right thing to do here? */ FIXME: What is the right thing to do here? */
#if 0 #if 0
@ -4311,7 +4329,7 @@ remote_mourn_1 (struct target_ops *target)
/* In the extended protocol we want to be able to do things like /* In the extended protocol we want to be able to do things like
"run" and have them basically work as expected. So we need "run" and have them basically work as expected. So we need
a special create_inferior function. a special create_inferior function.
FIXME: One day add support for changing the exec file FIXME: One day add support for changing the exec file
we're debugging, arguments and an environment. */ we're debugging, arguments and an environment. */
@ -4408,19 +4426,19 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
#ifdef DEPRECATED_REMOTE_BREAKPOINT #ifdef DEPRECATED_REMOTE_BREAKPOINT
int val; int val;
#endif #endif
int bp_size; int bp_size;
/* Try the "Z" s/w breakpoint packet if it is not already disabled. /* Try the "Z" s/w breakpoint packet if it is not already disabled.
If it succeeds, then set the support to PACKET_ENABLE. If it If it succeeds, then set the support to PACKET_ENABLE. If it
fails, and the user has explicitly requested the Z support then fails, and the user has explicitly requested the Z support then
report an error, otherwise, mark it disabled and go on. */ report an error, otherwise, mark it disabled and go on. */
if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE) if (remote_protocol_Z[Z_PACKET_SOFTWARE_BP].support != PACKET_DISABLE)
{ {
char *buf = alloca (rs->remote_packet_size); char *buf = alloca (rs->remote_packet_size);
char *p = buf; char *p = buf;
addr = remote_address_masked (addr); addr = remote_address_masked (addr);
*(p++) = 'Z'; *(p++) = 'Z';
*(p++) = '0'; *(p++) = '0';
@ -4428,7 +4446,7 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
BREAKPOINT_FROM_PC (&addr, &bp_size); BREAKPOINT_FROM_PC (&addr, &bp_size);
sprintf (p, ",%d", bp_size); sprintf (p, ",%d", bp_size);
putpkt (buf); putpkt (buf);
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
@ -4443,7 +4461,7 @@ remote_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
} }
} }
#ifdef DEPRECATED_REMOTE_BREAKPOINT #ifdef DEPRECATED_REMOTE_BREAKPOINT
val = target_read_memory (addr, contents_cache, sizeof big_break_insn); val = target_read_memory (addr, contents_cache, sizeof big_break_insn);
if (val == 0) if (val == 0)
@ -4472,7 +4490,7 @@ remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
{ {
char *buf = alloca (rs->remote_packet_size); char *buf = alloca (rs->remote_packet_size);
char *p = buf; char *p = buf;
*(p++) = 'z'; *(p++) = 'z';
*(p++) = '0'; *(p++) = '0';
*(p++) = ','; *(p++) = ',';
@ -4481,7 +4499,7 @@ remote_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
BREAKPOINT_FROM_PC (&addr, &bp_size); BREAKPOINT_FROM_PC (&addr, &bp_size);
sprintf (p, ",%d", bp_size); sprintf (p, ",%d", bp_size);
putpkt (buf); putpkt (buf);
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
@ -4527,13 +4545,13 @@ remote_insert_watchpoint (CORE_ADDR addr, int len, int type)
error ("Can't set hardware watchpoints without the '%s' (%s) packet\n", error ("Can't set hardware watchpoints without the '%s' (%s) packet\n",
remote_protocol_Z[packet].name, remote_protocol_Z[packet].name,
remote_protocol_Z[packet].title); remote_protocol_Z[packet].title);
sprintf (buf, "Z%x,", packet); sprintf (buf, "Z%x,", packet);
p = strchr (buf, '\0'); p = strchr (buf, '\0');
addr = remote_address_masked (addr); addr = remote_address_masked (addr);
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
sprintf (p, ",%x", len); sprintf (p, ",%x", len);
putpkt (buf); putpkt (buf);
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
@ -4562,7 +4580,7 @@ remote_remove_watchpoint (CORE_ADDR addr, int len, int type)
error ("Can't clear hardware watchpoints without the '%s' (%s) packet\n", error ("Can't clear hardware watchpoints without the '%s' (%s) packet\n",
remote_protocol_Z[packet].name, remote_protocol_Z[packet].name,
remote_protocol_Z[packet].title); remote_protocol_Z[packet].title);
sprintf (buf, "z%x,", packet); sprintf (buf, "z%x,", packet);
p = strchr (buf, '\0'); p = strchr (buf, '\0');
addr = remote_address_masked (addr); addr = remote_address_masked (addr);
@ -4635,21 +4653,21 @@ remote_insert_hw_breakpoint (CORE_ADDR addr, char *shadow)
struct remote_state *rs = get_remote_state (); struct remote_state *rs = get_remote_state ();
char *buf = alloca (rs->remote_packet_size); char *buf = alloca (rs->remote_packet_size);
char *p = buf; char *p = buf;
/* The length field should be set to the size of a breakpoint /* The length field should be set to the size of a breakpoint
instruction. */ instruction. */
BREAKPOINT_FROM_PC (&addr, &len); BREAKPOINT_FROM_PC (&addr, &len);
if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE) if (remote_protocol_Z[Z_PACKET_HARDWARE_BP].support == PACKET_DISABLE)
error ("Can't set hardware breakpoint without the '%s' (%s) packet\n", error ("Can't set hardware breakpoint without the '%s' (%s) packet\n",
remote_protocol_Z[Z_PACKET_HARDWARE_BP].name, remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
remote_protocol_Z[Z_PACKET_HARDWARE_BP].title); remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
*(p++) = 'Z'; *(p++) = 'Z';
*(p++) = '1'; *(p++) = '1';
*(p++) = ','; *(p++) = ',';
addr = remote_address_masked (addr); addr = remote_address_masked (addr);
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
sprintf (p, ",%x", len); sprintf (p, ",%x", len);
@ -4670,7 +4688,7 @@ remote_insert_hw_breakpoint (CORE_ADDR addr, char *shadow)
} }
static int static int
remote_remove_hw_breakpoint (CORE_ADDR addr, char *shadow) remote_remove_hw_breakpoint (CORE_ADDR addr, char *shadow)
{ {
int len; int len;
@ -4687,18 +4705,18 @@ remote_remove_hw_breakpoint (CORE_ADDR addr, char *shadow)
error ("Can't clear hardware breakpoint without the '%s' (%s) packet\n", error ("Can't clear hardware breakpoint without the '%s' (%s) packet\n",
remote_protocol_Z[Z_PACKET_HARDWARE_BP].name, remote_protocol_Z[Z_PACKET_HARDWARE_BP].name,
remote_protocol_Z[Z_PACKET_HARDWARE_BP].title); remote_protocol_Z[Z_PACKET_HARDWARE_BP].title);
*(p++) = 'z'; *(p++) = 'z';
*(p++) = '1'; *(p++) = '1';
*(p++) = ','; *(p++) = ',';
addr = remote_address_masked (addr); addr = remote_address_masked (addr);
p += hexnumstr (p, (ULONGEST) addr); p += hexnumstr (p, (ULONGEST) addr);
sprintf (p, ",%x", len); sprintf (p, ",%x", len);
putpkt(buf); putpkt(buf);
getpkt (buf, (rs->remote_packet_size), 0); getpkt (buf, (rs->remote_packet_size), 0);
switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP])) switch (packet_ok (buf, &remote_protocol_Z[Z_PACKET_HARDWARE_BP]))
{ {
case PACKET_ERROR: case PACKET_ERROR:
@ -4872,6 +4890,41 @@ remote_xfer_partial (struct target_ops *ops, enum target_object object,
case TARGET_OBJECT_AVR: case TARGET_OBJECT_AVR:
query_type = 'R'; query_type = 'R';
break; break;
case TARGET_OBJECT_AUXV:
if (remote_protocol_qPart_auxv.support != PACKET_DISABLE)
{
unsigned int total = 0;
while (len > 0)
{
LONGEST n = min ((rs->remote_packet_size - 2) / 2, len);
snprintf (buf2, rs->remote_packet_size,
"qPart:auxv:read::%s,%s",
phex_nz (offset, sizeof offset),
phex_nz (n, sizeof n));
i = putpkt (buf2);
if (i < 0)
return total > 0 ? total : i;
buf2[0] = '\0';
getpkt (buf2, rs->remote_packet_size, 0);
if (packet_ok (buf2, &remote_protocol_qPart_auxv) != PACKET_OK)
return total > 0 ? total : -1;
if (buf2[0] == 'O' && buf2[1] == 'K' && buf2[2] == '\0')
break; /* Got EOF indicator. */
/* Got some data. */
i = hex2bin (buf2, readbuf, len);
if (i > 0)
{
readbuf = (void *) ((char *) readbuf + i);
offset += i;
len -= i;
total += i;
}
}
return total;
}
return -1;
default: default:
return -1; return -1;
} }
@ -5369,6 +5422,7 @@ show_remote_cmd (char *args, int from_tty)
show_remote_protocol_qSymbol_packet_cmd (args, from_tty, NULL); show_remote_protocol_qSymbol_packet_cmd (args, from_tty, NULL);
show_remote_protocol_vcont_packet_cmd (args, from_tty, NULL); show_remote_protocol_vcont_packet_cmd (args, from_tty, NULL);
show_remote_protocol_binary_download_cmd (args, from_tty, NULL); show_remote_protocol_binary_download_cmd (args, from_tty, NULL);
show_remote_protocol_qPart_auxv_packet_cmd (args, from_tty, NULL);
} }
static void static void
@ -5612,6 +5666,13 @@ in a memory packet.\n",
&remote_set_cmdlist, &remote_show_cmdlist, &remote_set_cmdlist, &remote_show_cmdlist,
0); 0);
add_packet_config_cmd (&remote_protocol_qPart_auxv,
"qPart_auxv", "read-aux-vector",
set_remote_protocol_qPart_auxv_packet_cmd,
show_remote_protocol_qPart_auxv_packet_cmd,
&remote_set_cmdlist, &remote_show_cmdlist,
0);
/* Keep the old ``set remote Z-packet ...'' working. */ /* Keep the old ``set remote Z-packet ...'' working. */
add_setshow_auto_boolean_cmd ("Z-packet", class_obscure, add_setshow_auto_boolean_cmd ("Z-packet", class_obscure,
&remote_Z_packet_detect, "\ &remote_Z_packet_detect, "\