]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/i386-sol2-tdep.c
update copyright year range in GDB files
[thirdparty/binutils-gdb.git] / gdb / i386-sol2-tdep.c
CommitLineData
8201327c 1/* Target-dependent code for Solaris x86.
911bc6ee 2
61baf725 3 Copyright (C) 2002-2017 Free Software Foundation, Inc.
8201327c
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
8201327c
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8201327c
MK
19
20#include "defs.h"
52e9098c 21#include "value.h"
4be87837 22#include "osabi.h"
8201327c 23
081bf9da 24#include "sol2-tdep.h"
8201327c 25#include "i386-tdep.h"
75f501b5 26#include "solib-svr4.h"
8201327c 27
6a9756ed
MK
28/* From <ia32/sys/reg.h>. */
29static int i386_sol2_gregset_reg_offset[] =
30{
31 11 * 4, /* %eax */
32 10 * 4, /* %ecx */
33 9 * 4, /* %edx */
34 8 * 4, /* %ebx */
35 17 * 4, /* %esp */
36 6 * 4, /* %ebp */
37 5 * 4, /* %esi */
38 4 * 4, /* %edi */
39 14 * 4, /* %eip */
40 16 * 4, /* %eflags */
41 15 * 4, /* %cs */
42 18 * 4, /* %ss */
43 3 * 4, /* %ds */
44 2 * 4, /* %es */
45 1 * 4, /* %fs */
46 0 * 4 /* %gs */
47};
48
10458914
DJ
49/* Return whether THIS_FRAME corresponds to a Solaris sigtramp
50 routine. */
d9f8c85b 51
8201327c 52static int
10458914 53i386_sol2_sigtramp_p (struct frame_info *this_frame)
8201327c 54{
10458914 55 CORE_ADDR pc = get_frame_pc (this_frame);
2c02bd72 56 const char *name;
911bc6ee 57
d9f8c85b
MK
58 find_pc_partial_function (pc, &name, NULL, NULL);
59 return (name && (strcmp ("sigacthandler", name) == 0
60 || strcmp (name, "ucbsigvechandler") == 0));
8201327c
MK
61}
62
8349554d
MK
63/* Solaris doesn't have a `struct sigcontext', but it does have a
64 `mcontext_t' that contains the saved set of machine registers. */
65
66static CORE_ADDR
10458914 67i386_sol2_mcontext_addr (struct frame_info *this_frame)
8349554d
MK
68{
69 CORE_ADDR sp, ucontext_addr;
70
10458914
DJ
71 sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
72 ucontext_addr = get_frame_memory_unsigned (this_frame, sp + 8, 4);
8349554d
MK
73
74 return ucontext_addr + 36;
75}
76
149ad273
UW
77/* SunPRO encodes the static variables. This is not related to C++
78 mangling, it is done for C too. */
79
0d5cff50
DE
80static const char *
81i386_sol2_static_transform_name (const char *name)
149ad273 82{
149ad273
UW
83 if (name[0] == '.')
84 {
2e7bf1d7
PA
85 const char *p;
86
149ad273
UW
87 /* For file-local statics there will be a period, a bunch of
88 junk (the contents of which match a string given in the
89 N_OPT), a period and the name. For function-local statics
90 there will be a bunch of junk (which seems to change the
91 second character from 'A' to 'B'), a period, the name of the
92 function, and the name. So just skip everything before the
93 last period. */
94 p = strrchr (name, '.');
95 if (p != NULL)
96 name = p + 1;
97 }
98 return name;
99}
100
8201327c
MK
101/* Solaris 2. */
102
103static void
104i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
105{
106 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
107
108 /* Solaris is SVR4-based. */
109 i386_svr4_init_abi (info, gdbarch);
110
203c3895
UW
111 /* The SunPRO compiler puts out 0 instead of the address in N_SO symbols,
112 and for SunPRO 3.0, N_FUN symbols too. */
113 set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
114
149ad273
UW
115 /* Handle SunPRO encoding of static symbols. */
116 set_gdbarch_static_transform_name (gdbarch, i386_sol2_static_transform_name);
117
6a9756ed
MK
118 /* Solaris reserves space for its FPU emulator in `fpregset_t'.
119 There is also some space reserved for the registers of a Weitek
120 math coprocessor. */
121 tdep->gregset_reg_offset = i386_sol2_gregset_reg_offset;
122 tdep->gregset_num_regs = ARRAY_SIZE (i386_sol2_gregset_reg_offset);
123 tdep->sizeof_gregset = 19 * 4;
124 tdep->sizeof_fpregset = 380;
125
911bc6ee
MK
126 /* Signal trampolines are slightly different from SVR4. */
127 tdep->sigtramp_p = i386_sol2_sigtramp_p;
8349554d
MK
128 tdep->sigcontext_addr = i386_sol2_mcontext_addr;
129 tdep->sc_reg_offset = tdep->gregset_reg_offset;
130 tdep->sc_num_regs = tdep->gregset_num_regs;
75f501b5 131
081bf9da
MK
132 /* Solaris has SVR4-style shared libraries. */
133 set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
75f501b5
MK
134 set_solib_svr4_fetch_link_map_offsets
135 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
959b8724 136
28439f5e
PA
137 /* How to print LWP PTIDs from core files. */
138 set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
8201327c
MK
139}
140\f
141
6e157172
MK
142static enum gdb_osabi
143i386_sol2_osabi_sniffer (bfd *abfd)
144{
145 /* If we have a section named .SUNW_version, then it is almost
146 certainly Solaris 2. */
147 if (bfd_get_section_by_name (abfd, ".SUNW_version"))
148 return GDB_OSABI_SOLARIS;
149
150 return GDB_OSABI_UNKNOWN;
151}
152
8201327c
MK
153/* Provide a prototype to silence -Wmissing-prototypes. */
154void _initialize_i386_sol2_tdep (void);
155
156void
157_initialize_i386_sol2_tdep (void)
158{
0c52bd59 159 /* Register an ELF OS ABI sniffer for Solaris 2 binaries. */
6e157172
MK
160 gdbarch_register_osabi_sniffer (bfd_arch_i386, bfd_target_elf_flavour,
161 i386_sol2_osabi_sniffer);
162
05816f70 163 gdbarch_register_osabi (bfd_arch_i386, 0, GDB_OSABI_SOLARIS,
8201327c
MK
164 i386_sol2_init_abi);
165}