1 /* GNU/Linux/MIPS specific low level interface, for the remote server for GDB. 2 Copyright (C) 1995-2020 Free Software Foundation, Inc. 3 4 This file is part of GDB. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18 19 #include "server.h" 20 #include "linux-low.h" 21 22 #include "nat/gdb_ptrace.h" 23 #include <endian.h> 24 25 #include "nat/mips-linux-watch.h" 26 #include "gdb_proc_service.h" 27 28 /* Linux target op definitions for the MIPS architecture. */ 29 30 class mips_target : public linux_process_target 31 { 32 public: 33 34 const regs_info *get_regs_info () override; 35 36 const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override; 37 38 bool supports_z_point_type (char z_type) override; 39 40 protected: 41 42 void low_arch_setup () override; 43 44 bool low_cannot_fetch_register (int regno) override; 45 46 bool low_cannot_store_register (int regno) override; 47 48 bool low_fetch_register (regcache *regcache, int regno) override; 49 50 bool low_supports_breakpoints () override; 51 52 CORE_ADDR low_get_pc (regcache *regcache) override; 53 54 void low_set_pc (regcache *regcache, CORE_ADDR newpc) override; 55 56 bool low_breakpoint_at (CORE_ADDR pc) override; 57 58 int low_insert_point (raw_bkpt_type type, CORE_ADDR addr, 59 int size, raw_breakpoint *bp) override; 60 61 int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, 62 int size, raw_breakpoint *bp) override; 63 64 bool low_stopped_by_watchpoint () override; 65 66 CORE_ADDR low_stopped_data_address () override; 67 68 void low_collect_ptrace_register (regcache *regcache, int regno, 69 char *buf) override; 70 71 void low_supply_ptrace_register (regcache *regcache, int regno, 72 const char *buf) override; 73 74 arch_process_info *low_new_process () override; 75 76 void low_delete_process (arch_process_info *info) override; 77 78 void low_new_thread (lwp_info *) override; 79 80 void low_delete_thread (arch_lwp_info *) override; 81 82 void low_new_fork (process_info *parent, process_info *child) override; 83 84 void low_prepare_to_resume (lwp_info *lwp) override; 85 }; 86 87 /* The singleton target ops object. */ 88 89 static mips_target the_mips_target; 90 91 /* Defined in auto-generated file mips-linux.c. */ 92 void init_registers_mips_linux (void); 93 extern const struct target_desc *tdesc_mips_linux; 94 95 /* Defined in auto-generated file mips-dsp-linux.c. */ 96 void init_registers_mips_dsp_linux (void); 97 extern const struct target_desc *tdesc_mips_dsp_linux; 98 99 /* Defined in auto-generated file mips64-linux.c. */ 100 void init_registers_mips64_linux (void); 101 extern const struct target_desc *tdesc_mips64_linux; 102 103 /* Defined in auto-generated file mips64-dsp-linux.c. */ 104 void init_registers_mips64_dsp_linux (void); 105 extern const struct target_desc *tdesc_mips64_dsp_linux; 106 107 #ifdef __mips64 108 #define tdesc_mips_linux tdesc_mips64_linux 109 #define tdesc_mips_dsp_linux tdesc_mips64_dsp_linux 110 #endif 111 112 #ifndef PTRACE_GET_THREAD_AREA 113 #define PTRACE_GET_THREAD_AREA 25 114 #endif 115 116 #ifdef HAVE_SYS_REG_H 117 #include <sys/reg.h> 118 #endif 119 120 #define mips_num_regs 73 121 #define mips_dsp_num_regs 80 122 123 #include <asm/ptrace.h> 124 125 #ifndef DSP_BASE 126 #define DSP_BASE 71 127 #define DSP_CONTROL 77 128 #endif 129 130 union mips_register 131 { 132 unsigned char buf[8]; 133 134 /* Deliberately signed, for proper sign extension. */ 135 int reg32; 136 long long reg64; 137 }; 138 139 /* Return the ptrace ``address'' of register REGNO. */ 140 141 #define mips_base_regs \ 142 -1, 1, 2, 3, 4, 5, 6, 7, \ 143 8, 9, 10, 11, 12, 13, 14, 15, \ 144 16, 17, 18, 19, 20, 21, 22, 23, \ 145 24, 25, 26, 27, 28, 29, 30, 31, \ 146 \ 147 -1, MMLO, MMHI, BADVADDR, CAUSE, PC, \ 148 \ 149 FPR_BASE, FPR_BASE + 1, FPR_BASE + 2, FPR_BASE + 3, \ 150 FPR_BASE + 4, FPR_BASE + 5, FPR_BASE + 6, FPR_BASE + 7, \ 151 FPR_BASE + 8, FPR_BASE + 9, FPR_BASE + 10, FPR_BASE + 11, \ 152 FPR_BASE + 12, FPR_BASE + 13, FPR_BASE + 14, FPR_BASE + 15, \ 153 FPR_BASE + 16, FPR_BASE + 17, FPR_BASE + 18, FPR_BASE + 19, \ 154 FPR_BASE + 20, FPR_BASE + 21, FPR_BASE + 22, FPR_BASE + 23, \ 155 FPR_BASE + 24, FPR_BASE + 25, FPR_BASE + 26, FPR_BASE + 27, \ 156 FPR_BASE + 28, FPR_BASE + 29, FPR_BASE + 30, FPR_BASE + 31, \ 157 FPC_CSR, FPC_EIR 158 159 #define mips_dsp_regs \ 160 DSP_BASE, DSP_BASE + 1, DSP_BASE + 2, DSP_BASE + 3, \ 161 DSP_BASE + 4, DSP_BASE + 5, \ 162 DSP_CONTROL 163 164 static int mips_regmap[mips_num_regs] = { 165 mips_base_regs, 166 0 167 }; 168 169 static int mips_dsp_regmap[mips_dsp_num_regs] = { 170 mips_base_regs, 171 mips_dsp_regs, 172 0 173 }; 174 175 /* DSP registers are not in any regset and can only be accessed 176 individually. */ 177 178 static unsigned char mips_dsp_regset_bitmap[(mips_dsp_num_regs + 7) / 8] = { 179 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80 180 }; 181 182 static int have_dsp = -1; 183 184 /* Try peeking at an arbitrarily chosen DSP register and pick the available 185 user register set accordingly. */ 186 187 static const struct target_desc * 188 mips_read_description (void) 189 { 190 if (have_dsp < 0) 191 { 192 int pid = lwpid_of (current_thread); 193 194 errno = 0; 195 ptrace (PTRACE_PEEKUSER, pid, DSP_CONTROL, 0); 196 switch (errno) 197 { 198 case 0: 199 have_dsp = 1; 200 break; 201 case EIO: 202 have_dsp = 0; 203 break; 204 default: 205 perror_with_name ("ptrace"); 206 break; 207 } 208 } 209 210 return have_dsp ? tdesc_mips_dsp_linux : tdesc_mips_linux; 211 } 212 213 void 214 mips_target::low_arch_setup () 215 { 216 current_process ()->tdesc = mips_read_description (); 217 } 218 219 /* Per-process arch-specific data we want to keep. */ 220 221 struct arch_process_info 222 { 223 /* -1 if the kernel and/or CPU do not support watch registers. 224 1 if watch_readback is valid and we can read style, num_valid 225 and the masks. 226 0 if we need to read the watch_readback. */ 227 228 int watch_readback_valid; 229 230 /* Cached watch register read values. */ 231 232 struct pt_watch_regs watch_readback; 233 234 /* Current watchpoint requests for this process. */ 235 236 struct mips_watchpoint *current_watches; 237 238 /* The current set of watch register values for writing the 239 registers. */ 240 241 struct pt_watch_regs watch_mirror; 242 }; 243 244 /* Per-thread arch-specific data we want to keep. */ 245 246 struct arch_lwp_info 247 { 248 /* Non-zero if our copy differs from what's recorded in the thread. */ 249 int watch_registers_changed; 250 }; 251 252 /* From mips-linux-nat.c. */ 253 254 /* Pseudo registers can not be read. ptrace does not provide a way to 255 read (or set) PS_REGNUM, and there's no point in reading or setting 256 ZERO_REGNUM, it's always 0. We also can not set BADVADDR, CAUSE, 257 or FCRIR via ptrace(). */ 258 259 bool 260 mips_target::low_cannot_fetch_register (int regno) 261 { 262 const struct target_desc *tdesc; 263 264 if (get_regs_info ()->usrregs->regmap[regno] == -1) 265 return true; 266 267 tdesc = current_process ()->tdesc; 268 269 /* On n32 we can't access 64-bit registers via PTRACE_PEEKUSR. */ 270 if (register_size (tdesc, regno) > sizeof (PTRACE_XFER_TYPE)) 271 return true; 272 273 if (find_regno (tdesc, "r0") == regno) 274 return true; 275 276 return false; 277 } 278 279 bool 280 mips_target::low_cannot_store_register (int regno) 281 { 282 const struct target_desc *tdesc; 283 284 if (get_regs_info ()->usrregs->regmap[regno] == -1) 285 return true; 286 287 tdesc = current_process ()->tdesc; 288 289 /* On n32 we can't access 64-bit registers via PTRACE_POKEUSR. */ 290 if (register_size (tdesc, regno) > sizeof (PTRACE_XFER_TYPE)) 291 return true; 292 293 if (find_regno (tdesc, "r0") == regno) 294 return true; 295 296 if (find_regno (tdesc, "cause") == regno) 297 return true; 298 299 if (find_regno (tdesc, "badvaddr") == regno) 300 return true; 301 302 if (find_regno (tdesc, "fir") == regno) 303 return true; 304 305 return false; 306 } 307 308 bool 309 mips_target::low_fetch_register (regcache *regcache, int regno) 310 { 311 const struct target_desc *tdesc = current_process ()->tdesc; 312 313 if (find_regno (tdesc, "r0") == regno) 314 { 315 supply_register_zeroed (regcache, regno); 316 return true; 317 } 318 319 return false; 320 } 321 322 bool 323 mips_target::low_supports_breakpoints () 324 { 325 return true; 326 } 327 328 CORE_ADDR 329 mips_target::low_get_pc (regcache *regcache) 330 { 331 union mips_register pc; 332 collect_register_by_name (regcache, "pc", pc.buf); 333 return register_size (regcache->tdesc, 0) == 4 ? pc.reg32 : pc.reg64; 334 } 335 336 void 337 mips_target::low_set_pc (regcache *regcache, CORE_ADDR pc) 338 { 339 union mips_register newpc; 340 if (register_size (regcache->tdesc, 0) == 4) 341 newpc.reg32 = pc; 342 else 343 newpc.reg64 = pc; 344 345 supply_register_by_name (regcache, "pc", newpc.buf); 346 } 347 348 /* Correct in either endianness. */ 349 static const unsigned int mips_breakpoint = 0x0005000d; 350 #define mips_breakpoint_len 4 351 352 /* Implementation of target ops method "sw_breakpoint_from_kind". */ 353 354 const gdb_byte * 355 mips_target::sw_breakpoint_from_kind (int kind, int *size) 356 { 357 *size = mips_breakpoint_len; 358 return (const gdb_byte *) &mips_breakpoint; 359 } 360 361 bool 362 mips_target::low_breakpoint_at (CORE_ADDR where) 363 { 364 unsigned int insn; 365 366 read_memory (where, (unsigned char *) &insn, 4); 367 if (insn == mips_breakpoint) 368 return true; 369 370 /* If necessary, recognize more trap instructions here. GDB only uses the 371 one. */ 372 return false; 373 } 374 375 /* Mark the watch registers of lwp, represented by ENTRY, as changed. */ 376 377 static void 378 update_watch_registers_callback (thread_info *thread) 379 { 380 struct lwp_info *lwp = get_thread_lwp (thread); 381 382 /* The actual update is done later just before resuming the lwp, 383 we just mark that the registers need updating. */ 384 lwp->arch_private->watch_registers_changed = 1; 385 386 /* If the lwp isn't stopped, force it to momentarily pause, so 387 we can update its watch registers. */ 388 if (!lwp->stopped) 389 linux_stop_lwp (lwp); 390 } 391 392 /* This is the implementation of linux target ops method 393 low_new_process. */ 394 395 arch_process_info * 396 mips_target::low_new_process () 397 { 398 struct arch_process_info *info = XCNEW (struct arch_process_info); 399 400 return info; 401 } 402 403 /* This is the implementation of linux target ops method 404 low_delete_process. */ 405 406 void 407 mips_target::low_delete_process (arch_process_info *info) 408 { 409 xfree (info); 410 } 411 412 /* This is the implementation of linux target ops method low_new_thread. 413 Mark the watch registers as changed, so the threads' copies will 414 be updated. */ 415 416 void 417 mips_target::low_new_thread (lwp_info *lwp) 418 { 419 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info); 420 421 info->watch_registers_changed = 1; 422 423 lwp->arch_private = info; 424 } 425 426 /* Function to call when a thread is being deleted. */ 427 428 void 429 mips_target::low_delete_thread (arch_lwp_info *arch_lwp) 430 { 431 xfree (arch_lwp); 432 } 433 434 /* Create a new mips_watchpoint and add it to the list. */ 435 436 static void 437 mips_add_watchpoint (struct arch_process_info *priv, CORE_ADDR addr, int len, 438 enum target_hw_bp_type watch_type) 439 { 440 struct mips_watchpoint *new_watch; 441 struct mips_watchpoint **pw; 442 443 new_watch = XNEW (struct mips_watchpoint); 444 new_watch->addr = addr; 445 new_watch->len = len; 446 new_watch->type = watch_type; 447 new_watch->next = NULL; 448 449 pw = &priv->current_watches; 450 while (*pw != NULL) 451 pw = &(*pw)->next; 452 *pw = new_watch; 453 } 454 455 /* Hook to call when a new fork is attached. */ 456 457 void 458 mips_target::low_new_fork (process_info *parent, 459 process_info *child) 460 { 461 struct arch_process_info *parent_private; 462 struct arch_process_info *child_private; 463 struct mips_watchpoint *wp; 464 465 /* These are allocated by linux_add_process. */ 466 gdb_assert (parent->priv != NULL 467 && parent->priv->arch_private != NULL); 468 gdb_assert (child->priv != NULL 469 && child->priv->arch_private != NULL); 470 471 /* Linux kernel before 2.6.33 commit 472 72f674d203cd230426437cdcf7dd6f681dad8b0d 473 will inherit hardware debug registers from parent 474 on fork/vfork/clone. Newer Linux kernels create such tasks with 475 zeroed debug registers. 476 477 GDB core assumes the child inherits the watchpoints/hw 478 breakpoints of the parent, and will remove them all from the 479 forked off process. Copy the debug registers mirrors into the 480 new process so that all breakpoints and watchpoints can be 481 removed together. The debug registers mirror will become zeroed 482 in the end before detaching the forked off process, thus making 483 this compatible with older Linux kernels too. */ 484 485 parent_private = parent->priv->arch_private; 486 child_private = child->priv->arch_private; 487 488 child_private->watch_readback_valid = parent_private->watch_readback_valid; 489 child_private->watch_readback = parent_private->watch_readback; 490 491 for (wp = parent_private->current_watches; wp != NULL; wp = wp->next) 492 mips_add_watchpoint (child_private, wp->addr, wp->len, wp->type); 493 494 child_private->watch_mirror = parent_private->watch_mirror; 495 } 496 /* This is the implementation of linux target ops method 497 low_prepare_to_resume. If the watch regs have changed, update the 498 thread's copies. */ 499 500 void 501 mips_target::low_prepare_to_resume (lwp_info *lwp) 502 { 503 ptid_t ptid = ptid_of (get_lwp_thread (lwp)); 504 struct process_info *proc = find_process_pid (ptid.pid ()); 505 struct arch_process_info *priv = proc->priv->arch_private; 506 507 if (lwp->arch_private->watch_registers_changed) 508 { 509 /* Only update the watch registers if we have set or unset a 510 watchpoint already. */ 511 if (mips_linux_watch_get_num_valid (&priv->watch_mirror) > 0) 512 { 513 /* Write the mirrored watch register values. */ 514 int tid = ptid.lwp (); 515 516 if (-1 == ptrace (PTRACE_SET_WATCH_REGS, tid, 517 &priv->watch_mirror, NULL)) 518 perror_with_name ("Couldn't write watch register"); 519 } 520 521 lwp->arch_private->watch_registers_changed = 0; 522 } 523 } 524 525 bool 526 mips_target::supports_z_point_type (char z_type) 527 { 528 switch (z_type) 529 { 530 case Z_PACKET_WRITE_WP: 531 case Z_PACKET_READ_WP: 532 case Z_PACKET_ACCESS_WP: 533 return true; 534 default: 535 return false; 536 } 537 } 538 539 /* This is the implementation of linux target ops method 540 low_insert_point. */ 541 542 int 543 mips_target::low_insert_point (raw_bkpt_type type, CORE_ADDR addr, 544 int len, raw_breakpoint *bp) 545 { 546 struct process_info *proc = current_process (); 547 struct arch_process_info *priv = proc->priv->arch_private; 548 struct pt_watch_regs regs; 549 long lwpid; 550 enum target_hw_bp_type watch_type; 551 uint32_t irw; 552 553 lwpid = lwpid_of (current_thread); 554 if (!mips_linux_read_watch_registers (lwpid, 555 &priv->watch_readback, 556 &priv->watch_readback_valid, 557 0)) 558 return -1; 559 560 if (len <= 0) 561 return -1; 562 563 regs = priv->watch_readback; 564 /* Add the current watches. */ 565 mips_linux_watch_populate_regs (priv->current_watches, ®s); 566 567 /* Now try to add the new watch. */ 568 watch_type = raw_bkpt_type_to_target_hw_bp_type (type); 569 irw = mips_linux_watch_type_to_irw (watch_type); 570 if (!mips_linux_watch_try_one_watch (®s, addr, len, irw)) 571 return -1; 572 573 /* It fit. Stick it on the end of the list. */ 574 mips_add_watchpoint (priv, addr, len, watch_type); 575 576 priv->watch_mirror = regs; 577 578 /* Only update the threads of this process. */ 579 for_each_thread (proc->pid, update_watch_registers_callback); 580 581 return 0; 582 } 583 584 /* This is the implementation of linux target ops method 585 low_remove_point. */ 586 587 int 588 mips_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, 589 int len, raw_breakpoint *bp) 590 { 591 struct process_info *proc = current_process (); 592 struct arch_process_info *priv = proc->priv->arch_private; 593 594 int deleted_one; 595 enum target_hw_bp_type watch_type; 596 597 struct mips_watchpoint **pw; 598 struct mips_watchpoint *w; 599 600 /* Search for a known watch that matches. Then unlink and free it. */ 601 watch_type = raw_bkpt_type_to_target_hw_bp_type (type); 602 deleted_one = 0; 603 pw = &priv->current_watches; 604 while ((w = *pw)) 605 { 606 if (w->addr == addr && w->len == len && w->type == watch_type) 607 { 608 *pw = w->next; 609 free (w); 610 deleted_one = 1; 611 break; 612 } 613 pw = &(w->next); 614 } 615 616 if (!deleted_one) 617 return -1; /* We don't know about it, fail doing nothing. */ 618 619 /* At this point watch_readback is known to be valid because we 620 could not have added the watch without reading it. */ 621 gdb_assert (priv->watch_readback_valid == 1); 622 623 priv->watch_mirror = priv->watch_readback; 624 mips_linux_watch_populate_regs (priv->current_watches, 625 &priv->watch_mirror); 626 627 /* Only update the threads of this process. */ 628 for_each_thread (proc->pid, update_watch_registers_callback); 629 630 return 0; 631 } 632 633 /* This is the implementation of linux target ops method 634 low_stopped_by_watchpoint. The watchhi R and W bits indicate 635 the watch register triggered. */ 636 637 bool 638 mips_target::low_stopped_by_watchpoint () 639 { 640 struct process_info *proc = current_process (); 641 struct arch_process_info *priv = proc->priv->arch_private; 642 int n; 643 int num_valid; 644 long lwpid = lwpid_of (current_thread); 645 646 if (!mips_linux_read_watch_registers (lwpid, 647 &priv->watch_readback, 648 &priv->watch_readback_valid, 649 1)) 650 return 0; 651 652 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback); 653 654 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++) 655 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n) 656 & (R_MASK | W_MASK)) 657 return true; 658 659 return false; 660 } 661 662 /* This is the implementation of linux target ops method 663 low_stopped_data_address. */ 664 665 CORE_ADDR 666 mips_target::low_stopped_data_address () 667 { 668 struct process_info *proc = current_process (); 669 struct arch_process_info *priv = proc->priv->arch_private; 670 int n; 671 int num_valid; 672 long lwpid = lwpid_of (current_thread); 673 674 /* On MIPS we don't know the low order 3 bits of the data address. 675 GDB does not support remote targets that can't report the 676 watchpoint address. So, make our best guess; return the starting 677 address of a watchpoint request which overlaps the one that 678 triggered. */ 679 680 if (!mips_linux_read_watch_registers (lwpid, 681 &priv->watch_readback, 682 &priv->watch_readback_valid, 683 0)) 684 return 0; 685 686 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback); 687 688 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++) 689 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n) 690 & (R_MASK | W_MASK)) 691 { 692 CORE_ADDR t_low, t_hi; 693 int t_irw; 694 struct mips_watchpoint *watch; 695 696 t_low = mips_linux_watch_get_watchlo (&priv->watch_readback, n); 697 t_irw = t_low & IRW_MASK; 698 t_hi = (mips_linux_watch_get_watchhi (&priv->watch_readback, n) 699 | IRW_MASK); 700 t_low &= ~(CORE_ADDR)t_hi; 701 702 for (watch = priv->current_watches; 703 watch != NULL; 704 watch = watch->next) 705 { 706 CORE_ADDR addr = watch->addr; 707 CORE_ADDR last_byte = addr + watch->len - 1; 708 709 if ((t_irw & mips_linux_watch_type_to_irw (watch->type)) == 0) 710 { 711 /* Different type. */ 712 continue; 713 } 714 /* Check for overlap of even a single byte. */ 715 if (last_byte >= t_low && addr <= t_low + t_hi) 716 return addr; 717 } 718 } 719 720 /* Shouldn't happen. */ 721 return 0; 722 } 723 724 /* Fetch the thread-local storage pointer for libthread_db. */ 725 726 ps_err_e 727 ps_get_thread_area (struct ps_prochandle *ph, 728 lwpid_t lwpid, int idx, void **base) 729 { 730 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0) 731 return PS_ERR; 732 733 /* IDX is the bias from the thread pointer to the beginning of the 734 thread descriptor. It has to be subtracted due to implementation 735 quirks in libthread_db. */ 736 *base = (void *) ((char *)*base - idx); 737 738 return PS_OK; 739 } 740 741 static void 742 mips_collect_register (struct regcache *regcache, 743 int use_64bit, int regno, union mips_register *reg) 744 { 745 union mips_register tmp_reg; 746 747 if (use_64bit) 748 { 749 collect_register (regcache, regno, &tmp_reg.reg64); 750 *reg = tmp_reg; 751 } 752 else 753 { 754 collect_register (regcache, regno, &tmp_reg.reg32); 755 reg->reg64 = tmp_reg.reg32; 756 } 757 } 758 759 static void 760 mips_supply_register (struct regcache *regcache, 761 int use_64bit, int regno, const union mips_register *reg) 762 { 763 int offset = 0; 764 765 /* For big-endian 32-bit targets, ignore the high four bytes of each 766 eight-byte slot. */ 767 if (__BYTE_ORDER == __BIG_ENDIAN && !use_64bit) 768 offset = 4; 769 770 supply_register (regcache, regno, reg->buf + offset); 771 } 772 773 #ifdef HAVE_PTRACE_GETREGS 774 775 static void 776 mips_collect_register_32bit (struct regcache *regcache, 777 int use_64bit, int regno, unsigned char *buf) 778 { 779 union mips_register tmp_reg; 780 int reg32; 781 782 mips_collect_register (regcache, use_64bit, regno, &tmp_reg); 783 reg32 = tmp_reg.reg64; 784 memcpy (buf, ®32, 4); 785 } 786 787 static void 788 mips_supply_register_32bit (struct regcache *regcache, 789 int use_64bit, int regno, const unsigned char *buf) 790 { 791 union mips_register tmp_reg; 792 int reg32; 793 794 memcpy (®32, buf, 4); 795 tmp_reg.reg64 = reg32; 796 mips_supply_register (regcache, use_64bit, regno, &tmp_reg); 797 } 798 799 static void 800 mips_fill_gregset (struct regcache *regcache, void *buf) 801 { 802 union mips_register *regset = (union mips_register *) buf; 803 int i, use_64bit; 804 const struct target_desc *tdesc = regcache->tdesc; 805 806 use_64bit = (register_size (tdesc, 0) == 8); 807 808 for (i = 1; i < 32; i++) 809 mips_collect_register (regcache, use_64bit, i, regset + i); 810 811 mips_collect_register (regcache, use_64bit, 812 find_regno (tdesc, "lo"), regset + 32); 813 mips_collect_register (regcache, use_64bit, 814 find_regno (tdesc, "hi"), regset + 33); 815 mips_collect_register (regcache, use_64bit, 816 find_regno (tdesc, "pc"), regset + 34); 817 mips_collect_register (regcache, use_64bit, 818 find_regno (tdesc, "badvaddr"), regset + 35); 819 mips_collect_register (regcache, use_64bit, 820 find_regno (tdesc, "status"), regset + 36); 821 mips_collect_register (regcache, use_64bit, 822 find_regno (tdesc, "cause"), regset + 37); 823 824 mips_collect_register (regcache, use_64bit, 825 find_regno (tdesc, "restart"), regset + 0); 826 } 827 828 static void 829 mips_store_gregset (struct regcache *regcache, const void *buf) 830 { 831 const union mips_register *regset = (const union mips_register *) buf; 832 int i, use_64bit; 833 834 use_64bit = (register_size (regcache->tdesc, 0) == 8); 835 836 supply_register_by_name_zeroed (regcache, "r0"); 837 838 for (i = 1; i < 32; i++) 839 mips_supply_register (regcache, use_64bit, i, regset + i); 840 841 mips_supply_register (regcache, use_64bit, 842 find_regno (regcache->tdesc, "lo"), regset + 32); 843 mips_supply_register (regcache, use_64bit, 844 find_regno (regcache->tdesc, "hi"), regset + 33); 845 mips_supply_register (regcache, use_64bit, 846 find_regno (regcache->tdesc, "pc"), regset + 34); 847 mips_supply_register (regcache, use_64bit, 848 find_regno (regcache->tdesc, "badvaddr"), regset + 35); 849 mips_supply_register (regcache, use_64bit, 850 find_regno (regcache->tdesc, "status"), regset + 36); 851 mips_supply_register (regcache, use_64bit, 852 find_regno (regcache->tdesc, "cause"), regset + 37); 853 854 mips_supply_register (regcache, use_64bit, 855 find_regno (regcache->tdesc, "restart"), regset + 0); 856 } 857 858 static void 859 mips_fill_fpregset (struct regcache *regcache, void *buf) 860 { 861 union mips_register *regset = (union mips_register *) buf; 862 int i, use_64bit, first_fp, big_endian; 863 864 use_64bit = (register_size (regcache->tdesc, 0) == 8); 865 first_fp = find_regno (regcache->tdesc, "f0"); 866 big_endian = (__BYTE_ORDER == __BIG_ENDIAN); 867 868 /* See GDB for a discussion of this peculiar layout. */ 869 for (i = 0; i < 32; i++) 870 if (use_64bit) 871 collect_register (regcache, first_fp + i, regset[i].buf); 872 else 873 collect_register (regcache, first_fp + i, 874 regset[i & ~1].buf + 4 * (big_endian != (i & 1))); 875 876 mips_collect_register_32bit (regcache, use_64bit, 877 find_regno (regcache->tdesc, "fcsr"), regset[32].buf); 878 mips_collect_register_32bit (regcache, use_64bit, 879 find_regno (regcache->tdesc, "fir"), 880 regset[32].buf + 4); 881 } 882 883 static void 884 mips_store_fpregset (struct regcache *regcache, const void *buf) 885 { 886 const union mips_register *regset = (const union mips_register *) buf; 887 int i, use_64bit, first_fp, big_endian; 888 889 use_64bit = (register_size (regcache->tdesc, 0) == 8); 890 first_fp = find_regno (regcache->tdesc, "f0"); 891 big_endian = (__BYTE_ORDER == __BIG_ENDIAN); 892 893 /* See GDB for a discussion of this peculiar layout. */ 894 for (i = 0; i < 32; i++) 895 if (use_64bit) 896 supply_register (regcache, first_fp + i, regset[i].buf); 897 else 898 supply_register (regcache, first_fp + i, 899 regset[i & ~1].buf + 4 * (big_endian != (i & 1))); 900 901 mips_supply_register_32bit (regcache, use_64bit, 902 find_regno (regcache->tdesc, "fcsr"), 903 regset[32].buf); 904 mips_supply_register_32bit (regcache, use_64bit, 905 find_regno (regcache->tdesc, "fir"), 906 regset[32].buf + 4); 907 } 908 #endif /* HAVE_PTRACE_GETREGS */ 909 910 /* Take care of 32-bit registers with 64-bit ptrace, POKEUSER side. */ 911 912 void 913 mips_target::low_collect_ptrace_register (regcache *regcache, int regno, 914 char *buf) 915 { 916 int use_64bit = sizeof (PTRACE_XFER_TYPE) == 8; 917 918 if (use_64bit && register_size (regcache->tdesc, regno) == 4) 919 { 920 union mips_register reg; 921 922 mips_collect_register (regcache, 0, regno, ®); 923 memcpy (buf, ®, sizeof (reg)); 924 } 925 else 926 collect_register (regcache, regno, buf); 927 } 928 929 /* Take care of 32-bit registers with 64-bit ptrace, PEEKUSER side. */ 930 931 void 932 mips_target::low_supply_ptrace_register (regcache *regcache, int regno, 933 const char *buf) 934 { 935 int use_64bit = sizeof (PTRACE_XFER_TYPE) == 8; 936 937 if (use_64bit && register_size (regcache->tdesc, regno) == 4) 938 { 939 union mips_register reg; 940 941 memcpy (®, buf, sizeof (reg)); 942 mips_supply_register (regcache, 0, regno, ®); 943 } 944 else 945 supply_register (regcache, regno, buf); 946 } 947 948 static struct regset_info mips_regsets[] = { 949 #ifdef HAVE_PTRACE_GETREGS 950 { PTRACE_GETREGS, PTRACE_SETREGS, 0, 38 * 8, GENERAL_REGS, 951 mips_fill_gregset, mips_store_gregset }, 952 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, 33 * 8, FP_REGS, 953 mips_fill_fpregset, mips_store_fpregset }, 954 #endif /* HAVE_PTRACE_GETREGS */ 955 NULL_REGSET 956 }; 957 958 static struct regsets_info mips_regsets_info = 959 { 960 mips_regsets, /* regsets */ 961 0, /* num_regsets */ 962 NULL, /* disabled_regsets */ 963 }; 964 965 static struct usrregs_info mips_dsp_usrregs_info = 966 { 967 mips_dsp_num_regs, 968 mips_dsp_regmap, 969 }; 970 971 static struct usrregs_info mips_usrregs_info = 972 { 973 mips_num_regs, 974 mips_regmap, 975 }; 976 977 static struct regs_info dsp_regs_info = 978 { 979 mips_dsp_regset_bitmap, 980 &mips_dsp_usrregs_info, 981 &mips_regsets_info 982 }; 983 984 static struct regs_info myregs_info = 985 { 986 NULL, /* regset_bitmap */ 987 &mips_usrregs_info, 988 &mips_regsets_info 989 }; 990 991 const regs_info * 992 mips_target::get_regs_info () 993 { 994 if (have_dsp) 995 return &dsp_regs_info; 996 else 997 return &myregs_info; 998 } 999 1000 /* The linux target ops object. */ 1001 1002 linux_process_target *the_linux_target = &the_mips_target; 1003 1004 void 1005 initialize_low_arch (void) 1006 { 1007 /* Initialize the Linux target descriptions. */ 1008 init_registers_mips_linux (); 1009 init_registers_mips_dsp_linux (); 1010 init_registers_mips64_linux (); 1011 init_registers_mips64_dsp_linux (); 1012 1013 initialize_regsets_info (&mips_regsets_info); 1014 } 1015