From c04a1aa88fa42d61fafa570de6ab6ab1b7a12d27 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Sat, 20 Apr 2002 17:22:48 +0000 Subject: 2002-04-20 Daniel Jacobowitz * 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. --- gdb/ChangeLog | 16 ++++++++++++++++ gdb/gdbserver/inferiors.c | 17 ++++++++++++++++ gdb/gdbserver/regcache.c | 49 +++++++++++++++++++++++++++++++++++++++++++---- gdb/gdbserver/regcache.h | 8 ++++++++ gdb/gdbserver/server.h | 7 +++++-- 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 + * 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 + * 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 #include -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 */ -- cgit v1.1