1 /* Motorola m68k native support for GNU/Linux. 2 3 Copyright (C) 1996-2017 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 #include "frame.h" 22 #include "inferior.h" 23 #include "language.h" 24 #include "gdbcore.h" 25 #include "regcache.h" 26 #include "target.h" 27 #include "linux-nat.h" 28 29 #include "m68k-tdep.h" 30 31 #include <sys/dir.h> 32 #include <signal.h> 33 #include "nat/gdb_ptrace.h" 34 #include <sys/user.h> 35 #include <sys/ioctl.h> 36 #include <fcntl.h> 37 #include <sys/procfs.h> 38 39 #ifdef HAVE_SYS_REG_H 40 #include <sys/reg.h> 41 #endif 42 43 #include <sys/file.h> 44 #include <sys/stat.h> 45 46 #include "floatformat.h" 47 48 /* Prototypes for supply_gregset etc. */ 49 #include "gregset.h" 50 51 /* Defines ps_err_e, struct ps_prochandle. */ 52 #include "gdb_proc_service.h" 53 54 #include "inf-ptrace.h" 55 56 #ifndef PTRACE_GET_THREAD_AREA 57 #define PTRACE_GET_THREAD_AREA 25 58 #endif 59 60 /* This table must line up with gdbarch_register_name in "m68k-tdep.c". */ 61 static const int regmap[] = 62 { 63 PT_D0, PT_D1, PT_D2, PT_D3, PT_D4, PT_D5, PT_D6, PT_D7, 64 PT_A0, PT_A1, PT_A2, PT_A3, PT_A4, PT_A5, PT_A6, PT_USP, 65 PT_SR, PT_PC, 66 /* PT_FP0, ..., PT_FP7 */ 67 21, 24, 27, 30, 33, 36, 39, 42, 68 /* PT_FPCR, PT_FPSR, PT_FPIAR */ 69 45, 46, 47 70 }; 71 72 /* Which ptrace request retrieves which registers? 73 These apply to the corresponding SET requests as well. */ 74 #define NUM_GREGS (18) 75 #define MAX_NUM_REGS (NUM_GREGS + 11) 76 77 static int 78 getregs_supplies (int regno) 79 { 80 return 0 <= regno && regno < NUM_GREGS; 81 } 82 83 static int 84 getfpregs_supplies (int regno) 85 { 86 return M68K_FP0_REGNUM <= regno && regno <= M68K_FPI_REGNUM; 87 } 88 89 /* Does the current host support the GETREGS request? */ 90 static int have_ptrace_getregs = 91 #ifdef HAVE_PTRACE_GETREGS 92 1 93 #else 94 0 95 #endif 96 ; 97 98 99 100 /* Fetching registers directly from the U area, one at a time. */ 101 102 /* Fetch one register. */ 103 104 static void 105 fetch_register (struct regcache *regcache, int regno) 106 { 107 struct gdbarch *gdbarch = get_regcache_arch (regcache); 108 long regaddr, val; 109 int i; 110 gdb_byte buf[M68K_MAX_REGISTER_SIZE]; 111 pid_t tid = get_ptrace_pid (regcache_get_ptid (regcache)); 112 113 regaddr = 4 * regmap[regno]; 114 for (i = 0; i < register_size (gdbarch, regno); i += sizeof (long)) 115 { 116 errno = 0; 117 val = ptrace (PTRACE_PEEKUSER, tid, regaddr, 0); 118 memcpy (&buf[i], &val, sizeof (long)); 119 regaddr += sizeof (long); 120 if (errno != 0) 121 error (_("Couldn't read register %s (#%d): %s."), 122 gdbarch_register_name (gdbarch, regno), 123 regno, safe_strerror (errno)); 124 } 125 regcache_raw_supply (regcache, regno, buf); 126 } 127 128 /* Fetch register values from the inferior. 129 If REGNO is negative, do this for all registers. 130 Otherwise, REGNO specifies which register (so we can save time). */ 131 132 static void 133 old_fetch_inferior_registers (struct regcache *regcache, int regno) 134 { 135 if (regno >= 0) 136 { 137 fetch_register (regcache, regno); 138 } 139 else 140 { 141 for (regno = 0; 142 regno < gdbarch_num_regs (get_regcache_arch (regcache)); 143 regno++) 144 { 145 fetch_register (regcache, regno); 146 } 147 } 148 } 149 150 /* Store one register. */ 151 152 static void 153 store_register (const struct regcache *regcache, int regno) 154 { 155 struct gdbarch *gdbarch = get_regcache_arch (regcache); 156 long regaddr, val; 157 int i; 158 gdb_byte buf[M68K_MAX_REGISTER_SIZE]; 159 pid_t tid = get_ptrace_pid (regcache_get_ptid (regcache)); 160 161 regaddr = 4 * regmap[regno]; 162 163 /* Put the contents of regno into a local buffer. */ 164 regcache_raw_collect (regcache, regno, buf); 165 166 /* Store the local buffer into the inferior a chunk at the time. */ 167 for (i = 0; i < register_size (gdbarch, regno); i += sizeof (long)) 168 { 169 errno = 0; 170 memcpy (&val, &buf[i], sizeof (long)); 171 ptrace (PTRACE_POKEUSER, tid, regaddr, val); 172 regaddr += sizeof (long); 173 if (errno != 0) 174 error (_("Couldn't write register %s (#%d): %s."), 175 gdbarch_register_name (gdbarch, regno), 176 regno, safe_strerror (errno)); 177 } 178 } 179 180 /* Store our register values back into the inferior. 181 If REGNO is negative, do this for all registers. 182 Otherwise, REGNO specifies which register (so we can save time). */ 183 184 static void 185 old_store_inferior_registers (const struct regcache *regcache, int regno) 186 { 187 if (regno >= 0) 188 { 189 store_register (regcache, regno); 190 } 191 else 192 { 193 for (regno = 0; 194 regno < gdbarch_num_regs (get_regcache_arch (regcache)); 195 regno++) 196 { 197 store_register (regcache, regno); 198 } 199 } 200 } 201 202 /* Given a pointer to a general register set in /proc format 203 (elf_gregset_t *), unpack the register contents and supply 204 them as gdb's idea of the current register values. */ 205 206 void 207 supply_gregset (struct regcache *regcache, const elf_gregset_t *gregsetp) 208 { 209 struct gdbarch *gdbarch = get_regcache_arch (regcache); 210 const elf_greg_t *regp = (const elf_greg_t *) gregsetp; 211 int regi; 212 213 for (regi = M68K_D0_REGNUM; 214 regi <= gdbarch_sp_regnum (gdbarch); 215 regi++) 216 regcache_raw_supply (regcache, regi, ®p[regmap[regi]]); 217 regcache_raw_supply (regcache, gdbarch_ps_regnum (gdbarch), 218 ®p[PT_SR]); 219 regcache_raw_supply (regcache, 220 gdbarch_pc_regnum (gdbarch), ®p[PT_PC]); 221 } 222 223 /* Fill register REGNO (if it is a general-purpose register) in 224 *GREGSETPS with the value in GDB's register array. If REGNO is -1, 225 do this for all registers. */ 226 void 227 fill_gregset (const struct regcache *regcache, 228 elf_gregset_t *gregsetp, int regno) 229 { 230 elf_greg_t *regp = (elf_greg_t *) gregsetp; 231 int i; 232 233 for (i = 0; i < NUM_GREGS; i++) 234 if (regno == -1 || regno == i) 235 regcache_raw_collect (regcache, i, regp + regmap[i]); 236 } 237 238 #ifdef HAVE_PTRACE_GETREGS 239 240 /* Fetch all general-purpose registers from process/thread TID and 241 store their values in GDB's register array. */ 242 243 static void 244 fetch_regs (struct regcache *regcache, int tid) 245 { 246 elf_gregset_t regs; 247 248 if (ptrace (PTRACE_GETREGS, tid, 0, (int) ®s) < 0) 249 { 250 if (errno == EIO) 251 { 252 /* The kernel we're running on doesn't support the GETREGS 253 request. Reset `have_ptrace_getregs'. */ 254 have_ptrace_getregs = 0; 255 return; 256 } 257 258 perror_with_name (_("Couldn't get registers")); 259 } 260 261 supply_gregset (regcache, (const elf_gregset_t *) ®s); 262 } 263 264 /* Store all valid general-purpose registers in GDB's register array 265 into the process/thread specified by TID. */ 266 267 static void 268 store_regs (const struct regcache *regcache, int tid, int regno) 269 { 270 elf_gregset_t regs; 271 272 if (ptrace (PTRACE_GETREGS, tid, 0, (int) ®s) < 0) 273 perror_with_name (_("Couldn't get registers")); 274 275 fill_gregset (regcache, ®s, regno); 276 277 if (ptrace (PTRACE_SETREGS, tid, 0, (int) ®s) < 0) 278 perror_with_name (_("Couldn't write registers")); 279 } 280 281 #else 282 283 static void fetch_regs (struct regcache *regcache, int tid) 284 { 285 } 286 287 static void store_regs (const struct regcache *regcache, int tid, int regno) 288 { 289 } 290 291 #endif 292 293 294 /* Transfering floating-point registers between GDB, inferiors and cores. */ 295 296 /* What is the address of fpN within the floating-point register set F? */ 297 #define FPREG_ADDR(f, n) (&(f)->fpregs[(n) * 3]) 298 299 /* Fill GDB's register array with the floating-point register values in 300 *FPREGSETP. */ 301 302 void 303 supply_fpregset (struct regcache *regcache, const elf_fpregset_t *fpregsetp) 304 { 305 struct gdbarch *gdbarch = get_regcache_arch (regcache); 306 int regi; 307 308 for (regi = gdbarch_fp0_regnum (gdbarch); 309 regi < gdbarch_fp0_regnum (gdbarch) + 8; regi++) 310 regcache_raw_supply (regcache, regi, 311 FPREG_ADDR (fpregsetp, 312 regi - gdbarch_fp0_regnum (gdbarch))); 313 regcache_raw_supply (regcache, M68K_FPC_REGNUM, &fpregsetp->fpcntl[0]); 314 regcache_raw_supply (regcache, M68K_FPS_REGNUM, &fpregsetp->fpcntl[1]); 315 regcache_raw_supply (regcache, M68K_FPI_REGNUM, &fpregsetp->fpcntl[2]); 316 } 317 318 /* Fill register REGNO (if it is a floating-point register) in 319 *FPREGSETP with the value in GDB's register array. If REGNO is -1, 320 do this for all registers. */ 321 322 void 323 fill_fpregset (const struct regcache *regcache, 324 elf_fpregset_t *fpregsetp, int regno) 325 { 326 struct gdbarch *gdbarch = get_regcache_arch (regcache); 327 int i; 328 329 /* Fill in the floating-point registers. */ 330 for (i = gdbarch_fp0_regnum (gdbarch); 331 i < gdbarch_fp0_regnum (gdbarch) + 8; i++) 332 if (regno == -1 || regno == i) 333 regcache_raw_collect (regcache, i, 334 FPREG_ADDR (fpregsetp, 335 i - gdbarch_fp0_regnum (gdbarch))); 336 337 /* Fill in the floating-point control registers. */ 338 for (i = M68K_FPC_REGNUM; i <= M68K_FPI_REGNUM; i++) 339 if (regno == -1 || regno == i) 340 regcache_raw_collect (regcache, i, 341 &fpregsetp->fpcntl[i - M68K_FPC_REGNUM]); 342 } 343 344 #ifdef HAVE_PTRACE_GETREGS 345 346 /* Fetch all floating-point registers from process/thread TID and store 347 thier values in GDB's register array. */ 348 349 static void 350 fetch_fpregs (struct regcache *regcache, int tid) 351 { 352 elf_fpregset_t fpregs; 353 354 if (ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs) < 0) 355 perror_with_name (_("Couldn't get floating point status")); 356 357 supply_fpregset (regcache, (const elf_fpregset_t *) &fpregs); 358 } 359 360 /* Store all valid floating-point registers in GDB's register array 361 into the process/thread specified by TID. */ 362 363 static void 364 store_fpregs (const struct regcache *regcache, int tid, int regno) 365 { 366 elf_fpregset_t fpregs; 367 368 if (ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs) < 0) 369 perror_with_name (_("Couldn't get floating point status")); 370 371 fill_fpregset (regcache, &fpregs, regno); 372 373 if (ptrace (PTRACE_SETFPREGS, tid, 0, (int) &fpregs) < 0) 374 perror_with_name (_("Couldn't write floating point status")); 375 } 376 377 #else 378 379 static void fetch_fpregs (struct regcache *regcache, int tid) 380 { 381 } 382 383 static void store_fpregs (const struct regcache *regcache, int tid, int regno) 384 { 385 } 386 387 #endif 388 389 /* Transferring arbitrary registers between GDB and inferior. */ 390 391 /* Fetch register REGNO from the child process. If REGNO is -1, do 392 this for all registers (including the floating point and SSE 393 registers). */ 394 395 static void 396 m68k_linux_fetch_inferior_registers (struct target_ops *ops, 397 struct regcache *regcache, int regno) 398 { 399 pid_t tid; 400 401 /* Use the old method of peeking around in `struct user' if the 402 GETREGS request isn't available. */ 403 if (! have_ptrace_getregs) 404 { 405 old_fetch_inferior_registers (regcache, regno); 406 return; 407 } 408 409 tid = get_ptrace_pid (regcache_get_ptid (regcache)); 410 411 /* Use the PTRACE_GETFPXREGS request whenever possible, since it 412 transfers more registers in one system call, and we'll cache the 413 results. But remember that fetch_fpxregs can fail, and return 414 zero. */ 415 if (regno == -1) 416 { 417 fetch_regs (regcache, tid); 418 419 /* The call above might reset `have_ptrace_getregs'. */ 420 if (! have_ptrace_getregs) 421 { 422 old_fetch_inferior_registers (regcache, -1); 423 return; 424 } 425 426 fetch_fpregs (regcache, tid); 427 return; 428 } 429 430 if (getregs_supplies (regno)) 431 { 432 fetch_regs (regcache, tid); 433 return; 434 } 435 436 if (getfpregs_supplies (regno)) 437 { 438 fetch_fpregs (regcache, tid); 439 return; 440 } 441 442 internal_error (__FILE__, __LINE__, 443 _("Got request for bad register number %d."), regno); 444 } 445 446 /* Store register REGNO back into the child process. If REGNO is -1, 447 do this for all registers (including the floating point and SSE 448 registers). */ 449 static void 450 m68k_linux_store_inferior_registers (struct target_ops *ops, 451 struct regcache *regcache, int regno) 452 { 453 pid_t tid; 454 455 /* Use the old method of poking around in `struct user' if the 456 SETREGS request isn't available. */ 457 if (! have_ptrace_getregs) 458 { 459 old_store_inferior_registers (regcache, regno); 460 return; 461 } 462 463 tid = get_ptrace_pid (regcache_get_ptid (regcache)); 464 465 /* Use the PTRACE_SETFPREGS requests whenever possible, since it 466 transfers more registers in one system call. But remember that 467 store_fpregs can fail, and return zero. */ 468 if (regno == -1) 469 { 470 store_regs (regcache, tid, regno); 471 store_fpregs (regcache, tid, regno); 472 return; 473 } 474 475 if (getregs_supplies (regno)) 476 { 477 store_regs (regcache, tid, regno); 478 return; 479 } 480 481 if (getfpregs_supplies (regno)) 482 { 483 store_fpregs (regcache, tid, regno); 484 return; 485 } 486 487 internal_error (__FILE__, __LINE__, 488 _("Got request to store bad register number %d."), regno); 489 } 490 491 492 /* Fetch the thread-local storage pointer for libthread_db. */ 493 494 ps_err_e 495 ps_get_thread_area (struct ps_prochandle *ph, 496 lwpid_t lwpid, int idx, void **base) 497 { 498 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) < 0) 499 return PS_ERR; 500 501 /* IDX is the bias from the thread pointer to the beginning of the 502 thread descriptor. It has to be subtracted due to implementation 503 quirks in libthread_db. */ 504 *base = (char *) *base - idx; 505 506 return PS_OK; 507 } 508 509 510 void _initialize_m68k_linux_nat (void); 511 512 void 513 _initialize_m68k_linux_nat (void) 514 { 515 struct target_ops *t; 516 517 /* Fill in the generic GNU/Linux methods. */ 518 t = linux_target (); 519 520 /* Add our register access methods. */ 521 t->to_fetch_registers = m68k_linux_fetch_inferior_registers; 522 t->to_store_registers = m68k_linux_store_inferior_registers; 523 524 /* Register the target. */ 525 linux_nat_add_target (t); 526 } 527