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