aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/gdbserver/inferiors.c17
-rw-r--r--gdb/gdbserver/regcache.c49
-rw-r--r--gdb/gdbserver/regcache.h8
-rw-r--r--gdb/gdbserver/server.h7
5 files changed, 91 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 32f2a24..16d3d76 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
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.
+
+2002-04-20 Daniel Jacobowitz <drow@mvista.com>
+
* gdbserver/mem-break.c: New file.
* gdbserver/mem-break.h: New file.
* gdbserver/Makefile.in: Add mem-break.o rule; update server.h
diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
index f8cbd04..774798d 100644
--- a/gdb/gdbserver/inferiors.c
+++ b/gdb/gdbserver/inferiors.c
@@ -29,6 +29,7 @@ struct inferior_info
{
int pid;
void *target_data;
+ void *regcache_data;
struct inferior_info *next;
};
@@ -52,6 +53,8 @@ add_inferior (int pid)
if (current_inferior == NULL)
current_inferior = inferiors;
+ create_register_cache (new_inferior);
+
if (signal_pid == 0)
signal_pid = pid;
}
@@ -67,6 +70,8 @@ clear_inferiors (void)
if (inf->target_data)
free (inf->target_data);
+ if (inf->regcache_data)
+ free_register_cache (inf);
free (inf);
inf = next_inf;
@@ -86,3 +91,15 @@ set_inferior_target_data (struct inferior_info *inferior, void *data)
{
inferior->target_data = data;
}
+
+void *
+inferior_regcache_data (struct inferior_info *inferior)
+{
+ return inferior->regcache_data;
+}
+
+void
+set_inferior_regcache_data (struct inferior_info *inferior, void *data)
+{
+ inferior->regcache_data = data;
+}
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);
}
diff --git a/gdb/gdbserver/regcache.h b/gdb/gdbserver/regcache.h
index e71aee2..1b3b926 100644
--- a/gdb/gdbserver/regcache.h
+++ b/gdb/gdbserver/regcache.h
@@ -21,6 +21,14 @@
#ifndef REGCACHE_H
#define REGCACHE_H
+/* Create a new register cache for INFERIOR. */
+
+void create_register_cache (struct inferior_info *inferior);
+
+/* Release all memory associated with the register cache for INFERIOR. */
+
+void free_register_cache (struct inferior_info *inferior);
+
/* Convert all registers to a string in the currently specified remote
format. */
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 0d08422..32b90b5 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -54,6 +54,9 @@
least the size of a (void *). */
typedef long long CORE_ADDR;
+/* Opaque inferior process information. */
+struct inferior_info;
+
#include "regcache.h"
#include "gdb/signals.h"
@@ -70,14 +73,14 @@ extern char *registers;
/* From inferiors.c. */
-struct inferior_info;
extern struct inferior_info *current_inferior;
extern int signal_pid;
void add_inferior (int pid);
void clear_inferiors (void);
void *inferior_target_data (struct inferior_info *);
void set_inferior_target_data (struct inferior_info *, void *);
-
+void *inferior_regcache_data (struct inferior_info *);
+void set_inferior_regcache_data (struct inferior_info *, void *);
/* Public variables in server.c */