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>
28 #include <linux/security.h>
30 #include <asm/debugfs.h>
31 #include <asm/ptrace.h>
33 #include <asm/string.h>
35 #include <asm/machdep.h>
37 #include <asm/processor.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>
59 #include <asm/hvcall.h>
65 #include "xmon_bpts.h"
68 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
69 static unsigned long xmon_taken = 1;
70 static int xmon_owner;
74 #endif /* CONFIG_SMP */
76 #ifdef CONFIG_PPC_PSERIES
77 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
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;
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;
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 */
101 unsigned long address;
102 struct ppc_inst *instr;
108 /* Bits in bpt.enabled */
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)
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);
138 static inline void dump_opal_msglog(void)
140 printf("Machine is not running OPAL firmware.\n");
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);
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,
180 static void xmon_print_symbol(unsigned long address, const char *mid,
182 static const char *getvecname(unsigned long vec);
184 static int do_spu_cmd(void);
187 static void dump_tlb_44x(void);
189 #ifdef CONFIG_PPC_BOOK3E
190 static void dump_tlb_book3e(void);
193 static void clear_all_bpt(void);
201 #ifdef __LITTLE_ENDIAN__
202 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
204 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
207 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
209 static char *help_string = "\
211 b show breakpoints\n\
212 bd set data breakpoint\n\
213 bi set instruction breakpoint\n\
214 bc clear breakpoint\n"
217 c print cpus stopped in xmon\n\
218 c# try to switch to cpu number h (in hex)\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"
237 dp[#] dump paca for current cpu, or cpu #\n\
238 dpa dump paca for all possible cpus\n"
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"
251 " e print exception information\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\
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"
274 " S print special registers\n\
277 Sw #v write v to SPR #\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)
288 " U show uptime information\n"
290 " # n limit output to n lines per page (for dp, dpa, dl)\n"
295 #ifdef CONFIG_SECURITY
296 static bool xmon_is_locked_down(void)
298 static bool lockdown;
301 lockdown = !!security_locked_down(LOCKDOWN_XMON_RW);
303 printf("xmon: Disabled due to kernel lockdown\n");
309 xmon_is_ro = !!security_locked_down(LOCKDOWN_XMON_WR);
311 printf("xmon: Read-only due to kernel lockdown\n");
316 #else /* CONFIG_SECURITY */
317 static inline bool xmon_is_locked_down(void)
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))
354 if (cpu_has_feature(CPU_FTR_HVMODE)) {
355 mtspr(SPRN_CIABR, ciabr);
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)
372 if (cpu_has_feature(CPU_FTR_HVMODE))
373 addr |= CIABR_PRIV_HYPER;
375 addr |= CIABR_PRIV_SUPER;
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)
402 rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
403 SURVEILLANCE_TOKEN, 0, 0);
405 #endif /* CONFIG_PPC_PSERIES */
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;
417 if (xmon_speaker == me)
421 last_speaker = cmpxchg(&xmon_speaker, 0, me);
422 if (last_speaker == 0)
426 * Wait a full second for the lock, we might be on a slow
427 * console, but check every 100us.
430 while (xmon_speaker == last_speaker) {
436 /* hostile takeover */
437 prev = cmpxchg(&xmon_speaker, last_speaker, me);
438 if (prev == last_speaker)
445 static void release_output_lock(void)
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)
469 #else /* CONFIG_SMP */
470 static inline void get_output_lock(void) {}
471 static inline void release_output_lock(void) {}
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 */
480 return ((regs->msr & MSR_RI) == 0);
484 static int xmon_core(struct pt_regs *regs, int fromipi)
488 long recurse_jmp[JMP_BUF_LEN];
490 unsigned long offset;
497 local_irq_save(flags);
500 locked_down = xmon_is_locked_down();
503 tracing_enabled = tracing_is_on();
507 bp = in_breakpoint_table(regs->nip, &offset);
509 regs->nip = bp->address + offset;
510 atomic_dec(&bp->ref_count);
516 cpu = smp_processor_id();
517 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
519 * We catch SPR read/write faults here because the 0x700, 0xf60
520 * etc. handlers don't call debugger_fault_handler().
522 if (catch_spr_faults)
523 longjmp(bus_error_jmp, 1);
526 printf("cpu 0x%x: Exception %lx %s in xmon, "
527 "returning to main loop\n",
528 cpu, regs->trap, getvecname(TRAP(regs)));
529 release_output_lock();
530 longjmp(xmon_fault_jmp[cpu], 1);
533 if (setjmp(recurse_jmp) != 0) {
534 if (!in_xmon || !xmon_gate) {
536 printf("xmon: WARNING: bad recursive fault "
537 "on cpu 0x%x\n", cpu);
538 release_output_lock();
541 secondary = !(xmon_taken && cpu == xmon_owner);
545 xmon_fault_jmp[cpu] = recurse_jmp;
548 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
549 bp = at_breakpoint(regs->nip);
550 if (bp || unrecoverable_excp(regs))
558 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
560 xmon_print_symbol(regs->nip, " ", ")\n");
562 if (unrecoverable_excp(regs))
563 printf("WARNING: exception is not recoverable, "
565 release_output_lock();
568 cpumask_set_cpu(cpu, &cpus_in_xmon);
573 while (secondary && !xmon_gate) {
579 secondary = test_and_set_bit(0, &in_xmon);
582 touch_nmi_watchdog();
586 if (!secondary && !xmon_gate) {
587 /* we are the first cpu to come in */
588 /* interrupt other cpu(s) */
589 int ncpus = num_online_cpus();
595 * A system reset (trap == 0x100) can be triggered on
596 * all CPUs, so when we come in via 0x100 try waiting
597 * for the other CPUs to come in before we send the
598 * debugger break (IPI). This is similar to
599 * crash_kexec_secondary().
601 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
602 smp_send_debugger_break();
604 wait_for_other_cpus(ncpus);
607 disable_surveillance();
610 /* for breakpoint or single step, print curr insn */
611 if (bp || TRAP(regs) == 0xd00)
612 ppc_inst_dump(regs->nip, 1, 0);
613 printf("enter ? for help\n");
619 touch_nmi_watchdog();
626 if (cpu == xmon_owner) {
627 if (!test_and_set_bit(0, &xmon_taken)) {
633 while (cpu == xmon_owner)
637 touch_nmi_watchdog();
641 if (locked_down || cmd != 0) {
649 /* have switched to some other cpu */
654 cpumask_clear_cpu(cpu, &cpus_in_xmon);
655 xmon_fault_jmp[cpu] = NULL;
657 /* UP is simple... */
659 printf("Exception %lx %s in xmon, returning to main loop\n",
660 regs->trap, getvecname(TRAP(regs)));
661 longjmp(xmon_fault_jmp[0], 1);
663 if (setjmp(recurse_jmp) == 0) {
664 xmon_fault_jmp[0] = recurse_jmp;
668 bp = at_breakpoint(regs->nip);
670 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
671 xmon_print_symbol(regs->nip, " ", ")\n");
673 if (unrecoverable_excp(regs))
674 printf("WARNING: exception is not recoverable, "
677 disable_surveillance();
679 /* for breakpoint or single step, print current insn */
680 if (bp || TRAP(regs) == 0xd00)
681 ppc_inst_dump(regs->nip, 1, 0);
682 printf("enter ? for help\n");
694 if (regs->msr & MSR_DE) {
695 bp = at_breakpoint(regs->nip);
697 regs->nip = (unsigned long) &bp->instr[0];
698 atomic_inc(&bp->ref_count);
702 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
703 bp = at_breakpoint(regs->nip);
705 int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
707 regs->nip = (unsigned long) &bp->instr[0];
708 atomic_inc(&bp->ref_count);
709 } else if (stepped < 0) {
710 printf("Couldn't single-step %s instruction\n",
711 IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
721 touch_nmi_watchdog();
722 local_irq_restore(flags);
724 return cmd != 'X' && cmd != EOF;
727 int xmon(struct pt_regs *excp)
732 ppc_save_regs(®s);
736 return xmon_core(excp, 0);
740 irqreturn_t xmon_irq(int irq, void *d)
743 local_irq_save(flags);
744 printf("Keyboard interrupt\n");
745 xmon(get_irq_regs());
746 local_irq_restore(flags);
750 static int xmon_bpt(struct pt_regs *regs)
753 unsigned long offset;
755 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
758 /* Are we at the trap at bp->instr[1] for some bp? */
759 bp = in_breakpoint_table(regs->nip, &offset);
760 if (bp != NULL && (offset == 4 || offset == 8)) {
761 regs->nip = bp->address + offset;
762 atomic_dec(&bp->ref_count);
766 /* Are we at a breakpoint? */
767 bp = at_breakpoint(regs->nip);
776 static int xmon_sstep(struct pt_regs *regs)
784 static int xmon_break_match(struct pt_regs *regs)
788 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
790 for (i = 0; i < nr_wp_slots(); i++) {
801 static int xmon_iabr_match(struct pt_regs *regs)
803 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
811 static int xmon_ipi(struct pt_regs *regs)
814 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
820 static int xmon_fault_handler(struct pt_regs *regs)
823 unsigned long offset;
825 if (in_xmon && catch_memory_errors)
826 handle_fault(regs); /* doesn't return */
828 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
829 bp = in_breakpoint_table(regs->nip, &offset);
831 regs->nip = bp->address + offset;
832 atomic_dec(&bp->ref_count);
839 /* Force enable xmon if not already enabled */
840 static inline void force_enable_xmon(void)
842 /* Enable xmon hooks if needed */
844 printf("xmon: Enabling debugger hooks\n");
849 static struct bpt *at_breakpoint(unsigned long pc)
855 for (i = 0; i < NBPTS; ++i, ++bp)
856 if (bp->enabled && pc == bp->address)
861 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
865 off = nip - (unsigned long)bpt_table;
866 if (off >= sizeof(bpt_table))
868 *offp = off & (BPT_SIZE - 1);
871 return bpts + (off / BPT_SIZE);
874 static struct bpt *new_breakpoint(unsigned long a)
879 bp = at_breakpoint(a);
883 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
884 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
886 bp->instr = (void *)(bpt_table + ((bp - bpts) * BPT_WORDS));
891 printf("Sorry, no free breakpoints. Please clear one first.\n");
895 static void insert_bpts(void)
898 struct ppc_inst instr, instr2;
899 struct bpt *bp, *bp2;
902 for (i = 0; i < NBPTS; ++i, ++bp) {
903 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
905 if (!mread_instr(bp->address, &instr)) {
906 printf("Couldn't read instruction at %lx, "
907 "disabling breakpoint there\n", bp->address);
911 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
912 printf("Breakpoint at %lx is on an mtmsrd or rfid "
913 "instruction, disabling it\n", bp->address);
918 * Check the address is not a suffix by looking for a prefix in
921 if (mread_instr(bp->address - 4, &instr2) == 8) {
922 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
928 * We might still be a suffix - if the prefix has already been
929 * replaced by a breakpoint we won't catch it with the above
932 bp2 = at_breakpoint(bp->address - 4);
933 if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
934 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
940 patch_instruction(bp->instr, instr);
941 patch_instruction(ppc_inst_next(bp->instr, &instr),
943 if (bp->enabled & BP_CIABR)
945 if (patch_instruction((struct ppc_inst *)bp->address,
946 ppc_inst(bpinstr)) != 0) {
947 printf("Couldn't write instruction at %lx, "
948 "disabling breakpoint there\n", bp->address);
949 bp->enabled &= ~BP_TRAP;
955 static void insert_cpu_bpts(void)
958 struct arch_hw_breakpoint brk;
960 for (i = 0; i < nr_wp_slots(); i++) {
961 if (dabr[i].enabled) {
962 brk.address = dabr[i].address;
963 brk.type = (dabr[i].enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
965 __set_breakpoint(i, &brk);
970 set_ciabr(iabr->address);
973 static void remove_bpts(void)
977 struct ppc_inst instr;
980 for (i = 0; i < NBPTS; ++i, ++bp) {
981 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
983 if (mread_instr(bp->address, &instr)
984 && ppc_inst_equal(instr, ppc_inst(bpinstr))
985 && patch_instruction(
986 (struct ppc_inst *)bp->address, ppc_inst_read(bp->instr)) != 0)
987 printf("Couldn't remove breakpoint at %lx\n",
992 static void remove_cpu_bpts(void)
994 hw_breakpoint_disable();
998 /* Based on uptime_proc_show(). */
1002 struct timespec64 uptime;
1004 if (setjmp(bus_error_jmp) == 0) {
1005 catch_memory_errors = 1;
1008 ktime_get_coarse_boottime_ts64(&uptime);
1009 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
1010 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
1015 catch_memory_errors = 0;
1018 static void set_lpp_cmd(void)
1022 if (!scanhex(&lpp)) {
1023 printf("Invalid number.\n");
1026 xmon_set_pagination_lpp(lpp);
1028 /* Command interpreting routine */
1029 static char *last_cmd;
1032 cmds(struct pt_regs *excp)
1039 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1043 printf("%x:", smp_processor_id());
1044 #endif /* CONFIG_SMP */
1050 if (last_cmd == NULL)
1052 take_input(last_cmd);
1070 printf(xmon_ro_msg);
1090 prregs(excp); /* print regs */
1105 if (do_spu_cmd() == 0)
1112 if (tracing_enabled)
1116 printf(" <no input ...>\n");
1120 xmon_puts(help_string);
1140 printf(xmon_ro_msg);
1148 #ifdef CONFIG_PPC_BOOK3S
1152 #elif defined(CONFIG_44x)
1156 #elif defined(CONFIG_PPC_BOOK3E)
1165 printf("Unrecognized command: ");
1167 if (' ' < cmd && cmd <= '~')
1170 printf("\\x%x", cmd);
1172 } while (cmd != '\n');
1173 printf(" (type ? for help)\n");
1180 static int do_step(struct pt_regs *regs)
1182 regs->msr |= MSR_DE;
1183 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1188 * Step a single instruction.
1189 * Some instructions we emulate, others we execute with MSR_SE set.
1191 static int do_step(struct pt_regs *regs)
1193 struct ppc_inst instr;
1196 force_enable_xmon();
1197 /* check we are in 64-bit kernel mode, translation enabled */
1198 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1199 if (mread_instr(regs->nip, &instr)) {
1200 stepped = emulate_step(regs, instr);
1202 printf("Couldn't single-step %s instruction\n",
1203 (IS_RFID(instr)? "rfid": "mtmsrd"));
1207 set_trap(regs, 0xd00);
1208 printf("stepped to ");
1209 xmon_print_symbol(regs->nip, " ", "\n");
1210 ppc_inst_dump(regs->nip, 1, 0);
1215 regs->msr |= MSR_SE;
1220 static void bootcmds(void)
1228 ppc_md.restart(tmp);
1229 } else if (cmd == 'h') {
1231 } else if (cmd == 'p') {
1237 static int cpu_cmd(void)
1240 unsigned long cpu, first_cpu, last_cpu;
1243 if (!scanhex(&cpu)) {
1244 /* print cpus waiting or in xmon */
1245 printf("cpus stopped:");
1246 last_cpu = first_cpu = NR_CPUS;
1247 for_each_possible_cpu(cpu) {
1248 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1249 if (cpu == last_cpu + 1) {
1252 if (last_cpu != first_cpu)
1253 printf("-0x%lx", last_cpu);
1254 last_cpu = first_cpu = cpu;
1255 printf(" 0x%lx", cpu);
1259 if (last_cpu != first_cpu)
1260 printf("-0x%lx", last_cpu);
1264 /* try to switch to cpu specified */
1265 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1266 printf("cpu 0x%lx isn't in xmon\n", cpu);
1268 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1269 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1277 while (!xmon_taken) {
1278 if (--timeout == 0) {
1279 if (test_and_set_bit(0, &xmon_taken))
1281 /* take control back */
1283 xmon_owner = smp_processor_id();
1284 printf("cpu 0x%lx didn't take control\n", cpu);
1292 #endif /* CONFIG_SMP */
1295 static unsigned short fcstab[256] = {
1296 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1297 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1298 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1299 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1300 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1301 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1302 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1303 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1304 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1305 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1306 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1307 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1308 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1309 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1310 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1311 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1312 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1313 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1314 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1315 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1316 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1317 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1318 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1319 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1320 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1321 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1322 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1323 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1324 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1325 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1326 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1327 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1330 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1339 if (!scanhex(&adrs))
1341 if (!scanhex(&ncsum))
1344 for (i = 0; i < ncsum; ++i) {
1345 if (mread(adrs+i, &v, 1) == 0) {
1346 printf("csum stopped at "REG"\n", adrs+i);
1351 printf("%x\n", fcs);
1355 * Check if this is a suitable place to put a breakpoint.
1357 static long check_bp_loc(unsigned long addr)
1359 struct ppc_inst instr;
1362 if (!is_kernel_addr(addr)) {
1363 printf("Breakpoints may only be placed at kernel addresses\n");
1366 if (!mread_instr(addr, &instr)) {
1367 printf("Can't read instruction at address %lx\n", addr);
1370 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1371 printf("Breakpoints may not be placed on mtmsrd or rfid "
1378 static int find_free_data_bpt(void)
1382 for (i = 0; i < nr_wp_slots(); i++) {
1383 if (!dabr[i].enabled)
1386 printf("Couldn't find free breakpoint register\n");
1390 static void print_data_bpts(void)
1394 for (i = 0; i < nr_wp_slots(); i++) {
1395 if (!dabr[i].enabled)
1398 printf(" data "REG" [", dabr[i].address);
1399 if (dabr[i].enabled & 1)
1401 if (dabr[i].enabled & 2)
1407 static char *breakpoint_help_string =
1408 "Breakpoint command usage:\n"
1409 "b show breakpoints\n"
1410 "b <addr> [cnt] set breakpoint at given instr addr\n"
1411 "bc clear all breakpoints\n"
1412 "bc <n/addr> clear breakpoint number n or at addr\n"
1413 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1414 "bd <addr> [cnt] set hardware data breakpoint\n"
1428 #ifndef CONFIG_PPC_8xx
1429 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1431 case 'd': /* bd - hardware data breakpoint */
1433 printf(xmon_ro_msg);
1436 if (!ppc_breakpoint_available()) {
1437 printf("Hardware data breakpoint not supported on this cpu\n");
1440 i = find_free_data_bpt();
1447 else if (cmd == 'w')
1451 dabr[i].address = 0;
1452 dabr[i].enabled = 0;
1453 if (scanhex(&dabr[i].address)) {
1454 if (!is_kernel_addr(dabr[i].address)) {
1458 dabr[i].address &= ~HW_BRK_TYPE_DABR;
1459 dabr[i].enabled = mode | BP_DABR;
1462 force_enable_xmon();
1465 case 'i': /* bi - hardware instr breakpoint */
1467 printf(xmon_ro_msg);
1470 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1471 printf("Hardware instruction breakpoint "
1472 "not supported on this cpu\n");
1476 iabr->enabled &= ~BP_CIABR;
1481 if (!check_bp_loc(a))
1483 bp = new_breakpoint(a);
1485 bp->enabled |= BP_CIABR;
1487 force_enable_xmon();
1494 /* clear all breakpoints */
1495 for (i = 0; i < NBPTS; ++i)
1496 bpts[i].enabled = 0;
1498 for (i = 0; i < nr_wp_slots(); i++)
1499 dabr[i].enabled = 0;
1501 printf("All breakpoints cleared\n");
1505 if (a <= NBPTS && a >= 1) {
1506 /* assume a breakpoint number */
1507 bp = &bpts[a-1]; /* bp nums are 1 based */
1509 /* assume a breakpoint address */
1510 bp = at_breakpoint(a);
1512 printf("No breakpoint at %lx\n", a);
1517 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1518 xmon_print_symbol(bp->address, " ", ")\n");
1526 printf(breakpoint_help_string);
1531 if (xmon_is_ro || !scanhex(&a)) {
1532 /* print all breakpoints */
1533 printf(" type address\n");
1535 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1538 printf("%tx %s ", BP_NUM(bp),
1539 (bp->enabled & BP_CIABR) ? "inst": "trap");
1540 xmon_print_symbol(bp->address, " ", "\n");
1545 if (!check_bp_loc(a))
1547 bp = new_breakpoint(a);
1549 bp->enabled |= BP_TRAP;
1550 force_enable_xmon();
1556 /* Very cheap human name for vector lookup. */
1558 const char *getvecname(unsigned long vec)
1563 case 0x100: ret = "(System Reset)"; break;
1564 case 0x200: ret = "(Machine Check)"; break;
1565 case 0x300: ret = "(Data Access)"; break;
1567 if (radix_enabled())
1568 ret = "(Data Access Out of Range)";
1570 ret = "(Data SLB Access)";
1572 case 0x400: ret = "(Instruction Access)"; break;
1574 if (radix_enabled())
1575 ret = "(Instruction Access Out of Range)";
1577 ret = "(Instruction SLB Access)";
1579 case 0x500: ret = "(Hardware Interrupt)"; break;
1580 case 0x600: ret = "(Alignment)"; break;
1581 case 0x700: ret = "(Program Check)"; break;
1582 case 0x800: ret = "(FPU Unavailable)"; break;
1583 case 0x900: ret = "(Decrementer)"; break;
1584 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1585 case 0xa00: ret = "(Doorbell)"; break;
1586 case 0xc00: ret = "(System Call)"; break;
1587 case 0xd00: ret = "(Single Step)"; break;
1588 case 0xe40: ret = "(Emulation Assist)"; break;
1589 case 0xe60: ret = "(HMI)"; break;
1590 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1591 case 0xf00: ret = "(Performance Monitor)"; break;
1592 case 0xf20: ret = "(Altivec Unavailable)"; break;
1593 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1594 case 0x1500: ret = "(Denormalisation)"; break;
1595 case 0x1700: ret = "(Altivec Assist)"; break;
1601 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1602 unsigned long *endp)
1604 unsigned long size, offset;
1607 *startp = *endp = 0;
1610 if (setjmp(bus_error_jmp) == 0) {
1611 catch_memory_errors = 1;
1613 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1615 *startp = pc - offset;
1616 *endp = pc - offset + size;
1620 catch_memory_errors = 0;
1623 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1624 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1626 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1629 int max_to_print = 64;
1631 unsigned long newsp;
1632 unsigned long marker;
1633 struct pt_regs regs;
1635 while (max_to_print--) {
1636 if (!is_kernel_addr(sp)) {
1638 printf("SP (%lx) is in userspace\n", sp);
1642 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1643 || !mread(sp, &newsp, sizeof(unsigned long))) {
1644 printf("Couldn't read stack frame at %lx\n", sp);
1649 * For the first stack frame, try to work out if
1650 * LR and/or the saved LR value in the bottommost
1651 * stack frame are valid.
1653 if ((pc | lr) != 0) {
1654 unsigned long fnstart, fnend;
1655 unsigned long nextip;
1658 get_function_bounds(pc, &fnstart, &fnend);
1661 mread(newsp + LRSAVE_OFFSET, &nextip,
1662 sizeof(unsigned long));
1664 if (!is_kernel_addr(lr)
1665 || (fnstart <= lr && lr < fnend))
1667 } else if (lr == nextip) {
1669 } else if (is_kernel_addr(lr)
1670 && !(fnstart <= lr && lr < fnend)) {
1671 printf("[link register ] ");
1672 xmon_print_symbol(lr, " ", "\n");
1675 printf("["REG"] ", sp);
1676 xmon_print_symbol(ip, " ", " (unreliable)\n");
1681 printf("["REG"] ", sp);
1682 xmon_print_symbol(ip, " ", "\n");
1685 /* Look for "regshere" marker to see if this is
1686 an exception frame. */
1687 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1688 && marker == STACK_FRAME_REGS_MARKER) {
1689 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1691 printf("Couldn't read registers at %lx\n",
1692 sp + STACK_FRAME_OVERHEAD);
1695 printf("--- Exception: %lx %s at ", regs.trap,
1696 getvecname(TRAP(®s)));
1699 xmon_print_symbol(pc, " ", "\n");
1709 static void backtrace(struct pt_regs *excp)
1714 xmon_show_stack(sp, 0, 0);
1716 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1720 static void print_bug_trap(struct pt_regs *regs)
1723 const struct bug_entry *bug;
1726 if (regs->msr & MSR_PR)
1727 return; /* not in kernel */
1728 addr = regs->nip; /* address of trap instruction */
1729 if (!is_kernel_addr(addr))
1731 bug = find_bug(regs->nip);
1734 if (is_warning_bug(bug))
1737 #ifdef CONFIG_DEBUG_BUGVERBOSE
1738 printf("kernel BUG at %s:%u!\n",
1739 bug->file, bug->line);
1741 printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1743 #endif /* CONFIG_BUG */
1746 static void excprint(struct pt_regs *fp)
1751 printf("cpu 0x%x: ", smp_processor_id());
1752 #endif /* CONFIG_SMP */
1755 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1757 xmon_print_symbol(fp->nip, ": ", "\n");
1760 xmon_print_symbol(fp->link, ": ", "\n");
1762 printf(" sp: %lx\n", fp->gpr[1]);
1763 printf(" msr: %lx\n", fp->msr);
1765 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1766 printf(" dar: %lx\n", fp->dar);
1768 printf(" dsisr: %lx\n", fp->dsisr);
1771 printf(" current = 0x%px\n", current);
1773 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1774 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1777 printf(" pid = %d, comm = %s\n",
1778 current->pid, current->comm);
1784 printf(linux_banner);
1787 static void prregs(struct pt_regs *fp)
1791 struct pt_regs regs;
1793 if (scanhex(&base)) {
1794 if (setjmp(bus_error_jmp) == 0) {
1795 catch_memory_errors = 1;
1797 regs = *(struct pt_regs *)base;
1801 catch_memory_errors = 0;
1802 printf("*** Error reading registers from "REG"\n",
1806 catch_memory_errors = 0;
1811 if (FULL_REGS(fp)) {
1812 for (n = 0; n < 16; ++n)
1813 printf("R%.2d = "REG" R%.2d = "REG"\n",
1814 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1816 for (n = 0; n < 7; ++n)
1817 printf("R%.2d = "REG" R%.2d = "REG"\n",
1818 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1821 for (n = 0; n < 32; ++n) {
1822 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1823 (n & 3) == 3? "\n": " ");
1824 if (n == 12 && !FULL_REGS(fp)) {
1831 xmon_print_symbol(fp->nip, " ", "\n");
1832 if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1834 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1837 xmon_print_symbol(fp->link, " ", "\n");
1838 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1839 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1840 fp->ctr, fp->xer, fp->trap);
1842 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1843 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1846 static void cacheflush(void)
1849 unsigned long nflush;
1854 scanhex((void *)&adrs);
1859 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1860 if (setjmp(bus_error_jmp) == 0) {
1861 catch_memory_errors = 1;
1865 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1866 cflush((void *) adrs);
1868 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1869 cinval((void *) adrs);
1872 /* wait a little while to see if we get a machine check */
1875 catch_memory_errors = 0;
1878 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1879 extern void xmon_mtspr(int spr, unsigned long value);
1882 read_spr(int n, unsigned long *vp)
1884 unsigned long ret = -1UL;
1887 if (setjmp(bus_error_jmp) == 0) {
1888 catch_spr_faults = 1;
1891 ret = xmon_mfspr(n, *vp);
1897 catch_spr_faults = 0;
1903 write_spr(int n, unsigned long val)
1906 printf(xmon_ro_msg);
1910 if (setjmp(bus_error_jmp) == 0) {
1911 catch_spr_faults = 1;
1918 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1920 catch_spr_faults = 0;
1923 static void dump_206_sprs(void)
1926 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1929 /* Actually some of these pre-date 2.06, but whatevs */
1931 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1932 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1933 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1934 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1935 printf("amr = %.16lx uamor = %.16lx\n",
1936 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1938 if (!(mfmsr() & MSR_HV))
1941 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1942 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1943 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1944 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1945 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1946 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1947 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1948 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1949 printf("dabr = %.16lx dabrx = %.16lx\n",
1950 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1954 static void dump_207_sprs(void)
1959 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1962 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1963 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1965 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1966 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1970 /* Only if TM has been enabled in the kernel */
1971 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1972 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1973 mfspr(SPRN_TEXASR));
1976 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1977 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1978 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1979 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1980 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1981 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1982 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1983 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1984 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1985 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1986 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1987 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1989 if (!(msr & MSR_HV))
1992 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1993 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1994 printf("dawr0 = %.16lx dawrx0 = %.16lx\n",
1995 mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0));
1996 if (nr_wp_slots() > 1) {
1997 printf("dawr1 = %.16lx dawrx1 = %.16lx\n",
1998 mfspr(SPRN_DAWR1), mfspr(SPRN_DAWRX1));
2000 printf("ciabr = %.16lx\n", mfspr(SPRN_CIABR));
2004 static void dump_300_sprs(void)
2007 bool hv = mfmsr() & MSR_HV;
2009 if (!cpu_has_feature(CPU_FTR_ARCH_300))
2012 printf("pidr = %.16lx tidr = %.16lx\n",
2013 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
2014 printf("psscr = %.16lx\n",
2015 hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
2020 printf("ptcr = %.16lx asdr = %.16lx\n",
2021 mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
2025 static void dump_one_spr(int spr, bool show_unimplemented)
2030 if (!read_spr(spr, &val)) {
2031 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2035 if (val == 0xdeadbeef) {
2036 /* Looks like read was a nop, confirm */
2038 if (!read_spr(spr, &val)) {
2039 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2043 if (val == 0x0badcafe) {
2044 if (show_unimplemented)
2045 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2050 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2053 static void super_regs(void)
2055 static unsigned long regno;
2063 unsigned long sp, toc;
2064 asm("mr %0,1" : "=r" (sp) :);
2065 asm("mr %0,2" : "=r" (toc) :);
2067 printf("msr = "REG" sprg0 = "REG"\n",
2068 mfmsr(), mfspr(SPRN_SPRG0));
2069 printf("pvr = "REG" sprg1 = "REG"\n",
2070 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2071 printf("dec = "REG" sprg2 = "REG"\n",
2072 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2073 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2074 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
2086 read_spr(regno, &val);
2088 write_spr(regno, val);
2089 dump_one_spr(regno, true);
2094 dump_one_spr(regno, true);
2098 for (spr = 1; spr < 1024; ++spr)
2099 dump_one_spr(spr, false);
2107 * Stuff for reading and writing memory safely
2110 mread(unsigned long adrs, void *buf, int size)
2116 if (setjmp(bus_error_jmp) == 0) {
2117 catch_memory_errors = 1;
2123 *(u16 *)q = *(u16 *)p;
2126 *(u32 *)q = *(u32 *)p;
2129 *(u64 *)q = *(u64 *)p;
2132 for( ; n < size; ++n) {
2138 /* wait a little while to see if we get a machine check */
2142 catch_memory_errors = 0;
2147 mwrite(unsigned long adrs, void *buf, int size)
2155 printf(xmon_ro_msg);
2159 if (setjmp(bus_error_jmp) == 0) {
2160 catch_memory_errors = 1;
2166 *(u16 *)p = *(u16 *)q;
2169 *(u32 *)p = *(u32 *)q;
2172 *(u64 *)p = *(u64 *)q;
2175 for ( ; n < size; ++n) {
2181 /* wait a little while to see if we get a machine check */
2185 printf("*** Error writing address "REG"\n", adrs + n);
2187 catch_memory_errors = 0;
2192 mread_instr(unsigned long adrs, struct ppc_inst *instr)
2197 if (setjmp(bus_error_jmp) == 0) {
2198 catch_memory_errors = 1;
2200 *instr = ppc_inst_read((struct ppc_inst *)adrs);
2202 /* wait a little while to see if we get a machine check */
2204 n = ppc_inst_len(*instr);
2206 catch_memory_errors = 0;
2210 static int fault_type;
2211 static int fault_except;
2212 static char *fault_chars[] = { "--", "**", "##" };
2214 static int handle_fault(struct pt_regs *regs)
2216 fault_except = TRAP(regs);
2217 switch (TRAP(regs)) {
2229 longjmp(bus_error_jmp, 1);
2234 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2237 byterev(unsigned char *val, int size)
2243 SWAP(val[0], val[1], t);
2246 SWAP(val[0], val[3], t);
2247 SWAP(val[1], val[2], t);
2249 case 8: /* is there really any use for this? */
2250 SWAP(val[0], val[7], t);
2251 SWAP(val[1], val[6], t);
2252 SWAP(val[2], val[5], t);
2253 SWAP(val[3], val[4], t);
2261 static char *memex_help_string =
2262 "Memory examine command usage:\n"
2263 "m [addr] [flags] examine/change memory\n"
2264 " addr is optional. will start where left off.\n"
2265 " flags may include chars from this set:\n"
2266 " b modify by bytes (default)\n"
2267 " w modify by words (2 byte)\n"
2268 " l modify by longs (4 byte)\n"
2269 " d modify by doubleword (8 byte)\n"
2270 " r toggle reverse byte order mode\n"
2271 " n do not read memory (for i/o spaces)\n"
2272 " . ok to read (default)\n"
2273 "NOTE: flags are saved as defaults\n"
2276 static char *memex_subcmd_help_string =
2277 "Memory examine subcommands:\n"
2278 " hexval write this val to current location\n"
2279 " 'string' write chars from string to this location\n"
2280 " ' increment address\n"
2281 " ^ decrement address\n"
2282 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2283 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2284 " ` clear no-read flag\n"
2285 " ; stay at this addr\n"
2286 " v change to byte mode\n"
2287 " w change to word (2 byte) mode\n"
2288 " l change to long (4 byte) mode\n"
2289 " u change to doubleword (8 byte) mode\n"
2290 " m addr change current addr\n"
2291 " n toggle no-read flag\n"
2292 " r toggle byte reverse flag\n"
2293 " < count back up count bytes\n"
2294 " > count skip forward count bytes\n"
2295 " x exit this mode\n"
2301 int cmd, inc, i, nslash;
2303 unsigned char val[16];
2305 scanhex((void *)&adrs);
2308 printf(memex_help_string);
2314 while ((cmd = skipbl()) != '\n') {
2316 case 'b': size = 1; break;
2317 case 'w': size = 2; break;
2318 case 'l': size = 4; break;
2319 case 'd': size = 8; break;
2320 case 'r': brev = !brev; break;
2321 case 'n': mnoread = 1; break;
2322 case '.': mnoread = 0; break;
2331 n = mread(adrs, val, size);
2332 printf(REG"%c", adrs, brev? 'r': ' ');
2337 for (i = 0; i < n; ++i)
2338 printf("%.2x", val[i]);
2339 for (; i < size; ++i)
2340 printf("%s", fault_chars[fault_type]);
2347 for (i = 0; i < size; ++i)
2348 val[i] = n >> (i * 8);
2351 mwrite(adrs, val, size);
2364 else if( n == '\'' )
2366 for (i = 0; i < size; ++i)
2367 val[i] = n >> (i * 8);
2370 mwrite(adrs, val, size);
2406 adrs -= 1 << nslash;
2410 adrs += 1 << nslash;
2414 adrs += 1 << -nslash;
2418 adrs -= 1 << -nslash;
2421 scanhex((void *)&adrs);
2440 printf(memex_subcmd_help_string);
2455 case 'n': c = '\n'; break;
2456 case 'r': c = '\r'; break;
2457 case 'b': c = '\b'; break;
2458 case 't': c = '\t'; break;
2463 static void xmon_rawdump (unsigned long adrs, long ndump)
2466 unsigned char temp[16];
2468 for (n = ndump; n > 0;) {
2470 nr = mread(adrs, temp, r);
2472 for (m = 0; m < r; ++m) {
2474 printf("%.2x", temp[m]);
2476 printf("%s", fault_chars[fault_type]);
2485 static void dump_tracing(void)
2491 ftrace_dump(DUMP_ORIG);
2493 ftrace_dump(DUMP_ALL);
2497 static void dump_one_paca(int cpu)
2499 struct paca_struct *p;
2500 #ifdef CONFIG_PPC_BOOK3S_64
2504 if (setjmp(bus_error_jmp) != 0) {
2505 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2509 catch_memory_errors = 1;
2514 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2516 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2517 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2518 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2520 #define DUMP(paca, name, format) \
2521 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2522 offsetof(struct paca_struct, name));
2524 DUMP(p, lock_token, "%#-*x");
2525 DUMP(p, paca_index, "%#-*x");
2526 DUMP(p, kernel_toc, "%#-*llx");
2527 DUMP(p, kernelbase, "%#-*llx");
2528 DUMP(p, kernel_msr, "%#-*llx");
2529 DUMP(p, emergency_sp, "%-*px");
2530 #ifdef CONFIG_PPC_BOOK3S_64
2531 DUMP(p, nmi_emergency_sp, "%-*px");
2532 DUMP(p, mc_emergency_sp, "%-*px");
2533 DUMP(p, in_nmi, "%#-*x");
2534 DUMP(p, in_mce, "%#-*x");
2535 DUMP(p, hmi_event_available, "%#-*x");
2537 DUMP(p, data_offset, "%#-*llx");
2538 DUMP(p, hw_cpu_id, "%#-*x");
2539 DUMP(p, cpu_start, "%#-*x");
2540 DUMP(p, kexec_state, "%#-*x");
2541 #ifdef CONFIG_PPC_BOOK3S_64
2542 if (!early_radix_enabled()) {
2543 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2546 if (!p->slb_shadow_ptr)
2549 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2550 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2553 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2554 22, "slb_shadow", i, esid, vsid);
2557 DUMP(p, vmalloc_sllp, "%#-*x");
2558 DUMP(p, stab_rr, "%#-*x");
2559 DUMP(p, slb_used_bitmap, "%#-*x");
2560 DUMP(p, slb_kern_bitmap, "%#-*x");
2562 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2563 DUMP(p, slb_cache_ptr, "%#-*x");
2564 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2565 printf(" %-*s[%d] = 0x%016x\n",
2566 22, "slb_cache", i, p->slb_cache[i]);
2570 DUMP(p, rfi_flush_fallback_area, "%-*px");
2572 DUMP(p, dscr_default, "%#-*llx");
2573 #ifdef CONFIG_PPC_BOOK3E
2574 DUMP(p, pgd, "%-*px");
2575 DUMP(p, kernel_pgd, "%-*px");
2576 DUMP(p, tcd_ptr, "%-*px");
2577 DUMP(p, mc_kstack, "%-*px");
2578 DUMP(p, crit_kstack, "%-*px");
2579 DUMP(p, dbg_kstack, "%-*px");
2581 DUMP(p, __current, "%-*px");
2582 DUMP(p, kstack, "%#-*llx");
2583 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2584 #ifdef CONFIG_STACKPROTECTOR
2585 DUMP(p, canary, "%#-*lx");
2587 DUMP(p, saved_r1, "%#-*llx");
2588 #ifdef CONFIG_PPC_BOOK3E
2589 DUMP(p, trap_save, "%#-*x");
2591 DUMP(p, irq_soft_mask, "%#-*x");
2592 DUMP(p, irq_happened, "%#-*x");
2593 #ifdef CONFIG_MMIOWB
2594 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2595 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2597 DUMP(p, irq_work_pending, "%#-*x");
2598 DUMP(p, sprg_vdso, "%#-*llx");
2600 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2601 DUMP(p, tm_scratch, "%#-*llx");
2604 #ifdef CONFIG_PPC_POWERNV
2605 DUMP(p, idle_state, "%#-*lx");
2606 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2607 DUMP(p, thread_idle_state, "%#-*x");
2608 DUMP(p, subcore_sibling_mask, "%#-*x");
2610 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2611 DUMP(p, requested_psscr, "%#-*llx");
2612 DUMP(p, dont_stop.counter, "%#-*x");
2617 DUMP(p, accounting.utime, "%#-*lx");
2618 DUMP(p, accounting.stime, "%#-*lx");
2619 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2620 DUMP(p, accounting.utime_scaled, "%#-*lx");
2622 DUMP(p, accounting.starttime, "%#-*lx");
2623 DUMP(p, accounting.starttime_user, "%#-*lx");
2624 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2625 DUMP(p, accounting.startspurr, "%#-*lx");
2626 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2628 DUMP(p, accounting.steal_time, "%#-*lx");
2631 catch_memory_errors = 0;
2635 static void dump_all_pacas(void)
2639 if (num_possible_cpus() == 0) {
2640 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2644 for_each_possible_cpu(cpu)
2648 static void dump_pacas(void)
2659 termch = c; /* Put c back, it wasn't 'a' */
2664 dump_one_paca(xmon_owner);
2668 #ifdef CONFIG_PPC_POWERNV
2669 static void dump_one_xive(int cpu)
2671 unsigned int hwid = get_hard_smp_processor_id(cpu);
2672 bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2675 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2676 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2677 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2678 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2679 opal_xive_dump(XIVE_DUMP_VP, hwid);
2680 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2683 if (setjmp(bus_error_jmp) != 0) {
2684 catch_memory_errors = 0;
2685 printf("*** Error dumping xive on cpu %d\n", cpu);
2689 catch_memory_errors = 1;
2691 xmon_xive_do_dump(cpu);
2694 catch_memory_errors = 0;
2697 static void dump_all_xives(void)
2701 if (num_possible_cpus() == 0) {
2702 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2706 for_each_possible_cpu(cpu)
2710 static void dump_one_xive_irq(u32 num, struct irq_data *d)
2712 xmon_xive_get_irq_config(num, d);
2715 static void dump_all_xive_irq(void)
2718 struct irq_desc *desc;
2720 for_each_irq_desc(i, desc) {
2721 struct irq_data *d = irq_desc_get_irq_data(desc);
2727 hwirq = (unsigned int)irqd_to_hwirq(d);
2728 /* IPIs are special (HW number 0) */
2730 dump_one_xive_irq(hwirq, d);
2734 static void dump_xives(void)
2739 if (!xive_enabled()) {
2740 printf("Xive disabled on this system\n");
2748 } else if (c == 'i') {
2750 dump_one_xive_irq(num, NULL);
2752 dump_all_xive_irq();
2756 termch = c; /* Put c back, it wasn't 'a' */
2761 dump_one_xive(xmon_owner);
2763 #endif /* CONFIG_PPC_POWERNV */
2765 static void dump_by_size(unsigned long addr, long count, int size)
2767 unsigned char temp[16];
2771 count = ALIGN(count, 16);
2773 for (i = 0; i < count; i += 16, addr += 16) {
2776 if (mread(addr, temp, 16) != 16) {
2777 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2781 for (j = 0; j < 16; j += size) {
2784 case 1: val = temp[j]; break;
2785 case 2: val = *(u16 *)&temp[j]; break;
2786 case 4: val = *(u32 *)&temp[j]; break;
2787 case 8: val = *(u64 *)&temp[j]; break;
2791 printf("%0*llx", size * 2, val);
2794 for (j = 0; j < 16; ++j) {
2796 putchar(' ' <= val && val <= '~' ? val : '.');
2805 static char last[] = { "d?\n" };
2812 xmon_start_pagination();
2814 xmon_end_pagination();
2818 #ifdef CONFIG_PPC_POWERNV
2820 xmon_start_pagination();
2822 xmon_end_pagination();
2835 scanhex((void *)&adrs);
2842 else if (nidump > MAX_IDUMP)
2844 adrs += ppc_inst_dump(adrs, nidump, 1);
2846 } else if (c == 'l') {
2848 } else if (c == 'o') {
2850 } else if (c == 'v') {
2851 /* dump virtual to physical translation */
2853 } else if (c == 'r') {
2857 xmon_rawdump(adrs, ndump);
2864 else if (ndump > MAX_DUMP)
2872 ndump = ALIGN(ndump, 16);
2873 dump_by_size(adrs, ndump, c - '0');
2878 prdump(adrs, ndump);
2887 prdump(unsigned long adrs, long ndump)
2889 long n, m, c, r, nr;
2890 unsigned char temp[16];
2892 for (n = ndump; n > 0;) {
2896 nr = mread(adrs, temp, r);
2898 for (m = 0; m < r; ++m) {
2899 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2902 printf("%.2x", temp[m]);
2904 printf("%s", fault_chars[fault_type]);
2906 for (; m < 16; ++m) {
2907 if ((m & (sizeof(long) - 1)) == 0)
2912 for (m = 0; m < r; ++m) {
2915 putchar(' ' <= c && c <= '~'? c: '.');
2928 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2931 generic_inst_dump(unsigned long adr, long count, int praddr,
2932 instruction_dump_func dump_func)
2935 unsigned long first_adr;
2936 struct ppc_inst inst, last_inst = ppc_inst(0);
2937 unsigned char val[4];
2940 for (first_adr = adr; count > 0; --count, adr += 4) {
2941 nr = mread(adr, val, 4);
2944 const char *x = fault_chars[fault_type];
2945 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2949 inst = ppc_inst(GETWORD(val));
2950 if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
2960 printf(REG" %.8x", adr, ppc_inst_val(inst));
2962 dump_func(ppc_inst_val(inst), adr);
2965 return adr - first_adr;
2969 ppc_inst_dump(unsigned long adr, long count, int praddr)
2971 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2975 print_address(unsigned long addr)
2977 xmon_print_symbol(addr, "\t# ", "");
2983 struct kmsg_dumper dumper = { .active = 1 };
2984 unsigned char buf[128];
2987 if (setjmp(bus_error_jmp) != 0) {
2988 printf("Error dumping printk buffer!\n");
2992 catch_memory_errors = 1;
2995 kmsg_dump_rewind_nolock(&dumper);
2996 xmon_start_pagination();
2997 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
3001 xmon_end_pagination();
3004 /* wait a little while to see if we get a machine check */
3006 catch_memory_errors = 0;
3009 #ifdef CONFIG_PPC_POWERNV
3010 static void dump_opal_msglog(void)
3012 unsigned char buf[128];
3016 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
3017 printf("Machine is not running OPAL firmware.\n");
3021 if (setjmp(bus_error_jmp) != 0) {
3022 printf("Error dumping OPAL msglog!\n");
3026 catch_memory_errors = 1;
3029 xmon_start_pagination();
3030 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
3032 printf("Error dumping OPAL msglog! Error: %zd\n", res);
3039 xmon_end_pagination();
3042 /* wait a little while to see if we get a machine check */
3044 catch_memory_errors = 0;
3049 * Memory operations - move, set, print differences
3051 static unsigned long mdest; /* destination address */
3052 static unsigned long msrc; /* source address */
3053 static unsigned long mval; /* byte value to set memory to */
3054 static unsigned long mcount; /* # bytes to affect */
3055 static unsigned long mdiffs; /* max # differences to print */
3060 scanhex((void *)&mdest);
3061 if( termch != '\n' )
3063 scanhex((void *)(cmd == 's'? &mval: &msrc));
3064 if( termch != '\n' )
3066 scanhex((void *)&mcount);
3070 printf(xmon_ro_msg);
3073 memmove((void *)mdest, (void *)msrc, mcount);
3077 printf(xmon_ro_msg);
3080 memset((void *)mdest, mval, mcount);
3083 if( termch != '\n' )
3085 scanhex((void *)&mdiffs);
3086 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3092 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3097 for( n = nb; n > 0; --n )
3098 if( *p1++ != *p2++ )
3099 if( ++prt <= maxpr )
3100 printf("%px %.2x # %px %.2x\n", p1 - 1,
3101 p1[-1], p2 - 1, p2[-1]);
3103 printf("Total of %d differences\n", prt);
3106 static unsigned mend;
3107 static unsigned mask;
3113 unsigned char val[4];
3116 scanhex((void *)&mdest);
3117 if (termch != '\n') {
3119 scanhex((void *)&mend);
3120 if (termch != '\n') {
3122 scanhex((void *)&mval);
3124 if (termch != '\n') termch = 0;
3125 scanhex((void *)&mask);
3129 for (a = mdest; a < mend; a += 4) {
3130 if (mread(a, val, 4) == 4
3131 && ((GETWORD(val) ^ mval) & mask) == 0) {
3132 printf("%.16x: %.16x\n", a, GETWORD(val));
3139 static unsigned long mskip = 0x1000;
3140 static unsigned long mlim = 0xffffffff;
3150 if (termch != '\n') termch = 0;
3152 if (termch != '\n') termch = 0;
3155 for (a = mdest; a < mlim; a += mskip) {
3156 ok = mread(a, &v, 1);
3158 printf("%.8x .. ", a);
3159 } else if (!ok && ook)
3160 printf("%.8lx\n", a - mskip);
3166 printf("%.8lx\n", a - mskip);
3169 static void show_task(struct task_struct *tsk)
3174 * Cloned from kdb_task_state_char(), which is not entirely
3175 * appropriate for calling from xmon. This could be moved
3176 * to a common, generic, routine used by both.
3178 state = (tsk->state == 0) ? 'R' :
3179 (tsk->state < 0) ? 'U' :
3180 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3181 (tsk->state & TASK_STOPPED) ? 'T' :
3182 (tsk->state & TASK_TRACED) ? 'C' :
3183 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3184 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3185 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3187 printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk,
3188 tsk->thread.ksp, tsk->thread.regs,
3189 tsk->pid, rcu_dereference(tsk->parent)->pid,
3190 state, task_cpu(tsk),
3194 #ifdef CONFIG_PPC_BOOK3S_64
3195 static void format_pte(void *ptep, unsigned long pte)
3197 pte_t entry = __pte(pte);
3199 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3200 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3202 printf("Flags = %s%s%s%s%s\n",
3203 pte_young(entry) ? "Accessed " : "",
3204 pte_dirty(entry) ? "Dirty " : "",
3205 pte_read(entry) ? "Read " : "",
3206 pte_write(entry) ? "Write " : "",
3207 pte_exec(entry) ? "Exec " : "");
3210 static void show_pte(unsigned long addr)
3212 unsigned long tskv = 0;
3213 struct task_struct *tsk = NULL;
3214 struct mm_struct *mm;
3221 if (!scanhex(&tskv))
3224 tsk = (struct task_struct *)tskv;
3229 mm = tsk->active_mm;
3231 if (setjmp(bus_error_jmp) != 0) {
3232 catch_memory_errors = 0;
3233 printf("*** Error dumping pte for task %px\n", tsk);
3237 catch_memory_errors = 1;
3241 pgdp = pgd_offset_k(addr);
3243 pgdp = pgd_offset(mm, addr);
3245 p4dp = p4d_offset(pgdp, addr);
3247 if (p4d_none(*p4dp)) {
3248 printf("No valid P4D\n");
3252 if (p4d_is_leaf(*p4dp)) {
3253 format_pte(p4dp, p4d_val(*p4dp));
3257 printf("p4dp @ 0x%px = 0x%016lx\n", p4dp, p4d_val(*p4dp));
3259 pudp = pud_offset(p4dp, addr);
3261 if (pud_none(*pudp)) {
3262 printf("No valid PUD\n");
3266 if (pud_is_leaf(*pudp)) {
3267 format_pte(pudp, pud_val(*pudp));
3271 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3273 pmdp = pmd_offset(pudp, addr);
3275 if (pmd_none(*pmdp)) {
3276 printf("No valid PMD\n");
3280 if (pmd_is_leaf(*pmdp)) {
3281 format_pte(pmdp, pmd_val(*pmdp));
3284 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3286 ptep = pte_offset_map(pmdp, addr);
3287 if (pte_none(*ptep)) {
3288 printf("no valid PTE\n");
3292 format_pte(ptep, pte_val(*ptep));
3296 catch_memory_errors = 0;
3299 static void show_pte(unsigned long addr)
3301 printf("show_pte not yet implemented\n");
3303 #endif /* CONFIG_PPC_BOOK3S_64 */
3305 static void show_tasks(void)
3308 struct task_struct *tsk = NULL;
3310 printf(" task_struct ->thread.ksp ->thread.regs PID PPID S P CMD\n");
3313 tsk = (struct task_struct *)tskv;
3315 if (setjmp(bus_error_jmp) != 0) {
3316 catch_memory_errors = 0;
3317 printf("*** Error dumping task %px\n", tsk);
3321 catch_memory_errors = 1;
3327 for_each_process(tsk)
3332 catch_memory_errors = 0;
3335 static void proccall(void)
3337 unsigned long args[8];
3340 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3341 unsigned long, unsigned long, unsigned long,
3342 unsigned long, unsigned long, unsigned long);
3345 if (!scanhex(&adrs))
3349 for (i = 0; i < 8; ++i)
3351 for (i = 0; i < 8; ++i) {
3352 if (!scanhex(&args[i]) || termch == '\n')
3356 func = (callfunc_t) adrs;
3358 if (setjmp(bus_error_jmp) == 0) {
3359 catch_memory_errors = 1;
3361 ret = func(args[0], args[1], args[2], args[3],
3362 args[4], args[5], args[6], args[7]);
3364 printf("return value is 0x%lx\n", ret);
3366 printf("*** %x exception occurred\n", fault_except);
3368 catch_memory_errors = 0;
3371 /* Input scanning routines */
3382 while( c == ' ' || c == '\t' )
3388 static const char *regnames[N_PTREGS] = {
3389 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3390 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3391 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3392 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3393 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3399 "trap", "dar", "dsisr", "res"
3403 scanhex(unsigned long *vp)
3410 /* parse register name */
3414 for (i = 0; i < sizeof(regname) - 1; ++i) {
3423 i = match_string(regnames, N_PTREGS, regname);
3425 printf("invalid register name '%%%s'\n", regname);
3428 if (xmon_regs == NULL) {
3429 printf("regs not available\n");
3432 *vp = ((unsigned long *)xmon_regs)[i];
3436 /* skip leading "0x" if any */
3450 } else if (c == '$') {
3452 for (i=0; i<63; i++) {
3454 if (isspace(c) || c == '\0') {
3462 if (setjmp(bus_error_jmp) == 0) {
3463 catch_memory_errors = 1;
3465 *vp = kallsyms_lookup_name(tmpstr);
3468 catch_memory_errors = 0;
3470 printf("unknown symbol '%s'\n", tmpstr);
3503 static int hexdigit(int c)
3505 if( '0' <= c && c <= '9' )
3507 if( 'A' <= c && c <= 'F' )
3508 return c - ('A' - 10);
3509 if( 'a' <= c && c <= 'f' )
3510 return c - ('a' - 10);
3515 getstring(char *s, int size)
3531 } while( c != ' ' && c != '\t' && c != '\n' );
3536 static char line[256];
3537 static char *lineptr;
3548 if (lineptr == NULL || *lineptr == 0) {
3549 if (xmon_gets(line, sizeof(line)) == NULL) {
3559 take_input(char *str)
3568 int type = inchar();
3569 unsigned long addr, cpu;
3570 void __percpu *ptr = NULL;
3571 static char tmp[64];
3576 xmon_print_symbol(addr, ": ", "\n");
3581 if (setjmp(bus_error_jmp) == 0) {
3582 catch_memory_errors = 1;
3584 addr = kallsyms_lookup_name(tmp);
3586 printf("%s: %lx\n", tmp, addr);
3588 printf("Symbol '%s' not found.\n", tmp);
3591 catch_memory_errors = 0;
3596 if (setjmp(bus_error_jmp) == 0) {
3597 catch_memory_errors = 1;
3599 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3604 ptr >= (void __percpu *)__per_cpu_start &&
3605 ptr < (void __percpu *)__per_cpu_end)
3607 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3608 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3610 cpu = raw_smp_processor_id();
3611 addr = (unsigned long)this_cpu_ptr(ptr);
3614 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3616 printf("Percpu symbol '%s' not found.\n", tmp);
3619 catch_memory_errors = 0;
3626 /* Print an address in numeric and symbolic form (if possible) */
3627 static void xmon_print_symbol(unsigned long address, const char *mid,
3631 const char *name = NULL;
3632 unsigned long offset, size;
3634 printf(REG, address);
3635 if (setjmp(bus_error_jmp) == 0) {
3636 catch_memory_errors = 1;
3638 name = kallsyms_lookup(address, &size, &offset, &modname,
3641 /* wait a little while to see if we get a machine check */
3645 catch_memory_errors = 0;
3648 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3650 printf(" [%s]", modname);
3652 printf("%s", after);
3655 #ifdef CONFIG_PPC_BOOK3S_64
3656 void dump_segments(void)
3659 unsigned long esid,vsid;
3662 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3664 for (i = 0; i < mmu_slb_size; i++) {
3665 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3666 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3671 printf("%02d %016lx %016lx", i, esid, vsid);
3673 if (!(esid & SLB_ESID_V)) {
3678 llp = vsid & SLB_VSID_LLP;
3679 if (vsid & SLB_VSID_B_1T) {
3680 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3682 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3685 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3687 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3694 #ifdef CONFIG_PPC_BOOK3S_32
3695 void dump_segments(void)
3700 for (i = 0; i < 16; ++i)
3701 printf(" %x", mfsrin(i << 28));
3707 static void dump_tlb_44x(void)
3711 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3712 unsigned long w0,w1,w2;
3713 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3714 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3715 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3716 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3717 if (w0 & PPC44x_TLB_VALID) {
3718 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3719 w0 & PPC44x_TLB_EPN_MASK,
3720 w1 & PPC44x_TLB_ERPN_MASK,
3721 w1 & PPC44x_TLB_RPN_MASK,
3722 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3723 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3724 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3725 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3726 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3731 #endif /* CONFIG_44x */
3733 #ifdef CONFIG_PPC_BOOK3E
3734 static void dump_tlb_book3e(void)
3736 u32 mmucfg, pidmask, lpidmask;
3738 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3740 static const char *pgsz_names[] = {
3775 /* Gather some infos about the MMU */
3776 mmucfg = mfspr(SPRN_MMUCFG);
3777 mmu_version = (mmucfg & 3) + 1;
3778 ntlbs = ((mmucfg >> 2) & 3) + 1;
3779 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3780 lpidsz = (mmucfg >> 24) & 0xf;
3781 rasz = (mmucfg >> 16) & 0x7f;
3782 if ((mmu_version > 1) && (mmucfg & 0x10000))
3784 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3785 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3786 pidmask = (1ul << pidsz) - 1;
3787 lpidmask = (1ul << lpidsz) - 1;
3788 ramask = (1ull << rasz) - 1;
3790 for (tlb = 0; tlb < ntlbs; tlb++) {
3792 int nent, assoc, new_cc = 1;
3793 printf("TLB %d:\n------\n", tlb);
3796 tlbcfg = mfspr(SPRN_TLB0CFG);
3799 tlbcfg = mfspr(SPRN_TLB1CFG);
3802 tlbcfg = mfspr(SPRN_TLB2CFG);
3805 tlbcfg = mfspr(SPRN_TLB3CFG);
3808 printf("Unsupported TLB number !\n");
3811 nent = tlbcfg & 0xfff;
3812 assoc = (tlbcfg >> 24) & 0xff;
3813 for (i = 0; i < nent; i++) {
3814 u32 mas0 = MAS0_TLBSEL(tlb);
3815 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3818 int esel = i, cc = i;
3826 mas0 |= MAS0_ESEL(esel);
3827 mtspr(SPRN_MAS0, mas0);
3828 mtspr(SPRN_MAS1, mas1);
3829 mtspr(SPRN_MAS2, mas2);
3830 asm volatile("tlbre 0,0,0" : : : "memory");
3831 mas1 = mfspr(SPRN_MAS1);
3832 mas2 = mfspr(SPRN_MAS2);
3833 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3834 if (assoc && (i % assoc) == 0)
3836 if (!(mas1 & MAS1_VALID))
3839 printf("%04x- ", i);
3841 printf("%04x-%c", cc, 'A' + esel);
3843 printf(" |%c", 'A' + esel);
3845 printf(" %016llx %04x %s %c%c AS%c",
3847 (mas1 >> 16) & 0x3fff,
3848 pgsz_names[(mas1 >> 7) & 0x1f],
3849 mas1 & MAS1_IND ? 'I' : ' ',
3850 mas1 & MAS1_IPROT ? 'P' : ' ',
3851 mas1 & MAS1_TS ? '1' : '0');
3852 printf(" %c%c%c%c%c%c%c",
3853 mas2 & MAS2_X0 ? 'a' : ' ',
3854 mas2 & MAS2_X1 ? 'v' : ' ',
3855 mas2 & MAS2_W ? 'w' : ' ',
3856 mas2 & MAS2_I ? 'i' : ' ',
3857 mas2 & MAS2_M ? 'm' : ' ',
3858 mas2 & MAS2_G ? 'g' : ' ',
3859 mas2 & MAS2_E ? 'e' : ' ');
3860 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3861 if (mas1 & MAS1_IND)
3863 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3865 printf(" U%c%c%c S%c%c%c\n",
3866 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3867 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3868 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3869 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3870 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3871 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3875 #endif /* CONFIG_PPC_BOOK3E */
3877 static void xmon_init(int enable)
3881 __debugger_ipi = xmon_ipi;
3882 __debugger_bpt = xmon_bpt;
3883 __debugger_sstep = xmon_sstep;
3884 __debugger_iabr_match = xmon_iabr_match;
3885 __debugger_break_match = xmon_break_match;
3886 __debugger_fault_handler = xmon_fault_handler;
3888 #ifdef CONFIG_PPC_PSERIES
3890 * Get the token here to avoid trying to get a lock
3891 * during the crash, causing a deadlock.
3893 set_indicator_token = rtas_token("set-indicator");
3897 __debugger_ipi = NULL;
3898 __debugger_bpt = NULL;
3899 __debugger_sstep = NULL;
3900 __debugger_iabr_match = NULL;
3901 __debugger_break_match = NULL;
3902 __debugger_fault_handler = NULL;
3906 #ifdef CONFIG_MAGIC_SYSRQ
3907 static void sysrq_handle_xmon(int key)
3909 if (xmon_is_locked_down()) {
3914 /* ensure xmon is enabled */
3916 debugger(get_irq_regs());
3921 static const struct sysrq_key_op sysrq_xmon_op = {
3922 .handler = sysrq_handle_xmon,
3923 .help_msg = "xmon(x)",
3924 .action_msg = "Entering xmon",
3927 static int __init setup_xmon_sysrq(void)
3929 register_sysrq_key('x', &sysrq_xmon_op);
3932 device_initcall(setup_xmon_sysrq);
3933 #endif /* CONFIG_MAGIC_SYSRQ */
3935 static void clear_all_bpt(void)
3939 /* clear/unpatch all breakpoints */
3943 /* Disable all breakpoints */
3944 for (i = 0; i < NBPTS; ++i)
3945 bpts[i].enabled = 0;
3947 /* Clear any data or iabr breakpoints */
3949 for (i = 0; i < nr_wp_slots(); i++)
3950 dabr[i].enabled = 0;
3953 #ifdef CONFIG_DEBUG_FS
3954 static int xmon_dbgfs_set(void *data, u64 val)
3959 /* make sure all breakpoints removed when disabling */
3963 printf("xmon: All breakpoints cleared\n");
3964 release_output_lock();
3970 static int xmon_dbgfs_get(void *data, u64 *val)
3976 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3977 xmon_dbgfs_set, "%llu\n");
3979 static int __init setup_xmon_dbgfs(void)
3981 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3985 device_initcall(setup_xmon_dbgfs);
3986 #endif /* CONFIG_DEBUG_FS */
3988 static int xmon_early __initdata;
3990 static int __init early_parse_xmon(char *p)
3992 if (xmon_is_locked_down()) {
3996 } else if (!p || strncmp(p, "early", 5) == 0) {
3997 /* just "xmon" is equivalent to "xmon=early" */
4001 } else if (strncmp(p, "on", 2) == 0) {
4004 } else if (strncmp(p, "rw", 2) == 0) {
4008 } else if (strncmp(p, "ro", 2) == 0) {
4012 } else if (strncmp(p, "off", 3) == 0)
4019 early_param("xmon", early_parse_xmon);
4021 void __init xmon_setup(void)
4029 #ifdef CONFIG_SPU_BASE
4033 u64 saved_mfc_sr1_RW;
4034 u32 saved_spu_runcntl_RW;
4035 unsigned long dump_addr;
4039 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4041 static struct spu_info spu_info[XMON_NUM_SPUS];
4043 void xmon_register_spus(struct list_head *list)
4047 list_for_each_entry(spu, list, full_list) {
4048 if (spu->number >= XMON_NUM_SPUS) {
4053 spu_info[spu->number].spu = spu;
4054 spu_info[spu->number].stopped_ok = 0;
4055 spu_info[spu->number].dump_addr = (unsigned long)
4056 spu_info[spu->number].spu->local_store;
4060 static void stop_spus(void)
4066 for (i = 0; i < XMON_NUM_SPUS; i++) {
4067 if (!spu_info[i].spu)
4070 if (setjmp(bus_error_jmp) == 0) {
4071 catch_memory_errors = 1;
4074 spu = spu_info[i].spu;
4076 spu_info[i].saved_spu_runcntl_RW =
4077 in_be32(&spu->problem->spu_runcntl_RW);
4079 tmp = spu_mfc_sr1_get(spu);
4080 spu_info[i].saved_mfc_sr1_RW = tmp;
4082 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4083 spu_mfc_sr1_set(spu, tmp);
4088 spu_info[i].stopped_ok = 1;
4090 printf("Stopped spu %.2d (was %s)\n", i,
4091 spu_info[i].saved_spu_runcntl_RW ?
4092 "running" : "stopped");
4094 catch_memory_errors = 0;
4095 printf("*** Error stopping spu %.2d\n", i);
4097 catch_memory_errors = 0;
4101 static void restart_spus(void)
4106 for (i = 0; i < XMON_NUM_SPUS; i++) {
4107 if (!spu_info[i].spu)
4110 if (!spu_info[i].stopped_ok) {
4111 printf("*** Error, spu %d was not successfully stopped"
4112 ", not restarting\n", i);
4116 if (setjmp(bus_error_jmp) == 0) {
4117 catch_memory_errors = 1;
4120 spu = spu_info[i].spu;
4121 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4122 out_be32(&spu->problem->spu_runcntl_RW,
4123 spu_info[i].saved_spu_runcntl_RW);
4128 printf("Restarted spu %.2d\n", i);
4130 catch_memory_errors = 0;
4131 printf("*** Error restarting spu %.2d\n", i);
4133 catch_memory_errors = 0;
4137 #define DUMP_WIDTH 23
4138 #define DUMP_VALUE(format, field, value) \
4140 if (setjmp(bus_error_jmp) == 0) { \
4141 catch_memory_errors = 1; \
4143 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4148 catch_memory_errors = 0; \
4149 printf(" %-*s = *** Error reading field.\n", \
4150 DUMP_WIDTH, #field); \
4152 catch_memory_errors = 0; \
4155 #define DUMP_FIELD(obj, format, field) \
4156 DUMP_VALUE(format, field, obj->field)
4158 static void dump_spu_fields(struct spu *spu)
4160 printf("Dumping spu fields at address %p:\n", spu);
4162 DUMP_FIELD(spu, "0x%x", number);
4163 DUMP_FIELD(spu, "%s", name);
4164 DUMP_FIELD(spu, "0x%lx", local_store_phys);
4165 DUMP_FIELD(spu, "0x%p", local_store);
4166 DUMP_FIELD(spu, "0x%lx", ls_size);
4167 DUMP_FIELD(spu, "0x%x", node);
4168 DUMP_FIELD(spu, "0x%lx", flags);
4169 DUMP_FIELD(spu, "%llu", class_0_pending);
4170 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4171 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4172 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4173 DUMP_FIELD(spu, "0x%x", irqs[0]);
4174 DUMP_FIELD(spu, "0x%x", irqs[1]);
4175 DUMP_FIELD(spu, "0x%x", irqs[2]);
4176 DUMP_FIELD(spu, "0x%x", slb_replace);
4177 DUMP_FIELD(spu, "%d", pid);
4178 DUMP_FIELD(spu, "0x%p", mm);
4179 DUMP_FIELD(spu, "0x%p", ctx);
4180 DUMP_FIELD(spu, "0x%p", rq);
4181 DUMP_FIELD(spu, "0x%llx", timestamp);
4182 DUMP_FIELD(spu, "0x%lx", problem_phys);
4183 DUMP_FIELD(spu, "0x%p", problem);
4184 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4185 in_be32(&spu->problem->spu_runcntl_RW));
4186 DUMP_VALUE("0x%x", problem->spu_status_R,
4187 in_be32(&spu->problem->spu_status_R));
4188 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4189 in_be32(&spu->problem->spu_npc_RW));
4190 DUMP_FIELD(spu, "0x%p", priv2);
4191 DUMP_FIELD(spu, "0x%p", pdata);
4195 spu_inst_dump(unsigned long adr, long count, int praddr)
4197 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4200 static void dump_spu_ls(unsigned long num, int subcmd)
4202 unsigned long offset, addr, ls_addr;
4204 if (setjmp(bus_error_jmp) == 0) {
4205 catch_memory_errors = 1;
4207 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4211 catch_memory_errors = 0;
4212 printf("*** Error: accessing spu info for spu %ld\n", num);
4215 catch_memory_errors = 0;
4217 if (scanhex(&offset))
4218 addr = ls_addr + offset;
4220 addr = spu_info[num].dump_addr;
4222 if (addr >= ls_addr + LS_SIZE) {
4223 printf("*** Error: address outside of local store\n");
4229 addr += spu_inst_dump(addr, 16, 1);
4239 spu_info[num].dump_addr = addr;
4242 static int do_spu_cmd(void)
4244 static unsigned long num = 0;
4245 int cmd, subcmd = 0;
4257 if (isxdigit(subcmd) || subcmd == '\n')
4262 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4263 printf("*** Error: invalid spu number\n");
4269 dump_spu_fields(spu_info[num].spu);
4272 dump_spu_ls(num, subcmd);
4283 #else /* ! CONFIG_SPU_BASE */
4284 static int do_spu_cmd(void)