X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fhpux-thread.c;h=28920ba2bf1d6beca8c33624c575b5103b7c12df;hb=06d3b283b148a3ab8ff85a50fb127973524e700c;hp=e9f6cfb6b6e7c971ead6d06b278b0b63005eca50;hpb=c8e73a318e2b3249c7e197e78208f3420021f493;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/hpux-thread.c b/gdb/hpux-thread.c index e9f6cfb6b6..28920ba2bf 100644 --- a/gdb/hpux-thread.c +++ b/gdb/hpux-thread.c @@ -1,8 +1,8 @@ /* Low level interface for debugging HPUX/DCE threads for GDB, the GNU debugger. - Copyright 1996, 1998, 1999, 2000, 2001, 2004 Free Software - Foundation, Inc. + Copyright (C) 1996, 1998, 1999, 2000, 2001, 2004, 2007 + Free Software Foundation, Inc. This file is part of GDB. @@ -18,8 +18,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /* This module implements a sort of half target that sits between the machine-independent parts of GDB and the ptrace interface (infptrace.c) to @@ -44,8 +44,11 @@ #include "inferior.h" #include "regcache.h" #include +#include #include "gdb_stat.h" #include "gdbcore.h" +#include "hppa-tdep.h" +#include "observer.h" extern int child_suppress_run; @@ -126,7 +129,7 @@ find_tcb (ptid_t ptid) } } - error ("Can't find TCB %d", thread); + error (_("Can't find TCB %d"), thread); return NULL; } @@ -184,7 +187,7 @@ hpux_thread_resume (ptid_t ptid, int step, enum target_signal signo) { pid = thread_to_lwp (pid, -2); if (pid == -2) /* Inactive thread */ - error ("This version of Solaris can't start inactive threads."); + error (_("This version of Solaris can't start inactive threads.")); } #endif @@ -220,7 +223,7 @@ hpux_thread_wait (ptid_t ptid, struct target_waitstatus *ourstatus) return rtnval; } -static char regmap[NUM_REGS] = +static char regmap[] = { -2, -1, -1, 0, 4, 8, 12, 16, 20, 24, /* flags, r1 -> r9 */ 28, 32, 36, 40, 44, 48, 52, 56, 60, -1, /* r10 -> r19 */ @@ -247,7 +250,7 @@ static char regmap[NUM_REGS] = }; static void -hpux_thread_fetch_registers (int regno) +hpux_thread_fetch_registers (struct regcache *regcache, int regno) { cma__t_int_tcb tcb, *tcb_ptr; struct cleanup *old_chain; @@ -262,7 +265,7 @@ hpux_thread_fetch_registers (int regno) if (tcb_ptr->state == cma__c_state_running) { - deprecated_child_ops.to_fetch_registers (regno); + deprecated_child_ops.to_fetch_registers (regcache, regno); do_cleanups (old_chain); @@ -283,7 +286,7 @@ hpux_thread_fetch_registers (int regno) for (regno = first_regno; regno <= last_regno; regno++) { if (regmap[regno] == -1) - deprecated_child_ops.to_fetch_registers (regno); + deprecated_child_ops.to_fetch_registers (regcache, regno); else { unsigned char buf[MAX_REGISTER_SIZE]; @@ -291,17 +294,17 @@ hpux_thread_fetch_registers (int regno) sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160; - if (regno == FLAGS_REGNUM) + if (regno == HPPA_FLAGS_REGNUM) /* Flags must be 0 to avoid bogus value for SS_INSYSCALL */ memset (buf, '\000', register_size (current_gdbarch, regno)); - else if (regno == SP_REGNUM) + else if (regno == HPPA_SP_REGNUM) store_unsigned_integer (buf, sizeof sp, sp); - else if (regno == PC_REGNUM) + else if (regno == HPPA_PCOQ_HEAD_REGNUM) read_memory (sp - 20, buf, register_size (current_gdbarch, regno)); else read_memory (sp + regmap[regno], buf, register_size (current_gdbarch, regno)); - regcache_raw_supply (current_regcache, regno, buf); + regcache_raw_supply (regcache, regno, buf); } } @@ -309,7 +312,7 @@ hpux_thread_fetch_registers (int regno) } static void -hpux_thread_store_registers (int regno) +hpux_thread_store_registers (struct regcache *regcache, int regno) { cma__t_int_tcb tcb, *tcb_ptr; struct cleanup *old_chain; @@ -324,7 +327,7 @@ hpux_thread_store_registers (int regno) if (tcb_ptr->state == cma__c_state_running) { - deprecated_child_ops.to_store_registers (regno); + deprecated_child_ops.to_store_registers (regcache, regno); do_cleanups (old_chain); @@ -345,7 +348,7 @@ hpux_thread_store_registers (int regno) for (regno = first_regno; regno <= last_regno; regno++) { if (regmap[regno] == -1) - deprecated_child_ops.to_store_registers (regno); + deprecated_child_ops.to_store_registers (regcache, regno); else { unsigned char buf[MAX_REGISTER_SIZE]; @@ -353,25 +356,28 @@ hpux_thread_store_registers (int regno) sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160; - if (regno == FLAGS_REGNUM) - deprecated_child_ops.to_store_registers (regno); /* Let lower layer handle this... */ - else if (regno == SP_REGNUM) + if (regno == HPPA_FLAGS_REGNUM) + deprecated_child_ops.to_store_registers (regcache, regno); /* Let lower layer handle this... */ + else if (regno == HPPA_SP_REGNUM) { - write_memory ((CORE_ADDR) & tcb_ptr->static_ctx.sp, - &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)], + regcache_raw_collect (regcache, regno, buf); + write_memory ((CORE_ADDR) &tcb_ptr->static_ctx.sp, buf, + register_size (current_gdbarch, regno)); + tcb_ptr->static_ctx.sp + = (cma__t_hppa_regs *) ((CORE_ADDR) buf + 160); + } + else if (regno == HPPA_PCOQ_HEAD_REGNUM) + { + regcache_raw_collect (regcache, regno, buf); + write_memory (sp - 20, buf, register_size (current_gdbarch, regno)); - tcb_ptr->static_ctx.sp = (cma__t_hppa_regs *) - (extract_unsigned_integer (&deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)], - register_size (current_gdbarch, regno)) + 160); } - else if (regno == PC_REGNUM) - write_memory (sp - 20, - &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)], - register_size (current_gdbarch, regno)); else - write_memory (sp + regmap[regno], - &deprecated_registers[DEPRECATED_REGISTER_BYTE (regno)], - register_size (current_gdbarch, regno)); + { + regcache_raw_collect (regcache, regno, buf); + write_memory (sp + regmap[regno], buf, + register_size (current_gdbarch, regno)); + } } } @@ -385,9 +391,9 @@ hpux_thread_store_registers (int regno) debugged. */ static void -hpux_thread_prepare_to_store (void) +hpux_thread_prepare_to_store (struct regcache *regcache) { - deprecated_child_ops.to_prepare_to_store (); + deprecated_child_ops.to_prepare_to_store (regcache); } static int @@ -456,14 +462,7 @@ hpux_thread_create_inferior (char *exec_file, char *allargs, char **env, those variables don't show up until the library gets mapped and the symbol table is read in. */ -/* This new_objfile event is now managed by a chained function pointer. - * It is the callee's responsability to call the next client on the chain. - */ - -/* Saved pointer to previous owner of the new_objfile event. */ -static void (*target_new_objfile_chain) (struct objfile *); - -void +static void hpux_thread_new_objfile (struct objfile *objfile) { struct minimal_symbol *ms; @@ -471,28 +470,24 @@ hpux_thread_new_objfile (struct objfile *objfile) if (!objfile) { hpux_thread_active = 0; - goto quit; + return; } ms = lookup_minimal_symbol ("cma__g_known_threads", NULL, objfile); if (!ms) - goto quit; + return; P_cma__g_known_threads = SYMBOL_VALUE_ADDRESS (ms); ms = lookup_minimal_symbol ("cma__g_current_thread", NULL, objfile); if (!ms) - goto quit; + return; P_cma__g_current_thread = SYMBOL_VALUE_ADDRESS (ms); hpux_thread_active = 1; -quit: - /* Call predecessor on chain, if any. */ - if (target_new_objfile_chain) - target_new_objfile_chain (objfile); } /* Clean up after the inferior dies. */ @@ -583,7 +578,6 @@ _initialize_hpux_thread (void) add_target (&hpux_thread_ops); child_suppress_run = 1; - /* Hook into new_objfile notification. */ - target_new_objfile_chain = deprecated_target_new_objfile_hook; - deprecated_target_new_objfile_hook = hpux_thread_new_objfile; + /* Hook into new_objfile notification. */ + observer_attach_new_objfile (hpux_thread_new_objfile); }