1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
|
// OBSOLETE /* ARC target-dependent stuff.
// OBSOLETE Copyright 1995, 1996, 1999, 2000, 2001 Free Software Foundation, Inc.
// OBSOLETE
// OBSOLETE This file is part of GDB.
// OBSOLETE
// OBSOLETE This program is free software; you can redistribute it and/or modify
// OBSOLETE it under the terms of the GNU General Public License as published by
// OBSOLETE the Free Software Foundation; either version 2 of the License, or
// OBSOLETE (at your option) any later version.
// OBSOLETE
// OBSOLETE This program is distributed in the hope that it will be useful,
// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of
// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// OBSOLETE GNU General Public License for more details.
// OBSOLETE
// OBSOLETE You should have received a copy of the GNU General Public License
// OBSOLETE along with this program; if not, write to the Free Software
// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330,
// OBSOLETE Boston, MA 02111-1307, USA. */
// OBSOLETE
// OBSOLETE #include "defs.h"
// OBSOLETE #include "frame.h"
// OBSOLETE #include "inferior.h"
// OBSOLETE #include "gdbcore.h"
// OBSOLETE #include "target.h"
// OBSOLETE #include "floatformat.h"
// OBSOLETE #include "symtab.h"
// OBSOLETE #include "gdbcmd.h"
// OBSOLETE #include "regcache.h"
// OBSOLETE #include "gdb_string.h"
// OBSOLETE
// OBSOLETE /* Local functions */
// OBSOLETE
// OBSOLETE static int arc_set_cpu_type (char *str);
// OBSOLETE
// OBSOLETE /* Current CPU, set with the "set cpu" command. */
// OBSOLETE static int arc_bfd_mach_type;
// OBSOLETE char *arc_cpu_type;
// OBSOLETE char *tmp_arc_cpu_type;
// OBSOLETE
// OBSOLETE /* Table of cpu names. */
// OBSOLETE struct
// OBSOLETE {
// OBSOLETE char *name;
// OBSOLETE int value;
// OBSOLETE }
// OBSOLETE arc_cpu_type_table[] =
// OBSOLETE {
// OBSOLETE { "arc5", bfd_mach_arc_5 },
// OBSOLETE { "arc6", bfd_mach_arc_6 },
// OBSOLETE { "arc7", bfd_mach_arc_7 },
// OBSOLETE { "arc8", bfd_mach_arc_8 },
// OBSOLETE { NULL, 0 }
// OBSOLETE };
// OBSOLETE
// OBSOLETE /* Used by simulator. */
// OBSOLETE int display_pipeline_p;
// OBSOLETE int cpu_timer;
// OBSOLETE /* This one must have the same type as used in the emulator.
// OBSOLETE It's currently an enum so this should be ok for now. */
// OBSOLETE int debug_pipeline_p;
// OBSOLETE
// OBSOLETE #define ARC_CALL_SAVED_REG(r) ((r) >= 16 && (r) < 24)
// OBSOLETE
// OBSOLETE #define OPMASK 0xf8000000
// OBSOLETE
// OBSOLETE /* Instruction field accessor macros.
// OBSOLETE See the Programmer's Reference Manual. */
// OBSOLETE #define X_OP(i) (((i) >> 27) & 0x1f)
// OBSOLETE #define X_A(i) (((i) >> 21) & 0x3f)
// OBSOLETE #define X_B(i) (((i) >> 15) & 0x3f)
// OBSOLETE #define X_C(i) (((i) >> 9) & 0x3f)
// OBSOLETE #define X_D(i) ((((i) & 0x1ff) ^ 0x100) - 0x100)
// OBSOLETE #define X_L(i) (((((i) >> 5) & 0x3ffffc) ^ 0x200000) - 0x200000)
// OBSOLETE #define X_N(i) (((i) >> 5) & 3)
// OBSOLETE #define X_Q(i) ((i) & 0x1f)
// OBSOLETE
// OBSOLETE /* Return non-zero if X is a short immediate data indicator. */
// OBSOLETE #define SHIMM_P(x) ((x) == 61 || (x) == 63)
// OBSOLETE
// OBSOLETE /* Return non-zero if X is a "long" (32 bit) immediate data indicator. */
// OBSOLETE #define LIMM_P(x) ((x) == 62)
// OBSOLETE
// OBSOLETE /* Build a simple instruction. */
// OBSOLETE #define BUILD_INSN(op, a, b, c, d) \
// OBSOLETE ((((op) & 31) << 27) \
// OBSOLETE | (((a) & 63) << 21) \
// OBSOLETE | (((b) & 63) << 15) \
// OBSOLETE | (((c) & 63) << 9) \
// OBSOLETE | ((d) & 511))
// OBSOLETE
// OBSOLETE /* Codestream stuff. */
// OBSOLETE static void codestream_read (unsigned int *, int);
// OBSOLETE static void codestream_seek (CORE_ADDR);
// OBSOLETE static unsigned int codestream_fill (int);
// OBSOLETE
// OBSOLETE #define CODESTREAM_BUFSIZ 16
// OBSOLETE static CORE_ADDR codestream_next_addr;
// OBSOLETE static CORE_ADDR codestream_addr;
// OBSOLETE /* FIXME assumes sizeof (int) == 32? */
// OBSOLETE static unsigned int codestream_buf[CODESTREAM_BUFSIZ];
// OBSOLETE static int codestream_off;
// OBSOLETE static int codestream_cnt;
// OBSOLETE
// OBSOLETE #define codestream_tell() \
// OBSOLETE (codestream_addr + codestream_off * sizeof (codestream_buf[0]))
// OBSOLETE #define codestream_peek() \
// OBSOLETE (codestream_cnt == 0 \
// OBSOLETE ? codestream_fill (1) \
// OBSOLETE : codestream_buf[codestream_off])
// OBSOLETE #define codestream_get() \
// OBSOLETE (codestream_cnt-- == 0 \
// OBSOLETE ? codestream_fill (0) \
// OBSOLETE : codestream_buf[codestream_off++])
// OBSOLETE
// OBSOLETE static unsigned int
// OBSOLETE codestream_fill (int peek_flag)
// OBSOLETE {
// OBSOLETE codestream_addr = codestream_next_addr;
// OBSOLETE codestream_next_addr += CODESTREAM_BUFSIZ * sizeof (codestream_buf[0]);
// OBSOLETE codestream_off = 0;
// OBSOLETE codestream_cnt = CODESTREAM_BUFSIZ;
// OBSOLETE read_memory (codestream_addr, (char *) codestream_buf,
// OBSOLETE CODESTREAM_BUFSIZ * sizeof (codestream_buf[0]));
// OBSOLETE /* FIXME: check return code? */
// OBSOLETE
// OBSOLETE
// OBSOLETE /* Handle byte order differences -> convert to host byte ordering. */
// OBSOLETE {
// OBSOLETE int i;
// OBSOLETE for (i = 0; i < CODESTREAM_BUFSIZ; i++)
// OBSOLETE codestream_buf[i] =
// OBSOLETE extract_unsigned_integer (&codestream_buf[i],
// OBSOLETE sizeof (codestream_buf[i]));
// OBSOLETE }
// OBSOLETE
// OBSOLETE if (peek_flag)
// OBSOLETE return codestream_peek ();
// OBSOLETE else
// OBSOLETE return codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE static void
// OBSOLETE codestream_seek (CORE_ADDR place)
// OBSOLETE {
// OBSOLETE codestream_next_addr = place / CODESTREAM_BUFSIZ;
// OBSOLETE codestream_next_addr *= CODESTREAM_BUFSIZ;
// OBSOLETE codestream_cnt = 0;
// OBSOLETE codestream_fill (1);
// OBSOLETE while (codestream_tell () != place)
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* This function is currently unused but leave in for now. */
// OBSOLETE
// OBSOLETE static void
// OBSOLETE codestream_read (unsigned int *buf, int count)
// OBSOLETE {
// OBSOLETE unsigned int *p;
// OBSOLETE int i;
// OBSOLETE p = buf;
// OBSOLETE for (i = 0; i < count; i++)
// OBSOLETE *p++ = codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Set up prologue scanning and return the first insn. */
// OBSOLETE
// OBSOLETE static unsigned int
// OBSOLETE setup_prologue_scan (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE
// OBSOLETE codestream_seek (pc);
// OBSOLETE insn = codestream_get ();
// OBSOLETE
// OBSOLETE return insn;
// OBSOLETE }
// OBSOLETE
// OBSOLETE /*
// OBSOLETE * Find & return amount a local space allocated, and advance codestream to
// OBSOLETE * first register push (if any).
// OBSOLETE * If entry sequence doesn't make sense, return -1, and leave
// OBSOLETE * codestream pointer random.
// OBSOLETE */
// OBSOLETE
// OBSOLETE static long
// OBSOLETE arc_get_frame_setup (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE /* Size of frame or -1 if unrecognizable prologue. */
// OBSOLETE int frame_size = -1;
// OBSOLETE /* An initial "sub sp,sp,N" may or may not be for a stdarg fn. */
// OBSOLETE int maybe_stdarg_decr = -1;
// OBSOLETE
// OBSOLETE insn = setup_prologue_scan (pc);
// OBSOLETE
// OBSOLETE /* The authority for what appears here is the home-grown ABI.
// OBSOLETE The most recent version is 1.2. */
// OBSOLETE
// OBSOLETE /* First insn may be "sub sp,sp,N" if stdarg fn. */
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, SHIMM_REGNUM, 0))
// OBSOLETE {
// OBSOLETE maybe_stdarg_decr = X_D (insn);
// OBSOLETE insn = codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st blink,[sp,4] */
// OBSOLETE == BUILD_INSN (2, 0, SP_REGNUM, BLINK_REGNUM, 4))
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE /* Frame may not be necessary, even though blink is saved.
// OBSOLETE At least this is something we recognize. */
// OBSOLETE frame_size = 0;
// OBSOLETE }
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st fp,[sp] */
// OBSOLETE == BUILD_INSN (2, 0, SP_REGNUM, FP_REGNUM, 0))
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE != BUILD_INSN (12, FP_REGNUM, SP_REGNUM, SP_REGNUM, 0))
// OBSOLETE return -1;
// OBSOLETE
// OBSOLETE /* Check for stack adjustment sub sp,sp,N. */
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, 0, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, 0, 0))
// OBSOLETE {
// OBSOLETE if (LIMM_P (X_C (insn)))
// OBSOLETE frame_size = codestream_get ();
// OBSOLETE else if (SHIMM_P (X_C (insn)))
// OBSOLETE frame_size = X_D (insn);
// OBSOLETE else
// OBSOLETE return -1;
// OBSOLETE if (frame_size < 0)
// OBSOLETE return -1;
// OBSOLETE
// OBSOLETE codestream_get ();
// OBSOLETE
// OBSOLETE /* This sequence is used to get the address of the return
// OBSOLETE buffer for a function that returns a structure. */
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & OPMASK) == 0x60000000)
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE /* Frameless fn. */
// OBSOLETE else
// OBSOLETE {
// OBSOLETE frame_size = 0;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* If we found a "sub sp,sp,N" and nothing else, it may or may not be a
// OBSOLETE stdarg fn. The stdarg decrement is not treated as part of the frame size,
// OBSOLETE so we have a dilemma: what do we return? For now, if we get a
// OBSOLETE "sub sp,sp,N" and nothing else assume this isn't a stdarg fn. One way
// OBSOLETE to fix this completely would be to add a bit to the function descriptor
// OBSOLETE that says the function is a stdarg function. */
// OBSOLETE
// OBSOLETE if (frame_size < 0 && maybe_stdarg_decr > 0)
// OBSOLETE return maybe_stdarg_decr;
// OBSOLETE return frame_size;
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Given a pc value, skip it forward past the function prologue by
// OBSOLETE disassembling instructions that appear to be a prologue.
// OBSOLETE
// OBSOLETE If FRAMELESS_P is set, we are only testing to see if the function
// OBSOLETE is frameless. If it is a frameless function, return PC unchanged.
// OBSOLETE This allows a quicker answer. */
// OBSOLETE
// OBSOLETE CORE_ADDR
// OBSOLETE arc_skip_prologue (CORE_ADDR pc, int frameless_p)
// OBSOLETE {
// OBSOLETE unsigned int insn;
// OBSOLETE int i, frame_size;
// OBSOLETE
// OBSOLETE if ((frame_size = arc_get_frame_setup (pc)) < 0)
// OBSOLETE return (pc);
// OBSOLETE
// OBSOLETE if (frameless_p)
// OBSOLETE return frame_size == 0 ? pc : codestream_tell ();
// OBSOLETE
// OBSOLETE /* Skip over register saves. */
// OBSOLETE for (i = 0; i < 8; i++)
// OBSOLETE {
// OBSOLETE insn = codestream_peek ();
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, 0, 0))
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, 0, 0))
// OBSOLETE break; /* not st insn */
// OBSOLETE if (!ARC_CALL_SAVED_REG (X_C (insn)))
// OBSOLETE break;
// OBSOLETE codestream_get ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE return codestream_tell ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Is the prologue at PC frameless? */
// OBSOLETE
// OBSOLETE int
// OBSOLETE arc_prologue_frameless_p (CORE_ADDR pc)
// OBSOLETE {
// OBSOLETE return (pc == arc_skip_prologue (pc, 1));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Return the return address for a frame.
// OBSOLETE This is used to implement FRAME_SAVED_PC.
// OBSOLETE This is taken from frameless_look_for_prologue. */
// OBSOLETE
// OBSOLETE CORE_ADDR
// OBSOLETE arc_frame_saved_pc (struct frame_info *frame)
// OBSOLETE {
// OBSOLETE CORE_ADDR func_start;
// OBSOLETE unsigned int insn;
// OBSOLETE
// OBSOLETE func_start = get_pc_function_start (frame->pc) + FUNCTION_START_OFFSET;
// OBSOLETE if (func_start == 0)
// OBSOLETE {
// OBSOLETE /* Best guess. */
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_memory_integer (FRAME_FP (frame) + 4, 4));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* The authority for what appears here is the home-grown ABI.
// OBSOLETE The most recent version is 1.2. */
// OBSOLETE
// OBSOLETE insn = setup_prologue_scan (func_start);
// OBSOLETE
// OBSOLETE /* First insn may be "sub sp,sp,N" if stdarg fn. */
// OBSOLETE if ((insn & BUILD_INSN (-1, -1, -1, -1, 0))
// OBSOLETE == BUILD_INSN (10, SP_REGNUM, SP_REGNUM, SHIMM_REGNUM, 0))
// OBSOLETE insn = codestream_get ();
// OBSOLETE
// OBSOLETE /* If the next insn is "st blink,[sp,4]" we can get blink from there.
// OBSOLETE Otherwise this is a leaf function and we can use blink. Note that
// OBSOLETE this still allows for the case where a leaf function saves/clobbers/
// OBSOLETE restores blink. */
// OBSOLETE
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, -1, -1)) /* st blink,[sp,4] */
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, BLINK_REGNUM, 4))
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_register (BLINK_REGNUM));
// OBSOLETE else
// OBSOLETE return ARC_PC_TO_REAL_ADDRESS (read_memory_integer (FRAME_FP (frame) + 4, 4));
// OBSOLETE }
// OBSOLETE
// OBSOLETE /*
// OBSOLETE * Parse the first few instructions of the function to see
// OBSOLETE * what registers were stored.
// OBSOLETE *
// OBSOLETE * The startup sequence can be at the start of the function.
// OBSOLETE * 'st blink,[sp+4], st fp,[sp], mov fp,sp'
// OBSOLETE *
// OBSOLETE * Local space is allocated just below by sub sp,sp,nnn.
// OBSOLETE * Next, the registers used by this function are stored (as offsets from sp).
// OBSOLETE */
// OBSOLETE
// OBSOLETE void
// OBSOLETE frame_find_saved_regs (struct frame_info *fip, struct frame_saved_regs *fsrp)
// OBSOLETE {
// OBSOLETE long locals;
// OBSOLETE unsigned int insn;
// OBSOLETE CORE_ADDR dummy_bottom;
// OBSOLETE CORE_ADDR adr;
// OBSOLETE int i, regnum, offset;
// OBSOLETE
// OBSOLETE memset (fsrp, 0, sizeof *fsrp);
// OBSOLETE
// OBSOLETE /* If frame is the end of a dummy, compute where the beginning would be. */
// OBSOLETE dummy_bottom = fip->frame - 4 - REGISTER_BYTES - CALL_DUMMY_LENGTH;
// OBSOLETE
// OBSOLETE /* Check if the PC is in the stack, in a dummy frame. */
// OBSOLETE if (dummy_bottom <= fip->pc && fip->pc <= fip->frame)
// OBSOLETE {
// OBSOLETE /* all regs were saved by push_call_dummy () */
// OBSOLETE adr = fip->frame;
// OBSOLETE for (i = 0; i < NUM_REGS; i++)
// OBSOLETE {
// OBSOLETE adr -= REGISTER_RAW_SIZE (i);
// OBSOLETE fsrp->regs[i] = adr;
// OBSOLETE }
// OBSOLETE return;
// OBSOLETE }
// OBSOLETE
// OBSOLETE locals = arc_get_frame_setup (get_pc_function_start (fip->pc));
// OBSOLETE
// OBSOLETE if (locals >= 0)
// OBSOLETE {
// OBSOLETE /* Set `adr' to the value of `sp'. */
// OBSOLETE adr = fip->frame - locals;
// OBSOLETE for (i = 0; i < 8; i++)
// OBSOLETE {
// OBSOLETE insn = codestream_get ();
// OBSOLETE if ((insn & BUILD_INSN (-1, 0, -1, 0, 0))
// OBSOLETE != BUILD_INSN (2, 0, SP_REGNUM, 0, 0))
// OBSOLETE break;
// OBSOLETE regnum = X_C (insn);
// OBSOLETE offset = X_D (insn);
// OBSOLETE fsrp->regs[regnum] = adr + offset;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE fsrp->regs[PC_REGNUM] = fip->frame + 4;
// OBSOLETE fsrp->regs[FP_REGNUM] = fip->frame;
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_push_dummy_frame (void)
// OBSOLETE {
// OBSOLETE CORE_ADDR sp = read_register (SP_REGNUM);
// OBSOLETE int regnum;
// OBSOLETE char regbuf[MAX_REGISTER_RAW_SIZE];
// OBSOLETE
// OBSOLETE read_register_gen (PC_REGNUM, regbuf);
// OBSOLETE write_memory (sp + 4, regbuf, REGISTER_SIZE);
// OBSOLETE read_register_gen (FP_REGNUM, regbuf);
// OBSOLETE write_memory (sp, regbuf, REGISTER_SIZE);
// OBSOLETE write_register (FP_REGNUM, sp);
// OBSOLETE for (regnum = 0; regnum < NUM_REGS; regnum++)
// OBSOLETE {
// OBSOLETE read_register_gen (regnum, regbuf);
// OBSOLETE sp = push_bytes (sp, regbuf, REGISTER_RAW_SIZE (regnum));
// OBSOLETE }
// OBSOLETE sp += (2 * REGISTER_SIZE);
// OBSOLETE write_register (SP_REGNUM, sp);
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_pop_frame (void)
// OBSOLETE {
// OBSOLETE struct frame_info *frame = get_current_frame ();
// OBSOLETE CORE_ADDR fp;
// OBSOLETE int regnum;
// OBSOLETE struct frame_saved_regs fsr;
// OBSOLETE char regbuf[MAX_REGISTER_RAW_SIZE];
// OBSOLETE
// OBSOLETE fp = FRAME_FP (frame);
// OBSOLETE get_frame_saved_regs (frame, &fsr);
// OBSOLETE for (regnum = 0; regnum < NUM_REGS; regnum++)
// OBSOLETE {
// OBSOLETE CORE_ADDR adr;
// OBSOLETE adr = fsr.regs[regnum];
// OBSOLETE if (adr)
// OBSOLETE {
// OBSOLETE read_memory (adr, regbuf, REGISTER_RAW_SIZE (regnum));
// OBSOLETE write_register_bytes (REGISTER_BYTE (regnum), regbuf,
// OBSOLETE REGISTER_RAW_SIZE (regnum));
// OBSOLETE }
// OBSOLETE }
// OBSOLETE write_register (FP_REGNUM, read_memory_integer (fp, 4));
// OBSOLETE write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
// OBSOLETE write_register (SP_REGNUM, fp + 8);
// OBSOLETE flush_cached_frames ();
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Simulate single-step. */
// OBSOLETE
// OBSOLETE typedef enum
// OBSOLETE {
// OBSOLETE NORMAL4, /* a normal 4 byte insn */
// OBSOLETE NORMAL8, /* a normal 8 byte insn */
// OBSOLETE BRANCH4, /* a 4 byte branch insn, including ones without delay slots */
// OBSOLETE BRANCH8, /* an 8 byte branch insn, including ones with delay slots */
// OBSOLETE }
// OBSOLETE insn_type;
// OBSOLETE
// OBSOLETE /* Return the type of INSN and store in TARGET the destination address of a
// OBSOLETE branch if this is one. */
// OBSOLETE /* ??? Need to verify all cases are properly handled. */
// OBSOLETE
// OBSOLETE static insn_type
// OBSOLETE get_insn_type (unsigned long insn, CORE_ADDR pc, CORE_ADDR *target)
// OBSOLETE {
// OBSOLETE unsigned long limm;
// OBSOLETE
// OBSOLETE switch (insn >> 27)
// OBSOLETE {
// OBSOLETE case 0:
// OBSOLETE case 1:
// OBSOLETE case 2: /* load/store insns */
// OBSOLETE if (LIMM_P (X_A (insn))
// OBSOLETE || LIMM_P (X_B (insn))
// OBSOLETE || LIMM_P (X_C (insn)))
// OBSOLETE return NORMAL8;
// OBSOLETE return NORMAL4;
// OBSOLETE case 4:
// OBSOLETE case 5:
// OBSOLETE case 6: /* branch insns */
// OBSOLETE *target = pc + 4 + X_L (insn);
// OBSOLETE /* ??? It isn't clear that this is always the right answer.
// OBSOLETE The problem occurs when the next insn is an 8 byte insn. If the
// OBSOLETE branch is conditional there's no worry as there shouldn't be an 8
// OBSOLETE byte insn following. The programmer may be cheating if s/he knows
// OBSOLETE the branch will never be taken, but we don't deal with that.
// OBSOLETE Note that the programmer is also allowed to play games by putting
// OBSOLETE an insn with long immediate data in the delay slot and then duplicate
// OBSOLETE the long immediate data at the branch target. Ugh! */
// OBSOLETE if (X_N (insn) == 0)
// OBSOLETE return BRANCH4;
// OBSOLETE return BRANCH8;
// OBSOLETE case 7: /* jump insns */
// OBSOLETE if (LIMM_P (X_B (insn)))
// OBSOLETE {
// OBSOLETE limm = read_memory_integer (pc + 4, 4);
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (limm);
// OBSOLETE return BRANCH8;
// OBSOLETE }
// OBSOLETE if (SHIMM_P (X_B (insn)))
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (X_D (insn));
// OBSOLETE else
// OBSOLETE *target = ARC_PC_TO_REAL_ADDRESS (read_register (X_B (insn)));
// OBSOLETE if (X_Q (insn) == 0 && X_N (insn) == 0)
// OBSOLETE return BRANCH4;
// OBSOLETE return BRANCH8;
// OBSOLETE default: /* arithmetic insns, etc. */
// OBSOLETE if (LIMM_P (X_A (insn))
// OBSOLETE || LIMM_P (X_B (insn))
// OBSOLETE || LIMM_P (X_C (insn)))
// OBSOLETE return NORMAL8;
// OBSOLETE return NORMAL4;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* single_step() is called just before we want to resume the inferior, if we
// OBSOLETE want to single-step it but there is no hardware or kernel single-step
// OBSOLETE support. We find all the possible targets of the coming instruction and
// OBSOLETE breakpoint them.
// OBSOLETE
// OBSOLETE single_step is also called just after the inferior stops. If we had
// OBSOLETE set up a simulated single-step, we undo our damage. */
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_software_single_step (enum target_signal ignore, /* sig but we don't need it */
// OBSOLETE int insert_breakpoints_p)
// OBSOLETE {
// OBSOLETE static CORE_ADDR next_pc, target;
// OBSOLETE static int brktrg_p;
// OBSOLETE typedef char binsn_quantum[BREAKPOINT_MAX];
// OBSOLETE static binsn_quantum break_mem[2];
// OBSOLETE
// OBSOLETE if (insert_breakpoints_p)
// OBSOLETE {
// OBSOLETE insn_type type;
// OBSOLETE CORE_ADDR pc;
// OBSOLETE unsigned long insn;
// OBSOLETE
// OBSOLETE pc = read_register (PC_REGNUM);
// OBSOLETE insn = read_memory_integer (pc, 4);
// OBSOLETE type = get_insn_type (insn, pc, &target);
// OBSOLETE
// OBSOLETE /* Always set a breakpoint for the insn after the branch. */
// OBSOLETE next_pc = pc + ((type == NORMAL8 || type == BRANCH8) ? 8 : 4);
// OBSOLETE target_insert_breakpoint (next_pc, break_mem[0]);
// OBSOLETE
// OBSOLETE brktrg_p = 0;
// OBSOLETE
// OBSOLETE if ((type == BRANCH4 || type == BRANCH8)
// OBSOLETE /* Watch out for branches to the following location.
// OBSOLETE We just stored a breakpoint there and another call to
// OBSOLETE target_insert_breakpoint will think the real insn is the
// OBSOLETE breakpoint we just stored there. */
// OBSOLETE && target != next_pc)
// OBSOLETE {
// OBSOLETE brktrg_p = 1;
// OBSOLETE target_insert_breakpoint (target, break_mem[1]);
// OBSOLETE }
// OBSOLETE
// OBSOLETE }
// OBSOLETE else
// OBSOLETE {
// OBSOLETE /* Remove breakpoints. */
// OBSOLETE target_remove_breakpoint (next_pc, break_mem[0]);
// OBSOLETE
// OBSOLETE if (brktrg_p)
// OBSOLETE target_remove_breakpoint (target, break_mem[1]);
// OBSOLETE
// OBSOLETE /* Fix the pc. */
// OBSOLETE stop_pc -= DECR_PC_AFTER_BREAK;
// OBSOLETE write_pc (stop_pc);
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Because of Multi-arch, GET_LONGJMP_TARGET is always defined. So test
// OBSOLETE for a definition of JB_PC. */
// OBSOLETE #ifdef JB_PC
// OBSOLETE /* Figure out where the longjmp will land. Slurp the args out of the stack.
// OBSOLETE We expect the first arg to be a pointer to the jmp_buf structure from which
// OBSOLETE we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
// OBSOLETE This routine returns true on success. */
// OBSOLETE
// OBSOLETE int
// OBSOLETE get_longjmp_target (CORE_ADDR *pc)
// OBSOLETE {
// OBSOLETE char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
// OBSOLETE CORE_ADDR sp, jb_addr;
// OBSOLETE
// OBSOLETE sp = read_register (SP_REGNUM);
// OBSOLETE
// OBSOLETE if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
// OBSOLETE buf,
// OBSOLETE TARGET_PTR_BIT / TARGET_CHAR_BIT))
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
// OBSOLETE
// OBSOLETE if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
// OBSOLETE TARGET_PTR_BIT / TARGET_CHAR_BIT))
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE *pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
// OBSOLETE
// OBSOLETE return 1;
// OBSOLETE }
// OBSOLETE #endif /* GET_LONGJMP_TARGET */
// OBSOLETE
// OBSOLETE /* Disassemble one instruction. */
// OBSOLETE
// OBSOLETE static int
// OBSOLETE arc_print_insn (bfd_vma vma, disassemble_info *info)
// OBSOLETE {
// OBSOLETE static int current_mach;
// OBSOLETE static int current_endian;
// OBSOLETE static disassembler_ftype current_disasm;
// OBSOLETE
// OBSOLETE if (current_disasm == NULL
// OBSOLETE || arc_bfd_mach_type != current_mach
// OBSOLETE || TARGET_BYTE_ORDER != current_endian)
// OBSOLETE {
// OBSOLETE current_mach = arc_bfd_mach_type;
// OBSOLETE current_endian = TARGET_BYTE_ORDER;
// OBSOLETE current_disasm = arc_get_disassembler (NULL);
// OBSOLETE }
// OBSOLETE
// OBSOLETE return (*current_disasm) (vma, info);
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Command to set cpu type. */
// OBSOLETE
// OBSOLETE void
// OBSOLETE arc_set_cpu_type_command (char *args, int from_tty)
// OBSOLETE {
// OBSOLETE int i;
// OBSOLETE
// OBSOLETE if (tmp_arc_cpu_type == NULL || *tmp_arc_cpu_type == '\0')
// OBSOLETE {
// OBSOLETE printf_unfiltered ("The known ARC cpu types are as follows:\n");
// OBSOLETE for (i = 0; arc_cpu_type_table[i].name != NULL; ++i)
// OBSOLETE printf_unfiltered ("%s\n", arc_cpu_type_table[i].name);
// OBSOLETE
// OBSOLETE /* Restore the value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (arc_cpu_type);
// OBSOLETE
// OBSOLETE return;
// OBSOLETE }
// OBSOLETE
// OBSOLETE if (!arc_set_cpu_type (tmp_arc_cpu_type))
// OBSOLETE {
// OBSOLETE error ("Unknown cpu type `%s'.", tmp_arc_cpu_type);
// OBSOLETE /* Restore its value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (arc_cpu_type);
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE static void
// OBSOLETE arc_show_cpu_type_command (char *args, int from_tty)
// OBSOLETE {
// OBSOLETE }
// OBSOLETE
// OBSOLETE /* Modify the actual cpu type.
// OBSOLETE Result is a boolean indicating success. */
// OBSOLETE
// OBSOLETE static int
// OBSOLETE arc_set_cpu_type (char *str)
// OBSOLETE {
// OBSOLETE int i, j;
// OBSOLETE
// OBSOLETE if (str == NULL)
// OBSOLETE return 0;
// OBSOLETE
// OBSOLETE for (i = 0; arc_cpu_type_table[i].name != NULL; ++i)
// OBSOLETE {
// OBSOLETE if (strcasecmp (str, arc_cpu_type_table[i].name) == 0)
// OBSOLETE {
// OBSOLETE arc_cpu_type = str;
// OBSOLETE arc_bfd_mach_type = arc_cpu_type_table[i].value;
// OBSOLETE return 1;
// OBSOLETE }
// OBSOLETE }
// OBSOLETE
// OBSOLETE return 0;
// OBSOLETE }
// OBSOLETE
// OBSOLETE void
// OBSOLETE _initialize_arc_tdep (void)
// OBSOLETE {
// OBSOLETE struct cmd_list_element *c;
// OBSOLETE
// OBSOLETE c = add_set_cmd ("cpu", class_support, var_string_noescape,
// OBSOLETE (char *) &tmp_arc_cpu_type,
// OBSOLETE "Set the type of ARC cpu in use.\n\
// OBSOLETE This command has two purposes. In a multi-cpu system it lets one\n\
// OBSOLETE change the cpu being debugged. It also gives one access to\n\
// OBSOLETE cpu-type-specific registers and recognize cpu-type-specific instructions.\
// OBSOLETE ",
// OBSOLETE &setlist);
// OBSOLETE set_cmd_cfunc (c, arc_set_cpu_type_command);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE set_cmd_cfunc (c, arc_show_cpu_type_command);
// OBSOLETE
// OBSOLETE /* We have to use xstrdup() here because the `set' command frees it
// OBSOLETE before setting a new value. */
// OBSOLETE tmp_arc_cpu_type = xstrdup (DEFAULT_ARC_CPU_TYPE);
// OBSOLETE arc_set_cpu_type (tmp_arc_cpu_type);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("displaypipeline", class_support, var_zinteger,
// OBSOLETE (char *) &display_pipeline_p,
// OBSOLETE "Set pipeline display (simulator only).\n\
// OBSOLETE When enabled, the state of the pipeline after each cycle is displayed.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("debugpipeline", class_support, var_zinteger,
// OBSOLETE (char *) &debug_pipeline_p,
// OBSOLETE "Set pipeline debug display (simulator only).\n\
// OBSOLETE When enabled, debugging information about the pipeline is displayed.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE c = add_set_cmd ("cputimer", class_support, var_zinteger,
// OBSOLETE (char *) &cpu_timer,
// OBSOLETE "Set maximum cycle count (simulator only).\n\
// OBSOLETE Control will return to gdb if the timer expires.\n\
// OBSOLETE A negative value disables the timer.",
// OBSOLETE &setlist);
// OBSOLETE c = add_show_from_set (c, &showlist);
// OBSOLETE
// OBSOLETE tm_print_insn = arc_print_insn;
// OBSOLETE }
|