]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/amd64-sol2-tdep.c
Two fixes in dwarf-mode.el
[thirdparty/binutils-gdb.git] / gdb / amd64-sol2-tdep.c
CommitLineData
0bbc026e
JM
1/* Target-dependent code for AMD64 Solaris.
2
b811d2c2 3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
081bf9da 4
0bbc026e
JM
5 Contributed by Joseph Myers, CodeSourcery, LLC.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
0bbc026e
JM
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0bbc026e
JM
21
22#include "defs.h"
23#include "frame.h"
24#include "gdbcore.h"
d55e5aa6 25#include "regcache.h"
4de283e4
TT
26#include "osabi.h"
27#include "symtab.h"
28
081bf9da 29#include "sol2-tdep.h"
4de283e4 30#include "amd64-tdep.h"
268a13a5 31#include "gdbsupport/x86-xstate.h"
0bbc026e
JM
32#include "solib-svr4.h"
33
34/* Mapping between the general-purpose registers in gregset_t format
35 and GDB's register cache layout. */
36
37/* From <sys/regset.h>. */
38static int amd64_sol2_gregset_reg_offset[] = {
39 14 * 8, /* %rax */
40 11 * 8, /* %rbx */
41 13 * 8, /* %rcx */
42 12 * 8, /* %rdx */
43 9 * 8, /* %rsi */
44 8 * 8, /* %rdi */
45 10 * 8, /* %rbp */
46 20 * 8, /* %rsp */
0963b4bd 47 7 * 8, /* %r8 ... */
0bbc026e
JM
48 6 * 8,
49 5 * 8,
50 4 * 8,
51 3 * 8,
52 2 * 8,
53 1 * 8,
54 0 * 8, /* ... %r15 */
55 17 * 8, /* %rip */
c71bb1cf 56 19 * 8, /* %eflags */
0bbc026e
JM
57 18 * 8, /* %cs */
58 21 * 8, /* %ss */
59 25 * 8, /* %ds */
60 24 * 8, /* %es */
61 22 * 8, /* %fs */
62 23 * 8 /* %gs */
63};
64\f
65
0bbc026e
JM
66/* Solaris doesn't have a 'struct sigcontext', but it does have a
67 'mcontext_t' that contains the saved set of machine registers. */
68
69static CORE_ADDR
10458914 70amd64_sol2_mcontext_addr (struct frame_info *this_frame)
0bbc026e
JM
71{
72 CORE_ADDR sp, ucontext_addr;
73
10458914
DJ
74 sp = get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM);
75 ucontext_addr = get_frame_memory_unsigned (this_frame, sp + 8, 8);
0bbc026e
JM
76
77 return ucontext_addr + 72;
78}
79
80static void
81amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
82{
83 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
84
85 tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
86 tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
87 tdep->sizeof_gregset = 28 * 8;
88
2434b019 89 amd64_init_abi (info, gdbarch,
41206e32 90 amd64_target_description (X86_XSTATE_SSE_MASK, true));
0bbc026e 91
d412e696
RO
92 sol2_init_abi (info, gdbarch);
93
94 tdep->sigtramp_p = sol2_sigtramp_p;
0bbc026e
JM
95 tdep->sigcontext_addr = amd64_sol2_mcontext_addr;
96 tdep->sc_reg_offset = tdep->gregset_reg_offset;
97 tdep->sc_num_regs = tdep->gregset_num_regs;
98
99 /* Solaris uses SVR4-style shared libraries. */
100 set_solib_svr4_fetch_link_map_offsets
101 (gdbarch, svr4_lp64_fetch_link_map_offsets);
102}
0bbc026e 103
6c265988 104void _initialize_amd64_sol2_tdep ();
0bbc026e 105void
6c265988 106_initialize_amd64_sol2_tdep ()
0bbc026e
JM
107{
108 gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
109 GDB_OSABI_SOLARIS, amd64_sol2_init_abi);
110}