enum packet_support support;
};
+/* User configurable variables for the number of characters in a
+ memory read/write packet. MIN (rsa->remote_packet_size,
+ rsa->sizeof_g_packet) is the default. Some targets need smaller
+ values (fifo overruns, et.al.) and some users need larger values
+ (speed up transfers). The variables ``preferred_*'' (the user
+ request), ``current_*'' (what was actually set) and ``forced_*''
+ (Positive - a soft limit, negative - a hard limit). */
+
+struct memory_packet_config
+{
+ const char *name;
+ long size;
+ int fixed_p;
+};
+
+/* These global variables contain the default configuration for every new
+ remote_feature object. */
+static memory_packet_config memory_read_packet_config =
+{
+ "memory-read-packet-size",
+};
+static memory_packet_config memory_write_packet_config =
+{
+ "memory-write-packet-size",
+};
+
/* This global array contains packet descriptions (name and title). */
static packet_description packets_descriptions[PACKET_MAX];
/* This global array contains the default configuration for every new
{
remote_features ()
{
+ m_memory_read_packet_config = memory_read_packet_config;
+ m_memory_write_packet_config = memory_write_packet_config;
+
std::copy (std::begin (remote_protocol_packets),
std::end (remote_protocol_packets),
std::begin (m_protocol_packets));
packet_result packet_ok (const char *buf, const int which_packet);
packet_result packet_ok (const gdb::char_vector &buf, const int which_packet);
+ /* Configuration of a remote target's memory read packet. */
+ memory_packet_config m_memory_read_packet_config;
+ /* Configuration of a remote target's memory write packet. */
+ memory_packet_config m_memory_write_packet_config;
+
/* The per-remote target array which stores a remote's packet
configurations. */
packet_config m_protocol_packets[PACKET_MAX];
static unsigned int remote_address_size;
\f
-/* User configurable variables for the number of characters in a
- memory read/write packet. MIN (rsa->remote_packet_size,
- rsa->sizeof_g_packet) is the default. Some targets need smaller
- values (fifo overruns, et.al.) and some users need larger values
- (speed up transfers). The variables ``preferred_*'' (the user
- request), ``current_*'' (what was actually set) and ``forced_*''
- (Positive - a soft limit, negative - a hard limit). */
-
-struct memory_packet_config
-{
- const char *name;
- long size;
- int fixed_p;
-};
-
/* The default max memory-write-packet-size, when the setting is
"fixed". The 16k is historical. (It came from older GDB's using
alloca for buffers and the knowledge (folklore?) that some hosts
something really big then do a sanity check. */
static void
-set_memory_packet_size (const char *args, struct memory_packet_config *config)
+set_memory_packet_size (const char *args, struct memory_packet_config *config,
+ bool target_connected)
{
int fixed_p = config->fixed_p;
long size = config->size;
if (args == NULL)
- error (_("Argument required (integer, `fixed' or `limited')."));
+ error (_("Argument required (integer, \"fixed\" or \"limit\")."));
else if (strcmp (args, "hard") == 0
|| strcmp (args, "fixed") == 0)
fixed_p = 1;
? DEFAULT_MAX_MEMORY_PACKET_SIZE_FIXED
: size);
- if (! query (_("The target may not be able to correctly handle a %s\n"
- "of %ld bytes. Change the packet size? "),
- config->name, query_size))
+ if (target_connected
+ && !query (_("The target may not be able to correctly handle a %s\n"
+ "of %ld bytes. Change the packet size? "),
+ config->name, query_size))
+ error (_("Packet size not changed."));
+ else if (!target_connected
+ && !query (_("Future remote targets may not be able to "
+ "correctly handle a %s\nof %ld bytes. Change the "
+ "packet size for future remote targets? "),
+ config->name, query_size))
error (_("Packet size not changed."));
}
/* Update the config. */
config->fixed_p = fixed_p;
config->size = size;
+
+ const char *target_type = get_target_type_name (target_connected);
+ gdb_printf (_("The %s %s is set to \"%s\".\n"), config->name, target_type,
+ args);
+
}
+/* Show the memory-read or write-packet size configuration CONFIG of the
+ target REMOTE. If REMOTE is nullptr, the default configuration for future
+ remote targets should be passed in CONFIG. */
+
static void
-show_memory_packet_size (struct memory_packet_config *config)
+show_memory_packet_size (memory_packet_config *config, remote_target *remote)
{
+ const char *target_type = get_target_type_name (remote != nullptr);
+
if (config->size == 0)
- gdb_printf (_("The %s is 0 (default). "), config->name);
+ gdb_printf (_("The %s %s is 0 (default). "), config->name, target_type);
else
- gdb_printf (_("The %s is %ld. "), config->name, config->size);
+ gdb_printf (_("The %s %s is %ld. "), config->name, target_type,
+ config->size);
+
if (config->fixed_p)
gdb_printf (_("Packets are fixed at %ld bytes.\n"),
get_fixed_memory_packet_size (config));
else
{
- remote_target *remote = get_current_remote_target ();
-
- if (remote != NULL)
+ if (remote != nullptr)
gdb_printf (_("Packets are limited to %ld bytes.\n"),
remote->get_memory_packet_size (config));
else
}
}
-/* FIXME: needs to be per-remote-target. */
-static struct memory_packet_config memory_write_packet_config =
-{
- "memory-write-packet-size",
-};
+/* Configure the memory-write-packet size of the currently selected target. If
+ no target is available, the default configuration for future remote targets
+ is configured. */
static void
set_memory_write_packet_size (const char *args, int from_tty)
{
- set_memory_packet_size (args, &memory_write_packet_config);
+ remote_target *remote = get_current_remote_target ();
+ if (remote != nullptr)
+ {
+ set_memory_packet_size
+ (args, &remote->m_features.m_memory_write_packet_config, true);
+ }
+ else
+ {
+ memory_packet_config* config = &memory_write_packet_config;
+ set_memory_packet_size (args, config, false);
+ }
}
+/* Display the memory-write-packet size of the currently selected target. If
+ no target is available, the default configuration for future remote targets
+ is shown. */
+
static void
show_memory_write_packet_size (const char *args, int from_tty)
{
- show_memory_packet_size (&memory_write_packet_config);
+ remote_target *remote = get_current_remote_target ();
+ if (remote != nullptr)
+ show_memory_packet_size (&remote->m_features.m_memory_write_packet_config,
+ remote);
+ else
+ show_memory_packet_size (&memory_write_packet_config, nullptr);
}
/* Show the number of hardware watchpoints that can be used. */
long
remote_target::get_memory_write_packet_size ()
{
- return get_memory_packet_size (&memory_write_packet_config);
+ return get_memory_packet_size (&m_features.m_memory_write_packet_config);
}
-/* FIXME: needs to be per-remote-target. */
-static struct memory_packet_config memory_read_packet_config =
-{
- "memory-read-packet-size",
-};
+/* Configure the memory-read-packet size of the currently selected target. If
+ no target is available, the default configuration for future remote targets
+ is adapted. */
static void
set_memory_read_packet_size (const char *args, int from_tty)
{
- set_memory_packet_size (args, &memory_read_packet_config);
+ remote_target *remote = get_current_remote_target ();
+ if (remote != nullptr)
+ set_memory_packet_size
+ (args, &remote->m_features.m_memory_read_packet_config, true);
+ else
+ {
+ memory_packet_config* config = &memory_read_packet_config;
+ set_memory_packet_size (args, config, false);
+ }
+
}
+/* Display the memory-read-packet size of the currently selected target. If
+ no target is available, the default configuration for future remote targets
+ is shown. */
+
static void
show_memory_read_packet_size (const char *args, int from_tty)
{
- show_memory_packet_size (&memory_read_packet_config);
+ remote_target *remote = get_current_remote_target ();
+ if (remote != nullptr)
+ show_memory_packet_size (&remote->m_features.m_memory_read_packet_config,
+ remote);
+ else
+ show_memory_packet_size (&memory_read_packet_config, nullptr);
}
long
remote_target::get_memory_read_packet_size ()
{
- long size = get_memory_packet_size (&memory_read_packet_config);
+ long size = get_memory_packet_size (&m_features.m_memory_read_packet_config);
/* FIXME: cagney/1999-11-07: Functions like getpkt() need to get an
extra buffer size argument before the memory read size can be
Set the maximum number of bytes per memory-write packet.\n\
Specify the number of bytes in a packet or 0 (zero) for the\n\
default packet size. The actual limit is further reduced\n\
-dependent on the target. Specify ``fixed'' to disable the\n\
-further restriction and ``limit'' to enable that restriction."),
+dependent on the target. Specify \"fixed\" to disable the\n\
+further restriction and \"limit\" to enable that restriction."),
&remote_set_cmdlist);
add_cmd ("memory-read-packet-size", no_class,
set_memory_read_packet_size, _("\
Set the maximum number of bytes per memory-read packet.\n\
Specify the number of bytes in a packet or 0 (zero) for the\n\
default packet size. The actual limit is further reduced\n\
-dependent on the target. Specify ``fixed'' to disable the\n\
-further restriction and ``limit'' to enable that restriction."),
+dependent on the target. Specify \"fixed\" to disable the\n\
+further restriction and \"limit\" to enable that restriction."),
&remote_set_cmdlist);
add_cmd ("memory-write-packet-size", no_class,
show_memory_write_packet_size,
#
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
+ "The memory-write-packet-size on future remote targets is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
"write-packet default"
gdb_test "set remote memory-write-packet-size" \
- "Argument required .integer, `fixed' or `limited'.\." \
+ "Argument required .integer, \"fixed\" or \"limit\".\." \
"set write-packet - NULL"
-gdb_test_no_output "set remote memory-write-packet-size 20"
+gdb_test "set remote memory-write-packet-size 20" \
+ "The memory-write-packet-size on future remote targets is set to \"20\"."
+
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 20. The actual limit will be further reduced dependent on the target\." \
+ "The memory-write-packet-size on future remote targets is 20. The actual limit will be further reduced dependent on the target\." \
"set write-packet - small"
-gdb_test_no_output "set remote memory-write-packet-size 1"
+gdb_test "set remote memory-write-packet-size 1" \
+ "The memory-write-packet-size on future remote targets is set to \"1\"."
+
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 1. The actual limit will be further reduced dependent on the target\." \
+ "The memory-write-packet-size on future remote targets is 1. The actual limit will be further reduced dependent on the target\." \
"set write-packet - very-small"
-gdb_test_no_output "set remote memory-write-packet-size 0"
+gdb_test "set remote memory-write-packet-size 0" \
+ "The memory-write-packet-size on future remote targets is set to \"0\"."
+
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
+ "The memory-write-packet-size on future remote targets is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
"write-packet default again"
set test "set remote memory-write-packet-size fixed"
gdb_test_multiple $test $test {
- -re "Change the packet size. .y or n. " {
+ -re "Change the packet size for future remote targets. .y or n. " {
gdb_test_multiple "y" $test {
-re "$gdb_prompt $" {
pass $test
}
}
}
+
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 0 \\(default\\). Packets are fixed at 16384 bytes\." \
+ "The memory-write-packet-size on future remote targets is 0 \\(default\\). Packets are fixed at 16384 bytes\." \
"write-packet default fixed"
-gdb_test_no_output "set remote memory-write-packet-size limit"
+gdb_test "set remote memory-write-packet-size limit" \
+ "The memory-write-packet-size on future remote targets is set to \"limit\"."
+
gdb_test "show remote memory-write-packet-size" \
- "The memory-write-packet-size is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
+ "The memory-write-packet-size on future remote targets is 0 \\(default\\). The actual limit will be further reduced dependent on the target\." \
"write-packet default limit again"
#
set test "timed download `[file tail $executable]' - $class, $writesize"
if {$writesize != ""} {
- gdb_test_no_output "set remote memory-write-packet-size $writesize" \
+ gdb_test "set remote memory-write-packet-size $writesize" \
+ "The memory-write-packet-size on future remote targets is set to \"$writesize\"." \
"$test - set packet size"
send_gdb "set remote memory-write-packet-size $class\n"
pass $test
}
-clean_restart $binfile
-
# These download tests won't actually download anything on !is_remote
# target boards, but we run them anyway because it's simpler, and
# harmless.
# Get the size of random_data table (defaults to 48K).
set sizeof_random_data [get_sizeof "random_data" 48*1024]
+clean_restart $binfile
+
#
# Part THREE: Check the upload behavour
#
# Read a chunk just larger than the packet size (reduce the packet
# size to make life easier)
-gdb_test_no_output "set remote memory-read-packet-size 16"
+gdb_test "set remote memory-read-packet-size 16" \
+ "The memory-read-packet-size on the current remote target is set to \"16\"."
gdb_test "show remote memory-read-packet-size" \
- "The memory-read-packet-size is 16. Packets are limited to 20 bytes."
+ "The memory-read-packet-size on the current remote target is 16. Packets are limited to 20 bytes."
gdb_test "x/17ub random_data" \
"<random_data>:\[ \t\]+60\[ \t\]+74\[ \t\]+216\[ \t\]+38\[ \t\]+149\[ \t\]+49\[ \t\]+207\[ \t\]+44.*<random_data\\+8>:\[ \t\]+124\[ \t\]+38\[ \t\]+93\[ \t\]+125\[ \t\]+232\[ \t\]+67\[ \t\]+228\[ \t\]+56.*<random_data\\+16>:\[ \t\]+161"