From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19362 invoked by alias); 9 Dec 2004 22:31:49 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 19346 invoked from network); 9 Dec 2004 22:31:43 -0000 Received: from unknown (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org with SMTP; 9 Dec 2004 22:31:43 -0000 Received: from elgar.sibelius.xs4all.nl (elgar.sibelius.xs4all.nl [192.168.0.2]) by sibelius.xs4all.nl (8.13.0/8.13.0) with ESMTP id iB9MVgOq005183 for ; Thu, 9 Dec 2004 23:31:43 +0100 (CET) Received: from elgar.sibelius.xs4all.nl (localhost [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.12.6p3/8.12.6) with ESMTP id iB9MVgao001317 for ; Thu, 9 Dec 2004 23:31:42 +0100 (CET) (envelope-from kettenis@elgar.sibelius.xs4all.nl) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.12.6p3/8.12.6/Submit) id iB9MVcmW001314; Thu, 9 Dec 2004 23:31:38 +0100 (CET) Date: Thu, 09 Dec 2004 23:36:00 -0000 Message-Id: <200412092231.iB9MVcmW001314@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: gdb-patches@sources.redhat.com Subject: [RFC] Modernize HP-UX core file handling X-SW-Source: 2004-12/txt/msg00256.txt.bz2 This patch modernizes the way we read HP-UX core files. This patch is necessary to make a inf-ttrace.c based HP-UX debugger read core files again. I've tested this on 32-it HP-UX 11.00, but not on a 64-bit system. The code should be able to read 64-bit core files, but it really should be tested. Randolph/Joel, can one of you test whether reading core files still works after applying this patch? Once this is in, I'll switch 32-bit HP-UX 11.x over to the new inf-ttrace.c stuff. Mark Index: ChangeLog from Mark Kettenis * hppa-hpux-tdep.c: Include "regset.h". (HPPA_HPUX_SS_WIDEREGS, HPPA_HPUX_SS_FLAGS_OFFSET) (HPPA_HPUX_SS_NARROW_OFFSET, HPPA_HPUX_SS_FPBLOCK_OFFSET) (HPPA_HPUX_SS_WIDE_OFFSET, HPPA_HPUX_SAVE_STATE_SIZE) (HPPA_HPUX_PA89_SAVE_STATE_SIZE): New defines. (hppa_hpux_supply_ss_narrow, hppa_hpux_supply_ss_fpblock) (hppa_hpux_supply_ss_wide, hppa_hpux_supply_save_state): New functions. (hppa_hpux_regset): New variable. (hppa_hpux_regset_from_core_section): New function. (hppa_hpux_init_abi): Set regset_from_core_section. (hppa_hpux_core_osabi_sniffer): New function. (_initialize_hppa_hpux_tdep): Register hppa_hpux_core_osabi_sniffer. * Makefile.in (hppa-hpux-tdep.o): Update dependencies. * config/pa/hppahpux.mt (TDEPFILES): Add corelow.o. Index: hppa-hpux-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-hpux-tdep.c,v retrieving revision 1.29 diff -u -p -r1.29 hppa-hpux-tdep.c --- hppa-hpux-tdep.c 8 Dec 2004 01:48:01 -0000 1.29 +++ hppa-hpux-tdep.c 9 Dec 2004 22:27:48 -0000 @@ -23,7 +23,6 @@ #include "arch-utils.h" #include "gdbcore.h" #include "osabi.h" -#include "gdb_string.h" #include "frame.h" #include "frame-unwind.h" #include "trad-frame.h" @@ -32,11 +31,15 @@ #include "inferior.h" #include "infcall.h" #include "observer.h" -#include "hppa-tdep.h" +#include "regset.h" + +#include "gdb_string.h" #include #include +#include "hppa-tdep.h" + #ifndef offsetof #define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) #endif @@ -1418,6 +1421,148 @@ hppa_hpux_push_dummy_code (struct gdbarc /* Bit in the `ss_flag' member of `struct save_state' that indicates + that the 64-bit register values are live. From + . */ +#define HPPA_HPUX_SS_WIDEREGS 0x40 + +/* Offsets of various parts of `struct save_state'. From + . */ +#define HPPA_HPUX_SS_FLAGS_OFFSET 0 +#define HPPA_HPUX_SS_NARROW_OFFSET 4 +#define HPPA_HPUX_SS_FPBLOCK_OFFSET 256 +#define HPPA_HPUX_SS_WIDE_OFFSET 640 + +/* The size of `struct save_state. */ +#define HPPA_HPUX_SAVE_STATE_SIZE 1152 + +/* The size of `struct pa89_save_state', which corresponds to PA-RISC + 1.1, the lowest common denominator that we support. */ +#define HPPA_HPUX_PA89_SAVE_STATE_SIZE 512 + +static void +hppa_hpux_supply_ss_narrow (struct regcache *regcache, + int regnum, const char *save_state) +{ + const char *ss_narrow = save_state + HPPA_HPUX_SS_NARROW_OFFSET; + int i, offset = 0; + + for (i = HPPA_R1_REGNUM; i < HPPA_FP0_REGNUM; i++) + { + if (regnum == i || regnum == -1) + regcache_raw_supply (regcache, i, ss_narrow + offset); + + offset += 4; + } +} + +static void +hppa_hpux_supply_ss_fpblock (struct regcache *regcache, + int regnum, const char *save_state) +{ + const char *ss_fpblock = save_state + HPPA_HPUX_SS_FPBLOCK_OFFSET; + int i, offset = 0; + + /* FIXME: We view the floating-point state as 64 single-precision + registers for 32-bit code, and 32 double-precision register for + 64-bit code. This distinction is artificial and should be + eliminated. If that ever happens, we should remove the if-clause + below. */ + + if (register_size (get_regcache_arch (regcache), HPPA_FP0_REGNUM) == 4) + { + for (i = HPPA_FP0_REGNUM; i < HPPA_FP0_REGNUM + 64; i++) + { + if (regnum == i || regnum == -1) + regcache_raw_supply (regcache, i, ss_fpblock + offset); + + offset += 4; + } + } + else + { + for (i = HPPA_FP0_REGNUM; i < HPPA_FP0_REGNUM + 32; i++) + { + if (regnum == i || regnum == -1) + regcache_raw_supply (regcache, i, ss_fpblock + offset); + + offset += 8; + } + } +} + +static void +hppa_hpux_supply_ss_wide (struct regcache *regcache, + int regnum, const char *save_state) +{ + const char *ss_wide = save_state + HPPA_HPUX_SS_WIDE_OFFSET; + int i, offset = 8; + + if (register_size (get_regcache_arch (regcache), HPPA_R1_REGNUM) == 4) + offset += 4; + + for (i = HPPA_R1_REGNUM; i < HPPA_FP0_REGNUM; i++) + { + if (regnum == i || regnum == -1) + regcache_raw_supply (regcache, i, ss_wide + offset); + + offset += 8; + } +} + +static void +hppa_hpux_supply_save_state (const struct regset *regset, + struct regcache *regcache, + int regnum, const void *regs, size_t len) +{ + const char *proc_info = regs; + const char *save_state = proc_info + 8; + ULONGEST flags; + + flags = extract_unsigned_integer (save_state + HPPA_HPUX_SS_FLAGS_OFFSET, 4); + if (regnum == -1 || regnum == HPPA_FLAGS_REGNUM) + { + struct gdbarch *arch = get_regcache_arch (regcache); + size_t size = register_size (arch, HPPA_FLAGS_REGNUM); + char buf[8]; + + store_unsigned_integer (buf, size, flags); + regcache_raw_supply (regcache, HPPA_FLAGS_REGNUM, buf); + } + + /* If the SS_WIDEREGS flag is set, we really do need the full + `struct save_state'. */ + if (flags & HPPA_HPUX_SS_WIDEREGS && len < HPPA_HPUX_SAVE_STATE_SIZE) + error ("Register set contents too small"); + + if (flags & HPPA_HPUX_SS_WIDEREGS) + hppa_hpux_supply_ss_wide (regcache, regnum, save_state); + else + hppa_hpux_supply_ss_narrow (regcache, regnum, save_state); + + hppa_hpux_supply_ss_fpblock (regcache, regnum, save_state); +} + +/* HP-UX register set. */ + +static struct regset hppa_hpux_regset = +{ + NULL, + hppa_hpux_supply_save_state +}; + +static const struct regset * +hppa_hpux_regset_from_core_section (struct gdbarch *gdbarch, + const char *sect_name, size_t sect_size) +{ + if (strcmp (sect_name, ".reg") == 0 + && sect_size >= HPPA_HPUX_PA89_SAVE_STATE_SIZE + 8) + return &hppa_hpux_regset; + + return NULL; +} + + +/* Bit in the `ss_flag' member of `struct save_state' that indicates the state was saved from a system call. From . */ #define HPPA_HPUX_SS_INSYSCALL 0x02 @@ -1532,6 +1677,9 @@ hppa_hpux_init_abi (struct gdbarch_info set_gdbarch_write_pc (gdbarch, hppa_hpux_write_pc); set_gdbarch_unwind_pc (gdbarch, hppa_hpux_unwind_pc); + set_gdbarch_regset_from_core_section + (gdbarch, hppa_hpux_regset_from_core_section); + frame_unwind_append_sniffer (gdbarch, hppa_hpux_sigtramp_unwind_sniffer); observer_attach_inferior_created (hppa_hpux_inferior_created); @@ -1557,9 +1705,24 @@ hppa_hpux_elf_init_abi (struct gdbarch_i hppa_hpux_init_abi (info, gdbarch); } +static enum gdb_osabi +hppa_hpux_core_osabi_sniffer (bfd *abfd) +{ + if (strcmp (bfd_get_target (abfd), "hpux-core") == 0) + return GDB_OSABI_HPUX_SOM; + + return GDB_OSABI_UNKNOWN; +} + void _initialize_hppa_hpux_tdep (void) { + /* BFD doesn't set a flavour for HP-UX style core files. It doesn't + set the architecture either. */ + gdbarch_register_osabi_sniffer (bfd_arch_unknown, + bfd_target_unknown_flavour, + hppa_hpux_core_osabi_sniffer); + gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_HPUX_SOM, hppa_hpux_som_init_abi); gdbarch_register_osabi (bfd_arch_hppa, bfd_mach_hppa20w, GDB_OSABI_HPUX_ELF, Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.676 diff -u -p -r1.676 Makefile.in --- Makefile.in 7 Dec 2004 22:17:59 -0000 1.676 +++ Makefile.in 9 Dec 2004 22:27:51 -0000 @@ -1975,9 +1975,9 @@ hppa-hpux-nat.o: hppa-hpux-nat.c $(defs_ $(target_h) $(gdb_assert_h) $(hppa_tdep_h) $(inf_ptrace_h) \ $(inf_ttrace_h) hppa-hpux-tdep.o: hppa-hpux-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \ - $(osabi_h) $(gdb_string_h) $(frame_h) $(frame_unwind_h) \ - $(trad_frame_h) $(symtab_h) $(objfiles_h) $(inferior_h) $(infcall_h) \ - $(observer_h) $(hppa_tdep_h) + $(osabi_h) $(frame_h) $(frame_unwind_h) $(trad_frame_h) $(symtab_h) \ + $(objfiles_h) $(inferior_h) $(infcall_h) $(observer_h) $(regset_h) \ + $(gdb_string_h) $(hppa_tdep_h) hppa-linux-nat.o: hppa-linux-nat.c $(defs_h) $(gdbcore_h) $(regcache_h) \ $(gdb_string_h) $(inferior_h) $(hppa_tdep_h) $(gregset_h) hppa-linux-tdep.o: hppa-linux-tdep.c $(defs_h) $(gdbcore_h) $(osabi_h) \ Index: config/pa/hppahpux.mt =================================================================== RCS file: /cvs/src/src/gdb/config/pa/hppahpux.mt,v retrieving revision 1.5 diff -u -p -r1.5 hppahpux.mt --- config/pa/hppahpux.mt 5 Dec 2004 19:41:37 -0000 1.5 +++ config/pa/hppahpux.mt 9 Dec 2004 22:27:51 -0000 @@ -1,4 +1,4 @@ # Target: HP PA-RISC running hpux MT_CFLAGS = -DPA_SOM_ONLY=1 -TDEPFILES= hppa-tdep.o hppa-hpux-tdep.o somread.o hpread.o somsolib.o +TDEPFILES= hppa-tdep.o hppa-hpux-tdep.o corelow.o somread.o hpread.o somsolib.o DEPRECATED_TM_FILE= tm-hppah.h