C++: dlsym casts in gdb/linux-thread-db.c and gdb/gdbserver/thread-db.c
[deliverable/binutils-gdb.git] / gdb / i386-sol2-nat.c
CommitLineData
6b16acab
MK
1/* Native-dependent code for Solaris x86.
2
32d0add0 3 Copyright (C) 2004-2015 Free Software Foundation, Inc.
6b16acab
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
6b16acab
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/>. */
6b16acab
MK
19
20#include "defs.h"
21#include "regcache.h"
22
23#include <sys/procfs.h>
24#include "gregset.h"
d1a7880c
PA
25#include "target.h"
26#include "procfs.h"
6b16acab
MK
27
28/* This file provids the (temporary) glue between the Solaris x86
29 target dependent code and the machine independent SVR4 /proc
30 support. */
31
32/* Solaris 10 (Solaris 2.10, SunOS 5.10) and up support two process
33 data models, the traditional 32-bit data model (ILP32) and the
34 64-bit data model (LP64). The format of /proc depends on the data
35 model of the observer (the controlling process, GDB in our case).
36 The Solaris header files conveniently define PR_MODEL_NATIVE to the
37 data model of the controlling process. If its value is
38 PR_MODEL_LP64, we know that GDB is being compiled as a 64-bit
39 program.
40
41 Note that a 32-bit GDB won't be able to debug a 64-bit target
42 process using /proc on Solaris. */
43
44#if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
45
46#include "amd64-nat.h"
47#include "amd64-tdep.h"
48
0bbc026e
JM
49/* Mapping between the general-purpose registers in gregset_t format
50 and GDB's register cache layout. */
51
52/* From <sys/regset.h>. */
53static int amd64_sol2_gregset64_reg_offset[] = {
54 14 * 8, /* %rax */
55 11 * 8, /* %rbx */
56 13 * 8, /* %rcx */
57 12 * 8, /* %rdx */
58 9 * 8, /* %rsi */
59 8 * 8, /* %rdi */
60 10 * 8, /* %rbp */
61 20 * 8, /* %rsp */
1777feb0 62 7 * 8, /* %r8 ... */
0bbc026e
JM
63 6 * 8,
64 5 * 8,
65 4 * 8,
66 3 * 8,
67 2 * 8,
68 1 * 8,
69 0 * 8, /* ... %r15 */
70 17 * 8, /* %rip */
c71bb1cf 71 19 * 8, /* %eflags */
0bbc026e
JM
72 18 * 8, /* %cs */
73 21 * 8, /* %ss */
74 25 * 8, /* %ds */
75 24 * 8, /* %es */
76 22 * 8, /* %fs */
77 23 * 8 /* %gs */
78};
79
80/* 32-bit registers are provided by Solaris in 64-bit format, so just
81 give a subset of the list above. */
82static int amd64_sol2_gregset32_reg_offset[] = {
83 14 * 8, /* %eax */
84 13 * 8, /* %ecx */
85 12 * 8, /* %edx */
86 11 * 8, /* %ebx */
87 20 * 8, /* %esp */
88 10 * 8, /* %ebp */
89 9 * 8, /* %esi */
90 8 * 8, /* %edi */
91 17 * 8, /* %eip */
c71bb1cf 92 19 * 8, /* %eflags */
0bbc026e
JM
93 18 * 8, /* %cs */
94 21 * 8, /* %ss */
95 25 * 8, /* %ds */
96 24 * 8, /* %es */
97 22 * 8, /* %fs */
98 23 * 8 /* %gs */
99};
100
6b16acab 101void
7f7fe91e 102supply_gregset (struct regcache *regcache, const prgregset_t *gregs)
6b16acab 103{
7f7fe91e 104 amd64_supply_native_gregset (regcache, gregs, -1);
6b16acab
MK
105}
106
107void
7f7fe91e 108supply_fpregset (struct regcache *regcache, const prfpregset_t *fpregs)
6b16acab 109{
7f7fe91e 110 amd64_supply_fxsave (regcache, -1, fpregs);
6b16acab
MK
111}
112
113void
7f7fe91e
UW
114fill_gregset (const struct regcache *regcache,
115 prgregset_t *gregs, int regnum)
6b16acab 116{
7f7fe91e 117 amd64_collect_native_gregset (regcache, gregs, regnum);
6b16acab
MK
118}
119
120void
7f7fe91e
UW
121fill_fpregset (const struct regcache *regcache,
122 prfpregset_t *fpregs, int regnum)
6b16acab 123{
7f7fe91e 124 amd64_collect_fxsave (regcache, regnum, fpregs);
6b16acab
MK
125}
126
127#else
128
f69c55b2 129/* For 32-bit Solaris x86, we use the Unix SVR4 code in i386v4-nat.c. */
6b16acab
MK
130
131#endif
0bbc026e
JM
132
133/* Provide a prototype to silence -Wmissing-prototypes. */
134extern void _initialize_amd64_sol2_nat (void);
135
136void
137_initialize_amd64_sol2_nat (void)
138{
d1a7880c
PA
139 struct target_ops *t;
140
141 /* Fill in the generic procfs methods. */
142 t = procfs_target ();
143
1777feb0 144#ifdef NEW_PROC_API /* Solaris 6 and above can do HW watchpoints. */
d1a7880c
PA
145 procfs_use_watchpoints (t);
146#endif
147
0bbc026e
JM
148#if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
149 amd64_native_gregset32_reg_offset = amd64_sol2_gregset32_reg_offset;
150 amd64_native_gregset32_num_regs =
151 ARRAY_SIZE (amd64_sol2_gregset32_reg_offset);
152 amd64_native_gregset64_reg_offset = amd64_sol2_gregset64_reg_offset;
153 amd64_native_gregset64_num_regs =
154 ARRAY_SIZE (amd64_sol2_gregset64_reg_offset);
155#endif
d1a7880c
PA
156
157 add_target (t);
0bbc026e 158}
This page took 0.837301 seconds and 4 git commands to generate.