diff options
author | Daniel Jacobowitz <drow@false.org> | 2002-04-20 17:22:48 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2002-04-20 17:22:48 +0000 |
commit | c04a1aa88fa42d61fafa570de6ab6ab1b7a12d27 (patch) | |
tree | ccf5d334c0eeb02b0a1f16fae3bc3641544a7d0c /gdb/gdbserver/regcache.c | |
parent | 611cb4a54268cbb8f25175dd4900fff87eae161b (diff) | |
download | gdb-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.c | 49 |
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); } |