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