WIP FPC-III support
[linux/fpc-iii.git] / arch / powerpc / xmon / xmon.c
blobdcd817ca2edfdc321fc15d54895a31de149999d6
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Routines providing a simple monitor for use on the PowerMac.
5 * Copyright (C) 1996-2005 Paul Mackerras.
6 * Copyright (C) 2001 PPC64 Team, IBM Corp
7 * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
8 */
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/sched/signal.h>
13 #include <linux/smp.h>
14 #include <linux/mm.h>
15 #include <linux/reboot.h>
16 #include <linux/delay.h>
17 #include <linux/kallsyms.h>
18 #include <linux/kmsg_dump.h>
19 #include <linux/cpumask.h>
20 #include <linux/export.h>
21 #include <linux/sysrq.h>
22 #include <linux/interrupt.h>
23 #include <linux/irq.h>
24 #include <linux/bug.h>
25 #include <linux/nmi.h>
26 #include <linux/ctype.h>
27 #include <linux/highmem.h>
28 #include <linux/security.h>
30 #include <asm/debugfs.h>
31 #include <asm/ptrace.h>
32 #include <asm/smp.h>
33 #include <asm/string.h>
34 #include <asm/prom.h>
35 #include <asm/machdep.h>
36 #include <asm/xmon.h>
37 #include <asm/processor.h>
38 #include <asm/mmu.h>
39 #include <asm/mmu_context.h>
40 #include <asm/plpar_wrappers.h>
41 #include <asm/cputable.h>
42 #include <asm/rtas.h>
43 #include <asm/sstep.h>
44 #include <asm/irq_regs.h>
45 #include <asm/spu.h>
46 #include <asm/spu_priv1.h>
47 #include <asm/setjmp.h>
48 #include <asm/reg.h>
49 #include <asm/debug.h>
50 #include <asm/hw_breakpoint.h>
51 #include <asm/xive.h>
52 #include <asm/opal.h>
53 #include <asm/firmware.h>
54 #include <asm/code-patching.h>
55 #include <asm/sections.h>
56 #include <asm/inst.h>
58 #ifdef CONFIG_PPC64
59 #include <asm/hvcall.h>
60 #include <asm/paca.h>
61 #endif
63 #include "nonstdio.h"
64 #include "dis-asm.h"
65 #include "xmon_bpts.h"
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 */
76 #ifdef CONFIG_PPC_PSERIES
77 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
78 #endif
79 static unsigned long in_xmon __read_mostly = 0;
80 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
81 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
83 static unsigned long adrs;
84 static int size = 1;
85 #define MAX_DUMP (64 * 1024)
86 static unsigned long ndump = 64;
87 #define MAX_IDUMP (MAX_DUMP >> 2)
88 static unsigned long nidump = 16;
89 static unsigned long ncsum = 4096;
90 static int termch;
91 static char tmpstr[128];
92 static int tracing_enabled;
94 static long bus_error_jmp[JMP_BUF_LEN];
95 static int catch_memory_errors;
96 static int catch_spr_faults;
97 static long *xmon_fault_jmp[NR_CPUS];
99 /* Breakpoint stuff */
100 struct bpt {
101 unsigned long address;
102 struct ppc_inst *instr;
103 atomic_t ref_count;
104 int enabled;
105 unsigned long pad;
108 /* Bits in bpt.enabled */
109 #define BP_CIABR 1
110 #define BP_TRAP 2
111 #define BP_DABR 4
113 static struct bpt bpts[NBPTS];
114 static struct bpt dabr[HBP_NUM_MAX];
115 static struct bpt *iabr;
116 static unsigned bpinstr = 0x7fe00008; /* trap */
118 #define BP_NUM(bp) ((bp) - bpts + 1)
120 /* Prototypes */
121 static int cmds(struct pt_regs *);
122 static int mread(unsigned long, void *, int);
123 static int mwrite(unsigned long, void *, int);
124 static int mread_instr(unsigned long, struct ppc_inst *);
125 static int handle_fault(struct pt_regs *);
126 static void byterev(unsigned char *, int);
127 static void memex(void);
128 static int bsesc(void);
129 static void dump(void);
130 static void show_pte(unsigned long);
131 static void prdump(unsigned long, long);
132 static int ppc_inst_dump(unsigned long, long, int);
133 static void dump_log_buf(void);
135 #ifdef CONFIG_PPC_POWERNV
136 static void dump_opal_msglog(void);
137 #else
138 static inline void dump_opal_msglog(void)
140 printf("Machine is not running OPAL firmware.\n");
142 #endif
144 static void backtrace(struct pt_regs *);
145 static void excprint(struct pt_regs *);
146 static void prregs(struct pt_regs *);
147 static void memops(int);
148 static void memlocate(void);
149 static void memzcan(void);
150 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
151 int skipbl(void);
152 int scanhex(unsigned long *valp);
153 static void scannl(void);
154 static int hexdigit(int);
155 void getstring(char *, int);
156 static void flush_input(void);
157 static int inchar(void);
158 static void take_input(char *);
159 static int read_spr(int, unsigned long *);
160 static void write_spr(int, unsigned long);
161 static void super_regs(void);
162 static void remove_bpts(void);
163 static void insert_bpts(void);
164 static void remove_cpu_bpts(void);
165 static void insert_cpu_bpts(void);
166 static struct bpt *at_breakpoint(unsigned long pc);
167 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
168 static int do_step(struct pt_regs *);
169 static void bpt_cmds(void);
170 static void cacheflush(void);
171 static int cpu_cmd(void);
172 static void csum(void);
173 static void bootcmds(void);
174 static void proccall(void);
175 static void show_tasks(void);
176 void dump_segments(void);
177 static void symbol_lookup(void);
178 static void xmon_show_stack(unsigned long sp, unsigned long lr,
179 unsigned long pc);
180 static void xmon_print_symbol(unsigned long address, const char *mid,
181 const char *after);
182 static const char *getvecname(unsigned long vec);
184 static int do_spu_cmd(void);
186 #ifdef CONFIG_44x
187 static void dump_tlb_44x(void);
188 #endif
189 #ifdef CONFIG_PPC_BOOK3E
190 static void dump_tlb_book3e(void);
191 #endif
193 static void clear_all_bpt(void);
195 #ifdef CONFIG_PPC64
196 #define REG "%.16lx"
197 #else
198 #define REG "%.8lx"
199 #endif
201 #ifdef __LITTLE_ENDIAN__
202 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
203 #else
204 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
205 #endif
207 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
209 static char *help_string = "\
210 Commands:\n\
211 b show breakpoints\n\
212 bd set data breakpoint\n\
213 bi set instruction breakpoint\n\
214 bc clear breakpoint\n"
215 #ifdef CONFIG_SMP
217 c print cpus stopped in xmon\n\
218 c# try to switch to cpu number h (in hex)\n"
219 #endif
221 C checksum\n\
222 d dump bytes\n\
223 d1 dump 1 byte values\n\
224 d2 dump 2 byte values\n\
225 d4 dump 4 byte values\n\
226 d8 dump 8 byte values\n\
227 di dump instructions\n\
228 df dump float values\n\
229 dd dump double values\n\
230 dl dump the kernel log buffer\n"
231 #ifdef CONFIG_PPC_POWERNV
233 do dump the OPAL message log\n"
234 #endif
235 #ifdef CONFIG_PPC64
237 dp[#] dump paca for current cpu, or cpu #\n\
238 dpa dump paca for all possible cpus\n"
239 #endif
241 dr dump stream of raw bytes\n\
242 dv dump virtual address translation \n\
243 dt dump the tracing buffers (uses printk)\n\
244 dtc dump the tracing buffers for current CPU (uses printk)\n\
246 #ifdef CONFIG_PPC_POWERNV
247 " dx# dump xive on CPU #\n\
248 dxi# dump xive irq state #\n\
249 dxa dump xive on all CPUs\n"
250 #endif
251 " e print exception information\n\
252 f flush cache\n\
253 la lookup symbol+offset of specified address\n\
254 ls lookup address of specified symbol\n\
255 lp s [#] lookup address of percpu symbol s for current cpu, or cpu #\n\
256 m examine/change memory\n\
257 mm move a block of memory\n\
258 ms set a block of memory\n\
259 md compare two blocks of memory\n\
260 ml locate a block of memory\n\
261 mz zero a block of memory\n\
262 mi show information about memory allocation\n\
263 p call a procedure\n\
264 P list processes/tasks\n\
265 r print registers\n\
266 s single step\n"
267 #ifdef CONFIG_SPU_BASE
268 " ss stop execution on all spus\n\
269 sr restore execution on stopped spus\n\
270 sf # dump spu fields for spu # (in hex)\n\
271 sd # dump spu local store for spu # (in hex)\n\
272 sdi # disassemble spu local store for spu # (in hex)\n"
273 #endif
274 " S print special registers\n\
275 Sa print all SPRs\n\
276 Sr # read SPR #\n\
277 Sw #v write v to SPR #\n\
278 t print backtrace\n\
279 x exit monitor and recover\n\
280 X exit monitor and don't recover\n"
281 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
282 " u dump segment table or SLB\n"
283 #elif defined(CONFIG_PPC_BOOK3S_32)
284 " u dump segment registers\n"
285 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
286 " u dump TLB\n"
287 #endif
288 " U show uptime information\n"
289 " ? help\n"
290 " # n limit output to n lines per page (for dp, dpa, dl)\n"
291 " zr reboot\n"
292 " zh halt\n"
295 #ifdef CONFIG_SECURITY
296 static bool xmon_is_locked_down(void)
298 static bool lockdown;
300 if (!lockdown) {
301 lockdown = !!security_locked_down(LOCKDOWN_XMON_RW);
302 if (lockdown) {
303 printf("xmon: Disabled due to kernel lockdown\n");
304 xmon_is_ro = true;
308 if (!xmon_is_ro) {
309 xmon_is_ro = !!security_locked_down(LOCKDOWN_XMON_WR);
310 if (xmon_is_ro)
311 printf("xmon: Read-only due to kernel lockdown\n");
314 return lockdown;
316 #else /* CONFIG_SECURITY */
317 static inline bool xmon_is_locked_down(void)
319 return false;
321 #endif
323 static struct pt_regs *xmon_regs;
325 static inline void sync(void)
327 asm volatile("sync; isync");
330 static inline void cflush(void *p)
332 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
335 static inline void cinval(void *p)
337 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
341 * write_ciabr() - write the CIABR SPR
342 * @ciabr: The value to write.
344 * This function writes a value to the CIARB register either directly
345 * through mtspr instruction if the kernel is in HV privilege mode or
346 * call a hypervisor function to achieve the same in case the kernel
347 * is in supervisor privilege mode.
349 static void write_ciabr(unsigned long ciabr)
351 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
352 return;
354 if (cpu_has_feature(CPU_FTR_HVMODE)) {
355 mtspr(SPRN_CIABR, ciabr);
356 return;
358 plpar_set_ciabr(ciabr);
362 * set_ciabr() - set the CIABR
363 * @addr: The value to set.
365 * This function sets the correct privilege value into the the HW
366 * breakpoint address before writing it up in the CIABR register.
368 static void set_ciabr(unsigned long addr)
370 addr &= ~CIABR_PRIV;
372 if (cpu_has_feature(CPU_FTR_HVMODE))
373 addr |= CIABR_PRIV_HYPER;
374 else
375 addr |= CIABR_PRIV_SUPER;
376 write_ciabr(addr);
380 * Disable surveillance (the service processor watchdog function)
381 * while we are in xmon.
382 * XXX we should re-enable it when we leave. :)
384 #define SURVEILLANCE_TOKEN 9000
386 static inline void disable_surveillance(void)
388 #ifdef CONFIG_PPC_PSERIES
389 /* Since this can't be a module, args should end up below 4GB. */
390 static struct rtas_args args;
393 * At this point we have got all the cpus we can into
394 * xmon, so there is hopefully no other cpu calling RTAS
395 * at the moment, even though we don't take rtas.lock.
396 * If we did try to take rtas.lock there would be a
397 * real possibility of deadlock.
399 if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
400 return;
402 rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
403 SURVEILLANCE_TOKEN, 0, 0);
405 #endif /* CONFIG_PPC_PSERIES */
408 #ifdef CONFIG_SMP
409 static int xmon_speaker;
411 static void get_output_lock(void)
413 int me = smp_processor_id() + 0x100;
414 int last_speaker = 0, prev;
415 long timeout;
417 if (xmon_speaker == me)
418 return;
420 for (;;) {
421 last_speaker = cmpxchg(&xmon_speaker, 0, me);
422 if (last_speaker == 0)
423 return;
426 * Wait a full second for the lock, we might be on a slow
427 * console, but check every 100us.
429 timeout = 10000;
430 while (xmon_speaker == last_speaker) {
431 if (--timeout > 0) {
432 udelay(100);
433 continue;
436 /* hostile takeover */
437 prev = cmpxchg(&xmon_speaker, last_speaker, me);
438 if (prev == last_speaker)
439 return;
440 break;
445 static void release_output_lock(void)
447 xmon_speaker = 0;
450 int cpus_are_in_xmon(void)
452 return !cpumask_empty(&cpus_in_xmon);
455 static bool wait_for_other_cpus(int ncpus)
457 unsigned long timeout;
459 /* We wait for 2s, which is a metric "little while" */
460 for (timeout = 20000; timeout != 0; --timeout) {
461 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
462 return true;
463 udelay(100);
464 barrier();
467 return false;
469 #else /* CONFIG_SMP */
470 static inline void get_output_lock(void) {}
471 static inline void release_output_lock(void) {}
472 #endif
474 static inline int unrecoverable_excp(struct pt_regs *regs)
476 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
477 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
478 return 0;
479 #else
480 return ((regs->msr & MSR_RI) == 0);
481 #endif
484 static void xmon_touch_watchdogs(void)
486 touch_softlockup_watchdog_sync();
487 rcu_cpu_stall_reset();
488 touch_nmi_watchdog();
491 static int xmon_core(struct pt_regs *regs, int fromipi)
493 int cmd = 0;
494 struct bpt *bp;
495 long recurse_jmp[JMP_BUF_LEN];
496 bool locked_down;
497 unsigned long offset;
498 unsigned long flags;
499 #ifdef CONFIG_SMP
500 int cpu;
501 int secondary;
502 #endif
504 local_irq_save(flags);
505 hard_irq_disable();
507 locked_down = xmon_is_locked_down();
509 if (!fromipi) {
510 tracing_enabled = tracing_is_on();
511 tracing_off();
514 bp = in_breakpoint_table(regs->nip, &offset);
515 if (bp != NULL) {
516 regs->nip = bp->address + offset;
517 atomic_dec(&bp->ref_count);
520 remove_cpu_bpts();
522 #ifdef CONFIG_SMP
523 cpu = smp_processor_id();
524 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
526 * We catch SPR read/write faults here because the 0x700, 0xf60
527 * etc. handlers don't call debugger_fault_handler().
529 if (catch_spr_faults)
530 longjmp(bus_error_jmp, 1);
531 get_output_lock();
532 excprint(regs);
533 printf("cpu 0x%x: Exception %lx %s in xmon, "
534 "returning to main loop\n",
535 cpu, regs->trap, getvecname(TRAP(regs)));
536 release_output_lock();
537 longjmp(xmon_fault_jmp[cpu], 1);
540 if (setjmp(recurse_jmp) != 0) {
541 if (!in_xmon || !xmon_gate) {
542 get_output_lock();
543 printf("xmon: WARNING: bad recursive fault "
544 "on cpu 0x%x\n", cpu);
545 release_output_lock();
546 goto waiting;
548 secondary = !(xmon_taken && cpu == xmon_owner);
549 goto cmdloop;
552 xmon_fault_jmp[cpu] = recurse_jmp;
554 bp = NULL;
555 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
556 bp = at_breakpoint(regs->nip);
557 if (bp || unrecoverable_excp(regs))
558 fromipi = 0;
560 if (!fromipi) {
561 get_output_lock();
562 if (!locked_down)
563 excprint(regs);
564 if (bp) {
565 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
566 cpu, BP_NUM(bp));
567 xmon_print_symbol(regs->nip, " ", ")\n");
569 if (unrecoverable_excp(regs))
570 printf("WARNING: exception is not recoverable, "
571 "can't continue\n");
572 release_output_lock();
575 cpumask_set_cpu(cpu, &cpus_in_xmon);
577 waiting:
578 secondary = 1;
579 spin_begin();
580 while (secondary && !xmon_gate) {
581 if (in_xmon == 0) {
582 if (fromipi) {
583 spin_end();
584 goto leave;
586 secondary = test_and_set_bit(0, &in_xmon);
588 spin_cpu_relax();
589 touch_nmi_watchdog();
591 spin_end();
593 if (!secondary && !xmon_gate) {
594 /* we are the first cpu to come in */
595 /* interrupt other cpu(s) */
596 int ncpus = num_online_cpus();
598 xmon_owner = cpu;
599 mb();
600 if (ncpus > 1) {
602 * A system reset (trap == 0x100) can be triggered on
603 * all CPUs, so when we come in via 0x100 try waiting
604 * for the other CPUs to come in before we send the
605 * debugger break (IPI). This is similar to
606 * crash_kexec_secondary().
608 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
609 smp_send_debugger_break();
611 wait_for_other_cpus(ncpus);
613 remove_bpts();
614 disable_surveillance();
616 if (!locked_down) {
617 /* for breakpoint or single step, print curr insn */
618 if (bp || TRAP(regs) == 0xd00)
619 ppc_inst_dump(regs->nip, 1, 0);
620 printf("enter ? for help\n");
623 mb();
624 xmon_gate = 1;
625 barrier();
626 touch_nmi_watchdog();
629 cmdloop:
630 while (in_xmon) {
631 if (secondary) {
632 spin_begin();
633 if (cpu == xmon_owner) {
634 if (!test_and_set_bit(0, &xmon_taken)) {
635 secondary = 0;
636 spin_end();
637 continue;
639 /* missed it */
640 while (cpu == xmon_owner)
641 spin_cpu_relax();
643 spin_cpu_relax();
644 touch_nmi_watchdog();
645 } else {
646 if (!locked_down)
647 cmd = cmds(regs);
648 if (locked_down || cmd != 0) {
649 /* exiting xmon */
650 insert_bpts();
651 xmon_gate = 0;
652 wmb();
653 in_xmon = 0;
654 break;
656 /* have switched to some other cpu */
657 secondary = 1;
660 leave:
661 cpumask_clear_cpu(cpu, &cpus_in_xmon);
662 xmon_fault_jmp[cpu] = NULL;
663 #else
664 /* UP is simple... */
665 if (in_xmon) {
666 printf("Exception %lx %s in xmon, returning to main loop\n",
667 regs->trap, getvecname(TRAP(regs)));
668 longjmp(xmon_fault_jmp[0], 1);
670 if (setjmp(recurse_jmp) == 0) {
671 xmon_fault_jmp[0] = recurse_jmp;
672 in_xmon = 1;
674 excprint(regs);
675 bp = at_breakpoint(regs->nip);
676 if (bp) {
677 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
678 xmon_print_symbol(regs->nip, " ", ")\n");
680 if (unrecoverable_excp(regs))
681 printf("WARNING: exception is not recoverable, "
682 "can't continue\n");
683 remove_bpts();
684 disable_surveillance();
685 if (!locked_down) {
686 /* for breakpoint or single step, print current insn */
687 if (bp || TRAP(regs) == 0xd00)
688 ppc_inst_dump(regs->nip, 1, 0);
689 printf("enter ? for help\n");
693 if (!locked_down)
694 cmd = cmds(regs);
696 insert_bpts();
697 in_xmon = 0;
698 #endif
700 #ifdef CONFIG_BOOKE
701 if (regs->msr & MSR_DE) {
702 bp = at_breakpoint(regs->nip);
703 if (bp != NULL) {
704 regs->nip = (unsigned long) &bp->instr[0];
705 atomic_inc(&bp->ref_count);
708 #else
709 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
710 bp = at_breakpoint(regs->nip);
711 if (bp != NULL) {
712 int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
713 if (stepped == 0) {
714 regs->nip = (unsigned long) &bp->instr[0];
715 atomic_inc(&bp->ref_count);
716 } else if (stepped < 0) {
717 printf("Couldn't single-step %s instruction\n",
718 IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
722 #endif
723 if (locked_down)
724 clear_all_bpt();
725 else
726 insert_cpu_bpts();
728 xmon_touch_watchdogs();
729 local_irq_restore(flags);
731 return cmd != 'X' && cmd != EOF;
734 int xmon(struct pt_regs *excp)
736 struct pt_regs regs;
738 if (excp == NULL) {
739 ppc_save_regs(&regs);
740 excp = &regs;
743 return xmon_core(excp, 0);
745 EXPORT_SYMBOL(xmon);
747 irqreturn_t xmon_irq(int irq, void *d)
749 unsigned long flags;
750 local_irq_save(flags);
751 printf("Keyboard interrupt\n");
752 xmon(get_irq_regs());
753 local_irq_restore(flags);
754 return IRQ_HANDLED;
757 static int xmon_bpt(struct pt_regs *regs)
759 struct bpt *bp;
760 unsigned long offset;
762 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
763 return 0;
765 /* Are we at the trap at bp->instr[1] for some bp? */
766 bp = in_breakpoint_table(regs->nip, &offset);
767 if (bp != NULL && (offset == 4 || offset == 8)) {
768 regs->nip = bp->address + offset;
769 atomic_dec(&bp->ref_count);
770 return 1;
773 /* Are we at a breakpoint? */
774 bp = at_breakpoint(regs->nip);
775 if (!bp)
776 return 0;
778 xmon_core(regs, 0);
780 return 1;
783 static int xmon_sstep(struct pt_regs *regs)
785 if (user_mode(regs))
786 return 0;
787 xmon_core(regs, 0);
788 return 1;
791 static int xmon_break_match(struct pt_regs *regs)
793 int i;
795 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
796 return 0;
797 for (i = 0; i < nr_wp_slots(); i++) {
798 if (dabr[i].enabled)
799 goto found;
801 return 0;
803 found:
804 xmon_core(regs, 0);
805 return 1;
808 static int xmon_iabr_match(struct pt_regs *regs)
810 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
811 return 0;
812 if (iabr == NULL)
813 return 0;
814 xmon_core(regs, 0);
815 return 1;
818 static int xmon_ipi(struct pt_regs *regs)
820 #ifdef CONFIG_SMP
821 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
822 xmon_core(regs, 1);
823 #endif
824 return 0;
827 static int xmon_fault_handler(struct pt_regs *regs)
829 struct bpt *bp;
830 unsigned long offset;
832 if (in_xmon && catch_memory_errors)
833 handle_fault(regs); /* doesn't return */
835 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
836 bp = in_breakpoint_table(regs->nip, &offset);
837 if (bp != NULL) {
838 regs->nip = bp->address + offset;
839 atomic_dec(&bp->ref_count);
843 return 0;
846 /* Force enable xmon if not already enabled */
847 static inline void force_enable_xmon(void)
849 /* Enable xmon hooks if needed */
850 if (!xmon_on) {
851 printf("xmon: Enabling debugger hooks\n");
852 xmon_on = 1;
856 static struct bpt *at_breakpoint(unsigned long pc)
858 int i;
859 struct bpt *bp;
861 bp = bpts;
862 for (i = 0; i < NBPTS; ++i, ++bp)
863 if (bp->enabled && pc == bp->address)
864 return bp;
865 return NULL;
868 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
870 unsigned long off;
872 off = nip - (unsigned long)bpt_table;
873 if (off >= sizeof(bpt_table))
874 return NULL;
875 *offp = off & (BPT_SIZE - 1);
876 if (off & 3)
877 return NULL;
878 return bpts + (off / BPT_SIZE);
881 static struct bpt *new_breakpoint(unsigned long a)
883 struct bpt *bp;
885 a &= ~3UL;
886 bp = at_breakpoint(a);
887 if (bp)
888 return bp;
890 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
891 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
892 bp->address = a;
893 bp->instr = (void *)(bpt_table + ((bp - bpts) * BPT_WORDS));
894 return bp;
898 printf("Sorry, no free breakpoints. Please clear one first.\n");
899 return NULL;
902 static void insert_bpts(void)
904 int i;
905 struct ppc_inst instr, instr2;
906 struct bpt *bp, *bp2;
908 bp = bpts;
909 for (i = 0; i < NBPTS; ++i, ++bp) {
910 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
911 continue;
912 if (!mread_instr(bp->address, &instr)) {
913 printf("Couldn't read instruction at %lx, "
914 "disabling breakpoint there\n", bp->address);
915 bp->enabled = 0;
916 continue;
918 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
919 printf("Breakpoint at %lx is on an mtmsrd or rfid "
920 "instruction, disabling it\n", bp->address);
921 bp->enabled = 0;
922 continue;
925 * Check the address is not a suffix by looking for a prefix in
926 * front of it.
928 if (mread_instr(bp->address - 4, &instr2) == 8) {
929 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
930 bp->address);
931 bp->enabled = 0;
932 continue;
935 * We might still be a suffix - if the prefix has already been
936 * replaced by a breakpoint we won't catch it with the above
937 * test.
939 bp2 = at_breakpoint(bp->address - 4);
940 if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
941 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
942 bp->address);
943 bp->enabled = 0;
944 continue;
947 patch_instruction(bp->instr, instr);
948 patch_instruction(ppc_inst_next(bp->instr, &instr),
949 ppc_inst(bpinstr));
950 if (bp->enabled & BP_CIABR)
951 continue;
952 if (patch_instruction((struct ppc_inst *)bp->address,
953 ppc_inst(bpinstr)) != 0) {
954 printf("Couldn't write instruction at %lx, "
955 "disabling breakpoint there\n", bp->address);
956 bp->enabled &= ~BP_TRAP;
957 continue;
962 static void insert_cpu_bpts(void)
964 int i;
965 struct arch_hw_breakpoint brk;
967 for (i = 0; i < nr_wp_slots(); i++) {
968 if (dabr[i].enabled) {
969 brk.address = dabr[i].address;
970 brk.type = (dabr[i].enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
971 brk.len = 8;
972 brk.hw_len = 8;
973 __set_breakpoint(i, &brk);
977 if (iabr)
978 set_ciabr(iabr->address);
981 static void remove_bpts(void)
983 int i;
984 struct bpt *bp;
985 struct ppc_inst instr;
987 bp = bpts;
988 for (i = 0; i < NBPTS; ++i, ++bp) {
989 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
990 continue;
991 if (mread_instr(bp->address, &instr)
992 && ppc_inst_equal(instr, ppc_inst(bpinstr))
993 && patch_instruction(
994 (struct ppc_inst *)bp->address, ppc_inst_read(bp->instr)) != 0)
995 printf("Couldn't remove breakpoint at %lx\n",
996 bp->address);
1000 static void remove_cpu_bpts(void)
1002 hw_breakpoint_disable();
1003 write_ciabr(0);
1006 /* Based on uptime_proc_show(). */
1007 static void
1008 show_uptime(void)
1010 struct timespec64 uptime;
1012 if (setjmp(bus_error_jmp) == 0) {
1013 catch_memory_errors = 1;
1014 sync();
1016 ktime_get_coarse_boottime_ts64(&uptime);
1017 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
1018 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
1020 sync();
1021 __delay(200); \
1023 catch_memory_errors = 0;
1026 static void set_lpp_cmd(void)
1028 unsigned long lpp;
1030 if (!scanhex(&lpp)) {
1031 printf("Invalid number.\n");
1032 lpp = 0;
1034 xmon_set_pagination_lpp(lpp);
1036 /* Command interpreting routine */
1037 static char *last_cmd;
1039 static int
1040 cmds(struct pt_regs *excp)
1042 int cmd = 0;
1044 last_cmd = NULL;
1045 xmon_regs = excp;
1047 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1049 for(;;) {
1050 #ifdef CONFIG_SMP
1051 printf("%x:", smp_processor_id());
1052 #endif /* CONFIG_SMP */
1053 printf("mon> ");
1054 flush_input();
1055 termch = 0;
1056 cmd = skipbl();
1057 if( cmd == '\n' ) {
1058 if (last_cmd == NULL)
1059 continue;
1060 take_input(last_cmd);
1061 last_cmd = NULL;
1062 cmd = inchar();
1064 switch (cmd) {
1065 case 'm':
1066 cmd = inchar();
1067 switch (cmd) {
1068 case 'm':
1069 case 's':
1070 case 'd':
1071 memops(cmd);
1072 break;
1073 case 'l':
1074 memlocate();
1075 break;
1076 case 'z':
1077 if (xmon_is_ro) {
1078 printf(xmon_ro_msg);
1079 break;
1081 memzcan();
1082 break;
1083 case 'i':
1084 show_mem(0, NULL);
1085 break;
1086 default:
1087 termch = cmd;
1088 memex();
1090 break;
1091 case 'd':
1092 dump();
1093 break;
1094 case 'l':
1095 symbol_lookup();
1096 break;
1097 case 'r':
1098 prregs(excp); /* print regs */
1099 break;
1100 case 'e':
1101 excprint(excp);
1102 break;
1103 case 'S':
1104 super_regs();
1105 break;
1106 case 't':
1107 backtrace(excp);
1108 break;
1109 case 'f':
1110 cacheflush();
1111 break;
1112 case 's':
1113 if (do_spu_cmd() == 0)
1114 break;
1115 if (do_step(excp))
1116 return cmd;
1117 break;
1118 case 'x':
1119 case 'X':
1120 if (tracing_enabled)
1121 tracing_on();
1122 return cmd;
1123 case EOF:
1124 printf(" <no input ...>\n");
1125 mdelay(2000);
1126 return cmd;
1127 case '?':
1128 xmon_puts(help_string);
1129 break;
1130 case '#':
1131 set_lpp_cmd();
1132 break;
1133 case 'b':
1134 bpt_cmds();
1135 break;
1136 case 'C':
1137 csum();
1138 break;
1139 case 'c':
1140 if (cpu_cmd())
1141 return 0;
1142 break;
1143 case 'z':
1144 bootcmds();
1145 break;
1146 case 'p':
1147 if (xmon_is_ro) {
1148 printf(xmon_ro_msg);
1149 break;
1151 proccall();
1152 break;
1153 case 'P':
1154 show_tasks();
1155 break;
1156 #ifdef CONFIG_PPC_BOOK3S
1157 case 'u':
1158 dump_segments();
1159 break;
1160 #elif defined(CONFIG_44x)
1161 case 'u':
1162 dump_tlb_44x();
1163 break;
1164 #elif defined(CONFIG_PPC_BOOK3E)
1165 case 'u':
1166 dump_tlb_book3e();
1167 break;
1168 #endif
1169 case 'U':
1170 show_uptime();
1171 break;
1172 default:
1173 printf("Unrecognized command: ");
1174 do {
1175 if (' ' < cmd && cmd <= '~')
1176 putchar(cmd);
1177 else
1178 printf("\\x%x", cmd);
1179 cmd = inchar();
1180 } while (cmd != '\n');
1181 printf(" (type ? for help)\n");
1182 break;
1187 #ifdef CONFIG_BOOKE
1188 static int do_step(struct pt_regs *regs)
1190 regs->msr |= MSR_DE;
1191 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1192 return 1;
1194 #else
1196 * Step a single instruction.
1197 * Some instructions we emulate, others we execute with MSR_SE set.
1199 static int do_step(struct pt_regs *regs)
1201 struct ppc_inst instr;
1202 int stepped;
1204 force_enable_xmon();
1205 /* check we are in 64-bit kernel mode, translation enabled */
1206 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1207 if (mread_instr(regs->nip, &instr)) {
1208 stepped = emulate_step(regs, instr);
1209 if (stepped < 0) {
1210 printf("Couldn't single-step %s instruction\n",
1211 (IS_RFID(instr)? "rfid": "mtmsrd"));
1212 return 0;
1214 if (stepped > 0) {
1215 set_trap(regs, 0xd00);
1216 printf("stepped to ");
1217 xmon_print_symbol(regs->nip, " ", "\n");
1218 ppc_inst_dump(regs->nip, 1, 0);
1219 return 0;
1223 regs->msr |= MSR_SE;
1224 return 1;
1226 #endif
1228 static void bootcmds(void)
1230 char tmp[64];
1231 int cmd;
1233 cmd = inchar();
1234 if (cmd == 'r') {
1235 getstring(tmp, 64);
1236 ppc_md.restart(tmp);
1237 } else if (cmd == 'h') {
1238 ppc_md.halt();
1239 } else if (cmd == 'p') {
1240 if (pm_power_off)
1241 pm_power_off();
1245 static int cpu_cmd(void)
1247 #ifdef CONFIG_SMP
1248 unsigned long cpu, first_cpu, last_cpu;
1249 int timeout;
1251 if (!scanhex(&cpu)) {
1252 /* print cpus waiting or in xmon */
1253 printf("cpus stopped:");
1254 last_cpu = first_cpu = NR_CPUS;
1255 for_each_possible_cpu(cpu) {
1256 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1257 if (cpu == last_cpu + 1) {
1258 last_cpu = cpu;
1259 } else {
1260 if (last_cpu != first_cpu)
1261 printf("-0x%lx", last_cpu);
1262 last_cpu = first_cpu = cpu;
1263 printf(" 0x%lx", cpu);
1267 if (last_cpu != first_cpu)
1268 printf("-0x%lx", last_cpu);
1269 printf("\n");
1270 return 0;
1272 /* try to switch to cpu specified */
1273 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1274 printf("cpu 0x%lx isn't in xmon\n", cpu);
1275 #ifdef CONFIG_PPC64
1276 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1277 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1278 #endif
1279 return 0;
1281 xmon_taken = 0;
1282 mb();
1283 xmon_owner = cpu;
1284 timeout = 10000000;
1285 while (!xmon_taken) {
1286 if (--timeout == 0) {
1287 if (test_and_set_bit(0, &xmon_taken))
1288 break;
1289 /* take control back */
1290 mb();
1291 xmon_owner = smp_processor_id();
1292 printf("cpu 0x%lx didn't take control\n", cpu);
1293 return 0;
1295 barrier();
1297 return 1;
1298 #else
1299 return 0;
1300 #endif /* CONFIG_SMP */
1303 static unsigned short fcstab[256] = {
1304 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1305 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1306 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1307 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1308 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1309 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1310 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1311 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1312 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1313 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1314 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1315 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1316 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1317 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1318 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1319 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1320 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1321 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1322 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1323 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1324 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1325 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1326 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1327 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1328 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1329 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1330 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1331 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1332 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1333 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1334 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1335 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1338 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1340 static void
1341 csum(void)
1343 unsigned int i;
1344 unsigned short fcs;
1345 unsigned char v;
1347 if (!scanhex(&adrs))
1348 return;
1349 if (!scanhex(&ncsum))
1350 return;
1351 fcs = 0xffff;
1352 for (i = 0; i < ncsum; ++i) {
1353 if (mread(adrs+i, &v, 1) == 0) {
1354 printf("csum stopped at "REG"\n", adrs+i);
1355 break;
1357 fcs = FCS(fcs, v);
1359 printf("%x\n", fcs);
1363 * Check if this is a suitable place to put a breakpoint.
1365 static long check_bp_loc(unsigned long addr)
1367 struct ppc_inst instr;
1369 addr &= ~3;
1370 if (!is_kernel_addr(addr)) {
1371 printf("Breakpoints may only be placed at kernel addresses\n");
1372 return 0;
1374 if (!mread_instr(addr, &instr)) {
1375 printf("Can't read instruction at address %lx\n", addr);
1376 return 0;
1378 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1379 printf("Breakpoints may not be placed on mtmsrd or rfid "
1380 "instructions\n");
1381 return 0;
1383 return 1;
1386 #ifndef CONFIG_PPC_8xx
1387 static int find_free_data_bpt(void)
1389 int i;
1391 for (i = 0; i < nr_wp_slots(); i++) {
1392 if (!dabr[i].enabled)
1393 return i;
1395 printf("Couldn't find free breakpoint register\n");
1396 return -1;
1398 #endif
1400 static void print_data_bpts(void)
1402 int i;
1404 for (i = 0; i < nr_wp_slots(); i++) {
1405 if (!dabr[i].enabled)
1406 continue;
1408 printf(" data "REG" [", dabr[i].address);
1409 if (dabr[i].enabled & 1)
1410 printf("r");
1411 if (dabr[i].enabled & 2)
1412 printf("w");
1413 printf("]\n");
1417 static char *breakpoint_help_string =
1418 "Breakpoint command usage:\n"
1419 "b show breakpoints\n"
1420 "b <addr> [cnt] set breakpoint at given instr addr\n"
1421 "bc clear all breakpoints\n"
1422 "bc <n/addr> clear breakpoint number n or at addr\n"
1423 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1424 "bd <addr> [cnt] set hardware data breakpoint\n"
1427 static void
1428 bpt_cmds(void)
1430 int cmd;
1431 unsigned long a;
1432 int i;
1433 struct bpt *bp;
1435 cmd = inchar();
1437 switch (cmd) {
1438 #ifndef CONFIG_PPC_8xx
1439 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1440 int mode;
1441 case 'd': /* bd - hardware data breakpoint */
1442 if (xmon_is_ro) {
1443 printf(xmon_ro_msg);
1444 break;
1446 if (!ppc_breakpoint_available()) {
1447 printf("Hardware data breakpoint not supported on this cpu\n");
1448 break;
1450 i = find_free_data_bpt();
1451 if (i < 0)
1452 break;
1453 mode = 7;
1454 cmd = inchar();
1455 if (cmd == 'r')
1456 mode = 5;
1457 else if (cmd == 'w')
1458 mode = 6;
1459 else
1460 termch = cmd;
1461 dabr[i].address = 0;
1462 dabr[i].enabled = 0;
1463 if (scanhex(&dabr[i].address)) {
1464 if (!is_kernel_addr(dabr[i].address)) {
1465 printf(badaddr);
1466 break;
1468 dabr[i].address &= ~HW_BRK_TYPE_DABR;
1469 dabr[i].enabled = mode | BP_DABR;
1472 force_enable_xmon();
1473 break;
1475 case 'i': /* bi - hardware instr breakpoint */
1476 if (xmon_is_ro) {
1477 printf(xmon_ro_msg);
1478 break;
1480 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1481 printf("Hardware instruction breakpoint "
1482 "not supported on this cpu\n");
1483 break;
1485 if (iabr) {
1486 iabr->enabled &= ~BP_CIABR;
1487 iabr = NULL;
1489 if (!scanhex(&a))
1490 break;
1491 if (!check_bp_loc(a))
1492 break;
1493 bp = new_breakpoint(a);
1494 if (bp != NULL) {
1495 bp->enabled |= BP_CIABR;
1496 iabr = bp;
1497 force_enable_xmon();
1499 break;
1500 #endif
1502 case 'c':
1503 if (!scanhex(&a)) {
1504 /* clear all breakpoints */
1505 for (i = 0; i < NBPTS; ++i)
1506 bpts[i].enabled = 0;
1507 iabr = NULL;
1508 for (i = 0; i < nr_wp_slots(); i++)
1509 dabr[i].enabled = 0;
1511 printf("All breakpoints cleared\n");
1512 break;
1515 if (a <= NBPTS && a >= 1) {
1516 /* assume a breakpoint number */
1517 bp = &bpts[a-1]; /* bp nums are 1 based */
1518 } else {
1519 /* assume a breakpoint address */
1520 bp = at_breakpoint(a);
1521 if (bp == NULL) {
1522 printf("No breakpoint at %lx\n", a);
1523 break;
1527 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1528 xmon_print_symbol(bp->address, " ", ")\n");
1529 bp->enabled = 0;
1530 break;
1532 default:
1533 termch = cmd;
1534 cmd = skipbl();
1535 if (cmd == '?') {
1536 printf(breakpoint_help_string);
1537 break;
1539 termch = cmd;
1541 if (xmon_is_ro || !scanhex(&a)) {
1542 /* print all breakpoints */
1543 printf(" type address\n");
1544 print_data_bpts();
1545 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1546 if (!bp->enabled)
1547 continue;
1548 printf("%tx %s ", BP_NUM(bp),
1549 (bp->enabled & BP_CIABR) ? "inst": "trap");
1550 xmon_print_symbol(bp->address, " ", "\n");
1552 break;
1555 if (!check_bp_loc(a))
1556 break;
1557 bp = new_breakpoint(a);
1558 if (bp != NULL) {
1559 bp->enabled |= BP_TRAP;
1560 force_enable_xmon();
1562 break;
1566 /* Very cheap human name for vector lookup. */
1567 static
1568 const char *getvecname(unsigned long vec)
1570 char *ret;
1572 switch (vec) {
1573 case 0x100: ret = "(System Reset)"; break;
1574 case 0x200: ret = "(Machine Check)"; break;
1575 case 0x300: ret = "(Data Access)"; break;
1576 case 0x380:
1577 if (radix_enabled())
1578 ret = "(Data Access Out of Range)";
1579 else
1580 ret = "(Data SLB Access)";
1581 break;
1582 case 0x400: ret = "(Instruction Access)"; break;
1583 case 0x480:
1584 if (radix_enabled())
1585 ret = "(Instruction Access Out of Range)";
1586 else
1587 ret = "(Instruction SLB Access)";
1588 break;
1589 case 0x500: ret = "(Hardware Interrupt)"; break;
1590 case 0x600: ret = "(Alignment)"; break;
1591 case 0x700: ret = "(Program Check)"; break;
1592 case 0x800: ret = "(FPU Unavailable)"; break;
1593 case 0x900: ret = "(Decrementer)"; break;
1594 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1595 case 0xa00: ret = "(Doorbell)"; break;
1596 case 0xc00: ret = "(System Call)"; break;
1597 case 0xd00: ret = "(Single Step)"; break;
1598 case 0xe40: ret = "(Emulation Assist)"; break;
1599 case 0xe60: ret = "(HMI)"; break;
1600 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1601 case 0xf00: ret = "(Performance Monitor)"; break;
1602 case 0xf20: ret = "(Altivec Unavailable)"; break;
1603 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1604 case 0x1500: ret = "(Denormalisation)"; break;
1605 case 0x1700: ret = "(Altivec Assist)"; break;
1606 case 0x3000: ret = "(System Call Vectored)"; break;
1607 default: ret = "";
1609 return ret;
1612 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1613 unsigned long *endp)
1615 unsigned long size, offset;
1616 const char *name;
1618 *startp = *endp = 0;
1619 if (pc == 0)
1620 return;
1621 if (setjmp(bus_error_jmp) == 0) {
1622 catch_memory_errors = 1;
1623 sync();
1624 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1625 if (name != NULL) {
1626 *startp = pc - offset;
1627 *endp = pc - offset + size;
1629 sync();
1631 catch_memory_errors = 0;
1634 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1635 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1637 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1638 unsigned long pc)
1640 int max_to_print = 64;
1641 unsigned long ip;
1642 unsigned long newsp;
1643 unsigned long marker;
1644 struct pt_regs regs;
1646 while (max_to_print--) {
1647 if (!is_kernel_addr(sp)) {
1648 if (sp != 0)
1649 printf("SP (%lx) is in userspace\n", sp);
1650 break;
1653 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1654 || !mread(sp, &newsp, sizeof(unsigned long))) {
1655 printf("Couldn't read stack frame at %lx\n", sp);
1656 break;
1660 * For the first stack frame, try to work out if
1661 * LR and/or the saved LR value in the bottommost
1662 * stack frame are valid.
1664 if ((pc | lr) != 0) {
1665 unsigned long fnstart, fnend;
1666 unsigned long nextip;
1667 int printip = 1;
1669 get_function_bounds(pc, &fnstart, &fnend);
1670 nextip = 0;
1671 if (newsp > sp)
1672 mread(newsp + LRSAVE_OFFSET, &nextip,
1673 sizeof(unsigned long));
1674 if (lr == ip) {
1675 if (!is_kernel_addr(lr)
1676 || (fnstart <= lr && lr < fnend))
1677 printip = 0;
1678 } else if (lr == nextip) {
1679 printip = 0;
1680 } else if (is_kernel_addr(lr)
1681 && !(fnstart <= lr && lr < fnend)) {
1682 printf("[link register ] ");
1683 xmon_print_symbol(lr, " ", "\n");
1685 if (printip) {
1686 printf("["REG"] ", sp);
1687 xmon_print_symbol(ip, " ", " (unreliable)\n");
1689 pc = lr = 0;
1691 } else {
1692 printf("["REG"] ", sp);
1693 xmon_print_symbol(ip, " ", "\n");
1696 /* Look for "regshere" marker to see if this is
1697 an exception frame. */
1698 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1699 && marker == STACK_FRAME_REGS_MARKER) {
1700 if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1701 != sizeof(regs)) {
1702 printf("Couldn't read registers at %lx\n",
1703 sp + STACK_FRAME_OVERHEAD);
1704 break;
1706 printf("--- Exception: %lx %s at ", regs.trap,
1707 getvecname(TRAP(&regs)));
1708 pc = regs.nip;
1709 lr = regs.link;
1710 xmon_print_symbol(pc, " ", "\n");
1713 if (newsp == 0)
1714 break;
1716 sp = newsp;
1720 static void backtrace(struct pt_regs *excp)
1722 unsigned long sp;
1724 if (scanhex(&sp))
1725 xmon_show_stack(sp, 0, 0);
1726 else
1727 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1728 scannl();
1731 static void print_bug_trap(struct pt_regs *regs)
1733 #ifdef CONFIG_BUG
1734 const struct bug_entry *bug;
1735 unsigned long addr;
1737 if (regs->msr & MSR_PR)
1738 return; /* not in kernel */
1739 addr = regs->nip; /* address of trap instruction */
1740 if (!is_kernel_addr(addr))
1741 return;
1742 bug = find_bug(regs->nip);
1743 if (bug == NULL)
1744 return;
1745 if (is_warning_bug(bug))
1746 return;
1748 #ifdef CONFIG_DEBUG_BUGVERBOSE
1749 printf("kernel BUG at %s:%u!\n",
1750 (char *)bug + bug->file_disp, bug->line);
1751 #else
1752 printf("kernel BUG at %px!\n", (void *)bug + bug->bug_addr_disp);
1753 #endif
1754 #endif /* CONFIG_BUG */
1757 static void excprint(struct pt_regs *fp)
1759 unsigned long trap;
1761 #ifdef CONFIG_SMP
1762 printf("cpu 0x%x: ", smp_processor_id());
1763 #endif /* CONFIG_SMP */
1765 trap = TRAP(fp);
1766 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1767 printf(" pc: ");
1768 xmon_print_symbol(fp->nip, ": ", "\n");
1770 printf(" lr: ");
1771 xmon_print_symbol(fp->link, ": ", "\n");
1773 printf(" sp: %lx\n", fp->gpr[1]);
1774 printf(" msr: %lx\n", fp->msr);
1776 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1777 printf(" dar: %lx\n", fp->dar);
1778 if (trap != 0x380)
1779 printf(" dsisr: %lx\n", fp->dsisr);
1782 printf(" current = 0x%px\n", current);
1783 #ifdef CONFIG_PPC64
1784 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1785 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1786 #endif
1787 if (current) {
1788 printf(" pid = %d, comm = %s\n",
1789 current->pid, current->comm);
1792 if (trap == 0x700)
1793 print_bug_trap(fp);
1795 printf(linux_banner);
1798 static void prregs(struct pt_regs *fp)
1800 int n, trap;
1801 unsigned long base;
1802 struct pt_regs regs;
1804 if (scanhex(&base)) {
1805 if (setjmp(bus_error_jmp) == 0) {
1806 catch_memory_errors = 1;
1807 sync();
1808 regs = *(struct pt_regs *)base;
1809 sync();
1810 __delay(200);
1811 } else {
1812 catch_memory_errors = 0;
1813 printf("*** Error reading registers from "REG"\n",
1814 base);
1815 return;
1817 catch_memory_errors = 0;
1818 fp = &regs;
1821 #ifdef CONFIG_PPC64
1822 if (FULL_REGS(fp)) {
1823 for (n = 0; n < 16; ++n)
1824 printf("R%.2d = "REG" R%.2d = "REG"\n",
1825 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1826 } else {
1827 for (n = 0; n < 7; ++n)
1828 printf("R%.2d = "REG" R%.2d = "REG"\n",
1829 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1831 #else
1832 for (n = 0; n < 32; ++n) {
1833 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1834 (n & 3) == 3? "\n": " ");
1835 if (n == 12 && !FULL_REGS(fp)) {
1836 printf("\n");
1837 break;
1840 #endif
1841 printf("pc = ");
1842 xmon_print_symbol(fp->nip, " ", "\n");
1843 if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1844 printf("cfar= ");
1845 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1847 printf("lr = ");
1848 xmon_print_symbol(fp->link, " ", "\n");
1849 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1850 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1851 fp->ctr, fp->xer, fp->trap);
1852 trap = TRAP(fp);
1853 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1854 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1857 static void cacheflush(void)
1859 int cmd;
1860 unsigned long nflush;
1862 cmd = inchar();
1863 if (cmd != 'i')
1864 termch = cmd;
1865 scanhex((void *)&adrs);
1866 if (termch != '\n')
1867 termch = 0;
1868 nflush = 1;
1869 scanhex(&nflush);
1870 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1871 if (setjmp(bus_error_jmp) == 0) {
1872 catch_memory_errors = 1;
1873 sync();
1875 if (cmd != 'i' || IS_ENABLED(CONFIG_PPC_BOOK3S_64)) {
1876 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1877 cflush((void *) adrs);
1878 } else {
1879 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1880 cinval((void *) adrs);
1882 sync();
1883 /* wait a little while to see if we get a machine check */
1884 __delay(200);
1886 catch_memory_errors = 0;
1889 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1890 extern void xmon_mtspr(int spr, unsigned long value);
1892 static int
1893 read_spr(int n, unsigned long *vp)
1895 unsigned long ret = -1UL;
1896 int ok = 0;
1898 if (setjmp(bus_error_jmp) == 0) {
1899 catch_spr_faults = 1;
1900 sync();
1902 ret = xmon_mfspr(n, *vp);
1904 sync();
1905 *vp = ret;
1906 ok = 1;
1908 catch_spr_faults = 0;
1910 return ok;
1913 static void
1914 write_spr(int n, unsigned long val)
1916 if (xmon_is_ro) {
1917 printf(xmon_ro_msg);
1918 return;
1921 if (setjmp(bus_error_jmp) == 0) {
1922 catch_spr_faults = 1;
1923 sync();
1925 xmon_mtspr(n, val);
1927 sync();
1928 } else {
1929 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1931 catch_spr_faults = 0;
1934 static void dump_206_sprs(void)
1936 #ifdef CONFIG_PPC64
1937 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1938 return;
1940 /* Actually some of these pre-date 2.06, but whatevs */
1942 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1943 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1944 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1945 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1946 printf("amr = %.16lx uamor = %.16lx\n",
1947 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1949 if (!(mfmsr() & MSR_HV))
1950 return;
1952 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1953 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1954 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1955 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1956 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1957 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1958 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1959 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1960 printf("dabr = %.16lx dabrx = %.16lx\n",
1961 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1962 #endif
1965 static void dump_207_sprs(void)
1967 #ifdef CONFIG_PPC64
1968 unsigned long msr;
1970 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1971 return;
1973 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1974 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1976 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1977 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1979 msr = mfmsr();
1980 if (msr & MSR_TM) {
1981 /* Only if TM has been enabled in the kernel */
1982 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1983 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1984 mfspr(SPRN_TEXASR));
1987 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1988 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1989 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1990 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1991 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1992 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1993 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1994 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1995 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1996 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1997 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1998 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
2000 if (!(msr & MSR_HV))
2001 return;
2003 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
2004 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
2005 printf("dawr0 = %.16lx dawrx0 = %.16lx\n",
2006 mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0));
2007 if (nr_wp_slots() > 1) {
2008 printf("dawr1 = %.16lx dawrx1 = %.16lx\n",
2009 mfspr(SPRN_DAWR1), mfspr(SPRN_DAWRX1));
2011 printf("ciabr = %.16lx\n", mfspr(SPRN_CIABR));
2012 #endif
2015 static void dump_300_sprs(void)
2017 #ifdef CONFIG_PPC64
2018 bool hv = mfmsr() & MSR_HV;
2020 if (!cpu_has_feature(CPU_FTR_ARCH_300))
2021 return;
2023 printf("pidr = %.16lx tidr = %.16lx\n",
2024 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
2025 printf("psscr = %.16lx\n",
2026 hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
2028 if (!hv)
2029 return;
2031 printf("ptcr = %.16lx asdr = %.16lx\n",
2032 mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
2033 #endif
2036 static void dump_310_sprs(void)
2038 #ifdef CONFIG_PPC64
2039 if (!cpu_has_feature(CPU_FTR_ARCH_31))
2040 return;
2042 printf("mmcr3 = %.16lx, sier2 = %.16lx, sier3 = %.16lx\n",
2043 mfspr(SPRN_MMCR3), mfspr(SPRN_SIER2), mfspr(SPRN_SIER3));
2045 #endif
2048 static void dump_one_spr(int spr, bool show_unimplemented)
2050 unsigned long val;
2052 val = 0xdeadbeef;
2053 if (!read_spr(spr, &val)) {
2054 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2055 return;
2058 if (val == 0xdeadbeef) {
2059 /* Looks like read was a nop, confirm */
2060 val = 0x0badcafe;
2061 if (!read_spr(spr, &val)) {
2062 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2063 return;
2066 if (val == 0x0badcafe) {
2067 if (show_unimplemented)
2068 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2069 return;
2073 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2076 static void super_regs(void)
2078 static unsigned long regno;
2079 int cmd;
2080 int spr;
2082 cmd = skipbl();
2084 switch (cmd) {
2085 case '\n': {
2086 unsigned long sp, toc;
2087 asm("mr %0,1" : "=r" (sp) :);
2088 asm("mr %0,2" : "=r" (toc) :);
2090 printf("msr = "REG" sprg0 = "REG"\n",
2091 mfmsr(), mfspr(SPRN_SPRG0));
2092 printf("pvr = "REG" sprg1 = "REG"\n",
2093 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2094 printf("dec = "REG" sprg2 = "REG"\n",
2095 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2096 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2097 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
2099 dump_206_sprs();
2100 dump_207_sprs();
2101 dump_300_sprs();
2102 dump_310_sprs();
2104 return;
2106 case 'w': {
2107 unsigned long val;
2108 scanhex(&regno);
2109 val = 0;
2110 read_spr(regno, &val);
2111 scanhex(&val);
2112 write_spr(regno, val);
2113 dump_one_spr(regno, true);
2114 break;
2116 case 'r':
2117 scanhex(&regno);
2118 dump_one_spr(regno, true);
2119 break;
2120 case 'a':
2121 /* dump ALL SPRs */
2122 for (spr = 1; spr < 1024; ++spr)
2123 dump_one_spr(spr, false);
2124 break;
2127 scannl();
2131 * Stuff for reading and writing memory safely
2133 static int
2134 mread(unsigned long adrs, void *buf, int size)
2136 volatile int n;
2137 char *p, *q;
2139 n = 0;
2140 if (setjmp(bus_error_jmp) == 0) {
2141 catch_memory_errors = 1;
2142 sync();
2143 p = (char *)adrs;
2144 q = (char *)buf;
2145 switch (size) {
2146 case 2:
2147 *(u16 *)q = *(u16 *)p;
2148 break;
2149 case 4:
2150 *(u32 *)q = *(u32 *)p;
2151 break;
2152 case 8:
2153 *(u64 *)q = *(u64 *)p;
2154 break;
2155 default:
2156 for( ; n < size; ++n) {
2157 *q++ = *p++;
2158 sync();
2161 sync();
2162 /* wait a little while to see if we get a machine check */
2163 __delay(200);
2164 n = size;
2166 catch_memory_errors = 0;
2167 return n;
2170 static int
2171 mwrite(unsigned long adrs, void *buf, int size)
2173 volatile int n;
2174 char *p, *q;
2176 n = 0;
2178 if (xmon_is_ro) {
2179 printf(xmon_ro_msg);
2180 return n;
2183 if (setjmp(bus_error_jmp) == 0) {
2184 catch_memory_errors = 1;
2185 sync();
2186 p = (char *) adrs;
2187 q = (char *) buf;
2188 switch (size) {
2189 case 2:
2190 *(u16 *)p = *(u16 *)q;
2191 break;
2192 case 4:
2193 *(u32 *)p = *(u32 *)q;
2194 break;
2195 case 8:
2196 *(u64 *)p = *(u64 *)q;
2197 break;
2198 default:
2199 for ( ; n < size; ++n) {
2200 *p++ = *q++;
2201 sync();
2204 sync();
2205 /* wait a little while to see if we get a machine check */
2206 __delay(200);
2207 n = size;
2208 } else {
2209 printf("*** Error writing address "REG"\n", adrs + n);
2211 catch_memory_errors = 0;
2212 return n;
2215 static int
2216 mread_instr(unsigned long adrs, struct ppc_inst *instr)
2218 volatile int n;
2220 n = 0;
2221 if (setjmp(bus_error_jmp) == 0) {
2222 catch_memory_errors = 1;
2223 sync();
2224 *instr = ppc_inst_read((struct ppc_inst *)adrs);
2225 sync();
2226 /* wait a little while to see if we get a machine check */
2227 __delay(200);
2228 n = ppc_inst_len(*instr);
2230 catch_memory_errors = 0;
2231 return n;
2234 static int fault_type;
2235 static int fault_except;
2236 static char *fault_chars[] = { "--", "**", "##" };
2238 static int handle_fault(struct pt_regs *regs)
2240 fault_except = TRAP(regs);
2241 switch (TRAP(regs)) {
2242 case 0x200:
2243 fault_type = 0;
2244 break;
2245 case 0x300:
2246 case 0x380:
2247 fault_type = 1;
2248 break;
2249 default:
2250 fault_type = 2;
2253 longjmp(bus_error_jmp, 1);
2255 return 0;
2258 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2260 static void
2261 byterev(unsigned char *val, int size)
2263 int t;
2265 switch (size) {
2266 case 2:
2267 SWAP(val[0], val[1], t);
2268 break;
2269 case 4:
2270 SWAP(val[0], val[3], t);
2271 SWAP(val[1], val[2], t);
2272 break;
2273 case 8: /* is there really any use for this? */
2274 SWAP(val[0], val[7], t);
2275 SWAP(val[1], val[6], t);
2276 SWAP(val[2], val[5], t);
2277 SWAP(val[3], val[4], t);
2278 break;
2282 static int brev;
2283 static int mnoread;
2285 static char *memex_help_string =
2286 "Memory examine command usage:\n"
2287 "m [addr] [flags] examine/change memory\n"
2288 " addr is optional. will start where left off.\n"
2289 " flags may include chars from this set:\n"
2290 " b modify by bytes (default)\n"
2291 " w modify by words (2 byte)\n"
2292 " l modify by longs (4 byte)\n"
2293 " d modify by doubleword (8 byte)\n"
2294 " r toggle reverse byte order mode\n"
2295 " n do not read memory (for i/o spaces)\n"
2296 " . ok to read (default)\n"
2297 "NOTE: flags are saved as defaults\n"
2300 static char *memex_subcmd_help_string =
2301 "Memory examine subcommands:\n"
2302 " hexval write this val to current location\n"
2303 " 'string' write chars from string to this location\n"
2304 " ' increment address\n"
2305 " ^ decrement address\n"
2306 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2307 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2308 " ` clear no-read flag\n"
2309 " ; stay at this addr\n"
2310 " v change to byte mode\n"
2311 " w change to word (2 byte) mode\n"
2312 " l change to long (4 byte) mode\n"
2313 " u change to doubleword (8 byte) mode\n"
2314 " m addr change current addr\n"
2315 " n toggle no-read flag\n"
2316 " r toggle byte reverse flag\n"
2317 " < count back up count bytes\n"
2318 " > count skip forward count bytes\n"
2319 " x exit this mode\n"
2322 static void
2323 memex(void)
2325 int cmd, inc, i, nslash;
2326 unsigned long n;
2327 unsigned char val[16];
2329 scanhex((void *)&adrs);
2330 cmd = skipbl();
2331 if (cmd == '?') {
2332 printf(memex_help_string);
2333 return;
2334 } else {
2335 termch = cmd;
2337 last_cmd = "m\n";
2338 while ((cmd = skipbl()) != '\n') {
2339 switch( cmd ){
2340 case 'b': size = 1; break;
2341 case 'w': size = 2; break;
2342 case 'l': size = 4; break;
2343 case 'd': size = 8; break;
2344 case 'r': brev = !brev; break;
2345 case 'n': mnoread = 1; break;
2346 case '.': mnoread = 0; break;
2349 if( size <= 0 )
2350 size = 1;
2351 else if( size > 8 )
2352 size = 8;
2353 for(;;){
2354 if (!mnoread)
2355 n = mread(adrs, val, size);
2356 printf(REG"%c", adrs, brev? 'r': ' ');
2357 if (!mnoread) {
2358 if (brev)
2359 byterev(val, size);
2360 putchar(' ');
2361 for (i = 0; i < n; ++i)
2362 printf("%.2x", val[i]);
2363 for (; i < size; ++i)
2364 printf("%s", fault_chars[fault_type]);
2366 putchar(' ');
2367 inc = size;
2368 nslash = 0;
2369 for(;;){
2370 if( scanhex(&n) ){
2371 for (i = 0; i < size; ++i)
2372 val[i] = n >> (i * 8);
2373 if (!brev)
2374 byterev(val, size);
2375 mwrite(adrs, val, size);
2376 inc = size;
2378 cmd = skipbl();
2379 if (cmd == '\n')
2380 break;
2381 inc = 0;
2382 switch (cmd) {
2383 case '\'':
2384 for(;;){
2385 n = inchar();
2386 if( n == '\\' )
2387 n = bsesc();
2388 else if( n == '\'' )
2389 break;
2390 for (i = 0; i < size; ++i)
2391 val[i] = n >> (i * 8);
2392 if (!brev)
2393 byterev(val, size);
2394 mwrite(adrs, val, size);
2395 adrs += size;
2397 adrs -= size;
2398 inc = size;
2399 break;
2400 case ',':
2401 adrs += size;
2402 break;
2403 case '.':
2404 mnoread = 0;
2405 break;
2406 case ';':
2407 break;
2408 case 'x':
2409 case EOF:
2410 scannl();
2411 return;
2412 case 'b':
2413 case 'v':
2414 size = 1;
2415 break;
2416 case 'w':
2417 size = 2;
2418 break;
2419 case 'l':
2420 size = 4;
2421 break;
2422 case 'u':
2423 size = 8;
2424 break;
2425 case '^':
2426 adrs -= size;
2427 break;
2428 case '/':
2429 if (nslash > 0)
2430 adrs -= 1 << nslash;
2431 else
2432 nslash = 0;
2433 nslash += 4;
2434 adrs += 1 << nslash;
2435 break;
2436 case '\\':
2437 if (nslash < 0)
2438 adrs += 1 << -nslash;
2439 else
2440 nslash = 0;
2441 nslash -= 4;
2442 adrs -= 1 << -nslash;
2443 break;
2444 case 'm':
2445 scanhex((void *)&adrs);
2446 break;
2447 case 'n':
2448 mnoread = 1;
2449 break;
2450 case 'r':
2451 brev = !brev;
2452 break;
2453 case '<':
2454 n = size;
2455 scanhex(&n);
2456 adrs -= n;
2457 break;
2458 case '>':
2459 n = size;
2460 scanhex(&n);
2461 adrs += n;
2462 break;
2463 case '?':
2464 printf(memex_subcmd_help_string);
2465 break;
2468 adrs += inc;
2472 static int
2473 bsesc(void)
2475 int c;
2477 c = inchar();
2478 switch( c ){
2479 case 'n': c = '\n'; break;
2480 case 'r': c = '\r'; break;
2481 case 'b': c = '\b'; break;
2482 case 't': c = '\t'; break;
2484 return c;
2487 static void xmon_rawdump (unsigned long adrs, long ndump)
2489 long n, m, r, nr;
2490 unsigned char temp[16];
2492 for (n = ndump; n > 0;) {
2493 r = n < 16? n: 16;
2494 nr = mread(adrs, temp, r);
2495 adrs += nr;
2496 for (m = 0; m < r; ++m) {
2497 if (m < nr)
2498 printf("%.2x", temp[m]);
2499 else
2500 printf("%s", fault_chars[fault_type]);
2502 n -= r;
2503 if (nr < r)
2504 break;
2506 printf("\n");
2509 static void dump_tracing(void)
2511 int c;
2513 c = inchar();
2514 if (c == 'c')
2515 ftrace_dump(DUMP_ORIG);
2516 else
2517 ftrace_dump(DUMP_ALL);
2520 #ifdef CONFIG_PPC64
2521 static void dump_one_paca(int cpu)
2523 struct paca_struct *p;
2524 #ifdef CONFIG_PPC_BOOK3S_64
2525 int i = 0;
2526 #endif
2528 if (setjmp(bus_error_jmp) != 0) {
2529 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2530 return;
2533 catch_memory_errors = 1;
2534 sync();
2536 p = paca_ptrs[cpu];
2538 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2540 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2541 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2542 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2544 #define DUMP(paca, name, format) \
2545 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2546 offsetof(struct paca_struct, name));
2548 DUMP(p, lock_token, "%#-*x");
2549 DUMP(p, paca_index, "%#-*x");
2550 DUMP(p, kernel_toc, "%#-*llx");
2551 DUMP(p, kernelbase, "%#-*llx");
2552 DUMP(p, kernel_msr, "%#-*llx");
2553 DUMP(p, emergency_sp, "%-*px");
2554 #ifdef CONFIG_PPC_BOOK3S_64
2555 DUMP(p, nmi_emergency_sp, "%-*px");
2556 DUMP(p, mc_emergency_sp, "%-*px");
2557 DUMP(p, in_nmi, "%#-*x");
2558 DUMP(p, in_mce, "%#-*x");
2559 DUMP(p, hmi_event_available, "%#-*x");
2560 #endif
2561 DUMP(p, data_offset, "%#-*llx");
2562 DUMP(p, hw_cpu_id, "%#-*x");
2563 DUMP(p, cpu_start, "%#-*x");
2564 DUMP(p, kexec_state, "%#-*x");
2565 #ifdef CONFIG_PPC_BOOK3S_64
2566 if (!early_radix_enabled()) {
2567 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2568 u64 esid, vsid;
2570 if (!p->slb_shadow_ptr)
2571 continue;
2573 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2574 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2576 if (esid || vsid) {
2577 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2578 22, "slb_shadow", i, esid, vsid);
2581 DUMP(p, vmalloc_sllp, "%#-*x");
2582 DUMP(p, stab_rr, "%#-*x");
2583 DUMP(p, slb_used_bitmap, "%#-*x");
2584 DUMP(p, slb_kern_bitmap, "%#-*x");
2586 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2587 DUMP(p, slb_cache_ptr, "%#-*x");
2588 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2589 printf(" %-*s[%d] = 0x%016x\n",
2590 22, "slb_cache", i, p->slb_cache[i]);
2594 DUMP(p, rfi_flush_fallback_area, "%-*px");
2595 #endif
2596 DUMP(p, dscr_default, "%#-*llx");
2597 #ifdef CONFIG_PPC_BOOK3E
2598 DUMP(p, pgd, "%-*px");
2599 DUMP(p, kernel_pgd, "%-*px");
2600 DUMP(p, tcd_ptr, "%-*px");
2601 DUMP(p, mc_kstack, "%-*px");
2602 DUMP(p, crit_kstack, "%-*px");
2603 DUMP(p, dbg_kstack, "%-*px");
2604 #endif
2605 DUMP(p, __current, "%-*px");
2606 DUMP(p, kstack, "%#-*llx");
2607 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2608 #ifdef CONFIG_STACKPROTECTOR
2609 DUMP(p, canary, "%#-*lx");
2610 #endif
2611 DUMP(p, saved_r1, "%#-*llx");
2612 #ifdef CONFIG_PPC_BOOK3E
2613 DUMP(p, trap_save, "%#-*x");
2614 #endif
2615 DUMP(p, irq_soft_mask, "%#-*x");
2616 DUMP(p, irq_happened, "%#-*x");
2617 #ifdef CONFIG_MMIOWB
2618 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2619 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2620 #endif
2621 DUMP(p, irq_work_pending, "%#-*x");
2622 DUMP(p, sprg_vdso, "%#-*llx");
2624 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2625 DUMP(p, tm_scratch, "%#-*llx");
2626 #endif
2628 #ifdef CONFIG_PPC_POWERNV
2629 DUMP(p, idle_state, "%#-*lx");
2630 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2631 DUMP(p, thread_idle_state, "%#-*x");
2632 DUMP(p, subcore_sibling_mask, "%#-*x");
2633 } else {
2634 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2635 DUMP(p, requested_psscr, "%#-*llx");
2636 DUMP(p, dont_stop.counter, "%#-*x");
2637 #endif
2639 #endif
2641 DUMP(p, accounting.utime, "%#-*lx");
2642 DUMP(p, accounting.stime, "%#-*lx");
2643 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2644 DUMP(p, accounting.utime_scaled, "%#-*lx");
2645 #endif
2646 DUMP(p, accounting.starttime, "%#-*lx");
2647 DUMP(p, accounting.starttime_user, "%#-*lx");
2648 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2649 DUMP(p, accounting.startspurr, "%#-*lx");
2650 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2651 #endif
2652 DUMP(p, accounting.steal_time, "%#-*lx");
2653 #undef DUMP
2655 catch_memory_errors = 0;
2656 sync();
2659 static void dump_all_pacas(void)
2661 int cpu;
2663 if (num_possible_cpus() == 0) {
2664 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2665 return;
2668 for_each_possible_cpu(cpu)
2669 dump_one_paca(cpu);
2672 static void dump_pacas(void)
2674 unsigned long num;
2675 int c;
2677 c = inchar();
2678 if (c == 'a') {
2679 dump_all_pacas();
2680 return;
2683 termch = c; /* Put c back, it wasn't 'a' */
2685 if (scanhex(&num))
2686 dump_one_paca(num);
2687 else
2688 dump_one_paca(xmon_owner);
2690 #endif
2692 #ifdef CONFIG_PPC_POWERNV
2693 static void dump_one_xive(int cpu)
2695 unsigned int hwid = get_hard_smp_processor_id(cpu);
2696 bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2698 if (hv) {
2699 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2700 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2701 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2702 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2703 opal_xive_dump(XIVE_DUMP_VP, hwid);
2704 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2707 if (setjmp(bus_error_jmp) != 0) {
2708 catch_memory_errors = 0;
2709 printf("*** Error dumping xive on cpu %d\n", cpu);
2710 return;
2713 catch_memory_errors = 1;
2714 sync();
2715 xmon_xive_do_dump(cpu);
2716 sync();
2717 __delay(200);
2718 catch_memory_errors = 0;
2721 static void dump_all_xives(void)
2723 int cpu;
2725 if (num_possible_cpus() == 0) {
2726 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2727 return;
2730 for_each_possible_cpu(cpu)
2731 dump_one_xive(cpu);
2734 static void dump_one_xive_irq(u32 num, struct irq_data *d)
2736 xmon_xive_get_irq_config(num, d);
2739 static void dump_all_xive_irq(void)
2741 unsigned int i;
2742 struct irq_desc *desc;
2744 for_each_irq_desc(i, desc) {
2745 struct irq_data *d = irq_desc_get_irq_data(desc);
2746 unsigned int hwirq;
2748 if (!d)
2749 continue;
2751 hwirq = (unsigned int)irqd_to_hwirq(d);
2752 /* IPIs are special (HW number 0) */
2753 if (hwirq)
2754 dump_one_xive_irq(hwirq, d);
2758 static void dump_xives(void)
2760 unsigned long num;
2761 int c;
2763 if (!xive_enabled()) {
2764 printf("Xive disabled on this system\n");
2765 return;
2768 c = inchar();
2769 if (c == 'a') {
2770 dump_all_xives();
2771 return;
2772 } else if (c == 'i') {
2773 if (scanhex(&num))
2774 dump_one_xive_irq(num, NULL);
2775 else
2776 dump_all_xive_irq();
2777 return;
2780 termch = c; /* Put c back, it wasn't 'a' */
2782 if (scanhex(&num))
2783 dump_one_xive(num);
2784 else
2785 dump_one_xive(xmon_owner);
2787 #endif /* CONFIG_PPC_POWERNV */
2789 static void dump_by_size(unsigned long addr, long count, int size)
2791 unsigned char temp[16];
2792 int i, j;
2793 u64 val;
2795 count = ALIGN(count, 16);
2797 for (i = 0; i < count; i += 16, addr += 16) {
2798 printf(REG, addr);
2800 if (mread(addr, temp, 16) != 16) {
2801 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2802 return;
2805 for (j = 0; j < 16; j += size) {
2806 putchar(' ');
2807 switch (size) {
2808 case 1: val = temp[j]; break;
2809 case 2: val = *(u16 *)&temp[j]; break;
2810 case 4: val = *(u32 *)&temp[j]; break;
2811 case 8: val = *(u64 *)&temp[j]; break;
2812 default: val = 0;
2815 printf("%0*llx", size * 2, val);
2817 printf(" |");
2818 for (j = 0; j < 16; ++j) {
2819 val = temp[j];
2820 putchar(' ' <= val && val <= '~' ? val : '.');
2822 printf("|\n");
2826 static void
2827 dump(void)
2829 static char last[] = { "d?\n" };
2830 int c;
2832 c = inchar();
2834 #ifdef CONFIG_PPC64
2835 if (c == 'p') {
2836 xmon_start_pagination();
2837 dump_pacas();
2838 xmon_end_pagination();
2839 return;
2841 #endif
2842 #ifdef CONFIG_PPC_POWERNV
2843 if (c == 'x') {
2844 xmon_start_pagination();
2845 dump_xives();
2846 xmon_end_pagination();
2847 return;
2849 #endif
2851 if (c == 't') {
2852 dump_tracing();
2853 return;
2856 if (c == '\n')
2857 termch = c;
2859 scanhex((void *)&adrs);
2860 if (termch != '\n')
2861 termch = 0;
2862 if (c == 'i') {
2863 scanhex(&nidump);
2864 if (nidump == 0)
2865 nidump = 16;
2866 else if (nidump > MAX_IDUMP)
2867 nidump = MAX_IDUMP;
2868 adrs += ppc_inst_dump(adrs, nidump, 1);
2869 last_cmd = "di\n";
2870 } else if (c == 'l') {
2871 dump_log_buf();
2872 } else if (c == 'o') {
2873 dump_opal_msglog();
2874 } else if (c == 'v') {
2875 /* dump virtual to physical translation */
2876 show_pte(adrs);
2877 } else if (c == 'r') {
2878 scanhex(&ndump);
2879 if (ndump == 0)
2880 ndump = 64;
2881 xmon_rawdump(adrs, ndump);
2882 adrs += ndump;
2883 last_cmd = "dr\n";
2884 } else {
2885 scanhex(&ndump);
2886 if (ndump == 0)
2887 ndump = 64;
2888 else if (ndump > MAX_DUMP)
2889 ndump = MAX_DUMP;
2891 switch (c) {
2892 case '8':
2893 case '4':
2894 case '2':
2895 case '1':
2896 ndump = ALIGN(ndump, 16);
2897 dump_by_size(adrs, ndump, c - '0');
2898 last[1] = c;
2899 last_cmd = last;
2900 break;
2901 default:
2902 prdump(adrs, ndump);
2903 last_cmd = "d\n";
2906 adrs += ndump;
2910 static void
2911 prdump(unsigned long adrs, long ndump)
2913 long n, m, c, r, nr;
2914 unsigned char temp[16];
2916 for (n = ndump; n > 0;) {
2917 printf(REG, adrs);
2918 putchar(' ');
2919 r = n < 16? n: 16;
2920 nr = mread(adrs, temp, r);
2921 adrs += nr;
2922 for (m = 0; m < r; ++m) {
2923 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2924 putchar(' ');
2925 if (m < nr)
2926 printf("%.2x", temp[m]);
2927 else
2928 printf("%s", fault_chars[fault_type]);
2930 for (; m < 16; ++m) {
2931 if ((m & (sizeof(long) - 1)) == 0)
2932 putchar(' ');
2933 printf(" ");
2935 printf(" |");
2936 for (m = 0; m < r; ++m) {
2937 if (m < nr) {
2938 c = temp[m];
2939 putchar(' ' <= c && c <= '~'? c: '.');
2940 } else
2941 putchar(' ');
2943 n -= r;
2944 for (; m < 16; ++m)
2945 putchar(' ');
2946 printf("|\n");
2947 if (nr < r)
2948 break;
2952 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2954 static int
2955 generic_inst_dump(unsigned long adr, long count, int praddr,
2956 instruction_dump_func dump_func)
2958 int nr, dotted;
2959 unsigned long first_adr;
2960 struct ppc_inst inst, last_inst = ppc_inst(0);
2962 dotted = 0;
2963 for (first_adr = adr; count > 0; --count, adr += ppc_inst_len(inst)) {
2964 nr = mread_instr(adr, &inst);
2965 if (nr == 0) {
2966 if (praddr) {
2967 const char *x = fault_chars[fault_type];
2968 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2970 break;
2972 if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
2973 if (!dotted) {
2974 printf(" ...\n");
2975 dotted = 1;
2977 continue;
2979 dotted = 0;
2980 last_inst = inst;
2981 if (praddr)
2982 printf(REG" %s", adr, ppc_inst_as_str(inst));
2983 printf("\t");
2984 if (!ppc_inst_prefixed(inst))
2985 dump_func(ppc_inst_val(inst), adr);
2986 else
2987 dump_func(ppc_inst_as_u64(inst), adr);
2988 printf("\n");
2990 return adr - first_adr;
2993 static int
2994 ppc_inst_dump(unsigned long adr, long count, int praddr)
2996 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2999 void
3000 print_address(unsigned long addr)
3002 xmon_print_symbol(addr, "\t# ", "");
3005 static void
3006 dump_log_buf(void)
3008 struct kmsg_dumper dumper = { .active = 1 };
3009 unsigned char buf[128];
3010 size_t len;
3012 if (setjmp(bus_error_jmp) != 0) {
3013 printf("Error dumping printk buffer!\n");
3014 return;
3017 catch_memory_errors = 1;
3018 sync();
3020 kmsg_dump_rewind_nolock(&dumper);
3021 xmon_start_pagination();
3022 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
3023 buf[len] = '\0';
3024 printf("%s", buf);
3026 xmon_end_pagination();
3028 sync();
3029 /* wait a little while to see if we get a machine check */
3030 __delay(200);
3031 catch_memory_errors = 0;
3034 #ifdef CONFIG_PPC_POWERNV
3035 static void dump_opal_msglog(void)
3037 unsigned char buf[128];
3038 ssize_t res;
3039 loff_t pos = 0;
3041 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
3042 printf("Machine is not running OPAL firmware.\n");
3043 return;
3046 if (setjmp(bus_error_jmp) != 0) {
3047 printf("Error dumping OPAL msglog!\n");
3048 return;
3051 catch_memory_errors = 1;
3052 sync();
3054 xmon_start_pagination();
3055 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
3056 if (res < 0) {
3057 printf("Error dumping OPAL msglog! Error: %zd\n", res);
3058 break;
3060 buf[res] = '\0';
3061 printf("%s", buf);
3062 pos += res;
3064 xmon_end_pagination();
3066 sync();
3067 /* wait a little while to see if we get a machine check */
3068 __delay(200);
3069 catch_memory_errors = 0;
3071 #endif
3074 * Memory operations - move, set, print differences
3076 static unsigned long mdest; /* destination address */
3077 static unsigned long msrc; /* source address */
3078 static unsigned long mval; /* byte value to set memory to */
3079 static unsigned long mcount; /* # bytes to affect */
3080 static unsigned long mdiffs; /* max # differences to print */
3082 static void
3083 memops(int cmd)
3085 scanhex((void *)&mdest);
3086 if( termch != '\n' )
3087 termch = 0;
3088 scanhex((void *)(cmd == 's'? &mval: &msrc));
3089 if( termch != '\n' )
3090 termch = 0;
3091 scanhex((void *)&mcount);
3092 switch( cmd ){
3093 case 'm':
3094 if (xmon_is_ro) {
3095 printf(xmon_ro_msg);
3096 break;
3098 memmove((void *)mdest, (void *)msrc, mcount);
3099 break;
3100 case 's':
3101 if (xmon_is_ro) {
3102 printf(xmon_ro_msg);
3103 break;
3105 memset((void *)mdest, mval, mcount);
3106 break;
3107 case 'd':
3108 if( termch != '\n' )
3109 termch = 0;
3110 scanhex((void *)&mdiffs);
3111 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3112 break;
3116 static void
3117 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3119 unsigned n, prt;
3121 prt = 0;
3122 for( n = nb; n > 0; --n )
3123 if( *p1++ != *p2++ )
3124 if( ++prt <= maxpr )
3125 printf("%px %.2x # %px %.2x\n", p1 - 1,
3126 p1[-1], p2 - 1, p2[-1]);
3127 if( prt > maxpr )
3128 printf("Total of %d differences\n", prt);
3131 static unsigned mend;
3132 static unsigned mask;
3134 static void
3135 memlocate(void)
3137 unsigned a, n;
3138 unsigned char val[4];
3140 last_cmd = "ml";
3141 scanhex((void *)&mdest);
3142 if (termch != '\n') {
3143 termch = 0;
3144 scanhex((void *)&mend);
3145 if (termch != '\n') {
3146 termch = 0;
3147 scanhex((void *)&mval);
3148 mask = ~0;
3149 if (termch != '\n') termch = 0;
3150 scanhex((void *)&mask);
3153 n = 0;
3154 for (a = mdest; a < mend; a += 4) {
3155 if (mread(a, val, 4) == 4
3156 && ((GETWORD(val) ^ mval) & mask) == 0) {
3157 printf("%.16x: %.16x\n", a, GETWORD(val));
3158 if (++n >= 10)
3159 break;
3164 static unsigned long mskip = 0x1000;
3165 static unsigned long mlim = 0xffffffff;
3167 static void
3168 memzcan(void)
3170 unsigned char v;
3171 unsigned a;
3172 int ok, ook;
3174 scanhex(&mdest);
3175 if (termch != '\n') termch = 0;
3176 scanhex(&mskip);
3177 if (termch != '\n') termch = 0;
3178 scanhex(&mlim);
3179 ook = 0;
3180 for (a = mdest; a < mlim; a += mskip) {
3181 ok = mread(a, &v, 1);
3182 if (ok && !ook) {
3183 printf("%.8x .. ", a);
3184 } else if (!ok && ook)
3185 printf("%.8lx\n", a - mskip);
3186 ook = ok;
3187 if (a + mskip < a)
3188 break;
3190 if (ook)
3191 printf("%.8lx\n", a - mskip);
3194 static void show_task(struct task_struct *tsk)
3196 char state;
3199 * Cloned from kdb_task_state_char(), which is not entirely
3200 * appropriate for calling from xmon. This could be moved
3201 * to a common, generic, routine used by both.
3203 state = (tsk->state == 0) ? 'R' :
3204 (tsk->state < 0) ? 'U' :
3205 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3206 (tsk->state & TASK_STOPPED) ? 'T' :
3207 (tsk->state & TASK_TRACED) ? 'C' :
3208 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3209 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3210 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3212 printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk,
3213 tsk->thread.ksp, tsk->thread.regs,
3214 tsk->pid, rcu_dereference(tsk->parent)->pid,
3215 state, task_cpu(tsk),
3216 tsk->comm);
3219 #ifdef CONFIG_PPC_BOOK3S_64
3220 static void format_pte(void *ptep, unsigned long pte)
3222 pte_t entry = __pte(pte);
3224 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3225 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3227 printf("Flags = %s%s%s%s%s\n",
3228 pte_young(entry) ? "Accessed " : "",
3229 pte_dirty(entry) ? "Dirty " : "",
3230 pte_read(entry) ? "Read " : "",
3231 pte_write(entry) ? "Write " : "",
3232 pte_exec(entry) ? "Exec " : "");
3235 static void show_pte(unsigned long addr)
3237 unsigned long tskv = 0;
3238 struct task_struct *tsk = NULL;
3239 struct mm_struct *mm;
3240 pgd_t *pgdp;
3241 p4d_t *p4dp;
3242 pud_t *pudp;
3243 pmd_t *pmdp;
3244 pte_t *ptep;
3246 if (!scanhex(&tskv))
3247 mm = &init_mm;
3248 else
3249 tsk = (struct task_struct *)tskv;
3251 if (tsk == NULL)
3252 mm = &init_mm;
3253 else
3254 mm = tsk->active_mm;
3256 if (setjmp(bus_error_jmp) != 0) {
3257 catch_memory_errors = 0;
3258 printf("*** Error dumping pte for task %px\n", tsk);
3259 return;
3262 catch_memory_errors = 1;
3263 sync();
3265 if (mm == &init_mm)
3266 pgdp = pgd_offset_k(addr);
3267 else
3268 pgdp = pgd_offset(mm, addr);
3270 p4dp = p4d_offset(pgdp, addr);
3272 if (p4d_none(*p4dp)) {
3273 printf("No valid P4D\n");
3274 return;
3277 if (p4d_is_leaf(*p4dp)) {
3278 format_pte(p4dp, p4d_val(*p4dp));
3279 return;
3282 printf("p4dp @ 0x%px = 0x%016lx\n", p4dp, p4d_val(*p4dp));
3284 pudp = pud_offset(p4dp, addr);
3286 if (pud_none(*pudp)) {
3287 printf("No valid PUD\n");
3288 return;
3291 if (pud_is_leaf(*pudp)) {
3292 format_pte(pudp, pud_val(*pudp));
3293 return;
3296 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3298 pmdp = pmd_offset(pudp, addr);
3300 if (pmd_none(*pmdp)) {
3301 printf("No valid PMD\n");
3302 return;
3305 if (pmd_is_leaf(*pmdp)) {
3306 format_pte(pmdp, pmd_val(*pmdp));
3307 return;
3309 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3311 ptep = pte_offset_map(pmdp, addr);
3312 if (pte_none(*ptep)) {
3313 printf("no valid PTE\n");
3314 return;
3317 format_pte(ptep, pte_val(*ptep));
3319 sync();
3320 __delay(200);
3321 catch_memory_errors = 0;
3323 #else
3324 static void show_pte(unsigned long addr)
3326 printf("show_pte not yet implemented\n");
3328 #endif /* CONFIG_PPC_BOOK3S_64 */
3330 static void show_tasks(void)
3332 unsigned long tskv;
3333 struct task_struct *tsk = NULL;
3335 printf(" task_struct ->thread.ksp ->thread.regs PID PPID S P CMD\n");
3337 if (scanhex(&tskv))
3338 tsk = (struct task_struct *)tskv;
3340 if (setjmp(bus_error_jmp) != 0) {
3341 catch_memory_errors = 0;
3342 printf("*** Error dumping task %px\n", tsk);
3343 return;
3346 catch_memory_errors = 1;
3347 sync();
3349 if (tsk)
3350 show_task(tsk);
3351 else
3352 for_each_process(tsk)
3353 show_task(tsk);
3355 sync();
3356 __delay(200);
3357 catch_memory_errors = 0;
3360 static void proccall(void)
3362 unsigned long args[8];
3363 unsigned long ret;
3364 int i;
3365 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3366 unsigned long, unsigned long, unsigned long,
3367 unsigned long, unsigned long, unsigned long);
3368 callfunc_t func;
3370 if (!scanhex(&adrs))
3371 return;
3372 if (termch != '\n')
3373 termch = 0;
3374 for (i = 0; i < 8; ++i)
3375 args[i] = 0;
3376 for (i = 0; i < 8; ++i) {
3377 if (!scanhex(&args[i]) || termch == '\n')
3378 break;
3379 termch = 0;
3381 func = (callfunc_t) adrs;
3382 ret = 0;
3383 if (setjmp(bus_error_jmp) == 0) {
3384 catch_memory_errors = 1;
3385 sync();
3386 ret = func(args[0], args[1], args[2], args[3],
3387 args[4], args[5], args[6], args[7]);
3388 sync();
3389 printf("return value is 0x%lx\n", ret);
3390 } else {
3391 printf("*** %x exception occurred\n", fault_except);
3393 catch_memory_errors = 0;
3396 /* Input scanning routines */
3398 skipbl(void)
3400 int c;
3402 if( termch != 0 ){
3403 c = termch;
3404 termch = 0;
3405 } else
3406 c = inchar();
3407 while( c == ' ' || c == '\t' )
3408 c = inchar();
3409 return c;
3412 #define N_PTREGS 44
3413 static const char *regnames[N_PTREGS] = {
3414 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3415 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3416 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3417 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3418 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3419 #ifdef CONFIG_PPC64
3420 "softe",
3421 #else
3422 "mq",
3423 #endif
3424 "trap", "dar", "dsisr", "res"
3428 scanhex(unsigned long *vp)
3430 int c, d;
3431 unsigned long v;
3433 c = skipbl();
3434 if (c == '%') {
3435 /* parse register name */
3436 char regname[8];
3437 int i;
3439 for (i = 0; i < sizeof(regname) - 1; ++i) {
3440 c = inchar();
3441 if (!isalnum(c)) {
3442 termch = c;
3443 break;
3445 regname[i] = c;
3447 regname[i] = 0;
3448 i = match_string(regnames, N_PTREGS, regname);
3449 if (i < 0) {
3450 printf("invalid register name '%%%s'\n", regname);
3451 return 0;
3453 if (xmon_regs == NULL) {
3454 printf("regs not available\n");
3455 return 0;
3457 *vp = ((unsigned long *)xmon_regs)[i];
3458 return 1;
3461 /* skip leading "0x" if any */
3463 if (c == '0') {
3464 c = inchar();
3465 if (c == 'x') {
3466 c = inchar();
3467 } else {
3468 d = hexdigit(c);
3469 if (d == EOF) {
3470 termch = c;
3471 *vp = 0;
3472 return 1;
3475 } else if (c == '$') {
3476 int i;
3477 for (i=0; i<63; i++) {
3478 c = inchar();
3479 if (isspace(c) || c == '\0') {
3480 termch = c;
3481 break;
3483 tmpstr[i] = c;
3485 tmpstr[i++] = 0;
3486 *vp = 0;
3487 if (setjmp(bus_error_jmp) == 0) {
3488 catch_memory_errors = 1;
3489 sync();
3490 *vp = kallsyms_lookup_name(tmpstr);
3491 sync();
3493 catch_memory_errors = 0;
3494 if (!(*vp)) {
3495 printf("unknown symbol '%s'\n", tmpstr);
3496 return 0;
3498 return 1;
3501 d = hexdigit(c);
3502 if (d == EOF) {
3503 termch = c;
3504 return 0;
3506 v = 0;
3507 do {
3508 v = (v << 4) + d;
3509 c = inchar();
3510 d = hexdigit(c);
3511 } while (d != EOF);
3512 termch = c;
3513 *vp = v;
3514 return 1;
3517 static void
3518 scannl(void)
3520 int c;
3522 c = termch;
3523 termch = 0;
3524 while( c != '\n' )
3525 c = inchar();
3528 static int hexdigit(int c)
3530 if( '0' <= c && c <= '9' )
3531 return c - '0';
3532 if( 'A' <= c && c <= 'F' )
3533 return c - ('A' - 10);
3534 if( 'a' <= c && c <= 'f' )
3535 return c - ('a' - 10);
3536 return EOF;
3539 void
3540 getstring(char *s, int size)
3542 int c;
3544 c = skipbl();
3545 if (c == '\n') {
3546 *s = 0;
3547 return;
3550 do {
3551 if( size > 1 ){
3552 *s++ = c;
3553 --size;
3555 c = inchar();
3556 } while( c != ' ' && c != '\t' && c != '\n' );
3557 termch = c;
3558 *s = 0;
3561 static char line[256];
3562 static char *lineptr;
3564 static void
3565 flush_input(void)
3567 lineptr = NULL;
3570 static int
3571 inchar(void)
3573 if (lineptr == NULL || *lineptr == 0) {
3574 if (xmon_gets(line, sizeof(line)) == NULL) {
3575 lineptr = NULL;
3576 return EOF;
3578 lineptr = line;
3580 return *lineptr++;
3583 static void
3584 take_input(char *str)
3586 lineptr = str;
3590 static void
3591 symbol_lookup(void)
3593 int type = inchar();
3594 unsigned long addr, cpu;
3595 void __percpu *ptr = NULL;
3596 static char tmp[64];
3598 switch (type) {
3599 case 'a':
3600 if (scanhex(&addr))
3601 xmon_print_symbol(addr, ": ", "\n");
3602 termch = 0;
3603 break;
3604 case 's':
3605 getstring(tmp, 64);
3606 if (setjmp(bus_error_jmp) == 0) {
3607 catch_memory_errors = 1;
3608 sync();
3609 addr = kallsyms_lookup_name(tmp);
3610 if (addr)
3611 printf("%s: %lx\n", tmp, addr);
3612 else
3613 printf("Symbol '%s' not found.\n", tmp);
3614 sync();
3616 catch_memory_errors = 0;
3617 termch = 0;
3618 break;
3619 case 'p':
3620 getstring(tmp, 64);
3621 if (setjmp(bus_error_jmp) == 0) {
3622 catch_memory_errors = 1;
3623 sync();
3624 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3625 sync();
3628 if (ptr &&
3629 ptr >= (void __percpu *)__per_cpu_start &&
3630 ptr < (void __percpu *)__per_cpu_end)
3632 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3633 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3634 } else {
3635 cpu = raw_smp_processor_id();
3636 addr = (unsigned long)this_cpu_ptr(ptr);
3639 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3640 } else {
3641 printf("Percpu symbol '%s' not found.\n", tmp);
3644 catch_memory_errors = 0;
3645 termch = 0;
3646 break;
3651 /* Print an address in numeric and symbolic form (if possible) */
3652 static void xmon_print_symbol(unsigned long address, const char *mid,
3653 const char *after)
3655 char *modname;
3656 const char *name = NULL;
3657 unsigned long offset, size;
3659 printf(REG, address);
3660 if (setjmp(bus_error_jmp) == 0) {
3661 catch_memory_errors = 1;
3662 sync();
3663 name = kallsyms_lookup(address, &size, &offset, &modname,
3664 tmpstr);
3665 sync();
3666 /* wait a little while to see if we get a machine check */
3667 __delay(200);
3670 catch_memory_errors = 0;
3672 if (name) {
3673 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3674 if (modname)
3675 printf(" [%s]", modname);
3677 printf("%s", after);
3680 #ifdef CONFIG_PPC_BOOK3S_64
3681 void dump_segments(void)
3683 int i;
3684 unsigned long esid,vsid;
3685 unsigned long llp;
3687 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3689 for (i = 0; i < mmu_slb_size; i++) {
3690 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3691 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3693 if (!esid && !vsid)
3694 continue;
3696 printf("%02d %016lx %016lx", i, esid, vsid);
3698 if (!(esid & SLB_ESID_V)) {
3699 printf("\n");
3700 continue;
3703 llp = vsid & SLB_VSID_LLP;
3704 if (vsid & SLB_VSID_B_1T) {
3705 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3706 GET_ESID_1T(esid),
3707 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3708 llp);
3709 } else {
3710 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3711 GET_ESID(esid),
3712 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3713 llp);
3717 #endif
3719 #ifdef CONFIG_PPC_BOOK3S_32
3720 void dump_segments(void)
3722 int i;
3724 printf("sr0-15 =");
3725 for (i = 0; i < 16; ++i)
3726 printf(" %x", mfsrin(i << 28));
3727 printf("\n");
3729 #endif
3731 #ifdef CONFIG_44x
3732 static void dump_tlb_44x(void)
3734 int i;
3736 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3737 unsigned long w0,w1,w2;
3738 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3739 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3740 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3741 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3742 if (w0 & PPC44x_TLB_VALID) {
3743 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3744 w0 & PPC44x_TLB_EPN_MASK,
3745 w1 & PPC44x_TLB_ERPN_MASK,
3746 w1 & PPC44x_TLB_RPN_MASK,
3747 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3748 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3749 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3750 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3751 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3753 printf("\n");
3756 #endif /* CONFIG_44x */
3758 #ifdef CONFIG_PPC_BOOK3E
3759 static void dump_tlb_book3e(void)
3761 u32 mmucfg, pidmask, lpidmask;
3762 u64 ramask;
3763 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3764 int mmu_version;
3765 static const char *pgsz_names[] = {
3766 " 1K",
3767 " 2K",
3768 " 4K",
3769 " 8K",
3770 " 16K",
3771 " 32K",
3772 " 64K",
3773 "128K",
3774 "256K",
3775 "512K",
3776 " 1M",
3777 " 2M",
3778 " 4M",
3779 " 8M",
3780 " 16M",
3781 " 32M",
3782 " 64M",
3783 "128M",
3784 "256M",
3785 "512M",
3786 " 1G",
3787 " 2G",
3788 " 4G",
3789 " 8G",
3790 " 16G",
3791 " 32G",
3792 " 64G",
3793 "128G",
3794 "256G",
3795 "512G",
3796 " 1T",
3797 " 2T",
3800 /* Gather some infos about the MMU */
3801 mmucfg = mfspr(SPRN_MMUCFG);
3802 mmu_version = (mmucfg & 3) + 1;
3803 ntlbs = ((mmucfg >> 2) & 3) + 1;
3804 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3805 lpidsz = (mmucfg >> 24) & 0xf;
3806 rasz = (mmucfg >> 16) & 0x7f;
3807 if ((mmu_version > 1) && (mmucfg & 0x10000))
3808 lrat = 1;
3809 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3810 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3811 pidmask = (1ul << pidsz) - 1;
3812 lpidmask = (1ul << lpidsz) - 1;
3813 ramask = (1ull << rasz) - 1;
3815 for (tlb = 0; tlb < ntlbs; tlb++) {
3816 u32 tlbcfg;
3817 int nent, assoc, new_cc = 1;
3818 printf("TLB %d:\n------\n", tlb);
3819 switch(tlb) {
3820 case 0:
3821 tlbcfg = mfspr(SPRN_TLB0CFG);
3822 break;
3823 case 1:
3824 tlbcfg = mfspr(SPRN_TLB1CFG);
3825 break;
3826 case 2:
3827 tlbcfg = mfspr(SPRN_TLB2CFG);
3828 break;
3829 case 3:
3830 tlbcfg = mfspr(SPRN_TLB3CFG);
3831 break;
3832 default:
3833 printf("Unsupported TLB number !\n");
3834 continue;
3836 nent = tlbcfg & 0xfff;
3837 assoc = (tlbcfg >> 24) & 0xff;
3838 for (i = 0; i < nent; i++) {
3839 u32 mas0 = MAS0_TLBSEL(tlb);
3840 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3841 u64 mas2 = 0;
3842 u64 mas7_mas3;
3843 int esel = i, cc = i;
3845 if (assoc != 0) {
3846 cc = i / assoc;
3847 esel = i % assoc;
3848 mas2 = cc * 0x1000;
3851 mas0 |= MAS0_ESEL(esel);
3852 mtspr(SPRN_MAS0, mas0);
3853 mtspr(SPRN_MAS1, mas1);
3854 mtspr(SPRN_MAS2, mas2);
3855 asm volatile("tlbre 0,0,0" : : : "memory");
3856 mas1 = mfspr(SPRN_MAS1);
3857 mas2 = mfspr(SPRN_MAS2);
3858 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3859 if (assoc && (i % assoc) == 0)
3860 new_cc = 1;
3861 if (!(mas1 & MAS1_VALID))
3862 continue;
3863 if (assoc == 0)
3864 printf("%04x- ", i);
3865 else if (new_cc)
3866 printf("%04x-%c", cc, 'A' + esel);
3867 else
3868 printf(" |%c", 'A' + esel);
3869 new_cc = 0;
3870 printf(" %016llx %04x %s %c%c AS%c",
3871 mas2 & ~0x3ffull,
3872 (mas1 >> 16) & 0x3fff,
3873 pgsz_names[(mas1 >> 7) & 0x1f],
3874 mas1 & MAS1_IND ? 'I' : ' ',
3875 mas1 & MAS1_IPROT ? 'P' : ' ',
3876 mas1 & MAS1_TS ? '1' : '0');
3877 printf(" %c%c%c%c%c%c%c",
3878 mas2 & MAS2_X0 ? 'a' : ' ',
3879 mas2 & MAS2_X1 ? 'v' : ' ',
3880 mas2 & MAS2_W ? 'w' : ' ',
3881 mas2 & MAS2_I ? 'i' : ' ',
3882 mas2 & MAS2_M ? 'm' : ' ',
3883 mas2 & MAS2_G ? 'g' : ' ',
3884 mas2 & MAS2_E ? 'e' : ' ');
3885 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3886 if (mas1 & MAS1_IND)
3887 printf(" %s\n",
3888 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3889 else
3890 printf(" U%c%c%c S%c%c%c\n",
3891 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3892 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3893 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3894 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3895 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3896 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3900 #endif /* CONFIG_PPC_BOOK3E */
3902 static void xmon_init(int enable)
3904 if (enable) {
3905 __debugger = xmon;
3906 __debugger_ipi = xmon_ipi;
3907 __debugger_bpt = xmon_bpt;
3908 __debugger_sstep = xmon_sstep;
3909 __debugger_iabr_match = xmon_iabr_match;
3910 __debugger_break_match = xmon_break_match;
3911 __debugger_fault_handler = xmon_fault_handler;
3913 #ifdef CONFIG_PPC_PSERIES
3915 * Get the token here to avoid trying to get a lock
3916 * during the crash, causing a deadlock.
3918 set_indicator_token = rtas_token("set-indicator");
3919 #endif
3920 } else {
3921 __debugger = NULL;
3922 __debugger_ipi = NULL;
3923 __debugger_bpt = NULL;
3924 __debugger_sstep = NULL;
3925 __debugger_iabr_match = NULL;
3926 __debugger_break_match = NULL;
3927 __debugger_fault_handler = NULL;
3931 #ifdef CONFIG_MAGIC_SYSRQ
3932 static void sysrq_handle_xmon(int key)
3934 if (xmon_is_locked_down()) {
3935 clear_all_bpt();
3936 xmon_init(0);
3937 return;
3939 /* ensure xmon is enabled */
3940 xmon_init(1);
3941 debugger(get_irq_regs());
3942 if (!xmon_on)
3943 xmon_init(0);
3946 static const struct sysrq_key_op sysrq_xmon_op = {
3947 .handler = sysrq_handle_xmon,
3948 .help_msg = "xmon(x)",
3949 .action_msg = "Entering xmon",
3952 static int __init setup_xmon_sysrq(void)
3954 register_sysrq_key('x', &sysrq_xmon_op);
3955 return 0;
3957 device_initcall(setup_xmon_sysrq);
3958 #endif /* CONFIG_MAGIC_SYSRQ */
3960 static void clear_all_bpt(void)
3962 int i;
3964 /* clear/unpatch all breakpoints */
3965 remove_bpts();
3966 remove_cpu_bpts();
3968 /* Disable all breakpoints */
3969 for (i = 0; i < NBPTS; ++i)
3970 bpts[i].enabled = 0;
3972 /* Clear any data or iabr breakpoints */
3973 iabr = NULL;
3974 for (i = 0; i < nr_wp_slots(); i++)
3975 dabr[i].enabled = 0;
3978 #ifdef CONFIG_DEBUG_FS
3979 static int xmon_dbgfs_set(void *data, u64 val)
3981 xmon_on = !!val;
3982 xmon_init(xmon_on);
3984 /* make sure all breakpoints removed when disabling */
3985 if (!xmon_on) {
3986 clear_all_bpt();
3987 get_output_lock();
3988 printf("xmon: All breakpoints cleared\n");
3989 release_output_lock();
3992 return 0;
3995 static int xmon_dbgfs_get(void *data, u64 *val)
3997 *val = xmon_on;
3998 return 0;
4001 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
4002 xmon_dbgfs_set, "%llu\n");
4004 static int __init setup_xmon_dbgfs(void)
4006 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
4007 &xmon_dbgfs_ops);
4008 return 0;
4010 device_initcall(setup_xmon_dbgfs);
4011 #endif /* CONFIG_DEBUG_FS */
4013 static int xmon_early __initdata;
4015 static int __init early_parse_xmon(char *p)
4017 if (xmon_is_locked_down()) {
4018 xmon_init(0);
4019 xmon_early = 0;
4020 xmon_on = 0;
4021 } else if (!p || strncmp(p, "early", 5) == 0) {
4022 /* just "xmon" is equivalent to "xmon=early" */
4023 xmon_init(1);
4024 xmon_early = 1;
4025 xmon_on = 1;
4026 } else if (strncmp(p, "on", 2) == 0) {
4027 xmon_init(1);
4028 xmon_on = 1;
4029 } else if (strncmp(p, "rw", 2) == 0) {
4030 xmon_init(1);
4031 xmon_on = 1;
4032 xmon_is_ro = false;
4033 } else if (strncmp(p, "ro", 2) == 0) {
4034 xmon_init(1);
4035 xmon_on = 1;
4036 xmon_is_ro = true;
4037 } else if (strncmp(p, "off", 3) == 0)
4038 xmon_on = 0;
4039 else
4040 return 1;
4042 return 0;
4044 early_param("xmon", early_parse_xmon);
4046 void __init xmon_setup(void)
4048 if (xmon_on)
4049 xmon_init(1);
4050 if (xmon_early)
4051 debugger(NULL);
4054 #ifdef CONFIG_SPU_BASE
4056 struct spu_info {
4057 struct spu *spu;
4058 u64 saved_mfc_sr1_RW;
4059 u32 saved_spu_runcntl_RW;
4060 unsigned long dump_addr;
4061 u8 stopped_ok;
4064 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4066 static struct spu_info spu_info[XMON_NUM_SPUS];
4068 void xmon_register_spus(struct list_head *list)
4070 struct spu *spu;
4072 list_for_each_entry(spu, list, full_list) {
4073 if (spu->number >= XMON_NUM_SPUS) {
4074 WARN_ON(1);
4075 continue;
4078 spu_info[spu->number].spu = spu;
4079 spu_info[spu->number].stopped_ok = 0;
4080 spu_info[spu->number].dump_addr = (unsigned long)
4081 spu_info[spu->number].spu->local_store;
4085 static void stop_spus(void)
4087 struct spu *spu;
4088 int i;
4089 u64 tmp;
4091 for (i = 0; i < XMON_NUM_SPUS; i++) {
4092 if (!spu_info[i].spu)
4093 continue;
4095 if (setjmp(bus_error_jmp) == 0) {
4096 catch_memory_errors = 1;
4097 sync();
4099 spu = spu_info[i].spu;
4101 spu_info[i].saved_spu_runcntl_RW =
4102 in_be32(&spu->problem->spu_runcntl_RW);
4104 tmp = spu_mfc_sr1_get(spu);
4105 spu_info[i].saved_mfc_sr1_RW = tmp;
4107 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4108 spu_mfc_sr1_set(spu, tmp);
4110 sync();
4111 __delay(200);
4113 spu_info[i].stopped_ok = 1;
4115 printf("Stopped spu %.2d (was %s)\n", i,
4116 spu_info[i].saved_spu_runcntl_RW ?
4117 "running" : "stopped");
4118 } else {
4119 catch_memory_errors = 0;
4120 printf("*** Error stopping spu %.2d\n", i);
4122 catch_memory_errors = 0;
4126 static void restart_spus(void)
4128 struct spu *spu;
4129 int i;
4131 for (i = 0; i < XMON_NUM_SPUS; i++) {
4132 if (!spu_info[i].spu)
4133 continue;
4135 if (!spu_info[i].stopped_ok) {
4136 printf("*** Error, spu %d was not successfully stopped"
4137 ", not restarting\n", i);
4138 continue;
4141 if (setjmp(bus_error_jmp) == 0) {
4142 catch_memory_errors = 1;
4143 sync();
4145 spu = spu_info[i].spu;
4146 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4147 out_be32(&spu->problem->spu_runcntl_RW,
4148 spu_info[i].saved_spu_runcntl_RW);
4150 sync();
4151 __delay(200);
4153 printf("Restarted spu %.2d\n", i);
4154 } else {
4155 catch_memory_errors = 0;
4156 printf("*** Error restarting spu %.2d\n", i);
4158 catch_memory_errors = 0;
4162 #define DUMP_WIDTH 23
4163 #define DUMP_VALUE(format, field, value) \
4164 do { \
4165 if (setjmp(bus_error_jmp) == 0) { \
4166 catch_memory_errors = 1; \
4167 sync(); \
4168 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4169 #field, value); \
4170 sync(); \
4171 __delay(200); \
4172 } else { \
4173 catch_memory_errors = 0; \
4174 printf(" %-*s = *** Error reading field.\n", \
4175 DUMP_WIDTH, #field); \
4177 catch_memory_errors = 0; \
4178 } while (0)
4180 #define DUMP_FIELD(obj, format, field) \
4181 DUMP_VALUE(format, field, obj->field)
4183 static void dump_spu_fields(struct spu *spu)
4185 printf("Dumping spu fields at address %p:\n", spu);
4187 DUMP_FIELD(spu, "0x%x", number);
4188 DUMP_FIELD(spu, "%s", name);
4189 DUMP_FIELD(spu, "0x%lx", local_store_phys);
4190 DUMP_FIELD(spu, "0x%p", local_store);
4191 DUMP_FIELD(spu, "0x%lx", ls_size);
4192 DUMP_FIELD(spu, "0x%x", node);
4193 DUMP_FIELD(spu, "0x%lx", flags);
4194 DUMP_FIELD(spu, "%llu", class_0_pending);
4195 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4196 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4197 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4198 DUMP_FIELD(spu, "0x%x", irqs[0]);
4199 DUMP_FIELD(spu, "0x%x", irqs[1]);
4200 DUMP_FIELD(spu, "0x%x", irqs[2]);
4201 DUMP_FIELD(spu, "0x%x", slb_replace);
4202 DUMP_FIELD(spu, "%d", pid);
4203 DUMP_FIELD(spu, "0x%p", mm);
4204 DUMP_FIELD(spu, "0x%p", ctx);
4205 DUMP_FIELD(spu, "0x%p", rq);
4206 DUMP_FIELD(spu, "0x%llx", timestamp);
4207 DUMP_FIELD(spu, "0x%lx", problem_phys);
4208 DUMP_FIELD(spu, "0x%p", problem);
4209 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4210 in_be32(&spu->problem->spu_runcntl_RW));
4211 DUMP_VALUE("0x%x", problem->spu_status_R,
4212 in_be32(&spu->problem->spu_status_R));
4213 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4214 in_be32(&spu->problem->spu_npc_RW));
4215 DUMP_FIELD(spu, "0x%p", priv2);
4216 DUMP_FIELD(spu, "0x%p", pdata);
4220 spu_inst_dump(unsigned long adr, long count, int praddr)
4222 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4225 static void dump_spu_ls(unsigned long num, int subcmd)
4227 unsigned long offset, addr, ls_addr;
4229 if (setjmp(bus_error_jmp) == 0) {
4230 catch_memory_errors = 1;
4231 sync();
4232 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4233 sync();
4234 __delay(200);
4235 } else {
4236 catch_memory_errors = 0;
4237 printf("*** Error: accessing spu info for spu %ld\n", num);
4238 return;
4240 catch_memory_errors = 0;
4242 if (scanhex(&offset))
4243 addr = ls_addr + offset;
4244 else
4245 addr = spu_info[num].dump_addr;
4247 if (addr >= ls_addr + LS_SIZE) {
4248 printf("*** Error: address outside of local store\n");
4249 return;
4252 switch (subcmd) {
4253 case 'i':
4254 addr += spu_inst_dump(addr, 16, 1);
4255 last_cmd = "sdi\n";
4256 break;
4257 default:
4258 prdump(addr, 64);
4259 addr += 64;
4260 last_cmd = "sd\n";
4261 break;
4264 spu_info[num].dump_addr = addr;
4267 static int do_spu_cmd(void)
4269 static unsigned long num = 0;
4270 int cmd, subcmd = 0;
4272 cmd = inchar();
4273 switch (cmd) {
4274 case 's':
4275 stop_spus();
4276 break;
4277 case 'r':
4278 restart_spus();
4279 break;
4280 case 'd':
4281 subcmd = inchar();
4282 if (isxdigit(subcmd) || subcmd == '\n')
4283 termch = subcmd;
4284 fallthrough;
4285 case 'f':
4286 scanhex(&num);
4287 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4288 printf("*** Error: invalid spu number\n");
4289 return 0;
4292 switch (cmd) {
4293 case 'f':
4294 dump_spu_fields(spu_info[num].spu);
4295 break;
4296 default:
4297 dump_spu_ls(num, subcmd);
4298 break;
4301 break;
4302 default:
4303 return -1;
4306 return 0;
4308 #else /* ! CONFIG_SPU_BASE */
4309 static int do_spu_cmd(void)
4311 return -1;
4313 #endif