1 /* 2 * Routines providing a simple monitor for use on the PowerMac. 3 * 4 * Copyright (C) 1996-2005 Paul Mackerras. 5 * Copyright (C) 2001 PPC64 Team, IBM Corp 6 * Copyrignt (C) 2006 Michael Ellerman, IBM Corp 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 11 * 2 of the License, or (at your option) any later version. 12 */ 13 #include <linux/errno.h> 14 #include <linux/sched.h> 15 #include <linux/smp.h> 16 #include <linux/mm.h> 17 #include <linux/reboot.h> 18 #include <linux/delay.h> 19 #include <linux/kallsyms.h> 20 #include <linux/kmsg_dump.h> 21 #include <linux/cpumask.h> 22 #include <linux/export.h> 23 #include <linux/sysrq.h> 24 #include <linux/interrupt.h> 25 #include <linux/irq.h> 26 #include <linux/bug.h> 27 #include <linux/nmi.h> 28 #include <linux/ctype.h> 29 30 #include <asm/ptrace.h> 31 #include <asm/string.h> 32 #include <asm/prom.h> 33 #include <asm/machdep.h> 34 #include <asm/xmon.h> 35 #include <asm/processor.h> 36 #include <asm/pgtable.h> 37 #include <asm/mmu.h> 38 #include <asm/mmu_context.h> 39 #include <asm/cputable.h> 40 #include <asm/rtas.h> 41 #include <asm/sstep.h> 42 #include <asm/irq_regs.h> 43 #include <asm/spu.h> 44 #include <asm/spu_priv1.h> 45 #include <asm/setjmp.h> 46 #include <asm/reg.h> 47 #include <asm/debug.h> 48 #include <asm/hw_breakpoint.h> 49 50 #ifdef CONFIG_PPC64 51 #include <asm/hvcall.h> 52 #include <asm/paca.h> 53 #endif 54 55 #if defined(CONFIG_PPC_SPLPAR) 56 #include <asm/plpar_wrappers.h> 57 #else 58 static inline long plapr_set_ciabr(unsigned long ciabr) {return 0; }; 59 #endif 60 61 #include "nonstdio.h" 62 #include "dis-asm.h" 63 64 #ifdef CONFIG_SMP 65 static cpumask_t cpus_in_xmon = CPU_MASK_NONE; 66 static unsigned long xmon_taken = 1; 67 static int xmon_owner; 68 static int xmon_gate; 69 #else 70 #define xmon_owner 0 71 #endif /* CONFIG_SMP */ 72 73 static unsigned long in_xmon __read_mostly = 0; 74 75 static unsigned long adrs; 76 static int size = 1; 77 #define MAX_DUMP (128 * 1024) 78 static unsigned long ndump = 64; 79 static unsigned long nidump = 16; 80 static unsigned long ncsum = 4096; 81 static int termch; 82 static char tmpstr[128]; 83 84 static long bus_error_jmp[JMP_BUF_LEN]; 85 static int catch_memory_errors; 86 static long *xmon_fault_jmp[NR_CPUS]; 87 88 /* Breakpoint stuff */ 89 struct bpt { 90 unsigned long address; 91 unsigned int instr[2]; 92 atomic_t ref_count; 93 int enabled; 94 unsigned long pad; 95 }; 96 97 /* Bits in bpt.enabled */ 98 #define BP_CIABR 1 99 #define BP_TRAP 2 100 #define BP_DABR 4 101 102 #define NBPTS 256 103 static struct bpt bpts[NBPTS]; 104 static struct bpt dabr; 105 static struct bpt *iabr; 106 static unsigned bpinstr = 0x7fe00008; /* trap */ 107 108 #define BP_NUM(bp) ((bp) - bpts + 1) 109 110 /* Prototypes */ 111 static int cmds(struct pt_regs *); 112 static int mread(unsigned long, void *, int); 113 static int mwrite(unsigned long, void *, int); 114 static int handle_fault(struct pt_regs *); 115 static void byterev(unsigned char *, int); 116 static void memex(void); 117 static int bsesc(void); 118 static void dump(void); 119 static void prdump(unsigned long, long); 120 static int ppc_inst_dump(unsigned long, long, int); 121 static void dump_log_buf(void); 122 static void backtrace(struct pt_regs *); 123 static void excprint(struct pt_regs *); 124 static void prregs(struct pt_regs *); 125 static void memops(int); 126 static void memlocate(void); 127 static void memzcan(void); 128 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned); 129 int skipbl(void); 130 int scanhex(unsigned long *valp); 131 static void scannl(void); 132 static int hexdigit(int); 133 void getstring(char *, int); 134 static void flush_input(void); 135 static int inchar(void); 136 static void take_input(char *); 137 static unsigned long read_spr(int); 138 static void write_spr(int, unsigned long); 139 static void super_regs(void); 140 static void remove_bpts(void); 141 static void insert_bpts(void); 142 static void remove_cpu_bpts(void); 143 static void insert_cpu_bpts(void); 144 static struct bpt *at_breakpoint(unsigned long pc); 145 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp); 146 static int do_step(struct pt_regs *); 147 static void bpt_cmds(void); 148 static void cacheflush(void); 149 static int cpu_cmd(void); 150 static void csum(void); 151 static void bootcmds(void); 152 static void proccall(void); 153 void dump_segments(void); 154 static void symbol_lookup(void); 155 static void xmon_show_stack(unsigned long sp, unsigned long lr, 156 unsigned long pc); 157 static void xmon_print_symbol(unsigned long address, const char *mid, 158 const char *after); 159 static const char *getvecname(unsigned long vec); 160 161 static int do_spu_cmd(void); 162 163 #ifdef CONFIG_44x 164 static void dump_tlb_44x(void); 165 #endif 166 #ifdef CONFIG_PPC_BOOK3E 167 static void dump_tlb_book3e(void); 168 #endif 169 170 static int xmon_no_auto_backtrace; 171 172 extern void xmon_enter(void); 173 extern void xmon_leave(void); 174 175 #ifdef CONFIG_PPC64 176 #define REG "%.16lx" 177 #else 178 #define REG "%.8lx" 179 #endif 180 181 #ifdef __LITTLE_ENDIAN__ 182 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0]) 183 #else 184 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3]) 185 #endif 186 187 static char *help_string = "\ 188 Commands:\n\ 189 b show breakpoints\n\ 190 bd set data breakpoint\n\ 191 bi set instruction breakpoint\n\ 192 bc clear breakpoint\n" 193 #ifdef CONFIG_SMP 194 "\ 195 c print cpus stopped in xmon\n\ 196 c# try to switch to cpu number h (in hex)\n" 197 #endif 198 "\ 199 C checksum\n\ 200 d dump bytes\n\ 201 di dump instructions\n\ 202 df dump float values\n\ 203 dd dump double values\n\ 204 dl dump the kernel log buffer\n" 205 #ifdef CONFIG_PPC64 206 "\ 207 dp[#] dump paca for current cpu, or cpu #\n\ 208 dpa dump paca for all possible cpus\n" 209 #endif 210 "\ 211 dr dump stream of raw bytes\n\ 212 e print exception information\n\ 213 f flush cache\n\ 214 la lookup symbol+offset of specified address\n\ 215 ls lookup address of specified symbol\n\ 216 m examine/change memory\n\ 217 mm move a block of memory\n\ 218 ms set a block of memory\n\ 219 md compare two blocks of memory\n\ 220 ml locate a block of memory\n\ 221 mz zero a block of memory\n\ 222 mi show information about memory allocation\n\ 223 p call a procedure\n\ 224 r print registers\n\ 225 s single step\n" 226 #ifdef CONFIG_SPU_BASE 227 " ss stop execution on all spus\n\ 228 sr restore execution on stopped spus\n\ 229 sf # dump spu fields for spu # (in hex)\n\ 230 sd # dump spu local store for spu # (in hex)\n\ 231 sdi # disassemble spu local store for spu # (in hex)\n" 232 #endif 233 " S print special registers\n\ 234 t print backtrace\n\ 235 x exit monitor and recover\n\ 236 X exit monitor and dont recover\n" 237 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E) 238 " u dump segment table or SLB\n" 239 #elif defined(CONFIG_PPC_STD_MMU_32) 240 " u dump segment registers\n" 241 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E) 242 " u dump TLB\n" 243 #endif 244 " ? help\n" 245 " zr reboot\n\ 246 zh halt\n" 247 ; 248 249 static struct pt_regs *xmon_regs; 250 251 static inline void sync(void) 252 { 253 asm volatile("sync; isync"); 254 } 255 256 static inline void store_inst(void *p) 257 { 258 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p)); 259 } 260 261 static inline void cflush(void *p) 262 { 263 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p)); 264 } 265 266 static inline void cinval(void *p) 267 { 268 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p)); 269 } 270 271 /** 272 * write_ciabr() - write the CIABR SPR 273 * @ciabr: The value to write. 274 * 275 * This function writes a value to the CIARB register either directly 276 * through mtspr instruction if the kernel is in HV privilege mode or 277 * call a hypervisor function to achieve the same in case the kernel 278 * is in supervisor privilege mode. 279 */ 280 static void write_ciabr(unsigned long ciabr) 281 { 282 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) 283 return; 284 285 if (cpu_has_feature(CPU_FTR_HVMODE)) { 286 mtspr(SPRN_CIABR, ciabr); 287 return; 288 } 289 plapr_set_ciabr(ciabr); 290 } 291 292 /** 293 * set_ciabr() - set the CIABR 294 * @addr: The value to set. 295 * 296 * This function sets the correct privilege value into the the HW 297 * breakpoint address before writing it up in the CIABR register. 298 */ 299 static void set_ciabr(unsigned long addr) 300 { 301 addr &= ~CIABR_PRIV; 302 303 if (cpu_has_feature(CPU_FTR_HVMODE)) 304 addr |= CIABR_PRIV_HYPER; 305 else 306 addr |= CIABR_PRIV_SUPER; 307 write_ciabr(addr); 308 } 309 310 /* 311 * Disable surveillance (the service processor watchdog function) 312 * while we are in xmon. 313 * XXX we should re-enable it when we leave. :) 314 */ 315 #define SURVEILLANCE_TOKEN 9000 316 317 static inline void disable_surveillance(void) 318 { 319 #ifdef CONFIG_PPC_PSERIES 320 /* Since this can't be a module, args should end up below 4GB. */ 321 static struct rtas_args args; 322 323 /* 324 * At this point we have got all the cpus we can into 325 * xmon, so there is hopefully no other cpu calling RTAS 326 * at the moment, even though we don't take rtas.lock. 327 * If we did try to take rtas.lock there would be a 328 * real possibility of deadlock. 329 */ 330 args.token = rtas_token("set-indicator"); 331 if (args.token == RTAS_UNKNOWN_SERVICE) 332 return; 333 args.token = cpu_to_be32(args.token); 334 args.nargs = cpu_to_be32(3); 335 args.nret = cpu_to_be32(1); 336 args.rets = &args.args[3]; 337 args.args[0] = cpu_to_be32(SURVEILLANCE_TOKEN); 338 args.args[1] = 0; 339 args.args[2] = 0; 340 enter_rtas(__pa(&args)); 341 #endif /* CONFIG_PPC_PSERIES */ 342 } 343 344 #ifdef CONFIG_SMP 345 static int xmon_speaker; 346 347 static void get_output_lock(void) 348 { 349 int me = smp_processor_id() + 0x100; 350 int last_speaker = 0, prev; 351 long timeout; 352 353 if (xmon_speaker == me) 354 return; 355 356 for (;;) { 357 last_speaker = cmpxchg(&xmon_speaker, 0, me); 358 if (last_speaker == 0) 359 return; 360 361 /* 362 * Wait a full second for the lock, we might be on a slow 363 * console, but check every 100us. 364 */ 365 timeout = 10000; 366 while (xmon_speaker == last_speaker) { 367 if (--timeout > 0) { 368 udelay(100); 369 continue; 370 } 371 372 /* hostile takeover */ 373 prev = cmpxchg(&xmon_speaker, last_speaker, me); 374 if (prev == last_speaker) 375 return; 376 break; 377 } 378 } 379 } 380 381 static void release_output_lock(void) 382 { 383 xmon_speaker = 0; 384 } 385 386 int cpus_are_in_xmon(void) 387 { 388 return !cpumask_empty(&cpus_in_xmon); 389 } 390 #endif 391 392 static inline int unrecoverable_excp(struct pt_regs *regs) 393 { 394 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E) 395 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */ 396 return 0; 397 #else 398 return ((regs->msr & MSR_RI) == 0); 399 #endif 400 } 401 402 static int xmon_core(struct pt_regs *regs, int fromipi) 403 { 404 int cmd = 0; 405 struct bpt *bp; 406 long recurse_jmp[JMP_BUF_LEN]; 407 unsigned long offset; 408 unsigned long flags; 409 #ifdef CONFIG_SMP 410 int cpu; 411 int secondary; 412 unsigned long timeout; 413 #endif 414 415 local_irq_save(flags); 416 hard_irq_disable(); 417 418 bp = in_breakpoint_table(regs->nip, &offset); 419 if (bp != NULL) { 420 regs->nip = bp->address + offset; 421 atomic_dec(&bp->ref_count); 422 } 423 424 remove_cpu_bpts(); 425 426 #ifdef CONFIG_SMP 427 cpu = smp_processor_id(); 428 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) { 429 get_output_lock(); 430 excprint(regs); 431 printf("cpu 0x%x: Exception %lx %s in xmon, " 432 "returning to main loop\n", 433 cpu, regs->trap, getvecname(TRAP(regs))); 434 release_output_lock(); 435 longjmp(xmon_fault_jmp[cpu], 1); 436 } 437 438 if (setjmp(recurse_jmp) != 0) { 439 if (!in_xmon || !xmon_gate) { 440 get_output_lock(); 441 printf("xmon: WARNING: bad recursive fault " 442 "on cpu 0x%x\n", cpu); 443 release_output_lock(); 444 goto waiting; 445 } 446 secondary = !(xmon_taken && cpu == xmon_owner); 447 goto cmdloop; 448 } 449 450 xmon_fault_jmp[cpu] = recurse_jmp; 451 452 bp = NULL; 453 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) 454 bp = at_breakpoint(regs->nip); 455 if (bp || unrecoverable_excp(regs)) 456 fromipi = 0; 457 458 if (!fromipi) { 459 get_output_lock(); 460 excprint(regs); 461 if (bp) { 462 printf("cpu 0x%x stopped at breakpoint 0x%lx (", 463 cpu, BP_NUM(bp)); 464 xmon_print_symbol(regs->nip, " ", ")\n"); 465 } 466 if (unrecoverable_excp(regs)) 467 printf("WARNING: exception is not recoverable, " 468 "can't continue\n"); 469 release_output_lock(); 470 } 471 472 cpumask_set_cpu(cpu, &cpus_in_xmon); 473 474 waiting: 475 secondary = 1; 476 while (secondary && !xmon_gate) { 477 if (in_xmon == 0) { 478 if (fromipi) 479 goto leave; 480 secondary = test_and_set_bit(0, &in_xmon); 481 } 482 barrier(); 483 } 484 485 if (!secondary && !xmon_gate) { 486 /* we are the first cpu to come in */ 487 /* interrupt other cpu(s) */ 488 int ncpus = num_online_cpus(); 489 490 xmon_owner = cpu; 491 mb(); 492 if (ncpus > 1) { 493 smp_send_debugger_break(); 494 /* wait for other cpus to come in */ 495 for (timeout = 100000000; timeout != 0; --timeout) { 496 if (cpumask_weight(&cpus_in_xmon) >= ncpus) 497 break; 498 barrier(); 499 } 500 } 501 remove_bpts(); 502 disable_surveillance(); 503 /* for breakpoint or single step, print the current instr. */ 504 if (bp || TRAP(regs) == 0xd00) 505 ppc_inst_dump(regs->nip, 1, 0); 506 printf("enter ? for help\n"); 507 mb(); 508 xmon_gate = 1; 509 barrier(); 510 } 511 512 cmdloop: 513 while (in_xmon) { 514 if (secondary) { 515 if (cpu == xmon_owner) { 516 if (!test_and_set_bit(0, &xmon_taken)) { 517 secondary = 0; 518 continue; 519 } 520 /* missed it */ 521 while (cpu == xmon_owner) 522 barrier(); 523 } 524 barrier(); 525 } else { 526 cmd = cmds(regs); 527 if (cmd != 0) { 528 /* exiting xmon */ 529 insert_bpts(); 530 xmon_gate = 0; 531 wmb(); 532 in_xmon = 0; 533 break; 534 } 535 /* have switched to some other cpu */ 536 secondary = 1; 537 } 538 } 539 leave: 540 cpumask_clear_cpu(cpu, &cpus_in_xmon); 541 xmon_fault_jmp[cpu] = NULL; 542 #else 543 /* UP is simple... */ 544 if (in_xmon) { 545 printf("Exception %lx %s in xmon, returning to main loop\n", 546 regs->trap, getvecname(TRAP(regs))); 547 longjmp(xmon_fault_jmp[0], 1); 548 } 549 if (setjmp(recurse_jmp) == 0) { 550 xmon_fault_jmp[0] = recurse_jmp; 551 in_xmon = 1; 552 553 excprint(regs); 554 bp = at_breakpoint(regs->nip); 555 if (bp) { 556 printf("Stopped at breakpoint %lx (", BP_NUM(bp)); 557 xmon_print_symbol(regs->nip, " ", ")\n"); 558 } 559 if (unrecoverable_excp(regs)) 560 printf("WARNING: exception is not recoverable, " 561 "can't continue\n"); 562 remove_bpts(); 563 disable_surveillance(); 564 /* for breakpoint or single step, print the current instr. */ 565 if (bp || TRAP(regs) == 0xd00) 566 ppc_inst_dump(regs->nip, 1, 0); 567 printf("enter ? for help\n"); 568 } 569 570 cmd = cmds(regs); 571 572 insert_bpts(); 573 in_xmon = 0; 574 #endif 575 576 #ifdef CONFIG_BOOKE 577 if (regs->msr & MSR_DE) { 578 bp = at_breakpoint(regs->nip); 579 if (bp != NULL) { 580 regs->nip = (unsigned long) &bp->instr[0]; 581 atomic_inc(&bp->ref_count); 582 } 583 } 584 #else 585 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) { 586 bp = at_breakpoint(regs->nip); 587 if (bp != NULL) { 588 int stepped = emulate_step(regs, bp->instr[0]); 589 if (stepped == 0) { 590 regs->nip = (unsigned long) &bp->instr[0]; 591 atomic_inc(&bp->ref_count); 592 } else if (stepped < 0) { 593 printf("Couldn't single-step %s instruction\n", 594 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd")); 595 } 596 } 597 } 598 #endif 599 insert_cpu_bpts(); 600 601 touch_nmi_watchdog(); 602 local_irq_restore(flags); 603 604 return cmd != 'X' && cmd != EOF; 605 } 606 607 int xmon(struct pt_regs *excp) 608 { 609 struct pt_regs regs; 610 611 if (excp == NULL) { 612 ppc_save_regs(®s); 613 excp = ®s; 614 } 615 616 return xmon_core(excp, 0); 617 } 618 EXPORT_SYMBOL(xmon); 619 620 irqreturn_t xmon_irq(int irq, void *d) 621 { 622 unsigned long flags; 623 local_irq_save(flags); 624 printf("Keyboard interrupt\n"); 625 xmon(get_irq_regs()); 626 local_irq_restore(flags); 627 return IRQ_HANDLED; 628 } 629 630 static int xmon_bpt(struct pt_regs *regs) 631 { 632 struct bpt *bp; 633 unsigned long offset; 634 635 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT)) 636 return 0; 637 638 /* Are we at the trap at bp->instr[1] for some bp? */ 639 bp = in_breakpoint_table(regs->nip, &offset); 640 if (bp != NULL && offset == 4) { 641 regs->nip = bp->address + 4; 642 atomic_dec(&bp->ref_count); 643 return 1; 644 } 645 646 /* Are we at a breakpoint? */ 647 bp = at_breakpoint(regs->nip); 648 if (!bp) 649 return 0; 650 651 xmon_core(regs, 0); 652 653 return 1; 654 } 655 656 static int xmon_sstep(struct pt_regs *regs) 657 { 658 if (user_mode(regs)) 659 return 0; 660 xmon_core(regs, 0); 661 return 1; 662 } 663 664 static int xmon_break_match(struct pt_regs *regs) 665 { 666 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT)) 667 return 0; 668 if (dabr.enabled == 0) 669 return 0; 670 xmon_core(regs, 0); 671 return 1; 672 } 673 674 static int xmon_iabr_match(struct pt_regs *regs) 675 { 676 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT)) 677 return 0; 678 if (iabr == NULL) 679 return 0; 680 xmon_core(regs, 0); 681 return 1; 682 } 683 684 static int xmon_ipi(struct pt_regs *regs) 685 { 686 #ifdef CONFIG_SMP 687 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon)) 688 xmon_core(regs, 1); 689 #endif 690 return 0; 691 } 692 693 static int xmon_fault_handler(struct pt_regs *regs) 694 { 695 struct bpt *bp; 696 unsigned long offset; 697 698 if (in_xmon && catch_memory_errors) 699 handle_fault(regs); /* doesn't return */ 700 701 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) { 702 bp = in_breakpoint_table(regs->nip, &offset); 703 if (bp != NULL) { 704 regs->nip = bp->address + offset; 705 atomic_dec(&bp->ref_count); 706 } 707 } 708 709 return 0; 710 } 711 712 static struct bpt *at_breakpoint(unsigned long pc) 713 { 714 int i; 715 struct bpt *bp; 716 717 bp = bpts; 718 for (i = 0; i < NBPTS; ++i, ++bp) 719 if (bp->enabled && pc == bp->address) 720 return bp; 721 return NULL; 722 } 723 724 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp) 725 { 726 unsigned long off; 727 728 off = nip - (unsigned long) bpts; 729 if (off >= sizeof(bpts)) 730 return NULL; 731 off %= sizeof(struct bpt); 732 if (off != offsetof(struct bpt, instr[0]) 733 && off != offsetof(struct bpt, instr[1])) 734 return NULL; 735 *offp = off - offsetof(struct bpt, instr[0]); 736 return (struct bpt *) (nip - off); 737 } 738 739 static struct bpt *new_breakpoint(unsigned long a) 740 { 741 struct bpt *bp; 742 743 a &= ~3UL; 744 bp = at_breakpoint(a); 745 if (bp) 746 return bp; 747 748 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) { 749 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) { 750 bp->address = a; 751 bp->instr[1] = bpinstr; 752 store_inst(&bp->instr[1]); 753 return bp; 754 } 755 } 756 757 printf("Sorry, no free breakpoints. Please clear one first.\n"); 758 return NULL; 759 } 760 761 static void insert_bpts(void) 762 { 763 int i; 764 struct bpt *bp; 765 766 bp = bpts; 767 for (i = 0; i < NBPTS; ++i, ++bp) { 768 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0) 769 continue; 770 if (mread(bp->address, &bp->instr[0], 4) != 4) { 771 printf("Couldn't read instruction at %lx, " 772 "disabling breakpoint there\n", bp->address); 773 bp->enabled = 0; 774 continue; 775 } 776 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) { 777 printf("Breakpoint at %lx is on an mtmsrd or rfid " 778 "instruction, disabling it\n", bp->address); 779 bp->enabled = 0; 780 continue; 781 } 782 store_inst(&bp->instr[0]); 783 if (bp->enabled & BP_CIABR) 784 continue; 785 if (mwrite(bp->address, &bpinstr, 4) != 4) { 786 printf("Couldn't write instruction at %lx, " 787 "disabling breakpoint there\n", bp->address); 788 bp->enabled &= ~BP_TRAP; 789 continue; 790 } 791 store_inst((void *)bp->address); 792 } 793 } 794 795 static void insert_cpu_bpts(void) 796 { 797 struct arch_hw_breakpoint brk; 798 799 if (dabr.enabled) { 800 brk.address = dabr.address; 801 brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL; 802 brk.len = 8; 803 __set_breakpoint(&brk); 804 } 805 806 if (iabr) 807 set_ciabr(iabr->address); 808 } 809 810 static void remove_bpts(void) 811 { 812 int i; 813 struct bpt *bp; 814 unsigned instr; 815 816 bp = bpts; 817 for (i = 0; i < NBPTS; ++i, ++bp) { 818 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP) 819 continue; 820 if (mread(bp->address, &instr, 4) == 4 821 && instr == bpinstr 822 && mwrite(bp->address, &bp->instr, 4) != 4) 823 printf("Couldn't remove breakpoint at %lx\n", 824 bp->address); 825 else 826 store_inst((void *)bp->address); 827 } 828 } 829 830 static void remove_cpu_bpts(void) 831 { 832 hw_breakpoint_disable(); 833 write_ciabr(0); 834 } 835 836 /* Command interpreting routine */ 837 static char *last_cmd; 838 839 static int 840 cmds(struct pt_regs *excp) 841 { 842 int cmd = 0; 843 844 last_cmd = NULL; 845 xmon_regs = excp; 846 847 if (!xmon_no_auto_backtrace) { 848 xmon_no_auto_backtrace = 1; 849 xmon_show_stack(excp->gpr[1], excp->link, excp->nip); 850 } 851 852 for(;;) { 853 #ifdef CONFIG_SMP 854 printf("%x:", smp_processor_id()); 855 #endif /* CONFIG_SMP */ 856 printf("mon> "); 857 flush_input(); 858 termch = 0; 859 cmd = skipbl(); 860 if( cmd == '\n' ) { 861 if (last_cmd == NULL) 862 continue; 863 take_input(last_cmd); 864 last_cmd = NULL; 865 cmd = inchar(); 866 } 867 switch (cmd) { 868 case 'm': 869 cmd = inchar(); 870 switch (cmd) { 871 case 'm': 872 case 's': 873 case 'd': 874 memops(cmd); 875 break; 876 case 'l': 877 memlocate(); 878 break; 879 case 'z': 880 memzcan(); 881 break; 882 case 'i': 883 show_mem(0); 884 break; 885 default: 886 termch = cmd; 887 memex(); 888 } 889 break; 890 case 'd': 891 dump(); 892 break; 893 case 'l': 894 symbol_lookup(); 895 break; 896 case 'r': 897 prregs(excp); /* print regs */ 898 break; 899 case 'e': 900 excprint(excp); 901 break; 902 case 'S': 903 super_regs(); 904 break; 905 case 't': 906 backtrace(excp); 907 break; 908 case 'f': 909 cacheflush(); 910 break; 911 case 's': 912 if (do_spu_cmd() == 0) 913 break; 914 if (do_step(excp)) 915 return cmd; 916 break; 917 case 'x': 918 case 'X': 919 return cmd; 920 case EOF: 921 printf(" <no input ...>\n"); 922 mdelay(2000); 923 return cmd; 924 case '?': 925 xmon_puts(help_string); 926 break; 927 case 'b': 928 bpt_cmds(); 929 break; 930 case 'C': 931 csum(); 932 break; 933 case 'c': 934 if (cpu_cmd()) 935 return 0; 936 break; 937 case 'z': 938 bootcmds(); 939 break; 940 case 'p': 941 proccall(); 942 break; 943 #ifdef CONFIG_PPC_STD_MMU 944 case 'u': 945 dump_segments(); 946 break; 947 #elif defined(CONFIG_44x) 948 case 'u': 949 dump_tlb_44x(); 950 break; 951 #elif defined(CONFIG_PPC_BOOK3E) 952 case 'u': 953 dump_tlb_book3e(); 954 break; 955 #endif 956 default: 957 printf("Unrecognized command: "); 958 do { 959 if (' ' < cmd && cmd <= '~') 960 putchar(cmd); 961 else 962 printf("\\x%x", cmd); 963 cmd = inchar(); 964 } while (cmd != '\n'); 965 printf(" (type ? for help)\n"); 966 break; 967 } 968 } 969 } 970 971 #ifdef CONFIG_BOOKE 972 static int do_step(struct pt_regs *regs) 973 { 974 regs->msr |= MSR_DE; 975 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM); 976 return 1; 977 } 978 #else 979 /* 980 * Step a single instruction. 981 * Some instructions we emulate, others we execute with MSR_SE set. 982 */ 983 static int do_step(struct pt_regs *regs) 984 { 985 unsigned int instr; 986 int stepped; 987 988 /* check we are in 64-bit kernel mode, translation enabled */ 989 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) { 990 if (mread(regs->nip, &instr, 4) == 4) { 991 stepped = emulate_step(regs, instr); 992 if (stepped < 0) { 993 printf("Couldn't single-step %s instruction\n", 994 (IS_RFID(instr)? "rfid": "mtmsrd")); 995 return 0; 996 } 997 if (stepped > 0) { 998 regs->trap = 0xd00 | (regs->trap & 1); 999 printf("stepped to "); 1000 xmon_print_symbol(regs->nip, " ", "\n"); 1001 ppc_inst_dump(regs->nip, 1, 0); 1002 return 0; 1003 } 1004 } 1005 } 1006 regs->msr |= MSR_SE; 1007 return 1; 1008 } 1009 #endif 1010 1011 static void bootcmds(void) 1012 { 1013 int cmd; 1014 1015 cmd = inchar(); 1016 if (cmd == 'r') 1017 ppc_md.restart(NULL); 1018 else if (cmd == 'h') 1019 ppc_md.halt(); 1020 else if (cmd == 'p') 1021 if (pm_power_off) 1022 pm_power_off(); 1023 } 1024 1025 static int cpu_cmd(void) 1026 { 1027 #ifdef CONFIG_SMP 1028 unsigned long cpu, first_cpu, last_cpu; 1029 int timeout; 1030 1031 if (!scanhex(&cpu)) { 1032 /* print cpus waiting or in xmon */ 1033 printf("cpus stopped:"); 1034 last_cpu = first_cpu = NR_CPUS; 1035 for_each_possible_cpu(cpu) { 1036 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) { 1037 if (cpu == last_cpu + 1) { 1038 last_cpu = cpu; 1039 } else { 1040 if (last_cpu != first_cpu) 1041 printf("-0x%lx", last_cpu); 1042 last_cpu = first_cpu = cpu; 1043 printf(" 0x%lx", cpu); 1044 } 1045 } 1046 } 1047 if (last_cpu != first_cpu) 1048 printf("-0x%lx", last_cpu); 1049 printf("\n"); 1050 return 0; 1051 } 1052 /* try to switch to cpu specified */ 1053 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) { 1054 printf("cpu 0x%x isn't in xmon\n", cpu); 1055 return 0; 1056 } 1057 xmon_taken = 0; 1058 mb(); 1059 xmon_owner = cpu; 1060 timeout = 10000000; 1061 while (!xmon_taken) { 1062 if (--timeout == 0) { 1063 if (test_and_set_bit(0, &xmon_taken)) 1064 break; 1065 /* take control back */ 1066 mb(); 1067 xmon_owner = smp_processor_id(); 1068 printf("cpu 0x%x didn't take control\n", cpu); 1069 return 0; 1070 } 1071 barrier(); 1072 } 1073 return 1; 1074 #else 1075 return 0; 1076 #endif /* CONFIG_SMP */ 1077 } 1078 1079 static unsigned short fcstab[256] = { 1080 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 1081 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 1082 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 1083 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 1084 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 1085 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 1086 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 1087 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 1088 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 1089 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 1090 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 1091 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 1092 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 1093 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 1094 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 1095 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 1096 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 1097 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 1098 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 1099 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 1100 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 1101 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 1102 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 1103 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 1104 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 1105 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 1106 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 1107 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 1108 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 1109 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 1110 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 1111 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 1112 }; 1113 1114 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff]) 1115 1116 static void 1117 csum(void) 1118 { 1119 unsigned int i; 1120 unsigned short fcs; 1121 unsigned char v; 1122 1123 if (!scanhex(&adrs)) 1124 return; 1125 if (!scanhex(&ncsum)) 1126 return; 1127 fcs = 0xffff; 1128 for (i = 0; i < ncsum; ++i) { 1129 if (mread(adrs+i, &v, 1) == 0) { 1130 printf("csum stopped at "REG"\n", adrs+i); 1131 break; 1132 } 1133 fcs = FCS(fcs, v); 1134 } 1135 printf("%x\n", fcs); 1136 } 1137 1138 /* 1139 * Check if this is a suitable place to put a breakpoint. 1140 */ 1141 static long check_bp_loc(unsigned long addr) 1142 { 1143 unsigned int instr; 1144 1145 addr &= ~3; 1146 if (!is_kernel_addr(addr)) { 1147 printf("Breakpoints may only be placed at kernel addresses\n"); 1148 return 0; 1149 } 1150 if (!mread(addr, &instr, sizeof(instr))) { 1151 printf("Can't read instruction at address %lx\n", addr); 1152 return 0; 1153 } 1154 if (IS_MTMSRD(instr) || IS_RFID(instr)) { 1155 printf("Breakpoints may not be placed on mtmsrd or rfid " 1156 "instructions\n"); 1157 return 0; 1158 } 1159 return 1; 1160 } 1161 1162 static char *breakpoint_help_string = 1163 "Breakpoint command usage:\n" 1164 "b show breakpoints\n" 1165 "b <addr> [cnt] set breakpoint at given instr addr\n" 1166 "bc clear all breakpoints\n" 1167 "bc <n/addr> clear breakpoint number n or at addr\n" 1168 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n" 1169 "bd <addr> [cnt] set hardware data breakpoint\n" 1170 ""; 1171 1172 static void 1173 bpt_cmds(void) 1174 { 1175 int cmd; 1176 unsigned long a; 1177 int mode, i; 1178 struct bpt *bp; 1179 const char badaddr[] = "Only kernel addresses are permitted " 1180 "for breakpoints\n"; 1181 1182 cmd = inchar(); 1183 switch (cmd) { 1184 #ifndef CONFIG_8xx 1185 case 'd': /* bd - hardware data breakpoint */ 1186 mode = 7; 1187 cmd = inchar(); 1188 if (cmd == 'r') 1189 mode = 5; 1190 else if (cmd == 'w') 1191 mode = 6; 1192 else 1193 termch = cmd; 1194 dabr.address = 0; 1195 dabr.enabled = 0; 1196 if (scanhex(&dabr.address)) { 1197 if (!is_kernel_addr(dabr.address)) { 1198 printf(badaddr); 1199 break; 1200 } 1201 dabr.address &= ~HW_BRK_TYPE_DABR; 1202 dabr.enabled = mode | BP_DABR; 1203 } 1204 break; 1205 1206 case 'i': /* bi - hardware instr breakpoint */ 1207 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) { 1208 printf("Hardware instruction breakpoint " 1209 "not supported on this cpu\n"); 1210 break; 1211 } 1212 if (iabr) { 1213 iabr->enabled &= ~BP_CIABR; 1214 iabr = NULL; 1215 } 1216 if (!scanhex(&a)) 1217 break; 1218 if (!check_bp_loc(a)) 1219 break; 1220 bp = new_breakpoint(a); 1221 if (bp != NULL) { 1222 bp->enabled |= BP_CIABR; 1223 iabr = bp; 1224 } 1225 break; 1226 #endif 1227 1228 case 'c': 1229 if (!scanhex(&a)) { 1230 /* clear all breakpoints */ 1231 for (i = 0; i < NBPTS; ++i) 1232 bpts[i].enabled = 0; 1233 iabr = NULL; 1234 dabr.enabled = 0; 1235 printf("All breakpoints cleared\n"); 1236 break; 1237 } 1238 1239 if (a <= NBPTS && a >= 1) { 1240 /* assume a breakpoint number */ 1241 bp = &bpts[a-1]; /* bp nums are 1 based */ 1242 } else { 1243 /* assume a breakpoint address */ 1244 bp = at_breakpoint(a); 1245 if (bp == NULL) { 1246 printf("No breakpoint at %lx\n", a); 1247 break; 1248 } 1249 } 1250 1251 printf("Cleared breakpoint %lx (", BP_NUM(bp)); 1252 xmon_print_symbol(bp->address, " ", ")\n"); 1253 bp->enabled = 0; 1254 break; 1255 1256 default: 1257 termch = cmd; 1258 cmd = skipbl(); 1259 if (cmd == '?') { 1260 printf(breakpoint_help_string); 1261 break; 1262 } 1263 termch = cmd; 1264 if (!scanhex(&a)) { 1265 /* print all breakpoints */ 1266 printf(" type address\n"); 1267 if (dabr.enabled) { 1268 printf(" data "REG" [", dabr.address); 1269 if (dabr.enabled & 1) 1270 printf("r"); 1271 if (dabr.enabled & 2) 1272 printf("w"); 1273 printf("]\n"); 1274 } 1275 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) { 1276 if (!bp->enabled) 1277 continue; 1278 printf("%2x %s ", BP_NUM(bp), 1279 (bp->enabled & BP_CIABR) ? "inst": "trap"); 1280 xmon_print_symbol(bp->address, " ", "\n"); 1281 } 1282 break; 1283 } 1284 1285 if (!check_bp_loc(a)) 1286 break; 1287 bp = new_breakpoint(a); 1288 if (bp != NULL) 1289 bp->enabled |= BP_TRAP; 1290 break; 1291 } 1292 } 1293 1294 /* Very cheap human name for vector lookup. */ 1295 static 1296 const char *getvecname(unsigned long vec) 1297 { 1298 char *ret; 1299 1300 switch (vec) { 1301 case 0x100: ret = "(System Reset)"; break; 1302 case 0x200: ret = "(Machine Check)"; break; 1303 case 0x300: ret = "(Data Access)"; break; 1304 case 0x380: ret = "(Data SLB Access)"; break; 1305 case 0x400: ret = "(Instruction Access)"; break; 1306 case 0x480: ret = "(Instruction SLB Access)"; break; 1307 case 0x500: ret = "(Hardware Interrupt)"; break; 1308 case 0x600: ret = "(Alignment)"; break; 1309 case 0x700: ret = "(Program Check)"; break; 1310 case 0x800: ret = "(FPU Unavailable)"; break; 1311 case 0x900: ret = "(Decrementer)"; break; 1312 case 0x980: ret = "(Hypervisor Decrementer)"; break; 1313 case 0xa00: ret = "(Doorbell)"; break; 1314 case 0xc00: ret = "(System Call)"; break; 1315 case 0xd00: ret = "(Single Step)"; break; 1316 case 0xe40: ret = "(Emulation Assist)"; break; 1317 case 0xe60: ret = "(HMI)"; break; 1318 case 0xe80: ret = "(Hypervisor Doorbell)"; break; 1319 case 0xf00: ret = "(Performance Monitor)"; break; 1320 case 0xf20: ret = "(Altivec Unavailable)"; break; 1321 case 0x1300: ret = "(Instruction Breakpoint)"; break; 1322 case 0x1500: ret = "(Denormalisation)"; break; 1323 case 0x1700: ret = "(Altivec Assist)"; break; 1324 default: ret = ""; 1325 } 1326 return ret; 1327 } 1328 1329 static void get_function_bounds(unsigned long pc, unsigned long *startp, 1330 unsigned long *endp) 1331 { 1332 unsigned long size, offset; 1333 const char *name; 1334 1335 *startp = *endp = 0; 1336 if (pc == 0) 1337 return; 1338 if (setjmp(bus_error_jmp) == 0) { 1339 catch_memory_errors = 1; 1340 sync(); 1341 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr); 1342 if (name != NULL) { 1343 *startp = pc - offset; 1344 *endp = pc - offset + size; 1345 } 1346 sync(); 1347 } 1348 catch_memory_errors = 0; 1349 } 1350 1351 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long)) 1352 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long)) 1353 1354 static void xmon_show_stack(unsigned long sp, unsigned long lr, 1355 unsigned long pc) 1356 { 1357 int max_to_print = 64; 1358 unsigned long ip; 1359 unsigned long newsp; 1360 unsigned long marker; 1361 struct pt_regs regs; 1362 1363 while (max_to_print--) { 1364 if (sp < PAGE_OFFSET) { 1365 if (sp != 0) 1366 printf("SP (%lx) is in userspace\n", sp); 1367 break; 1368 } 1369 1370 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long)) 1371 || !mread(sp, &newsp, sizeof(unsigned long))) { 1372 printf("Couldn't read stack frame at %lx\n", sp); 1373 break; 1374 } 1375 1376 /* 1377 * For the first stack frame, try to work out if 1378 * LR and/or the saved LR value in the bottommost 1379 * stack frame are valid. 1380 */ 1381 if ((pc | lr) != 0) { 1382 unsigned long fnstart, fnend; 1383 unsigned long nextip; 1384 int printip = 1; 1385 1386 get_function_bounds(pc, &fnstart, &fnend); 1387 nextip = 0; 1388 if (newsp > sp) 1389 mread(newsp + LRSAVE_OFFSET, &nextip, 1390 sizeof(unsigned long)); 1391 if (lr == ip) { 1392 if (lr < PAGE_OFFSET 1393 || (fnstart <= lr && lr < fnend)) 1394 printip = 0; 1395 } else if (lr == nextip) { 1396 printip = 0; 1397 } else if (lr >= PAGE_OFFSET 1398 && !(fnstart <= lr && lr < fnend)) { 1399 printf("[link register ] "); 1400 xmon_print_symbol(lr, " ", "\n"); 1401 } 1402 if (printip) { 1403 printf("["REG"] ", sp); 1404 xmon_print_symbol(ip, " ", " (unreliable)\n"); 1405 } 1406 pc = lr = 0; 1407 1408 } else { 1409 printf("["REG"] ", sp); 1410 xmon_print_symbol(ip, " ", "\n"); 1411 } 1412 1413 /* Look for "regshere" marker to see if this is 1414 an exception frame. */ 1415 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long)) 1416 && marker == STACK_FRAME_REGS_MARKER) { 1417 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs)) 1418 != sizeof(regs)) { 1419 printf("Couldn't read registers at %lx\n", 1420 sp + STACK_FRAME_OVERHEAD); 1421 break; 1422 } 1423 printf("--- Exception: %lx %s at ", regs.trap, 1424 getvecname(TRAP(®s))); 1425 pc = regs.nip; 1426 lr = regs.link; 1427 xmon_print_symbol(pc, " ", "\n"); 1428 } 1429 1430 if (newsp == 0) 1431 break; 1432 1433 sp = newsp; 1434 } 1435 } 1436 1437 static void backtrace(struct pt_regs *excp) 1438 { 1439 unsigned long sp; 1440 1441 if (scanhex(&sp)) 1442 xmon_show_stack(sp, 0, 0); 1443 else 1444 xmon_show_stack(excp->gpr[1], excp->link, excp->nip); 1445 scannl(); 1446 } 1447 1448 static void print_bug_trap(struct pt_regs *regs) 1449 { 1450 #ifdef CONFIG_BUG 1451 const struct bug_entry *bug; 1452 unsigned long addr; 1453 1454 if (regs->msr & MSR_PR) 1455 return; /* not in kernel */ 1456 addr = regs->nip; /* address of trap instruction */ 1457 if (addr < PAGE_OFFSET) 1458 return; 1459 bug = find_bug(regs->nip); 1460 if (bug == NULL) 1461 return; 1462 if (is_warning_bug(bug)) 1463 return; 1464 1465 #ifdef CONFIG_DEBUG_BUGVERBOSE 1466 printf("kernel BUG at %s:%u!\n", 1467 bug->file, bug->line); 1468 #else 1469 printf("kernel BUG at %p!\n", (void *)bug->bug_addr); 1470 #endif 1471 #endif /* CONFIG_BUG */ 1472 } 1473 1474 static void excprint(struct pt_regs *fp) 1475 { 1476 unsigned long trap; 1477 1478 #ifdef CONFIG_SMP 1479 printf("cpu 0x%x: ", smp_processor_id()); 1480 #endif /* CONFIG_SMP */ 1481 1482 trap = TRAP(fp); 1483 printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp); 1484 printf(" pc: "); 1485 xmon_print_symbol(fp->nip, ": ", "\n"); 1486 1487 printf(" lr: ", fp->link); 1488 xmon_print_symbol(fp->link, ": ", "\n"); 1489 1490 printf(" sp: %lx\n", fp->gpr[1]); 1491 printf(" msr: %lx\n", fp->msr); 1492 1493 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) { 1494 printf(" dar: %lx\n", fp->dar); 1495 if (trap != 0x380) 1496 printf(" dsisr: %lx\n", fp->dsisr); 1497 } 1498 1499 printf(" current = 0x%lx\n", current); 1500 #ifdef CONFIG_PPC64 1501 printf(" paca = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n", 1502 local_paca, local_paca->soft_enabled, local_paca->irq_happened); 1503 #endif 1504 if (current) { 1505 printf(" pid = %ld, comm = %s\n", 1506 current->pid, current->comm); 1507 } 1508 1509 if (trap == 0x700) 1510 print_bug_trap(fp); 1511 } 1512 1513 static void prregs(struct pt_regs *fp) 1514 { 1515 int n, trap; 1516 unsigned long base; 1517 struct pt_regs regs; 1518 1519 if (scanhex(&base)) { 1520 if (setjmp(bus_error_jmp) == 0) { 1521 catch_memory_errors = 1; 1522 sync(); 1523 regs = *(struct pt_regs *)base; 1524 sync(); 1525 __delay(200); 1526 } else { 1527 catch_memory_errors = 0; 1528 printf("*** Error reading registers from "REG"\n", 1529 base); 1530 return; 1531 } 1532 catch_memory_errors = 0; 1533 fp = ®s; 1534 } 1535 1536 #ifdef CONFIG_PPC64 1537 if (FULL_REGS(fp)) { 1538 for (n = 0; n < 16; ++n) 1539 printf("R%.2ld = "REG" R%.2ld = "REG"\n", 1540 n, fp->gpr[n], n+16, fp->gpr[n+16]); 1541 } else { 1542 for (n = 0; n < 7; ++n) 1543 printf("R%.2ld = "REG" R%.2ld = "REG"\n", 1544 n, fp->gpr[n], n+7, fp->gpr[n+7]); 1545 } 1546 #else 1547 for (n = 0; n < 32; ++n) { 1548 printf("R%.2d = %.8x%s", n, fp->gpr[n], 1549 (n & 3) == 3? "\n": " "); 1550 if (n == 12 && !FULL_REGS(fp)) { 1551 printf("\n"); 1552 break; 1553 } 1554 } 1555 #endif 1556 printf("pc = "); 1557 xmon_print_symbol(fp->nip, " ", "\n"); 1558 if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) { 1559 printf("cfar= "); 1560 xmon_print_symbol(fp->orig_gpr3, " ", "\n"); 1561 } 1562 printf("lr = "); 1563 xmon_print_symbol(fp->link, " ", "\n"); 1564 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr); 1565 printf("ctr = "REG" xer = "REG" trap = %4lx\n", 1566 fp->ctr, fp->xer, fp->trap); 1567 trap = TRAP(fp); 1568 if (trap == 0x300 || trap == 0x380 || trap == 0x600) 1569 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr); 1570 } 1571 1572 static void cacheflush(void) 1573 { 1574 int cmd; 1575 unsigned long nflush; 1576 1577 cmd = inchar(); 1578 if (cmd != 'i') 1579 termch = cmd; 1580 scanhex((void *)&adrs); 1581 if (termch != '\n') 1582 termch = 0; 1583 nflush = 1; 1584 scanhex(&nflush); 1585 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES; 1586 if (setjmp(bus_error_jmp) == 0) { 1587 catch_memory_errors = 1; 1588 sync(); 1589 1590 if (cmd != 'i') { 1591 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES) 1592 cflush((void *) adrs); 1593 } else { 1594 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES) 1595 cinval((void *) adrs); 1596 } 1597 sync(); 1598 /* wait a little while to see if we get a machine check */ 1599 __delay(200); 1600 } 1601 catch_memory_errors = 0; 1602 } 1603 1604 static unsigned long 1605 read_spr(int n) 1606 { 1607 unsigned int instrs[2]; 1608 unsigned long (*code)(void); 1609 unsigned long ret = -1UL; 1610 #ifdef CONFIG_PPC64 1611 unsigned long opd[3]; 1612 1613 opd[0] = (unsigned long)instrs; 1614 opd[1] = 0; 1615 opd[2] = 0; 1616 code = (unsigned long (*)(void)) opd; 1617 #else 1618 code = (unsigned long (*)(void)) instrs; 1619 #endif 1620 1621 /* mfspr r3,n; blr */ 1622 instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6); 1623 instrs[1] = 0x4e800020; 1624 store_inst(instrs); 1625 store_inst(instrs+1); 1626 1627 if (setjmp(bus_error_jmp) == 0) { 1628 catch_memory_errors = 1; 1629 sync(); 1630 1631 ret = code(); 1632 1633 sync(); 1634 /* wait a little while to see if we get a machine check */ 1635 __delay(200); 1636 n = size; 1637 } 1638 1639 return ret; 1640 } 1641 1642 static void 1643 write_spr(int n, unsigned long val) 1644 { 1645 unsigned int instrs[2]; 1646 unsigned long (*code)(unsigned long); 1647 #ifdef CONFIG_PPC64 1648 unsigned long opd[3]; 1649 1650 opd[0] = (unsigned long)instrs; 1651 opd[1] = 0; 1652 opd[2] = 0; 1653 code = (unsigned long (*)(unsigned long)) opd; 1654 #else 1655 code = (unsigned long (*)(unsigned long)) instrs; 1656 #endif 1657 1658 instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6); 1659 instrs[1] = 0x4e800020; 1660 store_inst(instrs); 1661 store_inst(instrs+1); 1662 1663 if (setjmp(bus_error_jmp) == 0) { 1664 catch_memory_errors = 1; 1665 sync(); 1666 1667 code(val); 1668 1669 sync(); 1670 /* wait a little while to see if we get a machine check */ 1671 __delay(200); 1672 n = size; 1673 } 1674 } 1675 1676 static unsigned long regno; 1677 extern char exc_prolog; 1678 extern char dec_exc; 1679 1680 static void super_regs(void) 1681 { 1682 int cmd; 1683 unsigned long val; 1684 1685 cmd = skipbl(); 1686 if (cmd == '\n') { 1687 unsigned long sp, toc; 1688 asm("mr %0,1" : "=r" (sp) :); 1689 asm("mr %0,2" : "=r" (toc) :); 1690 1691 printf("msr = "REG" sprg0= "REG"\n", 1692 mfmsr(), mfspr(SPRN_SPRG0)); 1693 printf("pvr = "REG" sprg1= "REG"\n", 1694 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1)); 1695 printf("dec = "REG" sprg2= "REG"\n", 1696 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2)); 1697 printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3)); 1698 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR)); 1699 1700 return; 1701 } 1702 1703 scanhex(®no); 1704 switch (cmd) { 1705 case 'w': 1706 val = read_spr(regno); 1707 scanhex(&val); 1708 write_spr(regno, val); 1709 /* fall through */ 1710 case 'r': 1711 printf("spr %lx = %lx\n", regno, read_spr(regno)); 1712 break; 1713 } 1714 scannl(); 1715 } 1716 1717 /* 1718 * Stuff for reading and writing memory safely 1719 */ 1720 static int 1721 mread(unsigned long adrs, void *buf, int size) 1722 { 1723 volatile int n; 1724 char *p, *q; 1725 1726 n = 0; 1727 if (setjmp(bus_error_jmp) == 0) { 1728 catch_memory_errors = 1; 1729 sync(); 1730 p = (char *)adrs; 1731 q = (char *)buf; 1732 switch (size) { 1733 case 2: 1734 *(u16 *)q = *(u16 *)p; 1735 break; 1736 case 4: 1737 *(u32 *)q = *(u32 *)p; 1738 break; 1739 case 8: 1740 *(u64 *)q = *(u64 *)p; 1741 break; 1742 default: 1743 for( ; n < size; ++n) { 1744 *q++ = *p++; 1745 sync(); 1746 } 1747 } 1748 sync(); 1749 /* wait a little while to see if we get a machine check */ 1750 __delay(200); 1751 n = size; 1752 } 1753 catch_memory_errors = 0; 1754 return n; 1755 } 1756 1757 static int 1758 mwrite(unsigned long adrs, void *buf, int size) 1759 { 1760 volatile int n; 1761 char *p, *q; 1762 1763 n = 0; 1764 if (setjmp(bus_error_jmp) == 0) { 1765 catch_memory_errors = 1; 1766 sync(); 1767 p = (char *) adrs; 1768 q = (char *) buf; 1769 switch (size) { 1770 case 2: 1771 *(u16 *)p = *(u16 *)q; 1772 break; 1773 case 4: 1774 *(u32 *)p = *(u32 *)q; 1775 break; 1776 case 8: 1777 *(u64 *)p = *(u64 *)q; 1778 break; 1779 default: 1780 for ( ; n < size; ++n) { 1781 *p++ = *q++; 1782 sync(); 1783 } 1784 } 1785 sync(); 1786 /* wait a little while to see if we get a machine check */ 1787 __delay(200); 1788 n = size; 1789 } else { 1790 printf("*** Error writing address "REG"\n", adrs + n); 1791 } 1792 catch_memory_errors = 0; 1793 return n; 1794 } 1795 1796 static int fault_type; 1797 static int fault_except; 1798 static char *fault_chars[] = { "--", "**", "##" }; 1799 1800 static int handle_fault(struct pt_regs *regs) 1801 { 1802 fault_except = TRAP(regs); 1803 switch (TRAP(regs)) { 1804 case 0x200: 1805 fault_type = 0; 1806 break; 1807 case 0x300: 1808 case 0x380: 1809 fault_type = 1; 1810 break; 1811 default: 1812 fault_type = 2; 1813 } 1814 1815 longjmp(bus_error_jmp, 1); 1816 1817 return 0; 1818 } 1819 1820 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) 1821 1822 static void 1823 byterev(unsigned char *val, int size) 1824 { 1825 int t; 1826 1827 switch (size) { 1828 case 2: 1829 SWAP(val[0], val[1], t); 1830 break; 1831 case 4: 1832 SWAP(val[0], val[3], t); 1833 SWAP(val[1], val[2], t); 1834 break; 1835 case 8: /* is there really any use for this? */ 1836 SWAP(val[0], val[7], t); 1837 SWAP(val[1], val[6], t); 1838 SWAP(val[2], val[5], t); 1839 SWAP(val[3], val[4], t); 1840 break; 1841 } 1842 } 1843 1844 static int brev; 1845 static int mnoread; 1846 1847 static char *memex_help_string = 1848 "Memory examine command usage:\n" 1849 "m [addr] [flags] examine/change memory\n" 1850 " addr is optional. will start where left off.\n" 1851 " flags may include chars from this set:\n" 1852 " b modify by bytes (default)\n" 1853 " w modify by words (2 byte)\n" 1854 " l modify by longs (4 byte)\n" 1855 " d modify by doubleword (8 byte)\n" 1856 " r toggle reverse byte order mode\n" 1857 " n do not read memory (for i/o spaces)\n" 1858 " . ok to read (default)\n" 1859 "NOTE: flags are saved as defaults\n" 1860 ""; 1861 1862 static char *memex_subcmd_help_string = 1863 "Memory examine subcommands:\n" 1864 " hexval write this val to current location\n" 1865 " 'string' write chars from string to this location\n" 1866 " ' increment address\n" 1867 " ^ decrement address\n" 1868 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n" 1869 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n" 1870 " ` clear no-read flag\n" 1871 " ; stay at this addr\n" 1872 " v change to byte mode\n" 1873 " w change to word (2 byte) mode\n" 1874 " l change to long (4 byte) mode\n" 1875 " u change to doubleword (8 byte) mode\n" 1876 " m addr change current addr\n" 1877 " n toggle no-read flag\n" 1878 " r toggle byte reverse flag\n" 1879 " < count back up count bytes\n" 1880 " > count skip forward count bytes\n" 1881 " x exit this mode\n" 1882 ""; 1883 1884 static void 1885 memex(void) 1886 { 1887 int cmd, inc, i, nslash; 1888 unsigned long n; 1889 unsigned char val[16]; 1890 1891 scanhex((void *)&adrs); 1892 cmd = skipbl(); 1893 if (cmd == '?') { 1894 printf(memex_help_string); 1895 return; 1896 } else { 1897 termch = cmd; 1898 } 1899 last_cmd = "m\n"; 1900 while ((cmd = skipbl()) != '\n') { 1901 switch( cmd ){ 1902 case 'b': size = 1; break; 1903 case 'w': size = 2; break; 1904 case 'l': size = 4; break; 1905 case 'd': size = 8; break; 1906 case 'r': brev = !brev; break; 1907 case 'n': mnoread = 1; break; 1908 case '.': mnoread = 0; break; 1909 } 1910 } 1911 if( size <= 0 ) 1912 size = 1; 1913 else if( size > 8 ) 1914 size = 8; 1915 for(;;){ 1916 if (!mnoread) 1917 n = mread(adrs, val, size); 1918 printf(REG"%c", adrs, brev? 'r': ' '); 1919 if (!mnoread) { 1920 if (brev) 1921 byterev(val, size); 1922 putchar(' '); 1923 for (i = 0; i < n; ++i) 1924 printf("%.2x", val[i]); 1925 for (; i < size; ++i) 1926 printf("%s", fault_chars[fault_type]); 1927 } 1928 putchar(' '); 1929 inc = size; 1930 nslash = 0; 1931 for(;;){ 1932 if( scanhex(&n) ){ 1933 for (i = 0; i < size; ++i) 1934 val[i] = n >> (i * 8); 1935 if (!brev) 1936 byterev(val, size); 1937 mwrite(adrs, val, size); 1938 inc = size; 1939 } 1940 cmd = skipbl(); 1941 if (cmd == '\n') 1942 break; 1943 inc = 0; 1944 switch (cmd) { 1945 case '\'': 1946 for(;;){ 1947 n = inchar(); 1948 if( n == '\\' ) 1949 n = bsesc(); 1950 else if( n == '\'' ) 1951 break; 1952 for (i = 0; i < size; ++i) 1953 val[i] = n >> (i * 8); 1954 if (!brev) 1955 byterev(val, size); 1956 mwrite(adrs, val, size); 1957 adrs += size; 1958 } 1959 adrs -= size; 1960 inc = size; 1961 break; 1962 case ',': 1963 adrs += size; 1964 break; 1965 case '.': 1966 mnoread = 0; 1967 break; 1968 case ';': 1969 break; 1970 case 'x': 1971 case EOF: 1972 scannl(); 1973 return; 1974 case 'b': 1975 case 'v': 1976 size = 1; 1977 break; 1978 case 'w': 1979 size = 2; 1980 break; 1981 case 'l': 1982 size = 4; 1983 break; 1984 case 'u': 1985 size = 8; 1986 break; 1987 case '^': 1988 adrs -= size; 1989 break; 1990 case '/': 1991 if (nslash > 0) 1992 adrs -= 1 << nslash; 1993 else 1994 nslash = 0; 1995 nslash += 4; 1996 adrs += 1 << nslash; 1997 break; 1998 case '\\': 1999 if (nslash < 0) 2000 adrs += 1 << -nslash; 2001 else 2002 nslash = 0; 2003 nslash -= 4; 2004 adrs -= 1 << -nslash; 2005 break; 2006 case 'm': 2007 scanhex((void *)&adrs); 2008 break; 2009 case 'n': 2010 mnoread = 1; 2011 break; 2012 case 'r': 2013 brev = !brev; 2014 break; 2015 case '<': 2016 n = size; 2017 scanhex(&n); 2018 adrs -= n; 2019 break; 2020 case '>': 2021 n = size; 2022 scanhex(&n); 2023 adrs += n; 2024 break; 2025 case '?': 2026 printf(memex_subcmd_help_string); 2027 break; 2028 } 2029 } 2030 adrs += inc; 2031 } 2032 } 2033 2034 static int 2035 bsesc(void) 2036 { 2037 int c; 2038 2039 c = inchar(); 2040 switch( c ){ 2041 case 'n': c = '\n'; break; 2042 case 'r': c = '\r'; break; 2043 case 'b': c = '\b'; break; 2044 case 't': c = '\t'; break; 2045 } 2046 return c; 2047 } 2048 2049 static void xmon_rawdump (unsigned long adrs, long ndump) 2050 { 2051 long n, m, r, nr; 2052 unsigned char temp[16]; 2053 2054 for (n = ndump; n > 0;) { 2055 r = n < 16? n: 16; 2056 nr = mread(adrs, temp, r); 2057 adrs += nr; 2058 for (m = 0; m < r; ++m) { 2059 if (m < nr) 2060 printf("%.2x", temp[m]); 2061 else 2062 printf("%s", fault_chars[fault_type]); 2063 } 2064 n -= r; 2065 if (nr < r) 2066 break; 2067 } 2068 printf("\n"); 2069 } 2070 2071 #ifdef CONFIG_PPC64 2072 static void dump_one_paca(int cpu) 2073 { 2074 struct paca_struct *p; 2075 2076 if (setjmp(bus_error_jmp) != 0) { 2077 printf("*** Error dumping paca for cpu 0x%x!\n", cpu); 2078 return; 2079 } 2080 2081 catch_memory_errors = 1; 2082 sync(); 2083 2084 p = &paca[cpu]; 2085 2086 printf("paca for cpu 0x%x @ %p:\n", cpu, p); 2087 2088 printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no"); 2089 printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no"); 2090 printf(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no"); 2091 2092 #define DUMP(paca, name, format) \ 2093 printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \ 2094 offsetof(struct paca_struct, name)); 2095 2096 DUMP(p, lock_token, "x"); 2097 DUMP(p, paca_index, "x"); 2098 DUMP(p, kernel_toc, "lx"); 2099 DUMP(p, kernelbase, "lx"); 2100 DUMP(p, kernel_msr, "lx"); 2101 DUMP(p, emergency_sp, "p"); 2102 #ifdef CONFIG_PPC_BOOK3S_64 2103 DUMP(p, mc_emergency_sp, "p"); 2104 DUMP(p, in_mce, "x"); 2105 #endif 2106 DUMP(p, data_offset, "lx"); 2107 DUMP(p, hw_cpu_id, "x"); 2108 DUMP(p, cpu_start, "x"); 2109 DUMP(p, kexec_state, "x"); 2110 DUMP(p, __current, "p"); 2111 DUMP(p, kstack, "lx"); 2112 DUMP(p, stab_rr, "lx"); 2113 DUMP(p, saved_r1, "lx"); 2114 DUMP(p, trap_save, "x"); 2115 DUMP(p, soft_enabled, "x"); 2116 DUMP(p, irq_happened, "x"); 2117 DUMP(p, io_sync, "x"); 2118 DUMP(p, irq_work_pending, "x"); 2119 DUMP(p, nap_state_lost, "x"); 2120 2121 #undef DUMP 2122 2123 catch_memory_errors = 0; 2124 sync(); 2125 } 2126 2127 static void dump_all_pacas(void) 2128 { 2129 int cpu; 2130 2131 if (num_possible_cpus() == 0) { 2132 printf("No possible cpus, use 'dp #' to dump individual cpus\n"); 2133 return; 2134 } 2135 2136 for_each_possible_cpu(cpu) 2137 dump_one_paca(cpu); 2138 } 2139 2140 static void dump_pacas(void) 2141 { 2142 unsigned long num; 2143 int c; 2144 2145 c = inchar(); 2146 if (c == 'a') { 2147 dump_all_pacas(); 2148 return; 2149 } 2150 2151 termch = c; /* Put c back, it wasn't 'a' */ 2152 2153 if (scanhex(&num)) 2154 dump_one_paca(num); 2155 else 2156 dump_one_paca(xmon_owner); 2157 } 2158 #endif 2159 2160 static void 2161 dump(void) 2162 { 2163 int c; 2164 2165 c = inchar(); 2166 2167 #ifdef CONFIG_PPC64 2168 if (c == 'p') { 2169 dump_pacas(); 2170 return; 2171 } 2172 #endif 2173 2174 if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n') 2175 termch = c; 2176 scanhex((void *)&adrs); 2177 if (termch != '\n') 2178 termch = 0; 2179 if (c == 'i') { 2180 scanhex(&nidump); 2181 if (nidump == 0) 2182 nidump = 16; 2183 else if (nidump > MAX_DUMP) 2184 nidump = MAX_DUMP; 2185 adrs += ppc_inst_dump(adrs, nidump, 1); 2186 last_cmd = "di\n"; 2187 } else if (c == 'l') { 2188 dump_log_buf(); 2189 } else if (c == 'r') { 2190 scanhex(&ndump); 2191 if (ndump == 0) 2192 ndump = 64; 2193 xmon_rawdump(adrs, ndump); 2194 adrs += ndump; 2195 last_cmd = "dr\n"; 2196 } else { 2197 scanhex(&ndump); 2198 if (ndump == 0) 2199 ndump = 64; 2200 else if (ndump > MAX_DUMP) 2201 ndump = MAX_DUMP; 2202 prdump(adrs, ndump); 2203 adrs += ndump; 2204 last_cmd = "d\n"; 2205 } 2206 } 2207 2208 static void 2209 prdump(unsigned long adrs, long ndump) 2210 { 2211 long n, m, c, r, nr; 2212 unsigned char temp[16]; 2213 2214 for (n = ndump; n > 0;) { 2215 printf(REG, adrs); 2216 putchar(' '); 2217 r = n < 16? n: 16; 2218 nr = mread(adrs, temp, r); 2219 adrs += nr; 2220 for (m = 0; m < r; ++m) { 2221 if ((m & (sizeof(long) - 1)) == 0 && m > 0) 2222 putchar(' '); 2223 if (m < nr) 2224 printf("%.2x", temp[m]); 2225 else 2226 printf("%s", fault_chars[fault_type]); 2227 } 2228 for (; m < 16; ++m) { 2229 if ((m & (sizeof(long) - 1)) == 0) 2230 putchar(' '); 2231 printf(" "); 2232 } 2233 printf(" |"); 2234 for (m = 0; m < r; ++m) { 2235 if (m < nr) { 2236 c = temp[m]; 2237 putchar(' ' <= c && c <= '~'? c: '.'); 2238 } else 2239 putchar(' '); 2240 } 2241 n -= r; 2242 for (; m < 16; ++m) 2243 putchar(' '); 2244 printf("|\n"); 2245 if (nr < r) 2246 break; 2247 } 2248 } 2249 2250 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr); 2251 2252 static int 2253 generic_inst_dump(unsigned long adr, long count, int praddr, 2254 instruction_dump_func dump_func) 2255 { 2256 int nr, dotted; 2257 unsigned long first_adr; 2258 unsigned long inst, last_inst = 0; 2259 unsigned char val[4]; 2260 2261 dotted = 0; 2262 for (first_adr = adr; count > 0; --count, adr += 4) { 2263 nr = mread(adr, val, 4); 2264 if (nr == 0) { 2265 if (praddr) { 2266 const char *x = fault_chars[fault_type]; 2267 printf(REG" %s%s%s%s\n", adr, x, x, x, x); 2268 } 2269 break; 2270 } 2271 inst = GETWORD(val); 2272 if (adr > first_adr && inst == last_inst) { 2273 if (!dotted) { 2274 printf(" ...\n"); 2275 dotted = 1; 2276 } 2277 continue; 2278 } 2279 dotted = 0; 2280 last_inst = inst; 2281 if (praddr) 2282 printf(REG" %.8x", adr, inst); 2283 printf("\t"); 2284 dump_func(inst, adr); 2285 printf("\n"); 2286 } 2287 return adr - first_adr; 2288 } 2289 2290 static int 2291 ppc_inst_dump(unsigned long adr, long count, int praddr) 2292 { 2293 return generic_inst_dump(adr, count, praddr, print_insn_powerpc); 2294 } 2295 2296 void 2297 print_address(unsigned long addr) 2298 { 2299 xmon_print_symbol(addr, "\t# ", ""); 2300 } 2301 2302 void 2303 dump_log_buf(void) 2304 { 2305 struct kmsg_dumper dumper = { .active = 1 }; 2306 unsigned char buf[128]; 2307 size_t len; 2308 2309 if (setjmp(bus_error_jmp) != 0) { 2310 printf("Error dumping printk buffer!\n"); 2311 return; 2312 } 2313 2314 catch_memory_errors = 1; 2315 sync(); 2316 2317 kmsg_dump_rewind_nolock(&dumper); 2318 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) { 2319 buf[len] = '\0'; 2320 printf("%s", buf); 2321 } 2322 2323 sync(); 2324 /* wait a little while to see if we get a machine check */ 2325 __delay(200); 2326 catch_memory_errors = 0; 2327 } 2328 2329 /* 2330 * Memory operations - move, set, print differences 2331 */ 2332 static unsigned long mdest; /* destination address */ 2333 static unsigned long msrc; /* source address */ 2334 static unsigned long mval; /* byte value to set memory to */ 2335 static unsigned long mcount; /* # bytes to affect */ 2336 static unsigned long mdiffs; /* max # differences to print */ 2337 2338 static void 2339 memops(int cmd) 2340 { 2341 scanhex((void *)&mdest); 2342 if( termch != '\n' ) 2343 termch = 0; 2344 scanhex((void *)(cmd == 's'? &mval: &msrc)); 2345 if( termch != '\n' ) 2346 termch = 0; 2347 scanhex((void *)&mcount); 2348 switch( cmd ){ 2349 case 'm': 2350 memmove((void *)mdest, (void *)msrc, mcount); 2351 break; 2352 case 's': 2353 memset((void *)mdest, mval, mcount); 2354 break; 2355 case 'd': 2356 if( termch != '\n' ) 2357 termch = 0; 2358 scanhex((void *)&mdiffs); 2359 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs); 2360 break; 2361 } 2362 } 2363 2364 static void 2365 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr) 2366 { 2367 unsigned n, prt; 2368 2369 prt = 0; 2370 for( n = nb; n > 0; --n ) 2371 if( *p1++ != *p2++ ) 2372 if( ++prt <= maxpr ) 2373 printf("%.16x %.2x # %.16x %.2x\n", p1 - 1, 2374 p1[-1], p2 - 1, p2[-1]); 2375 if( prt > maxpr ) 2376 printf("Total of %d differences\n", prt); 2377 } 2378 2379 static unsigned mend; 2380 static unsigned mask; 2381 2382 static void 2383 memlocate(void) 2384 { 2385 unsigned a, n; 2386 unsigned char val[4]; 2387 2388 last_cmd = "ml"; 2389 scanhex((void *)&mdest); 2390 if (termch != '\n') { 2391 termch = 0; 2392 scanhex((void *)&mend); 2393 if (termch != '\n') { 2394 termch = 0; 2395 scanhex((void *)&mval); 2396 mask = ~0; 2397 if (termch != '\n') termch = 0; 2398 scanhex((void *)&mask); 2399 } 2400 } 2401 n = 0; 2402 for (a = mdest; a < mend; a += 4) { 2403 if (mread(a, val, 4) == 4 2404 && ((GETWORD(val) ^ mval) & mask) == 0) { 2405 printf("%.16x: %.16x\n", a, GETWORD(val)); 2406 if (++n >= 10) 2407 break; 2408 } 2409 } 2410 } 2411 2412 static unsigned long mskip = 0x1000; 2413 static unsigned long mlim = 0xffffffff; 2414 2415 static void 2416 memzcan(void) 2417 { 2418 unsigned char v; 2419 unsigned a; 2420 int ok, ook; 2421 2422 scanhex(&mdest); 2423 if (termch != '\n') termch = 0; 2424 scanhex(&mskip); 2425 if (termch != '\n') termch = 0; 2426 scanhex(&mlim); 2427 ook = 0; 2428 for (a = mdest; a < mlim; a += mskip) { 2429 ok = mread(a, &v, 1); 2430 if (ok && !ook) { 2431 printf("%.8x .. ", a); 2432 } else if (!ok && ook) 2433 printf("%.8x\n", a - mskip); 2434 ook = ok; 2435 if (a + mskip < a) 2436 break; 2437 } 2438 if (ook) 2439 printf("%.8x\n", a - mskip); 2440 } 2441 2442 static void proccall(void) 2443 { 2444 unsigned long args[8]; 2445 unsigned long ret; 2446 int i; 2447 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long, 2448 unsigned long, unsigned long, unsigned long, 2449 unsigned long, unsigned long, unsigned long); 2450 callfunc_t func; 2451 2452 if (!scanhex(&adrs)) 2453 return; 2454 if (termch != '\n') 2455 termch = 0; 2456 for (i = 0; i < 8; ++i) 2457 args[i] = 0; 2458 for (i = 0; i < 8; ++i) { 2459 if (!scanhex(&args[i]) || termch == '\n') 2460 break; 2461 termch = 0; 2462 } 2463 func = (callfunc_t) adrs; 2464 ret = 0; 2465 if (setjmp(bus_error_jmp) == 0) { 2466 catch_memory_errors = 1; 2467 sync(); 2468 ret = func(args[0], args[1], args[2], args[3], 2469 args[4], args[5], args[6], args[7]); 2470 sync(); 2471 printf("return value is 0x%lx\n", ret); 2472 } else { 2473 printf("*** %x exception occurred\n", fault_except); 2474 } 2475 catch_memory_errors = 0; 2476 } 2477 2478 /* Input scanning routines */ 2479 int 2480 skipbl(void) 2481 { 2482 int c; 2483 2484 if( termch != 0 ){ 2485 c = termch; 2486 termch = 0; 2487 } else 2488 c = inchar(); 2489 while( c == ' ' || c == '\t' ) 2490 c = inchar(); 2491 return c; 2492 } 2493 2494 #define N_PTREGS 44 2495 static char *regnames[N_PTREGS] = { 2496 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 2497 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 2498 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 2499 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", 2500 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr", 2501 #ifdef CONFIG_PPC64 2502 "softe", 2503 #else 2504 "mq", 2505 #endif 2506 "trap", "dar", "dsisr", "res" 2507 }; 2508 2509 int 2510 scanhex(unsigned long *vp) 2511 { 2512 int c, d; 2513 unsigned long v; 2514 2515 c = skipbl(); 2516 if (c == '%') { 2517 /* parse register name */ 2518 char regname[8]; 2519 int i; 2520 2521 for (i = 0; i < sizeof(regname) - 1; ++i) { 2522 c = inchar(); 2523 if (!isalnum(c)) { 2524 termch = c; 2525 break; 2526 } 2527 regname[i] = c; 2528 } 2529 regname[i] = 0; 2530 for (i = 0; i < N_PTREGS; ++i) { 2531 if (strcmp(regnames[i], regname) == 0) { 2532 if (xmon_regs == NULL) { 2533 printf("regs not available\n"); 2534 return 0; 2535 } 2536 *vp = ((unsigned long *)xmon_regs)[i]; 2537 return 1; 2538 } 2539 } 2540 printf("invalid register name '%%%s'\n", regname); 2541 return 0; 2542 } 2543 2544 /* skip leading "0x" if any */ 2545 2546 if (c == '0') { 2547 c = inchar(); 2548 if (c == 'x') { 2549 c = inchar(); 2550 } else { 2551 d = hexdigit(c); 2552 if (d == EOF) { 2553 termch = c; 2554 *vp = 0; 2555 return 1; 2556 } 2557 } 2558 } else if (c == '$') { 2559 int i; 2560 for (i=0; i<63; i++) { 2561 c = inchar(); 2562 if (isspace(c) || c == '\0') { 2563 termch = c; 2564 break; 2565 } 2566 tmpstr[i] = c; 2567 } 2568 tmpstr[i++] = 0; 2569 *vp = 0; 2570 if (setjmp(bus_error_jmp) == 0) { 2571 catch_memory_errors = 1; 2572 sync(); 2573 *vp = kallsyms_lookup_name(tmpstr); 2574 sync(); 2575 } 2576 catch_memory_errors = 0; 2577 if (!(*vp)) { 2578 printf("unknown symbol '%s'\n", tmpstr); 2579 return 0; 2580 } 2581 return 1; 2582 } 2583 2584 d = hexdigit(c); 2585 if (d == EOF) { 2586 termch = c; 2587 return 0; 2588 } 2589 v = 0; 2590 do { 2591 v = (v << 4) + d; 2592 c = inchar(); 2593 d = hexdigit(c); 2594 } while (d != EOF); 2595 termch = c; 2596 *vp = v; 2597 return 1; 2598 } 2599 2600 static void 2601 scannl(void) 2602 { 2603 int c; 2604 2605 c = termch; 2606 termch = 0; 2607 while( c != '\n' ) 2608 c = inchar(); 2609 } 2610 2611 static int hexdigit(int c) 2612 { 2613 if( '0' <= c && c <= '9' ) 2614 return c - '0'; 2615 if( 'A' <= c && c <= 'F' ) 2616 return c - ('A' - 10); 2617 if( 'a' <= c && c <= 'f' ) 2618 return c - ('a' - 10); 2619 return EOF; 2620 } 2621 2622 void 2623 getstring(char *s, int size) 2624 { 2625 int c; 2626 2627 c = skipbl(); 2628 do { 2629 if( size > 1 ){ 2630 *s++ = c; 2631 --size; 2632 } 2633 c = inchar(); 2634 } while( c != ' ' && c != '\t' && c != '\n' ); 2635 termch = c; 2636 *s = 0; 2637 } 2638 2639 static char line[256]; 2640 static char *lineptr; 2641 2642 static void 2643 flush_input(void) 2644 { 2645 lineptr = NULL; 2646 } 2647 2648 static int 2649 inchar(void) 2650 { 2651 if (lineptr == NULL || *lineptr == 0) { 2652 if (xmon_gets(line, sizeof(line)) == NULL) { 2653 lineptr = NULL; 2654 return EOF; 2655 } 2656 lineptr = line; 2657 } 2658 return *lineptr++; 2659 } 2660 2661 static void 2662 take_input(char *str) 2663 { 2664 lineptr = str; 2665 } 2666 2667 2668 static void 2669 symbol_lookup(void) 2670 { 2671 int type = inchar(); 2672 unsigned long addr; 2673 static char tmp[64]; 2674 2675 switch (type) { 2676 case 'a': 2677 if (scanhex(&addr)) 2678 xmon_print_symbol(addr, ": ", "\n"); 2679 termch = 0; 2680 break; 2681 case 's': 2682 getstring(tmp, 64); 2683 if (setjmp(bus_error_jmp) == 0) { 2684 catch_memory_errors = 1; 2685 sync(); 2686 addr = kallsyms_lookup_name(tmp); 2687 if (addr) 2688 printf("%s: %lx\n", tmp, addr); 2689 else 2690 printf("Symbol '%s' not found.\n", tmp); 2691 sync(); 2692 } 2693 catch_memory_errors = 0; 2694 termch = 0; 2695 break; 2696 } 2697 } 2698 2699 2700 /* Print an address in numeric and symbolic form (if possible) */ 2701 static void xmon_print_symbol(unsigned long address, const char *mid, 2702 const char *after) 2703 { 2704 char *modname; 2705 const char *name = NULL; 2706 unsigned long offset, size; 2707 2708 printf(REG, address); 2709 if (setjmp(bus_error_jmp) == 0) { 2710 catch_memory_errors = 1; 2711 sync(); 2712 name = kallsyms_lookup(address, &size, &offset, &modname, 2713 tmpstr); 2714 sync(); 2715 /* wait a little while to see if we get a machine check */ 2716 __delay(200); 2717 } 2718 2719 catch_memory_errors = 0; 2720 2721 if (name) { 2722 printf("%s%s+%#lx/%#lx", mid, name, offset, size); 2723 if (modname) 2724 printf(" [%s]", modname); 2725 } 2726 printf("%s", after); 2727 } 2728 2729 #ifdef CONFIG_PPC_BOOK3S_64 2730 void dump_segments(void) 2731 { 2732 int i; 2733 unsigned long esid,vsid; 2734 unsigned long llp; 2735 2736 printf("SLB contents of cpu 0x%x\n", smp_processor_id()); 2737 2738 for (i = 0; i < mmu_slb_size; i++) { 2739 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i)); 2740 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i)); 2741 if (esid || vsid) { 2742 printf("%02d %016lx %016lx", i, esid, vsid); 2743 if (esid & SLB_ESID_V) { 2744 llp = vsid & SLB_VSID_LLP; 2745 if (vsid & SLB_VSID_B_1T) { 2746 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n", 2747 GET_ESID_1T(esid), 2748 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T, 2749 llp); 2750 } else { 2751 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n", 2752 GET_ESID(esid), 2753 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT, 2754 llp); 2755 } 2756 } else 2757 printf("\n"); 2758 } 2759 } 2760 } 2761 #endif 2762 2763 #ifdef CONFIG_PPC_STD_MMU_32 2764 void dump_segments(void) 2765 { 2766 int i; 2767 2768 printf("sr0-15 ="); 2769 for (i = 0; i < 16; ++i) 2770 printf(" %x", mfsrin(i)); 2771 printf("\n"); 2772 } 2773 #endif 2774 2775 #ifdef CONFIG_44x 2776 static void dump_tlb_44x(void) 2777 { 2778 int i; 2779 2780 for (i = 0; i < PPC44x_TLB_SIZE; i++) { 2781 unsigned long w0,w1,w2; 2782 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i)); 2783 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i)); 2784 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i)); 2785 printf("[%02x] %08x %08x %08x ", i, w0, w1, w2); 2786 if (w0 & PPC44x_TLB_VALID) { 2787 printf("V %08x -> %01x%08x %c%c%c%c%c", 2788 w0 & PPC44x_TLB_EPN_MASK, 2789 w1 & PPC44x_TLB_ERPN_MASK, 2790 w1 & PPC44x_TLB_RPN_MASK, 2791 (w2 & PPC44x_TLB_W) ? 'W' : 'w', 2792 (w2 & PPC44x_TLB_I) ? 'I' : 'i', 2793 (w2 & PPC44x_TLB_M) ? 'M' : 'm', 2794 (w2 & PPC44x_TLB_G) ? 'G' : 'g', 2795 (w2 & PPC44x_TLB_E) ? 'E' : 'e'); 2796 } 2797 printf("\n"); 2798 } 2799 } 2800 #endif /* CONFIG_44x */ 2801 2802 #ifdef CONFIG_PPC_BOOK3E 2803 static void dump_tlb_book3e(void) 2804 { 2805 u32 mmucfg, pidmask, lpidmask; 2806 u64 ramask; 2807 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0; 2808 int mmu_version; 2809 static const char *pgsz_names[] = { 2810 " 1K", 2811 " 2K", 2812 " 4K", 2813 " 8K", 2814 " 16K", 2815 " 32K", 2816 " 64K", 2817 "128K", 2818 "256K", 2819 "512K", 2820 " 1M", 2821 " 2M", 2822 " 4M", 2823 " 8M", 2824 " 16M", 2825 " 32M", 2826 " 64M", 2827 "128M", 2828 "256M", 2829 "512M", 2830 " 1G", 2831 " 2G", 2832 " 4G", 2833 " 8G", 2834 " 16G", 2835 " 32G", 2836 " 64G", 2837 "128G", 2838 "256G", 2839 "512G", 2840 " 1T", 2841 " 2T", 2842 }; 2843 2844 /* Gather some infos about the MMU */ 2845 mmucfg = mfspr(SPRN_MMUCFG); 2846 mmu_version = (mmucfg & 3) + 1; 2847 ntlbs = ((mmucfg >> 2) & 3) + 1; 2848 pidsz = ((mmucfg >> 6) & 0x1f) + 1; 2849 lpidsz = (mmucfg >> 24) & 0xf; 2850 rasz = (mmucfg >> 16) & 0x7f; 2851 if ((mmu_version > 1) && (mmucfg & 0x10000)) 2852 lrat = 1; 2853 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n", 2854 mmu_version, ntlbs, pidsz, lpidsz, rasz); 2855 pidmask = (1ul << pidsz) - 1; 2856 lpidmask = (1ul << lpidsz) - 1; 2857 ramask = (1ull << rasz) - 1; 2858 2859 for (tlb = 0; tlb < ntlbs; tlb++) { 2860 u32 tlbcfg; 2861 int nent, assoc, new_cc = 1; 2862 printf("TLB %d:\n------\n", tlb); 2863 switch(tlb) { 2864 case 0: 2865 tlbcfg = mfspr(SPRN_TLB0CFG); 2866 break; 2867 case 1: 2868 tlbcfg = mfspr(SPRN_TLB1CFG); 2869 break; 2870 case 2: 2871 tlbcfg = mfspr(SPRN_TLB2CFG); 2872 break; 2873 case 3: 2874 tlbcfg = mfspr(SPRN_TLB3CFG); 2875 break; 2876 default: 2877 printf("Unsupported TLB number !\n"); 2878 continue; 2879 } 2880 nent = tlbcfg & 0xfff; 2881 assoc = (tlbcfg >> 24) & 0xff; 2882 for (i = 0; i < nent; i++) { 2883 u32 mas0 = MAS0_TLBSEL(tlb); 2884 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K); 2885 u64 mas2 = 0; 2886 u64 mas7_mas3; 2887 int esel = i, cc = i; 2888 2889 if (assoc != 0) { 2890 cc = i / assoc; 2891 esel = i % assoc; 2892 mas2 = cc * 0x1000; 2893 } 2894 2895 mas0 |= MAS0_ESEL(esel); 2896 mtspr(SPRN_MAS0, mas0); 2897 mtspr(SPRN_MAS1, mas1); 2898 mtspr(SPRN_MAS2, mas2); 2899 asm volatile("tlbre 0,0,0" : : : "memory"); 2900 mas1 = mfspr(SPRN_MAS1); 2901 mas2 = mfspr(SPRN_MAS2); 2902 mas7_mas3 = mfspr(SPRN_MAS7_MAS3); 2903 if (assoc && (i % assoc) == 0) 2904 new_cc = 1; 2905 if (!(mas1 & MAS1_VALID)) 2906 continue; 2907 if (assoc == 0) 2908 printf("%04x- ", i); 2909 else if (new_cc) 2910 printf("%04x-%c", cc, 'A' + esel); 2911 else 2912 printf(" |%c", 'A' + esel); 2913 new_cc = 0; 2914 printf(" %016llx %04x %s %c%c AS%c", 2915 mas2 & ~0x3ffull, 2916 (mas1 >> 16) & 0x3fff, 2917 pgsz_names[(mas1 >> 7) & 0x1f], 2918 mas1 & MAS1_IND ? 'I' : ' ', 2919 mas1 & MAS1_IPROT ? 'P' : ' ', 2920 mas1 & MAS1_TS ? '1' : '0'); 2921 printf(" %c%c%c%c%c%c%c", 2922 mas2 & MAS2_X0 ? 'a' : ' ', 2923 mas2 & MAS2_X1 ? 'v' : ' ', 2924 mas2 & MAS2_W ? 'w' : ' ', 2925 mas2 & MAS2_I ? 'i' : ' ', 2926 mas2 & MAS2_M ? 'm' : ' ', 2927 mas2 & MAS2_G ? 'g' : ' ', 2928 mas2 & MAS2_E ? 'e' : ' '); 2929 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull); 2930 if (mas1 & MAS1_IND) 2931 printf(" %s\n", 2932 pgsz_names[(mas7_mas3 >> 1) & 0x1f]); 2933 else 2934 printf(" U%c%c%c S%c%c%c\n", 2935 mas7_mas3 & MAS3_UX ? 'x' : ' ', 2936 mas7_mas3 & MAS3_UW ? 'w' : ' ', 2937 mas7_mas3 & MAS3_UR ? 'r' : ' ', 2938 mas7_mas3 & MAS3_SX ? 'x' : ' ', 2939 mas7_mas3 & MAS3_SW ? 'w' : ' ', 2940 mas7_mas3 & MAS3_SR ? 'r' : ' '); 2941 } 2942 } 2943 } 2944 #endif /* CONFIG_PPC_BOOK3E */ 2945 2946 static void xmon_init(int enable) 2947 { 2948 if (enable) { 2949 __debugger = xmon; 2950 __debugger_ipi = xmon_ipi; 2951 __debugger_bpt = xmon_bpt; 2952 __debugger_sstep = xmon_sstep; 2953 __debugger_iabr_match = xmon_iabr_match; 2954 __debugger_break_match = xmon_break_match; 2955 __debugger_fault_handler = xmon_fault_handler; 2956 } else { 2957 __debugger = NULL; 2958 __debugger_ipi = NULL; 2959 __debugger_bpt = NULL; 2960 __debugger_sstep = NULL; 2961 __debugger_iabr_match = NULL; 2962 __debugger_break_match = NULL; 2963 __debugger_fault_handler = NULL; 2964 } 2965 } 2966 2967 #ifdef CONFIG_MAGIC_SYSRQ 2968 static void sysrq_handle_xmon(int key) 2969 { 2970 /* ensure xmon is enabled */ 2971 xmon_init(1); 2972 debugger(get_irq_regs()); 2973 } 2974 2975 static struct sysrq_key_op sysrq_xmon_op = { 2976 .handler = sysrq_handle_xmon, 2977 .help_msg = "xmon(x)", 2978 .action_msg = "Entering xmon", 2979 }; 2980 2981 static int __init setup_xmon_sysrq(void) 2982 { 2983 register_sysrq_key('x', &sysrq_xmon_op); 2984 return 0; 2985 } 2986 __initcall(setup_xmon_sysrq); 2987 #endif /* CONFIG_MAGIC_SYSRQ */ 2988 2989 static int __initdata xmon_early, xmon_off; 2990 2991 static int __init early_parse_xmon(char *p) 2992 { 2993 if (!p || strncmp(p, "early", 5) == 0) { 2994 /* just "xmon" is equivalent to "xmon=early" */ 2995 xmon_init(1); 2996 xmon_early = 1; 2997 } else if (strncmp(p, "on", 2) == 0) 2998 xmon_init(1); 2999 else if (strncmp(p, "off", 3) == 0) 3000 xmon_off = 1; 3001 else if (strncmp(p, "nobt", 4) == 0) 3002 xmon_no_auto_backtrace = 1; 3003 else 3004 return 1; 3005 3006 return 0; 3007 } 3008 early_param("xmon", early_parse_xmon); 3009 3010 void __init xmon_setup(void) 3011 { 3012 #ifdef CONFIG_XMON_DEFAULT 3013 if (!xmon_off) 3014 xmon_init(1); 3015 #endif 3016 if (xmon_early) 3017 debugger(NULL); 3018 } 3019 3020 #ifdef CONFIG_SPU_BASE 3021 3022 struct spu_info { 3023 struct spu *spu; 3024 u64 saved_mfc_sr1_RW; 3025 u32 saved_spu_runcntl_RW; 3026 unsigned long dump_addr; 3027 u8 stopped_ok; 3028 }; 3029 3030 #define XMON_NUM_SPUS 16 /* Enough for current hardware */ 3031 3032 static struct spu_info spu_info[XMON_NUM_SPUS]; 3033 3034 void xmon_register_spus(struct list_head *list) 3035 { 3036 struct spu *spu; 3037 3038 list_for_each_entry(spu, list, full_list) { 3039 if (spu->number >= XMON_NUM_SPUS) { 3040 WARN_ON(1); 3041 continue; 3042 } 3043 3044 spu_info[spu->number].spu = spu; 3045 spu_info[spu->number].stopped_ok = 0; 3046 spu_info[spu->number].dump_addr = (unsigned long) 3047 spu_info[spu->number].spu->local_store; 3048 } 3049 } 3050 3051 static void stop_spus(void) 3052 { 3053 struct spu *spu; 3054 int i; 3055 u64 tmp; 3056 3057 for (i = 0; i < XMON_NUM_SPUS; i++) { 3058 if (!spu_info[i].spu) 3059 continue; 3060 3061 if (setjmp(bus_error_jmp) == 0) { 3062 catch_memory_errors = 1; 3063 sync(); 3064 3065 spu = spu_info[i].spu; 3066 3067 spu_info[i].saved_spu_runcntl_RW = 3068 in_be32(&spu->problem->spu_runcntl_RW); 3069 3070 tmp = spu_mfc_sr1_get(spu); 3071 spu_info[i].saved_mfc_sr1_RW = tmp; 3072 3073 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK; 3074 spu_mfc_sr1_set(spu, tmp); 3075 3076 sync(); 3077 __delay(200); 3078 3079 spu_info[i].stopped_ok = 1; 3080 3081 printf("Stopped spu %.2d (was %s)\n", i, 3082 spu_info[i].saved_spu_runcntl_RW ? 3083 "running" : "stopped"); 3084 } else { 3085 catch_memory_errors = 0; 3086 printf("*** Error stopping spu %.2d\n", i); 3087 } 3088 catch_memory_errors = 0; 3089 } 3090 } 3091 3092 static void restart_spus(void) 3093 { 3094 struct spu *spu; 3095 int i; 3096 3097 for (i = 0; i < XMON_NUM_SPUS; i++) { 3098 if (!spu_info[i].spu) 3099 continue; 3100 3101 if (!spu_info[i].stopped_ok) { 3102 printf("*** Error, spu %d was not successfully stopped" 3103 ", not restarting\n", i); 3104 continue; 3105 } 3106 3107 if (setjmp(bus_error_jmp) == 0) { 3108 catch_memory_errors = 1; 3109 sync(); 3110 3111 spu = spu_info[i].spu; 3112 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW); 3113 out_be32(&spu->problem->spu_runcntl_RW, 3114 spu_info[i].saved_spu_runcntl_RW); 3115 3116 sync(); 3117 __delay(200); 3118 3119 printf("Restarted spu %.2d\n", i); 3120 } else { 3121 catch_memory_errors = 0; 3122 printf("*** Error restarting spu %.2d\n", i); 3123 } 3124 catch_memory_errors = 0; 3125 } 3126 } 3127 3128 #define DUMP_WIDTH 23 3129 #define DUMP_VALUE(format, field, value) \ 3130 do { \ 3131 if (setjmp(bus_error_jmp) == 0) { \ 3132 catch_memory_errors = 1; \ 3133 sync(); \ 3134 printf(" %-*s = "format"\n", DUMP_WIDTH, \ 3135 #field, value); \ 3136 sync(); \ 3137 __delay(200); \ 3138 } else { \ 3139 catch_memory_errors = 0; \ 3140 printf(" %-*s = *** Error reading field.\n", \ 3141 DUMP_WIDTH, #field); \ 3142 } \ 3143 catch_memory_errors = 0; \ 3144 } while (0) 3145 3146 #define DUMP_FIELD(obj, format, field) \ 3147 DUMP_VALUE(format, field, obj->field) 3148 3149 static void dump_spu_fields(struct spu *spu) 3150 { 3151 printf("Dumping spu fields at address %p:\n", spu); 3152 3153 DUMP_FIELD(spu, "0x%x", number); 3154 DUMP_FIELD(spu, "%s", name); 3155 DUMP_FIELD(spu, "0x%lx", local_store_phys); 3156 DUMP_FIELD(spu, "0x%p", local_store); 3157 DUMP_FIELD(spu, "0x%lx", ls_size); 3158 DUMP_FIELD(spu, "0x%x", node); 3159 DUMP_FIELD(spu, "0x%lx", flags); 3160 DUMP_FIELD(spu, "%d", class_0_pending); 3161 DUMP_FIELD(spu, "0x%lx", class_0_dar); 3162 DUMP_FIELD(spu, "0x%lx", class_1_dar); 3163 DUMP_FIELD(spu, "0x%lx", class_1_dsisr); 3164 DUMP_FIELD(spu, "0x%lx", irqs[0]); 3165 DUMP_FIELD(spu, "0x%lx", irqs[1]); 3166 DUMP_FIELD(spu, "0x%lx", irqs[2]); 3167 DUMP_FIELD(spu, "0x%x", slb_replace); 3168 DUMP_FIELD(spu, "%d", pid); 3169 DUMP_FIELD(spu, "0x%p", mm); 3170 DUMP_FIELD(spu, "0x%p", ctx); 3171 DUMP_FIELD(spu, "0x%p", rq); 3172 DUMP_FIELD(spu, "0x%p", timestamp); 3173 DUMP_FIELD(spu, "0x%lx", problem_phys); 3174 DUMP_FIELD(spu, "0x%p", problem); 3175 DUMP_VALUE("0x%x", problem->spu_runcntl_RW, 3176 in_be32(&spu->problem->spu_runcntl_RW)); 3177 DUMP_VALUE("0x%x", problem->spu_status_R, 3178 in_be32(&spu->problem->spu_status_R)); 3179 DUMP_VALUE("0x%x", problem->spu_npc_RW, 3180 in_be32(&spu->problem->spu_npc_RW)); 3181 DUMP_FIELD(spu, "0x%p", priv2); 3182 DUMP_FIELD(spu, "0x%p", pdata); 3183 } 3184 3185 int 3186 spu_inst_dump(unsigned long adr, long count, int praddr) 3187 { 3188 return generic_inst_dump(adr, count, praddr, print_insn_spu); 3189 } 3190 3191 static void dump_spu_ls(unsigned long num, int subcmd) 3192 { 3193 unsigned long offset, addr, ls_addr; 3194 3195 if (setjmp(bus_error_jmp) == 0) { 3196 catch_memory_errors = 1; 3197 sync(); 3198 ls_addr = (unsigned long)spu_info[num].spu->local_store; 3199 sync(); 3200 __delay(200); 3201 } else { 3202 catch_memory_errors = 0; 3203 printf("*** Error: accessing spu info for spu %d\n", num); 3204 return; 3205 } 3206 catch_memory_errors = 0; 3207 3208 if (scanhex(&offset)) 3209 addr = ls_addr + offset; 3210 else 3211 addr = spu_info[num].dump_addr; 3212 3213 if (addr >= ls_addr + LS_SIZE) { 3214 printf("*** Error: address outside of local store\n"); 3215 return; 3216 } 3217 3218 switch (subcmd) { 3219 case 'i': 3220 addr += spu_inst_dump(addr, 16, 1); 3221 last_cmd = "sdi\n"; 3222 break; 3223 default: 3224 prdump(addr, 64); 3225 addr += 64; 3226 last_cmd = "sd\n"; 3227 break; 3228 } 3229 3230 spu_info[num].dump_addr = addr; 3231 } 3232 3233 static int do_spu_cmd(void) 3234 { 3235 static unsigned long num = 0; 3236 int cmd, subcmd = 0; 3237 3238 cmd = inchar(); 3239 switch (cmd) { 3240 case 's': 3241 stop_spus(); 3242 break; 3243 case 'r': 3244 restart_spus(); 3245 break; 3246 case 'd': 3247 subcmd = inchar(); 3248 if (isxdigit(subcmd) || subcmd == '\n') 3249 termch = subcmd; 3250 case 'f': 3251 scanhex(&num); 3252 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) { 3253 printf("*** Error: invalid spu number\n"); 3254 return 0; 3255 } 3256 3257 switch (cmd) { 3258 case 'f': 3259 dump_spu_fields(spu_info[num].spu); 3260 break; 3261 default: 3262 dump_spu_ls(num, subcmd); 3263 break; 3264 } 3265 3266 break; 3267 default: 3268 return -1; 3269 } 3270 3271 return 0; 3272 } 3273 #else /* ! CONFIG_SPU_BASE */ 3274 static int do_spu_cmd(void) 3275 { 3276 return -1; 3277 } 3278 #endif 3279