diff options
author | Joel Brobecker <brobecker@gnat.com> | 2002-12-26 09:36:43 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2002-12-26 09:36:43 +0000 |
commit | 60e1ff2716f2ef348d75b0d9b1dc2cb9206469f8 (patch) | |
tree | 3507c5b1e2854f4ff60c79b0a4b06fa079c8a2ed /gdb/hppa-hpux-tdep.c | |
parent | a7df09ae3cdf5e7b7318795a42cc491c3f791a65 (diff) | |
download | gdb-60e1ff2716f2ef348d75b0d9b1dc2cb9206469f8.zip gdb-60e1ff2716f2ef348d75b0d9b1dc2cb9206469f8.tar.gz gdb-60e1ff2716f2ef348d75b0d9b1dc2cb9206469f8.tar.bz2 |
Continuing work to convert the hppa targets to multiarch partial.
* hppa-tdep.c: (hppa_register_raw_size): New function replacing
the body of macro REGISTER_RAW_SIZE.
* hppa-hpux-tdep.c: Add new functions replacing macro bodies from
config/pa/tm-hppah.h. These functions will be used to initialize
the gdbarch structure.
(hppa_hpux_pc_in_sigtramp): New function.
(hppa_hpux_frame_saved_pc_in_sigtramp): New function.
(hppa_hpux_frame_base_before_sigtramp): New function.
(hppa_hpux_frame_find_saved_regs_in_sigtramp): New function.
Add gdbcore.h #include.
* config/pa/tm-hppa.h (REGISTER_RAW_SIZE): Change the definition
of this gdbarch-eligible macro to a call to the new associated
function.
* config/pa/tm-hppah.h (PC_IN_SIGTRAMP): Likewise.
(FRAME_SAVED_PC_IN_SIGTRAMP): Change the definition of this macro
into a call to the new associated function.
(FRAME_BASE_BEFORE_SIGTRAMP): Likewise.
(FRAME_FIND_SAVED_REGS_IN_SIGTRAMP): Likewise.
* Makefile.in (hppa-hpux-tdep.o): Add dependency on gdbcore.h.
Diffstat (limited to 'gdb/hppa-hpux-tdep.c')
-rw-r--r-- | gdb/hppa-hpux-tdep.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c index 37e6ccb..66b7b61 100644 --- a/gdb/hppa-hpux-tdep.c +++ b/gdb/hppa-hpux-tdep.c @@ -19,12 +19,80 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "arch-utils.h" +#include "gdbcore.h" #include "osabi.h" /* Forward declarations. */ extern void _initialize_hppa_hpux_tdep (void); extern initialize_file_ftype _initialize_hppa_hpux_tdep; +/* FIXME: brobecker 2002-12-25. The following functions will eventually + become static, after the multiarching conversion is done. */ +int hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name); +void hppa_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, + CORE_ADDR *tmp); +void hppa_hpux_frame_base_before_sigtramp (struct frame_info *fi, + CORE_ADDR *tmp); +void hppa_hpux_frame_find_saved_regs_in_sigtramp + (struct frame_info *fi, struct frame_saved_regs *fsr); + +int +hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name) +{ + /* Actually, for a PA running HPUX the kernel calls the signal handler + without an intermediate trampoline. Luckily the kernel always sets + the return pointer for the signal handler to point to _sigreturn. */ + return (name && (strcmp ("_sigreturn", name) == 0)); +} + +/* For hppa_hpux_frame_saved_pc_in_sigtramp, + hppa_hpux_frame_base_before_sigtramp and + hppa_hpux_frame_find_saved_regs_in_sigtramp: + + The signal context structure pointer is always saved at the base + of the frame which "calls" the signal handler. We only want to find + the hardware save state structure, which lives 10 32bit words into + sigcontext structure. + + Within the hardware save state structure, registers are found in the + same order as the register numbers in GDB. + + At one time we peeked at %r31 rather than the PC queues to determine + what instruction took the fault. This was done on purpose, but I don't + remember why. Looking at the PC queues is really the right way, and + I don't remember why that didn't work when this code was originally + written. */ + +void +hppa_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, CORE_ADDR *tmp) +{ + *tmp = read_memory_integer (fi->frame + (43 * 4), 4); +} + +void +hppa_hpux_frame_base_before_sigtramp (struct frame_info *fi, + CORE_ADDR *tmp) +{ + *tmp = read_memory_integer (fi->frame + (40 * 4), 4); +} + +void +hppa_hpux_frame_find_saved_regs_in_sigtramp (struct frame_info *fi, + struct frame_saved_regs *fsr) +{ + int i; + const CORE_ADDR tmp = (fi)->frame + (10 * 4); + + for (i = 0; i < NUM_REGS; i++) + { + if (i == SP_REGNUM) + (fsr)->regs[SP_REGNUM] = read_memory_integer (tmp + SP_REGNUM * 4, 4); + else + (fsr)->regs[i] = tmp + i * 4; + } +} + + static void hppa_hpux_som_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { |