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