ppc476 icache bug workaround
[deliverable/binutils-gdb.git] / gdb / sparc64nbsd-nat.c
CommitLineData
386c036b
MK
1/* Native-dependent code for NetBSD/sparc64.
2
ecd75fc8 3 Copyright (C) 2003-2014 Free Software Foundation, Inc.
9ce5c36a
JT
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
9ce5c36a
JT
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/>. */
9ce5c36a
JT
19
20#include "defs.h"
6df5070e 21#include "gdbcore.h"
90f3cecd 22#include "regcache.h"
1b9445c2 23#include "target.h"
9ce5c36a 24
386c036b
MK
25#include "sparc64-tdep.h"
26#include "sparc-nat.h"
9ce5c36a 27
386c036b
MK
28/* NetBSD is different from the other OSes that support both SPARC and
29 UltraSPARC in that the result of ptrace(2) depends on whether the
30 traced process is 32-bit or 64-bit. */
9ce5c36a 31
386c036b
MK
32static void
33sparc64nbsd_supply_gregset (const struct sparc_gregset *gregset,
34 struct regcache *regcache,
35 int regnum, const void *gregs)
36{
e6d4f032 37 int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
9ce5c36a 38
386c036b
MK
39 if (sparc32)
40 sparc32_supply_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs);
41 else
42 sparc64_supply_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs);
43}
44
45static void
46sparc64nbsd_collect_gregset (const struct sparc_gregset *gregset,
47 const struct regcache *regcache,
48 int regnum, void *gregs)
49{
e6d4f032 50 int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
386c036b
MK
51
52 if (sparc32)
53 sparc32_collect_gregset (&sparc32nbsd_gregset, regcache, regnum, gregs);
54 else
55 sparc64_collect_gregset (&sparc64nbsd_gregset, regcache, regnum, gregs);
56}
57
58static void
db75c717
DM
59sparc64nbsd_supply_fpregset (const struct sparc_fpregset *fpregset,
60 struct regcache *regcache,
386c036b
MK
61 int regnum, const void *fpregs)
62{
e6d4f032 63 int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
386c036b
MK
64
65 if (sparc32)
db75c717 66 sparc32_supply_fpregset (&sparc32_bsd_fpregset, regcache, regnum, fpregs);
386c036b 67 else
db75c717 68 sparc64_supply_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
386c036b
MK
69}
70
71static void
72sparc64nbsd_collect_fpregset (const struct regcache *regcache,
73 int regnum, void *fpregs)
9ce5c36a 74{
e6d4f032 75 int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
386c036b
MK
76
77 if (sparc32)
db75c717 78 sparc32_collect_fpregset (&sparc32_bsd_fpregset, regcache, regnum, fpregs);
386c036b 79 else
db75c717 80 sparc64_collect_fpregset (&sparc64_bsd_fpregset, regcache, regnum, fpregs);
9ce5c36a
JT
81}
82
386c036b
MK
83/* Determine whether `gregset_t' contains register REGNUM. */
84
9ce5c36a 85static int
ec22ec34 86sparc64nbsd_gregset_supplies_p (struct gdbarch *gdbarch, int regnum)
9ce5c36a 87{
ec22ec34
UW
88 if (gdbarch_ptr_bit (gdbarch) == 32)
89 return sparc32_gregset_supplies_p (gdbarch, regnum);
386c036b
MK
90
91 /* Integer registers. */
92 if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_G7_REGNUM)
93 || (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
94 || (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_L7_REGNUM)
95 || (regnum >= SPARC_I0_REGNUM && regnum <= SPARC_I7_REGNUM))
96 return 1;
97
98 /* Control registers. */
99 if (regnum == SPARC64_PC_REGNUM
100 || regnum == SPARC64_NPC_REGNUM
101 || regnum == SPARC64_STATE_REGNUM
102 || regnum == SPARC64_Y_REGNUM)
103 return 1;
104
105 return 0;
9ce5c36a
JT
106}
107
386c036b
MK
108/* Determine whether `fpregset_t' contains register REGNUM. */
109
110static int
ec22ec34 111sparc64nbsd_fpregset_supplies_p (struct gdbarch *gdbarch, int regnum)
9ce5c36a 112{
ec22ec34
UW
113 if (gdbarch_ptr_bit (gdbarch) == 32)
114 return sparc32_fpregset_supplies_p (gdbarch, regnum);
386c036b
MK
115
116 /* Floating-point registers. */
117 if ((regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
118 || (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM))
119 return 1;
120
121 /* Control registers. */
122 if (regnum == SPARC64_FSR_REGNUM)
123 return 1;
124
125 return 0;
9ce5c36a 126}
90f3cecd
MK
127\f
128
129/* Support for debugging kernel virtual memory images. */
130
131#include <sys/types.h>
132#include <machine/pcb.h>
133
134#include "bsd-kvm.h"
135
136static int
137sparc64nbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
138{
6df5070e 139 u_int64_t state;
90f3cecd
MK
140 int regnum;
141
142 /* The following is true for NetBSD 1.6.2:
143
e5a6ba44
MK
144 The pcb contains %sp and %pc, %pstate and %cwp. From this
145 information we reconstruct the register state as it would look
146 when we just returned from cpu_switch(). */
90f3cecd
MK
147
148 /* The stack pointer shouldn't be zero. */
149 if (pcb->pcb_sp == 0)
150 return 0;
151
6df5070e
MK
152 /* If the program counter is zero, this is probably a core dump, and
153 we can get %pc from the stack. */
154 if (pcb->pcb_pc == 0)
155 read_memory(pcb->pcb_sp + BIAS - 176 + (11 * 8),
156 (gdb_byte *)&pcb->pcb_pc, sizeof pcb->pcb_pc);
157
90f3cecd
MK
158 regcache_raw_supply (regcache, SPARC_SP_REGNUM, &pcb->pcb_sp);
159 regcache_raw_supply (regcache, SPARC64_PC_REGNUM, &pcb->pcb_pc);
160
6df5070e
MK
161 state = pcb->pcb_pstate << 8 | pcb->pcb_cwp;
162 regcache_raw_supply (regcache, SPARC64_STATE_REGNUM, &state);
163
90f3cecd
MK
164 sparc_supply_rwindow (regcache, pcb->pcb_sp, -1);
165
166 return 1;
167}
9ce5c36a 168
386c036b
MK
169\f
170/* Provide a prototype to silence -Wmissing-prototypes. */
90f3cecd 171void _initialize_sparc64nbsd_nat (void);
386c036b 172
9ce5c36a 173void
90f3cecd 174_initialize_sparc64nbsd_nat (void)
9ce5c36a 175{
386c036b
MK
176 sparc_supply_gregset = sparc64nbsd_supply_gregset;
177 sparc_collect_gregset = sparc64nbsd_collect_gregset;
178 sparc_supply_fpregset = sparc64nbsd_supply_fpregset;
179 sparc_collect_fpregset = sparc64nbsd_collect_fpregset;
180 sparc_gregset_supplies_p = sparc64nbsd_gregset_supplies_p;
181 sparc_fpregset_supplies_p = sparc64nbsd_fpregset_supplies_p;
90f3cecd 182
1b9445c2
MK
183 /* We've got nothing to add to the generic SPARC target. */
184 add_target (sparc_target ());
185
90f3cecd
MK
186 /* Support debugging kernel virtual memory images. */
187 bsd_kvm_add_target (sparc64nbsd_supply_pcb);
9ce5c36a 188}
This page took 1.592318 seconds and 4 git commands to generate.