2011-01-07 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / amd64nbsd-tdep.c
CommitLineData
cced5e27
MK
1/* Target-dependent code for NetBSD/amd64.
2
7b6bb8da 3 Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011
4c38e0a4 4 Free Software Foundation, Inc.
cced5e27
MK
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
cced5e27
MK
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
cced5e27
MK
20
21#include "defs.h"
22#include "arch-utils.h"
23#include "frame.h"
24#include "gdbcore.h"
25#include "osabi.h"
911bc6ee 26#include "symtab.h"
cced5e27
MK
27
28#include "gdb_assert.h"
29
85be1ca6 30#include "amd64-tdep.h"
7e654c37
MK
31#include "nbsd-tdep.h"
32#include "solib-svr4.h"
cced5e27
MK
33
34/* Support for signal handlers. */
35
10458914
DJ
36/* Return whether THIS_FRAME corresponds to a NetBSD sigtramp
37 routine. */
911bc6ee
MK
38
39static int
10458914 40amd64nbsd_sigtramp_p (struct frame_info *this_frame)
911bc6ee 41{
10458914 42 CORE_ADDR pc = get_frame_pc (this_frame);
911bc6ee
MK
43 char *name;
44
45 find_pc_partial_function (pc, &name, NULL, NULL);
46 return nbsd_pc_in_sigtramp (pc, name);
47}
48
10458914
DJ
49/* Assuming THIS_FRAME corresponds to a NetBSD sigtramp routine,
50 return the address of the associated mcontext structure. */
cced5e27
MK
51
52static CORE_ADDR
10458914 53amd64nbsd_mcontext_addr (struct frame_info *this_frame)
cced5e27 54{
fa34704a 55 CORE_ADDR addr;
cced5e27 56
fa34704a 57 /* The register %r15 points at `struct ucontext' upon entry of a
cced5e27 58 signal trampoline. */
10458914 59 addr = get_frame_register_unsigned (this_frame, AMD64_R15_REGNUM);
fa34704a
MK
60
61 /* The mcontext structure lives as offset 56 in `struct ucontext'. */
62 return addr + 56;
cced5e27
MK
63}
64\f
65/* NetBSD 2.0 or later. */
66
67/* Mapping between the general-purpose registers in `struct reg'
68 format and GDB's register cache layout. */
69
70/* From <machine/reg.h>. */
71int amd64nbsd_r_reg_offset[] =
72{
73 14 * 8, /* %rax */
74 13 * 8, /* %rbx */
75 3 * 8, /* %rcx */
76 2 * 8, /* %rdx */
77 1 * 8, /* %rsi */
78 0 * 8, /* %rdi */
79 12 * 8, /* %rbp */
80 24 * 8, /* %rsp */
0963b4bd 81 4 * 8, /* %r8 .. */
cced5e27
MK
82 5 * 8,
83 6 * 8,
84 7 * 8,
85 8 * 8,
86 9 * 8,
87 10 * 8,
88 11 * 8, /* ... %r15 */
89 21 * 8, /* %rip */
90 23 * 8, /* %eflags */
af233647
MK
91 22 * 8, /* %cs */
92 25 * 8, /* %ss */
cced5e27
MK
93 18 * 8, /* %ds */
94 17 * 8, /* %es */
95 16 * 8, /* %fs */
96 15 * 8 /* %gs */
97};
98
99static void
100amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
101{
102 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
cced5e27
MK
103
104 /* Initialize general-purpose register set details first. */
105 tdep->gregset_reg_offset = amd64nbsd_r_reg_offset;
106 tdep->gregset_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
107 tdep->sizeof_gregset = 26 * 8;
108
90f90721 109 amd64_init_abi (info, gdbarch);
cced5e27
MK
110
111 tdep->jb_pc_offset = 7 * 8;
112
113 /* NetBSD has its own convention for signal trampolines. */
911bc6ee 114 tdep->sigtramp_p = amd64nbsd_sigtramp_p;
fa34704a
MK
115 tdep->sigcontext_addr = amd64nbsd_mcontext_addr;
116 tdep->sc_reg_offset = amd64nbsd_r_reg_offset;
cced5e27 117 tdep->sc_num_regs = ARRAY_SIZE (amd64nbsd_r_reg_offset);
cced5e27 118
7e654c37
MK
119 /* NetBSD uses SVR4-style shared libraries. */
120 set_solib_svr4_fetch_link_map_offsets
121 (gdbarch, svr4_lp64_fetch_link_map_offsets);
cced5e27
MK
122}
123\f
124
125/* Provide a prototype to silence -Wmissing-prototypes. */
126void _initialize_amd64nbsd_tdep (void);
127
128void
63807e1d 129_initialize_amd64nbsd_tdep (void)
cced5e27
MK
130{
131 /* The NetBSD/amd64 native dependent code makes this assumption. */
90f90721 132 gdb_assert (ARRAY_SIZE (amd64nbsd_r_reg_offset) == AMD64_NUM_GREGS);
cced5e27
MK
133
134 gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
135 GDB_OSABI_NETBSD_ELF, amd64nbsd_init_abi);
136}
This page took 0.514741 seconds and 4 git commands to generate.