Sync config.sub,config.guess with upstream.
[deliverable/binutils-gdb.git] / gdb / amd64nbsd-tdep.c
CommitLineData
cced5e27
MK
1/* Target-dependent code for NetBSD/amd64.
2
618f726f 3 Copyright (C) 2003-2016 Free Software Foundation, Inc.
cced5e27
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
cced5e27
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/>. */
cced5e27
MK
19
20#include "defs.h"
21#include "arch-utils.h"
22#include "frame.h"
23#include "gdbcore.h"
24#include "osabi.h"
911bc6ee 25#include "symtab.h"
cced5e27 26
85be1ca6 27#include "amd64-tdep.h"
7e654c37
MK
28#include "nbsd-tdep.h"
29#include "solib-svr4.h"
cced5e27
MK
30
31/* Support for signal handlers. */
32
10458914
DJ
33/* Return whether THIS_FRAME corresponds to a NetBSD sigtramp
34 routine. */
911bc6ee
MK
35
36static int
10458914 37amd64nbsd_sigtramp_p (struct frame_info *this_frame)
911bc6ee 38{
10458914 39 CORE_ADDR pc = get_frame_pc (this_frame);
2c02bd72 40 const char *name;
911bc6ee
MK
41
42 find_pc_partial_function (pc, &name, NULL, NULL);
43 return nbsd_pc_in_sigtramp (pc, name);
44}
45
10458914
DJ
46/* Assuming THIS_FRAME corresponds to a NetBSD sigtramp routine,
47 return the address of the associated mcontext structure. */
cced5e27
MK
48
49static CORE_ADDR
10458914 50amd64nbsd_mcontext_addr (struct frame_info *this_frame)
cced5e27 51{
fa34704a 52 CORE_ADDR addr;
cced5e27 53
fa34704a 54 /* The register %r15 points at `struct ucontext' upon entry of a
cced5e27 55 signal trampoline. */
10458914 56 addr = get_frame_register_unsigned (this_frame, AMD64_R15_REGNUM);
fa34704a
MK
57
58 /* The mcontext structure lives as offset 56 in `struct ucontext'. */
59 return addr + 56;
cced5e27
MK
60}
61\f
62/* NetBSD 2.0 or later. */
63
64/* Mapping between the general-purpose registers in `struct reg'
65 format and GDB's register cache layout. */
66
67/* From <machine/reg.h>. */
68int amd64nbsd_r_reg_offset[] =
69{
70 14 * 8, /* %rax */
71 13 * 8, /* %rbx */
72 3 * 8, /* %rcx */
73 2 * 8, /* %rdx */
74 1 * 8, /* %rsi */
75 0 * 8, /* %rdi */
76 12 * 8, /* %rbp */
77 24 * 8, /* %rsp */
0963b4bd 78 4 * 8, /* %r8 .. */
cced5e27
MK
79 5 * 8,
80 6 * 8,
81 7 * 8,
82 8 * 8,
83 9 * 8,
84 10 * 8,
85 11 * 8, /* ... %r15 */
86 21 * 8, /* %rip */
87 23 * 8, /* %eflags */
af233647
MK
88 22 * 8, /* %cs */
89 25 * 8, /* %ss */
cced5e27
MK
90 18 * 8, /* %ds */
91 17 * 8, /* %es */
92 16 * 8, /* %fs */
93 15 * 8 /* %gs */
94};
95
96static void
97amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
98{
99 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
cced5e27
MK
100
101 /* Initialize general-purpose register set details first. */
102 tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
103 tdep->gregset_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
104 tdep->sizeof_gregset = 26 * 8;
105
90f90721 106 amd64_init_abi (info, gdbarch);
cced5e27
MK
107
108 tdep->jb_pc_offset = 7 * 8;
109
110 /* NetBSD has its own convention for signal trampolines. */
911bc6ee 111 tdep->sigtramp_p = amd64nbsd_sigtramp_p;
fa34704a
MK
112 tdep->sigcontext_addr = amd64nbsd_mcontext_addr;
113 tdep->sc_reg_offset = amd64nbsd_r_reg_offset;
cced5e27 114 tdep->sc_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
cced5e27 115
7e654c37
MK
116 /* NetBSD uses SVR4-style shared libraries. */
117 set_solib_svr4_fetch_link_map_offsets
118 (gdbarch, svr4_lp64_fetch_link_map_offsets);
cced5e27
MK
119}
120\f
121
122/* Provide a prototype to silence -Wmissing-prototypes. */
123void _initialize_amd64nbsd_tdep (void);
124
125void
63807e1d 126_initialize_amd64nbsd_tdep (void)
cced5e27
MK
127{
128 /* The NetBSD/amd64 native dependent code makes this assumption. */
90f90721 129 gdb_assert (ARRAY_SIZE (amd64nbsd_r_reg_offset) == AMD64_NUM_GREGS);
cced5e27
MK
130
131 gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
132 GDB_OSABI_NETBSD_ELF, amd64nbsd_init_abi);
133}
This page took 0.768249 seconds and 4 git commands to generate.