arm-linux-nat.c revision 1.3 1 1.1 christos /* GNU/Linux on ARM native support.
2 1.3 christos Copyright (C) 1999-2015 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GDB.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 1.1 christos
19 1.1 christos #include "defs.h"
20 1.1 christos #include "inferior.h"
21 1.1 christos #include "gdbcore.h"
22 1.1 christos #include "regcache.h"
23 1.1 christos #include "target.h"
24 1.1 christos #include "linux-nat.h"
25 1.1 christos #include "target-descriptions.h"
26 1.1 christos #include "auxv.h"
27 1.1 christos #include "observer.h"
28 1.1 christos #include "gdbthread.h"
29 1.1 christos
30 1.1 christos #include "arm-tdep.h"
31 1.1 christos #include "arm-linux-tdep.h"
32 1.1 christos
33 1.1 christos #include <elf/common.h>
34 1.1 christos #include <sys/user.h>
35 1.1 christos #include <sys/ptrace.h>
36 1.1 christos #include <sys/utsname.h>
37 1.1 christos #include <sys/procfs.h>
38 1.1 christos
39 1.1 christos /* Prototypes for supply_gregset etc. */
40 1.1 christos #include "gregset.h"
41 1.1 christos
42 1.1 christos /* Defines ps_err_e, struct ps_prochandle. */
43 1.1 christos #include "gdb_proc_service.h"
44 1.1 christos
45 1.1 christos #ifndef PTRACE_GET_THREAD_AREA
46 1.1 christos #define PTRACE_GET_THREAD_AREA 22
47 1.1 christos #endif
48 1.1 christos
49 1.1 christos #ifndef PTRACE_GETWMMXREGS
50 1.1 christos #define PTRACE_GETWMMXREGS 18
51 1.1 christos #define PTRACE_SETWMMXREGS 19
52 1.1 christos #endif
53 1.1 christos
54 1.1 christos #ifndef PTRACE_GETVFPREGS
55 1.1 christos #define PTRACE_GETVFPREGS 27
56 1.1 christos #define PTRACE_SETVFPREGS 28
57 1.1 christos #endif
58 1.1 christos
59 1.1 christos #ifndef PTRACE_GETHBPREGS
60 1.1 christos #define PTRACE_GETHBPREGS 29
61 1.1 christos #define PTRACE_SETHBPREGS 30
62 1.1 christos #endif
63 1.1 christos
64 1.1 christos /* A flag for whether the WMMX registers are available. */
65 1.1 christos static int arm_linux_has_wmmx_registers;
66 1.1 christos
67 1.1 christos /* The number of 64-bit VFP registers we have (expect this to be 0,
68 1.1 christos 16, or 32). */
69 1.1 christos static int arm_linux_vfp_register_count;
70 1.1 christos
71 1.1 christos extern int arm_apcs_32;
72 1.1 christos
73 1.1 christos /* On GNU/Linux, threads are implemented as pseudo-processes, in which
74 1.1 christos case we may be tracing more than one process at a time. In that
75 1.1 christos case, inferior_ptid will contain the main process ID and the
76 1.1 christos individual thread (process) ID. get_thread_id () is used to get
77 1.1 christos the thread id if it's available, and the process id otherwise. */
78 1.1 christos
79 1.1 christos static int
80 1.1 christos get_thread_id (ptid_t ptid)
81 1.1 christos {
82 1.1 christos int tid = ptid_get_lwp (ptid);
83 1.1 christos if (0 == tid)
84 1.1 christos tid = ptid_get_pid (ptid);
85 1.1 christos return tid;
86 1.1 christos }
87 1.1 christos
88 1.1 christos #define GET_THREAD_ID(PTID) get_thread_id (PTID)
89 1.1 christos
90 1.1 christos /* Get the value of a particular register from the floating point
91 1.1 christos state of the process and store it into regcache. */
92 1.1 christos
93 1.1 christos static void
94 1.1 christos fetch_fpregister (struct regcache *regcache, int regno)
95 1.1 christos {
96 1.1 christos int ret, tid;
97 1.1 christos gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
98 1.1 christos
99 1.1 christos /* Get the thread id for the ptrace call. */
100 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
101 1.1 christos
102 1.1 christos /* Read the floating point state. */
103 1.1 christos ret = ptrace (PT_GETFPREGS, tid, 0, fp);
104 1.1 christos if (ret < 0)
105 1.1 christos {
106 1.1 christos warning (_("Unable to fetch floating point register."));
107 1.1 christos return;
108 1.1 christos }
109 1.1 christos
110 1.1 christos /* Fetch fpsr. */
111 1.1 christos if (ARM_FPS_REGNUM == regno)
112 1.1 christos regcache_raw_supply (regcache, ARM_FPS_REGNUM,
113 1.1 christos fp + NWFPE_FPSR_OFFSET);
114 1.1 christos
115 1.1 christos /* Fetch the floating point register. */
116 1.1 christos if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
117 1.1 christos supply_nwfpe_register (regcache, regno, fp);
118 1.1 christos }
119 1.1 christos
120 1.1 christos /* Get the whole floating point state of the process and store it
121 1.1 christos into regcache. */
122 1.1 christos
123 1.1 christos static void
124 1.1 christos fetch_fpregs (struct regcache *regcache)
125 1.1 christos {
126 1.1 christos int ret, regno, tid;
127 1.1 christos gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
128 1.1 christos
129 1.1 christos /* Get the thread id for the ptrace call. */
130 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
131 1.1 christos
132 1.1 christos /* Read the floating point state. */
133 1.1 christos ret = ptrace (PT_GETFPREGS, tid, 0, fp);
134 1.1 christos if (ret < 0)
135 1.1 christos {
136 1.1 christos warning (_("Unable to fetch the floating point registers."));
137 1.1 christos return;
138 1.1 christos }
139 1.1 christos
140 1.1 christos /* Fetch fpsr. */
141 1.1 christos regcache_raw_supply (regcache, ARM_FPS_REGNUM,
142 1.1 christos fp + NWFPE_FPSR_OFFSET);
143 1.1 christos
144 1.1 christos /* Fetch the floating point registers. */
145 1.1 christos for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
146 1.1 christos supply_nwfpe_register (regcache, regno, fp);
147 1.1 christos }
148 1.1 christos
149 1.1 christos /* Save a particular register into the floating point state of the
150 1.1 christos process using the contents from regcache. */
151 1.1 christos
152 1.1 christos static void
153 1.1 christos store_fpregister (const struct regcache *regcache, int regno)
154 1.1 christos {
155 1.1 christos int ret, tid;
156 1.1 christos gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
157 1.1 christos
158 1.1 christos /* Get the thread id for the ptrace call. */
159 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
160 1.1 christos
161 1.1 christos /* Read the floating point state. */
162 1.1 christos ret = ptrace (PT_GETFPREGS, tid, 0, fp);
163 1.1 christos if (ret < 0)
164 1.1 christos {
165 1.1 christos warning (_("Unable to fetch the floating point registers."));
166 1.1 christos return;
167 1.1 christos }
168 1.1 christos
169 1.1 christos /* Store fpsr. */
170 1.1 christos if (ARM_FPS_REGNUM == regno
171 1.1 christos && REG_VALID == regcache_register_status (regcache, ARM_FPS_REGNUM))
172 1.1 christos regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
173 1.1 christos
174 1.1 christos /* Store the floating point register. */
175 1.1 christos if (regno >= ARM_F0_REGNUM && regno <= ARM_F7_REGNUM)
176 1.1 christos collect_nwfpe_register (regcache, regno, fp);
177 1.1 christos
178 1.1 christos ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
179 1.1 christos if (ret < 0)
180 1.1 christos {
181 1.1 christos warning (_("Unable to store floating point register."));
182 1.1 christos return;
183 1.1 christos }
184 1.1 christos }
185 1.1 christos
186 1.1 christos /* Save the whole floating point state of the process using
187 1.1 christos the contents from regcache. */
188 1.1 christos
189 1.1 christos static void
190 1.1 christos store_fpregs (const struct regcache *regcache)
191 1.1 christos {
192 1.1 christos int ret, regno, tid;
193 1.1 christos gdb_byte fp[ARM_LINUX_SIZEOF_NWFPE];
194 1.1 christos
195 1.1 christos /* Get the thread id for the ptrace call. */
196 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
197 1.1 christos
198 1.1 christos /* Read the floating point state. */
199 1.1 christos ret = ptrace (PT_GETFPREGS, tid, 0, fp);
200 1.1 christos if (ret < 0)
201 1.1 christos {
202 1.1 christos warning (_("Unable to fetch the floating point registers."));
203 1.1 christos return;
204 1.1 christos }
205 1.1 christos
206 1.1 christos /* Store fpsr. */
207 1.1 christos if (REG_VALID == regcache_register_status (regcache, ARM_FPS_REGNUM))
208 1.1 christos regcache_raw_collect (regcache, ARM_FPS_REGNUM, fp + NWFPE_FPSR_OFFSET);
209 1.1 christos
210 1.1 christos /* Store the floating point registers. */
211 1.1 christos for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
212 1.1 christos if (REG_VALID == regcache_register_status (regcache, regno))
213 1.1 christos collect_nwfpe_register (regcache, regno, fp);
214 1.1 christos
215 1.1 christos ret = ptrace (PTRACE_SETFPREGS, tid, 0, fp);
216 1.1 christos if (ret < 0)
217 1.1 christos {
218 1.1 christos warning (_("Unable to store floating point registers."));
219 1.1 christos return;
220 1.1 christos }
221 1.1 christos }
222 1.1 christos
223 1.1 christos /* Fetch a general register of the process and store into
224 1.1 christos regcache. */
225 1.1 christos
226 1.1 christos static void
227 1.1 christos fetch_register (struct regcache *regcache, int regno)
228 1.1 christos {
229 1.1 christos int ret, tid;
230 1.1 christos elf_gregset_t regs;
231 1.1 christos
232 1.1 christos /* Get the thread id for the ptrace call. */
233 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
234 1.1 christos
235 1.1 christos ret = ptrace (PTRACE_GETREGS, tid, 0, ®s);
236 1.1 christos if (ret < 0)
237 1.1 christos {
238 1.1 christos warning (_("Unable to fetch general register."));
239 1.1 christos return;
240 1.1 christos }
241 1.1 christos
242 1.1 christos if (regno >= ARM_A1_REGNUM && regno < ARM_PC_REGNUM)
243 1.1 christos regcache_raw_supply (regcache, regno, (char *) ®s[regno]);
244 1.1 christos
245 1.1 christos if (ARM_PS_REGNUM == regno)
246 1.1 christos {
247 1.1 christos if (arm_apcs_32)
248 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
249 1.1 christos (char *) ®s[ARM_CPSR_GREGNUM]);
250 1.1 christos else
251 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
252 1.1 christos (char *) ®s[ARM_PC_REGNUM]);
253 1.1 christos }
254 1.1 christos
255 1.1 christos if (ARM_PC_REGNUM == regno)
256 1.1 christos {
257 1.1 christos regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
258 1.1 christos (get_regcache_arch (regcache),
259 1.1 christos regs[ARM_PC_REGNUM]);
260 1.1 christos regcache_raw_supply (regcache, ARM_PC_REGNUM,
261 1.1 christos (char *) ®s[ARM_PC_REGNUM]);
262 1.1 christos }
263 1.1 christos }
264 1.1 christos
265 1.1 christos /* Fetch all general registers of the process and store into
266 1.1 christos regcache. */
267 1.1 christos
268 1.1 christos static void
269 1.1 christos fetch_regs (struct regcache *regcache)
270 1.1 christos {
271 1.1 christos int ret, regno, tid;
272 1.1 christos elf_gregset_t regs;
273 1.1 christos
274 1.1 christos /* Get the thread id for the ptrace call. */
275 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
276 1.1 christos
277 1.1 christos ret = ptrace (PTRACE_GETREGS, tid, 0, ®s);
278 1.1 christos if (ret < 0)
279 1.1 christos {
280 1.1 christos warning (_("Unable to fetch general registers."));
281 1.1 christos return;
282 1.1 christos }
283 1.1 christos
284 1.1 christos for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
285 1.1 christos regcache_raw_supply (regcache, regno, (char *) ®s[regno]);
286 1.1 christos
287 1.1 christos if (arm_apcs_32)
288 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
289 1.1 christos (char *) ®s[ARM_CPSR_GREGNUM]);
290 1.1 christos else
291 1.1 christos regcache_raw_supply (regcache, ARM_PS_REGNUM,
292 1.1 christos (char *) ®s[ARM_PC_REGNUM]);
293 1.1 christos
294 1.1 christos regs[ARM_PC_REGNUM] = gdbarch_addr_bits_remove
295 1.1 christos (get_regcache_arch (regcache), regs[ARM_PC_REGNUM]);
296 1.1 christos regcache_raw_supply (regcache, ARM_PC_REGNUM,
297 1.1 christos (char *) ®s[ARM_PC_REGNUM]);
298 1.1 christos }
299 1.1 christos
300 1.1 christos /* Store all general registers of the process from the values in
301 1.1 christos regcache. */
302 1.1 christos
303 1.1 christos static void
304 1.1 christos store_register (const struct regcache *regcache, int regno)
305 1.1 christos {
306 1.1 christos int ret, tid;
307 1.1 christos elf_gregset_t regs;
308 1.1 christos
309 1.1 christos if (REG_VALID != regcache_register_status (regcache, regno))
310 1.1 christos return;
311 1.1 christos
312 1.1 christos /* Get the thread id for the ptrace call. */
313 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
314 1.1 christos
315 1.1 christos /* Get the general registers from the process. */
316 1.1 christos ret = ptrace (PTRACE_GETREGS, tid, 0, ®s);
317 1.1 christos if (ret < 0)
318 1.1 christos {
319 1.1 christos warning (_("Unable to fetch general registers."));
320 1.1 christos return;
321 1.1 christos }
322 1.1 christos
323 1.1 christos if (regno >= ARM_A1_REGNUM && regno <= ARM_PC_REGNUM)
324 1.1 christos regcache_raw_collect (regcache, regno, (char *) ®s[regno]);
325 1.1 christos else if (arm_apcs_32 && regno == ARM_PS_REGNUM)
326 1.1 christos regcache_raw_collect (regcache, regno,
327 1.1 christos (char *) ®s[ARM_CPSR_GREGNUM]);
328 1.1 christos else if (!arm_apcs_32 && regno == ARM_PS_REGNUM)
329 1.1 christos regcache_raw_collect (regcache, ARM_PC_REGNUM,
330 1.1 christos (char *) ®s[ARM_PC_REGNUM]);
331 1.1 christos
332 1.1 christos ret = ptrace (PTRACE_SETREGS, tid, 0, ®s);
333 1.1 christos if (ret < 0)
334 1.1 christos {
335 1.1 christos warning (_("Unable to store general register."));
336 1.1 christos return;
337 1.1 christos }
338 1.1 christos }
339 1.1 christos
340 1.1 christos static void
341 1.1 christos store_regs (const struct regcache *regcache)
342 1.1 christos {
343 1.1 christos int ret, regno, tid;
344 1.1 christos elf_gregset_t regs;
345 1.1 christos
346 1.1 christos /* Get the thread id for the ptrace call. */
347 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
348 1.1 christos
349 1.1 christos /* Fetch the general registers. */
350 1.1 christos ret = ptrace (PTRACE_GETREGS, tid, 0, ®s);
351 1.1 christos if (ret < 0)
352 1.1 christos {
353 1.1 christos warning (_("Unable to fetch general registers."));
354 1.1 christos return;
355 1.1 christos }
356 1.1 christos
357 1.1 christos for (regno = ARM_A1_REGNUM; regno <= ARM_PC_REGNUM; regno++)
358 1.1 christos {
359 1.1 christos if (REG_VALID == regcache_register_status (regcache, regno))
360 1.1 christos regcache_raw_collect (regcache, regno, (char *) ®s[regno]);
361 1.1 christos }
362 1.1 christos
363 1.1 christos if (arm_apcs_32 && REG_VALID == regcache_register_status (regcache, ARM_PS_REGNUM))
364 1.1 christos regcache_raw_collect (regcache, ARM_PS_REGNUM,
365 1.1 christos (char *) ®s[ARM_CPSR_GREGNUM]);
366 1.1 christos
367 1.1 christos ret = ptrace (PTRACE_SETREGS, tid, 0, ®s);
368 1.1 christos
369 1.1 christos if (ret < 0)
370 1.1 christos {
371 1.1 christos warning (_("Unable to store general registers."));
372 1.1 christos return;
373 1.1 christos }
374 1.1 christos }
375 1.1 christos
376 1.1 christos /* Fetch all WMMX registers of the process and store into
377 1.1 christos regcache. */
378 1.1 christos
379 1.1 christos #define IWMMXT_REGS_SIZE (16 * 8 + 6 * 4)
380 1.1 christos
381 1.1 christos static void
382 1.1 christos fetch_wmmx_regs (struct regcache *regcache)
383 1.1 christos {
384 1.1 christos char regbuf[IWMMXT_REGS_SIZE];
385 1.1 christos int ret, regno, tid;
386 1.1 christos
387 1.1 christos /* Get the thread id for the ptrace call. */
388 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
389 1.1 christos
390 1.1 christos ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
391 1.1 christos if (ret < 0)
392 1.1 christos {
393 1.1 christos warning (_("Unable to fetch WMMX registers."));
394 1.1 christos return;
395 1.1 christos }
396 1.1 christos
397 1.1 christos for (regno = 0; regno < 16; regno++)
398 1.1 christos regcache_raw_supply (regcache, regno + ARM_WR0_REGNUM,
399 1.1 christos ®buf[regno * 8]);
400 1.1 christos
401 1.1 christos for (regno = 0; regno < 2; regno++)
402 1.1 christos regcache_raw_supply (regcache, regno + ARM_WCSSF_REGNUM,
403 1.1 christos ®buf[16 * 8 + regno * 4]);
404 1.1 christos
405 1.1 christos for (regno = 0; regno < 4; regno++)
406 1.1 christos regcache_raw_supply (regcache, regno + ARM_WCGR0_REGNUM,
407 1.1 christos ®buf[16 * 8 + 2 * 4 + regno * 4]);
408 1.1 christos }
409 1.1 christos
410 1.1 christos static void
411 1.1 christos store_wmmx_regs (const struct regcache *regcache)
412 1.1 christos {
413 1.1 christos char regbuf[IWMMXT_REGS_SIZE];
414 1.1 christos int ret, regno, tid;
415 1.1 christos
416 1.1 christos /* Get the thread id for the ptrace call. */
417 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
418 1.1 christos
419 1.1 christos ret = ptrace (PTRACE_GETWMMXREGS, tid, 0, regbuf);
420 1.1 christos if (ret < 0)
421 1.1 christos {
422 1.1 christos warning (_("Unable to fetch WMMX registers."));
423 1.1 christos return;
424 1.1 christos }
425 1.1 christos
426 1.1 christos for (regno = 0; regno < 16; regno++)
427 1.1 christos if (REG_VALID == regcache_register_status (regcache,
428 1.1 christos regno + ARM_WR0_REGNUM))
429 1.1 christos regcache_raw_collect (regcache, regno + ARM_WR0_REGNUM,
430 1.1 christos ®buf[regno * 8]);
431 1.1 christos
432 1.1 christos for (regno = 0; regno < 2; regno++)
433 1.1 christos if (REG_VALID == regcache_register_status (regcache,
434 1.1 christos regno + ARM_WCSSF_REGNUM))
435 1.1 christos regcache_raw_collect (regcache, regno + ARM_WCSSF_REGNUM,
436 1.1 christos ®buf[16 * 8 + regno * 4]);
437 1.1 christos
438 1.1 christos for (regno = 0; regno < 4; regno++)
439 1.1 christos if (REG_VALID == regcache_register_status (regcache,
440 1.1 christos regno + ARM_WCGR0_REGNUM))
441 1.1 christos regcache_raw_collect (regcache, regno + ARM_WCGR0_REGNUM,
442 1.1 christos ®buf[16 * 8 + 2 * 4 + regno * 4]);
443 1.1 christos
444 1.1 christos ret = ptrace (PTRACE_SETWMMXREGS, tid, 0, regbuf);
445 1.1 christos
446 1.1 christos if (ret < 0)
447 1.1 christos {
448 1.1 christos warning (_("Unable to store WMMX registers."));
449 1.1 christos return;
450 1.1 christos }
451 1.1 christos }
452 1.1 christos
453 1.1 christos /* Fetch and store VFP Registers. The kernel object has space for 32
454 1.1 christos 64-bit registers, and the FPSCR. This is even when on a VFPv2 or
455 1.1 christos VFPv3D16 target. */
456 1.1 christos #define VFP_REGS_SIZE (32 * 8 + 4)
457 1.1 christos
458 1.1 christos static void
459 1.1 christos fetch_vfp_regs (struct regcache *regcache)
460 1.1 christos {
461 1.1 christos char regbuf[VFP_REGS_SIZE];
462 1.1 christos int ret, regno, tid;
463 1.1 christos
464 1.1 christos /* Get the thread id for the ptrace call. */
465 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
466 1.1 christos
467 1.1 christos ret = ptrace (PTRACE_GETVFPREGS, tid, 0, regbuf);
468 1.1 christos if (ret < 0)
469 1.1 christos {
470 1.1 christos warning (_("Unable to fetch VFP registers."));
471 1.1 christos return;
472 1.1 christos }
473 1.1 christos
474 1.1 christos for (regno = 0; regno < arm_linux_vfp_register_count; regno++)
475 1.1 christos regcache_raw_supply (regcache, regno + ARM_D0_REGNUM,
476 1.1 christos (char *) regbuf + regno * 8);
477 1.1 christos
478 1.1 christos regcache_raw_supply (regcache, ARM_FPSCR_REGNUM,
479 1.1 christos (char *) regbuf + 32 * 8);
480 1.1 christos }
481 1.1 christos
482 1.1 christos static void
483 1.1 christos store_vfp_regs (const struct regcache *regcache)
484 1.1 christos {
485 1.1 christos char regbuf[VFP_REGS_SIZE];
486 1.1 christos int ret, regno, tid;
487 1.1 christos
488 1.1 christos /* Get the thread id for the ptrace call. */
489 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
490 1.1 christos
491 1.1 christos ret = ptrace (PTRACE_GETVFPREGS, tid, 0, regbuf);
492 1.1 christos if (ret < 0)
493 1.1 christos {
494 1.1 christos warning (_("Unable to fetch VFP registers (for update)."));
495 1.1 christos return;
496 1.1 christos }
497 1.1 christos
498 1.1 christos for (regno = 0; regno < arm_linux_vfp_register_count; regno++)
499 1.1 christos regcache_raw_collect (regcache, regno + ARM_D0_REGNUM,
500 1.1 christos (char *) regbuf + regno * 8);
501 1.1 christos
502 1.1 christos regcache_raw_collect (regcache, ARM_FPSCR_REGNUM,
503 1.1 christos (char *) regbuf + 32 * 8);
504 1.1 christos
505 1.1 christos ret = ptrace (PTRACE_SETVFPREGS, tid, 0, regbuf);
506 1.1 christos
507 1.1 christos if (ret < 0)
508 1.1 christos {
509 1.1 christos warning (_("Unable to store VFP registers."));
510 1.1 christos return;
511 1.1 christos }
512 1.1 christos }
513 1.1 christos
514 1.1 christos /* Fetch registers from the child process. Fetch all registers if
515 1.1 christos regno == -1, otherwise fetch all general registers or all floating
516 1.1 christos point registers depending upon the value of regno. */
517 1.1 christos
518 1.1 christos static void
519 1.1 christos arm_linux_fetch_inferior_registers (struct target_ops *ops,
520 1.1 christos struct regcache *regcache, int regno)
521 1.1 christos {
522 1.1 christos if (-1 == regno)
523 1.1 christos {
524 1.1 christos fetch_regs (regcache);
525 1.1 christos fetch_fpregs (regcache);
526 1.1 christos if (arm_linux_has_wmmx_registers)
527 1.1 christos fetch_wmmx_regs (regcache);
528 1.1 christos if (arm_linux_vfp_register_count > 0)
529 1.1 christos fetch_vfp_regs (regcache);
530 1.1 christos }
531 1.1 christos else
532 1.1 christos {
533 1.1 christos if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
534 1.1 christos fetch_register (regcache, regno);
535 1.1 christos else if (regno >= ARM_F0_REGNUM && regno <= ARM_FPS_REGNUM)
536 1.1 christos fetch_fpregister (regcache, regno);
537 1.1 christos else if (arm_linux_has_wmmx_registers
538 1.1 christos && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
539 1.1 christos fetch_wmmx_regs (regcache);
540 1.1 christos else if (arm_linux_vfp_register_count > 0
541 1.1 christos && regno >= ARM_D0_REGNUM
542 1.1 christos && regno <= ARM_D0_REGNUM + arm_linux_vfp_register_count)
543 1.1 christos fetch_vfp_regs (regcache);
544 1.1 christos }
545 1.1 christos }
546 1.1 christos
547 1.1 christos /* Store registers back into the inferior. Store all registers if
548 1.1 christos regno == -1, otherwise store all general registers or all floating
549 1.1 christos point registers depending upon the value of regno. */
550 1.1 christos
551 1.1 christos static void
552 1.1 christos arm_linux_store_inferior_registers (struct target_ops *ops,
553 1.1 christos struct regcache *regcache, int regno)
554 1.1 christos {
555 1.1 christos if (-1 == regno)
556 1.1 christos {
557 1.1 christos store_regs (regcache);
558 1.1 christos store_fpregs (regcache);
559 1.1 christos if (arm_linux_has_wmmx_registers)
560 1.1 christos store_wmmx_regs (regcache);
561 1.1 christos if (arm_linux_vfp_register_count > 0)
562 1.1 christos store_vfp_regs (regcache);
563 1.1 christos }
564 1.1 christos else
565 1.1 christos {
566 1.1 christos if (regno < ARM_F0_REGNUM || regno == ARM_PS_REGNUM)
567 1.1 christos store_register (regcache, regno);
568 1.1 christos else if ((regno >= ARM_F0_REGNUM) && (regno <= ARM_FPS_REGNUM))
569 1.1 christos store_fpregister (regcache, regno);
570 1.1 christos else if (arm_linux_has_wmmx_registers
571 1.1 christos && regno >= ARM_WR0_REGNUM && regno <= ARM_WCGR7_REGNUM)
572 1.1 christos store_wmmx_regs (regcache);
573 1.1 christos else if (arm_linux_vfp_register_count > 0
574 1.1 christos && regno >= ARM_D0_REGNUM
575 1.1 christos && regno <= ARM_D0_REGNUM + arm_linux_vfp_register_count)
576 1.1 christos store_vfp_regs (regcache);
577 1.1 christos }
578 1.1 christos }
579 1.1 christos
580 1.1 christos /* Wrapper functions for the standard regset handling, used by
581 1.1 christos thread debugging. */
582 1.1 christos
583 1.1 christos void
584 1.1 christos fill_gregset (const struct regcache *regcache,
585 1.1 christos gdb_gregset_t *gregsetp, int regno)
586 1.1 christos {
587 1.1 christos arm_linux_collect_gregset (NULL, regcache, regno, gregsetp, 0);
588 1.1 christos }
589 1.1 christos
590 1.1 christos void
591 1.1 christos supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
592 1.1 christos {
593 1.1 christos arm_linux_supply_gregset (NULL, regcache, -1, gregsetp, 0);
594 1.1 christos }
595 1.1 christos
596 1.1 christos void
597 1.1 christos fill_fpregset (const struct regcache *regcache,
598 1.1 christos gdb_fpregset_t *fpregsetp, int regno)
599 1.1 christos {
600 1.1 christos arm_linux_collect_nwfpe (NULL, regcache, regno, fpregsetp, 0);
601 1.1 christos }
602 1.1 christos
603 1.1 christos /* Fill GDB's register array with the floating-point register values
604 1.1 christos in *fpregsetp. */
605 1.1 christos
606 1.1 christos void
607 1.1 christos supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
608 1.1 christos {
609 1.1 christos arm_linux_supply_nwfpe (NULL, regcache, -1, fpregsetp, 0);
610 1.1 christos }
611 1.1 christos
612 1.1 christos /* Fetch the thread-local storage pointer for libthread_db. */
613 1.1 christos
614 1.1 christos ps_err_e
615 1.1 christos ps_get_thread_area (const struct ps_prochandle *ph,
616 1.1 christos lwpid_t lwpid, int idx, void **base)
617 1.1 christos {
618 1.1 christos if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
619 1.1 christos return PS_ERR;
620 1.1 christos
621 1.1 christos /* IDX is the bias from the thread pointer to the beginning of the
622 1.1 christos thread descriptor. It has to be subtracted due to implementation
623 1.1 christos quirks in libthread_db. */
624 1.1 christos *base = (void *) ((char *)*base - idx);
625 1.1 christos
626 1.1 christos return PS_OK;
627 1.1 christos }
628 1.1 christos
629 1.1 christos static const struct target_desc *
630 1.1 christos arm_linux_read_description (struct target_ops *ops)
631 1.1 christos {
632 1.1 christos CORE_ADDR arm_hwcap = 0;
633 1.1 christos arm_linux_has_wmmx_registers = 0;
634 1.1 christos arm_linux_vfp_register_count = 0;
635 1.1 christos
636 1.1 christos if (target_auxv_search (ops, AT_HWCAP, &arm_hwcap) != 1)
637 1.1 christos {
638 1.3 christos return ops->beneath->to_read_description (ops->beneath);
639 1.1 christos }
640 1.1 christos
641 1.1 christos if (arm_hwcap & HWCAP_IWMMXT)
642 1.1 christos {
643 1.1 christos arm_linux_has_wmmx_registers = 1;
644 1.1 christos return tdesc_arm_with_iwmmxt;
645 1.1 christos }
646 1.1 christos
647 1.1 christos if (arm_hwcap & HWCAP_VFP)
648 1.1 christos {
649 1.1 christos int pid;
650 1.1 christos char *buf;
651 1.1 christos const struct target_desc * result = NULL;
652 1.1 christos
653 1.1 christos /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support
654 1.1 christos Neon with VFPv3-D32. */
655 1.1 christos if (arm_hwcap & HWCAP_NEON)
656 1.1 christos {
657 1.1 christos arm_linux_vfp_register_count = 32;
658 1.1 christos result = tdesc_arm_with_neon;
659 1.1 christos }
660 1.1 christos else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
661 1.1 christos {
662 1.1 christos arm_linux_vfp_register_count = 32;
663 1.1 christos result = tdesc_arm_with_vfpv3;
664 1.1 christos }
665 1.1 christos else
666 1.1 christos {
667 1.1 christos arm_linux_vfp_register_count = 16;
668 1.1 christos result = tdesc_arm_with_vfpv2;
669 1.1 christos }
670 1.1 christos
671 1.1 christos /* Now make sure that the kernel supports reading these
672 1.1 christos registers. Support was added in 2.6.30. */
673 1.1 christos pid = ptid_get_lwp (inferior_ptid);
674 1.1 christos errno = 0;
675 1.1 christos buf = alloca (VFP_REGS_SIZE);
676 1.1 christos if (ptrace (PTRACE_GETVFPREGS, pid, 0, buf) < 0
677 1.1 christos && errno == EIO)
678 1.1 christos result = NULL;
679 1.1 christos
680 1.1 christos return result;
681 1.1 christos }
682 1.1 christos
683 1.3 christos return ops->beneath->to_read_description (ops->beneath);
684 1.1 christos }
685 1.1 christos
686 1.1 christos /* Information describing the hardware breakpoint capabilities. */
687 1.1 christos struct arm_linux_hwbp_cap
688 1.1 christos {
689 1.1 christos gdb_byte arch;
690 1.1 christos gdb_byte max_wp_length;
691 1.1 christos gdb_byte wp_count;
692 1.1 christos gdb_byte bp_count;
693 1.1 christos };
694 1.1 christos
695 1.3 christos /* Since we cannot dynamically allocate subfields of arm_linux_process_info,
696 1.3 christos assume a maximum number of supported break-/watchpoints. */
697 1.3 christos #define MAX_BPTS 16
698 1.3 christos #define MAX_WPTS 16
699 1.3 christos
700 1.1 christos /* Get hold of the Hardware Breakpoint information for the target we are
701 1.1 christos attached to. Returns NULL if the kernel doesn't support Hardware
702 1.1 christos breakpoints at all, or a pointer to the information structure. */
703 1.1 christos static const struct arm_linux_hwbp_cap *
704 1.1 christos arm_linux_get_hwbp_cap (void)
705 1.1 christos {
706 1.1 christos /* The info structure we return. */
707 1.1 christos static struct arm_linux_hwbp_cap info;
708 1.1 christos
709 1.1 christos /* Is INFO in a good state? -1 means that no attempt has been made to
710 1.1 christos initialize INFO; 0 means an attempt has been made, but it failed; 1
711 1.1 christos means INFO is in an initialized state. */
712 1.1 christos static int available = -1;
713 1.1 christos
714 1.1 christos if (available == -1)
715 1.1 christos {
716 1.1 christos int tid;
717 1.1 christos unsigned int val;
718 1.1 christos
719 1.1 christos tid = GET_THREAD_ID (inferior_ptid);
720 1.1 christos if (ptrace (PTRACE_GETHBPREGS, tid, 0, &val) < 0)
721 1.1 christos available = 0;
722 1.1 christos else
723 1.1 christos {
724 1.1 christos info.arch = (gdb_byte)((val >> 24) & 0xff);
725 1.1 christos info.max_wp_length = (gdb_byte)((val >> 16) & 0xff);
726 1.1 christos info.wp_count = (gdb_byte)((val >> 8) & 0xff);
727 1.1 christos info.bp_count = (gdb_byte)(val & 0xff);
728 1.3 christos
729 1.3 christos if (info.wp_count > MAX_WPTS)
730 1.3 christos {
731 1.3 christos warning (_("arm-linux-gdb supports %d hardware watchpoints but target \
732 1.3 christos supports %d"), MAX_WPTS, info.wp_count);
733 1.3 christos info.wp_count = MAX_WPTS;
734 1.3 christos }
735 1.3 christos
736 1.3 christos if (info.bp_count > MAX_BPTS)
737 1.3 christos {
738 1.3 christos warning (_("arm-linux-gdb supports %d hardware breakpoints but target \
739 1.3 christos supports %d"), MAX_BPTS, info.bp_count);
740 1.3 christos info.bp_count = MAX_BPTS;
741 1.3 christos }
742 1.1 christos available = (info.arch != 0);
743 1.1 christos }
744 1.1 christos }
745 1.1 christos
746 1.1 christos return available == 1 ? &info : NULL;
747 1.1 christos }
748 1.1 christos
749 1.1 christos /* How many hardware breakpoints are available? */
750 1.1 christos static int
751 1.1 christos arm_linux_get_hw_breakpoint_count (void)
752 1.1 christos {
753 1.1 christos const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
754 1.1 christos return cap != NULL ? cap->bp_count : 0;
755 1.1 christos }
756 1.1 christos
757 1.1 christos /* How many hardware watchpoints are available? */
758 1.1 christos static int
759 1.1 christos arm_linux_get_hw_watchpoint_count (void)
760 1.1 christos {
761 1.1 christos const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
762 1.1 christos return cap != NULL ? cap->wp_count : 0;
763 1.1 christos }
764 1.1 christos
765 1.1 christos /* Have we got a free break-/watch-point available for use? Returns -1 if
766 1.1 christos there is not an appropriate resource available, otherwise returns 1. */
767 1.1 christos static int
768 1.3 christos arm_linux_can_use_hw_breakpoint (struct target_ops *self,
769 1.3 christos int type, int cnt, int ot)
770 1.1 christos {
771 1.1 christos if (type == bp_hardware_watchpoint || type == bp_read_watchpoint
772 1.1 christos || type == bp_access_watchpoint || type == bp_watchpoint)
773 1.1 christos {
774 1.1 christos if (cnt + ot > arm_linux_get_hw_watchpoint_count ())
775 1.1 christos return -1;
776 1.1 christos }
777 1.1 christos else if (type == bp_hardware_breakpoint)
778 1.1 christos {
779 1.1 christos if (cnt > arm_linux_get_hw_breakpoint_count ())
780 1.1 christos return -1;
781 1.1 christos }
782 1.1 christos else
783 1.1 christos gdb_assert (FALSE);
784 1.1 christos
785 1.1 christos return 1;
786 1.1 christos }
787 1.1 christos
788 1.1 christos /* Enum describing the different types of ARM hardware break-/watch-points. */
789 1.1 christos typedef enum
790 1.1 christos {
791 1.1 christos arm_hwbp_break = 0,
792 1.1 christos arm_hwbp_load = 1,
793 1.1 christos arm_hwbp_store = 2,
794 1.1 christos arm_hwbp_access = 3
795 1.1 christos } arm_hwbp_type;
796 1.1 christos
797 1.1 christos /* Type describing an ARM Hardware Breakpoint Control register value. */
798 1.1 christos typedef unsigned int arm_hwbp_control_t;
799 1.1 christos
800 1.1 christos /* Structure used to keep track of hardware break-/watch-points. */
801 1.1 christos struct arm_linux_hw_breakpoint
802 1.1 christos {
803 1.1 christos /* Address to break on, or being watched. */
804 1.1 christos unsigned int address;
805 1.1 christos /* Control register for break-/watch- point. */
806 1.1 christos arm_hwbp_control_t control;
807 1.1 christos };
808 1.1 christos
809 1.3 christos /* Structure containing arrays of per process hardware break-/watchpoints
810 1.3 christos for caching address and control information.
811 1.1 christos
812 1.1 christos The Linux ptrace interface to hardware break-/watch-points presents the
813 1.1 christos values in a vector centred around 0 (which is used fo generic information).
814 1.1 christos Positive indicies refer to breakpoint addresses/control registers, negative
815 1.1 christos indices to watchpoint addresses/control registers.
816 1.1 christos
817 1.1 christos The Linux vector is indexed as follows:
818 1.1 christos -((i << 1) + 2): Control register for watchpoint i.
819 1.1 christos -((i << 1) + 1): Address register for watchpoint i.
820 1.1 christos 0: Information register.
821 1.1 christos ((i << 1) + 1): Address register for breakpoint i.
822 1.1 christos ((i << 1) + 2): Control register for breakpoint i.
823 1.1 christos
824 1.1 christos This structure is used as a per-thread cache of the state stored by the
825 1.1 christos kernel, so that we don't need to keep calling into the kernel to find a
826 1.1 christos free breakpoint.
827 1.1 christos
828 1.1 christos We treat break-/watch-points with their enable bit clear as being deleted.
829 1.1 christos */
830 1.3 christos struct arm_linux_debug_reg_state
831 1.3 christos {
832 1.3 christos /* Hardware breakpoints for this process. */
833 1.3 christos struct arm_linux_hw_breakpoint bpts[MAX_BPTS];
834 1.3 christos /* Hardware watchpoints for this process. */
835 1.3 christos struct arm_linux_hw_breakpoint wpts[MAX_WPTS];
836 1.3 christos };
837 1.3 christos
838 1.3 christos /* Per-process arch-specific data we want to keep. */
839 1.3 christos struct arm_linux_process_info
840 1.3 christos {
841 1.3 christos /* Linked list. */
842 1.3 christos struct arm_linux_process_info *next;
843 1.3 christos /* The process identifier. */
844 1.3 christos pid_t pid;
845 1.3 christos /* Hardware break-/watchpoints state information. */
846 1.3 christos struct arm_linux_debug_reg_state state;
847 1.3 christos
848 1.3 christos };
849 1.3 christos
850 1.3 christos /* Per-thread arch-specific data we want to keep. */
851 1.3 christos struct arch_lwp_info
852 1.3 christos {
853 1.3 christos /* Non-zero if our copy differs from what's recorded in the thread. */
854 1.3 christos char bpts_changed[MAX_BPTS];
855 1.3 christos char wpts_changed[MAX_WPTS];
856 1.3 christos };
857 1.3 christos
858 1.3 christos static struct arm_linux_process_info *arm_linux_process_list = NULL;
859 1.3 christos
860 1.3 christos /* Find process data for process PID. */
861 1.3 christos
862 1.3 christos static struct arm_linux_process_info *
863 1.3 christos arm_linux_find_process_pid (pid_t pid)
864 1.3 christos {
865 1.3 christos struct arm_linux_process_info *proc;
866 1.3 christos
867 1.3 christos for (proc = arm_linux_process_list; proc; proc = proc->next)
868 1.3 christos if (proc->pid == pid)
869 1.3 christos return proc;
870 1.3 christos
871 1.3 christos return NULL;
872 1.3 christos }
873 1.3 christos
874 1.3 christos /* Add process data for process PID. Returns newly allocated info
875 1.3 christos object. */
876 1.3 christos
877 1.3 christos static struct arm_linux_process_info *
878 1.3 christos arm_linux_add_process (pid_t pid)
879 1.1 christos {
880 1.3 christos struct arm_linux_process_info *proc;
881 1.3 christos
882 1.3 christos proc = xcalloc (1, sizeof (*proc));
883 1.3 christos proc->pid = pid;
884 1.3 christos
885 1.3 christos proc->next = arm_linux_process_list;
886 1.3 christos arm_linux_process_list = proc;
887 1.3 christos
888 1.3 christos return proc;
889 1.3 christos }
890 1.3 christos
891 1.3 christos /* Get data specific info for process PID, creating it if necessary.
892 1.3 christos Never returns NULL. */
893 1.3 christos
894 1.3 christos static struct arm_linux_process_info *
895 1.3 christos arm_linux_process_info_get (pid_t pid)
896 1.3 christos {
897 1.3 christos struct arm_linux_process_info *proc;
898 1.3 christos
899 1.3 christos proc = arm_linux_find_process_pid (pid);
900 1.3 christos if (proc == NULL)
901 1.3 christos proc = arm_linux_add_process (pid);
902 1.3 christos
903 1.3 christos return proc;
904 1.3 christos }
905 1.3 christos
906 1.3 christos /* Called whenever GDB is no longer debugging process PID. It deletes
907 1.3 christos data structures that keep track of debug register state. */
908 1.3 christos
909 1.3 christos static void
910 1.3 christos arm_linux_forget_process (pid_t pid)
911 1.1 christos {
912 1.3 christos struct arm_linux_process_info *proc, **proc_link;
913 1.3 christos
914 1.3 christos proc = arm_linux_process_list;
915 1.3 christos proc_link = &arm_linux_process_list;
916 1.1 christos
917 1.3 christos while (proc != NULL)
918 1.3 christos {
919 1.3 christos if (proc->pid == pid)
920 1.1 christos {
921 1.3 christos *proc_link = proc->next;
922 1.3 christos
923 1.3 christos xfree (proc);
924 1.3 christos return;
925 1.1 christos }
926 1.1 christos
927 1.3 christos proc_link = &proc->next;
928 1.3 christos proc = *proc_link;
929 1.3 christos }
930 1.3 christos }
931 1.1 christos
932 1.3 christos /* Get hardware break-/watchpoint state for process PID. */
933 1.1 christos
934 1.3 christos static struct arm_linux_debug_reg_state *
935 1.3 christos arm_linux_get_debug_reg_state (pid_t pid)
936 1.3 christos {
937 1.3 christos return &arm_linux_process_info_get (pid)->state;
938 1.1 christos }
939 1.1 christos
940 1.1 christos /* Initialize an ARM hardware break-/watch-point control register value.
941 1.1 christos BYTE_ADDRESS_SELECT is the mask of bytes to trigger on; HWBP_TYPE is the
942 1.1 christos type of break-/watch-point; ENABLE indicates whether the point is enabled.
943 1.1 christos */
944 1.1 christos static arm_hwbp_control_t
945 1.1 christos arm_hwbp_control_initialize (unsigned byte_address_select,
946 1.1 christos arm_hwbp_type hwbp_type,
947 1.1 christos int enable)
948 1.1 christos {
949 1.1 christos gdb_assert ((byte_address_select & ~0xffU) == 0);
950 1.1 christos gdb_assert (hwbp_type != arm_hwbp_break
951 1.1 christos || ((byte_address_select & 0xfU) != 0));
952 1.1 christos
953 1.1 christos return (byte_address_select << 5) | (hwbp_type << 3) | (3 << 1) | enable;
954 1.1 christos }
955 1.1 christos
956 1.1 christos /* Does the breakpoint control value CONTROL have the enable bit set? */
957 1.1 christos static int
958 1.1 christos arm_hwbp_control_is_enabled (arm_hwbp_control_t control)
959 1.1 christos {
960 1.1 christos return control & 0x1;
961 1.1 christos }
962 1.1 christos
963 1.1 christos /* Change a breakpoint control word so that it is in the disabled state. */
964 1.1 christos static arm_hwbp_control_t
965 1.1 christos arm_hwbp_control_disable (arm_hwbp_control_t control)
966 1.1 christos {
967 1.1 christos return control & ~0x1;
968 1.1 christos }
969 1.1 christos
970 1.1 christos /* Initialise the hardware breakpoint structure P. The breakpoint will be
971 1.1 christos enabled, and will point to the placed address of BP_TGT. */
972 1.1 christos static void
973 1.1 christos arm_linux_hw_breakpoint_initialize (struct gdbarch *gdbarch,
974 1.1 christos struct bp_target_info *bp_tgt,
975 1.1 christos struct arm_linux_hw_breakpoint *p)
976 1.1 christos {
977 1.1 christos unsigned mask;
978 1.3 christos CORE_ADDR address = bp_tgt->placed_address = bp_tgt->reqstd_address;
979 1.1 christos
980 1.1 christos /* We have to create a mask for the control register which says which bits
981 1.1 christos of the word pointed to by address to break on. */
982 1.1 christos if (arm_pc_is_thumb (gdbarch, address))
983 1.1 christos {
984 1.1 christos mask = 0x3;
985 1.1 christos address &= ~1;
986 1.1 christos }
987 1.1 christos else
988 1.1 christos {
989 1.1 christos mask = 0xf;
990 1.1 christos address &= ~3;
991 1.1 christos }
992 1.1 christos
993 1.1 christos p->address = (unsigned int) address;
994 1.1 christos p->control = arm_hwbp_control_initialize (mask, arm_hwbp_break, 1);
995 1.1 christos }
996 1.1 christos
997 1.1 christos /* Get the ARM hardware breakpoint type from the RW value we're given when
998 1.1 christos asked to set a watchpoint. */
999 1.1 christos static arm_hwbp_type
1000 1.1 christos arm_linux_get_hwbp_type (int rw)
1001 1.1 christos {
1002 1.1 christos if (rw == hw_read)
1003 1.1 christos return arm_hwbp_load;
1004 1.1 christos else if (rw == hw_write)
1005 1.1 christos return arm_hwbp_store;
1006 1.1 christos else
1007 1.1 christos return arm_hwbp_access;
1008 1.1 christos }
1009 1.1 christos
1010 1.1 christos /* Initialize the hardware breakpoint structure P for a watchpoint at ADDR
1011 1.1 christos to LEN. The type of watchpoint is given in RW. */
1012 1.1 christos static void
1013 1.1 christos arm_linux_hw_watchpoint_initialize (CORE_ADDR addr, int len, int rw,
1014 1.1 christos struct arm_linux_hw_breakpoint *p)
1015 1.1 christos {
1016 1.1 christos const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1017 1.1 christos unsigned mask;
1018 1.1 christos
1019 1.1 christos gdb_assert (cap != NULL);
1020 1.1 christos gdb_assert (cap->max_wp_length != 0);
1021 1.1 christos
1022 1.1 christos mask = (1 << len) - 1;
1023 1.1 christos
1024 1.1 christos p->address = (unsigned int) addr;
1025 1.1 christos p->control = arm_hwbp_control_initialize (mask,
1026 1.1 christos arm_linux_get_hwbp_type (rw), 1);
1027 1.1 christos }
1028 1.1 christos
1029 1.1 christos /* Are two break-/watch-points equal? */
1030 1.1 christos static int
1031 1.1 christos arm_linux_hw_breakpoint_equal (const struct arm_linux_hw_breakpoint *p1,
1032 1.1 christos const struct arm_linux_hw_breakpoint *p2)
1033 1.1 christos {
1034 1.1 christos return p1->address == p2->address && p1->control == p2->control;
1035 1.1 christos }
1036 1.1 christos
1037 1.3 christos /* Callback to mark a watch-/breakpoint to be updated in all threads of
1038 1.3 christos the current process. */
1039 1.3 christos
1040 1.3 christos struct update_registers_data
1041 1.3 christos {
1042 1.3 christos int watch;
1043 1.3 christos int index;
1044 1.3 christos };
1045 1.3 christos
1046 1.3 christos static int
1047 1.3 christos update_registers_callback (struct lwp_info *lwp, void *arg)
1048 1.3 christos {
1049 1.3 christos struct update_registers_data *data = (struct update_registers_data *) arg;
1050 1.3 christos
1051 1.3 christos if (lwp->arch_private == NULL)
1052 1.3 christos lwp->arch_private = XCNEW (struct arch_lwp_info);
1053 1.3 christos
1054 1.3 christos /* The actual update is done later just before resuming the lwp,
1055 1.3 christos we just mark that the registers need updating. */
1056 1.3 christos if (data->watch)
1057 1.3 christos lwp->arch_private->wpts_changed[data->index] = 1;
1058 1.3 christos else
1059 1.3 christos lwp->arch_private->bpts_changed[data->index] = 1;
1060 1.3 christos
1061 1.3 christos /* If the lwp isn't stopped, force it to momentarily pause, so
1062 1.3 christos we can update its breakpoint registers. */
1063 1.3 christos if (!lwp->stopped)
1064 1.3 christos linux_stop_lwp (lwp);
1065 1.3 christos
1066 1.3 christos return 0;
1067 1.3 christos }
1068 1.3 christos
1069 1.1 christos /* Insert the hardware breakpoint (WATCHPOINT = 0) or watchpoint (WATCHPOINT
1070 1.1 christos =1) BPT for thread TID. */
1071 1.1 christos static void
1072 1.1 christos arm_linux_insert_hw_breakpoint1 (const struct arm_linux_hw_breakpoint* bpt,
1073 1.3 christos int watchpoint)
1074 1.1 christos {
1075 1.3 christos int pid;
1076 1.3 christos ptid_t pid_ptid;
1077 1.1 christos gdb_byte count, i;
1078 1.1 christos struct arm_linux_hw_breakpoint* bpts;
1079 1.3 christos struct update_registers_data data;
1080 1.1 christos
1081 1.3 christos pid = ptid_get_pid (inferior_ptid);
1082 1.3 christos pid_ptid = pid_to_ptid (pid);
1083 1.1 christos
1084 1.1 christos if (watchpoint)
1085 1.1 christos {
1086 1.1 christos count = arm_linux_get_hw_watchpoint_count ();
1087 1.3 christos bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1088 1.1 christos }
1089 1.1 christos else
1090 1.1 christos {
1091 1.1 christos count = arm_linux_get_hw_breakpoint_count ();
1092 1.3 christos bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1093 1.1 christos }
1094 1.1 christos
1095 1.1 christos for (i = 0; i < count; ++i)
1096 1.1 christos if (!arm_hwbp_control_is_enabled (bpts[i].control))
1097 1.1 christos {
1098 1.3 christos data.watch = watchpoint;
1099 1.3 christos data.index = i;
1100 1.3 christos bpts[i] = *bpt;
1101 1.3 christos iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1102 1.3 christos break;
1103 1.1 christos }
1104 1.1 christos
1105 1.1 christos gdb_assert (i != count);
1106 1.1 christos }
1107 1.1 christos
1108 1.1 christos /* Remove the hardware breakpoint (WATCHPOINT = 0) or watchpoint
1109 1.1 christos (WATCHPOINT = 1) BPT for thread TID. */
1110 1.1 christos static void
1111 1.1 christos arm_linux_remove_hw_breakpoint1 (const struct arm_linux_hw_breakpoint *bpt,
1112 1.3 christos int watchpoint)
1113 1.1 christos {
1114 1.3 christos int pid;
1115 1.1 christos gdb_byte count, i;
1116 1.3 christos ptid_t pid_ptid;
1117 1.3 christos struct arm_linux_hw_breakpoint* bpts;
1118 1.3 christos struct update_registers_data data;
1119 1.1 christos
1120 1.3 christos pid = ptid_get_pid (inferior_ptid);
1121 1.3 christos pid_ptid = pid_to_ptid (pid);
1122 1.1 christos
1123 1.1 christos if (watchpoint)
1124 1.1 christos {
1125 1.1 christos count = arm_linux_get_hw_watchpoint_count ();
1126 1.3 christos bpts = arm_linux_get_debug_reg_state (pid)->wpts;
1127 1.1 christos }
1128 1.1 christos else
1129 1.1 christos {
1130 1.1 christos count = arm_linux_get_hw_breakpoint_count ();
1131 1.3 christos bpts = arm_linux_get_debug_reg_state (pid)->bpts;
1132 1.1 christos }
1133 1.1 christos
1134 1.1 christos for (i = 0; i < count; ++i)
1135 1.1 christos if (arm_linux_hw_breakpoint_equal (bpt, bpts + i))
1136 1.1 christos {
1137 1.3 christos data.watch = watchpoint;
1138 1.3 christos data.index = i;
1139 1.3 christos bpts[i].control = arm_hwbp_control_disable (bpts[i].control);
1140 1.3 christos iterate_over_lwps (pid_ptid, update_registers_callback, &data);
1141 1.3 christos break;
1142 1.1 christos }
1143 1.1 christos
1144 1.1 christos gdb_assert (i != count);
1145 1.1 christos }
1146 1.1 christos
1147 1.1 christos /* Insert a Hardware breakpoint. */
1148 1.1 christos static int
1149 1.3 christos arm_linux_insert_hw_breakpoint (struct target_ops *self,
1150 1.3 christos struct gdbarch *gdbarch,
1151 1.1 christos struct bp_target_info *bp_tgt)
1152 1.1 christos {
1153 1.1 christos struct lwp_info *lp;
1154 1.1 christos struct arm_linux_hw_breakpoint p;
1155 1.1 christos
1156 1.1 christos if (arm_linux_get_hw_breakpoint_count () == 0)
1157 1.1 christos return -1;
1158 1.1 christos
1159 1.1 christos arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1160 1.3 christos
1161 1.3 christos arm_linux_insert_hw_breakpoint1 (&p, 0);
1162 1.1 christos
1163 1.1 christos return 0;
1164 1.1 christos }
1165 1.1 christos
1166 1.1 christos /* Remove a hardware breakpoint. */
1167 1.1 christos static int
1168 1.3 christos arm_linux_remove_hw_breakpoint (struct target_ops *self,
1169 1.3 christos struct gdbarch *gdbarch,
1170 1.1 christos struct bp_target_info *bp_tgt)
1171 1.1 christos {
1172 1.1 christos struct lwp_info *lp;
1173 1.1 christos struct arm_linux_hw_breakpoint p;
1174 1.1 christos
1175 1.1 christos if (arm_linux_get_hw_breakpoint_count () == 0)
1176 1.1 christos return -1;
1177 1.1 christos
1178 1.1 christos arm_linux_hw_breakpoint_initialize (gdbarch, bp_tgt, &p);
1179 1.3 christos
1180 1.3 christos arm_linux_remove_hw_breakpoint1 (&p, 0);
1181 1.1 christos
1182 1.1 christos return 0;
1183 1.1 christos }
1184 1.1 christos
1185 1.1 christos /* Are we able to use a hardware watchpoint for the LEN bytes starting at
1186 1.1 christos ADDR? */
1187 1.1 christos static int
1188 1.3 christos arm_linux_region_ok_for_hw_watchpoint (struct target_ops *self,
1189 1.3 christos CORE_ADDR addr, int len)
1190 1.1 christos {
1191 1.1 christos const struct arm_linux_hwbp_cap *cap = arm_linux_get_hwbp_cap ();
1192 1.1 christos CORE_ADDR max_wp_length, aligned_addr;
1193 1.1 christos
1194 1.1 christos /* Can not set watchpoints for zero or negative lengths. */
1195 1.1 christos if (len <= 0)
1196 1.1 christos return 0;
1197 1.1 christos
1198 1.1 christos /* Need to be able to use the ptrace interface. */
1199 1.1 christos if (cap == NULL || cap->wp_count == 0)
1200 1.1 christos return 0;
1201 1.1 christos
1202 1.1 christos /* Test that the range [ADDR, ADDR + LEN) fits into the largest address
1203 1.1 christos range covered by a watchpoint. */
1204 1.1 christos max_wp_length = (CORE_ADDR)cap->max_wp_length;
1205 1.1 christos aligned_addr = addr & ~(max_wp_length - 1);
1206 1.1 christos
1207 1.1 christos if (aligned_addr + max_wp_length < addr + len)
1208 1.1 christos return 0;
1209 1.1 christos
1210 1.1 christos /* The current ptrace interface can only handle watchpoints that are a
1211 1.1 christos power of 2. */
1212 1.1 christos if ((len & (len - 1)) != 0)
1213 1.1 christos return 0;
1214 1.1 christos
1215 1.1 christos /* All tests passed so we must be able to set a watchpoint. */
1216 1.1 christos return 1;
1217 1.1 christos }
1218 1.1 christos
1219 1.1 christos /* Insert a Hardware breakpoint. */
1220 1.1 christos static int
1221 1.3 christos arm_linux_insert_watchpoint (struct target_ops *self,
1222 1.3 christos CORE_ADDR addr, int len, int rw,
1223 1.1 christos struct expression *cond)
1224 1.1 christos {
1225 1.1 christos struct lwp_info *lp;
1226 1.1 christos struct arm_linux_hw_breakpoint p;
1227 1.1 christos
1228 1.1 christos if (arm_linux_get_hw_watchpoint_count () == 0)
1229 1.1 christos return -1;
1230 1.1 christos
1231 1.1 christos arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1232 1.3 christos
1233 1.3 christos arm_linux_insert_hw_breakpoint1 (&p, 1);
1234 1.1 christos
1235 1.1 christos return 0;
1236 1.1 christos }
1237 1.1 christos
1238 1.1 christos /* Remove a hardware breakpoint. */
1239 1.1 christos static int
1240 1.3 christos arm_linux_remove_watchpoint (struct target_ops *self,
1241 1.3 christos CORE_ADDR addr, int len, int rw,
1242 1.1 christos struct expression *cond)
1243 1.1 christos {
1244 1.1 christos struct lwp_info *lp;
1245 1.1 christos struct arm_linux_hw_breakpoint p;
1246 1.1 christos
1247 1.1 christos if (arm_linux_get_hw_watchpoint_count () == 0)
1248 1.1 christos return -1;
1249 1.1 christos
1250 1.1 christos arm_linux_hw_watchpoint_initialize (addr, len, rw, &p);
1251 1.3 christos
1252 1.3 christos arm_linux_remove_hw_breakpoint1 (&p, 1);
1253 1.1 christos
1254 1.1 christos return 0;
1255 1.1 christos }
1256 1.1 christos
1257 1.1 christos /* What was the data address the target was stopped on accessing. */
1258 1.1 christos static int
1259 1.1 christos arm_linux_stopped_data_address (struct target_ops *target, CORE_ADDR *addr_p)
1260 1.1 christos {
1261 1.1 christos siginfo_t siginfo;
1262 1.1 christos int slot;
1263 1.1 christos
1264 1.1 christos if (!linux_nat_get_siginfo (inferior_ptid, &siginfo))
1265 1.1 christos return 0;
1266 1.1 christos
1267 1.1 christos /* This must be a hardware breakpoint. */
1268 1.1 christos if (siginfo.si_signo != SIGTRAP
1269 1.1 christos || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */)
1270 1.1 christos return 0;
1271 1.1 christos
1272 1.1 christos /* We must be able to set hardware watchpoints. */
1273 1.1 christos if (arm_linux_get_hw_watchpoint_count () == 0)
1274 1.1 christos return 0;
1275 1.1 christos
1276 1.1 christos slot = siginfo.si_errno;
1277 1.1 christos
1278 1.1 christos /* If we are in a positive slot then we're looking at a breakpoint and not
1279 1.1 christos a watchpoint. */
1280 1.1 christos if (slot >= 0)
1281 1.1 christos return 0;
1282 1.1 christos
1283 1.1 christos *addr_p = (CORE_ADDR) (uintptr_t) siginfo.si_addr;
1284 1.1 christos return 1;
1285 1.1 christos }
1286 1.1 christos
1287 1.1 christos /* Has the target been stopped by hitting a watchpoint? */
1288 1.1 christos static int
1289 1.3 christos arm_linux_stopped_by_watchpoint (struct target_ops *ops)
1290 1.1 christos {
1291 1.1 christos CORE_ADDR addr;
1292 1.3 christos return arm_linux_stopped_data_address (ops, &addr);
1293 1.1 christos }
1294 1.1 christos
1295 1.1 christos static int
1296 1.1 christos arm_linux_watchpoint_addr_within_range (struct target_ops *target,
1297 1.1 christos CORE_ADDR addr,
1298 1.1 christos CORE_ADDR start, int length)
1299 1.1 christos {
1300 1.1 christos return start <= addr && start + length - 1 >= addr;
1301 1.1 christos }
1302 1.1 christos
1303 1.1 christos /* Handle thread creation. We need to copy the breakpoints and watchpoints
1304 1.1 christos in the parent thread to the child thread. */
1305 1.1 christos static void
1306 1.1 christos arm_linux_new_thread (struct lwp_info *lp)
1307 1.1 christos {
1308 1.3 christos int i;
1309 1.3 christos struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
1310 1.1 christos
1311 1.3 christos /* Mark that all the hardware breakpoint/watchpoint register pairs
1312 1.3 christos for this thread need to be initialized. */
1313 1.3 christos
1314 1.3 christos for (i = 0; i < MAX_BPTS; i++)
1315 1.1 christos {
1316 1.3 christos info->bpts_changed[i] = 1;
1317 1.3 christos info->wpts_changed[i] = 1;
1318 1.3 christos }
1319 1.1 christos
1320 1.3 christos lp->arch_private = info;
1321 1.3 christos }
1322 1.1 christos
1323 1.3 christos /* Called when resuming a thread.
1324 1.3 christos The hardware debug registers are updated when there is any change. */
1325 1.1 christos
1326 1.1 christos static void
1327 1.3 christos arm_linux_prepare_to_resume (struct lwp_info *lwp)
1328 1.1 christos {
1329 1.3 christos int pid, i;
1330 1.3 christos struct arm_linux_hw_breakpoint *bpts, *wpts;
1331 1.3 christos struct arch_lwp_info *arm_lwp_info = lwp->arch_private;
1332 1.3 christos
1333 1.3 christos pid = ptid_get_lwp (lwp->ptid);
1334 1.3 christos bpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->bpts;
1335 1.3 christos wpts = arm_linux_get_debug_reg_state (ptid_get_pid (lwp->ptid))->wpts;
1336 1.3 christos
1337 1.3 christos /* NULL means this is the main thread still going through the shell,
1338 1.3 christos or, no watchpoint has been set yet. In that case, there's
1339 1.3 christos nothing to do. */
1340 1.3 christos if (arm_lwp_info == NULL)
1341 1.3 christos return;
1342 1.3 christos
1343 1.3 christos for (i = 0; i < arm_linux_get_hw_breakpoint_count (); i++)
1344 1.3 christos if (arm_lwp_info->bpts_changed[i])
1345 1.3 christos {
1346 1.3 christos errno = 0;
1347 1.3 christos if (arm_hwbp_control_is_enabled (bpts[i].control))
1348 1.3 christos if (ptrace (PTRACE_SETHBPREGS, pid,
1349 1.3 christos (PTRACE_TYPE_ARG3) ((i << 1) + 1), &bpts[i].address) < 0)
1350 1.3 christos perror_with_name (_("Unexpected error setting breakpoint"));
1351 1.3 christos
1352 1.3 christos if (bpts[i].control != 0)
1353 1.3 christos if (ptrace (PTRACE_SETHBPREGS, pid,
1354 1.3 christos (PTRACE_TYPE_ARG3) ((i << 1) + 2), &bpts[i].control) < 0)
1355 1.3 christos perror_with_name (_("Unexpected error setting breakpoint"));
1356 1.3 christos
1357 1.3 christos arm_lwp_info->bpts_changed[i] = 0;
1358 1.3 christos }
1359 1.1 christos
1360 1.3 christos for (i = 0; i < arm_linux_get_hw_watchpoint_count (); i++)
1361 1.3 christos if (arm_lwp_info->wpts_changed[i])
1362 1.3 christos {
1363 1.3 christos errno = 0;
1364 1.3 christos if (arm_hwbp_control_is_enabled (wpts[i].control))
1365 1.3 christos if (ptrace (PTRACE_SETHBPREGS, pid,
1366 1.3 christos (PTRACE_TYPE_ARG3) -((i << 1) + 1), &wpts[i].address) < 0)
1367 1.3 christos perror_with_name (_("Unexpected error setting watchpoint"));
1368 1.3 christos
1369 1.3 christos if (wpts[i].control != 0)
1370 1.3 christos if (ptrace (PTRACE_SETHBPREGS, pid,
1371 1.3 christos (PTRACE_TYPE_ARG3) -((i << 1) + 2), &wpts[i].control) < 0)
1372 1.3 christos perror_with_name (_("Unexpected error setting watchpoint"));
1373 1.1 christos
1374 1.3 christos arm_lwp_info->wpts_changed[i] = 0;
1375 1.3 christos }
1376 1.3 christos }
1377 1.1 christos
1378 1.3 christos /* linux_nat_new_fork hook. */
1379 1.1 christos
1380 1.3 christos static void
1381 1.3 christos arm_linux_new_fork (struct lwp_info *parent, pid_t child_pid)
1382 1.3 christos {
1383 1.3 christos pid_t parent_pid;
1384 1.3 christos struct arm_linux_debug_reg_state *parent_state;
1385 1.3 christos struct arm_linux_debug_reg_state *child_state;
1386 1.3 christos
1387 1.3 christos /* NULL means no watchpoint has ever been set in the parent. In
1388 1.3 christos that case, there's nothing to do. */
1389 1.3 christos if (parent->arch_private == NULL)
1390 1.3 christos return;
1391 1.1 christos
1392 1.3 christos /* GDB core assumes the child inherits the watchpoints/hw
1393 1.3 christos breakpoints of the parent, and will remove them all from the
1394 1.3 christos forked off process. Copy the debug registers mirrors into the
1395 1.3 christos new process so that all breakpoints and watchpoints can be
1396 1.3 christos removed together. */
1397 1.3 christos
1398 1.3 christos parent_pid = ptid_get_pid (parent->ptid);
1399 1.3 christos parent_state = arm_linux_get_debug_reg_state (parent_pid);
1400 1.3 christos child_state = arm_linux_get_debug_reg_state (child_pid);
1401 1.3 christos *child_state = *parent_state;
1402 1.1 christos }
1403 1.1 christos
1404 1.1 christos void _initialize_arm_linux_nat (void);
1405 1.1 christos
1406 1.1 christos void
1407 1.1 christos _initialize_arm_linux_nat (void)
1408 1.1 christos {
1409 1.1 christos struct target_ops *t;
1410 1.1 christos
1411 1.1 christos /* Fill in the generic GNU/Linux methods. */
1412 1.1 christos t = linux_target ();
1413 1.1 christos
1414 1.1 christos /* Add our register access methods. */
1415 1.1 christos t->to_fetch_registers = arm_linux_fetch_inferior_registers;
1416 1.1 christos t->to_store_registers = arm_linux_store_inferior_registers;
1417 1.1 christos
1418 1.1 christos /* Add our hardware breakpoint and watchpoint implementation. */
1419 1.1 christos t->to_can_use_hw_breakpoint = arm_linux_can_use_hw_breakpoint;
1420 1.1 christos t->to_insert_hw_breakpoint = arm_linux_insert_hw_breakpoint;
1421 1.1 christos t->to_remove_hw_breakpoint = arm_linux_remove_hw_breakpoint;
1422 1.1 christos t->to_region_ok_for_hw_watchpoint = arm_linux_region_ok_for_hw_watchpoint;
1423 1.1 christos t->to_insert_watchpoint = arm_linux_insert_watchpoint;
1424 1.1 christos t->to_remove_watchpoint = arm_linux_remove_watchpoint;
1425 1.1 christos t->to_stopped_by_watchpoint = arm_linux_stopped_by_watchpoint;
1426 1.1 christos t->to_stopped_data_address = arm_linux_stopped_data_address;
1427 1.1 christos t->to_watchpoint_addr_within_range = arm_linux_watchpoint_addr_within_range;
1428 1.1 christos
1429 1.1 christos t->to_read_description = arm_linux_read_description;
1430 1.1 christos
1431 1.1 christos /* Register the target. */
1432 1.1 christos linux_nat_add_target (t);
1433 1.1 christos
1434 1.3 christos /* Handle thread creation and exit. */
1435 1.1 christos linux_nat_set_new_thread (t, arm_linux_new_thread);
1436 1.3 christos linux_nat_set_prepare_to_resume (t, arm_linux_prepare_to_resume);
1437 1.3 christos
1438 1.3 christos /* Handle process creation and exit. */
1439 1.3 christos linux_nat_set_new_fork (t, arm_linux_new_fork);
1440 1.3 christos linux_nat_set_forget_process (t, arm_linux_forget_process);
1441 1.1 christos }
1442