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>
38 #include <asm/pgtable.h>
40 #include <asm/mmu_context.h>
41 #include <asm/plpar_wrappers.h>
42 #include <asm/cputable.h>
44 #include <asm/sstep.h>
45 #include <asm/irq_regs.h>
47 #include <asm/spu_priv1.h>
48 #include <asm/setjmp.h>
50 #include <asm/debug.h>
51 #include <asm/hw_breakpoint.h>
54 #include <asm/firmware.h>
55 #include <asm/code-patching.h>
56 #include <asm/sections.h>
60 #include <asm/hvcall.h>
66 #include "xmon_bpts.h"
69 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
70 static unsigned long xmon_taken = 1;
71 static int xmon_owner;
75 #endif /* CONFIG_SMP */
77 #ifdef CONFIG_PPC_PSERIES
78 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
80 static unsigned long in_xmon __read_mostly = 0;
81 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
82 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
84 static unsigned long adrs;
86 #define MAX_DUMP (64 * 1024)
87 static unsigned long ndump = 64;
88 #define MAX_IDUMP (MAX_DUMP >> 2)
89 static unsigned long nidump = 16;
90 static unsigned long ncsum = 4096;
92 static char tmpstr[128];
93 static int tracing_enabled;
95 static long bus_error_jmp[JMP_BUF_LEN];
96 static int catch_memory_errors;
97 static int catch_spr_faults;
98 static long *xmon_fault_jmp[NR_CPUS];
100 /* Breakpoint stuff */
102 unsigned long address;
103 struct ppc_inst *instr;
109 /* Bits in bpt.enabled */
114 static struct bpt bpts[NBPTS];
115 static struct bpt dabr;
116 static struct bpt *iabr;
117 static unsigned bpinstr = 0x7fe00008; /* trap */
119 #define BP_NUM(bp) ((bp) - bpts + 1)
122 static int cmds(struct pt_regs *);
123 static int mread(unsigned long, void *, int);
124 static int mwrite(unsigned long, void *, int);
125 static int mread_instr(unsigned long, struct ppc_inst *);
126 static int handle_fault(struct pt_regs *);
127 static void byterev(unsigned char *, int);
128 static void memex(void);
129 static int bsesc(void);
130 static void dump(void);
131 static void show_pte(unsigned long);
132 static void prdump(unsigned long, long);
133 static int ppc_inst_dump(unsigned long, long, int);
134 static void dump_log_buf(void);
136 #ifdef CONFIG_PPC_POWERNV
137 static void dump_opal_msglog(void);
139 static inline void dump_opal_msglog(void)
141 printf("Machine is not running OPAL firmware.\n");
145 static void backtrace(struct pt_regs *);
146 static void excprint(struct pt_regs *);
147 static void prregs(struct pt_regs *);
148 static void memops(int);
149 static void memlocate(void);
150 static void memzcan(void);
151 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
153 int scanhex(unsigned long *valp);
154 static void scannl(void);
155 static int hexdigit(int);
156 void getstring(char *, int);
157 static void flush_input(void);
158 static int inchar(void);
159 static void take_input(char *);
160 static int read_spr(int, unsigned long *);
161 static void write_spr(int, unsigned long);
162 static void super_regs(void);
163 static void remove_bpts(void);
164 static void insert_bpts(void);
165 static void remove_cpu_bpts(void);
166 static void insert_cpu_bpts(void);
167 static struct bpt *at_breakpoint(unsigned long pc);
168 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
169 static int do_step(struct pt_regs *);
170 static void bpt_cmds(void);
171 static void cacheflush(void);
172 static int cpu_cmd(void);
173 static void csum(void);
174 static void bootcmds(void);
175 static void proccall(void);
176 static void show_tasks(void);
177 void dump_segments(void);
178 static void symbol_lookup(void);
179 static void xmon_show_stack(unsigned long sp, unsigned long lr,
181 static void xmon_print_symbol(unsigned long address, const char *mid,
183 static const char *getvecname(unsigned long vec);
185 static int do_spu_cmd(void);
188 static void dump_tlb_44x(void);
190 #ifdef CONFIG_PPC_BOOK3E
191 static void dump_tlb_book3e(void);
194 static void clear_all_bpt(void);
202 #ifdef __LITTLE_ENDIAN__
203 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
205 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
208 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
210 static char *help_string = "\
212 b show breakpoints\n\
213 bd set data breakpoint\n\
214 bi set instruction breakpoint\n\
215 bc clear breakpoint\n"
218 c print cpus stopped in xmon\n\
219 c# try to switch to cpu number h (in hex)\n"
224 d1 dump 1 byte values\n\
225 d2 dump 2 byte values\n\
226 d4 dump 4 byte values\n\
227 d8 dump 8 byte values\n\
228 di dump instructions\n\
229 df dump float values\n\
230 dd dump double values\n\
231 dl dump the kernel log buffer\n"
232 #ifdef CONFIG_PPC_POWERNV
234 do dump the OPAL message log\n"
238 dp[#] dump paca for current cpu, or cpu #\n\
239 dpa dump paca for all possible cpus\n"
242 dr dump stream of raw bytes\n\
243 dv dump virtual address translation \n\
244 dt dump the tracing buffers (uses printk)\n\
245 dtc dump the tracing buffers for current CPU (uses printk)\n\
247 #ifdef CONFIG_PPC_POWERNV
248 " dx# dump xive on CPU #\n\
249 dxi# dump xive irq state #\n\
250 dxa dump xive on all CPUs\n"
252 " e print exception information\n\
254 la lookup symbol+offset of specified address\n\
255 ls lookup address of specified symbol\n\
256 lp s [#] lookup address of percpu symbol s for current cpu, or cpu #\n\
257 m examine/change memory\n\
258 mm move a block of memory\n\
259 ms set a block of memory\n\
260 md compare two blocks of memory\n\
261 ml locate a block of memory\n\
262 mz zero a block of memory\n\
263 mi show information about memory allocation\n\
264 p call a procedure\n\
265 P list processes/tasks\n\
268 #ifdef CONFIG_SPU_BASE
269 " ss stop execution on all spus\n\
270 sr restore execution on stopped spus\n\
271 sf # dump spu fields for spu # (in hex)\n\
272 sd # dump spu local store for spu # (in hex)\n\
273 sdi # disassemble spu local store for spu # (in hex)\n"
275 " S print special registers\n\
278 Sw #v write v to SPR #\n\
280 x exit monitor and recover\n\
281 X exit monitor and don't recover\n"
282 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
283 " u dump segment table or SLB\n"
284 #elif defined(CONFIG_PPC_BOOK3S_32)
285 " u dump segment registers\n"
286 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
289 " U show uptime information\n"
291 " # n limit output to n lines per page (for dp, dpa, dl)\n"
296 #ifdef CONFIG_SECURITY
297 static bool xmon_is_locked_down(void)
299 static bool lockdown;
302 lockdown = !!security_locked_down(LOCKDOWN_XMON_RW);
304 printf("xmon: Disabled due to kernel lockdown\n");
310 xmon_is_ro = !!security_locked_down(LOCKDOWN_XMON_WR);
312 printf("xmon: Read-only due to kernel lockdown\n");
317 #else /* CONFIG_SECURITY */
318 static inline bool xmon_is_locked_down(void)
324 static struct pt_regs *xmon_regs;
326 static inline void sync(void)
328 asm volatile("sync; isync");
331 static inline void cflush(void *p)
333 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
336 static inline void cinval(void *p)
338 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
342 * write_ciabr() - write the CIABR SPR
343 * @ciabr: The value to write.
345 * This function writes a value to the CIARB register either directly
346 * through mtspr instruction if the kernel is in HV privilege mode or
347 * call a hypervisor function to achieve the same in case the kernel
348 * is in supervisor privilege mode.
350 static void write_ciabr(unsigned long ciabr)
352 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
355 if (cpu_has_feature(CPU_FTR_HVMODE)) {
356 mtspr(SPRN_CIABR, ciabr);
359 plpar_set_ciabr(ciabr);
363 * set_ciabr() - set the CIABR
364 * @addr: The value to set.
366 * This function sets the correct privilege value into the the HW
367 * breakpoint address before writing it up in the CIABR register.
369 static void set_ciabr(unsigned long addr)
373 if (cpu_has_feature(CPU_FTR_HVMODE))
374 addr |= CIABR_PRIV_HYPER;
376 addr |= CIABR_PRIV_SUPER;
381 * Disable surveillance (the service processor watchdog function)
382 * while we are in xmon.
383 * XXX we should re-enable it when we leave. :)
385 #define SURVEILLANCE_TOKEN 9000
387 static inline void disable_surveillance(void)
389 #ifdef CONFIG_PPC_PSERIES
390 /* Since this can't be a module, args should end up below 4GB. */
391 static struct rtas_args args;
394 * At this point we have got all the cpus we can into
395 * xmon, so there is hopefully no other cpu calling RTAS
396 * at the moment, even though we don't take rtas.lock.
397 * If we did try to take rtas.lock there would be a
398 * real possibility of deadlock.
400 if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
403 rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
404 SURVEILLANCE_TOKEN, 0, 0);
406 #endif /* CONFIG_PPC_PSERIES */
410 static int xmon_speaker;
412 static void get_output_lock(void)
414 int me = smp_processor_id() + 0x100;
415 int last_speaker = 0, prev;
418 if (xmon_speaker == me)
422 last_speaker = cmpxchg(&xmon_speaker, 0, me);
423 if (last_speaker == 0)
427 * Wait a full second for the lock, we might be on a slow
428 * console, but check every 100us.
431 while (xmon_speaker == last_speaker) {
437 /* hostile takeover */
438 prev = cmpxchg(&xmon_speaker, last_speaker, me);
439 if (prev == last_speaker)
446 static void release_output_lock(void)
451 int cpus_are_in_xmon(void)
453 return !cpumask_empty(&cpus_in_xmon);
456 static bool wait_for_other_cpus(int ncpus)
458 unsigned long timeout;
460 /* We wait for 2s, which is a metric "little while" */
461 for (timeout = 20000; timeout != 0; --timeout) {
462 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
470 #else /* CONFIG_SMP */
471 static inline void get_output_lock(void) {}
472 static inline void release_output_lock(void) {}
475 static inline int unrecoverable_excp(struct pt_regs *regs)
477 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
478 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
481 return ((regs->msr & MSR_RI) == 0);
485 static int xmon_core(struct pt_regs *regs, int fromipi)
489 long recurse_jmp[JMP_BUF_LEN];
491 unsigned long offset;
498 local_irq_save(flags);
501 locked_down = xmon_is_locked_down();
504 tracing_enabled = tracing_is_on();
508 bp = in_breakpoint_table(regs->nip, &offset);
510 regs->nip = bp->address + offset;
511 atomic_dec(&bp->ref_count);
517 cpu = smp_processor_id();
518 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
520 * We catch SPR read/write faults here because the 0x700, 0xf60
521 * etc. handlers don't call debugger_fault_handler().
523 if (catch_spr_faults)
524 longjmp(bus_error_jmp, 1);
527 printf("cpu 0x%x: Exception %lx %s in xmon, "
528 "returning to main loop\n",
529 cpu, regs->trap, getvecname(TRAP(regs)));
530 release_output_lock();
531 longjmp(xmon_fault_jmp[cpu], 1);
534 if (setjmp(recurse_jmp) != 0) {
535 if (!in_xmon || !xmon_gate) {
537 printf("xmon: WARNING: bad recursive fault "
538 "on cpu 0x%x\n", cpu);
539 release_output_lock();
542 secondary = !(xmon_taken && cpu == xmon_owner);
546 xmon_fault_jmp[cpu] = recurse_jmp;
549 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
550 bp = at_breakpoint(regs->nip);
551 if (bp || unrecoverable_excp(regs))
559 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
561 xmon_print_symbol(regs->nip, " ", ")\n");
563 if (unrecoverable_excp(regs))
564 printf("WARNING: exception is not recoverable, "
566 release_output_lock();
569 cpumask_set_cpu(cpu, &cpus_in_xmon);
574 while (secondary && !xmon_gate) {
580 secondary = test_and_set_bit(0, &in_xmon);
583 touch_nmi_watchdog();
587 if (!secondary && !xmon_gate) {
588 /* we are the first cpu to come in */
589 /* interrupt other cpu(s) */
590 int ncpus = num_online_cpus();
596 * A system reset (trap == 0x100) can be triggered on
597 * all CPUs, so when we come in via 0x100 try waiting
598 * for the other CPUs to come in before we send the
599 * debugger break (IPI). This is similar to
600 * crash_kexec_secondary().
602 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
603 smp_send_debugger_break();
605 wait_for_other_cpus(ncpus);
608 disable_surveillance();
611 /* for breakpoint or single step, print curr insn */
612 if (bp || TRAP(regs) == 0xd00)
613 ppc_inst_dump(regs->nip, 1, 0);
614 printf("enter ? for help\n");
620 touch_nmi_watchdog();
627 if (cpu == xmon_owner) {
628 if (!test_and_set_bit(0, &xmon_taken)) {
634 while (cpu == xmon_owner)
638 touch_nmi_watchdog();
642 if (locked_down || cmd != 0) {
650 /* have switched to some other cpu */
655 cpumask_clear_cpu(cpu, &cpus_in_xmon);
656 xmon_fault_jmp[cpu] = NULL;
658 /* UP is simple... */
660 printf("Exception %lx %s in xmon, returning to main loop\n",
661 regs->trap, getvecname(TRAP(regs)));
662 longjmp(xmon_fault_jmp[0], 1);
664 if (setjmp(recurse_jmp) == 0) {
665 xmon_fault_jmp[0] = recurse_jmp;
669 bp = at_breakpoint(regs->nip);
671 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
672 xmon_print_symbol(regs->nip, " ", ")\n");
674 if (unrecoverable_excp(regs))
675 printf("WARNING: exception is not recoverable, "
678 disable_surveillance();
680 /* for breakpoint or single step, print current insn */
681 if (bp || TRAP(regs) == 0xd00)
682 ppc_inst_dump(regs->nip, 1, 0);
683 printf("enter ? for help\n");
695 if (regs->msr & MSR_DE) {
696 bp = at_breakpoint(regs->nip);
698 regs->nip = (unsigned long) &bp->instr[0];
699 atomic_inc(&bp->ref_count);
703 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
704 bp = at_breakpoint(regs->nip);
706 int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
708 regs->nip = (unsigned long) &bp->instr[0];
709 atomic_inc(&bp->ref_count);
710 } else if (stepped < 0) {
711 printf("Couldn't single-step %s instruction\n",
712 IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
722 touch_nmi_watchdog();
723 local_irq_restore(flags);
725 return cmd != 'X' && cmd != EOF;
728 int xmon(struct pt_regs *excp)
733 ppc_save_regs(®s);
737 return xmon_core(excp, 0);
741 irqreturn_t xmon_irq(int irq, void *d)
744 local_irq_save(flags);
745 printf("Keyboard interrupt\n");
746 xmon(get_irq_regs());
747 local_irq_restore(flags);
751 static int xmon_bpt(struct pt_regs *regs)
754 unsigned long offset;
756 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
759 /* Are we at the trap at bp->instr[1] for some bp? */
760 bp = in_breakpoint_table(regs->nip, &offset);
761 if (bp != NULL && (offset == 4 || offset == 8)) {
762 regs->nip = bp->address + offset;
763 atomic_dec(&bp->ref_count);
767 /* Are we at a breakpoint? */
768 bp = at_breakpoint(regs->nip);
777 static int xmon_sstep(struct pt_regs *regs)
785 static int xmon_break_match(struct pt_regs *regs)
787 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
789 if (dabr.enabled == 0)
795 static int xmon_iabr_match(struct pt_regs *regs)
797 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
805 static int xmon_ipi(struct pt_regs *regs)
808 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
814 static int xmon_fault_handler(struct pt_regs *regs)
817 unsigned long offset;
819 if (in_xmon && catch_memory_errors)
820 handle_fault(regs); /* doesn't return */
822 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
823 bp = in_breakpoint_table(regs->nip, &offset);
825 regs->nip = bp->address + offset;
826 atomic_dec(&bp->ref_count);
833 /* Force enable xmon if not already enabled */
834 static inline void force_enable_xmon(void)
836 /* Enable xmon hooks if needed */
838 printf("xmon: Enabling debugger hooks\n");
843 static struct bpt *at_breakpoint(unsigned long pc)
849 for (i = 0; i < NBPTS; ++i, ++bp)
850 if (bp->enabled && pc == bp->address)
855 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
859 off = nip - (unsigned long)bpt_table;
860 if (off >= sizeof(bpt_table))
862 *offp = off & (BPT_SIZE - 1);
865 return bpts + (off / BPT_SIZE);
868 static struct bpt *new_breakpoint(unsigned long a)
873 bp = at_breakpoint(a);
877 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
878 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
880 bp->instr = (void *)(bpt_table + ((bp - bpts) * BPT_WORDS));
885 printf("Sorry, no free breakpoints. Please clear one first.\n");
889 static void insert_bpts(void)
892 struct ppc_inst instr, instr2;
893 struct bpt *bp, *bp2;
896 for (i = 0; i < NBPTS; ++i, ++bp) {
897 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
899 if (!mread_instr(bp->address, &instr)) {
900 printf("Couldn't read instruction at %lx, "
901 "disabling breakpoint there\n", bp->address);
905 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
906 printf("Breakpoint at %lx is on an mtmsrd or rfid "
907 "instruction, disabling it\n", bp->address);
912 * Check the address is not a suffix by looking for a prefix in
915 if (mread_instr(bp->address - 4, &instr2) == 8) {
916 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
922 * We might still be a suffix - if the prefix has already been
923 * replaced by a breakpoint we won't catch it with the above
926 bp2 = at_breakpoint(bp->address - 4);
927 if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
928 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
934 patch_instruction(bp->instr, instr);
935 patch_instruction((void *)bp->instr + ppc_inst_len(instr),
937 if (bp->enabled & BP_CIABR)
939 if (patch_instruction((struct ppc_inst *)bp->address,
940 ppc_inst(bpinstr)) != 0) {
941 printf("Couldn't write instruction at %lx, "
942 "disabling breakpoint there\n", bp->address);
943 bp->enabled &= ~BP_TRAP;
949 static void insert_cpu_bpts(void)
951 struct arch_hw_breakpoint brk;
954 brk.address = dabr.address;
955 brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
956 brk.len = DABR_MAX_LEN;
957 __set_breakpoint(0, &brk);
961 set_ciabr(iabr->address);
964 static void remove_bpts(void)
968 struct ppc_inst instr;
971 for (i = 0; i < NBPTS; ++i, ++bp) {
972 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
974 if (mread_instr(bp->address, &instr)
975 && ppc_inst_equal(instr, ppc_inst(bpinstr))
976 && patch_instruction(
977 (struct ppc_inst *)bp->address, ppc_inst_read(bp->instr)) != 0)
978 printf("Couldn't remove breakpoint at %lx\n",
983 static void remove_cpu_bpts(void)
985 hw_breakpoint_disable();
989 /* Based on uptime_proc_show(). */
993 struct timespec64 uptime;
995 if (setjmp(bus_error_jmp) == 0) {
996 catch_memory_errors = 1;
999 ktime_get_coarse_boottime_ts64(&uptime);
1000 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
1001 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
1006 catch_memory_errors = 0;
1009 static void set_lpp_cmd(void)
1013 if (!scanhex(&lpp)) {
1014 printf("Invalid number.\n");
1017 xmon_set_pagination_lpp(lpp);
1019 /* Command interpreting routine */
1020 static char *last_cmd;
1023 cmds(struct pt_regs *excp)
1030 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1034 printf("%x:", smp_processor_id());
1035 #endif /* CONFIG_SMP */
1041 if (last_cmd == NULL)
1043 take_input(last_cmd);
1061 printf(xmon_ro_msg);
1081 prregs(excp); /* print regs */
1096 if (do_spu_cmd() == 0)
1103 if (tracing_enabled)
1107 printf(" <no input ...>\n");
1111 xmon_puts(help_string);
1131 printf(xmon_ro_msg);
1139 #ifdef CONFIG_PPC_BOOK3S
1143 #elif defined(CONFIG_44x)
1147 #elif defined(CONFIG_PPC_BOOK3E)
1156 printf("Unrecognized command: ");
1158 if (' ' < cmd && cmd <= '~')
1161 printf("\\x%x", cmd);
1163 } while (cmd != '\n');
1164 printf(" (type ? for help)\n");
1171 static int do_step(struct pt_regs *regs)
1173 regs->msr |= MSR_DE;
1174 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1179 * Step a single instruction.
1180 * Some instructions we emulate, others we execute with MSR_SE set.
1182 static int do_step(struct pt_regs *regs)
1184 struct ppc_inst instr;
1187 force_enable_xmon();
1188 /* check we are in 64-bit kernel mode, translation enabled */
1189 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1190 if (mread_instr(regs->nip, &instr)) {
1191 stepped = emulate_step(regs, instr);
1193 printf("Couldn't single-step %s instruction\n",
1194 (IS_RFID(instr)? "rfid": "mtmsrd"));
1198 set_trap(regs, 0xd00);
1199 printf("stepped to ");
1200 xmon_print_symbol(regs->nip, " ", "\n");
1201 ppc_inst_dump(regs->nip, 1, 0);
1206 regs->msr |= MSR_SE;
1211 static void bootcmds(void)
1219 ppc_md.restart(tmp);
1220 } else if (cmd == 'h') {
1222 } else if (cmd == 'p') {
1228 static int cpu_cmd(void)
1231 unsigned long cpu, first_cpu, last_cpu;
1234 if (!scanhex(&cpu)) {
1235 /* print cpus waiting or in xmon */
1236 printf("cpus stopped:");
1237 last_cpu = first_cpu = NR_CPUS;
1238 for_each_possible_cpu(cpu) {
1239 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1240 if (cpu == last_cpu + 1) {
1243 if (last_cpu != first_cpu)
1244 printf("-0x%lx", last_cpu);
1245 last_cpu = first_cpu = cpu;
1246 printf(" 0x%lx", cpu);
1250 if (last_cpu != first_cpu)
1251 printf("-0x%lx", last_cpu);
1255 /* try to switch to cpu specified */
1256 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1257 printf("cpu 0x%lx isn't in xmon\n", cpu);
1259 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1260 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1268 while (!xmon_taken) {
1269 if (--timeout == 0) {
1270 if (test_and_set_bit(0, &xmon_taken))
1272 /* take control back */
1274 xmon_owner = smp_processor_id();
1275 printf("cpu 0x%lx didn't take control\n", cpu);
1283 #endif /* CONFIG_SMP */
1286 static unsigned short fcstab[256] = {
1287 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1288 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1289 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1290 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1291 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1292 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1293 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1294 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1295 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1296 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1297 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1298 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1299 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1300 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1301 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1302 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1303 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1304 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1305 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1306 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1307 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1308 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1309 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1310 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1311 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1312 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1313 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1314 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1315 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1316 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1317 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1318 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1321 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1330 if (!scanhex(&adrs))
1332 if (!scanhex(&ncsum))
1335 for (i = 0; i < ncsum; ++i) {
1336 if (mread(adrs+i, &v, 1) == 0) {
1337 printf("csum stopped at "REG"\n", adrs+i);
1342 printf("%x\n", fcs);
1346 * Check if this is a suitable place to put a breakpoint.
1348 static long check_bp_loc(unsigned long addr)
1350 struct ppc_inst instr;
1353 if (!is_kernel_addr(addr)) {
1354 printf("Breakpoints may only be placed at kernel addresses\n");
1357 if (!mread_instr(addr, &instr)) {
1358 printf("Can't read instruction at address %lx\n", addr);
1361 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1362 printf("Breakpoints may not be placed on mtmsrd or rfid "
1369 static char *breakpoint_help_string =
1370 "Breakpoint command usage:\n"
1371 "b show breakpoints\n"
1372 "b <addr> [cnt] set breakpoint at given instr addr\n"
1373 "bc clear all breakpoints\n"
1374 "bc <n/addr> clear breakpoint number n or at addr\n"
1375 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1376 "bd <addr> [cnt] set hardware data breakpoint\n"
1390 #ifndef CONFIG_PPC_8xx
1391 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1393 case 'd': /* bd - hardware data breakpoint */
1395 printf(xmon_ro_msg);
1398 if (!ppc_breakpoint_available()) {
1399 printf("Hardware data breakpoint not supported on this cpu\n");
1406 else if (cmd == 'w')
1412 if (scanhex(&dabr.address)) {
1413 if (!is_kernel_addr(dabr.address)) {
1417 dabr.address &= ~HW_BRK_TYPE_DABR;
1418 dabr.enabled = mode | BP_DABR;
1421 force_enable_xmon();
1424 case 'i': /* bi - hardware instr breakpoint */
1426 printf(xmon_ro_msg);
1429 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1430 printf("Hardware instruction breakpoint "
1431 "not supported on this cpu\n");
1435 iabr->enabled &= ~BP_CIABR;
1440 if (!check_bp_loc(a))
1442 bp = new_breakpoint(a);
1444 bp->enabled |= BP_CIABR;
1446 force_enable_xmon();
1453 /* clear all breakpoints */
1454 for (i = 0; i < NBPTS; ++i)
1455 bpts[i].enabled = 0;
1458 printf("All breakpoints cleared\n");
1462 if (a <= NBPTS && a >= 1) {
1463 /* assume a breakpoint number */
1464 bp = &bpts[a-1]; /* bp nums are 1 based */
1466 /* assume a breakpoint address */
1467 bp = at_breakpoint(a);
1469 printf("No breakpoint at %lx\n", a);
1474 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1475 xmon_print_symbol(bp->address, " ", ")\n");
1483 printf(breakpoint_help_string);
1488 if (xmon_is_ro || !scanhex(&a)) {
1489 /* print all breakpoints */
1490 printf(" type address\n");
1492 printf(" data "REG" [", dabr.address);
1493 if (dabr.enabled & 1)
1495 if (dabr.enabled & 2)
1499 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1502 printf("%tx %s ", BP_NUM(bp),
1503 (bp->enabled & BP_CIABR) ? "inst": "trap");
1504 xmon_print_symbol(bp->address, " ", "\n");
1509 if (!check_bp_loc(a))
1511 bp = new_breakpoint(a);
1513 bp->enabled |= BP_TRAP;
1514 force_enable_xmon();
1520 /* Very cheap human name for vector lookup. */
1522 const char *getvecname(unsigned long vec)
1527 case 0x100: ret = "(System Reset)"; break;
1528 case 0x200: ret = "(Machine Check)"; break;
1529 case 0x300: ret = "(Data Access)"; break;
1531 if (radix_enabled())
1532 ret = "(Data Access Out of Range)";
1534 ret = "(Data SLB Access)";
1536 case 0x400: ret = "(Instruction Access)"; break;
1538 if (radix_enabled())
1539 ret = "(Instruction Access Out of Range)";
1541 ret = "(Instruction SLB Access)";
1543 case 0x500: ret = "(Hardware Interrupt)"; break;
1544 case 0x600: ret = "(Alignment)"; break;
1545 case 0x700: ret = "(Program Check)"; break;
1546 case 0x800: ret = "(FPU Unavailable)"; break;
1547 case 0x900: ret = "(Decrementer)"; break;
1548 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1549 case 0xa00: ret = "(Doorbell)"; break;
1550 case 0xc00: ret = "(System Call)"; break;
1551 case 0xd00: ret = "(Single Step)"; break;
1552 case 0xe40: ret = "(Emulation Assist)"; break;
1553 case 0xe60: ret = "(HMI)"; break;
1554 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1555 case 0xf00: ret = "(Performance Monitor)"; break;
1556 case 0xf20: ret = "(Altivec Unavailable)"; break;
1557 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1558 case 0x1500: ret = "(Denormalisation)"; break;
1559 case 0x1700: ret = "(Altivec Assist)"; break;
1565 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1566 unsigned long *endp)
1568 unsigned long size, offset;
1571 *startp = *endp = 0;
1574 if (setjmp(bus_error_jmp) == 0) {
1575 catch_memory_errors = 1;
1577 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1579 *startp = pc - offset;
1580 *endp = pc - offset + size;
1584 catch_memory_errors = 0;
1587 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1588 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1590 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1593 int max_to_print = 64;
1595 unsigned long newsp;
1596 unsigned long marker;
1597 struct pt_regs regs;
1599 while (max_to_print--) {
1600 if (!is_kernel_addr(sp)) {
1602 printf("SP (%lx) is in userspace\n", sp);
1606 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1607 || !mread(sp, &newsp, sizeof(unsigned long))) {
1608 printf("Couldn't read stack frame at %lx\n", sp);
1613 * For the first stack frame, try to work out if
1614 * LR and/or the saved LR value in the bottommost
1615 * stack frame are valid.
1617 if ((pc | lr) != 0) {
1618 unsigned long fnstart, fnend;
1619 unsigned long nextip;
1622 get_function_bounds(pc, &fnstart, &fnend);
1625 mread(newsp + LRSAVE_OFFSET, &nextip,
1626 sizeof(unsigned long));
1628 if (!is_kernel_addr(lr)
1629 || (fnstart <= lr && lr < fnend))
1631 } else if (lr == nextip) {
1633 } else if (is_kernel_addr(lr)
1634 && !(fnstart <= lr && lr < fnend)) {
1635 printf("[link register ] ");
1636 xmon_print_symbol(lr, " ", "\n");
1639 printf("["REG"] ", sp);
1640 xmon_print_symbol(ip, " ", " (unreliable)\n");
1645 printf("["REG"] ", sp);
1646 xmon_print_symbol(ip, " ", "\n");
1649 /* Look for "regshere" marker to see if this is
1650 an exception frame. */
1651 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1652 && marker == STACK_FRAME_REGS_MARKER) {
1653 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1655 printf("Couldn't read registers at %lx\n",
1656 sp + STACK_FRAME_OVERHEAD);
1659 printf("--- Exception: %lx %s at ", regs.trap,
1660 getvecname(TRAP(®s)));
1663 xmon_print_symbol(pc, " ", "\n");
1673 static void backtrace(struct pt_regs *excp)
1678 xmon_show_stack(sp, 0, 0);
1680 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1684 static void print_bug_trap(struct pt_regs *regs)
1687 const struct bug_entry *bug;
1690 if (regs->msr & MSR_PR)
1691 return; /* not in kernel */
1692 addr = regs->nip; /* address of trap instruction */
1693 if (!is_kernel_addr(addr))
1695 bug = find_bug(regs->nip);
1698 if (is_warning_bug(bug))
1701 #ifdef CONFIG_DEBUG_BUGVERBOSE
1702 printf("kernel BUG at %s:%u!\n",
1703 bug->file, bug->line);
1705 printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1707 #endif /* CONFIG_BUG */
1710 static void excprint(struct pt_regs *fp)
1715 printf("cpu 0x%x: ", smp_processor_id());
1716 #endif /* CONFIG_SMP */
1719 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1721 xmon_print_symbol(fp->nip, ": ", "\n");
1724 xmon_print_symbol(fp->link, ": ", "\n");
1726 printf(" sp: %lx\n", fp->gpr[1]);
1727 printf(" msr: %lx\n", fp->msr);
1729 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1730 printf(" dar: %lx\n", fp->dar);
1732 printf(" dsisr: %lx\n", fp->dsisr);
1735 printf(" current = 0x%px\n", current);
1737 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1738 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1741 printf(" pid = %d, comm = %s\n",
1742 current->pid, current->comm);
1748 printf(linux_banner);
1751 static void prregs(struct pt_regs *fp)
1755 struct pt_regs regs;
1757 if (scanhex(&base)) {
1758 if (setjmp(bus_error_jmp) == 0) {
1759 catch_memory_errors = 1;
1761 regs = *(struct pt_regs *)base;
1765 catch_memory_errors = 0;
1766 printf("*** Error reading registers from "REG"\n",
1770 catch_memory_errors = 0;
1775 if (FULL_REGS(fp)) {
1776 for (n = 0; n < 16; ++n)
1777 printf("R%.2d = "REG" R%.2d = "REG"\n",
1778 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1780 for (n = 0; n < 7; ++n)
1781 printf("R%.2d = "REG" R%.2d = "REG"\n",
1782 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1785 for (n = 0; n < 32; ++n) {
1786 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1787 (n & 3) == 3? "\n": " ");
1788 if (n == 12 && !FULL_REGS(fp)) {
1795 xmon_print_symbol(fp->nip, " ", "\n");
1796 if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1798 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1801 xmon_print_symbol(fp->link, " ", "\n");
1802 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1803 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1804 fp->ctr, fp->xer, fp->trap);
1806 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1807 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1810 static void cacheflush(void)
1813 unsigned long nflush;
1818 scanhex((void *)&adrs);
1823 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1824 if (setjmp(bus_error_jmp) == 0) {
1825 catch_memory_errors = 1;
1829 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1830 cflush((void *) adrs);
1832 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1833 cinval((void *) adrs);
1836 /* wait a little while to see if we get a machine check */
1839 catch_memory_errors = 0;
1842 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1843 extern void xmon_mtspr(int spr, unsigned long value);
1846 read_spr(int n, unsigned long *vp)
1848 unsigned long ret = -1UL;
1851 if (setjmp(bus_error_jmp) == 0) {
1852 catch_spr_faults = 1;
1855 ret = xmon_mfspr(n, *vp);
1861 catch_spr_faults = 0;
1867 write_spr(int n, unsigned long val)
1870 printf(xmon_ro_msg);
1874 if (setjmp(bus_error_jmp) == 0) {
1875 catch_spr_faults = 1;
1882 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1884 catch_spr_faults = 0;
1887 static void dump_206_sprs(void)
1890 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1893 /* Actually some of these pre-date 2.06, but whatevs */
1895 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1896 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1897 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1898 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1899 printf("amr = %.16lx uamor = %.16lx\n",
1900 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1902 if (!(mfmsr() & MSR_HV))
1905 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1906 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1907 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1908 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1909 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1910 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1911 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1912 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1913 printf("dabr = %.16lx dabrx = %.16lx\n",
1914 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1918 static void dump_207_sprs(void)
1923 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1926 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1927 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1929 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1930 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1934 /* Only if TM has been enabled in the kernel */
1935 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1936 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1937 mfspr(SPRN_TEXASR));
1940 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1941 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1942 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1943 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1944 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1945 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1946 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1947 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1948 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1949 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1950 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1951 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1953 if (!(msr & MSR_HV))
1956 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1957 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1958 printf("dawr = %.16lx dawrx = %.16lx ciabr = %.16lx\n",
1959 mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0), mfspr(SPRN_CIABR));
1963 static void dump_300_sprs(void)
1966 bool hv = mfmsr() & MSR_HV;
1968 if (!cpu_has_feature(CPU_FTR_ARCH_300))
1971 printf("pidr = %.16lx tidr = %.16lx\n",
1972 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
1973 printf("psscr = %.16lx\n",
1974 hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
1979 printf("ptcr = %.16lx asdr = %.16lx\n",
1980 mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
1984 static void dump_one_spr(int spr, bool show_unimplemented)
1989 if (!read_spr(spr, &val)) {
1990 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1994 if (val == 0xdeadbeef) {
1995 /* Looks like read was a nop, confirm */
1997 if (!read_spr(spr, &val)) {
1998 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2002 if (val == 0x0badcafe) {
2003 if (show_unimplemented)
2004 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2009 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2012 static void super_regs(void)
2014 static unsigned long regno;
2022 unsigned long sp, toc;
2023 asm("mr %0,1" : "=r" (sp) :);
2024 asm("mr %0,2" : "=r" (toc) :);
2026 printf("msr = "REG" sprg0 = "REG"\n",
2027 mfmsr(), mfspr(SPRN_SPRG0));
2028 printf("pvr = "REG" sprg1 = "REG"\n",
2029 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2030 printf("dec = "REG" sprg2 = "REG"\n",
2031 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2032 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2033 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
2045 read_spr(regno, &val);
2047 write_spr(regno, val);
2048 dump_one_spr(regno, true);
2053 dump_one_spr(regno, true);
2057 for (spr = 1; spr < 1024; ++spr)
2058 dump_one_spr(spr, false);
2066 * Stuff for reading and writing memory safely
2069 mread(unsigned long adrs, void *buf, int size)
2075 if (setjmp(bus_error_jmp) == 0) {
2076 catch_memory_errors = 1;
2082 *(u16 *)q = *(u16 *)p;
2085 *(u32 *)q = *(u32 *)p;
2088 *(u64 *)q = *(u64 *)p;
2091 for( ; n < size; ++n) {
2097 /* wait a little while to see if we get a machine check */
2101 catch_memory_errors = 0;
2106 mwrite(unsigned long adrs, void *buf, int size)
2114 printf(xmon_ro_msg);
2118 if (setjmp(bus_error_jmp) == 0) {
2119 catch_memory_errors = 1;
2125 *(u16 *)p = *(u16 *)q;
2128 *(u32 *)p = *(u32 *)q;
2131 *(u64 *)p = *(u64 *)q;
2134 for ( ; n < size; ++n) {
2140 /* wait a little while to see if we get a machine check */
2144 printf("*** Error writing address "REG"\n", adrs + n);
2146 catch_memory_errors = 0;
2151 mread_instr(unsigned long adrs, struct ppc_inst *instr)
2156 if (setjmp(bus_error_jmp) == 0) {
2157 catch_memory_errors = 1;
2159 *instr = ppc_inst_read((struct ppc_inst *)adrs);
2161 /* wait a little while to see if we get a machine check */
2163 n = ppc_inst_len(*instr);
2165 catch_memory_errors = 0;
2169 static int fault_type;
2170 static int fault_except;
2171 static char *fault_chars[] = { "--", "**", "##" };
2173 static int handle_fault(struct pt_regs *regs)
2175 fault_except = TRAP(regs);
2176 switch (TRAP(regs)) {
2188 longjmp(bus_error_jmp, 1);
2193 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2196 byterev(unsigned char *val, int size)
2202 SWAP(val[0], val[1], t);
2205 SWAP(val[0], val[3], t);
2206 SWAP(val[1], val[2], t);
2208 case 8: /* is there really any use for this? */
2209 SWAP(val[0], val[7], t);
2210 SWAP(val[1], val[6], t);
2211 SWAP(val[2], val[5], t);
2212 SWAP(val[3], val[4], t);
2220 static char *memex_help_string =
2221 "Memory examine command usage:\n"
2222 "m [addr] [flags] examine/change memory\n"
2223 " addr is optional. will start where left off.\n"
2224 " flags may include chars from this set:\n"
2225 " b modify by bytes (default)\n"
2226 " w modify by words (2 byte)\n"
2227 " l modify by longs (4 byte)\n"
2228 " d modify by doubleword (8 byte)\n"
2229 " r toggle reverse byte order mode\n"
2230 " n do not read memory (for i/o spaces)\n"
2231 " . ok to read (default)\n"
2232 "NOTE: flags are saved as defaults\n"
2235 static char *memex_subcmd_help_string =
2236 "Memory examine subcommands:\n"
2237 " hexval write this val to current location\n"
2238 " 'string' write chars from string to this location\n"
2239 " ' increment address\n"
2240 " ^ decrement address\n"
2241 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2242 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2243 " ` clear no-read flag\n"
2244 " ; stay at this addr\n"
2245 " v change to byte mode\n"
2246 " w change to word (2 byte) mode\n"
2247 " l change to long (4 byte) mode\n"
2248 " u change to doubleword (8 byte) mode\n"
2249 " m addr change current addr\n"
2250 " n toggle no-read flag\n"
2251 " r toggle byte reverse flag\n"
2252 " < count back up count bytes\n"
2253 " > count skip forward count bytes\n"
2254 " x exit this mode\n"
2260 int cmd, inc, i, nslash;
2262 unsigned char val[16];
2264 scanhex((void *)&adrs);
2267 printf(memex_help_string);
2273 while ((cmd = skipbl()) != '\n') {
2275 case 'b': size = 1; break;
2276 case 'w': size = 2; break;
2277 case 'l': size = 4; break;
2278 case 'd': size = 8; break;
2279 case 'r': brev = !brev; break;
2280 case 'n': mnoread = 1; break;
2281 case '.': mnoread = 0; break;
2290 n = mread(adrs, val, size);
2291 printf(REG"%c", adrs, brev? 'r': ' ');
2296 for (i = 0; i < n; ++i)
2297 printf("%.2x", val[i]);
2298 for (; i < size; ++i)
2299 printf("%s", fault_chars[fault_type]);
2306 for (i = 0; i < size; ++i)
2307 val[i] = n >> (i * 8);
2310 mwrite(adrs, val, size);
2323 else if( n == '\'' )
2325 for (i = 0; i < size; ++i)
2326 val[i] = n >> (i * 8);
2329 mwrite(adrs, val, size);
2365 adrs -= 1 << nslash;
2369 adrs += 1 << nslash;
2373 adrs += 1 << -nslash;
2377 adrs -= 1 << -nslash;
2380 scanhex((void *)&adrs);
2399 printf(memex_subcmd_help_string);
2414 case 'n': c = '\n'; break;
2415 case 'r': c = '\r'; break;
2416 case 'b': c = '\b'; break;
2417 case 't': c = '\t'; break;
2422 static void xmon_rawdump (unsigned long adrs, long ndump)
2425 unsigned char temp[16];
2427 for (n = ndump; n > 0;) {
2429 nr = mread(adrs, temp, r);
2431 for (m = 0; m < r; ++m) {
2433 printf("%.2x", temp[m]);
2435 printf("%s", fault_chars[fault_type]);
2444 static void dump_tracing(void)
2450 ftrace_dump(DUMP_ORIG);
2452 ftrace_dump(DUMP_ALL);
2456 static void dump_one_paca(int cpu)
2458 struct paca_struct *p;
2459 #ifdef CONFIG_PPC_BOOK3S_64
2463 if (setjmp(bus_error_jmp) != 0) {
2464 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2468 catch_memory_errors = 1;
2473 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2475 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2476 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2477 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2479 #define DUMP(paca, name, format) \
2480 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2481 offsetof(struct paca_struct, name));
2483 DUMP(p, lock_token, "%#-*x");
2484 DUMP(p, paca_index, "%#-*x");
2485 DUMP(p, kernel_toc, "%#-*llx");
2486 DUMP(p, kernelbase, "%#-*llx");
2487 DUMP(p, kernel_msr, "%#-*llx");
2488 DUMP(p, emergency_sp, "%-*px");
2489 #ifdef CONFIG_PPC_BOOK3S_64
2490 DUMP(p, nmi_emergency_sp, "%-*px");
2491 DUMP(p, mc_emergency_sp, "%-*px");
2492 DUMP(p, in_nmi, "%#-*x");
2493 DUMP(p, in_mce, "%#-*x");
2494 DUMP(p, hmi_event_available, "%#-*x");
2496 DUMP(p, data_offset, "%#-*llx");
2497 DUMP(p, hw_cpu_id, "%#-*x");
2498 DUMP(p, cpu_start, "%#-*x");
2499 DUMP(p, kexec_state, "%#-*x");
2500 #ifdef CONFIG_PPC_BOOK3S_64
2501 if (!early_radix_enabled()) {
2502 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2505 if (!p->slb_shadow_ptr)
2508 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2509 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2512 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2513 22, "slb_shadow", i, esid, vsid);
2516 DUMP(p, vmalloc_sllp, "%#-*x");
2517 DUMP(p, stab_rr, "%#-*x");
2518 DUMP(p, slb_used_bitmap, "%#-*x");
2519 DUMP(p, slb_kern_bitmap, "%#-*x");
2521 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2522 DUMP(p, slb_cache_ptr, "%#-*x");
2523 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2524 printf(" %-*s[%d] = 0x%016x\n",
2525 22, "slb_cache", i, p->slb_cache[i]);
2529 DUMP(p, rfi_flush_fallback_area, "%-*px");
2531 DUMP(p, dscr_default, "%#-*llx");
2532 #ifdef CONFIG_PPC_BOOK3E
2533 DUMP(p, pgd, "%-*px");
2534 DUMP(p, kernel_pgd, "%-*px");
2535 DUMP(p, tcd_ptr, "%-*px");
2536 DUMP(p, mc_kstack, "%-*px");
2537 DUMP(p, crit_kstack, "%-*px");
2538 DUMP(p, dbg_kstack, "%-*px");
2540 DUMP(p, __current, "%-*px");
2541 DUMP(p, kstack, "%#-*llx");
2542 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2543 #ifdef CONFIG_STACKPROTECTOR
2544 DUMP(p, canary, "%#-*lx");
2546 DUMP(p, saved_r1, "%#-*llx");
2547 #ifdef CONFIG_PPC_BOOK3E
2548 DUMP(p, trap_save, "%#-*x");
2550 DUMP(p, irq_soft_mask, "%#-*x");
2551 DUMP(p, irq_happened, "%#-*x");
2552 #ifdef CONFIG_MMIOWB
2553 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2554 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2556 DUMP(p, irq_work_pending, "%#-*x");
2557 DUMP(p, sprg_vdso, "%#-*llx");
2559 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2560 DUMP(p, tm_scratch, "%#-*llx");
2563 #ifdef CONFIG_PPC_POWERNV
2564 DUMP(p, idle_state, "%#-*lx");
2565 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2566 DUMP(p, thread_idle_state, "%#-*x");
2567 DUMP(p, subcore_sibling_mask, "%#-*x");
2569 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2570 DUMP(p, requested_psscr, "%#-*llx");
2571 DUMP(p, dont_stop.counter, "%#-*x");
2576 DUMP(p, accounting.utime, "%#-*lx");
2577 DUMP(p, accounting.stime, "%#-*lx");
2578 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2579 DUMP(p, accounting.utime_scaled, "%#-*lx");
2581 DUMP(p, accounting.starttime, "%#-*lx");
2582 DUMP(p, accounting.starttime_user, "%#-*lx");
2583 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2584 DUMP(p, accounting.startspurr, "%#-*lx");
2585 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2587 DUMP(p, accounting.steal_time, "%#-*lx");
2590 catch_memory_errors = 0;
2594 static void dump_all_pacas(void)
2598 if (num_possible_cpus() == 0) {
2599 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2603 for_each_possible_cpu(cpu)
2607 static void dump_pacas(void)
2618 termch = c; /* Put c back, it wasn't 'a' */
2623 dump_one_paca(xmon_owner);
2627 #ifdef CONFIG_PPC_POWERNV
2628 static void dump_one_xive(int cpu)
2630 unsigned int hwid = get_hard_smp_processor_id(cpu);
2631 bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2634 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2635 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2636 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2637 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2638 opal_xive_dump(XIVE_DUMP_VP, hwid);
2639 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2642 if (setjmp(bus_error_jmp) != 0) {
2643 catch_memory_errors = 0;
2644 printf("*** Error dumping xive on cpu %d\n", cpu);
2648 catch_memory_errors = 1;
2650 xmon_xive_do_dump(cpu);
2653 catch_memory_errors = 0;
2656 static void dump_all_xives(void)
2660 if (num_possible_cpus() == 0) {
2661 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2665 for_each_possible_cpu(cpu)
2669 static void dump_one_xive_irq(u32 num, struct irq_data *d)
2671 xmon_xive_get_irq_config(num, d);
2674 static void dump_all_xive_irq(void)
2677 struct irq_desc *desc;
2679 for_each_irq_desc(i, desc) {
2680 struct irq_data *d = irq_desc_get_irq_data(desc);
2686 hwirq = (unsigned int)irqd_to_hwirq(d);
2687 /* IPIs are special (HW number 0) */
2689 dump_one_xive_irq(hwirq, d);
2693 static void dump_xives(void)
2698 if (!xive_enabled()) {
2699 printf("Xive disabled on this system\n");
2707 } else if (c == 'i') {
2709 dump_one_xive_irq(num, NULL);
2711 dump_all_xive_irq();
2715 termch = c; /* Put c back, it wasn't 'a' */
2720 dump_one_xive(xmon_owner);
2722 #endif /* CONFIG_PPC_POWERNV */
2724 static void dump_by_size(unsigned long addr, long count, int size)
2726 unsigned char temp[16];
2730 count = ALIGN(count, 16);
2732 for (i = 0; i < count; i += 16, addr += 16) {
2735 if (mread(addr, temp, 16) != 16) {
2736 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2740 for (j = 0; j < 16; j += size) {
2743 case 1: val = temp[j]; break;
2744 case 2: val = *(u16 *)&temp[j]; break;
2745 case 4: val = *(u32 *)&temp[j]; break;
2746 case 8: val = *(u64 *)&temp[j]; break;
2750 printf("%0*llx", size * 2, val);
2753 for (j = 0; j < 16; ++j) {
2755 putchar(' ' <= val && val <= '~' ? val : '.');
2764 static char last[] = { "d?\n" };
2771 xmon_start_pagination();
2773 xmon_end_pagination();
2777 #ifdef CONFIG_PPC_POWERNV
2779 xmon_start_pagination();
2781 xmon_end_pagination();
2794 scanhex((void *)&adrs);
2801 else if (nidump > MAX_IDUMP)
2803 adrs += ppc_inst_dump(adrs, nidump, 1);
2805 } else if (c == 'l') {
2807 } else if (c == 'o') {
2809 } else if (c == 'v') {
2810 /* dump virtual to physical translation */
2812 } else if (c == 'r') {
2816 xmon_rawdump(adrs, ndump);
2823 else if (ndump > MAX_DUMP)
2831 ndump = ALIGN(ndump, 16);
2832 dump_by_size(adrs, ndump, c - '0');
2837 prdump(adrs, ndump);
2846 prdump(unsigned long adrs, long ndump)
2848 long n, m, c, r, nr;
2849 unsigned char temp[16];
2851 for (n = ndump; n > 0;) {
2855 nr = mread(adrs, temp, r);
2857 for (m = 0; m < r; ++m) {
2858 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2861 printf("%.2x", temp[m]);
2863 printf("%s", fault_chars[fault_type]);
2865 for (; m < 16; ++m) {
2866 if ((m & (sizeof(long) - 1)) == 0)
2871 for (m = 0; m < r; ++m) {
2874 putchar(' ' <= c && c <= '~'? c: '.');
2887 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2890 generic_inst_dump(unsigned long adr, long count, int praddr,
2891 instruction_dump_func dump_func)
2894 unsigned long first_adr;
2895 struct ppc_inst inst, last_inst = ppc_inst(0);
2896 unsigned char val[4];
2899 for (first_adr = adr; count > 0; --count, adr += 4) {
2900 nr = mread(adr, val, 4);
2903 const char *x = fault_chars[fault_type];
2904 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2908 inst = ppc_inst(GETWORD(val));
2909 if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
2919 printf(REG" %.8x", adr, ppc_inst_val(inst));
2921 dump_func(ppc_inst_val(inst), adr);
2924 return adr - first_adr;
2928 ppc_inst_dump(unsigned long adr, long count, int praddr)
2930 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2934 print_address(unsigned long addr)
2936 xmon_print_symbol(addr, "\t# ", "");
2942 struct kmsg_dumper dumper = { .active = 1 };
2943 unsigned char buf[128];
2946 if (setjmp(bus_error_jmp) != 0) {
2947 printf("Error dumping printk buffer!\n");
2951 catch_memory_errors = 1;
2954 kmsg_dump_rewind_nolock(&dumper);
2955 xmon_start_pagination();
2956 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2960 xmon_end_pagination();
2963 /* wait a little while to see if we get a machine check */
2965 catch_memory_errors = 0;
2968 #ifdef CONFIG_PPC_POWERNV
2969 static void dump_opal_msglog(void)
2971 unsigned char buf[128];
2975 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
2976 printf("Machine is not running OPAL firmware.\n");
2980 if (setjmp(bus_error_jmp) != 0) {
2981 printf("Error dumping OPAL msglog!\n");
2985 catch_memory_errors = 1;
2988 xmon_start_pagination();
2989 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
2991 printf("Error dumping OPAL msglog! Error: %zd\n", res);
2998 xmon_end_pagination();
3001 /* wait a little while to see if we get a machine check */
3003 catch_memory_errors = 0;
3008 * Memory operations - move, set, print differences
3010 static unsigned long mdest; /* destination address */
3011 static unsigned long msrc; /* source address */
3012 static unsigned long mval; /* byte value to set memory to */
3013 static unsigned long mcount; /* # bytes to affect */
3014 static unsigned long mdiffs; /* max # differences to print */
3019 scanhex((void *)&mdest);
3020 if( termch != '\n' )
3022 scanhex((void *)(cmd == 's'? &mval: &msrc));
3023 if( termch != '\n' )
3025 scanhex((void *)&mcount);
3029 printf(xmon_ro_msg);
3032 memmove((void *)mdest, (void *)msrc, mcount);
3036 printf(xmon_ro_msg);
3039 memset((void *)mdest, mval, mcount);
3042 if( termch != '\n' )
3044 scanhex((void *)&mdiffs);
3045 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3051 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3056 for( n = nb; n > 0; --n )
3057 if( *p1++ != *p2++ )
3058 if( ++prt <= maxpr )
3059 printf("%px %.2x # %px %.2x\n", p1 - 1,
3060 p1[-1], p2 - 1, p2[-1]);
3062 printf("Total of %d differences\n", prt);
3065 static unsigned mend;
3066 static unsigned mask;
3072 unsigned char val[4];
3075 scanhex((void *)&mdest);
3076 if (termch != '\n') {
3078 scanhex((void *)&mend);
3079 if (termch != '\n') {
3081 scanhex((void *)&mval);
3083 if (termch != '\n') termch = 0;
3084 scanhex((void *)&mask);
3088 for (a = mdest; a < mend; a += 4) {
3089 if (mread(a, val, 4) == 4
3090 && ((GETWORD(val) ^ mval) & mask) == 0) {
3091 printf("%.16x: %.16x\n", a, GETWORD(val));
3098 static unsigned long mskip = 0x1000;
3099 static unsigned long mlim = 0xffffffff;
3109 if (termch != '\n') termch = 0;
3111 if (termch != '\n') termch = 0;
3114 for (a = mdest; a < mlim; a += mskip) {
3115 ok = mread(a, &v, 1);
3117 printf("%.8x .. ", a);
3118 } else if (!ok && ook)
3119 printf("%.8lx\n", a - mskip);
3125 printf("%.8lx\n", a - mskip);
3128 static void show_task(struct task_struct *tsk)
3133 * Cloned from kdb_task_state_char(), which is not entirely
3134 * appropriate for calling from xmon. This could be moved
3135 * to a common, generic, routine used by both.
3137 state = (tsk->state == 0) ? 'R' :
3138 (tsk->state < 0) ? 'U' :
3139 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3140 (tsk->state & TASK_STOPPED) ? 'T' :
3141 (tsk->state & TASK_TRACED) ? 'C' :
3142 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3143 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3144 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3146 printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
3148 tsk->pid, rcu_dereference(tsk->parent)->pid,
3149 state, task_cpu(tsk),
3153 #ifdef CONFIG_PPC_BOOK3S_64
3154 static void format_pte(void *ptep, unsigned long pte)
3156 pte_t entry = __pte(pte);
3158 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3159 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3161 printf("Flags = %s%s%s%s%s\n",
3162 pte_young(entry) ? "Accessed " : "",
3163 pte_dirty(entry) ? "Dirty " : "",
3164 pte_read(entry) ? "Read " : "",
3165 pte_write(entry) ? "Write " : "",
3166 pte_exec(entry) ? "Exec " : "");
3169 static void show_pte(unsigned long addr)
3171 unsigned long tskv = 0;
3172 struct task_struct *tsk = NULL;
3173 struct mm_struct *mm;
3174 pgd_t *pgdp, *pgdir;
3179 if (!scanhex(&tskv))
3182 tsk = (struct task_struct *)tskv;
3187 mm = tsk->active_mm;
3189 if (setjmp(bus_error_jmp) != 0) {
3190 catch_memory_errors = 0;
3191 printf("*** Error dumping pte for task %px\n", tsk);
3195 catch_memory_errors = 1;
3198 if (mm == &init_mm) {
3199 pgdp = pgd_offset_k(addr);
3200 pgdir = pgd_offset_k(0);
3202 pgdp = pgd_offset(mm, addr);
3203 pgdir = pgd_offset(mm, 0);
3206 if (pgd_none(*pgdp)) {
3207 printf("no linux page table for address\n");
3211 printf("pgd @ 0x%px\n", pgdir);
3213 if (pgd_is_leaf(*pgdp)) {
3214 format_pte(pgdp, pgd_val(*pgdp));
3217 printf("pgdp @ 0x%px = 0x%016lx\n", pgdp, pgd_val(*pgdp));
3219 pudp = pud_offset(pgdp, addr);
3221 if (pud_none(*pudp)) {
3222 printf("No valid PUD\n");
3226 if (pud_is_leaf(*pudp)) {
3227 format_pte(pudp, pud_val(*pudp));
3231 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3233 pmdp = pmd_offset(pudp, addr);
3235 if (pmd_none(*pmdp)) {
3236 printf("No valid PMD\n");
3240 if (pmd_is_leaf(*pmdp)) {
3241 format_pte(pmdp, pmd_val(*pmdp));
3244 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3246 ptep = pte_offset_map(pmdp, addr);
3247 if (pte_none(*ptep)) {
3248 printf("no valid PTE\n");
3252 format_pte(ptep, pte_val(*ptep));
3256 catch_memory_errors = 0;
3259 static void show_pte(unsigned long addr)
3261 printf("show_pte not yet implemented\n");
3263 #endif /* CONFIG_PPC_BOOK3S_64 */
3265 static void show_tasks(void)
3268 struct task_struct *tsk = NULL;
3270 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
3273 tsk = (struct task_struct *)tskv;
3275 if (setjmp(bus_error_jmp) != 0) {
3276 catch_memory_errors = 0;
3277 printf("*** Error dumping task %px\n", tsk);
3281 catch_memory_errors = 1;
3287 for_each_process(tsk)
3292 catch_memory_errors = 0;
3295 static void proccall(void)
3297 unsigned long args[8];
3300 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3301 unsigned long, unsigned long, unsigned long,
3302 unsigned long, unsigned long, unsigned long);
3305 if (!scanhex(&adrs))
3309 for (i = 0; i < 8; ++i)
3311 for (i = 0; i < 8; ++i) {
3312 if (!scanhex(&args[i]) || termch == '\n')
3316 func = (callfunc_t) adrs;
3318 if (setjmp(bus_error_jmp) == 0) {
3319 catch_memory_errors = 1;
3321 ret = func(args[0], args[1], args[2], args[3],
3322 args[4], args[5], args[6], args[7]);
3324 printf("return value is 0x%lx\n", ret);
3326 printf("*** %x exception occurred\n", fault_except);
3328 catch_memory_errors = 0;
3331 /* Input scanning routines */
3342 while( c == ' ' || c == '\t' )
3348 static const char *regnames[N_PTREGS] = {
3349 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3350 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3351 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3352 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3353 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3359 "trap", "dar", "dsisr", "res"
3363 scanhex(unsigned long *vp)
3370 /* parse register name */
3374 for (i = 0; i < sizeof(regname) - 1; ++i) {
3383 i = match_string(regnames, N_PTREGS, regname);
3385 printf("invalid register name '%%%s'\n", regname);
3388 if (xmon_regs == NULL) {
3389 printf("regs not available\n");
3392 *vp = ((unsigned long *)xmon_regs)[i];
3396 /* skip leading "0x" if any */
3410 } else if (c == '$') {
3412 for (i=0; i<63; i++) {
3414 if (isspace(c) || c == '\0') {
3422 if (setjmp(bus_error_jmp) == 0) {
3423 catch_memory_errors = 1;
3425 *vp = kallsyms_lookup_name(tmpstr);
3428 catch_memory_errors = 0;
3430 printf("unknown symbol '%s'\n", tmpstr);
3463 static int hexdigit(int c)
3465 if( '0' <= c && c <= '9' )
3467 if( 'A' <= c && c <= 'F' )
3468 return c - ('A' - 10);
3469 if( 'a' <= c && c <= 'f' )
3470 return c - ('a' - 10);
3475 getstring(char *s, int size)
3491 } while( c != ' ' && c != '\t' && c != '\n' );
3496 static char line[256];
3497 static char *lineptr;
3508 if (lineptr == NULL || *lineptr == 0) {
3509 if (xmon_gets(line, sizeof(line)) == NULL) {
3519 take_input(char *str)
3528 int type = inchar();
3529 unsigned long addr, cpu;
3530 void __percpu *ptr = NULL;
3531 static char tmp[64];
3536 xmon_print_symbol(addr, ": ", "\n");
3541 if (setjmp(bus_error_jmp) == 0) {
3542 catch_memory_errors = 1;
3544 addr = kallsyms_lookup_name(tmp);
3546 printf("%s: %lx\n", tmp, addr);
3548 printf("Symbol '%s' not found.\n", tmp);
3551 catch_memory_errors = 0;
3556 if (setjmp(bus_error_jmp) == 0) {
3557 catch_memory_errors = 1;
3559 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3564 ptr >= (void __percpu *)__per_cpu_start &&
3565 ptr < (void __percpu *)__per_cpu_end)
3567 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3568 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3570 cpu = raw_smp_processor_id();
3571 addr = (unsigned long)this_cpu_ptr(ptr);
3574 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3576 printf("Percpu symbol '%s' not found.\n", tmp);
3579 catch_memory_errors = 0;
3586 /* Print an address in numeric and symbolic form (if possible) */
3587 static void xmon_print_symbol(unsigned long address, const char *mid,
3591 const char *name = NULL;
3592 unsigned long offset, size;
3594 printf(REG, address);
3595 if (setjmp(bus_error_jmp) == 0) {
3596 catch_memory_errors = 1;
3598 name = kallsyms_lookup(address, &size, &offset, &modname,
3601 /* wait a little while to see if we get a machine check */
3605 catch_memory_errors = 0;
3608 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3610 printf(" [%s]", modname);
3612 printf("%s", after);
3615 #ifdef CONFIG_PPC_BOOK3S_64
3616 void dump_segments(void)
3619 unsigned long esid,vsid;
3622 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3624 for (i = 0; i < mmu_slb_size; i++) {
3625 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3626 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3631 printf("%02d %016lx %016lx", i, esid, vsid);
3633 if (!(esid & SLB_ESID_V)) {
3638 llp = vsid & SLB_VSID_LLP;
3639 if (vsid & SLB_VSID_B_1T) {
3640 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3642 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3645 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3647 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3654 #ifdef CONFIG_PPC_BOOK3S_32
3655 void dump_segments(void)
3660 for (i = 0; i < 16; ++i)
3661 printf(" %x", mfsrin(i << 28));
3667 static void dump_tlb_44x(void)
3671 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3672 unsigned long w0,w1,w2;
3673 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3674 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3675 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3676 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3677 if (w0 & PPC44x_TLB_VALID) {
3678 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3679 w0 & PPC44x_TLB_EPN_MASK,
3680 w1 & PPC44x_TLB_ERPN_MASK,
3681 w1 & PPC44x_TLB_RPN_MASK,
3682 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3683 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3684 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3685 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3686 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3691 #endif /* CONFIG_44x */
3693 #ifdef CONFIG_PPC_BOOK3E
3694 static void dump_tlb_book3e(void)
3696 u32 mmucfg, pidmask, lpidmask;
3698 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3700 static const char *pgsz_names[] = {
3735 /* Gather some infos about the MMU */
3736 mmucfg = mfspr(SPRN_MMUCFG);
3737 mmu_version = (mmucfg & 3) + 1;
3738 ntlbs = ((mmucfg >> 2) & 3) + 1;
3739 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3740 lpidsz = (mmucfg >> 24) & 0xf;
3741 rasz = (mmucfg >> 16) & 0x7f;
3742 if ((mmu_version > 1) && (mmucfg & 0x10000))
3744 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3745 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3746 pidmask = (1ul << pidsz) - 1;
3747 lpidmask = (1ul << lpidsz) - 1;
3748 ramask = (1ull << rasz) - 1;
3750 for (tlb = 0; tlb < ntlbs; tlb++) {
3752 int nent, assoc, new_cc = 1;
3753 printf("TLB %d:\n------\n", tlb);
3756 tlbcfg = mfspr(SPRN_TLB0CFG);
3759 tlbcfg = mfspr(SPRN_TLB1CFG);
3762 tlbcfg = mfspr(SPRN_TLB2CFG);
3765 tlbcfg = mfspr(SPRN_TLB3CFG);
3768 printf("Unsupported TLB number !\n");
3771 nent = tlbcfg & 0xfff;
3772 assoc = (tlbcfg >> 24) & 0xff;
3773 for (i = 0; i < nent; i++) {
3774 u32 mas0 = MAS0_TLBSEL(tlb);
3775 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3778 int esel = i, cc = i;
3786 mas0 |= MAS0_ESEL(esel);
3787 mtspr(SPRN_MAS0, mas0);
3788 mtspr(SPRN_MAS1, mas1);
3789 mtspr(SPRN_MAS2, mas2);
3790 asm volatile("tlbre 0,0,0" : : : "memory");
3791 mas1 = mfspr(SPRN_MAS1);
3792 mas2 = mfspr(SPRN_MAS2);
3793 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3794 if (assoc && (i % assoc) == 0)
3796 if (!(mas1 & MAS1_VALID))
3799 printf("%04x- ", i);
3801 printf("%04x-%c", cc, 'A' + esel);
3803 printf(" |%c", 'A' + esel);
3805 printf(" %016llx %04x %s %c%c AS%c",
3807 (mas1 >> 16) & 0x3fff,
3808 pgsz_names[(mas1 >> 7) & 0x1f],
3809 mas1 & MAS1_IND ? 'I' : ' ',
3810 mas1 & MAS1_IPROT ? 'P' : ' ',
3811 mas1 & MAS1_TS ? '1' : '0');
3812 printf(" %c%c%c%c%c%c%c",
3813 mas2 & MAS2_X0 ? 'a' : ' ',
3814 mas2 & MAS2_X1 ? 'v' : ' ',
3815 mas2 & MAS2_W ? 'w' : ' ',
3816 mas2 & MAS2_I ? 'i' : ' ',
3817 mas2 & MAS2_M ? 'm' : ' ',
3818 mas2 & MAS2_G ? 'g' : ' ',
3819 mas2 & MAS2_E ? 'e' : ' ');
3820 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3821 if (mas1 & MAS1_IND)
3823 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3825 printf(" U%c%c%c S%c%c%c\n",
3826 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3827 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3828 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3829 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3830 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3831 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3835 #endif /* CONFIG_PPC_BOOK3E */
3837 static void xmon_init(int enable)
3841 __debugger_ipi = xmon_ipi;
3842 __debugger_bpt = xmon_bpt;
3843 __debugger_sstep = xmon_sstep;
3844 __debugger_iabr_match = xmon_iabr_match;
3845 __debugger_break_match = xmon_break_match;
3846 __debugger_fault_handler = xmon_fault_handler;
3848 #ifdef CONFIG_PPC_PSERIES
3850 * Get the token here to avoid trying to get a lock
3851 * during the crash, causing a deadlock.
3853 set_indicator_token = rtas_token("set-indicator");
3857 __debugger_ipi = NULL;
3858 __debugger_bpt = NULL;
3859 __debugger_sstep = NULL;
3860 __debugger_iabr_match = NULL;
3861 __debugger_break_match = NULL;
3862 __debugger_fault_handler = NULL;
3866 #ifdef CONFIG_MAGIC_SYSRQ
3867 static void sysrq_handle_xmon(int key)
3869 if (xmon_is_locked_down()) {
3874 /* ensure xmon is enabled */
3876 debugger(get_irq_regs());
3881 static struct sysrq_key_op sysrq_xmon_op = {
3882 .handler = sysrq_handle_xmon,
3883 .help_msg = "xmon(x)",
3884 .action_msg = "Entering xmon",
3887 static int __init setup_xmon_sysrq(void)
3889 register_sysrq_key('x', &sysrq_xmon_op);
3892 device_initcall(setup_xmon_sysrq);
3893 #endif /* CONFIG_MAGIC_SYSRQ */
3895 static void clear_all_bpt(void)
3899 /* clear/unpatch all breakpoints */
3903 /* Disable all breakpoints */
3904 for (i = 0; i < NBPTS; ++i)
3905 bpts[i].enabled = 0;
3907 /* Clear any data or iabr breakpoints */
3908 if (iabr || dabr.enabled) {
3914 #ifdef CONFIG_DEBUG_FS
3915 static int xmon_dbgfs_set(void *data, u64 val)
3920 /* make sure all breakpoints removed when disabling */
3924 printf("xmon: All breakpoints cleared\n");
3925 release_output_lock();
3931 static int xmon_dbgfs_get(void *data, u64 *val)
3937 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3938 xmon_dbgfs_set, "%llu\n");
3940 static int __init setup_xmon_dbgfs(void)
3942 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3946 device_initcall(setup_xmon_dbgfs);
3947 #endif /* CONFIG_DEBUG_FS */
3949 static int xmon_early __initdata;
3951 static int __init early_parse_xmon(char *p)
3953 if (xmon_is_locked_down()) {
3957 } else if (!p || strncmp(p, "early", 5) == 0) {
3958 /* just "xmon" is equivalent to "xmon=early" */
3962 } else if (strncmp(p, "on", 2) == 0) {
3965 } else if (strncmp(p, "rw", 2) == 0) {
3969 } else if (strncmp(p, "ro", 2) == 0) {
3973 } else if (strncmp(p, "off", 3) == 0)
3980 early_param("xmon", early_parse_xmon);
3982 void __init xmon_setup(void)
3990 #ifdef CONFIG_SPU_BASE
3994 u64 saved_mfc_sr1_RW;
3995 u32 saved_spu_runcntl_RW;
3996 unsigned long dump_addr;
4000 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4002 static struct spu_info spu_info[XMON_NUM_SPUS];
4004 void xmon_register_spus(struct list_head *list)
4008 list_for_each_entry(spu, list, full_list) {
4009 if (spu->number >= XMON_NUM_SPUS) {
4014 spu_info[spu->number].spu = spu;
4015 spu_info[spu->number].stopped_ok = 0;
4016 spu_info[spu->number].dump_addr = (unsigned long)
4017 spu_info[spu->number].spu->local_store;
4021 static void stop_spus(void)
4027 for (i = 0; i < XMON_NUM_SPUS; i++) {
4028 if (!spu_info[i].spu)
4031 if (setjmp(bus_error_jmp) == 0) {
4032 catch_memory_errors = 1;
4035 spu = spu_info[i].spu;
4037 spu_info[i].saved_spu_runcntl_RW =
4038 in_be32(&spu->problem->spu_runcntl_RW);
4040 tmp = spu_mfc_sr1_get(spu);
4041 spu_info[i].saved_mfc_sr1_RW = tmp;
4043 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4044 spu_mfc_sr1_set(spu, tmp);
4049 spu_info[i].stopped_ok = 1;
4051 printf("Stopped spu %.2d (was %s)\n", i,
4052 spu_info[i].saved_spu_runcntl_RW ?
4053 "running" : "stopped");
4055 catch_memory_errors = 0;
4056 printf("*** Error stopping spu %.2d\n", i);
4058 catch_memory_errors = 0;
4062 static void restart_spus(void)
4067 for (i = 0; i < XMON_NUM_SPUS; i++) {
4068 if (!spu_info[i].spu)
4071 if (!spu_info[i].stopped_ok) {
4072 printf("*** Error, spu %d was not successfully stopped"
4073 ", not restarting\n", i);
4077 if (setjmp(bus_error_jmp) == 0) {
4078 catch_memory_errors = 1;
4081 spu = spu_info[i].spu;
4082 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4083 out_be32(&spu->problem->spu_runcntl_RW,
4084 spu_info[i].saved_spu_runcntl_RW);
4089 printf("Restarted spu %.2d\n", i);
4091 catch_memory_errors = 0;
4092 printf("*** Error restarting spu %.2d\n", i);
4094 catch_memory_errors = 0;
4098 #define DUMP_WIDTH 23
4099 #define DUMP_VALUE(format, field, value) \
4101 if (setjmp(bus_error_jmp) == 0) { \
4102 catch_memory_errors = 1; \
4104 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4109 catch_memory_errors = 0; \
4110 printf(" %-*s = *** Error reading field.\n", \
4111 DUMP_WIDTH, #field); \
4113 catch_memory_errors = 0; \
4116 #define DUMP_FIELD(obj, format, field) \
4117 DUMP_VALUE(format, field, obj->field)
4119 static void dump_spu_fields(struct spu *spu)
4121 printf("Dumping spu fields at address %p:\n", spu);
4123 DUMP_FIELD(spu, "0x%x", number);
4124 DUMP_FIELD(spu, "%s", name);
4125 DUMP_FIELD(spu, "0x%lx", local_store_phys);
4126 DUMP_FIELD(spu, "0x%p", local_store);
4127 DUMP_FIELD(spu, "0x%lx", ls_size);
4128 DUMP_FIELD(spu, "0x%x", node);
4129 DUMP_FIELD(spu, "0x%lx", flags);
4130 DUMP_FIELD(spu, "%llu", class_0_pending);
4131 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4132 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4133 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4134 DUMP_FIELD(spu, "0x%x", irqs[0]);
4135 DUMP_FIELD(spu, "0x%x", irqs[1]);
4136 DUMP_FIELD(spu, "0x%x", irqs[2]);
4137 DUMP_FIELD(spu, "0x%x", slb_replace);
4138 DUMP_FIELD(spu, "%d", pid);
4139 DUMP_FIELD(spu, "0x%p", mm);
4140 DUMP_FIELD(spu, "0x%p", ctx);
4141 DUMP_FIELD(spu, "0x%p", rq);
4142 DUMP_FIELD(spu, "0x%llx", timestamp);
4143 DUMP_FIELD(spu, "0x%lx", problem_phys);
4144 DUMP_FIELD(spu, "0x%p", problem);
4145 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4146 in_be32(&spu->problem->spu_runcntl_RW));
4147 DUMP_VALUE("0x%x", problem->spu_status_R,
4148 in_be32(&spu->problem->spu_status_R));
4149 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4150 in_be32(&spu->problem->spu_npc_RW));
4151 DUMP_FIELD(spu, "0x%p", priv2);
4152 DUMP_FIELD(spu, "0x%p", pdata);
4156 spu_inst_dump(unsigned long adr, long count, int praddr)
4158 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4161 static void dump_spu_ls(unsigned long num, int subcmd)
4163 unsigned long offset, addr, ls_addr;
4165 if (setjmp(bus_error_jmp) == 0) {
4166 catch_memory_errors = 1;
4168 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4172 catch_memory_errors = 0;
4173 printf("*** Error: accessing spu info for spu %ld\n", num);
4176 catch_memory_errors = 0;
4178 if (scanhex(&offset))
4179 addr = ls_addr + offset;
4181 addr = spu_info[num].dump_addr;
4183 if (addr >= ls_addr + LS_SIZE) {
4184 printf("*** Error: address outside of local store\n");
4190 addr += spu_inst_dump(addr, 16, 1);
4200 spu_info[num].dump_addr = addr;
4203 static int do_spu_cmd(void)
4205 static unsigned long num = 0;
4206 int cmd, subcmd = 0;
4218 if (isxdigit(subcmd) || subcmd == '\n')
4223 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4224 printf("*** Error: invalid spu number\n");
4230 dump_spu_fields(spu_info[num].spu);
4233 dump_spu_ls(num, subcmd);
4244 #else /* ! CONFIG_SPU_BASE */
4245 static int do_spu_cmd(void)