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