summaryrefslogtreecommitdiff
path: root/gdb/gdbserver/regcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbserver/regcache.c')
-rw-r--r--gdb/gdbserver/regcache.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index f1d0fe51f14..ee5591b2e5b 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -35,10 +35,10 @@ struct inferior_regcache_data
unsigned char *registers;
};
-static int register_bytes;
+static int register_bytes, g_register_bytes;
static struct reg *reg_defs;
-static int num_registers;
+int num_registers;
const char **gdbserver_expedite_regs;
@@ -91,7 +91,7 @@ regcache_invalidate ()
int
registers_length (void)
{
- return 2 * register_bytes;
+ return 2 * g_register_bytes;
}
void *
@@ -124,7 +124,7 @@ free_register_cache (void *regcache_p)
}
void
-set_register_cache (struct reg *regs, int n)
+set_register_cache (struct reg *regs, const char *last_g_reg, int n)
{
int offset, i;
@@ -139,6 +139,14 @@ set_register_cache (struct reg *regs, int n)
}
register_bytes = offset / 8;
+
+ if (last_g_reg == NULL)
+ g_register_bytes = register_bytes;
+ else
+ {
+ int n = find_regno (last_g_reg);
+ g_register_bytes = regs[n].offset + regs[n].size / 8;
+ }
}
void
@@ -146,7 +154,7 @@ registers_to_string (char *buf)
{
unsigned char *registers = get_regcache (current_inferior, 1)->registers;
- convert_int_to_ascii (registers, buf, register_bytes);
+ convert_int_to_ascii (registers, buf, g_register_bytes);
}
void
@@ -155,11 +163,11 @@ registers_from_string (char *buf)
int len = strlen (buf);
unsigned char *registers = get_regcache (current_inferior, 1)->registers;
- if (len != register_bytes * 2)
+ if (len != g_register_bytes * 2)
{
- warning ("Wrong sized register packet (expected %d bytes, got %d)", 2*register_bytes, len);
- if (len > register_bytes * 2)
- len = register_bytes * 2;
+ warning ("Wrong sized register packet (expected %d bytes, got %d)", 2*g_register_bytes, len);
+ if (len > g_register_bytes * 2)
+ len = g_register_bytes * 2;
}
convert_ascii_to_int (buf, registers, len / 2);
}
@@ -216,6 +224,12 @@ supply_register (int n, const void *buf)
}
void
+supply_register_as_string (int n, const char *buf)
+{
+ convert_ascii_to_int (buf, register_data (n, 0), register_size (n));
+}
+
+void
supply_register_by_name (const char *name, const void *buf)
{
supply_register (find_regno (name), buf);