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.
This commit is contained in:
Joel Brobecker 2002-12-26 09:36:43 +00:00
parent a7df09ae3c
commit 60e1ff2716
6 changed files with 116 additions and 40 deletions

View file

@ -1,3 +1,27 @@
2002-12-26 J. Brobecker <brobecker@gnat.com>
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 <carlton@math.stanford.edu>
* config/sparc/tm-sparc.h: Delete duplicate definition of

View file

@ -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)

View file

@ -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'. */

View file

@ -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) */

View file

@ -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)
{

View file

@ -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. */