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;
1596 case 0x3000: ret = "(System Call Vectored)"; break;
1602 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1603 unsigned long *endp)
1605 unsigned long size, offset;
1608 *startp = *endp = 0;
1611 if (setjmp(bus_error_jmp) == 0) {
1612 catch_memory_errors = 1;
1614 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1616 *startp = pc - offset;
1617 *endp = pc - offset + size;
1621 catch_memory_errors = 0;
1624 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1625 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1627 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1630 int max_to_print = 64;
1632 unsigned long newsp;
1633 unsigned long marker;
1634 struct pt_regs regs;
1636 while (max_to_print--) {
1637 if (!is_kernel_addr(sp)) {
1639 printf("SP (%lx) is in userspace\n", sp);
1643 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1644 || !mread(sp, &newsp, sizeof(unsigned long))) {
1645 printf("Couldn't read stack frame at %lx\n", sp);
1650 * For the first stack frame, try to work out if
1651 * LR and/or the saved LR value in the bottommost
1652 * stack frame are valid.
1654 if ((pc | lr) != 0) {
1655 unsigned long fnstart, fnend;
1656 unsigned long nextip;
1659 get_function_bounds(pc, &fnstart, &fnend);
1662 mread(newsp + LRSAVE_OFFSET, &nextip,
1663 sizeof(unsigned long));
1665 if (!is_kernel_addr(lr)
1666 || (fnstart <= lr && lr < fnend))
1668 } else if (lr == nextip) {
1670 } else if (is_kernel_addr(lr)
1671 && !(fnstart <= lr && lr < fnend)) {
1672 printf("[link register ] ");
1673 xmon_print_symbol(lr, " ", "\n");
1676 printf("["REG"] ", sp);
1677 xmon_print_symbol(ip, " ", " (unreliable)\n");
1682 printf("["REG"] ", sp);
1683 xmon_print_symbol(ip, " ", "\n");
1686 /* Look for "regshere" marker to see if this is
1687 an exception frame. */
1688 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1689 && marker == STACK_FRAME_REGS_MARKER) {
1690 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1692 printf("Couldn't read registers at %lx\n",
1693 sp + STACK_FRAME_OVERHEAD);
1696 printf("--- Exception: %lx %s at ", regs.trap,
1697 getvecname(TRAP(®s)));
1700 xmon_print_symbol(pc, " ", "\n");
1710 static void backtrace(struct pt_regs *excp)
1715 xmon_show_stack(sp, 0, 0);
1717 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1721 static void print_bug_trap(struct pt_regs *regs)
1724 const struct bug_entry *bug;
1727 if (regs->msr & MSR_PR)
1728 return; /* not in kernel */
1729 addr = regs->nip; /* address of trap instruction */
1730 if (!is_kernel_addr(addr))
1732 bug = find_bug(regs->nip);
1735 if (is_warning_bug(bug))
1738 #ifdef CONFIG_DEBUG_BUGVERBOSE
1739 printf("kernel BUG at %s:%u!\n",
1740 bug->file, bug->line);
1742 printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1744 #endif /* CONFIG_BUG */
1747 static void excprint(struct pt_regs *fp)
1752 printf("cpu 0x%x: ", smp_processor_id());
1753 #endif /* CONFIG_SMP */
1756 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1758 xmon_print_symbol(fp->nip, ": ", "\n");
1761 xmon_print_symbol(fp->link, ": ", "\n");
1763 printf(" sp: %lx\n", fp->gpr[1]);
1764 printf(" msr: %lx\n", fp->msr);
1766 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1767 printf(" dar: %lx\n", fp->dar);
1769 printf(" dsisr: %lx\n", fp->dsisr);
1772 printf(" current = 0x%px\n", current);
1774 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1775 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1778 printf(" pid = %d, comm = %s\n",
1779 current->pid, current->comm);
1785 printf(linux_banner);
1788 static void prregs(struct pt_regs *fp)
1792 struct pt_regs regs;
1794 if (scanhex(&base)) {
1795 if (setjmp(bus_error_jmp) == 0) {
1796 catch_memory_errors = 1;
1798 regs = *(struct pt_regs *)base;
1802 catch_memory_errors = 0;
1803 printf("*** Error reading registers from "REG"\n",
1807 catch_memory_errors = 0;
1812 if (FULL_REGS(fp)) {
1813 for (n = 0; n < 16; ++n)
1814 printf("R%.2d = "REG" R%.2d = "REG"\n",
1815 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1817 for (n = 0; n < 7; ++n)
1818 printf("R%.2d = "REG" R%.2d = "REG"\n",
1819 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1822 for (n = 0; n < 32; ++n) {
1823 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1824 (n & 3) == 3? "\n": " ");
1825 if (n == 12 && !FULL_REGS(fp)) {
1832 xmon_print_symbol(fp->nip, " ", "\n");
1833 if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1835 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1838 xmon_print_symbol(fp->link, " ", "\n");
1839 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1840 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1841 fp->ctr, fp->xer, fp->trap);
1843 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1844 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1847 static void cacheflush(void)
1850 unsigned long nflush;
1855 scanhex((void *)&adrs);
1860 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1861 if (setjmp(bus_error_jmp) == 0) {
1862 catch_memory_errors = 1;
1866 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1867 cflush((void *) adrs);
1869 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1870 cinval((void *) adrs);
1873 /* wait a little while to see if we get a machine check */
1876 catch_memory_errors = 0;
1879 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1880 extern void xmon_mtspr(int spr, unsigned long value);
1883 read_spr(int n, unsigned long *vp)
1885 unsigned long ret = -1UL;
1888 if (setjmp(bus_error_jmp) == 0) {
1889 catch_spr_faults = 1;
1892 ret = xmon_mfspr(n, *vp);
1898 catch_spr_faults = 0;
1904 write_spr(int n, unsigned long val)
1907 printf(xmon_ro_msg);
1911 if (setjmp(bus_error_jmp) == 0) {
1912 catch_spr_faults = 1;
1919 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1921 catch_spr_faults = 0;
1924 static void dump_206_sprs(void)
1927 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1930 /* Actually some of these pre-date 2.06, but whatevs */
1932 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1933 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1934 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1935 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1936 printf("amr = %.16lx uamor = %.16lx\n",
1937 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1939 if (!(mfmsr() & MSR_HV))
1942 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1943 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1944 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1945 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1946 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1947 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1948 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1949 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1950 printf("dabr = %.16lx dabrx = %.16lx\n",
1951 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1955 static void dump_207_sprs(void)
1960 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1963 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1964 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1966 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1967 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1971 /* Only if TM has been enabled in the kernel */
1972 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1973 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1974 mfspr(SPRN_TEXASR));
1977 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1978 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1979 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1980 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1981 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1982 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1983 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1984 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1985 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1986 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1987 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1988 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1990 if (!(msr & MSR_HV))
1993 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1994 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1995 printf("dawr0 = %.16lx dawrx0 = %.16lx\n",
1996 mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0));
1997 if (nr_wp_slots() > 1) {
1998 printf("dawr1 = %.16lx dawrx1 = %.16lx\n",
1999 mfspr(SPRN_DAWR1), mfspr(SPRN_DAWRX1));
2001 printf("ciabr = %.16lx\n", mfspr(SPRN_CIABR));
2005 static void dump_300_sprs(void)
2008 bool hv = mfmsr() & MSR_HV;
2010 if (!cpu_has_feature(CPU_FTR_ARCH_300))
2013 printf("pidr = %.16lx tidr = %.16lx\n",
2014 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
2015 printf("psscr = %.16lx\n",
2016 hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
2021 printf("ptcr = %.16lx asdr = %.16lx\n",
2022 mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
2026 static void dump_one_spr(int spr, bool show_unimplemented)
2031 if (!read_spr(spr, &val)) {
2032 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2036 if (val == 0xdeadbeef) {
2037 /* Looks like read was a nop, confirm */
2039 if (!read_spr(spr, &val)) {
2040 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2044 if (val == 0x0badcafe) {
2045 if (show_unimplemented)
2046 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2051 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2054 static void super_regs(void)
2056 static unsigned long regno;
2064 unsigned long sp, toc;
2065 asm("mr %0,1" : "=r" (sp) :);
2066 asm("mr %0,2" : "=r" (toc) :);
2068 printf("msr = "REG" sprg0 = "REG"\n",
2069 mfmsr(), mfspr(SPRN_SPRG0));
2070 printf("pvr = "REG" sprg1 = "REG"\n",
2071 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2072 printf("dec = "REG" sprg2 = "REG"\n",
2073 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2074 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2075 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
2087 read_spr(regno, &val);
2089 write_spr(regno, val);
2090 dump_one_spr(regno, true);
2095 dump_one_spr(regno, true);
2099 for (spr = 1; spr < 1024; ++spr)
2100 dump_one_spr(spr, false);
2108 * Stuff for reading and writing memory safely
2111 mread(unsigned long adrs, void *buf, int size)
2117 if (setjmp(bus_error_jmp) == 0) {
2118 catch_memory_errors = 1;
2124 *(u16 *)q = *(u16 *)p;
2127 *(u32 *)q = *(u32 *)p;
2130 *(u64 *)q = *(u64 *)p;
2133 for( ; n < size; ++n) {
2139 /* wait a little while to see if we get a machine check */
2143 catch_memory_errors = 0;
2148 mwrite(unsigned long adrs, void *buf, int size)
2156 printf(xmon_ro_msg);
2160 if (setjmp(bus_error_jmp) == 0) {
2161 catch_memory_errors = 1;
2167 *(u16 *)p = *(u16 *)q;
2170 *(u32 *)p = *(u32 *)q;
2173 *(u64 *)p = *(u64 *)q;
2176 for ( ; n < size; ++n) {
2182 /* wait a little while to see if we get a machine check */
2186 printf("*** Error writing address "REG"\n", adrs + n);
2188 catch_memory_errors = 0;
2193 mread_instr(unsigned long adrs, struct ppc_inst *instr)
2198 if (setjmp(bus_error_jmp) == 0) {
2199 catch_memory_errors = 1;
2201 *instr = ppc_inst_read((struct ppc_inst *)adrs);
2203 /* wait a little while to see if we get a machine check */
2205 n = ppc_inst_len(*instr);
2207 catch_memory_errors = 0;
2211 static int fault_type;
2212 static int fault_except;
2213 static char *fault_chars[] = { "--", "**", "##" };
2215 static int handle_fault(struct pt_regs *regs)
2217 fault_except = TRAP(regs);
2218 switch (TRAP(regs)) {
2230 longjmp(bus_error_jmp, 1);
2235 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2238 byterev(unsigned char *val, int size)
2244 SWAP(val[0], val[1], t);
2247 SWAP(val[0], val[3], t);
2248 SWAP(val[1], val[2], t);
2250 case 8: /* is there really any use for this? */
2251 SWAP(val[0], val[7], t);
2252 SWAP(val[1], val[6], t);
2253 SWAP(val[2], val[5], t);
2254 SWAP(val[3], val[4], t);
2262 static char *memex_help_string =
2263 "Memory examine command usage:\n"
2264 "m [addr] [flags] examine/change memory\n"
2265 " addr is optional. will start where left off.\n"
2266 " flags may include chars from this set:\n"
2267 " b modify by bytes (default)\n"
2268 " w modify by words (2 byte)\n"
2269 " l modify by longs (4 byte)\n"
2270 " d modify by doubleword (8 byte)\n"
2271 " r toggle reverse byte order mode\n"
2272 " n do not read memory (for i/o spaces)\n"
2273 " . ok to read (default)\n"
2274 "NOTE: flags are saved as defaults\n"
2277 static char *memex_subcmd_help_string =
2278 "Memory examine subcommands:\n"
2279 " hexval write this val to current location\n"
2280 " 'string' write chars from string to this location\n"
2281 " ' increment address\n"
2282 " ^ decrement address\n"
2283 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2284 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2285 " ` clear no-read flag\n"
2286 " ; stay at this addr\n"
2287 " v change to byte mode\n"
2288 " w change to word (2 byte) mode\n"
2289 " l change to long (4 byte) mode\n"
2290 " u change to doubleword (8 byte) mode\n"
2291 " m addr change current addr\n"
2292 " n toggle no-read flag\n"
2293 " r toggle byte reverse flag\n"
2294 " < count back up count bytes\n"
2295 " > count skip forward count bytes\n"
2296 " x exit this mode\n"
2302 int cmd, inc, i, nslash;
2304 unsigned char val[16];
2306 scanhex((void *)&adrs);
2309 printf(memex_help_string);
2315 while ((cmd = skipbl()) != '\n') {
2317 case 'b': size = 1; break;
2318 case 'w': size = 2; break;
2319 case 'l': size = 4; break;
2320 case 'd': size = 8; break;
2321 case 'r': brev = !brev; break;
2322 case 'n': mnoread = 1; break;
2323 case '.': mnoread = 0; break;
2332 n = mread(adrs, val, size);
2333 printf(REG"%c", adrs, brev? 'r': ' ');
2338 for (i = 0; i < n; ++i)
2339 printf("%.2x", val[i]);
2340 for (; i < size; ++i)
2341 printf("%s", fault_chars[fault_type]);
2348 for (i = 0; i < size; ++i)
2349 val[i] = n >> (i * 8);
2352 mwrite(adrs, val, size);
2365 else if( n == '\'' )
2367 for (i = 0; i < size; ++i)
2368 val[i] = n >> (i * 8);
2371 mwrite(adrs, val, size);
2407 adrs -= 1 << nslash;
2411 adrs += 1 << nslash;
2415 adrs += 1 << -nslash;
2419 adrs -= 1 << -nslash;
2422 scanhex((void *)&adrs);
2441 printf(memex_subcmd_help_string);
2456 case 'n': c = '\n'; break;
2457 case 'r': c = '\r'; break;
2458 case 'b': c = '\b'; break;
2459 case 't': c = '\t'; break;
2464 static void xmon_rawdump (unsigned long adrs, long ndump)
2467 unsigned char temp[16];
2469 for (n = ndump; n > 0;) {
2471 nr = mread(adrs, temp, r);
2473 for (m = 0; m < r; ++m) {
2475 printf("%.2x", temp[m]);
2477 printf("%s", fault_chars[fault_type]);
2486 static void dump_tracing(void)
2492 ftrace_dump(DUMP_ORIG);
2494 ftrace_dump(DUMP_ALL);
2498 static void dump_one_paca(int cpu)
2500 struct paca_struct *p;
2501 #ifdef CONFIG_PPC_BOOK3S_64
2505 if (setjmp(bus_error_jmp) != 0) {
2506 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2510 catch_memory_errors = 1;
2515 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2517 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2518 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2519 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2521 #define DUMP(paca, name, format) \
2522 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2523 offsetof(struct paca_struct, name));
2525 DUMP(p, lock_token, "%#-*x");
2526 DUMP(p, paca_index, "%#-*x");
2527 DUMP(p, kernel_toc, "%#-*llx");
2528 DUMP(p, kernelbase, "%#-*llx");
2529 DUMP(p, kernel_msr, "%#-*llx");
2530 DUMP(p, emergency_sp, "%-*px");
2531 #ifdef CONFIG_PPC_BOOK3S_64
2532 DUMP(p, nmi_emergency_sp, "%-*px");
2533 DUMP(p, mc_emergency_sp, "%-*px");
2534 DUMP(p, in_nmi, "%#-*x");
2535 DUMP(p, in_mce, "%#-*x");
2536 DUMP(p, hmi_event_available, "%#-*x");
2538 DUMP(p, data_offset, "%#-*llx");
2539 DUMP(p, hw_cpu_id, "%#-*x");
2540 DUMP(p, cpu_start, "%#-*x");
2541 DUMP(p, kexec_state, "%#-*x");
2542 #ifdef CONFIG_PPC_BOOK3S_64
2543 if (!early_radix_enabled()) {
2544 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2547 if (!p->slb_shadow_ptr)
2550 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2551 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2554 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2555 22, "slb_shadow", i, esid, vsid);
2558 DUMP(p, vmalloc_sllp, "%#-*x");
2559 DUMP(p, stab_rr, "%#-*x");
2560 DUMP(p, slb_used_bitmap, "%#-*x");
2561 DUMP(p, slb_kern_bitmap, "%#-*x");
2563 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2564 DUMP(p, slb_cache_ptr, "%#-*x");
2565 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2566 printf(" %-*s[%d] = 0x%016x\n",
2567 22, "slb_cache", i, p->slb_cache[i]);
2571 DUMP(p, rfi_flush_fallback_area, "%-*px");
2573 DUMP(p, dscr_default, "%#-*llx");
2574 #ifdef CONFIG_PPC_BOOK3E
2575 DUMP(p, pgd, "%-*px");
2576 DUMP(p, kernel_pgd, "%-*px");
2577 DUMP(p, tcd_ptr, "%-*px");
2578 DUMP(p, mc_kstack, "%-*px");
2579 DUMP(p, crit_kstack, "%-*px");
2580 DUMP(p, dbg_kstack, "%-*px");
2582 DUMP(p, __current, "%-*px");
2583 DUMP(p, kstack, "%#-*llx");
2584 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2585 #ifdef CONFIG_STACKPROTECTOR
2586 DUMP(p, canary, "%#-*lx");
2588 DUMP(p, saved_r1, "%#-*llx");
2589 #ifdef CONFIG_PPC_BOOK3E
2590 DUMP(p, trap_save, "%#-*x");
2592 DUMP(p, irq_soft_mask, "%#-*x");
2593 DUMP(p, irq_happened, "%#-*x");
2594 #ifdef CONFIG_MMIOWB
2595 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2596 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2598 DUMP(p, irq_work_pending, "%#-*x");
2599 DUMP(p, sprg_vdso, "%#-*llx");
2601 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2602 DUMP(p, tm_scratch, "%#-*llx");
2605 #ifdef CONFIG_PPC_POWERNV
2606 DUMP(p, idle_state, "%#-*lx");
2607 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2608 DUMP(p, thread_idle_state, "%#-*x");
2609 DUMP(p, subcore_sibling_mask, "%#-*x");
2611 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2612 DUMP(p, requested_psscr, "%#-*llx");
2613 DUMP(p, dont_stop.counter, "%#-*x");
2618 DUMP(p, accounting.utime, "%#-*lx");
2619 DUMP(p, accounting.stime, "%#-*lx");
2620 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2621 DUMP(p, accounting.utime_scaled, "%#-*lx");
2623 DUMP(p, accounting.starttime, "%#-*lx");
2624 DUMP(p, accounting.starttime_user, "%#-*lx");
2625 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2626 DUMP(p, accounting.startspurr, "%#-*lx");
2627 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2629 DUMP(p, accounting.steal_time, "%#-*lx");
2632 catch_memory_errors = 0;
2636 static void dump_all_pacas(void)
2640 if (num_possible_cpus() == 0) {
2641 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2645 for_each_possible_cpu(cpu)
2649 static void dump_pacas(void)
2660 termch = c; /* Put c back, it wasn't 'a' */
2665 dump_one_paca(xmon_owner);
2669 #ifdef CONFIG_PPC_POWERNV
2670 static void dump_one_xive(int cpu)
2672 unsigned int hwid = get_hard_smp_processor_id(cpu);
2673 bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2676 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2677 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2678 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2679 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2680 opal_xive_dump(XIVE_DUMP_VP, hwid);
2681 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2684 if (setjmp(bus_error_jmp) != 0) {
2685 catch_memory_errors = 0;
2686 printf("*** Error dumping xive on cpu %d\n", cpu);
2690 catch_memory_errors = 1;
2692 xmon_xive_do_dump(cpu);
2695 catch_memory_errors = 0;
2698 static void dump_all_xives(void)
2702 if (num_possible_cpus() == 0) {
2703 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2707 for_each_possible_cpu(cpu)
2711 static void dump_one_xive_irq(u32 num, struct irq_data *d)
2713 xmon_xive_get_irq_config(num, d);
2716 static void dump_all_xive_irq(void)
2719 struct irq_desc *desc;
2721 for_each_irq_desc(i, desc) {
2722 struct irq_data *d = irq_desc_get_irq_data(desc);
2728 hwirq = (unsigned int)irqd_to_hwirq(d);
2729 /* IPIs are special (HW number 0) */
2731 dump_one_xive_irq(hwirq, d);
2735 static void dump_xives(void)
2740 if (!xive_enabled()) {
2741 printf("Xive disabled on this system\n");
2749 } else if (c == 'i') {
2751 dump_one_xive_irq(num, NULL);
2753 dump_all_xive_irq();
2757 termch = c; /* Put c back, it wasn't 'a' */
2762 dump_one_xive(xmon_owner);
2764 #endif /* CONFIG_PPC_POWERNV */
2766 static void dump_by_size(unsigned long addr, long count, int size)
2768 unsigned char temp[16];
2772 count = ALIGN(count, 16);
2774 for (i = 0; i < count; i += 16, addr += 16) {
2777 if (mread(addr, temp, 16) != 16) {
2778 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2782 for (j = 0; j < 16; j += size) {
2785 case 1: val = temp[j]; break;
2786 case 2: val = *(u16 *)&temp[j]; break;
2787 case 4: val = *(u32 *)&temp[j]; break;
2788 case 8: val = *(u64 *)&temp[j]; break;
2792 printf("%0*llx", size * 2, val);
2795 for (j = 0; j < 16; ++j) {
2797 putchar(' ' <= val && val <= '~' ? val : '.');
2806 static char last[] = { "d?\n" };
2813 xmon_start_pagination();
2815 xmon_end_pagination();
2819 #ifdef CONFIG_PPC_POWERNV
2821 xmon_start_pagination();
2823 xmon_end_pagination();
2836 scanhex((void *)&adrs);
2843 else if (nidump > MAX_IDUMP)
2845 adrs += ppc_inst_dump(adrs, nidump, 1);
2847 } else if (c == 'l') {
2849 } else if (c == 'o') {
2851 } else if (c == 'v') {
2852 /* dump virtual to physical translation */
2854 } else if (c == 'r') {
2858 xmon_rawdump(adrs, ndump);
2865 else if (ndump > MAX_DUMP)
2873 ndump = ALIGN(ndump, 16);
2874 dump_by_size(adrs, ndump, c - '0');
2879 prdump(adrs, ndump);
2888 prdump(unsigned long adrs, long ndump)
2890 long n, m, c, r, nr;
2891 unsigned char temp[16];
2893 for (n = ndump; n > 0;) {
2897 nr = mread(adrs, temp, r);
2899 for (m = 0; m < r; ++m) {
2900 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2903 printf("%.2x", temp[m]);
2905 printf("%s", fault_chars[fault_type]);
2907 for (; m < 16; ++m) {
2908 if ((m & (sizeof(long) - 1)) == 0)
2913 for (m = 0; m < r; ++m) {
2916 putchar(' ' <= c && c <= '~'? c: '.');
2929 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2932 generic_inst_dump(unsigned long adr, long count, int praddr,
2933 instruction_dump_func dump_func)
2936 unsigned long first_adr;
2937 struct ppc_inst inst, last_inst = ppc_inst(0);
2938 unsigned char val[4];
2941 for (first_adr = adr; count > 0; --count, adr += 4) {
2942 nr = mread(adr, val, 4);
2945 const char *x = fault_chars[fault_type];
2946 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2950 inst = ppc_inst(GETWORD(val));
2951 if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
2961 printf(REG" %.8x", adr, ppc_inst_val(inst));
2963 dump_func(ppc_inst_val(inst), adr);
2966 return adr - first_adr;
2970 ppc_inst_dump(unsigned long adr, long count, int praddr)
2972 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2976 print_address(unsigned long addr)
2978 xmon_print_symbol(addr, "\t# ", "");
2984 struct kmsg_dumper dumper = { .active = 1 };
2985 unsigned char buf[128];
2988 if (setjmp(bus_error_jmp) != 0) {
2989 printf("Error dumping printk buffer!\n");
2993 catch_memory_errors = 1;
2996 kmsg_dump_rewind_nolock(&dumper);
2997 xmon_start_pagination();
2998 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
3002 xmon_end_pagination();
3005 /* wait a little while to see if we get a machine check */
3007 catch_memory_errors = 0;
3010 #ifdef CONFIG_PPC_POWERNV
3011 static void dump_opal_msglog(void)
3013 unsigned char buf[128];
3017 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
3018 printf("Machine is not running OPAL firmware.\n");
3022 if (setjmp(bus_error_jmp) != 0) {
3023 printf("Error dumping OPAL msglog!\n");
3027 catch_memory_errors = 1;
3030 xmon_start_pagination();
3031 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
3033 printf("Error dumping OPAL msglog! Error: %zd\n", res);
3040 xmon_end_pagination();
3043 /* wait a little while to see if we get a machine check */
3045 catch_memory_errors = 0;
3050 * Memory operations - move, set, print differences
3052 static unsigned long mdest; /* destination address */
3053 static unsigned long msrc; /* source address */
3054 static unsigned long mval; /* byte value to set memory to */
3055 static unsigned long mcount; /* # bytes to affect */
3056 static unsigned long mdiffs; /* max # differences to print */
3061 scanhex((void *)&mdest);
3062 if( termch != '\n' )
3064 scanhex((void *)(cmd == 's'? &mval: &msrc));
3065 if( termch != '\n' )
3067 scanhex((void *)&mcount);
3071 printf(xmon_ro_msg);
3074 memmove((void *)mdest, (void *)msrc, mcount);
3078 printf(xmon_ro_msg);
3081 memset((void *)mdest, mval, mcount);
3084 if( termch != '\n' )
3086 scanhex((void *)&mdiffs);
3087 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3093 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3098 for( n = nb; n > 0; --n )
3099 if( *p1++ != *p2++ )
3100 if( ++prt <= maxpr )
3101 printf("%px %.2x # %px %.2x\n", p1 - 1,
3102 p1[-1], p2 - 1, p2[-1]);
3104 printf("Total of %d differences\n", prt);
3107 static unsigned mend;
3108 static unsigned mask;
3114 unsigned char val[4];
3117 scanhex((void *)&mdest);
3118 if (termch != '\n') {
3120 scanhex((void *)&mend);
3121 if (termch != '\n') {
3123 scanhex((void *)&mval);
3125 if (termch != '\n') termch = 0;
3126 scanhex((void *)&mask);
3130 for (a = mdest; a < mend; a += 4) {
3131 if (mread(a, val, 4) == 4
3132 && ((GETWORD(val) ^ mval) & mask) == 0) {
3133 printf("%.16x: %.16x\n", a, GETWORD(val));
3140 static unsigned long mskip = 0x1000;
3141 static unsigned long mlim = 0xffffffff;
3151 if (termch != '\n') termch = 0;
3153 if (termch != '\n') termch = 0;
3156 for (a = mdest; a < mlim; a += mskip) {
3157 ok = mread(a, &v, 1);
3159 printf("%.8x .. ", a);
3160 } else if (!ok && ook)
3161 printf("%.8lx\n", a - mskip);
3167 printf("%.8lx\n", a - mskip);
3170 static void show_task(struct task_struct *tsk)
3175 * Cloned from kdb_task_state_char(), which is not entirely
3176 * appropriate for calling from xmon. This could be moved
3177 * to a common, generic, routine used by both.
3179 state = (tsk->state == 0) ? 'R' :
3180 (tsk->state < 0) ? 'U' :
3181 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3182 (tsk->state & TASK_STOPPED) ? 'T' :
3183 (tsk->state & TASK_TRACED) ? 'C' :
3184 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3185 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3186 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3188 printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk,
3189 tsk->thread.ksp, tsk->thread.regs,
3190 tsk->pid, rcu_dereference(tsk->parent)->pid,
3191 state, task_cpu(tsk),
3195 #ifdef CONFIG_PPC_BOOK3S_64
3196 static void format_pte(void *ptep, unsigned long pte)
3198 pte_t entry = __pte(pte);
3200 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3201 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3203 printf("Flags = %s%s%s%s%s\n",
3204 pte_young(entry) ? "Accessed " : "",
3205 pte_dirty(entry) ? "Dirty " : "",
3206 pte_read(entry) ? "Read " : "",
3207 pte_write(entry) ? "Write " : "",
3208 pte_exec(entry) ? "Exec " : "");
3211 static void show_pte(unsigned long addr)
3213 unsigned long tskv = 0;
3214 struct task_struct *tsk = NULL;
3215 struct mm_struct *mm;
3222 if (!scanhex(&tskv))
3225 tsk = (struct task_struct *)tskv;
3230 mm = tsk->active_mm;
3232 if (setjmp(bus_error_jmp) != 0) {
3233 catch_memory_errors = 0;
3234 printf("*** Error dumping pte for task %px\n", tsk);
3238 catch_memory_errors = 1;
3242 pgdp = pgd_offset_k(addr);
3244 pgdp = pgd_offset(mm, addr);
3246 p4dp = p4d_offset(pgdp, addr);
3248 if (p4d_none(*p4dp)) {
3249 printf("No valid P4D\n");
3253 if (p4d_is_leaf(*p4dp)) {
3254 format_pte(p4dp, p4d_val(*p4dp));
3258 printf("p4dp @ 0x%px = 0x%016lx\n", p4dp, p4d_val(*p4dp));
3260 pudp = pud_offset(p4dp, addr);
3262 if (pud_none(*pudp)) {
3263 printf("No valid PUD\n");
3267 if (pud_is_leaf(*pudp)) {
3268 format_pte(pudp, pud_val(*pudp));
3272 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3274 pmdp = pmd_offset(pudp, addr);
3276 if (pmd_none(*pmdp)) {
3277 printf("No valid PMD\n");
3281 if (pmd_is_leaf(*pmdp)) {
3282 format_pte(pmdp, pmd_val(*pmdp));
3285 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3287 ptep = pte_offset_map(pmdp, addr);
3288 if (pte_none(*ptep)) {
3289 printf("no valid PTE\n");
3293 format_pte(ptep, pte_val(*ptep));
3297 catch_memory_errors = 0;
3300 static void show_pte(unsigned long addr)
3302 printf("show_pte not yet implemented\n");
3304 #endif /* CONFIG_PPC_BOOK3S_64 */
3306 static void show_tasks(void)
3309 struct task_struct *tsk = NULL;
3311 printf(" task_struct ->thread.ksp ->thread.regs PID PPID S P CMD\n");
3314 tsk = (struct task_struct *)tskv;
3316 if (setjmp(bus_error_jmp) != 0) {
3317 catch_memory_errors = 0;
3318 printf("*** Error dumping task %px\n", tsk);
3322 catch_memory_errors = 1;
3328 for_each_process(tsk)
3333 catch_memory_errors = 0;
3336 static void proccall(void)
3338 unsigned long args[8];
3341 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3342 unsigned long, unsigned long, unsigned long,
3343 unsigned long, unsigned long, unsigned long);
3346 if (!scanhex(&adrs))
3350 for (i = 0; i < 8; ++i)
3352 for (i = 0; i < 8; ++i) {
3353 if (!scanhex(&args[i]) || termch == '\n')
3357 func = (callfunc_t) adrs;
3359 if (setjmp(bus_error_jmp) == 0) {
3360 catch_memory_errors = 1;
3362 ret = func(args[0], args[1], args[2], args[3],
3363 args[4], args[5], args[6], args[7]);
3365 printf("return value is 0x%lx\n", ret);
3367 printf("*** %x exception occurred\n", fault_except);
3369 catch_memory_errors = 0;
3372 /* Input scanning routines */
3383 while( c == ' ' || c == '\t' )
3389 static const char *regnames[N_PTREGS] = {
3390 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3391 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3392 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3393 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3394 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3400 "trap", "dar", "dsisr", "res"
3404 scanhex(unsigned long *vp)
3411 /* parse register name */
3415 for (i = 0; i < sizeof(regname) - 1; ++i) {
3424 i = match_string(regnames, N_PTREGS, regname);
3426 printf("invalid register name '%%%s'\n", regname);
3429 if (xmon_regs == NULL) {
3430 printf("regs not available\n");
3433 *vp = ((unsigned long *)xmon_regs)[i];
3437 /* skip leading "0x" if any */
3451 } else if (c == '$') {
3453 for (i=0; i<63; i++) {
3455 if (isspace(c) || c == '\0') {
3463 if (setjmp(bus_error_jmp) == 0) {
3464 catch_memory_errors = 1;
3466 *vp = kallsyms_lookup_name(tmpstr);
3469 catch_memory_errors = 0;
3471 printf("unknown symbol '%s'\n", tmpstr);
3504 static int hexdigit(int c)
3506 if( '0' <= c && c <= '9' )
3508 if( 'A' <= c && c <= 'F' )
3509 return c - ('A' - 10);
3510 if( 'a' <= c && c <= 'f' )
3511 return c - ('a' - 10);
3516 getstring(char *s, int size)
3532 } while( c != ' ' && c != '\t' && c != '\n' );
3537 static char line[256];
3538 static char *lineptr;
3549 if (lineptr == NULL || *lineptr == 0) {
3550 if (xmon_gets(line, sizeof(line)) == NULL) {
3560 take_input(char *str)
3569 int type = inchar();
3570 unsigned long addr, cpu;
3571 void __percpu *ptr = NULL;
3572 static char tmp[64];
3577 xmon_print_symbol(addr, ": ", "\n");
3582 if (setjmp(bus_error_jmp) == 0) {
3583 catch_memory_errors = 1;
3585 addr = kallsyms_lookup_name(tmp);
3587 printf("%s: %lx\n", tmp, addr);
3589 printf("Symbol '%s' not found.\n", tmp);
3592 catch_memory_errors = 0;
3597 if (setjmp(bus_error_jmp) == 0) {
3598 catch_memory_errors = 1;
3600 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3605 ptr >= (void __percpu *)__per_cpu_start &&
3606 ptr < (void __percpu *)__per_cpu_end)
3608 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3609 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3611 cpu = raw_smp_processor_id();
3612 addr = (unsigned long)this_cpu_ptr(ptr);
3615 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3617 printf("Percpu symbol '%s' not found.\n", tmp);
3620 catch_memory_errors = 0;
3627 /* Print an address in numeric and symbolic form (if possible) */
3628 static void xmon_print_symbol(unsigned long address, const char *mid,
3632 const char *name = NULL;
3633 unsigned long offset, size;
3635 printf(REG, address);
3636 if (setjmp(bus_error_jmp) == 0) {
3637 catch_memory_errors = 1;
3639 name = kallsyms_lookup(address, &size, &offset, &modname,
3642 /* wait a little while to see if we get a machine check */
3646 catch_memory_errors = 0;
3649 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3651 printf(" [%s]", modname);
3653 printf("%s", after);
3656 #ifdef CONFIG_PPC_BOOK3S_64
3657 void dump_segments(void)
3660 unsigned long esid,vsid;
3663 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3665 for (i = 0; i < mmu_slb_size; i++) {
3666 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3667 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3672 printf("%02d %016lx %016lx", i, esid, vsid);
3674 if (!(esid & SLB_ESID_V)) {
3679 llp = vsid & SLB_VSID_LLP;
3680 if (vsid & SLB_VSID_B_1T) {
3681 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3683 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3686 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3688 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3695 #ifdef CONFIG_PPC_BOOK3S_32
3696 void dump_segments(void)
3701 for (i = 0; i < 16; ++i)
3702 printf(" %x", mfsrin(i << 28));
3708 static void dump_tlb_44x(void)
3712 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3713 unsigned long w0,w1,w2;
3714 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3715 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3716 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3717 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3718 if (w0 & PPC44x_TLB_VALID) {
3719 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3720 w0 & PPC44x_TLB_EPN_MASK,
3721 w1 & PPC44x_TLB_ERPN_MASK,
3722 w1 & PPC44x_TLB_RPN_MASK,
3723 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3724 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3725 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3726 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3727 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3732 #endif /* CONFIG_44x */
3734 #ifdef CONFIG_PPC_BOOK3E
3735 static void dump_tlb_book3e(void)
3737 u32 mmucfg, pidmask, lpidmask;
3739 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3741 static const char *pgsz_names[] = {
3776 /* Gather some infos about the MMU */
3777 mmucfg = mfspr(SPRN_MMUCFG);
3778 mmu_version = (mmucfg & 3) + 1;
3779 ntlbs = ((mmucfg >> 2) & 3) + 1;
3780 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3781 lpidsz = (mmucfg >> 24) & 0xf;
3782 rasz = (mmucfg >> 16) & 0x7f;
3783 if ((mmu_version > 1) && (mmucfg & 0x10000))
3785 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3786 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3787 pidmask = (1ul << pidsz) - 1;
3788 lpidmask = (1ul << lpidsz) - 1;
3789 ramask = (1ull << rasz) - 1;
3791 for (tlb = 0; tlb < ntlbs; tlb++) {
3793 int nent, assoc, new_cc = 1;
3794 printf("TLB %d:\n------\n", tlb);
3797 tlbcfg = mfspr(SPRN_TLB0CFG);
3800 tlbcfg = mfspr(SPRN_TLB1CFG);
3803 tlbcfg = mfspr(SPRN_TLB2CFG);
3806 tlbcfg = mfspr(SPRN_TLB3CFG);
3809 printf("Unsupported TLB number !\n");
3812 nent = tlbcfg & 0xfff;
3813 assoc = (tlbcfg >> 24) & 0xff;
3814 for (i = 0; i < nent; i++) {
3815 u32 mas0 = MAS0_TLBSEL(tlb);
3816 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3819 int esel = i, cc = i;
3827 mas0 |= MAS0_ESEL(esel);
3828 mtspr(SPRN_MAS0, mas0);
3829 mtspr(SPRN_MAS1, mas1);
3830 mtspr(SPRN_MAS2, mas2);
3831 asm volatile("tlbre 0,0,0" : : : "memory");
3832 mas1 = mfspr(SPRN_MAS1);
3833 mas2 = mfspr(SPRN_MAS2);
3834 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3835 if (assoc && (i % assoc) == 0)
3837 if (!(mas1 & MAS1_VALID))
3840 printf("%04x- ", i);
3842 printf("%04x-%c", cc, 'A' + esel);
3844 printf(" |%c", 'A' + esel);
3846 printf(" %016llx %04x %s %c%c AS%c",
3848 (mas1 >> 16) & 0x3fff,
3849 pgsz_names[(mas1 >> 7) & 0x1f],
3850 mas1 & MAS1_IND ? 'I' : ' ',
3851 mas1 & MAS1_IPROT ? 'P' : ' ',
3852 mas1 & MAS1_TS ? '1' : '0');
3853 printf(" %c%c%c%c%c%c%c",
3854 mas2 & MAS2_X0 ? 'a' : ' ',
3855 mas2 & MAS2_X1 ? 'v' : ' ',
3856 mas2 & MAS2_W ? 'w' : ' ',
3857 mas2 & MAS2_I ? 'i' : ' ',
3858 mas2 & MAS2_M ? 'm' : ' ',
3859 mas2 & MAS2_G ? 'g' : ' ',
3860 mas2 & MAS2_E ? 'e' : ' ');
3861 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3862 if (mas1 & MAS1_IND)
3864 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3866 printf(" U%c%c%c S%c%c%c\n",
3867 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3868 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3869 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3870 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3871 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3872 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3876 #endif /* CONFIG_PPC_BOOK3E */
3878 static void xmon_init(int enable)
3882 __debugger_ipi = xmon_ipi;
3883 __debugger_bpt = xmon_bpt;
3884 __debugger_sstep = xmon_sstep;
3885 __debugger_iabr_match = xmon_iabr_match;
3886 __debugger_break_match = xmon_break_match;
3887 __debugger_fault_handler = xmon_fault_handler;
3889 #ifdef CONFIG_PPC_PSERIES
3891 * Get the token here to avoid trying to get a lock
3892 * during the crash, causing a deadlock.
3894 set_indicator_token = rtas_token("set-indicator");
3898 __debugger_ipi = NULL;
3899 __debugger_bpt = NULL;
3900 __debugger_sstep = NULL;
3901 __debugger_iabr_match = NULL;
3902 __debugger_break_match = NULL;
3903 __debugger_fault_handler = NULL;
3907 #ifdef CONFIG_MAGIC_SYSRQ
3908 static void sysrq_handle_xmon(int key)
3910 if (xmon_is_locked_down()) {
3915 /* ensure xmon is enabled */
3917 debugger(get_irq_regs());
3922 static const struct sysrq_key_op sysrq_xmon_op = {
3923 .handler = sysrq_handle_xmon,
3924 .help_msg = "xmon(x)",
3925 .action_msg = "Entering xmon",
3928 static int __init setup_xmon_sysrq(void)
3930 register_sysrq_key('x', &sysrq_xmon_op);
3933 device_initcall(setup_xmon_sysrq);
3934 #endif /* CONFIG_MAGIC_SYSRQ */
3936 static void clear_all_bpt(void)
3940 /* clear/unpatch all breakpoints */
3944 /* Disable all breakpoints */
3945 for (i = 0; i < NBPTS; ++i)
3946 bpts[i].enabled = 0;
3948 /* Clear any data or iabr breakpoints */
3950 for (i = 0; i < nr_wp_slots(); i++)
3951 dabr[i].enabled = 0;
3954 #ifdef CONFIG_DEBUG_FS
3955 static int xmon_dbgfs_set(void *data, u64 val)
3960 /* make sure all breakpoints removed when disabling */
3964 printf("xmon: All breakpoints cleared\n");
3965 release_output_lock();
3971 static int xmon_dbgfs_get(void *data, u64 *val)
3977 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3978 xmon_dbgfs_set, "%llu\n");
3980 static int __init setup_xmon_dbgfs(void)
3982 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3986 device_initcall(setup_xmon_dbgfs);
3987 #endif /* CONFIG_DEBUG_FS */
3989 static int xmon_early __initdata;
3991 static int __init early_parse_xmon(char *p)
3993 if (xmon_is_locked_down()) {
3997 } else if (!p || strncmp(p, "early", 5) == 0) {
3998 /* just "xmon" is equivalent to "xmon=early" */
4002 } else if (strncmp(p, "on", 2) == 0) {
4005 } else if (strncmp(p, "rw", 2) == 0) {
4009 } else if (strncmp(p, "ro", 2) == 0) {
4013 } else if (strncmp(p, "off", 3) == 0)
4020 early_param("xmon", early_parse_xmon);
4022 void __init xmon_setup(void)
4030 #ifdef CONFIG_SPU_BASE
4034 u64 saved_mfc_sr1_RW;
4035 u32 saved_spu_runcntl_RW;
4036 unsigned long dump_addr;
4040 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4042 static struct spu_info spu_info[XMON_NUM_SPUS];
4044 void xmon_register_spus(struct list_head *list)
4048 list_for_each_entry(spu, list, full_list) {
4049 if (spu->number >= XMON_NUM_SPUS) {
4054 spu_info[spu->number].spu = spu;
4055 spu_info[spu->number].stopped_ok = 0;
4056 spu_info[spu->number].dump_addr = (unsigned long)
4057 spu_info[spu->number].spu->local_store;
4061 static void stop_spus(void)
4067 for (i = 0; i < XMON_NUM_SPUS; i++) {
4068 if (!spu_info[i].spu)
4071 if (setjmp(bus_error_jmp) == 0) {
4072 catch_memory_errors = 1;
4075 spu = spu_info[i].spu;
4077 spu_info[i].saved_spu_runcntl_RW =
4078 in_be32(&spu->problem->spu_runcntl_RW);
4080 tmp = spu_mfc_sr1_get(spu);
4081 spu_info[i].saved_mfc_sr1_RW = tmp;
4083 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4084 spu_mfc_sr1_set(spu, tmp);
4089 spu_info[i].stopped_ok = 1;
4091 printf("Stopped spu %.2d (was %s)\n", i,
4092 spu_info[i].saved_spu_runcntl_RW ?
4093 "running" : "stopped");
4095 catch_memory_errors = 0;
4096 printf("*** Error stopping spu %.2d\n", i);
4098 catch_memory_errors = 0;
4102 static void restart_spus(void)
4107 for (i = 0; i < XMON_NUM_SPUS; i++) {
4108 if (!spu_info[i].spu)
4111 if (!spu_info[i].stopped_ok) {
4112 printf("*** Error, spu %d was not successfully stopped"
4113 ", not restarting\n", i);
4117 if (setjmp(bus_error_jmp) == 0) {
4118 catch_memory_errors = 1;
4121 spu = spu_info[i].spu;
4122 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4123 out_be32(&spu->problem->spu_runcntl_RW,
4124 spu_info[i].saved_spu_runcntl_RW);
4129 printf("Restarted spu %.2d\n", i);
4131 catch_memory_errors = 0;
4132 printf("*** Error restarting spu %.2d\n", i);
4134 catch_memory_errors = 0;
4138 #define DUMP_WIDTH 23
4139 #define DUMP_VALUE(format, field, value) \
4141 if (setjmp(bus_error_jmp) == 0) { \
4142 catch_memory_errors = 1; \
4144 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4149 catch_memory_errors = 0; \
4150 printf(" %-*s = *** Error reading field.\n", \
4151 DUMP_WIDTH, #field); \
4153 catch_memory_errors = 0; \
4156 #define DUMP_FIELD(obj, format, field) \
4157 DUMP_VALUE(format, field, obj->field)
4159 static void dump_spu_fields(struct spu *spu)
4161 printf("Dumping spu fields at address %p:\n", spu);
4163 DUMP_FIELD(spu, "0x%x", number);
4164 DUMP_FIELD(spu, "%s", name);
4165 DUMP_FIELD(spu, "0x%lx", local_store_phys);
4166 DUMP_FIELD(spu, "0x%p", local_store);
4167 DUMP_FIELD(spu, "0x%lx", ls_size);
4168 DUMP_FIELD(spu, "0x%x", node);
4169 DUMP_FIELD(spu, "0x%lx", flags);
4170 DUMP_FIELD(spu, "%llu", class_0_pending);
4171 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4172 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4173 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4174 DUMP_FIELD(spu, "0x%x", irqs[0]);
4175 DUMP_FIELD(spu, "0x%x", irqs[1]);
4176 DUMP_FIELD(spu, "0x%x", irqs[2]);
4177 DUMP_FIELD(spu, "0x%x", slb_replace);
4178 DUMP_FIELD(spu, "%d", pid);
4179 DUMP_FIELD(spu, "0x%p", mm);
4180 DUMP_FIELD(spu, "0x%p", ctx);
4181 DUMP_FIELD(spu, "0x%p", rq);
4182 DUMP_FIELD(spu, "0x%llx", timestamp);
4183 DUMP_FIELD(spu, "0x%lx", problem_phys);
4184 DUMP_FIELD(spu, "0x%p", problem);
4185 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4186 in_be32(&spu->problem->spu_runcntl_RW));
4187 DUMP_VALUE("0x%x", problem->spu_status_R,
4188 in_be32(&spu->problem->spu_status_R));
4189 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4190 in_be32(&spu->problem->spu_npc_RW));
4191 DUMP_FIELD(spu, "0x%p", priv2);
4192 DUMP_FIELD(spu, "0x%p", pdata);
4196 spu_inst_dump(unsigned long adr, long count, int praddr)
4198 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4201 static void dump_spu_ls(unsigned long num, int subcmd)
4203 unsigned long offset, addr, ls_addr;
4205 if (setjmp(bus_error_jmp) == 0) {
4206 catch_memory_errors = 1;
4208 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4212 catch_memory_errors = 0;
4213 printf("*** Error: accessing spu info for spu %ld\n", num);
4216 catch_memory_errors = 0;
4218 if (scanhex(&offset))
4219 addr = ls_addr + offset;
4221 addr = spu_info[num].dump_addr;
4223 if (addr >= ls_addr + LS_SIZE) {
4224 printf("*** Error: address outside of local store\n");
4230 addr += spu_inst_dump(addr, 16, 1);
4240 spu_info[num].dump_addr = addr;
4243 static int do_spu_cmd(void)
4245 static unsigned long num = 0;
4246 int cmd, subcmd = 0;
4258 if (isxdigit(subcmd) || subcmd == '\n')
4263 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4264 printf("*** Error: invalid spu number\n");
4270 dump_spu_fields(spu_info[num].spu);
4273 dump_spu_ls(num, subcmd);
4284 #else /* ! CONFIG_SPU_BASE */
4285 static int do_spu_cmd(void)