1 // SPDX-License-Identifier: GPL-2.0-or-later
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
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/sched/signal.h>
13 #include <linux/smp.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>
29 #include <asm/debugfs.h>
30 #include <asm/ptrace.h>
32 #include <asm/string.h>
34 #include <asm/machdep.h>
36 #include <asm/processor.h>
37 #include <asm/pgtable.h>
39 #include <asm/mmu_context.h>
40 #include <asm/plpar_wrappers.h>
41 #include <asm/cputable.h>
43 #include <asm/sstep.h>
44 #include <asm/irq_regs.h>
46 #include <asm/spu_priv1.h>
47 #include <asm/setjmp.h>
49 #include <asm/debug.h>
50 #include <asm/hw_breakpoint.h>
53 #include <asm/firmware.h>
54 #include <asm/code-patching.h>
55 #include <asm/sections.h>
58 #include <asm/hvcall.h>
66 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
67 static unsigned long xmon_taken = 1;
68 static int xmon_owner;
72 #endif /* CONFIG_SMP */
74 #ifdef CONFIG_PPC_PSERIES
75 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
77 static unsigned long in_xmon __read_mostly = 0;
78 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
79 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
81 static unsigned long adrs;
83 #define MAX_DUMP (128 * 1024)
84 static unsigned long ndump = 64;
85 static unsigned long nidump = 16;
86 static unsigned long ncsum = 4096;
88 static char tmpstr[128];
89 static int tracing_enabled;
91 static long bus_error_jmp[JMP_BUF_LEN];
92 static int catch_memory_errors;
93 static int catch_spr_faults;
94 static long *xmon_fault_jmp[NR_CPUS];
96 /* Breakpoint stuff */
98 unsigned long address;
99 unsigned int instr[2];
105 /* Bits in bpt.enabled */
111 static struct bpt bpts[NBPTS];
112 static struct bpt dabr;
113 static struct bpt *iabr;
114 static unsigned bpinstr = 0x7fe00008; /* trap */
116 #define BP_NUM(bp) ((bp) - bpts + 1)
119 static int cmds(struct pt_regs *);
120 static int mread(unsigned long, void *, int);
121 static int mwrite(unsigned long, void *, int);
122 static int handle_fault(struct pt_regs *);
123 static void byterev(unsigned char *, int);
124 static void memex(void);
125 static int bsesc(void);
126 static void dump(void);
127 static void show_pte(unsigned long);
128 static void prdump(unsigned long, long);
129 static int ppc_inst_dump(unsigned long, long, int);
130 static void dump_log_buf(void);
132 #ifdef CONFIG_PPC_POWERNV
133 static void dump_opal_msglog(void);
135 static inline void dump_opal_msglog(void)
137 printf("Machine is not running OPAL firmware.\n");
141 static void backtrace(struct pt_regs *);
142 static void excprint(struct pt_regs *);
143 static void prregs(struct pt_regs *);
144 static void memops(int);
145 static void memlocate(void);
146 static void memzcan(void);
147 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
149 int scanhex(unsigned long *valp);
150 static void scannl(void);
151 static int hexdigit(int);
152 void getstring(char *, int);
153 static void flush_input(void);
154 static int inchar(void);
155 static void take_input(char *);
156 static int read_spr(int, unsigned long *);
157 static void write_spr(int, unsigned long);
158 static void super_regs(void);
159 static void remove_bpts(void);
160 static void insert_bpts(void);
161 static void remove_cpu_bpts(void);
162 static void insert_cpu_bpts(void);
163 static struct bpt *at_breakpoint(unsigned long pc);
164 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
165 static int do_step(struct pt_regs *);
166 static void bpt_cmds(void);
167 static void cacheflush(void);
168 static int cpu_cmd(void);
169 static void csum(void);
170 static void bootcmds(void);
171 static void proccall(void);
172 static void show_tasks(void);
173 void dump_segments(void);
174 static void symbol_lookup(void);
175 static void xmon_show_stack(unsigned long sp, unsigned long lr,
177 static void xmon_print_symbol(unsigned long address, const char *mid,
179 static const char *getvecname(unsigned long vec);
181 static int do_spu_cmd(void);
184 static void dump_tlb_44x(void);
186 #ifdef CONFIG_PPC_BOOK3E
187 static void dump_tlb_book3e(void);
196 #ifdef __LITTLE_ENDIAN__
197 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
199 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
202 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
204 static char *help_string = "\
206 b show breakpoints\n\
207 bd set data breakpoint\n\
208 bi set instruction breakpoint\n\
209 bc clear breakpoint\n"
212 c print cpus stopped in xmon\n\
213 c# try to switch to cpu number h (in hex)\n"
218 d1 dump 1 byte values\n\
219 d2 dump 2 byte values\n\
220 d4 dump 4 byte values\n\
221 d8 dump 8 byte values\n\
222 di dump instructions\n\
223 df dump float values\n\
224 dd dump double values\n\
225 dl dump the kernel log buffer\n"
226 #ifdef CONFIG_PPC_POWERNV
228 do dump the OPAL message log\n"
232 dp[#] dump paca for current cpu, or cpu #\n\
233 dpa dump paca for all possible cpus\n"
236 dr dump stream of raw bytes\n\
237 dv dump virtual address translation \n\
238 dt dump the tracing buffers (uses printk)\n\
239 dtc dump the tracing buffers for current CPU (uses printk)\n\
241 #ifdef CONFIG_PPC_POWERNV
242 " dx# dump xive on CPU #\n\
243 dxi# dump xive irq state #\n\
244 dxa dump xive on all CPUs\n"
246 " e print exception information\n\
248 la lookup symbol+offset of specified address\n\
249 ls lookup address of specified symbol\n\
250 lp s [#] lookup address of percpu symbol s for current cpu, or cpu #\n\
251 m examine/change memory\n\
252 mm move a block of memory\n\
253 ms set a block of memory\n\
254 md compare two blocks of memory\n\
255 ml locate a block of memory\n\
256 mz zero a block of memory\n\
257 mi show information about memory allocation\n\
258 p call a procedure\n\
259 P list processes/tasks\n\
262 #ifdef CONFIG_SPU_BASE
263 " ss stop execution on all spus\n\
264 sr restore execution on stopped spus\n\
265 sf # dump spu fields for spu # (in hex)\n\
266 sd # dump spu local store for spu # (in hex)\n\
267 sdi # disassemble spu local store for spu # (in hex)\n"
269 " S print special registers\n\
272 Sw #v write v to SPR #\n\
274 x exit monitor and recover\n\
275 X exit monitor and don't recover\n"
276 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
277 " u dump segment table or SLB\n"
278 #elif defined(CONFIG_PPC_BOOK3S_32)
279 " u dump segment registers\n"
280 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
283 " U show uptime information\n"
285 " # n limit output to n lines per page (for dp, dpa, dl)\n"
290 static struct pt_regs *xmon_regs;
292 static inline void sync(void)
294 asm volatile("sync; isync");
297 static inline void store_inst(void *p)
299 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
302 static inline void cflush(void *p)
304 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
307 static inline void cinval(void *p)
309 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
313 * write_ciabr() - write the CIABR SPR
314 * @ciabr: The value to write.
316 * This function writes a value to the CIARB register either directly
317 * through mtspr instruction if the kernel is in HV privilege mode or
318 * call a hypervisor function to achieve the same in case the kernel
319 * is in supervisor privilege mode.
321 static void write_ciabr(unsigned long ciabr)
323 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
326 if (cpu_has_feature(CPU_FTR_HVMODE)) {
327 mtspr(SPRN_CIABR, ciabr);
330 plpar_set_ciabr(ciabr);
334 * set_ciabr() - set the CIABR
335 * @addr: The value to set.
337 * This function sets the correct privilege value into the the HW
338 * breakpoint address before writing it up in the CIABR register.
340 static void set_ciabr(unsigned long addr)
344 if (cpu_has_feature(CPU_FTR_HVMODE))
345 addr |= CIABR_PRIV_HYPER;
347 addr |= CIABR_PRIV_SUPER;
352 * Disable surveillance (the service processor watchdog function)
353 * while we are in xmon.
354 * XXX we should re-enable it when we leave. :)
356 #define SURVEILLANCE_TOKEN 9000
358 static inline void disable_surveillance(void)
360 #ifdef CONFIG_PPC_PSERIES
361 /* Since this can't be a module, args should end up below 4GB. */
362 static struct rtas_args args;
365 * At this point we have got all the cpus we can into
366 * xmon, so there is hopefully no other cpu calling RTAS
367 * at the moment, even though we don't take rtas.lock.
368 * If we did try to take rtas.lock there would be a
369 * real possibility of deadlock.
371 if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
374 rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
375 SURVEILLANCE_TOKEN, 0, 0);
377 #endif /* CONFIG_PPC_PSERIES */
381 static int xmon_speaker;
383 static void get_output_lock(void)
385 int me = smp_processor_id() + 0x100;
386 int last_speaker = 0, prev;
389 if (xmon_speaker == me)
393 last_speaker = cmpxchg(&xmon_speaker, 0, me);
394 if (last_speaker == 0)
398 * Wait a full second for the lock, we might be on a slow
399 * console, but check every 100us.
402 while (xmon_speaker == last_speaker) {
408 /* hostile takeover */
409 prev = cmpxchg(&xmon_speaker, last_speaker, me);
410 if (prev == last_speaker)
417 static void release_output_lock(void)
422 int cpus_are_in_xmon(void)
424 return !cpumask_empty(&cpus_in_xmon);
427 static bool wait_for_other_cpus(int ncpus)
429 unsigned long timeout;
431 /* We wait for 2s, which is a metric "little while" */
432 for (timeout = 20000; timeout != 0; --timeout) {
433 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
441 #endif /* CONFIG_SMP */
443 static inline int unrecoverable_excp(struct pt_regs *regs)
445 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
446 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
449 return ((regs->msr & MSR_RI) == 0);
453 static int xmon_core(struct pt_regs *regs, int fromipi)
457 long recurse_jmp[JMP_BUF_LEN];
458 unsigned long offset;
465 local_irq_save(flags);
468 tracing_enabled = tracing_is_on();
471 bp = in_breakpoint_table(regs->nip, &offset);
473 regs->nip = bp->address + offset;
474 atomic_dec(&bp->ref_count);
480 cpu = smp_processor_id();
481 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
483 * We catch SPR read/write faults here because the 0x700, 0xf60
484 * etc. handlers don't call debugger_fault_handler().
486 if (catch_spr_faults)
487 longjmp(bus_error_jmp, 1);
490 printf("cpu 0x%x: Exception %lx %s in xmon, "
491 "returning to main loop\n",
492 cpu, regs->trap, getvecname(TRAP(regs)));
493 release_output_lock();
494 longjmp(xmon_fault_jmp[cpu], 1);
497 if (setjmp(recurse_jmp) != 0) {
498 if (!in_xmon || !xmon_gate) {
500 printf("xmon: WARNING: bad recursive fault "
501 "on cpu 0x%x\n", cpu);
502 release_output_lock();
505 secondary = !(xmon_taken && cpu == xmon_owner);
509 xmon_fault_jmp[cpu] = recurse_jmp;
512 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
513 bp = at_breakpoint(regs->nip);
514 if (bp || unrecoverable_excp(regs))
521 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
523 xmon_print_symbol(regs->nip, " ", ")\n");
525 if (unrecoverable_excp(regs))
526 printf("WARNING: exception is not recoverable, "
528 release_output_lock();
531 cpumask_set_cpu(cpu, &cpus_in_xmon);
536 while (secondary && !xmon_gate) {
542 secondary = test_and_set_bit(0, &in_xmon);
545 touch_nmi_watchdog();
549 if (!secondary && !xmon_gate) {
550 /* we are the first cpu to come in */
551 /* interrupt other cpu(s) */
552 int ncpus = num_online_cpus();
558 * A system reset (trap == 0x100) can be triggered on
559 * all CPUs, so when we come in via 0x100 try waiting
560 * for the other CPUs to come in before we send the
561 * debugger break (IPI). This is similar to
562 * crash_kexec_secondary().
564 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
565 smp_send_debugger_break();
567 wait_for_other_cpus(ncpus);
570 disable_surveillance();
571 /* for breakpoint or single step, print the current instr. */
572 if (bp || TRAP(regs) == 0xd00)
573 ppc_inst_dump(regs->nip, 1, 0);
574 printf("enter ? for help\n");
578 touch_nmi_watchdog();
585 if (cpu == xmon_owner) {
586 if (!test_and_set_bit(0, &xmon_taken)) {
592 while (cpu == xmon_owner)
596 touch_nmi_watchdog();
607 /* have switched to some other cpu */
612 cpumask_clear_cpu(cpu, &cpus_in_xmon);
613 xmon_fault_jmp[cpu] = NULL;
615 /* UP is simple... */
617 printf("Exception %lx %s in xmon, returning to main loop\n",
618 regs->trap, getvecname(TRAP(regs)));
619 longjmp(xmon_fault_jmp[0], 1);
621 if (setjmp(recurse_jmp) == 0) {
622 xmon_fault_jmp[0] = recurse_jmp;
626 bp = at_breakpoint(regs->nip);
628 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
629 xmon_print_symbol(regs->nip, " ", ")\n");
631 if (unrecoverable_excp(regs))
632 printf("WARNING: exception is not recoverable, "
635 disable_surveillance();
636 /* for breakpoint or single step, print the current instr. */
637 if (bp || TRAP(regs) == 0xd00)
638 ppc_inst_dump(regs->nip, 1, 0);
639 printf("enter ? for help\n");
649 if (regs->msr & MSR_DE) {
650 bp = at_breakpoint(regs->nip);
652 regs->nip = (unsigned long) &bp->instr[0];
653 atomic_inc(&bp->ref_count);
657 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
658 bp = at_breakpoint(regs->nip);
660 int stepped = emulate_step(regs, bp->instr[0]);
662 regs->nip = (unsigned long) &bp->instr[0];
663 atomic_inc(&bp->ref_count);
664 } else if (stepped < 0) {
665 printf("Couldn't single-step %s instruction\n",
666 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
673 touch_nmi_watchdog();
674 local_irq_restore(flags);
676 return cmd != 'X' && cmd != EOF;
679 int xmon(struct pt_regs *excp)
684 ppc_save_regs(®s);
688 return xmon_core(excp, 0);
692 irqreturn_t xmon_irq(int irq, void *d)
695 local_irq_save(flags);
696 printf("Keyboard interrupt\n");
697 xmon(get_irq_regs());
698 local_irq_restore(flags);
702 static int xmon_bpt(struct pt_regs *regs)
705 unsigned long offset;
707 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
710 /* Are we at the trap at bp->instr[1] for some bp? */
711 bp = in_breakpoint_table(regs->nip, &offset);
712 if (bp != NULL && offset == 4) {
713 regs->nip = bp->address + 4;
714 atomic_dec(&bp->ref_count);
718 /* Are we at a breakpoint? */
719 bp = at_breakpoint(regs->nip);
728 static int xmon_sstep(struct pt_regs *regs)
736 static int xmon_break_match(struct pt_regs *regs)
738 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
740 if (dabr.enabled == 0)
746 static int xmon_iabr_match(struct pt_regs *regs)
748 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
756 static int xmon_ipi(struct pt_regs *regs)
759 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
765 static int xmon_fault_handler(struct pt_regs *regs)
768 unsigned long offset;
770 if (in_xmon && catch_memory_errors)
771 handle_fault(regs); /* doesn't return */
773 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
774 bp = in_breakpoint_table(regs->nip, &offset);
776 regs->nip = bp->address + offset;
777 atomic_dec(&bp->ref_count);
784 /* Force enable xmon if not already enabled */
785 static inline void force_enable_xmon(void)
787 /* Enable xmon hooks if needed */
789 printf("xmon: Enabling debugger hooks\n");
794 static struct bpt *at_breakpoint(unsigned long pc)
800 for (i = 0; i < NBPTS; ++i, ++bp)
801 if (bp->enabled && pc == bp->address)
806 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
810 off = nip - (unsigned long) bpts;
811 if (off >= sizeof(bpts))
813 off %= sizeof(struct bpt);
814 if (off != offsetof(struct bpt, instr[0])
815 && off != offsetof(struct bpt, instr[1]))
817 *offp = off - offsetof(struct bpt, instr[0]);
818 return (struct bpt *) (nip - off);
821 static struct bpt *new_breakpoint(unsigned long a)
826 bp = at_breakpoint(a);
830 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
831 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
833 bp->instr[1] = bpinstr;
834 store_inst(&bp->instr[1]);
839 printf("Sorry, no free breakpoints. Please clear one first.\n");
843 static void insert_bpts(void)
849 for (i = 0; i < NBPTS; ++i, ++bp) {
850 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
852 if (mread(bp->address, &bp->instr[0], 4) != 4) {
853 printf("Couldn't read instruction at %lx, "
854 "disabling breakpoint there\n", bp->address);
858 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
859 printf("Breakpoint at %lx is on an mtmsrd or rfid "
860 "instruction, disabling it\n", bp->address);
864 store_inst(&bp->instr[0]);
865 if (bp->enabled & BP_CIABR)
867 if (patch_instruction((unsigned int *)bp->address,
869 printf("Couldn't write instruction at %lx, "
870 "disabling breakpoint there\n", bp->address);
871 bp->enabled &= ~BP_TRAP;
874 store_inst((void *)bp->address);
878 static void insert_cpu_bpts(void)
880 struct arch_hw_breakpoint brk;
883 brk.address = dabr.address;
884 brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
886 __set_breakpoint(&brk);
890 set_ciabr(iabr->address);
893 static void remove_bpts(void)
900 for (i = 0; i < NBPTS; ++i, ++bp) {
901 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
903 if (mread(bp->address, &instr, 4) == 4
905 && patch_instruction(
906 (unsigned int *)bp->address, bp->instr[0]) != 0)
907 printf("Couldn't remove breakpoint at %lx\n",
910 store_inst((void *)bp->address);
914 static void remove_cpu_bpts(void)
916 hw_breakpoint_disable();
920 /* Based on uptime_proc_show(). */
924 struct timespec64 uptime;
926 if (setjmp(bus_error_jmp) == 0) {
927 catch_memory_errors = 1;
930 ktime_get_coarse_boottime_ts64(&uptime);
931 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
932 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
937 catch_memory_errors = 0;
940 static void set_lpp_cmd(void)
944 if (!scanhex(&lpp)) {
945 printf("Invalid number.\n");
948 xmon_set_pagination_lpp(lpp);
950 /* Command interpreting routine */
951 static char *last_cmd;
954 cmds(struct pt_regs *excp)
961 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
965 printf("%x:", smp_processor_id());
966 #endif /* CONFIG_SMP */
972 if (last_cmd == NULL)
974 take_input(last_cmd);
1012 prregs(excp); /* print regs */
1027 if (do_spu_cmd() == 0)
1034 if (tracing_enabled)
1038 printf(" <no input ...>\n");
1042 xmon_puts(help_string);
1049 printf(xmon_ro_msg);
1066 printf(xmon_ro_msg);
1074 #ifdef CONFIG_PPC_BOOK3S
1078 #elif defined(CONFIG_44x)
1082 #elif defined(CONFIG_PPC_BOOK3E)
1091 printf("Unrecognized command: ");
1093 if (' ' < cmd && cmd <= '~')
1096 printf("\\x%x", cmd);
1098 } while (cmd != '\n');
1099 printf(" (type ? for help)\n");
1106 static int do_step(struct pt_regs *regs)
1108 regs->msr |= MSR_DE;
1109 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1114 * Step a single instruction.
1115 * Some instructions we emulate, others we execute with MSR_SE set.
1117 static int do_step(struct pt_regs *regs)
1122 force_enable_xmon();
1123 /* check we are in 64-bit kernel mode, translation enabled */
1124 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1125 if (mread(regs->nip, &instr, 4) == 4) {
1126 stepped = emulate_step(regs, instr);
1128 printf("Couldn't single-step %s instruction\n",
1129 (IS_RFID(instr)? "rfid": "mtmsrd"));
1133 regs->trap = 0xd00 | (regs->trap & 1);
1134 printf("stepped to ");
1135 xmon_print_symbol(regs->nip, " ", "\n");
1136 ppc_inst_dump(regs->nip, 1, 0);
1141 regs->msr |= MSR_SE;
1146 static void bootcmds(void)
1152 ppc_md.restart(NULL);
1153 else if (cmd == 'h')
1155 else if (cmd == 'p')
1160 static int cpu_cmd(void)
1163 unsigned long cpu, first_cpu, last_cpu;
1166 if (!scanhex(&cpu)) {
1167 /* print cpus waiting or in xmon */
1168 printf("cpus stopped:");
1169 last_cpu = first_cpu = NR_CPUS;
1170 for_each_possible_cpu(cpu) {
1171 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1172 if (cpu == last_cpu + 1) {
1175 if (last_cpu != first_cpu)
1176 printf("-0x%lx", last_cpu);
1177 last_cpu = first_cpu = cpu;
1178 printf(" 0x%lx", cpu);
1182 if (last_cpu != first_cpu)
1183 printf("-0x%lx", last_cpu);
1187 /* try to switch to cpu specified */
1188 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1189 printf("cpu 0x%lx isn't in xmon\n", cpu);
1191 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1192 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1200 while (!xmon_taken) {
1201 if (--timeout == 0) {
1202 if (test_and_set_bit(0, &xmon_taken))
1204 /* take control back */
1206 xmon_owner = smp_processor_id();
1207 printf("cpu 0x%lx didn't take control\n", cpu);
1215 #endif /* CONFIG_SMP */
1218 static unsigned short fcstab[256] = {
1219 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1220 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1221 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1222 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1223 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1224 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1225 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1226 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1227 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1228 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1229 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1230 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1231 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1232 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1233 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1234 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1235 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1236 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1237 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1238 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1239 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1240 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1241 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1242 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1243 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1244 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1245 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1246 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1247 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1248 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1249 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1250 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1253 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1262 if (!scanhex(&adrs))
1264 if (!scanhex(&ncsum))
1267 for (i = 0; i < ncsum; ++i) {
1268 if (mread(adrs+i, &v, 1) == 0) {
1269 printf("csum stopped at "REG"\n", adrs+i);
1274 printf("%x\n", fcs);
1278 * Check if this is a suitable place to put a breakpoint.
1280 static long check_bp_loc(unsigned long addr)
1285 if (!is_kernel_addr(addr)) {
1286 printf("Breakpoints may only be placed at kernel addresses\n");
1289 if (!mread(addr, &instr, sizeof(instr))) {
1290 printf("Can't read instruction at address %lx\n", addr);
1293 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1294 printf("Breakpoints may not be placed on mtmsrd or rfid "
1301 static char *breakpoint_help_string =
1302 "Breakpoint command usage:\n"
1303 "b show breakpoints\n"
1304 "b <addr> [cnt] set breakpoint at given instr addr\n"
1305 "bc clear all breakpoints\n"
1306 "bc <n/addr> clear breakpoint number n or at addr\n"
1307 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1308 "bd <addr> [cnt] set hardware data breakpoint\n"
1321 #ifndef CONFIG_PPC_8xx
1322 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1324 case 'd': /* bd - hardware data breakpoint */
1325 if (!ppc_breakpoint_available()) {
1326 printf("Hardware data breakpoint not supported on this cpu\n");
1333 else if (cmd == 'w')
1339 if (scanhex(&dabr.address)) {
1340 if (!is_kernel_addr(dabr.address)) {
1344 dabr.address &= ~HW_BRK_TYPE_DABR;
1345 dabr.enabled = mode | BP_DABR;
1348 force_enable_xmon();
1351 case 'i': /* bi - hardware instr breakpoint */
1352 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1353 printf("Hardware instruction breakpoint "
1354 "not supported on this cpu\n");
1358 iabr->enabled &= ~BP_CIABR;
1363 if (!check_bp_loc(a))
1365 bp = new_breakpoint(a);
1367 bp->enabled |= BP_CIABR;
1369 force_enable_xmon();
1376 /* clear all breakpoints */
1377 for (i = 0; i < NBPTS; ++i)
1378 bpts[i].enabled = 0;
1381 printf("All breakpoints cleared\n");
1385 if (a <= NBPTS && a >= 1) {
1386 /* assume a breakpoint number */
1387 bp = &bpts[a-1]; /* bp nums are 1 based */
1389 /* assume a breakpoint address */
1390 bp = at_breakpoint(a);
1392 printf("No breakpoint at %lx\n", a);
1397 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1398 xmon_print_symbol(bp->address, " ", ")\n");
1406 printf(breakpoint_help_string);
1411 /* print all breakpoints */
1412 printf(" type address\n");
1414 printf(" data "REG" [", dabr.address);
1415 if (dabr.enabled & 1)
1417 if (dabr.enabled & 2)
1421 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1424 printf("%tx %s ", BP_NUM(bp),
1425 (bp->enabled & BP_CIABR) ? "inst": "trap");
1426 xmon_print_symbol(bp->address, " ", "\n");
1431 if (!check_bp_loc(a))
1433 bp = new_breakpoint(a);
1435 bp->enabled |= BP_TRAP;
1436 force_enable_xmon();
1442 /* Very cheap human name for vector lookup. */
1444 const char *getvecname(unsigned long vec)
1449 case 0x100: ret = "(System Reset)"; break;
1450 case 0x200: ret = "(Machine Check)"; break;
1451 case 0x300: ret = "(Data Access)"; break;
1453 if (radix_enabled())
1454 ret = "(Data Access Out of Range)";
1456 ret = "(Data SLB Access)";
1458 case 0x400: ret = "(Instruction Access)"; break;
1460 if (radix_enabled())
1461 ret = "(Instruction Access Out of Range)";
1463 ret = "(Instruction SLB Access)";
1465 case 0x500: ret = "(Hardware Interrupt)"; break;
1466 case 0x600: ret = "(Alignment)"; break;
1467 case 0x700: ret = "(Program Check)"; break;
1468 case 0x800: ret = "(FPU Unavailable)"; break;
1469 case 0x900: ret = "(Decrementer)"; break;
1470 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1471 case 0xa00: ret = "(Doorbell)"; break;
1472 case 0xc00: ret = "(System Call)"; break;
1473 case 0xd00: ret = "(Single Step)"; break;
1474 case 0xe40: ret = "(Emulation Assist)"; break;
1475 case 0xe60: ret = "(HMI)"; break;
1476 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1477 case 0xf00: ret = "(Performance Monitor)"; break;
1478 case 0xf20: ret = "(Altivec Unavailable)"; break;
1479 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1480 case 0x1500: ret = "(Denormalisation)"; break;
1481 case 0x1700: ret = "(Altivec Assist)"; break;
1487 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1488 unsigned long *endp)
1490 unsigned long size, offset;
1493 *startp = *endp = 0;
1496 if (setjmp(bus_error_jmp) == 0) {
1497 catch_memory_errors = 1;
1499 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1501 *startp = pc - offset;
1502 *endp = pc - offset + size;
1506 catch_memory_errors = 0;
1509 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1510 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1512 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1515 int max_to_print = 64;
1517 unsigned long newsp;
1518 unsigned long marker;
1519 struct pt_regs regs;
1521 while (max_to_print--) {
1522 if (!is_kernel_addr(sp)) {
1524 printf("SP (%lx) is in userspace\n", sp);
1528 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1529 || !mread(sp, &newsp, sizeof(unsigned long))) {
1530 printf("Couldn't read stack frame at %lx\n", sp);
1535 * For the first stack frame, try to work out if
1536 * LR and/or the saved LR value in the bottommost
1537 * stack frame are valid.
1539 if ((pc | lr) != 0) {
1540 unsigned long fnstart, fnend;
1541 unsigned long nextip;
1544 get_function_bounds(pc, &fnstart, &fnend);
1547 mread(newsp + LRSAVE_OFFSET, &nextip,
1548 sizeof(unsigned long));
1550 if (!is_kernel_addr(lr)
1551 || (fnstart <= lr && lr < fnend))
1553 } else if (lr == nextip) {
1555 } else if (is_kernel_addr(lr)
1556 && !(fnstart <= lr && lr < fnend)) {
1557 printf("[link register ] ");
1558 xmon_print_symbol(lr, " ", "\n");
1561 printf("["REG"] ", sp);
1562 xmon_print_symbol(ip, " ", " (unreliable)\n");
1567 printf("["REG"] ", sp);
1568 xmon_print_symbol(ip, " ", "\n");
1571 /* Look for "regshere" marker to see if this is
1572 an exception frame. */
1573 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1574 && marker == STACK_FRAME_REGS_MARKER) {
1575 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1577 printf("Couldn't read registers at %lx\n",
1578 sp + STACK_FRAME_OVERHEAD);
1581 printf("--- Exception: %lx %s at ", regs.trap,
1582 getvecname(TRAP(®s)));
1585 xmon_print_symbol(pc, " ", "\n");
1595 static void backtrace(struct pt_regs *excp)
1600 xmon_show_stack(sp, 0, 0);
1602 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1606 static void print_bug_trap(struct pt_regs *regs)
1609 const struct bug_entry *bug;
1612 if (regs->msr & MSR_PR)
1613 return; /* not in kernel */
1614 addr = regs->nip; /* address of trap instruction */
1615 if (!is_kernel_addr(addr))
1617 bug = find_bug(regs->nip);
1620 if (is_warning_bug(bug))
1623 #ifdef CONFIG_DEBUG_BUGVERBOSE
1624 printf("kernel BUG at %s:%u!\n",
1625 bug->file, bug->line);
1627 printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1629 #endif /* CONFIG_BUG */
1632 static void excprint(struct pt_regs *fp)
1637 printf("cpu 0x%x: ", smp_processor_id());
1638 #endif /* CONFIG_SMP */
1641 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1643 xmon_print_symbol(fp->nip, ": ", "\n");
1646 xmon_print_symbol(fp->link, ": ", "\n");
1648 printf(" sp: %lx\n", fp->gpr[1]);
1649 printf(" msr: %lx\n", fp->msr);
1651 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1652 printf(" dar: %lx\n", fp->dar);
1654 printf(" dsisr: %lx\n", fp->dsisr);
1657 printf(" current = 0x%px\n", current);
1659 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1660 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1663 printf(" pid = %d, comm = %s\n",
1664 current->pid, current->comm);
1670 printf(linux_banner);
1673 static void prregs(struct pt_regs *fp)
1677 struct pt_regs regs;
1679 if (scanhex(&base)) {
1680 if (setjmp(bus_error_jmp) == 0) {
1681 catch_memory_errors = 1;
1683 regs = *(struct pt_regs *)base;
1687 catch_memory_errors = 0;
1688 printf("*** Error reading registers from "REG"\n",
1692 catch_memory_errors = 0;
1697 if (FULL_REGS(fp)) {
1698 for (n = 0; n < 16; ++n)
1699 printf("R%.2d = "REG" R%.2d = "REG"\n",
1700 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1702 for (n = 0; n < 7; ++n)
1703 printf("R%.2d = "REG" R%.2d = "REG"\n",
1704 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1707 for (n = 0; n < 32; ++n) {
1708 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1709 (n & 3) == 3? "\n": " ");
1710 if (n == 12 && !FULL_REGS(fp)) {
1717 xmon_print_symbol(fp->nip, " ", "\n");
1718 if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1720 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1723 xmon_print_symbol(fp->link, " ", "\n");
1724 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1725 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1726 fp->ctr, fp->xer, fp->trap);
1728 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1729 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1732 static void cacheflush(void)
1735 unsigned long nflush;
1740 scanhex((void *)&adrs);
1745 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1746 if (setjmp(bus_error_jmp) == 0) {
1747 catch_memory_errors = 1;
1751 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1752 cflush((void *) adrs);
1754 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1755 cinval((void *) adrs);
1758 /* wait a little while to see if we get a machine check */
1761 catch_memory_errors = 0;
1764 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1765 extern void xmon_mtspr(int spr, unsigned long value);
1768 read_spr(int n, unsigned long *vp)
1770 unsigned long ret = -1UL;
1773 if (setjmp(bus_error_jmp) == 0) {
1774 catch_spr_faults = 1;
1777 ret = xmon_mfspr(n, *vp);
1783 catch_spr_faults = 0;
1789 write_spr(int n, unsigned long val)
1792 printf(xmon_ro_msg);
1796 if (setjmp(bus_error_jmp) == 0) {
1797 catch_spr_faults = 1;
1804 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1806 catch_spr_faults = 0;
1809 static void dump_206_sprs(void)
1812 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1815 /* Actually some of these pre-date 2.06, but whatevs */
1817 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1818 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1819 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1820 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1821 printf("amr = %.16lx uamor = %.16lx\n",
1822 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1824 if (!(mfmsr() & MSR_HV))
1827 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1828 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1829 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1830 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1831 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1832 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1833 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1834 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1835 printf("dabr = %.16lx dabrx = %.16lx\n",
1836 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1840 static void dump_207_sprs(void)
1845 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1848 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1849 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1851 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1852 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1856 /* Only if TM has been enabled in the kernel */
1857 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1858 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1859 mfspr(SPRN_TEXASR));
1862 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1863 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1864 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1865 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1866 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1867 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1868 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1869 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1870 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1871 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1872 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1873 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1875 if (!(msr & MSR_HV))
1878 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1879 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1880 printf("dawr = %.16lx dawrx = %.16lx ciabr = %.16lx\n",
1881 mfspr(SPRN_DAWR), mfspr(SPRN_DAWRX), mfspr(SPRN_CIABR));
1885 static void dump_300_sprs(void)
1888 bool hv = mfmsr() & MSR_HV;
1890 if (!cpu_has_feature(CPU_FTR_ARCH_300))
1893 printf("pidr = %.16lx tidr = %.16lx\n",
1894 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
1895 printf("asdr = %.16lx psscr = %.16lx\n",
1896 mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR)
1897 : mfspr(SPRN_PSSCR_PR));
1902 printf("ptcr = %.16lx\n",
1907 static void dump_one_spr(int spr, bool show_unimplemented)
1912 if (!read_spr(spr, &val)) {
1913 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1917 if (val == 0xdeadbeef) {
1918 /* Looks like read was a nop, confirm */
1920 if (!read_spr(spr, &val)) {
1921 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1925 if (val == 0x0badcafe) {
1926 if (show_unimplemented)
1927 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
1932 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
1935 static void super_regs(void)
1937 static unsigned long regno;
1945 unsigned long sp, toc;
1946 asm("mr %0,1" : "=r" (sp) :);
1947 asm("mr %0,2" : "=r" (toc) :);
1949 printf("msr = "REG" sprg0 = "REG"\n",
1950 mfmsr(), mfspr(SPRN_SPRG0));
1951 printf("pvr = "REG" sprg1 = "REG"\n",
1952 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1953 printf("dec = "REG" sprg2 = "REG"\n",
1954 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1955 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
1956 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
1968 read_spr(regno, &val);
1970 write_spr(regno, val);
1971 dump_one_spr(regno, true);
1976 dump_one_spr(regno, true);
1980 for (spr = 1; spr < 1024; ++spr)
1981 dump_one_spr(spr, false);
1989 * Stuff for reading and writing memory safely
1992 mread(unsigned long adrs, void *buf, int size)
1998 if (setjmp(bus_error_jmp) == 0) {
1999 catch_memory_errors = 1;
2005 *(u16 *)q = *(u16 *)p;
2008 *(u32 *)q = *(u32 *)p;
2011 *(u64 *)q = *(u64 *)p;
2014 for( ; n < size; ++n) {
2020 /* wait a little while to see if we get a machine check */
2024 catch_memory_errors = 0;
2029 mwrite(unsigned long adrs, void *buf, int size)
2037 printf(xmon_ro_msg);
2041 if (setjmp(bus_error_jmp) == 0) {
2042 catch_memory_errors = 1;
2048 *(u16 *)p = *(u16 *)q;
2051 *(u32 *)p = *(u32 *)q;
2054 *(u64 *)p = *(u64 *)q;
2057 for ( ; n < size; ++n) {
2063 /* wait a little while to see if we get a machine check */
2067 printf("*** Error writing address "REG"\n", adrs + n);
2069 catch_memory_errors = 0;
2073 static int fault_type;
2074 static int fault_except;
2075 static char *fault_chars[] = { "--", "**", "##" };
2077 static int handle_fault(struct pt_regs *regs)
2079 fault_except = TRAP(regs);
2080 switch (TRAP(regs)) {
2092 longjmp(bus_error_jmp, 1);
2097 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2100 byterev(unsigned char *val, int size)
2106 SWAP(val[0], val[1], t);
2109 SWAP(val[0], val[3], t);
2110 SWAP(val[1], val[2], t);
2112 case 8: /* is there really any use for this? */
2113 SWAP(val[0], val[7], t);
2114 SWAP(val[1], val[6], t);
2115 SWAP(val[2], val[5], t);
2116 SWAP(val[3], val[4], t);
2124 static char *memex_help_string =
2125 "Memory examine command usage:\n"
2126 "m [addr] [flags] examine/change memory\n"
2127 " addr is optional. will start where left off.\n"
2128 " flags may include chars from this set:\n"
2129 " b modify by bytes (default)\n"
2130 " w modify by words (2 byte)\n"
2131 " l modify by longs (4 byte)\n"
2132 " d modify by doubleword (8 byte)\n"
2133 " r toggle reverse byte order mode\n"
2134 " n do not read memory (for i/o spaces)\n"
2135 " . ok to read (default)\n"
2136 "NOTE: flags are saved as defaults\n"
2139 static char *memex_subcmd_help_string =
2140 "Memory examine subcommands:\n"
2141 " hexval write this val to current location\n"
2142 " 'string' write chars from string to this location\n"
2143 " ' increment address\n"
2144 " ^ decrement address\n"
2145 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2146 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2147 " ` clear no-read flag\n"
2148 " ; stay at this addr\n"
2149 " v change to byte mode\n"
2150 " w change to word (2 byte) mode\n"
2151 " l change to long (4 byte) mode\n"
2152 " u change to doubleword (8 byte) mode\n"
2153 " m addr change current addr\n"
2154 " n toggle no-read flag\n"
2155 " r toggle byte reverse flag\n"
2156 " < count back up count bytes\n"
2157 " > count skip forward count bytes\n"
2158 " x exit this mode\n"
2164 int cmd, inc, i, nslash;
2166 unsigned char val[16];
2168 scanhex((void *)&adrs);
2171 printf(memex_help_string);
2177 while ((cmd = skipbl()) != '\n') {
2179 case 'b': size = 1; break;
2180 case 'w': size = 2; break;
2181 case 'l': size = 4; break;
2182 case 'd': size = 8; break;
2183 case 'r': brev = !brev; break;
2184 case 'n': mnoread = 1; break;
2185 case '.': mnoread = 0; break;
2194 n = mread(adrs, val, size);
2195 printf(REG"%c", adrs, brev? 'r': ' ');
2200 for (i = 0; i < n; ++i)
2201 printf("%.2x", val[i]);
2202 for (; i < size; ++i)
2203 printf("%s", fault_chars[fault_type]);
2210 for (i = 0; i < size; ++i)
2211 val[i] = n >> (i * 8);
2214 mwrite(adrs, val, size);
2227 else if( n == '\'' )
2229 for (i = 0; i < size; ++i)
2230 val[i] = n >> (i * 8);
2233 mwrite(adrs, val, size);
2269 adrs -= 1 << nslash;
2273 adrs += 1 << nslash;
2277 adrs += 1 << -nslash;
2281 adrs -= 1 << -nslash;
2284 scanhex((void *)&adrs);
2303 printf(memex_subcmd_help_string);
2318 case 'n': c = '\n'; break;
2319 case 'r': c = '\r'; break;
2320 case 'b': c = '\b'; break;
2321 case 't': c = '\t'; break;
2326 static void xmon_rawdump (unsigned long adrs, long ndump)
2329 unsigned char temp[16];
2331 for (n = ndump; n > 0;) {
2333 nr = mread(adrs, temp, r);
2335 for (m = 0; m < r; ++m) {
2337 printf("%.2x", temp[m]);
2339 printf("%s", fault_chars[fault_type]);
2348 static void dump_tracing(void)
2354 ftrace_dump(DUMP_ORIG);
2356 ftrace_dump(DUMP_ALL);
2360 static void dump_one_paca(int cpu)
2362 struct paca_struct *p;
2363 #ifdef CONFIG_PPC_BOOK3S_64
2367 if (setjmp(bus_error_jmp) != 0) {
2368 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2372 catch_memory_errors = 1;
2377 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2379 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2380 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2381 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2383 #define DUMP(paca, name, format) \
2384 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2385 offsetof(struct paca_struct, name));
2387 DUMP(p, lock_token, "%#-*x");
2388 DUMP(p, paca_index, "%#-*x");
2389 DUMP(p, kernel_toc, "%#-*llx");
2390 DUMP(p, kernelbase, "%#-*llx");
2391 DUMP(p, kernel_msr, "%#-*llx");
2392 DUMP(p, emergency_sp, "%-*px");
2393 #ifdef CONFIG_PPC_BOOK3S_64
2394 DUMP(p, nmi_emergency_sp, "%-*px");
2395 DUMP(p, mc_emergency_sp, "%-*px");
2396 DUMP(p, in_nmi, "%#-*x");
2397 DUMP(p, in_mce, "%#-*x");
2398 DUMP(p, hmi_event_available, "%#-*x");
2400 DUMP(p, data_offset, "%#-*llx");
2401 DUMP(p, hw_cpu_id, "%#-*x");
2402 DUMP(p, cpu_start, "%#-*x");
2403 DUMP(p, kexec_state, "%#-*x");
2404 #ifdef CONFIG_PPC_BOOK3S_64
2405 if (!early_radix_enabled()) {
2406 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2409 if (!p->slb_shadow_ptr)
2412 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2413 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2416 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2417 22, "slb_shadow", i, esid, vsid);
2420 DUMP(p, vmalloc_sllp, "%#-*x");
2421 DUMP(p, stab_rr, "%#-*x");
2422 DUMP(p, slb_used_bitmap, "%#-*x");
2423 DUMP(p, slb_kern_bitmap, "%#-*x");
2425 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2426 DUMP(p, slb_cache_ptr, "%#-*x");
2427 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2428 printf(" %-*s[%d] = 0x%016x\n",
2429 22, "slb_cache", i, p->slb_cache[i]);
2433 DUMP(p, rfi_flush_fallback_area, "%-*px");
2435 DUMP(p, dscr_default, "%#-*llx");
2436 #ifdef CONFIG_PPC_BOOK3E
2437 DUMP(p, pgd, "%-*px");
2438 DUMP(p, kernel_pgd, "%-*px");
2439 DUMP(p, tcd_ptr, "%-*px");
2440 DUMP(p, mc_kstack, "%-*px");
2441 DUMP(p, crit_kstack, "%-*px");
2442 DUMP(p, dbg_kstack, "%-*px");
2444 DUMP(p, __current, "%-*px");
2445 DUMP(p, kstack, "%#-*llx");
2446 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2447 #ifdef CONFIG_STACKPROTECTOR
2448 DUMP(p, canary, "%#-*lx");
2450 DUMP(p, saved_r1, "%#-*llx");
2451 DUMP(p, trap_save, "%#-*x");
2452 DUMP(p, irq_soft_mask, "%#-*x");
2453 DUMP(p, irq_happened, "%#-*x");
2454 #ifdef CONFIG_MMIOWB
2455 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2456 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2458 DUMP(p, irq_work_pending, "%#-*x");
2459 DUMP(p, sprg_vdso, "%#-*llx");
2461 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2462 DUMP(p, tm_scratch, "%#-*llx");
2465 #ifdef CONFIG_PPC_POWERNV
2466 DUMP(p, idle_state, "%#-*lx");
2467 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2468 DUMP(p, thread_idle_state, "%#-*x");
2469 DUMP(p, subcore_sibling_mask, "%#-*x");
2471 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2472 DUMP(p, requested_psscr, "%#-*llx");
2473 DUMP(p, dont_stop.counter, "%#-*x");
2478 DUMP(p, accounting.utime, "%#-*lx");
2479 DUMP(p, accounting.stime, "%#-*lx");
2480 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2481 DUMP(p, accounting.utime_scaled, "%#-*lx");
2483 DUMP(p, accounting.starttime, "%#-*lx");
2484 DUMP(p, accounting.starttime_user, "%#-*lx");
2485 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2486 DUMP(p, accounting.startspurr, "%#-*lx");
2487 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2489 DUMP(p, accounting.steal_time, "%#-*lx");
2492 catch_memory_errors = 0;
2496 static void dump_all_pacas(void)
2500 if (num_possible_cpus() == 0) {
2501 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2505 for_each_possible_cpu(cpu)
2509 static void dump_pacas(void)
2520 termch = c; /* Put c back, it wasn't 'a' */
2525 dump_one_paca(xmon_owner);
2529 #ifdef CONFIG_PPC_POWERNV
2530 static void dump_one_xive(int cpu)
2532 unsigned int hwid = get_hard_smp_processor_id(cpu);
2534 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2535 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2536 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2537 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2538 opal_xive_dump(XIVE_DUMP_VP, hwid);
2539 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2541 if (setjmp(bus_error_jmp) != 0) {
2542 catch_memory_errors = 0;
2543 printf("*** Error dumping xive on cpu %d\n", cpu);
2547 catch_memory_errors = 1;
2549 xmon_xive_do_dump(cpu);
2552 catch_memory_errors = 0;
2555 static void dump_all_xives(void)
2559 if (num_possible_cpus() == 0) {
2560 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2564 for_each_possible_cpu(cpu)
2568 static void dump_one_xive_irq(u32 num)
2575 rc = opal_xive_get_irq_config(num, &vp, &prio, &lirq);
2576 xmon_printf("IRQ 0x%x config: vp=0x%llx prio=%d lirq=0x%x (rc=%lld)\n",
2577 num, be64_to_cpu(vp), prio, be32_to_cpu(lirq), rc);
2580 static void dump_xives(void)
2585 if (!xive_enabled()) {
2586 printf("Xive disabled on this system\n");
2594 } else if (c == 'i') {
2596 dump_one_xive_irq(num);
2600 termch = c; /* Put c back, it wasn't 'a' */
2605 dump_one_xive(xmon_owner);
2607 #endif /* CONFIG_PPC_POWERNV */
2609 static void dump_by_size(unsigned long addr, long count, int size)
2611 unsigned char temp[16];
2615 count = ALIGN(count, 16);
2617 for (i = 0; i < count; i += 16, addr += 16) {
2620 if (mread(addr, temp, 16) != 16) {
2621 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2625 for (j = 0; j < 16; j += size) {
2628 case 1: val = temp[j]; break;
2629 case 2: val = *(u16 *)&temp[j]; break;
2630 case 4: val = *(u32 *)&temp[j]; break;
2631 case 8: val = *(u64 *)&temp[j]; break;
2635 printf("%0*llx", size * 2, val);
2644 static char last[] = { "d?\n" };
2651 xmon_start_pagination();
2653 xmon_end_pagination();
2657 #ifdef CONFIG_PPC_POWERNV
2659 xmon_start_pagination();
2661 xmon_end_pagination();
2674 scanhex((void *)&adrs);
2681 else if (nidump > MAX_DUMP)
2683 adrs += ppc_inst_dump(adrs, nidump, 1);
2685 } else if (c == 'l') {
2687 } else if (c == 'o') {
2689 } else if (c == 'v') {
2690 /* dump virtual to physical translation */
2692 } else if (c == 'r') {
2696 xmon_rawdump(adrs, ndump);
2703 else if (ndump > MAX_DUMP)
2711 ndump = ALIGN(ndump, 16);
2712 dump_by_size(adrs, ndump, c - '0');
2717 prdump(adrs, ndump);
2726 prdump(unsigned long adrs, long ndump)
2728 long n, m, c, r, nr;
2729 unsigned char temp[16];
2731 for (n = ndump; n > 0;) {
2735 nr = mread(adrs, temp, r);
2737 for (m = 0; m < r; ++m) {
2738 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2741 printf("%.2x", temp[m]);
2743 printf("%s", fault_chars[fault_type]);
2745 for (; m < 16; ++m) {
2746 if ((m & (sizeof(long) - 1)) == 0)
2751 for (m = 0; m < r; ++m) {
2754 putchar(' ' <= c && c <= '~'? c: '.');
2767 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2770 generic_inst_dump(unsigned long adr, long count, int praddr,
2771 instruction_dump_func dump_func)
2774 unsigned long first_adr;
2775 unsigned int inst, last_inst = 0;
2776 unsigned char val[4];
2779 for (first_adr = adr; count > 0; --count, adr += 4) {
2780 nr = mread(adr, val, 4);
2783 const char *x = fault_chars[fault_type];
2784 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2788 inst = GETWORD(val);
2789 if (adr > first_adr && inst == last_inst) {
2799 printf(REG" %.8x", adr, inst);
2801 dump_func(inst, adr);
2804 return adr - first_adr;
2808 ppc_inst_dump(unsigned long adr, long count, int praddr)
2810 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2814 print_address(unsigned long addr)
2816 xmon_print_symbol(addr, "\t# ", "");
2822 struct kmsg_dumper dumper = { .active = 1 };
2823 unsigned char buf[128];
2826 if (setjmp(bus_error_jmp) != 0) {
2827 printf("Error dumping printk buffer!\n");
2831 catch_memory_errors = 1;
2834 kmsg_dump_rewind_nolock(&dumper);
2835 xmon_start_pagination();
2836 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2840 xmon_end_pagination();
2843 /* wait a little while to see if we get a machine check */
2845 catch_memory_errors = 0;
2848 #ifdef CONFIG_PPC_POWERNV
2849 static void dump_opal_msglog(void)
2851 unsigned char buf[128];
2855 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
2856 printf("Machine is not running OPAL firmware.\n");
2860 if (setjmp(bus_error_jmp) != 0) {
2861 printf("Error dumping OPAL msglog!\n");
2865 catch_memory_errors = 1;
2868 xmon_start_pagination();
2869 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
2871 printf("Error dumping OPAL msglog! Error: %zd\n", res);
2878 xmon_end_pagination();
2881 /* wait a little while to see if we get a machine check */
2883 catch_memory_errors = 0;
2888 * Memory operations - move, set, print differences
2890 static unsigned long mdest; /* destination address */
2891 static unsigned long msrc; /* source address */
2892 static unsigned long mval; /* byte value to set memory to */
2893 static unsigned long mcount; /* # bytes to affect */
2894 static unsigned long mdiffs; /* max # differences to print */
2899 scanhex((void *)&mdest);
2900 if( termch != '\n' )
2902 scanhex((void *)(cmd == 's'? &mval: &msrc));
2903 if( termch != '\n' )
2905 scanhex((void *)&mcount);
2909 printf(xmon_ro_msg);
2912 memmove((void *)mdest, (void *)msrc, mcount);
2916 printf(xmon_ro_msg);
2919 memset((void *)mdest, mval, mcount);
2922 if( termch != '\n' )
2924 scanhex((void *)&mdiffs);
2925 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2931 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2936 for( n = nb; n > 0; --n )
2937 if( *p1++ != *p2++ )
2938 if( ++prt <= maxpr )
2939 printf("%px %.2x # %px %.2x\n", p1 - 1,
2940 p1[-1], p2 - 1, p2[-1]);
2942 printf("Total of %d differences\n", prt);
2945 static unsigned mend;
2946 static unsigned mask;
2952 unsigned char val[4];
2955 scanhex((void *)&mdest);
2956 if (termch != '\n') {
2958 scanhex((void *)&mend);
2959 if (termch != '\n') {
2961 scanhex((void *)&mval);
2963 if (termch != '\n') termch = 0;
2964 scanhex((void *)&mask);
2968 for (a = mdest; a < mend; a += 4) {
2969 if (mread(a, val, 4) == 4
2970 && ((GETWORD(val) ^ mval) & mask) == 0) {
2971 printf("%.16x: %.16x\n", a, GETWORD(val));
2978 static unsigned long mskip = 0x1000;
2979 static unsigned long mlim = 0xffffffff;
2989 if (termch != '\n') termch = 0;
2991 if (termch != '\n') termch = 0;
2994 for (a = mdest; a < mlim; a += mskip) {
2995 ok = mread(a, &v, 1);
2997 printf("%.8x .. ", a);
2998 } else if (!ok && ook)
2999 printf("%.8lx\n", a - mskip);
3005 printf("%.8lx\n", a - mskip);
3008 static void show_task(struct task_struct *tsk)
3013 * Cloned from kdb_task_state_char(), which is not entirely
3014 * appropriate for calling from xmon. This could be moved
3015 * to a common, generic, routine used by both.
3017 state = (tsk->state == 0) ? 'R' :
3018 (tsk->state < 0) ? 'U' :
3019 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3020 (tsk->state & TASK_STOPPED) ? 'T' :
3021 (tsk->state & TASK_TRACED) ? 'C' :
3022 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3023 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3024 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3026 printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
3028 tsk->pid, rcu_dereference(tsk->parent)->pid,
3029 state, task_cpu(tsk),
3033 #ifdef CONFIG_PPC_BOOK3S_64
3034 static void format_pte(void *ptep, unsigned long pte)
3036 pte_t entry = __pte(pte);
3038 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3039 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3041 printf("Flags = %s%s%s%s%s\n",
3042 pte_young(entry) ? "Accessed " : "",
3043 pte_dirty(entry) ? "Dirty " : "",
3044 pte_read(entry) ? "Read " : "",
3045 pte_write(entry) ? "Write " : "",
3046 pte_exec(entry) ? "Exec " : "");
3049 static void show_pte(unsigned long addr)
3051 unsigned long tskv = 0;
3052 struct task_struct *tsk = NULL;
3053 struct mm_struct *mm;
3054 pgd_t *pgdp, *pgdir;
3059 if (!scanhex(&tskv))
3062 tsk = (struct task_struct *)tskv;
3067 mm = tsk->active_mm;
3069 if (setjmp(bus_error_jmp) != 0) {
3070 catch_memory_errors = 0;
3071 printf("*** Error dumping pte for task %px\n", tsk);
3075 catch_memory_errors = 1;
3078 if (mm == &init_mm) {
3079 pgdp = pgd_offset_k(addr);
3080 pgdir = pgd_offset_k(0);
3082 pgdp = pgd_offset(mm, addr);
3083 pgdir = pgd_offset(mm, 0);
3086 if (pgd_none(*pgdp)) {
3087 printf("no linux page table for address\n");
3091 printf("pgd @ 0x%px\n", pgdir);
3093 if (pgd_huge(*pgdp)) {
3094 format_pte(pgdp, pgd_val(*pgdp));
3097 printf("pgdp @ 0x%px = 0x%016lx\n", pgdp, pgd_val(*pgdp));
3099 pudp = pud_offset(pgdp, addr);
3101 if (pud_none(*pudp)) {
3102 printf("No valid PUD\n");
3106 if (pud_huge(*pudp)) {
3107 format_pte(pudp, pud_val(*pudp));
3111 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3113 pmdp = pmd_offset(pudp, addr);
3115 if (pmd_none(*pmdp)) {
3116 printf("No valid PMD\n");
3120 if (pmd_huge(*pmdp)) {
3121 format_pte(pmdp, pmd_val(*pmdp));
3124 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3126 ptep = pte_offset_map(pmdp, addr);
3127 if (pte_none(*ptep)) {
3128 printf("no valid PTE\n");
3132 format_pte(ptep, pte_val(*ptep));
3136 catch_memory_errors = 0;
3139 static void show_pte(unsigned long addr)
3141 printf("show_pte not yet implemented\n");
3143 #endif /* CONFIG_PPC_BOOK3S_64 */
3145 static void show_tasks(void)
3148 struct task_struct *tsk = NULL;
3150 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
3153 tsk = (struct task_struct *)tskv;
3155 if (setjmp(bus_error_jmp) != 0) {
3156 catch_memory_errors = 0;
3157 printf("*** Error dumping task %px\n", tsk);
3161 catch_memory_errors = 1;
3167 for_each_process(tsk)
3172 catch_memory_errors = 0;
3175 static void proccall(void)
3177 unsigned long args[8];
3180 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3181 unsigned long, unsigned long, unsigned long,
3182 unsigned long, unsigned long, unsigned long);
3185 if (!scanhex(&adrs))
3189 for (i = 0; i < 8; ++i)
3191 for (i = 0; i < 8; ++i) {
3192 if (!scanhex(&args[i]) || termch == '\n')
3196 func = (callfunc_t) adrs;
3198 if (setjmp(bus_error_jmp) == 0) {
3199 catch_memory_errors = 1;
3201 ret = func(args[0], args[1], args[2], args[3],
3202 args[4], args[5], args[6], args[7]);
3204 printf("return value is 0x%lx\n", ret);
3206 printf("*** %x exception occurred\n", fault_except);
3208 catch_memory_errors = 0;
3211 /* Input scanning routines */
3222 while( c == ' ' || c == '\t' )
3228 static const char *regnames[N_PTREGS] = {
3229 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3230 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3231 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3232 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3233 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3239 "trap", "dar", "dsisr", "res"
3243 scanhex(unsigned long *vp)
3250 /* parse register name */
3254 for (i = 0; i < sizeof(regname) - 1; ++i) {
3263 i = match_string(regnames, N_PTREGS, regname);
3265 printf("invalid register name '%%%s'\n", regname);
3268 if (xmon_regs == NULL) {
3269 printf("regs not available\n");
3272 *vp = ((unsigned long *)xmon_regs)[i];
3276 /* skip leading "0x" if any */
3290 } else if (c == '$') {
3292 for (i=0; i<63; i++) {
3294 if (isspace(c) || c == '\0') {
3302 if (setjmp(bus_error_jmp) == 0) {
3303 catch_memory_errors = 1;
3305 *vp = kallsyms_lookup_name(tmpstr);
3308 catch_memory_errors = 0;
3310 printf("unknown symbol '%s'\n", tmpstr);
3343 static int hexdigit(int c)
3345 if( '0' <= c && c <= '9' )
3347 if( 'A' <= c && c <= 'F' )
3348 return c - ('A' - 10);
3349 if( 'a' <= c && c <= 'f' )
3350 return c - ('a' - 10);
3355 getstring(char *s, int size)
3366 } while( c != ' ' && c != '\t' && c != '\n' );
3371 static char line[256];
3372 static char *lineptr;
3383 if (lineptr == NULL || *lineptr == 0) {
3384 if (xmon_gets(line, sizeof(line)) == NULL) {
3394 take_input(char *str)
3403 int type = inchar();
3404 unsigned long addr, cpu;
3405 void __percpu *ptr = NULL;
3406 static char tmp[64];
3411 xmon_print_symbol(addr, ": ", "\n");
3416 if (setjmp(bus_error_jmp) == 0) {
3417 catch_memory_errors = 1;
3419 addr = kallsyms_lookup_name(tmp);
3421 printf("%s: %lx\n", tmp, addr);
3423 printf("Symbol '%s' not found.\n", tmp);
3426 catch_memory_errors = 0;
3431 if (setjmp(bus_error_jmp) == 0) {
3432 catch_memory_errors = 1;
3434 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3439 ptr >= (void __percpu *)__per_cpu_start &&
3440 ptr < (void __percpu *)__per_cpu_end)
3442 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3443 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3445 cpu = raw_smp_processor_id();
3446 addr = (unsigned long)this_cpu_ptr(ptr);
3449 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3451 printf("Percpu symbol '%s' not found.\n", tmp);
3454 catch_memory_errors = 0;
3461 /* Print an address in numeric and symbolic form (if possible) */
3462 static void xmon_print_symbol(unsigned long address, const char *mid,
3466 const char *name = NULL;
3467 unsigned long offset, size;
3469 printf(REG, address);
3470 if (setjmp(bus_error_jmp) == 0) {
3471 catch_memory_errors = 1;
3473 name = kallsyms_lookup(address, &size, &offset, &modname,
3476 /* wait a little while to see if we get a machine check */
3480 catch_memory_errors = 0;
3483 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3485 printf(" [%s]", modname);
3487 printf("%s", after);
3490 #ifdef CONFIG_PPC_BOOK3S_64
3491 void dump_segments(void)
3494 unsigned long esid,vsid;
3497 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3499 for (i = 0; i < mmu_slb_size; i++) {
3500 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3501 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3506 printf("%02d %016lx %016lx", i, esid, vsid);
3508 if (!(esid & SLB_ESID_V)) {
3513 llp = vsid & SLB_VSID_LLP;
3514 if (vsid & SLB_VSID_B_1T) {
3515 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3517 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3520 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3522 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3529 #ifdef CONFIG_PPC_BOOK3S_32
3530 void dump_segments(void)
3535 for (i = 0; i < 16; ++i)
3536 printf(" %x", mfsrin(i << 28));
3542 static void dump_tlb_44x(void)
3546 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3547 unsigned long w0,w1,w2;
3548 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3549 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3550 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3551 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3552 if (w0 & PPC44x_TLB_VALID) {
3553 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3554 w0 & PPC44x_TLB_EPN_MASK,
3555 w1 & PPC44x_TLB_ERPN_MASK,
3556 w1 & PPC44x_TLB_RPN_MASK,
3557 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3558 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3559 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3560 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3561 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3566 #endif /* CONFIG_44x */
3568 #ifdef CONFIG_PPC_BOOK3E
3569 static void dump_tlb_book3e(void)
3571 u32 mmucfg, pidmask, lpidmask;
3573 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3575 static const char *pgsz_names[] = {
3610 /* Gather some infos about the MMU */
3611 mmucfg = mfspr(SPRN_MMUCFG);
3612 mmu_version = (mmucfg & 3) + 1;
3613 ntlbs = ((mmucfg >> 2) & 3) + 1;
3614 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3615 lpidsz = (mmucfg >> 24) & 0xf;
3616 rasz = (mmucfg >> 16) & 0x7f;
3617 if ((mmu_version > 1) && (mmucfg & 0x10000))
3619 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3620 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3621 pidmask = (1ul << pidsz) - 1;
3622 lpidmask = (1ul << lpidsz) - 1;
3623 ramask = (1ull << rasz) - 1;
3625 for (tlb = 0; tlb < ntlbs; tlb++) {
3627 int nent, assoc, new_cc = 1;
3628 printf("TLB %d:\n------\n", tlb);
3631 tlbcfg = mfspr(SPRN_TLB0CFG);
3634 tlbcfg = mfspr(SPRN_TLB1CFG);
3637 tlbcfg = mfspr(SPRN_TLB2CFG);
3640 tlbcfg = mfspr(SPRN_TLB3CFG);
3643 printf("Unsupported TLB number !\n");
3646 nent = tlbcfg & 0xfff;
3647 assoc = (tlbcfg >> 24) & 0xff;
3648 for (i = 0; i < nent; i++) {
3649 u32 mas0 = MAS0_TLBSEL(tlb);
3650 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3653 int esel = i, cc = i;
3661 mas0 |= MAS0_ESEL(esel);
3662 mtspr(SPRN_MAS0, mas0);
3663 mtspr(SPRN_MAS1, mas1);
3664 mtspr(SPRN_MAS2, mas2);
3665 asm volatile("tlbre 0,0,0" : : : "memory");
3666 mas1 = mfspr(SPRN_MAS1);
3667 mas2 = mfspr(SPRN_MAS2);
3668 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3669 if (assoc && (i % assoc) == 0)
3671 if (!(mas1 & MAS1_VALID))
3674 printf("%04x- ", i);
3676 printf("%04x-%c", cc, 'A' + esel);
3678 printf(" |%c", 'A' + esel);
3680 printf(" %016llx %04x %s %c%c AS%c",
3682 (mas1 >> 16) & 0x3fff,
3683 pgsz_names[(mas1 >> 7) & 0x1f],
3684 mas1 & MAS1_IND ? 'I' : ' ',
3685 mas1 & MAS1_IPROT ? 'P' : ' ',
3686 mas1 & MAS1_TS ? '1' : '0');
3687 printf(" %c%c%c%c%c%c%c",
3688 mas2 & MAS2_X0 ? 'a' : ' ',
3689 mas2 & MAS2_X1 ? 'v' : ' ',
3690 mas2 & MAS2_W ? 'w' : ' ',
3691 mas2 & MAS2_I ? 'i' : ' ',
3692 mas2 & MAS2_M ? 'm' : ' ',
3693 mas2 & MAS2_G ? 'g' : ' ',
3694 mas2 & MAS2_E ? 'e' : ' ');
3695 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3696 if (mas1 & MAS1_IND)
3698 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3700 printf(" U%c%c%c S%c%c%c\n",
3701 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3702 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3703 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3704 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3705 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3706 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3710 #endif /* CONFIG_PPC_BOOK3E */
3712 static void xmon_init(int enable)
3716 __debugger_ipi = xmon_ipi;
3717 __debugger_bpt = xmon_bpt;
3718 __debugger_sstep = xmon_sstep;
3719 __debugger_iabr_match = xmon_iabr_match;
3720 __debugger_break_match = xmon_break_match;
3721 __debugger_fault_handler = xmon_fault_handler;
3723 #ifdef CONFIG_PPC_PSERIES
3725 * Get the token here to avoid trying to get a lock
3726 * during the crash, causing a deadlock.
3728 set_indicator_token = rtas_token("set-indicator");
3732 __debugger_ipi = NULL;
3733 __debugger_bpt = NULL;
3734 __debugger_sstep = NULL;
3735 __debugger_iabr_match = NULL;
3736 __debugger_break_match = NULL;
3737 __debugger_fault_handler = NULL;
3741 #ifdef CONFIG_MAGIC_SYSRQ
3742 static void sysrq_handle_xmon(int key)
3744 /* ensure xmon is enabled */
3746 debugger(get_irq_regs());
3751 static struct sysrq_key_op sysrq_xmon_op = {
3752 .handler = sysrq_handle_xmon,
3753 .help_msg = "xmon(x)",
3754 .action_msg = "Entering xmon",
3757 static int __init setup_xmon_sysrq(void)
3759 register_sysrq_key('x', &sysrq_xmon_op);
3762 device_initcall(setup_xmon_sysrq);
3763 #endif /* CONFIG_MAGIC_SYSRQ */
3765 #ifdef CONFIG_DEBUG_FS
3766 static void clear_all_bpt(void)
3770 /* clear/unpatch all breakpoints */
3774 /* Disable all breakpoints */
3775 for (i = 0; i < NBPTS; ++i)
3776 bpts[i].enabled = 0;
3778 /* Clear any data or iabr breakpoints */
3779 if (iabr || dabr.enabled) {
3784 printf("xmon: All breakpoints cleared\n");
3787 static int xmon_dbgfs_set(void *data, u64 val)
3792 /* make sure all breakpoints removed when disabling */
3798 static int xmon_dbgfs_get(void *data, u64 *val)
3804 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3805 xmon_dbgfs_set, "%llu\n");
3807 static int __init setup_xmon_dbgfs(void)
3809 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3813 device_initcall(setup_xmon_dbgfs);
3814 #endif /* CONFIG_DEBUG_FS */
3816 static int xmon_early __initdata;
3818 static int __init early_parse_xmon(char *p)
3820 if (!p || strncmp(p, "early", 5) == 0) {
3821 /* just "xmon" is equivalent to "xmon=early" */
3825 } else if (strncmp(p, "on", 2) == 0) {
3828 } else if (strncmp(p, "rw", 2) == 0) {
3832 } else if (strncmp(p, "ro", 2) == 0) {
3836 } else if (strncmp(p, "off", 3) == 0)
3843 early_param("xmon", early_parse_xmon);
3845 void __init xmon_setup(void)
3853 #ifdef CONFIG_SPU_BASE
3857 u64 saved_mfc_sr1_RW;
3858 u32 saved_spu_runcntl_RW;
3859 unsigned long dump_addr;
3863 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
3865 static struct spu_info spu_info[XMON_NUM_SPUS];
3867 void xmon_register_spus(struct list_head *list)
3871 list_for_each_entry(spu, list, full_list) {
3872 if (spu->number >= XMON_NUM_SPUS) {
3877 spu_info[spu->number].spu = spu;
3878 spu_info[spu->number].stopped_ok = 0;
3879 spu_info[spu->number].dump_addr = (unsigned long)
3880 spu_info[spu->number].spu->local_store;
3884 static void stop_spus(void)
3890 for (i = 0; i < XMON_NUM_SPUS; i++) {
3891 if (!spu_info[i].spu)
3894 if (setjmp(bus_error_jmp) == 0) {
3895 catch_memory_errors = 1;
3898 spu = spu_info[i].spu;
3900 spu_info[i].saved_spu_runcntl_RW =
3901 in_be32(&spu->problem->spu_runcntl_RW);
3903 tmp = spu_mfc_sr1_get(spu);
3904 spu_info[i].saved_mfc_sr1_RW = tmp;
3906 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3907 spu_mfc_sr1_set(spu, tmp);
3912 spu_info[i].stopped_ok = 1;
3914 printf("Stopped spu %.2d (was %s)\n", i,
3915 spu_info[i].saved_spu_runcntl_RW ?
3916 "running" : "stopped");
3918 catch_memory_errors = 0;
3919 printf("*** Error stopping spu %.2d\n", i);
3921 catch_memory_errors = 0;
3925 static void restart_spus(void)
3930 for (i = 0; i < XMON_NUM_SPUS; i++) {
3931 if (!spu_info[i].spu)
3934 if (!spu_info[i].stopped_ok) {
3935 printf("*** Error, spu %d was not successfully stopped"
3936 ", not restarting\n", i);
3940 if (setjmp(bus_error_jmp) == 0) {
3941 catch_memory_errors = 1;
3944 spu = spu_info[i].spu;
3945 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3946 out_be32(&spu->problem->spu_runcntl_RW,
3947 spu_info[i].saved_spu_runcntl_RW);
3952 printf("Restarted spu %.2d\n", i);
3954 catch_memory_errors = 0;
3955 printf("*** Error restarting spu %.2d\n", i);
3957 catch_memory_errors = 0;
3961 #define DUMP_WIDTH 23
3962 #define DUMP_VALUE(format, field, value) \
3964 if (setjmp(bus_error_jmp) == 0) { \
3965 catch_memory_errors = 1; \
3967 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3972 catch_memory_errors = 0; \
3973 printf(" %-*s = *** Error reading field.\n", \
3974 DUMP_WIDTH, #field); \
3976 catch_memory_errors = 0; \
3979 #define DUMP_FIELD(obj, format, field) \
3980 DUMP_VALUE(format, field, obj->field)
3982 static void dump_spu_fields(struct spu *spu)
3984 printf("Dumping spu fields at address %p:\n", spu);
3986 DUMP_FIELD(spu, "0x%x", number);
3987 DUMP_FIELD(spu, "%s", name);
3988 DUMP_FIELD(spu, "0x%lx", local_store_phys);
3989 DUMP_FIELD(spu, "0x%p", local_store);
3990 DUMP_FIELD(spu, "0x%lx", ls_size);
3991 DUMP_FIELD(spu, "0x%x", node);
3992 DUMP_FIELD(spu, "0x%lx", flags);
3993 DUMP_FIELD(spu, "%llu", class_0_pending);
3994 DUMP_FIELD(spu, "0x%llx", class_0_dar);
3995 DUMP_FIELD(spu, "0x%llx", class_1_dar);
3996 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
3997 DUMP_FIELD(spu, "0x%x", irqs[0]);
3998 DUMP_FIELD(spu, "0x%x", irqs[1]);
3999 DUMP_FIELD(spu, "0x%x", irqs[2]);
4000 DUMP_FIELD(spu, "0x%x", slb_replace);
4001 DUMP_FIELD(spu, "%d", pid);
4002 DUMP_FIELD(spu, "0x%p", mm);
4003 DUMP_FIELD(spu, "0x%p", ctx);
4004 DUMP_FIELD(spu, "0x%p", rq);
4005 DUMP_FIELD(spu, "0x%llx", timestamp);
4006 DUMP_FIELD(spu, "0x%lx", problem_phys);
4007 DUMP_FIELD(spu, "0x%p", problem);
4008 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4009 in_be32(&spu->problem->spu_runcntl_RW));
4010 DUMP_VALUE("0x%x", problem->spu_status_R,
4011 in_be32(&spu->problem->spu_status_R));
4012 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4013 in_be32(&spu->problem->spu_npc_RW));
4014 DUMP_FIELD(spu, "0x%p", priv2);
4015 DUMP_FIELD(spu, "0x%p", pdata);
4019 spu_inst_dump(unsigned long adr, long count, int praddr)
4021 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4024 static void dump_spu_ls(unsigned long num, int subcmd)
4026 unsigned long offset, addr, ls_addr;
4028 if (setjmp(bus_error_jmp) == 0) {
4029 catch_memory_errors = 1;
4031 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4035 catch_memory_errors = 0;
4036 printf("*** Error: accessing spu info for spu %ld\n", num);
4039 catch_memory_errors = 0;
4041 if (scanhex(&offset))
4042 addr = ls_addr + offset;
4044 addr = spu_info[num].dump_addr;
4046 if (addr >= ls_addr + LS_SIZE) {
4047 printf("*** Error: address outside of local store\n");
4053 addr += spu_inst_dump(addr, 16, 1);
4063 spu_info[num].dump_addr = addr;
4066 static int do_spu_cmd(void)
4068 static unsigned long num = 0;
4069 int cmd, subcmd = 0;
4081 if (isxdigit(subcmd) || subcmd == '\n')
4086 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4087 printf("*** Error: invalid spu number\n");
4093 dump_spu_fields(spu_info[num].spu);
4096 dump_spu_ls(num, subcmd);
4107 #else /* ! CONFIG_SPU_BASE */
4108 static int do_spu_cmd(void)