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 void xmon_touch_watchdogs(void)
486 touch_softlockup_watchdog_sync();
487 rcu_cpu_stall_reset();
488 touch_nmi_watchdog();
491 static int xmon_core(struct pt_regs *regs, int fromipi)
495 long recurse_jmp[JMP_BUF_LEN];
497 unsigned long offset;
504 local_irq_save(flags);
507 locked_down = xmon_is_locked_down();
510 tracing_enabled = tracing_is_on();
514 bp = in_breakpoint_table(regs->nip, &offset);
516 regs->nip = bp->address + offset;
517 atomic_dec(&bp->ref_count);
523 cpu = smp_processor_id();
524 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
526 * We catch SPR read/write faults here because the 0x700, 0xf60
527 * etc. handlers don't call debugger_fault_handler().
529 if (catch_spr_faults)
530 longjmp(bus_error_jmp, 1);
533 printf("cpu 0x%x: Exception %lx %s in xmon, "
534 "returning to main loop\n",
535 cpu, regs->trap, getvecname(TRAP(regs)));
536 release_output_lock();
537 longjmp(xmon_fault_jmp[cpu], 1);
540 if (setjmp(recurse_jmp) != 0) {
541 if (!in_xmon || !xmon_gate) {
543 printf("xmon: WARNING: bad recursive fault "
544 "on cpu 0x%x\n", cpu);
545 release_output_lock();
548 secondary = !(xmon_taken && cpu == xmon_owner);
552 xmon_fault_jmp[cpu] = recurse_jmp;
555 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
556 bp = at_breakpoint(regs->nip);
557 if (bp || unrecoverable_excp(regs))
565 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
567 xmon_print_symbol(regs->nip, " ", ")\n");
569 if (unrecoverable_excp(regs))
570 printf("WARNING: exception is not recoverable, "
572 release_output_lock();
575 cpumask_set_cpu(cpu, &cpus_in_xmon);
580 while (secondary && !xmon_gate) {
586 secondary = test_and_set_bit(0, &in_xmon);
589 touch_nmi_watchdog();
593 if (!secondary && !xmon_gate) {
594 /* we are the first cpu to come in */
595 /* interrupt other cpu(s) */
596 int ncpus = num_online_cpus();
602 * A system reset (trap == 0x100) can be triggered on
603 * all CPUs, so when we come in via 0x100 try waiting
604 * for the other CPUs to come in before we send the
605 * debugger break (IPI). This is similar to
606 * crash_kexec_secondary().
608 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
609 smp_send_debugger_break();
611 wait_for_other_cpus(ncpus);
614 disable_surveillance();
617 /* for breakpoint or single step, print curr insn */
618 if (bp || TRAP(regs) == 0xd00)
619 ppc_inst_dump(regs->nip, 1, 0);
620 printf("enter ? for help\n");
626 touch_nmi_watchdog();
633 if (cpu == xmon_owner) {
634 if (!test_and_set_bit(0, &xmon_taken)) {
640 while (cpu == xmon_owner)
644 touch_nmi_watchdog();
648 if (locked_down || cmd != 0) {
656 /* have switched to some other cpu */
661 cpumask_clear_cpu(cpu, &cpus_in_xmon);
662 xmon_fault_jmp[cpu] = NULL;
664 /* UP is simple... */
666 printf("Exception %lx %s in xmon, returning to main loop\n",
667 regs->trap, getvecname(TRAP(regs)));
668 longjmp(xmon_fault_jmp[0], 1);
670 if (setjmp(recurse_jmp) == 0) {
671 xmon_fault_jmp[0] = recurse_jmp;
675 bp = at_breakpoint(regs->nip);
677 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
678 xmon_print_symbol(regs->nip, " ", ")\n");
680 if (unrecoverable_excp(regs))
681 printf("WARNING: exception is not recoverable, "
684 disable_surveillance();
686 /* for breakpoint or single step, print current insn */
687 if (bp || TRAP(regs) == 0xd00)
688 ppc_inst_dump(regs->nip, 1, 0);
689 printf("enter ? for help\n");
701 if (regs->msr & MSR_DE) {
702 bp = at_breakpoint(regs->nip);
704 regs->nip = (unsigned long) &bp->instr[0];
705 atomic_inc(&bp->ref_count);
709 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
710 bp = at_breakpoint(regs->nip);
712 int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
714 regs->nip = (unsigned long) &bp->instr[0];
715 atomic_inc(&bp->ref_count);
716 } else if (stepped < 0) {
717 printf("Couldn't single-step %s instruction\n",
718 IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
728 xmon_touch_watchdogs();
729 local_irq_restore(flags);
731 return cmd != 'X' && cmd != EOF;
734 int xmon(struct pt_regs *excp)
739 ppc_save_regs(®s);
743 return xmon_core(excp, 0);
747 irqreturn_t xmon_irq(int irq, void *d)
750 local_irq_save(flags);
751 printf("Keyboard interrupt\n");
752 xmon(get_irq_regs());
753 local_irq_restore(flags);
757 static int xmon_bpt(struct pt_regs *regs)
760 unsigned long offset;
762 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
765 /* Are we at the trap at bp->instr[1] for some bp? */
766 bp = in_breakpoint_table(regs->nip, &offset);
767 if (bp != NULL && (offset == 4 || offset == 8)) {
768 regs->nip = bp->address + offset;
769 atomic_dec(&bp->ref_count);
773 /* Are we at a breakpoint? */
774 bp = at_breakpoint(regs->nip);
783 static int xmon_sstep(struct pt_regs *regs)
791 static int xmon_break_match(struct pt_regs *regs)
795 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
797 for (i = 0; i < nr_wp_slots(); i++) {
808 static int xmon_iabr_match(struct pt_regs *regs)
810 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
818 static int xmon_ipi(struct pt_regs *regs)
821 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
827 static int xmon_fault_handler(struct pt_regs *regs)
830 unsigned long offset;
832 if (in_xmon && catch_memory_errors)
833 handle_fault(regs); /* doesn't return */
835 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
836 bp = in_breakpoint_table(regs->nip, &offset);
838 regs->nip = bp->address + offset;
839 atomic_dec(&bp->ref_count);
846 /* Force enable xmon if not already enabled */
847 static inline void force_enable_xmon(void)
849 /* Enable xmon hooks if needed */
851 printf("xmon: Enabling debugger hooks\n");
856 static struct bpt *at_breakpoint(unsigned long pc)
862 for (i = 0; i < NBPTS; ++i, ++bp)
863 if (bp->enabled && pc == bp->address)
868 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
872 off = nip - (unsigned long)bpt_table;
873 if (off >= sizeof(bpt_table))
875 *offp = off & (BPT_SIZE - 1);
878 return bpts + (off / BPT_SIZE);
881 static struct bpt *new_breakpoint(unsigned long a)
886 bp = at_breakpoint(a);
890 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
891 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
893 bp->instr = (void *)(bpt_table + ((bp - bpts) * BPT_WORDS));
898 printf("Sorry, no free breakpoints. Please clear one first.\n");
902 static void insert_bpts(void)
905 struct ppc_inst instr, instr2;
906 struct bpt *bp, *bp2;
909 for (i = 0; i < NBPTS; ++i, ++bp) {
910 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
912 if (!mread_instr(bp->address, &instr)) {
913 printf("Couldn't read instruction at %lx, "
914 "disabling breakpoint there\n", bp->address);
918 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
919 printf("Breakpoint at %lx is on an mtmsrd or rfid "
920 "instruction, disabling it\n", bp->address);
925 * Check the address is not a suffix by looking for a prefix in
928 if (mread_instr(bp->address - 4, &instr2) == 8) {
929 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
935 * We might still be a suffix - if the prefix has already been
936 * replaced by a breakpoint we won't catch it with the above
939 bp2 = at_breakpoint(bp->address - 4);
940 if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
941 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
947 patch_instruction(bp->instr, instr);
948 patch_instruction(ppc_inst_next(bp->instr, &instr),
950 if (bp->enabled & BP_CIABR)
952 if (patch_instruction((struct ppc_inst *)bp->address,
953 ppc_inst(bpinstr)) != 0) {
954 printf("Couldn't write instruction at %lx, "
955 "disabling breakpoint there\n", bp->address);
956 bp->enabled &= ~BP_TRAP;
962 static void insert_cpu_bpts(void)
965 struct arch_hw_breakpoint brk;
967 for (i = 0; i < nr_wp_slots(); i++) {
968 if (dabr[i].enabled) {
969 brk.address = dabr[i].address;
970 brk.type = (dabr[i].enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
973 __set_breakpoint(i, &brk);
978 set_ciabr(iabr->address);
981 static void remove_bpts(void)
985 struct ppc_inst instr;
988 for (i = 0; i < NBPTS; ++i, ++bp) {
989 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
991 if (mread_instr(bp->address, &instr)
992 && ppc_inst_equal(instr, ppc_inst(bpinstr))
993 && patch_instruction(
994 (struct ppc_inst *)bp->address, ppc_inst_read(bp->instr)) != 0)
995 printf("Couldn't remove breakpoint at %lx\n",
1000 static void remove_cpu_bpts(void)
1002 hw_breakpoint_disable();
1006 /* Based on uptime_proc_show(). */
1010 struct timespec64 uptime;
1012 if (setjmp(bus_error_jmp) == 0) {
1013 catch_memory_errors = 1;
1016 ktime_get_coarse_boottime_ts64(&uptime);
1017 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
1018 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
1023 catch_memory_errors = 0;
1026 static void set_lpp_cmd(void)
1030 if (!scanhex(&lpp)) {
1031 printf("Invalid number.\n");
1034 xmon_set_pagination_lpp(lpp);
1036 /* Command interpreting routine */
1037 static char *last_cmd;
1040 cmds(struct pt_regs *excp)
1047 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1051 printf("%x:", smp_processor_id());
1052 #endif /* CONFIG_SMP */
1058 if (last_cmd == NULL)
1060 take_input(last_cmd);
1078 printf(xmon_ro_msg);
1098 prregs(excp); /* print regs */
1113 if (do_spu_cmd() == 0)
1120 if (tracing_enabled)
1124 printf(" <no input ...>\n");
1128 xmon_puts(help_string);
1148 printf(xmon_ro_msg);
1156 #ifdef CONFIG_PPC_BOOK3S
1160 #elif defined(CONFIG_44x)
1164 #elif defined(CONFIG_PPC_BOOK3E)
1173 printf("Unrecognized command: ");
1175 if (' ' < cmd && cmd <= '~')
1178 printf("\\x%x", cmd);
1180 } while (cmd != '\n');
1181 printf(" (type ? for help)\n");
1188 static int do_step(struct pt_regs *regs)
1190 regs->msr |= MSR_DE;
1191 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1196 * Step a single instruction.
1197 * Some instructions we emulate, others we execute with MSR_SE set.
1199 static int do_step(struct pt_regs *regs)
1201 struct ppc_inst instr;
1204 force_enable_xmon();
1205 /* check we are in 64-bit kernel mode, translation enabled */
1206 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1207 if (mread_instr(regs->nip, &instr)) {
1208 stepped = emulate_step(regs, instr);
1210 printf("Couldn't single-step %s instruction\n",
1211 (IS_RFID(instr)? "rfid": "mtmsrd"));
1215 set_trap(regs, 0xd00);
1216 printf("stepped to ");
1217 xmon_print_symbol(regs->nip, " ", "\n");
1218 ppc_inst_dump(regs->nip, 1, 0);
1223 regs->msr |= MSR_SE;
1228 static void bootcmds(void)
1236 ppc_md.restart(tmp);
1237 } else if (cmd == 'h') {
1239 } else if (cmd == 'p') {
1245 static int cpu_cmd(void)
1248 unsigned long cpu, first_cpu, last_cpu;
1251 if (!scanhex(&cpu)) {
1252 /* print cpus waiting or in xmon */
1253 printf("cpus stopped:");
1254 last_cpu = first_cpu = NR_CPUS;
1255 for_each_possible_cpu(cpu) {
1256 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1257 if (cpu == last_cpu + 1) {
1260 if (last_cpu != first_cpu)
1261 printf("-0x%lx", last_cpu);
1262 last_cpu = first_cpu = cpu;
1263 printf(" 0x%lx", cpu);
1267 if (last_cpu != first_cpu)
1268 printf("-0x%lx", last_cpu);
1272 /* try to switch to cpu specified */
1273 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1274 printf("cpu 0x%lx isn't in xmon\n", cpu);
1276 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1277 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1285 while (!xmon_taken) {
1286 if (--timeout == 0) {
1287 if (test_and_set_bit(0, &xmon_taken))
1289 /* take control back */
1291 xmon_owner = smp_processor_id();
1292 printf("cpu 0x%lx didn't take control\n", cpu);
1300 #endif /* CONFIG_SMP */
1303 static unsigned short fcstab[256] = {
1304 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1305 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1306 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1307 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1308 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1309 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1310 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1311 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1312 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1313 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1314 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1315 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1316 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1317 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1318 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1319 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1320 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1321 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1322 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1323 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1324 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1325 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1326 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1327 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1328 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1329 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1330 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1331 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1332 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1333 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1334 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1335 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1338 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1347 if (!scanhex(&adrs))
1349 if (!scanhex(&ncsum))
1352 for (i = 0; i < ncsum; ++i) {
1353 if (mread(adrs+i, &v, 1) == 0) {
1354 printf("csum stopped at "REG"\n", adrs+i);
1359 printf("%x\n", fcs);
1363 * Check if this is a suitable place to put a breakpoint.
1365 static long check_bp_loc(unsigned long addr)
1367 struct ppc_inst instr;
1370 if (!is_kernel_addr(addr)) {
1371 printf("Breakpoints may only be placed at kernel addresses\n");
1374 if (!mread_instr(addr, &instr)) {
1375 printf("Can't read instruction at address %lx\n", addr);
1378 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1379 printf("Breakpoints may not be placed on mtmsrd or rfid "
1386 static int find_free_data_bpt(void)
1390 for (i = 0; i < nr_wp_slots(); i++) {
1391 if (!dabr[i].enabled)
1394 printf("Couldn't find free breakpoint register\n");
1398 static void print_data_bpts(void)
1402 for (i = 0; i < nr_wp_slots(); i++) {
1403 if (!dabr[i].enabled)
1406 printf(" data "REG" [", dabr[i].address);
1407 if (dabr[i].enabled & 1)
1409 if (dabr[i].enabled & 2)
1415 static char *breakpoint_help_string =
1416 "Breakpoint command usage:\n"
1417 "b show breakpoints\n"
1418 "b <addr> [cnt] set breakpoint at given instr addr\n"
1419 "bc clear all breakpoints\n"
1420 "bc <n/addr> clear breakpoint number n or at addr\n"
1421 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1422 "bd <addr> [cnt] set hardware data breakpoint\n"
1436 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1438 case 'd': /* bd - hardware data breakpoint */
1440 printf(xmon_ro_msg);
1443 if (!ppc_breakpoint_available()) {
1444 printf("Hardware data breakpoint not supported on this cpu\n");
1447 i = find_free_data_bpt();
1454 else if (cmd == 'w')
1458 dabr[i].address = 0;
1459 dabr[i].enabled = 0;
1460 if (scanhex(&dabr[i].address)) {
1461 if (!is_kernel_addr(dabr[i].address)) {
1465 dabr[i].address &= ~HW_BRK_TYPE_DABR;
1466 dabr[i].enabled = mode | BP_DABR;
1469 force_enable_xmon();
1472 case 'i': /* bi - hardware instr breakpoint */
1474 printf(xmon_ro_msg);
1477 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1478 printf("Hardware instruction breakpoint "
1479 "not supported on this cpu\n");
1483 iabr->enabled &= ~BP_CIABR;
1488 if (!check_bp_loc(a))
1490 bp = new_breakpoint(a);
1492 bp->enabled |= BP_CIABR;
1494 force_enable_xmon();
1500 /* clear all breakpoints */
1501 for (i = 0; i < NBPTS; ++i)
1502 bpts[i].enabled = 0;
1504 for (i = 0; i < nr_wp_slots(); i++)
1505 dabr[i].enabled = 0;
1507 printf("All breakpoints cleared\n");
1511 if (a <= NBPTS && a >= 1) {
1512 /* assume a breakpoint number */
1513 bp = &bpts[a-1]; /* bp nums are 1 based */
1515 /* assume a breakpoint address */
1516 bp = at_breakpoint(a);
1518 printf("No breakpoint at %lx\n", a);
1523 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1524 xmon_print_symbol(bp->address, " ", ")\n");
1532 printf(breakpoint_help_string);
1537 if (xmon_is_ro || !scanhex(&a)) {
1538 /* print all breakpoints */
1539 printf(" type address\n");
1541 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1544 printf("%tx %s ", BP_NUM(bp),
1545 (bp->enabled & BP_CIABR) ? "inst": "trap");
1546 xmon_print_symbol(bp->address, " ", "\n");
1551 if (!check_bp_loc(a))
1553 bp = new_breakpoint(a);
1555 bp->enabled |= BP_TRAP;
1556 force_enable_xmon();
1562 /* Very cheap human name for vector lookup. */
1564 const char *getvecname(unsigned long vec)
1569 case 0x100: ret = "(System Reset)"; break;
1570 case 0x200: ret = "(Machine Check)"; break;
1571 case 0x300: ret = "(Data Access)"; break;
1573 if (radix_enabled())
1574 ret = "(Data Access Out of Range)";
1576 ret = "(Data SLB Access)";
1578 case 0x400: ret = "(Instruction Access)"; break;
1580 if (radix_enabled())
1581 ret = "(Instruction Access Out of Range)";
1583 ret = "(Instruction SLB Access)";
1585 case 0x500: ret = "(Hardware Interrupt)"; break;
1586 case 0x600: ret = "(Alignment)"; break;
1587 case 0x700: ret = "(Program Check)"; break;
1588 case 0x800: ret = "(FPU Unavailable)"; break;
1589 case 0x900: ret = "(Decrementer)"; break;
1590 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1591 case 0xa00: ret = "(Doorbell)"; break;
1592 case 0xc00: ret = "(System Call)"; break;
1593 case 0xd00: ret = "(Single Step)"; break;
1594 case 0xe40: ret = "(Emulation Assist)"; break;
1595 case 0xe60: ret = "(HMI)"; break;
1596 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1597 case 0xf00: ret = "(Performance Monitor)"; break;
1598 case 0xf20: ret = "(Altivec Unavailable)"; break;
1599 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1600 case 0x1500: ret = "(Denormalisation)"; break;
1601 case 0x1700: ret = "(Altivec Assist)"; break;
1602 case 0x3000: ret = "(System Call Vectored)"; break;
1608 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1609 unsigned long *endp)
1611 unsigned long size, offset;
1614 *startp = *endp = 0;
1617 if (setjmp(bus_error_jmp) == 0) {
1618 catch_memory_errors = 1;
1620 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1622 *startp = pc - offset;
1623 *endp = pc - offset + size;
1627 catch_memory_errors = 0;
1630 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1631 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1633 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1636 int max_to_print = 64;
1638 unsigned long newsp;
1639 unsigned long marker;
1640 struct pt_regs regs;
1642 while (max_to_print--) {
1643 if (!is_kernel_addr(sp)) {
1645 printf("SP (%lx) is in userspace\n", sp);
1649 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1650 || !mread(sp, &newsp, sizeof(unsigned long))) {
1651 printf("Couldn't read stack frame at %lx\n", sp);
1656 * For the first stack frame, try to work out if
1657 * LR and/or the saved LR value in the bottommost
1658 * stack frame are valid.
1660 if ((pc | lr) != 0) {
1661 unsigned long fnstart, fnend;
1662 unsigned long nextip;
1665 get_function_bounds(pc, &fnstart, &fnend);
1668 mread(newsp + LRSAVE_OFFSET, &nextip,
1669 sizeof(unsigned long));
1671 if (!is_kernel_addr(lr)
1672 || (fnstart <= lr && lr < fnend))
1674 } else if (lr == nextip) {
1676 } else if (is_kernel_addr(lr)
1677 && !(fnstart <= lr && lr < fnend)) {
1678 printf("[link register ] ");
1679 xmon_print_symbol(lr, " ", "\n");
1682 printf("["REG"] ", sp);
1683 xmon_print_symbol(ip, " ", " (unreliable)\n");
1688 printf("["REG"] ", sp);
1689 xmon_print_symbol(ip, " ", "\n");
1692 /* Look for "regshere" marker to see if this is
1693 an exception frame. */
1694 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1695 && marker == STACK_FRAME_REGS_MARKER) {
1696 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1698 printf("Couldn't read registers at %lx\n",
1699 sp + STACK_FRAME_OVERHEAD);
1702 printf("--- Exception: %lx %s at ", regs.trap,
1703 getvecname(TRAP(®s)));
1706 xmon_print_symbol(pc, " ", "\n");
1716 static void backtrace(struct pt_regs *excp)
1721 xmon_show_stack(sp, 0, 0);
1723 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1727 static void print_bug_trap(struct pt_regs *regs)
1730 const struct bug_entry *bug;
1733 if (regs->msr & MSR_PR)
1734 return; /* not in kernel */
1735 addr = regs->nip; /* address of trap instruction */
1736 if (!is_kernel_addr(addr))
1738 bug = find_bug(regs->nip);
1741 if (is_warning_bug(bug))
1744 #ifdef CONFIG_DEBUG_BUGVERBOSE
1745 printf("kernel BUG at %s:%u!\n",
1746 (char *)bug + bug->file_disp, bug->line);
1748 printf("kernel BUG at %px!\n", (void *)bug + bug->bug_addr_disp);
1750 #endif /* CONFIG_BUG */
1753 static void excprint(struct pt_regs *fp)
1758 printf("cpu 0x%x: ", smp_processor_id());
1759 #endif /* CONFIG_SMP */
1762 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1764 xmon_print_symbol(fp->nip, ": ", "\n");
1767 xmon_print_symbol(fp->link, ": ", "\n");
1769 printf(" sp: %lx\n", fp->gpr[1]);
1770 printf(" msr: %lx\n", fp->msr);
1772 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1773 printf(" dar: %lx\n", fp->dar);
1775 printf(" dsisr: %lx\n", fp->dsisr);
1778 printf(" current = 0x%px\n", current);
1780 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1781 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1784 printf(" pid = %d, comm = %s\n",
1785 current->pid, current->comm);
1791 printf(linux_banner);
1794 static void prregs(struct pt_regs *fp)
1798 struct pt_regs regs;
1800 if (scanhex(&base)) {
1801 if (setjmp(bus_error_jmp) == 0) {
1802 catch_memory_errors = 1;
1804 regs = *(struct pt_regs *)base;
1808 catch_memory_errors = 0;
1809 printf("*** Error reading registers from "REG"\n",
1813 catch_memory_errors = 0;
1818 if (FULL_REGS(fp)) {
1819 for (n = 0; n < 16; ++n)
1820 printf("R%.2d = "REG" R%.2d = "REG"\n",
1821 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1823 for (n = 0; n < 7; ++n)
1824 printf("R%.2d = "REG" R%.2d = "REG"\n",
1825 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1828 for (n = 0; n < 32; ++n) {
1829 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1830 (n & 3) == 3? "\n": " ");
1831 if (n == 12 && !FULL_REGS(fp)) {
1838 xmon_print_symbol(fp->nip, " ", "\n");
1839 if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1841 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1844 xmon_print_symbol(fp->link, " ", "\n");
1845 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1846 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1847 fp->ctr, fp->xer, fp->trap);
1849 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1850 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1853 static void cacheflush(void)
1856 unsigned long nflush;
1861 scanhex((void *)&adrs);
1866 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1867 if (setjmp(bus_error_jmp) == 0) {
1868 catch_memory_errors = 1;
1871 if (cmd != 'i' || IS_ENABLED(CONFIG_PPC_BOOK3S_64)) {
1872 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1873 cflush((void *) adrs);
1875 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1876 cinval((void *) adrs);
1879 /* wait a little while to see if we get a machine check */
1882 catch_memory_errors = 0;
1885 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1886 extern void xmon_mtspr(int spr, unsigned long value);
1889 read_spr(int n, unsigned long *vp)
1891 unsigned long ret = -1UL;
1894 if (setjmp(bus_error_jmp) == 0) {
1895 catch_spr_faults = 1;
1898 ret = xmon_mfspr(n, *vp);
1904 catch_spr_faults = 0;
1910 write_spr(int n, unsigned long val)
1913 printf(xmon_ro_msg);
1917 if (setjmp(bus_error_jmp) == 0) {
1918 catch_spr_faults = 1;
1925 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1927 catch_spr_faults = 0;
1930 static void dump_206_sprs(void)
1933 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1936 /* Actually some of these pre-date 2.06, but whatevs */
1938 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1939 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1940 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1941 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1942 printf("amr = %.16lx uamor = %.16lx\n",
1943 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1945 if (!(mfmsr() & MSR_HV))
1948 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1949 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1950 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1951 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1952 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1953 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1954 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1955 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1956 printf("dabr = %.16lx dabrx = %.16lx\n",
1957 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1961 static void dump_207_sprs(void)
1966 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1969 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1970 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1972 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1973 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1977 /* Only if TM has been enabled in the kernel */
1978 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1979 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1980 mfspr(SPRN_TEXASR));
1983 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1984 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1985 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1986 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1987 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1988 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1989 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1990 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1991 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1992 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1993 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1994 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1996 if (!(msr & MSR_HV))
1999 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
2000 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
2001 printf("dawr0 = %.16lx dawrx0 = %.16lx\n",
2002 mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0));
2003 if (nr_wp_slots() > 1) {
2004 printf("dawr1 = %.16lx dawrx1 = %.16lx\n",
2005 mfspr(SPRN_DAWR1), mfspr(SPRN_DAWRX1));
2007 printf("ciabr = %.16lx\n", mfspr(SPRN_CIABR));
2011 static void dump_300_sprs(void)
2014 bool hv = mfmsr() & MSR_HV;
2016 if (!cpu_has_feature(CPU_FTR_ARCH_300))
2019 printf("pidr = %.16lx tidr = %.16lx\n",
2020 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
2021 printf("psscr = %.16lx\n",
2022 hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
2027 printf("ptcr = %.16lx asdr = %.16lx\n",
2028 mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
2032 static void dump_310_sprs(void)
2035 if (!cpu_has_feature(CPU_FTR_ARCH_31))
2038 printf("mmcr3 = %.16lx, sier2 = %.16lx, sier3 = %.16lx\n",
2039 mfspr(SPRN_MMCR3), mfspr(SPRN_SIER2), mfspr(SPRN_SIER3));
2044 static void dump_one_spr(int spr, bool show_unimplemented)
2049 if (!read_spr(spr, &val)) {
2050 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2054 if (val == 0xdeadbeef) {
2055 /* Looks like read was a nop, confirm */
2057 if (!read_spr(spr, &val)) {
2058 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2062 if (val == 0x0badcafe) {
2063 if (show_unimplemented)
2064 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2069 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2072 static void super_regs(void)
2074 static unsigned long regno;
2082 unsigned long sp, toc;
2083 asm("mr %0,1" : "=r" (sp) :);
2084 asm("mr %0,2" : "=r" (toc) :);
2086 printf("msr = "REG" sprg0 = "REG"\n",
2087 mfmsr(), mfspr(SPRN_SPRG0));
2088 printf("pvr = "REG" sprg1 = "REG"\n",
2089 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2090 printf("dec = "REG" sprg2 = "REG"\n",
2091 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2092 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2093 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
2106 read_spr(regno, &val);
2108 write_spr(regno, val);
2109 dump_one_spr(regno, true);
2114 dump_one_spr(regno, true);
2118 for (spr = 1; spr < 1024; ++spr)
2119 dump_one_spr(spr, false);
2127 * Stuff for reading and writing memory safely
2130 mread(unsigned long adrs, void *buf, int size)
2136 if (setjmp(bus_error_jmp) == 0) {
2137 catch_memory_errors = 1;
2143 *(u16 *)q = *(u16 *)p;
2146 *(u32 *)q = *(u32 *)p;
2149 *(u64 *)q = *(u64 *)p;
2152 for( ; n < size; ++n) {
2158 /* wait a little while to see if we get a machine check */
2162 catch_memory_errors = 0;
2167 mwrite(unsigned long adrs, void *buf, int size)
2175 printf(xmon_ro_msg);
2179 if (setjmp(bus_error_jmp) == 0) {
2180 catch_memory_errors = 1;
2186 *(u16 *)p = *(u16 *)q;
2189 *(u32 *)p = *(u32 *)q;
2192 *(u64 *)p = *(u64 *)q;
2195 for ( ; n < size; ++n) {
2201 /* wait a little while to see if we get a machine check */
2205 printf("*** Error writing address "REG"\n", adrs + n);
2207 catch_memory_errors = 0;
2212 mread_instr(unsigned long adrs, struct ppc_inst *instr)
2217 if (setjmp(bus_error_jmp) == 0) {
2218 catch_memory_errors = 1;
2220 *instr = ppc_inst_read((struct ppc_inst *)adrs);
2222 /* wait a little while to see if we get a machine check */
2224 n = ppc_inst_len(*instr);
2226 catch_memory_errors = 0;
2230 static int fault_type;
2231 static int fault_except;
2232 static char *fault_chars[] = { "--", "**", "##" };
2234 static int handle_fault(struct pt_regs *regs)
2236 fault_except = TRAP(regs);
2237 switch (TRAP(regs)) {
2249 longjmp(bus_error_jmp, 1);
2254 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2257 byterev(unsigned char *val, int size)
2263 SWAP(val[0], val[1], t);
2266 SWAP(val[0], val[3], t);
2267 SWAP(val[1], val[2], t);
2269 case 8: /* is there really any use for this? */
2270 SWAP(val[0], val[7], t);
2271 SWAP(val[1], val[6], t);
2272 SWAP(val[2], val[5], t);
2273 SWAP(val[3], val[4], t);
2281 static char *memex_help_string =
2282 "Memory examine command usage:\n"
2283 "m [addr] [flags] examine/change memory\n"
2284 " addr is optional. will start where left off.\n"
2285 " flags may include chars from this set:\n"
2286 " b modify by bytes (default)\n"
2287 " w modify by words (2 byte)\n"
2288 " l modify by longs (4 byte)\n"
2289 " d modify by doubleword (8 byte)\n"
2290 " r toggle reverse byte order mode\n"
2291 " n do not read memory (for i/o spaces)\n"
2292 " . ok to read (default)\n"
2293 "NOTE: flags are saved as defaults\n"
2296 static char *memex_subcmd_help_string =
2297 "Memory examine subcommands:\n"
2298 " hexval write this val to current location\n"
2299 " 'string' write chars from string to this location\n"
2300 " ' increment address\n"
2301 " ^ decrement address\n"
2302 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2303 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2304 " ` clear no-read flag\n"
2305 " ; stay at this addr\n"
2306 " v change to byte mode\n"
2307 " w change to word (2 byte) mode\n"
2308 " l change to long (4 byte) mode\n"
2309 " u change to doubleword (8 byte) mode\n"
2310 " m addr change current addr\n"
2311 " n toggle no-read flag\n"
2312 " r toggle byte reverse flag\n"
2313 " < count back up count bytes\n"
2314 " > count skip forward count bytes\n"
2315 " x exit this mode\n"
2321 int cmd, inc, i, nslash;
2323 unsigned char val[16];
2325 scanhex((void *)&adrs);
2328 printf(memex_help_string);
2334 while ((cmd = skipbl()) != '\n') {
2336 case 'b': size = 1; break;
2337 case 'w': size = 2; break;
2338 case 'l': size = 4; break;
2339 case 'd': size = 8; break;
2340 case 'r': brev = !brev; break;
2341 case 'n': mnoread = 1; break;
2342 case '.': mnoread = 0; break;
2351 n = mread(adrs, val, size);
2352 printf(REG"%c", adrs, brev? 'r': ' ');
2357 for (i = 0; i < n; ++i)
2358 printf("%.2x", val[i]);
2359 for (; i < size; ++i)
2360 printf("%s", fault_chars[fault_type]);
2367 for (i = 0; i < size; ++i)
2368 val[i] = n >> (i * 8);
2371 mwrite(adrs, val, size);
2384 else if( n == '\'' )
2386 for (i = 0; i < size; ++i)
2387 val[i] = n >> (i * 8);
2390 mwrite(adrs, val, size);
2426 adrs -= 1 << nslash;
2430 adrs += 1 << nslash;
2434 adrs += 1 << -nslash;
2438 adrs -= 1 << -nslash;
2441 scanhex((void *)&adrs);
2460 printf(memex_subcmd_help_string);
2475 case 'n': c = '\n'; break;
2476 case 'r': c = '\r'; break;
2477 case 'b': c = '\b'; break;
2478 case 't': c = '\t'; break;
2483 static void xmon_rawdump (unsigned long adrs, long ndump)
2486 unsigned char temp[16];
2488 for (n = ndump; n > 0;) {
2490 nr = mread(adrs, temp, r);
2492 for (m = 0; m < r; ++m) {
2494 printf("%.2x", temp[m]);
2496 printf("%s", fault_chars[fault_type]);
2505 static void dump_tracing(void)
2511 ftrace_dump(DUMP_ORIG);
2513 ftrace_dump(DUMP_ALL);
2517 static void dump_one_paca(int cpu)
2519 struct paca_struct *p;
2520 #ifdef CONFIG_PPC_BOOK3S_64
2524 if (setjmp(bus_error_jmp) != 0) {
2525 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2529 catch_memory_errors = 1;
2534 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2536 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2537 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2538 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2540 #define DUMP(paca, name, format) \
2541 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2542 offsetof(struct paca_struct, name));
2544 DUMP(p, lock_token, "%#-*x");
2545 DUMP(p, paca_index, "%#-*x");
2546 DUMP(p, kernel_toc, "%#-*llx");
2547 DUMP(p, kernelbase, "%#-*llx");
2548 DUMP(p, kernel_msr, "%#-*llx");
2549 DUMP(p, emergency_sp, "%-*px");
2550 #ifdef CONFIG_PPC_BOOK3S_64
2551 DUMP(p, nmi_emergency_sp, "%-*px");
2552 DUMP(p, mc_emergency_sp, "%-*px");
2553 DUMP(p, in_nmi, "%#-*x");
2554 DUMP(p, in_mce, "%#-*x");
2555 DUMP(p, hmi_event_available, "%#-*x");
2557 DUMP(p, data_offset, "%#-*llx");
2558 DUMP(p, hw_cpu_id, "%#-*x");
2559 DUMP(p, cpu_start, "%#-*x");
2560 DUMP(p, kexec_state, "%#-*x");
2561 #ifdef CONFIG_PPC_BOOK3S_64
2562 if (!early_radix_enabled()) {
2563 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2566 if (!p->slb_shadow_ptr)
2569 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2570 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2573 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2574 22, "slb_shadow", i, esid, vsid);
2577 DUMP(p, vmalloc_sllp, "%#-*x");
2578 DUMP(p, stab_rr, "%#-*x");
2579 DUMP(p, slb_used_bitmap, "%#-*x");
2580 DUMP(p, slb_kern_bitmap, "%#-*x");
2582 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2583 DUMP(p, slb_cache_ptr, "%#-*x");
2584 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2585 printf(" %-*s[%d] = 0x%016x\n",
2586 22, "slb_cache", i, p->slb_cache[i]);
2590 DUMP(p, rfi_flush_fallback_area, "%-*px");
2592 DUMP(p, dscr_default, "%#-*llx");
2593 #ifdef CONFIG_PPC_BOOK3E
2594 DUMP(p, pgd, "%-*px");
2595 DUMP(p, kernel_pgd, "%-*px");
2596 DUMP(p, tcd_ptr, "%-*px");
2597 DUMP(p, mc_kstack, "%-*px");
2598 DUMP(p, crit_kstack, "%-*px");
2599 DUMP(p, dbg_kstack, "%-*px");
2601 DUMP(p, __current, "%-*px");
2602 DUMP(p, kstack, "%#-*llx");
2603 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2604 #ifdef CONFIG_STACKPROTECTOR
2605 DUMP(p, canary, "%#-*lx");
2607 DUMP(p, saved_r1, "%#-*llx");
2608 #ifdef CONFIG_PPC_BOOK3E
2609 DUMP(p, trap_save, "%#-*x");
2611 DUMP(p, irq_soft_mask, "%#-*x");
2612 DUMP(p, irq_happened, "%#-*x");
2613 #ifdef CONFIG_MMIOWB
2614 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2615 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2617 DUMP(p, irq_work_pending, "%#-*x");
2618 DUMP(p, sprg_vdso, "%#-*llx");
2620 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2621 DUMP(p, tm_scratch, "%#-*llx");
2624 #ifdef CONFIG_PPC_POWERNV
2625 DUMP(p, idle_state, "%#-*lx");
2626 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2627 DUMP(p, thread_idle_state, "%#-*x");
2628 DUMP(p, subcore_sibling_mask, "%#-*x");
2630 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2631 DUMP(p, requested_psscr, "%#-*llx");
2632 DUMP(p, dont_stop.counter, "%#-*x");
2637 DUMP(p, accounting.utime, "%#-*lx");
2638 DUMP(p, accounting.stime, "%#-*lx");
2639 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2640 DUMP(p, accounting.utime_scaled, "%#-*lx");
2642 DUMP(p, accounting.starttime, "%#-*lx");
2643 DUMP(p, accounting.starttime_user, "%#-*lx");
2644 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2645 DUMP(p, accounting.startspurr, "%#-*lx");
2646 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2648 DUMP(p, accounting.steal_time, "%#-*lx");
2651 catch_memory_errors = 0;
2655 static void dump_all_pacas(void)
2659 if (num_possible_cpus() == 0) {
2660 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2664 for_each_possible_cpu(cpu)
2668 static void dump_pacas(void)
2679 termch = c; /* Put c back, it wasn't 'a' */
2684 dump_one_paca(xmon_owner);
2688 #ifdef CONFIG_PPC_POWERNV
2689 static void dump_one_xive(int cpu)
2691 unsigned int hwid = get_hard_smp_processor_id(cpu);
2692 bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2695 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2696 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2697 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2698 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2699 opal_xive_dump(XIVE_DUMP_VP, hwid);
2700 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2703 if (setjmp(bus_error_jmp) != 0) {
2704 catch_memory_errors = 0;
2705 printf("*** Error dumping xive on cpu %d\n", cpu);
2709 catch_memory_errors = 1;
2711 xmon_xive_do_dump(cpu);
2714 catch_memory_errors = 0;
2717 static void dump_all_xives(void)
2721 if (num_possible_cpus() == 0) {
2722 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2726 for_each_possible_cpu(cpu)
2730 static void dump_one_xive_irq(u32 num, struct irq_data *d)
2732 xmon_xive_get_irq_config(num, d);
2735 static void dump_all_xive_irq(void)
2738 struct irq_desc *desc;
2740 for_each_irq_desc(i, desc) {
2741 struct irq_data *d = irq_desc_get_irq_data(desc);
2747 hwirq = (unsigned int)irqd_to_hwirq(d);
2748 /* IPIs are special (HW number 0) */
2750 dump_one_xive_irq(hwirq, d);
2754 static void dump_xives(void)
2759 if (!xive_enabled()) {
2760 printf("Xive disabled on this system\n");
2768 } else if (c == 'i') {
2770 dump_one_xive_irq(num, NULL);
2772 dump_all_xive_irq();
2776 termch = c; /* Put c back, it wasn't 'a' */
2781 dump_one_xive(xmon_owner);
2783 #endif /* CONFIG_PPC_POWERNV */
2785 static void dump_by_size(unsigned long addr, long count, int size)
2787 unsigned char temp[16];
2791 count = ALIGN(count, 16);
2793 for (i = 0; i < count; i += 16, addr += 16) {
2796 if (mread(addr, temp, 16) != 16) {
2797 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2801 for (j = 0; j < 16; j += size) {
2804 case 1: val = temp[j]; break;
2805 case 2: val = *(u16 *)&temp[j]; break;
2806 case 4: val = *(u32 *)&temp[j]; break;
2807 case 8: val = *(u64 *)&temp[j]; break;
2811 printf("%0*llx", size * 2, val);
2814 for (j = 0; j < 16; ++j) {
2816 putchar(' ' <= val && val <= '~' ? val : '.');
2825 static char last[] = { "d?\n" };
2832 xmon_start_pagination();
2834 xmon_end_pagination();
2838 #ifdef CONFIG_PPC_POWERNV
2840 xmon_start_pagination();
2842 xmon_end_pagination();
2855 scanhex((void *)&adrs);
2862 else if (nidump > MAX_IDUMP)
2864 adrs += ppc_inst_dump(adrs, nidump, 1);
2866 } else if (c == 'l') {
2868 } else if (c == 'o') {
2870 } else if (c == 'v') {
2871 /* dump virtual to physical translation */
2873 } else if (c == 'r') {
2877 xmon_rawdump(adrs, ndump);
2884 else if (ndump > MAX_DUMP)
2892 ndump = ALIGN(ndump, 16);
2893 dump_by_size(adrs, ndump, c - '0');
2898 prdump(adrs, ndump);
2907 prdump(unsigned long adrs, long ndump)
2909 long n, m, c, r, nr;
2910 unsigned char temp[16];
2912 for (n = ndump; n > 0;) {
2916 nr = mread(adrs, temp, r);
2918 for (m = 0; m < r; ++m) {
2919 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2922 printf("%.2x", temp[m]);
2924 printf("%s", fault_chars[fault_type]);
2926 for (; m < 16; ++m) {
2927 if ((m & (sizeof(long) - 1)) == 0)
2932 for (m = 0; m < r; ++m) {
2935 putchar(' ' <= c && c <= '~'? c: '.');
2948 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2951 generic_inst_dump(unsigned long adr, long count, int praddr,
2952 instruction_dump_func dump_func)
2955 unsigned long first_adr;
2956 struct ppc_inst inst, last_inst = ppc_inst(0);
2959 for (first_adr = adr; count > 0; --count, adr += ppc_inst_len(inst)) {
2960 nr = mread_instr(adr, &inst);
2963 const char *x = fault_chars[fault_type];
2964 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2968 if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
2978 printf(REG" %s", adr, ppc_inst_as_str(inst));
2980 if (!ppc_inst_prefixed(inst))
2981 dump_func(ppc_inst_val(inst), adr);
2983 dump_func(ppc_inst_as_u64(inst), adr);
2986 return adr - first_adr;
2990 ppc_inst_dump(unsigned long adr, long count, int praddr)
2992 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2996 print_address(unsigned long addr)
2998 xmon_print_symbol(addr, "\t# ", "");
3004 struct kmsg_dumper dumper = { .active = 1 };
3005 unsigned char buf[128];
3008 if (setjmp(bus_error_jmp) != 0) {
3009 printf("Error dumping printk buffer!\n");
3013 catch_memory_errors = 1;
3016 kmsg_dump_rewind_nolock(&dumper);
3017 xmon_start_pagination();
3018 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
3022 xmon_end_pagination();
3025 /* wait a little while to see if we get a machine check */
3027 catch_memory_errors = 0;
3030 #ifdef CONFIG_PPC_POWERNV
3031 static void dump_opal_msglog(void)
3033 unsigned char buf[128];
3037 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
3038 printf("Machine is not running OPAL firmware.\n");
3042 if (setjmp(bus_error_jmp) != 0) {
3043 printf("Error dumping OPAL msglog!\n");
3047 catch_memory_errors = 1;
3050 xmon_start_pagination();
3051 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
3053 printf("Error dumping OPAL msglog! Error: %zd\n", res);
3060 xmon_end_pagination();
3063 /* wait a little while to see if we get a machine check */
3065 catch_memory_errors = 0;
3070 * Memory operations - move, set, print differences
3072 static unsigned long mdest; /* destination address */
3073 static unsigned long msrc; /* source address */
3074 static unsigned long mval; /* byte value to set memory to */
3075 static unsigned long mcount; /* # bytes to affect */
3076 static unsigned long mdiffs; /* max # differences to print */
3081 scanhex((void *)&mdest);
3082 if( termch != '\n' )
3084 scanhex((void *)(cmd == 's'? &mval: &msrc));
3085 if( termch != '\n' )
3087 scanhex((void *)&mcount);
3091 printf(xmon_ro_msg);
3094 memmove((void *)mdest, (void *)msrc, mcount);
3098 printf(xmon_ro_msg);
3101 memset((void *)mdest, mval, mcount);
3104 if( termch != '\n' )
3106 scanhex((void *)&mdiffs);
3107 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3113 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3118 for( n = nb; n > 0; --n )
3119 if( *p1++ != *p2++ )
3120 if( ++prt <= maxpr )
3121 printf("%px %.2x # %px %.2x\n", p1 - 1,
3122 p1[-1], p2 - 1, p2[-1]);
3124 printf("Total of %d differences\n", prt);
3127 static unsigned mend;
3128 static unsigned mask;
3134 unsigned char val[4];
3137 scanhex((void *)&mdest);
3138 if (termch != '\n') {
3140 scanhex((void *)&mend);
3141 if (termch != '\n') {
3143 scanhex((void *)&mval);
3145 if (termch != '\n') termch = 0;
3146 scanhex((void *)&mask);
3150 for (a = mdest; a < mend; a += 4) {
3151 if (mread(a, val, 4) == 4
3152 && ((GETWORD(val) ^ mval) & mask) == 0) {
3153 printf("%.16x: %.16x\n", a, GETWORD(val));
3160 static unsigned long mskip = 0x1000;
3161 static unsigned long mlim = 0xffffffff;
3171 if (termch != '\n') termch = 0;
3173 if (termch != '\n') termch = 0;
3176 for (a = mdest; a < mlim; a += mskip) {
3177 ok = mread(a, &v, 1);
3179 printf("%.8x .. ", a);
3180 } else if (!ok && ook)
3181 printf("%.8lx\n", a - mskip);
3187 printf("%.8lx\n", a - mskip);
3190 static void show_task(struct task_struct *tsk)
3195 * Cloned from kdb_task_state_char(), which is not entirely
3196 * appropriate for calling from xmon. This could be moved
3197 * to a common, generic, routine used by both.
3199 state = (tsk->state == 0) ? 'R' :
3200 (tsk->state < 0) ? 'U' :
3201 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3202 (tsk->state & TASK_STOPPED) ? 'T' :
3203 (tsk->state & TASK_TRACED) ? 'C' :
3204 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3205 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3206 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3208 printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk,
3209 tsk->thread.ksp, tsk->thread.regs,
3210 tsk->pid, rcu_dereference(tsk->parent)->pid,
3211 state, task_cpu(tsk),
3215 #ifdef CONFIG_PPC_BOOK3S_64
3216 static void format_pte(void *ptep, unsigned long pte)
3218 pte_t entry = __pte(pte);
3220 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3221 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3223 printf("Flags = %s%s%s%s%s\n",
3224 pte_young(entry) ? "Accessed " : "",
3225 pte_dirty(entry) ? "Dirty " : "",
3226 pte_read(entry) ? "Read " : "",
3227 pte_write(entry) ? "Write " : "",
3228 pte_exec(entry) ? "Exec " : "");
3231 static void show_pte(unsigned long addr)
3233 unsigned long tskv = 0;
3234 struct task_struct *tsk = NULL;
3235 struct mm_struct *mm;
3242 if (!scanhex(&tskv))
3245 tsk = (struct task_struct *)tskv;
3250 mm = tsk->active_mm;
3252 if (setjmp(bus_error_jmp) != 0) {
3253 catch_memory_errors = 0;
3254 printf("*** Error dumping pte for task %px\n", tsk);
3258 catch_memory_errors = 1;
3262 pgdp = pgd_offset_k(addr);
3264 pgdp = pgd_offset(mm, addr);
3266 p4dp = p4d_offset(pgdp, addr);
3268 if (p4d_none(*p4dp)) {
3269 printf("No valid P4D\n");
3273 if (p4d_is_leaf(*p4dp)) {
3274 format_pte(p4dp, p4d_val(*p4dp));
3278 printf("p4dp @ 0x%px = 0x%016lx\n", p4dp, p4d_val(*p4dp));
3280 pudp = pud_offset(p4dp, addr);
3282 if (pud_none(*pudp)) {
3283 printf("No valid PUD\n");
3287 if (pud_is_leaf(*pudp)) {
3288 format_pte(pudp, pud_val(*pudp));
3292 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3294 pmdp = pmd_offset(pudp, addr);
3296 if (pmd_none(*pmdp)) {
3297 printf("No valid PMD\n");
3301 if (pmd_is_leaf(*pmdp)) {
3302 format_pte(pmdp, pmd_val(*pmdp));
3305 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3307 ptep = pte_offset_map(pmdp, addr);
3308 if (pte_none(*ptep)) {
3309 printf("no valid PTE\n");
3313 format_pte(ptep, pte_val(*ptep));
3317 catch_memory_errors = 0;
3320 static void show_pte(unsigned long addr)
3322 printf("show_pte not yet implemented\n");
3324 #endif /* CONFIG_PPC_BOOK3S_64 */
3326 static void show_tasks(void)
3329 struct task_struct *tsk = NULL;
3331 printf(" task_struct ->thread.ksp ->thread.regs PID PPID S P CMD\n");
3334 tsk = (struct task_struct *)tskv;
3336 if (setjmp(bus_error_jmp) != 0) {
3337 catch_memory_errors = 0;
3338 printf("*** Error dumping task %px\n", tsk);
3342 catch_memory_errors = 1;
3348 for_each_process(tsk)
3353 catch_memory_errors = 0;
3356 static void proccall(void)
3358 unsigned long args[8];
3361 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3362 unsigned long, unsigned long, unsigned long,
3363 unsigned long, unsigned long, unsigned long);
3366 if (!scanhex(&adrs))
3370 for (i = 0; i < 8; ++i)
3372 for (i = 0; i < 8; ++i) {
3373 if (!scanhex(&args[i]) || termch == '\n')
3377 func = (callfunc_t) adrs;
3379 if (setjmp(bus_error_jmp) == 0) {
3380 catch_memory_errors = 1;
3382 ret = func(args[0], args[1], args[2], args[3],
3383 args[4], args[5], args[6], args[7]);
3385 printf("return value is 0x%lx\n", ret);
3387 printf("*** %x exception occurred\n", fault_except);
3389 catch_memory_errors = 0;
3392 /* Input scanning routines */
3403 while( c == ' ' || c == '\t' )
3409 static const char *regnames[N_PTREGS] = {
3410 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3411 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3412 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3413 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3414 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3420 "trap", "dar", "dsisr", "res"
3424 scanhex(unsigned long *vp)
3431 /* parse register name */
3435 for (i = 0; i < sizeof(regname) - 1; ++i) {
3444 i = match_string(regnames, N_PTREGS, regname);
3446 printf("invalid register name '%%%s'\n", regname);
3449 if (xmon_regs == NULL) {
3450 printf("regs not available\n");
3453 *vp = ((unsigned long *)xmon_regs)[i];
3457 /* skip leading "0x" if any */
3471 } else if (c == '$') {
3473 for (i=0; i<63; i++) {
3475 if (isspace(c) || c == '\0') {
3483 if (setjmp(bus_error_jmp) == 0) {
3484 catch_memory_errors = 1;
3486 *vp = kallsyms_lookup_name(tmpstr);
3489 catch_memory_errors = 0;
3491 printf("unknown symbol '%s'\n", tmpstr);
3524 static int hexdigit(int c)
3526 if( '0' <= c && c <= '9' )
3528 if( 'A' <= c && c <= 'F' )
3529 return c - ('A' - 10);
3530 if( 'a' <= c && c <= 'f' )
3531 return c - ('a' - 10);
3536 getstring(char *s, int size)
3552 } while( c != ' ' && c != '\t' && c != '\n' );
3557 static char line[256];
3558 static char *lineptr;
3569 if (lineptr == NULL || *lineptr == 0) {
3570 if (xmon_gets(line, sizeof(line)) == NULL) {
3580 take_input(char *str)
3589 int type = inchar();
3590 unsigned long addr, cpu;
3591 void __percpu *ptr = NULL;
3592 static char tmp[64];
3597 xmon_print_symbol(addr, ": ", "\n");
3602 if (setjmp(bus_error_jmp) == 0) {
3603 catch_memory_errors = 1;
3605 addr = kallsyms_lookup_name(tmp);
3607 printf("%s: %lx\n", tmp, addr);
3609 printf("Symbol '%s' not found.\n", tmp);
3612 catch_memory_errors = 0;
3617 if (setjmp(bus_error_jmp) == 0) {
3618 catch_memory_errors = 1;
3620 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3625 ptr >= (void __percpu *)__per_cpu_start &&
3626 ptr < (void __percpu *)__per_cpu_end)
3628 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3629 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3631 cpu = raw_smp_processor_id();
3632 addr = (unsigned long)this_cpu_ptr(ptr);
3635 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3637 printf("Percpu symbol '%s' not found.\n", tmp);
3640 catch_memory_errors = 0;
3647 /* Print an address in numeric and symbolic form (if possible) */
3648 static void xmon_print_symbol(unsigned long address, const char *mid,
3652 const char *name = NULL;
3653 unsigned long offset, size;
3655 printf(REG, address);
3656 if (setjmp(bus_error_jmp) == 0) {
3657 catch_memory_errors = 1;
3659 name = kallsyms_lookup(address, &size, &offset, &modname,
3662 /* wait a little while to see if we get a machine check */
3666 catch_memory_errors = 0;
3669 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3671 printf(" [%s]", modname);
3673 printf("%s", after);
3676 #ifdef CONFIG_PPC_BOOK3S_64
3677 void dump_segments(void)
3680 unsigned long esid,vsid;
3683 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3685 for (i = 0; i < mmu_slb_size; i++) {
3686 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3687 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3692 printf("%02d %016lx %016lx", i, esid, vsid);
3694 if (!(esid & SLB_ESID_V)) {
3699 llp = vsid & SLB_VSID_LLP;
3700 if (vsid & SLB_VSID_B_1T) {
3701 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3703 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3706 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3708 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3715 #ifdef CONFIG_PPC_BOOK3S_32
3716 void dump_segments(void)
3721 for (i = 0; i < 16; ++i)
3722 printf(" %x", mfsr(i << 28));
3728 static void dump_tlb_44x(void)
3732 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3733 unsigned long w0,w1,w2;
3734 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3735 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3736 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3737 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3738 if (w0 & PPC44x_TLB_VALID) {
3739 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3740 w0 & PPC44x_TLB_EPN_MASK,
3741 w1 & PPC44x_TLB_ERPN_MASK,
3742 w1 & PPC44x_TLB_RPN_MASK,
3743 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3744 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3745 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3746 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3747 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3752 #endif /* CONFIG_44x */
3754 #ifdef CONFIG_PPC_BOOK3E
3755 static void dump_tlb_book3e(void)
3757 u32 mmucfg, pidmask, lpidmask;
3759 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3761 static const char *pgsz_names[] = {
3796 /* Gather some infos about the MMU */
3797 mmucfg = mfspr(SPRN_MMUCFG);
3798 mmu_version = (mmucfg & 3) + 1;
3799 ntlbs = ((mmucfg >> 2) & 3) + 1;
3800 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3801 lpidsz = (mmucfg >> 24) & 0xf;
3802 rasz = (mmucfg >> 16) & 0x7f;
3803 if ((mmu_version > 1) && (mmucfg & 0x10000))
3805 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3806 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3807 pidmask = (1ul << pidsz) - 1;
3808 lpidmask = (1ul << lpidsz) - 1;
3809 ramask = (1ull << rasz) - 1;
3811 for (tlb = 0; tlb < ntlbs; tlb++) {
3813 int nent, assoc, new_cc = 1;
3814 printf("TLB %d:\n------\n", tlb);
3817 tlbcfg = mfspr(SPRN_TLB0CFG);
3820 tlbcfg = mfspr(SPRN_TLB1CFG);
3823 tlbcfg = mfspr(SPRN_TLB2CFG);
3826 tlbcfg = mfspr(SPRN_TLB3CFG);
3829 printf("Unsupported TLB number !\n");
3832 nent = tlbcfg & 0xfff;
3833 assoc = (tlbcfg >> 24) & 0xff;
3834 for (i = 0; i < nent; i++) {
3835 u32 mas0 = MAS0_TLBSEL(tlb);
3836 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3839 int esel = i, cc = i;
3847 mas0 |= MAS0_ESEL(esel);
3848 mtspr(SPRN_MAS0, mas0);
3849 mtspr(SPRN_MAS1, mas1);
3850 mtspr(SPRN_MAS2, mas2);
3851 asm volatile("tlbre 0,0,0" : : : "memory");
3852 mas1 = mfspr(SPRN_MAS1);
3853 mas2 = mfspr(SPRN_MAS2);
3854 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3855 if (assoc && (i % assoc) == 0)
3857 if (!(mas1 & MAS1_VALID))
3860 printf("%04x- ", i);
3862 printf("%04x-%c", cc, 'A' + esel);
3864 printf(" |%c", 'A' + esel);
3866 printf(" %016llx %04x %s %c%c AS%c",
3868 (mas1 >> 16) & 0x3fff,
3869 pgsz_names[(mas1 >> 7) & 0x1f],
3870 mas1 & MAS1_IND ? 'I' : ' ',
3871 mas1 & MAS1_IPROT ? 'P' : ' ',
3872 mas1 & MAS1_TS ? '1' : '0');
3873 printf(" %c%c%c%c%c%c%c",
3874 mas2 & MAS2_X0 ? 'a' : ' ',
3875 mas2 & MAS2_X1 ? 'v' : ' ',
3876 mas2 & MAS2_W ? 'w' : ' ',
3877 mas2 & MAS2_I ? 'i' : ' ',
3878 mas2 & MAS2_M ? 'm' : ' ',
3879 mas2 & MAS2_G ? 'g' : ' ',
3880 mas2 & MAS2_E ? 'e' : ' ');
3881 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3882 if (mas1 & MAS1_IND)
3884 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3886 printf(" U%c%c%c S%c%c%c\n",
3887 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3888 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3889 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3890 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3891 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3892 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3896 #endif /* CONFIG_PPC_BOOK3E */
3898 static void xmon_init(int enable)
3902 __debugger_ipi = xmon_ipi;
3903 __debugger_bpt = xmon_bpt;
3904 __debugger_sstep = xmon_sstep;
3905 __debugger_iabr_match = xmon_iabr_match;
3906 __debugger_break_match = xmon_break_match;
3907 __debugger_fault_handler = xmon_fault_handler;
3909 #ifdef CONFIG_PPC_PSERIES
3911 * Get the token here to avoid trying to get a lock
3912 * during the crash, causing a deadlock.
3914 set_indicator_token = rtas_token("set-indicator");
3918 __debugger_ipi = NULL;
3919 __debugger_bpt = NULL;
3920 __debugger_sstep = NULL;
3921 __debugger_iabr_match = NULL;
3922 __debugger_break_match = NULL;
3923 __debugger_fault_handler = NULL;
3927 #ifdef CONFIG_MAGIC_SYSRQ
3928 static void sysrq_handle_xmon(int key)
3930 if (xmon_is_locked_down()) {
3935 /* ensure xmon is enabled */
3937 debugger(get_irq_regs());
3942 static const struct sysrq_key_op sysrq_xmon_op = {
3943 .handler = sysrq_handle_xmon,
3944 .help_msg = "xmon(x)",
3945 .action_msg = "Entering xmon",
3948 static int __init setup_xmon_sysrq(void)
3950 register_sysrq_key('x', &sysrq_xmon_op);
3953 device_initcall(setup_xmon_sysrq);
3954 #endif /* CONFIG_MAGIC_SYSRQ */
3956 static void clear_all_bpt(void)
3960 /* clear/unpatch all breakpoints */
3964 /* Disable all breakpoints */
3965 for (i = 0; i < NBPTS; ++i)
3966 bpts[i].enabled = 0;
3968 /* Clear any data or iabr breakpoints */
3970 for (i = 0; i < nr_wp_slots(); i++)
3971 dabr[i].enabled = 0;
3974 #ifdef CONFIG_DEBUG_FS
3975 static int xmon_dbgfs_set(void *data, u64 val)
3980 /* make sure all breakpoints removed when disabling */
3984 printf("xmon: All breakpoints cleared\n");
3985 release_output_lock();
3991 static int xmon_dbgfs_get(void *data, u64 *val)
3997 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3998 xmon_dbgfs_set, "%llu\n");
4000 static int __init setup_xmon_dbgfs(void)
4002 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
4006 device_initcall(setup_xmon_dbgfs);
4007 #endif /* CONFIG_DEBUG_FS */
4009 static int xmon_early __initdata;
4011 static int __init early_parse_xmon(char *p)
4013 if (xmon_is_locked_down()) {
4017 } else if (!p || strncmp(p, "early", 5) == 0) {
4018 /* just "xmon" is equivalent to "xmon=early" */
4022 } else if (strncmp(p, "on", 2) == 0) {
4025 } else if (strncmp(p, "rw", 2) == 0) {
4029 } else if (strncmp(p, "ro", 2) == 0) {
4033 } else if (strncmp(p, "off", 3) == 0)
4040 early_param("xmon", early_parse_xmon);
4042 void __init xmon_setup(void)
4050 #ifdef CONFIG_SPU_BASE
4054 u64 saved_mfc_sr1_RW;
4055 u32 saved_spu_runcntl_RW;
4056 unsigned long dump_addr;
4060 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4062 static struct spu_info spu_info[XMON_NUM_SPUS];
4064 void xmon_register_spus(struct list_head *list)
4068 list_for_each_entry(spu, list, full_list) {
4069 if (spu->number >= XMON_NUM_SPUS) {
4074 spu_info[spu->number].spu = spu;
4075 spu_info[spu->number].stopped_ok = 0;
4076 spu_info[spu->number].dump_addr = (unsigned long)
4077 spu_info[spu->number].spu->local_store;
4081 static void stop_spus(void)
4087 for (i = 0; i < XMON_NUM_SPUS; i++) {
4088 if (!spu_info[i].spu)
4091 if (setjmp(bus_error_jmp) == 0) {
4092 catch_memory_errors = 1;
4095 spu = spu_info[i].spu;
4097 spu_info[i].saved_spu_runcntl_RW =
4098 in_be32(&spu->problem->spu_runcntl_RW);
4100 tmp = spu_mfc_sr1_get(spu);
4101 spu_info[i].saved_mfc_sr1_RW = tmp;
4103 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4104 spu_mfc_sr1_set(spu, tmp);
4109 spu_info[i].stopped_ok = 1;
4111 printf("Stopped spu %.2d (was %s)\n", i,
4112 spu_info[i].saved_spu_runcntl_RW ?
4113 "running" : "stopped");
4115 catch_memory_errors = 0;
4116 printf("*** Error stopping spu %.2d\n", i);
4118 catch_memory_errors = 0;
4122 static void restart_spus(void)
4127 for (i = 0; i < XMON_NUM_SPUS; i++) {
4128 if (!spu_info[i].spu)
4131 if (!spu_info[i].stopped_ok) {
4132 printf("*** Error, spu %d was not successfully stopped"
4133 ", not restarting\n", i);
4137 if (setjmp(bus_error_jmp) == 0) {
4138 catch_memory_errors = 1;
4141 spu = spu_info[i].spu;
4142 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4143 out_be32(&spu->problem->spu_runcntl_RW,
4144 spu_info[i].saved_spu_runcntl_RW);
4149 printf("Restarted spu %.2d\n", i);
4151 catch_memory_errors = 0;
4152 printf("*** Error restarting spu %.2d\n", i);
4154 catch_memory_errors = 0;
4158 #define DUMP_WIDTH 23
4159 #define DUMP_VALUE(format, field, value) \
4161 if (setjmp(bus_error_jmp) == 0) { \
4162 catch_memory_errors = 1; \
4164 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4169 catch_memory_errors = 0; \
4170 printf(" %-*s = *** Error reading field.\n", \
4171 DUMP_WIDTH, #field); \
4173 catch_memory_errors = 0; \
4176 #define DUMP_FIELD(obj, format, field) \
4177 DUMP_VALUE(format, field, obj->field)
4179 static void dump_spu_fields(struct spu *spu)
4181 printf("Dumping spu fields at address %p:\n", spu);
4183 DUMP_FIELD(spu, "0x%x", number);
4184 DUMP_FIELD(spu, "%s", name);
4185 DUMP_FIELD(spu, "0x%lx", local_store_phys);
4186 DUMP_FIELD(spu, "0x%p", local_store);
4187 DUMP_FIELD(spu, "0x%lx", ls_size);
4188 DUMP_FIELD(spu, "0x%x", node);
4189 DUMP_FIELD(spu, "0x%lx", flags);
4190 DUMP_FIELD(spu, "%llu", class_0_pending);
4191 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4192 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4193 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4194 DUMP_FIELD(spu, "0x%x", irqs[0]);
4195 DUMP_FIELD(spu, "0x%x", irqs[1]);
4196 DUMP_FIELD(spu, "0x%x", irqs[2]);
4197 DUMP_FIELD(spu, "0x%x", slb_replace);
4198 DUMP_FIELD(spu, "%d", pid);
4199 DUMP_FIELD(spu, "0x%p", mm);
4200 DUMP_FIELD(spu, "0x%p", ctx);
4201 DUMP_FIELD(spu, "0x%p", rq);
4202 DUMP_FIELD(spu, "0x%llx", timestamp);
4203 DUMP_FIELD(spu, "0x%lx", problem_phys);
4204 DUMP_FIELD(spu, "0x%p", problem);
4205 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4206 in_be32(&spu->problem->spu_runcntl_RW));
4207 DUMP_VALUE("0x%x", problem->spu_status_R,
4208 in_be32(&spu->problem->spu_status_R));
4209 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4210 in_be32(&spu->problem->spu_npc_RW));
4211 DUMP_FIELD(spu, "0x%p", priv2);
4212 DUMP_FIELD(spu, "0x%p", pdata);
4216 spu_inst_dump(unsigned long adr, long count, int praddr)
4218 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4221 static void dump_spu_ls(unsigned long num, int subcmd)
4223 unsigned long offset, addr, ls_addr;
4225 if (setjmp(bus_error_jmp) == 0) {
4226 catch_memory_errors = 1;
4228 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4232 catch_memory_errors = 0;
4233 printf("*** Error: accessing spu info for spu %ld\n", num);
4236 catch_memory_errors = 0;
4238 if (scanhex(&offset))
4239 addr = ls_addr + offset;
4241 addr = spu_info[num].dump_addr;
4243 if (addr >= ls_addr + LS_SIZE) {
4244 printf("*** Error: address outside of local store\n");
4250 addr += spu_inst_dump(addr, 16, 1);
4260 spu_info[num].dump_addr = addr;
4263 static int do_spu_cmd(void)
4265 static unsigned long num = 0;
4266 int cmd, subcmd = 0;
4278 if (isxdigit(subcmd) || subcmd == '\n')
4283 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4284 printf("*** Error: invalid spu number\n");
4290 dump_spu_fields(spu_info[num].spu);
4293 dump_spu_ls(num, subcmd);
4304 #else /* ! CONFIG_SPU_BASE */
4305 static int do_spu_cmd(void)