X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fi386-sol2-tdep.c;h=46a7a7c6cafae4b0fbcc2a4632d4d2828c0528c6;hb=d9f8c85b8e4983b7a62abf5affa8030bcfee692e;hp=206e85cfe72cb041c31d64126f6af74b11b85d2d;hpb=6e157172af6003a98be673ce19ea9d5386bd184b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/i386-sol2-tdep.c b/gdb/i386-sol2-tdep.c index 206e85cfe7..46a7a7c6ca 100644 --- a/gdb/i386-sol2-tdep.c +++ b/gdb/i386-sol2-tdep.c @@ -1,5 +1,6 @@ /* Target-dependent code for Solaris x86. - Copyright 2002 Free Software Foundation, Inc. + + Copyright 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -19,15 +20,61 @@ Boston, MA 02111-1307, USA. */ #include "defs.h" +#include "value.h" +#include "osabi.h" + +#include "gdb_string.h" #include "i386-tdep.h" +#include "solib-svr4.h" + +/* From . */ +static int i386_sol2_gregset_reg_offset[] = +{ + 11 * 4, /* %eax */ + 10 * 4, /* %ecx */ + 9 * 4, /* %edx */ + 8 * 4, /* %ebx */ + 17 * 4, /* %esp */ + 6 * 4, /* %ebp */ + 5 * 4, /* %esi */ + 4 * 4, /* %edi */ + 14 * 4, /* %eip */ + 16 * 4, /* %eflags */ + 15 * 4, /* %cs */ + 18 * 4, /* %ss */ + 3 * 4, /* %ds */ + 2 * 4, /* %es */ + 1 * 4, /* %fs */ + 0 * 4 /* %gs */ +}; + +/* Return whether the frame preceding NEXT_FRAME corresponds to a + Solaris sigtramp routine. */ static int -i386_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name) +i386_sol2_sigtramp_p (struct frame_info *next_frame) { - /* Signal handler frames under Solaris 2 are recognized by a return - address of 0xffffffff. */ - return (pc == 0xffffffff); + CORE_ADDR pc = frame_pc_unwind (next_frame); + char *name; + + find_pc_partial_function (pc, &name, NULL, NULL); + return (name && (strcmp ("sigacthandler", name) == 0 + || strcmp (name, "ucbsigvechandler") == 0)); +} + +/* Solaris doesn't have a `struct sigcontext', but it does have a + `mcontext_t' that contains the saved set of machine registers. */ + +static CORE_ADDR +i386_sol2_mcontext_addr (struct frame_info *next_frame) +{ + CORE_ADDR sp, ucontext_addr; + + sp = frame_unwind_register_unsigned (next_frame, I386_ESP_REGNUM); + ucontext_addr = get_frame_memory_unsigned (next_frame, sp + 8, 4); + + return ucontext_addr + 36; } /* Solaris 2. */ @@ -40,11 +87,22 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) /* Solaris is SVR4-based. */ i386_svr4_init_abi (info, gdbarch); - /* Signal trampolines are different from SVR4, in fact they're - rather similar to BSD. */ - set_gdbarch_pc_in_sigtramp (gdbarch, i386_sol2_pc_in_sigtramp); - tdep->sigtramp_saved_pc = i386bsd_sigtramp_saved_pc; - tdep->sc_pc_offset = 36 + 14 * 4; + /* Solaris reserves space for its FPU emulator in `fpregset_t'. + There is also some space reserved for the registers of a Weitek + math coprocessor. */ + tdep->gregset_reg_offset = i386_sol2_gregset_reg_offset; + tdep->gregset_num_regs = ARRAY_SIZE (i386_sol2_gregset_reg_offset); + tdep->sizeof_gregset = 19 * 4; + tdep->sizeof_fpregset = 380; + + /* Signal trampolines are slightly different from SVR4. */ + tdep->sigtramp_p = i386_sol2_sigtramp_p; + tdep->sigcontext_addr = i386_sol2_mcontext_addr; + tdep->sc_reg_offset = tdep->gregset_reg_offset; + tdep->sc_num_regs = tdep->gregset_num_regs; + + set_solib_svr4_fetch_link_map_offsets + (gdbarch, svr4_ilp32_fetch_link_map_offsets); } @@ -65,10 +123,10 @@ void _initialize_i386_sol2_tdep (void); void _initialize_i386_sol2_tdep (void) { - /* Register and ELF OS ABI sniffer for Solaris 2 binaries. */ + /* Register an ELF OS ABI sniffer for Solaris 2 binaries. */ gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour, i386_sol2_osabi_sniffer); - gdbarch_register_osabi (bfd_arch_i386, GDB_OSABI_SOLARIS, + gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SOLARIS, i386_sol2_init_abi); }