aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/regcache.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2002-04-20 17:22:48 +0000
committerDaniel Jacobowitz <drow@false.org>2002-04-20 17:22:48 +0000
commitc04a1aa88fa42d61fafa570de6ab6ab1b7a12d27 (patch)
treeccf5d334c0eeb02b0a1f16fae3bc3641544a7d0c /gdb/gdbserver/regcache.c
parent611cb4a54268cbb8f25175dd4900fff87eae161b (diff)
downloadgdb-c04a1aa88fa42d61fafa570de6ab6ab1b7a12d27.zip
gdb-c04a1aa88fa42d61fafa570de6ab6ab1b7a12d27.tar.gz
gdb-c04a1aa88fa42d61fafa570de6ab6ab1b7a12d27.tar.bz2
2002-04-20 Daniel Jacobowitz <drow@mvista.com>
* gdbserver/inferiors.c (struct inferior_info): Add regcache_data. (add_inferior): Call create_register_cache. (clear_inferiors): Call free_register_cache. (inferior_regcache_data, set_inferior_regcache_data): New functions. * gdbserver/regcache.c (struct inferior_regcache_data): New. (registers): Remove. (get_regcache): New function. (create_register_cache, free_register_cache): New functions. (set_register_cache): Don't initialize the register cache here. (registers_to_string, registers_from_string, register_data): Call get_regcache. * gdbserver/regcache.h: Add prototypes. * gdbserver/server.h: Likewise.
Diffstat (limited to 'gdb/gdbserver/regcache.c')
-rw-r--r--gdb/gdbserver/regcache.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/gdb/gdbserver/regcache.c b/gdb/gdbserver/regcache.c
index 5e3c62f..701d092 100644
--- a/gdb/gdbserver/regcache.c
+++ b/gdb/gdbserver/regcache.c
@@ -25,7 +25,11 @@
#include <stdlib.h>
#include <string.h>
-static char *registers;
+struct inferior_regcache_data
+{
+ char *registers;
+};
+
static int register_bytes;
static struct reg *reg_defs;
@@ -33,6 +37,19 @@ static int num_registers;
const char **gdbserver_expedite_regs;
+static struct inferior_regcache_data *
+get_regcache (struct inferior_info *inf)
+{
+ struct inferior_regcache_data *regcache;
+
+ regcache = (struct inferior_regcache_data *) inferior_regcache_data (inf);
+
+ if (regcache == NULL)
+ fatal ("no register cache");
+
+ return regcache;
+}
+
int
registers_length (void)
{
@@ -40,6 +57,28 @@ registers_length (void)
}
void
+create_register_cache (struct inferior_info *inferior)
+{
+ struct inferior_regcache_data *regcache;
+
+ regcache = malloc (sizeof (*regcache));
+
+ regcache->registers = malloc (register_bytes);
+ if (regcache->registers == NULL)
+ fatal ("Could not allocate register cache.");
+
+ set_inferior_regcache_data (inferior, regcache);
+}
+
+void
+free_register_cache (struct inferior_info *inferior)
+{
+ free (get_regcache (current_inferior)->registers);
+ free (get_regcache (current_inferior));
+ set_inferior_regcache_data (inferior, NULL);
+}
+
+void
set_register_cache (struct reg *regs, int n)
{
int offset, i;
@@ -55,14 +94,13 @@ set_register_cache (struct reg *regs, int n)
}
register_bytes = offset / 8;
- registers = malloc (offset / 8);
- if (!registers)
- fatal ("Could not allocate register cache.");
}
void
registers_to_string (char *buf)
{
+ char *registers = get_regcache (current_inferior)->registers;
+
convert_int_to_ascii (registers, buf, register_bytes);
}
@@ -70,6 +108,7 @@ void
registers_from_string (char *buf)
{
int len = strlen (buf);
+ char *registers = get_regcache (current_inferior)->registers;
if (len != register_bytes * 2)
{
@@ -119,6 +158,8 @@ register_size (int n)
char *
register_data (int n)
{
+ char *registers = get_regcache (current_inferior)->registers;
+
return registers + (reg_defs[n].offset / 8);
}