1130803Smarcel/* Target-dependent code for Solaris x86. 2130803Smarcel Copyright 2002, 2003 Free Software Foundation, Inc. 3130803Smarcel 4130803Smarcel This file is part of GDB. 5130803Smarcel 6130803Smarcel This program is free software; you can redistribute it and/or modify 7130803Smarcel it under the terms of the GNU General Public License as published by 8130803Smarcel the Free Software Foundation; either version 2 of the License, or 9130803Smarcel (at your option) any later version. 10130803Smarcel 11130803Smarcel This program is distributed in the hope that it will be useful, 12130803Smarcel but WITHOUT ANY WARRANTY; without even the implied warranty of 13130803Smarcel MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14130803Smarcel GNU General Public License for more details. 15130803Smarcel 16130803Smarcel You should have received a copy of the GNU General Public License 17130803Smarcel along with this program; if not, write to the Free Software 18130803Smarcel Foundation, Inc., 59 Temple Place - Suite 330, 19130803Smarcel Boston, MA 02111-1307, USA. */ 20130803Smarcel 21130803Smarcel#include "defs.h" 22130803Smarcel#include "value.h" 23130803Smarcel#include "osabi.h" 24130803Smarcel 25130803Smarcel#include "i386-tdep.h" 26130803Smarcel 27130803Smarcel/* From <ia32/sys/reg.h>. */ 28130803Smarcelstatic int i386_sol2_gregset_reg_offset[] = 29130803Smarcel{ 30130803Smarcel 11 * 4, /* %eax */ 31130803Smarcel 10 * 4, /* %ecx */ 32130803Smarcel 9 * 4, /* %edx */ 33130803Smarcel 8 * 4, /* %ebx */ 34130803Smarcel 17 * 4, /* %esp */ 35130803Smarcel 6 * 4, /* %ebp */ 36130803Smarcel 5 * 4, /* %esi */ 37130803Smarcel 4 * 4, /* %edi */ 38130803Smarcel 14 * 4, /* %eip */ 39130803Smarcel 16 * 4, /* %eflags */ 40130803Smarcel 15 * 4, /* %cs */ 41130803Smarcel 18 * 4, /* %ss */ 42130803Smarcel 3 * 4, /* %ds */ 43130803Smarcel 2 * 4, /* %es */ 44130803Smarcel 1 * 4, /* %fs */ 45130803Smarcel 0 * 4 /* %gs */ 46130803Smarcel}; 47130803Smarcel 48130803Smarcelstatic int 49130803Smarceli386_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name) 50130803Smarcel{ 51130803Smarcel /* Signal handler frames under Solaris 2 are recognized by a return 52130803Smarcel address of 0xffffffff. */ 53130803Smarcel return (pc == 0xffffffff); 54130803Smarcel} 55130803Smarcel 56130803Smarcel/* Solaris doesn't have a `struct sigcontext', but it does have a 57130803Smarcel `mcontext_t' that contains the saved set of machine registers. */ 58130803Smarcel 59130803Smarcelstatic CORE_ADDR 60130803Smarceli386_sol2_mcontext_addr (struct frame_info *next_frame) 61130803Smarcel{ 62130803Smarcel CORE_ADDR sp, ucontext_addr; 63130803Smarcel 64130803Smarcel sp = frame_unwind_register_unsigned (next_frame, I386_ESP_REGNUM); 65130803Smarcel ucontext_addr = get_frame_memory_unsigned (next_frame, sp + 8, 4); 66130803Smarcel 67130803Smarcel return ucontext_addr + 36; 68130803Smarcel} 69130803Smarcel 70130803Smarcel/* Solaris 2. */ 71130803Smarcel 72130803Smarcelstatic void 73130803Smarceli386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) 74130803Smarcel{ 75130803Smarcel struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); 76130803Smarcel 77130803Smarcel /* Solaris is SVR4-based. */ 78130803Smarcel i386_svr4_init_abi (info, gdbarch); 79130803Smarcel 80130803Smarcel /* Solaris reserves space for its FPU emulator in `fpregset_t'. 81130803Smarcel There is also some space reserved for the registers of a Weitek 82130803Smarcel math coprocessor. */ 83130803Smarcel tdep->gregset_reg_offset = i386_sol2_gregset_reg_offset; 84130803Smarcel tdep->gregset_num_regs = ARRAY_SIZE (i386_sol2_gregset_reg_offset); 85130803Smarcel tdep->sizeof_gregset = 19 * 4; 86130803Smarcel tdep->sizeof_fpregset = 380; 87130803Smarcel 88130803Smarcel tdep->sigcontext_addr = i386_sol2_mcontext_addr; 89130803Smarcel tdep->sc_reg_offset = tdep->gregset_reg_offset; 90130803Smarcel tdep->sc_num_regs = tdep->gregset_num_regs; 91130803Smarcel 92130803Smarcel /* Signal trampolines are slightly different from SVR4. */ 93130803Smarcel set_gdbarch_pc_in_sigtramp (gdbarch, i386_sol2_pc_in_sigtramp); 94130803Smarcel} 95130803Smarcel 96130803Smarcel 97130803Smarcelstatic enum gdb_osabi 98130803Smarceli386_sol2_osabi_sniffer (bfd *abfd) 99130803Smarcel{ 100130803Smarcel /* If we have a section named .SUNW_version, then it is almost 101130803Smarcel certainly Solaris 2. */ 102130803Smarcel if (bfd_get_section_by_name (abfd, ".SUNW_version")) 103130803Smarcel return GDB_OSABI_SOLARIS; 104130803Smarcel 105130803Smarcel return GDB_OSABI_UNKNOWN; 106130803Smarcel} 107130803Smarcel 108130803Smarcel/* Provide a prototype to silence -Wmissing-prototypes. */ 109130803Smarcelvoid _initialize_i386_sol2_tdep (void); 110130803Smarcel 111130803Smarcelvoid 112130803Smarcel_initialize_i386_sol2_tdep (void) 113130803Smarcel{ 114130803Smarcel /* Register an ELF OS ABI sniffer for Solaris 2 binaries. */ 115130803Smarcel gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour, 116130803Smarcel i386_sol2_osabi_sniffer); 117130803Smarcel 118130803Smarcel gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SOLARIS, 119130803Smarcel i386_sol2_init_abi); 120130803Smarcel} 121