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