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