]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/amd64-sol2-tdep.c
Fix buffer overrun parsing a corrupt tekhex binary.
[thirdparty/binutils-gdb.git] / gdb / amd64-sol2-tdep.c
CommitLineData
0bbc026e
JM
1/* Target-dependent code for AMD64 Solaris.
2
61baf725 3 Copyright (C) 2001-2017 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"
25#include "regcache.h"
26#include "osabi.h"
27#include "symtab.h"
28
081bf9da 29#include "sol2-tdep.h"
0bbc026e
JM
30#include "amd64-tdep.h"
31#include "solib-svr4.h"
32
33/* Mapping between the general-purpose registers in gregset_t format
34 and GDB's register cache layout. */
35
36/* From <sys/regset.h>. */
37static int amd64_sol2_gregset_reg_offset[] = {
38 14 * 8, /* %rax */
39 11 * 8, /* %rbx */
40 13 * 8, /* %rcx */
41 12 * 8, /* %rdx */
42 9 * 8, /* %rsi */
43 8 * 8, /* %rdi */
44 10 * 8, /* %rbp */
45 20 * 8, /* %rsp */
0963b4bd 46 7 * 8, /* %r8 ... */
0bbc026e
JM
47 6 * 8,
48 5 * 8,
49 4 * 8,
50 3 * 8,
51 2 * 8,
52 1 * 8,
53 0 * 8, /* ... %r15 */
54 17 * 8, /* %rip */
c71bb1cf 55 19 * 8, /* %eflags */
0bbc026e
JM
56 18 * 8, /* %cs */
57 21 * 8, /* %ss */
58 25 * 8, /* %ds */
59 24 * 8, /* %es */
60 22 * 8, /* %fs */
61 23 * 8 /* %gs */
62};
63\f
64
10458914
DJ
65/* Return whether THIS_FRAME corresponds to a Solaris sigtramp
66 routine. */
0bbc026e
JM
67
68static int
10458914 69amd64_sol2_sigtramp_p (struct frame_info *this_frame)
0bbc026e 70{
10458914 71 CORE_ADDR pc = get_frame_pc (this_frame);
2c02bd72 72 const char *name;
0bbc026e
JM
73
74 find_pc_partial_function (pc, &name, NULL, NULL);
75 return (name && (strcmp ("sigacthandler", name) == 0
76 || strcmp (name, "ucbsigvechandler") == 0));
77}
78
79/* Solaris doesn't have a 'struct sigcontext', but it does have a
80 'mcontext_t' that contains the saved set of machine registers. */
81
82static CORE_ADDR
10458914 83amd64_sol2_mcontext_addr (struct frame_info *this_frame)
0bbc026e
JM
84{
85 CORE_ADDR sp, ucontext_addr;
86
10458914
DJ
87 sp = get_frame_register_unsigned (this_frame, AMD64_RSP_REGNUM);
88 ucontext_addr = get_frame_memory_unsigned (this_frame, sp + 8, 8);
0bbc026e
JM
89
90 return ucontext_addr + 72;
91}
92
93static void
94amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
95{
96 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97
98 tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
99 tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
100 tdep->sizeof_gregset = 28 * 8;
101
c55a47e7 102 amd64_init_abi (info, gdbarch, tdesc_amd64);
0bbc026e
JM
103
104 tdep->sigtramp_p = amd64_sol2_sigtramp_p;
105 tdep->sigcontext_addr = amd64_sol2_mcontext_addr;
106 tdep->sc_reg_offset = tdep->gregset_reg_offset;
107 tdep->sc_num_regs = tdep->gregset_num_regs;
108
109 /* Solaris uses SVR4-style shared libraries. */
081bf9da 110 set_gdbarch_skip_solib_resolver (gdbarch, sol2_skip_solib_resolver);
0bbc026e
JM
111 set_solib_svr4_fetch_link_map_offsets
112 (gdbarch, svr4_lp64_fetch_link_map_offsets);
959b8724 113
28439f5e
PA
114 /* How to print LWP PTIDs from core files. */
115 set_gdbarch_core_pid_to_str (gdbarch, sol2_core_pid_to_str);
0bbc026e
JM
116}
117\f
118
119/* Provide a prototype to silence -Wmissing-prototypes. */
120extern void _initialize_amd64_sol2_tdep (void);
121
122void
123_initialize_amd64_sol2_tdep (void)
124{
125 gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
126 GDB_OSABI_SOLARIS, amd64_sol2_init_abi);
127}