From 60e1ff2716f2ef348d75b0d9b1dc2cb9206469f8 Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Thu, 26 Dec 2002 09:36:43 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 24 ++++++++++++++ gdb/Makefile.in | 3 +- gdb/config/pa/tm-hppa.h | 3 +- gdb/config/pa/tm-hppah.h | 50 +++++++---------------------- gdb/hppa-hpux-tdep.c | 68 ++++++++++++++++++++++++++++++++++++++++ gdb/hppa-tdep.c | 8 +++++ 6 files changed, 116 insertions(+), 40 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d51d0c6b6b6..93338739a3c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2002-12-26 J. Brobecker + + 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. + 2002-12-24 David Carlton * config/sparc/tm-sparc.h: Delete duplicate definition of diff --git a/gdb/Makefile.in b/gdb/Makefile.in index c2484059458..ec280bbabfa 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1760,7 +1760,8 @@ hppa-tdep.o: hppa-tdep.c $(defs_h) $(frame_h) $(bfd_h) $(inferior_h) \ $(value_h) $(regcache_h) $(completer_h) $(symtab_h) $(a_out_encap_h) \ $(gdb_stat_h) $(gdb_wait_h) $(gdbcore_h) $(gdbcmd_h) $(target_h) \ $(symfile_h) $(objfiles_h) $(language_h) $(osabi_h) -hppa-hpux-tdep.o: hppa-hpux-tdep.c $(defs_h) $(arch_utils_h) $(osabi_h) +hppa-hpux-tdep.o: hppa-hpux-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \ + $(osabi_h) hppab-nat.o: hppab-nat.c $(defs_h) $(inferior_h) $(target_h) $(regcache_h) hppah-nat.o: hppah-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdbcore_h) \ $(gdb_wait_h) $(regcache_h) diff --git a/gdb/config/pa/tm-hppa.h b/gdb/config/pa/tm-hppa.h index ce35906d2bd..baed537b803 100644 --- a/gdb/config/pa/tm-hppa.h +++ b/gdb/config/pa/tm-hppa.h @@ -240,7 +240,8 @@ extern int hppa_instruction_nullified (void); for register N. On the PA-RISC, all regs are 4 bytes, including the FP registers (they're accessed as two 4 byte halves). */ -#define REGISTER_RAW_SIZE(N) 4 +extern int hppa_register_raw_size (int reg_nr); +#define REGISTER_RAW_SIZE(N) hppa_register_raw_size (N) /* Total amount of space needed to store our copies of the machine's register state, the array `registers'. */ diff --git a/gdb/config/pa/tm-hppah.h b/gdb/config/pa/tm-hppah.h index d94b381434c..4e68de992f1 100644 --- a/gdb/config/pa/tm-hppah.h +++ b/gdb/config/pa/tm-hppah.h @@ -33,50 +33,24 @@ #include "somsolib.h" #endif -/* 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. */ -#define PC_IN_SIGTRAMP(pc, name) (name && STREQ ("_sigreturn", name)) - -/* For HPUX: - - 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. */ +extern int hppa_hpux_pc_in_sigtramp (CORE_ADDR pc, char *name); +#define PC_IN_SIGTRAMP(pc, name) hppa_hpux_pc_in_sigtramp (pc, name) +extern void hppa_hpux_frame_saved_pc_in_sigtramp (struct frame_info *fi, + CORE_ADDR *tmp); #define FRAME_SAVED_PC_IN_SIGTRAMP(FRAME, TMP) \ -{ \ - *(TMP) = read_memory_integer ((FRAME)->frame + (43 * 4) , 4); \ -} + hppa_hpux_frame_saved_pc_in_sigtramp (FRAME, TMP) +extern void hppa_hpux_frame_base_before_sigtramp (struct frame_info *fi, + CORE_ADDR *tmp); #define FRAME_BASE_BEFORE_SIGTRAMP(FRAME, TMP) \ -{ \ - *(TMP) = read_memory_integer ((FRAME)->frame + (40 * 4), 4); \ -} + hppa_hpux_frame_base_before_sigtramp (FRAME, TMP) +struct frame_saved_regs; +extern void hppa_hpux_frame_find_saved_regs_in_sigtramp + (struct frame_info *fi, struct frame_saved_regs *fsr); #define FRAME_FIND_SAVED_REGS_IN_SIGTRAMP(FRAME, FSR) \ -{ \ - int i; \ - CORE_ADDR TMP; \ - TMP = (FRAME)->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; \ - } \ -} + hppa_hpux_frame_find_saved_regs_in_sigtramp (FRAME, FSR) /* For HP-UX on PA-RISC we have an implementation for the exception handling target op (in hppa-tdep.c) */ diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c index 37e6ccb17b0..66b7b611e61 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) { diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index e928f3f5719..8c856487b41 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -139,6 +139,7 @@ int hppa_inner_than (CORE_ADDR lhs, CORE_ADDR rhs); CORE_ADDR hppa_stack_align (CORE_ADDR sp); int hppa_pc_requires_run_before_use (CORE_ADDR pc); int hppa_instruction_nullified (void); +int hppa_register_raw_size (int reg_nr); int hppa_register_byte (int reg_nr); struct type * hppa_register_virtual_type (int reg_nr); void hppa_store_struct_return (CORE_ADDR addr, CORE_ADDR sp); @@ -4812,6 +4813,13 @@ hppa_instruction_nullified (void) return ((ipsw & 0x00200000) && !(flags & 0x2)); } +int +hppa_register_raw_size (int reg_nr) +{ + /* All registers have the same size. */ + return REGISTER_SIZE; +} + /* Index within the register vector of the first byte of the space i used for register REG_NR. */ -- 2.30.2