2 * Routines providing a simple monitor for use on the PowerMac.
4 * Copyright (C) 1996-2005 Paul Mackerras.
5 * Copyright (C) 2001 PPC64 Team, IBM Corp
6 * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version
11 * 2 of the License, or (at your option) any later version.
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/sched/signal.h>
17 #include <linux/smp.h>
19 #include <linux/reboot.h>
20 #include <linux/delay.h>
21 #include <linux/kallsyms.h>
22 #include <linux/kmsg_dump.h>
23 #include <linux/cpumask.h>
24 #include <linux/export.h>
25 #include <linux/sysrq.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/bug.h>
29 #include <linux/nmi.h>
30 #include <linux/ctype.h>
31 #include <linux/highmem.h>
33 #include <asm/debugfs.h>
34 #include <asm/ptrace.h>
36 #include <asm/string.h>
38 #include <asm/machdep.h>
40 #include <asm/processor.h>
41 #include <asm/pgtable.h>
43 #include <asm/mmu_context.h>
44 #include <asm/plpar_wrappers.h>
45 #include <asm/cputable.h>
47 #include <asm/sstep.h>
48 #include <asm/irq_regs.h>
50 #include <asm/spu_priv1.h>
51 #include <asm/setjmp.h>
53 #include <asm/debug.h>
54 #include <asm/hw_breakpoint.h>
57 #include <asm/firmware.h>
58 #include <asm/code-patching.h>
61 #include <asm/hvcall.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 static unsigned long in_xmon __read_mostly
= 0;
78 static int xmon_on
= IS_ENABLED(CONFIG_XMON_DEFAULT
);
80 static unsigned long adrs
;
82 #define MAX_DUMP (128 * 1024)
83 static unsigned long ndump
= 64;
84 static unsigned long nidump
= 16;
85 static unsigned long ncsum
= 4096;
87 static char tmpstr
[128];
88 static int tracing_enabled
;
90 static long bus_error_jmp
[JMP_BUF_LEN
];
91 static int catch_memory_errors
;
92 static int catch_spr_faults
;
93 static long *xmon_fault_jmp
[NR_CPUS
];
95 /* Breakpoint stuff */
97 unsigned long address
;
98 unsigned int instr
[2];
104 /* Bits in bpt.enabled */
110 static struct bpt bpts
[NBPTS
];
111 static struct bpt dabr
;
112 static struct bpt
*iabr
;
113 static unsigned bpinstr
= 0x7fe00008; /* trap */
115 #define BP_NUM(bp) ((bp) - bpts + 1)
118 static int cmds(struct pt_regs
*);
119 static int mread(unsigned long, void *, int);
120 static int mwrite(unsigned long, void *, int);
121 static int handle_fault(struct pt_regs
*);
122 static void byterev(unsigned char *, int);
123 static void memex(void);
124 static int bsesc(void);
125 static void dump(void);
126 static void show_pte(unsigned long);
127 static void prdump(unsigned long, long);
128 static int ppc_inst_dump(unsigned long, long, int);
129 static void dump_log_buf(void);
131 #ifdef CONFIG_PPC_POWERNV
132 static void dump_opal_msglog(void);
134 static inline void dump_opal_msglog(void)
136 printf("Machine is not running OPAL firmware.\n");
140 static void backtrace(struct pt_regs
*);
141 static void excprint(struct pt_regs
*);
142 static void prregs(struct pt_regs
*);
143 static void memops(int);
144 static void memlocate(void);
145 static void memzcan(void);
146 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
148 int scanhex(unsigned long *valp
);
149 static void scannl(void);
150 static int hexdigit(int);
151 void getstring(char *, int);
152 static void flush_input(void);
153 static int inchar(void);
154 static void take_input(char *);
155 static int read_spr(int, unsigned long *);
156 static void write_spr(int, unsigned long);
157 static void super_regs(void);
158 static void remove_bpts(void);
159 static void insert_bpts(void);
160 static void remove_cpu_bpts(void);
161 static void insert_cpu_bpts(void);
162 static struct bpt
*at_breakpoint(unsigned long pc
);
163 static struct bpt
*in_breakpoint_table(unsigned long pc
, unsigned long *offp
);
164 static int do_step(struct pt_regs
*);
165 static void bpt_cmds(void);
166 static void cacheflush(void);
167 static int cpu_cmd(void);
168 static void csum(void);
169 static void bootcmds(void);
170 static void proccall(void);
171 static void show_tasks(void);
172 void dump_segments(void);
173 static void symbol_lookup(void);
174 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
176 static void xmon_print_symbol(unsigned long address
, const char *mid
,
178 static const char *getvecname(unsigned long vec
);
180 static int do_spu_cmd(void);
183 static void dump_tlb_44x(void);
185 #ifdef CONFIG_PPC_BOOK3E
186 static void dump_tlb_book3e(void);
195 #ifdef __LITTLE_ENDIAN__
196 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
198 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
201 static char *help_string
= "\
203 b show breakpoints\n\
204 bd set data breakpoint\n\
205 bi set instruction breakpoint\n\
206 bc clear breakpoint\n"
209 c print cpus stopped in xmon\n\
210 c# try to switch to cpu number h (in hex)\n"
215 d1 dump 1 byte values\n\
216 d2 dump 2 byte values\n\
217 d4 dump 4 byte values\n\
218 d8 dump 8 byte values\n\
219 di dump instructions\n\
220 df dump float values\n\
221 dd dump double values\n\
222 dl dump the kernel log buffer\n"
223 #ifdef CONFIG_PPC_POWERNV
225 do dump the OPAL message log\n"
229 dp[#] dump paca for current cpu, or cpu #\n\
230 dpa dump paca for all possible cpus\n"
233 dr dump stream of raw bytes\n\
234 dv dump virtual address translation \n\
235 dt dump the tracing buffers (uses printk)\n\
236 dtc dump the tracing buffers for current CPU (uses printk)\n\
238 #ifdef CONFIG_PPC_POWERNV
239 " dx# dump xive on CPU #\n\
240 dxi# dump xive irq state #\n\
241 dxa dump xive on all CPUs\n"
243 " e print exception information\n\
245 la lookup symbol+offset of specified address\n\
246 ls lookup address of specified symbol\n\
247 m examine/change memory\n\
248 mm move a block of memory\n\
249 ms set a block of memory\n\
250 md compare two blocks of memory\n\
251 ml locate a block of memory\n\
252 mz zero a block of memory\n\
253 mi show information about memory allocation\n\
254 p call a procedure\n\
255 P list processes/tasks\n\
258 #ifdef CONFIG_SPU_BASE
259 " ss stop execution on all spus\n\
260 sr restore execution on stopped spus\n\
261 sf # dump spu fields for spu # (in hex)\n\
262 sd # dump spu local store for spu # (in hex)\n\
263 sdi # disassemble spu local store for spu # (in hex)\n"
265 " S print special registers\n\
268 Sw #v write v to SPR #\n\
270 x exit monitor and recover\n\
271 X exit monitor and don't recover\n"
272 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
273 " u dump segment table or SLB\n"
274 #elif defined(CONFIG_PPC_STD_MMU_32)
275 " u dump segment registers\n"
276 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
279 " U show uptime information\n"
281 " # n limit output to n lines per page (for dp, dpa, dl)\n"
286 static struct pt_regs
*xmon_regs
;
288 static inline void sync(void)
290 asm volatile("sync; isync");
293 static inline void store_inst(void *p
)
295 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p
));
298 static inline void cflush(void *p
)
300 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p
));
303 static inline void cinval(void *p
)
305 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p
));
309 * write_ciabr() - write the CIABR SPR
310 * @ciabr: The value to write.
312 * This function writes a value to the CIARB register either directly
313 * through mtspr instruction if the kernel is in HV privilege mode or
314 * call a hypervisor function to achieve the same in case the kernel
315 * is in supervisor privilege mode.
317 static void write_ciabr(unsigned long ciabr
)
319 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
322 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
323 mtspr(SPRN_CIABR
, ciabr
);
326 plpar_set_ciabr(ciabr
);
330 * set_ciabr() - set the CIABR
331 * @addr: The value to set.
333 * This function sets the correct privilege value into the the HW
334 * breakpoint address before writing it up in the CIABR register.
336 static void set_ciabr(unsigned long addr
)
340 if (cpu_has_feature(CPU_FTR_HVMODE
))
341 addr
|= CIABR_PRIV_HYPER
;
343 addr
|= CIABR_PRIV_SUPER
;
348 * Disable surveillance (the service processor watchdog function)
349 * while we are in xmon.
350 * XXX we should re-enable it when we leave. :)
352 #define SURVEILLANCE_TOKEN 9000
354 static inline void disable_surveillance(void)
356 #ifdef CONFIG_PPC_PSERIES
357 /* Since this can't be a module, args should end up below 4GB. */
358 static struct rtas_args args
;
362 * At this point we have got all the cpus we can into
363 * xmon, so there is hopefully no other cpu calling RTAS
364 * at the moment, even though we don't take rtas.lock.
365 * If we did try to take rtas.lock there would be a
366 * real possibility of deadlock.
368 token
= rtas_token("set-indicator");
369 if (token
== RTAS_UNKNOWN_SERVICE
)
372 rtas_call_unlocked(&args
, token
, 3, 1, NULL
, SURVEILLANCE_TOKEN
, 0, 0);
374 #endif /* CONFIG_PPC_PSERIES */
378 static int xmon_speaker
;
380 static void get_output_lock(void)
382 int me
= smp_processor_id() + 0x100;
383 int last_speaker
= 0, prev
;
386 if (xmon_speaker
== me
)
390 last_speaker
= cmpxchg(&xmon_speaker
, 0, me
);
391 if (last_speaker
== 0)
395 * Wait a full second for the lock, we might be on a slow
396 * console, but check every 100us.
399 while (xmon_speaker
== last_speaker
) {
405 /* hostile takeover */
406 prev
= cmpxchg(&xmon_speaker
, last_speaker
, me
);
407 if (prev
== last_speaker
)
414 static void release_output_lock(void)
419 int cpus_are_in_xmon(void)
421 return !cpumask_empty(&cpus_in_xmon
);
424 static bool wait_for_other_cpus(int ncpus
)
426 unsigned long timeout
;
428 /* We wait for 2s, which is a metric "little while" */
429 for (timeout
= 20000; timeout
!= 0; --timeout
) {
430 if (cpumask_weight(&cpus_in_xmon
) >= ncpus
)
438 #endif /* CONFIG_SMP */
440 static inline int unrecoverable_excp(struct pt_regs
*regs
)
442 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
443 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
446 return ((regs
->msr
& MSR_RI
) == 0);
450 static int xmon_core(struct pt_regs
*regs
, int fromipi
)
454 long recurse_jmp
[JMP_BUF_LEN
];
455 unsigned long offset
;
462 local_irq_save(flags
);
465 tracing_enabled
= tracing_is_on();
468 bp
= in_breakpoint_table(regs
->nip
, &offset
);
470 regs
->nip
= bp
->address
+ offset
;
471 atomic_dec(&bp
->ref_count
);
477 cpu
= smp_processor_id();
478 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
480 * We catch SPR read/write faults here because the 0x700, 0xf60
481 * etc. handlers don't call debugger_fault_handler().
483 if (catch_spr_faults
)
484 longjmp(bus_error_jmp
, 1);
487 printf("cpu 0x%x: Exception %lx %s in xmon, "
488 "returning to main loop\n",
489 cpu
, regs
->trap
, getvecname(TRAP(regs
)));
490 release_output_lock();
491 longjmp(xmon_fault_jmp
[cpu
], 1);
494 if (setjmp(recurse_jmp
) != 0) {
495 if (!in_xmon
|| !xmon_gate
) {
497 printf("xmon: WARNING: bad recursive fault "
498 "on cpu 0x%x\n", cpu
);
499 release_output_lock();
502 secondary
= !(xmon_taken
&& cpu
== xmon_owner
);
506 xmon_fault_jmp
[cpu
] = recurse_jmp
;
509 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
))
510 bp
= at_breakpoint(regs
->nip
);
511 if (bp
|| unrecoverable_excp(regs
))
518 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
520 xmon_print_symbol(regs
->nip
, " ", ")\n");
522 if (unrecoverable_excp(regs
))
523 printf("WARNING: exception is not recoverable, "
525 release_output_lock();
528 cpumask_set_cpu(cpu
, &cpus_in_xmon
);
533 while (secondary
&& !xmon_gate
) {
539 secondary
= test_and_set_bit(0, &in_xmon
);
542 touch_nmi_watchdog();
546 if (!secondary
&& !xmon_gate
) {
547 /* we are the first cpu to come in */
548 /* interrupt other cpu(s) */
549 int ncpus
= num_online_cpus();
555 * A system reset (trap == 0x100) can be triggered on
556 * all CPUs, so when we come in via 0x100 try waiting
557 * for the other CPUs to come in before we send the
558 * debugger break (IPI). This is similar to
559 * crash_kexec_secondary().
561 if (TRAP(regs
) != 0x100 || !wait_for_other_cpus(ncpus
))
562 smp_send_debugger_break();
564 wait_for_other_cpus(ncpus
);
567 disable_surveillance();
568 /* for breakpoint or single step, print the current instr. */
569 if (bp
|| TRAP(regs
) == 0xd00)
570 ppc_inst_dump(regs
->nip
, 1, 0);
571 printf("enter ? for help\n");
575 touch_nmi_watchdog();
582 if (cpu
== xmon_owner
) {
583 if (!test_and_set_bit(0, &xmon_taken
)) {
589 while (cpu
== xmon_owner
)
593 touch_nmi_watchdog();
604 /* have switched to some other cpu */
609 cpumask_clear_cpu(cpu
, &cpus_in_xmon
);
610 xmon_fault_jmp
[cpu
] = NULL
;
612 /* UP is simple... */
614 printf("Exception %lx %s in xmon, returning to main loop\n",
615 regs
->trap
, getvecname(TRAP(regs
)));
616 longjmp(xmon_fault_jmp
[0], 1);
618 if (setjmp(recurse_jmp
) == 0) {
619 xmon_fault_jmp
[0] = recurse_jmp
;
623 bp
= at_breakpoint(regs
->nip
);
625 printf("Stopped at breakpoint %tx (", BP_NUM(bp
));
626 xmon_print_symbol(regs
->nip
, " ", ")\n");
628 if (unrecoverable_excp(regs
))
629 printf("WARNING: exception is not recoverable, "
632 disable_surveillance();
633 /* for breakpoint or single step, print the current instr. */
634 if (bp
|| TRAP(regs
) == 0xd00)
635 ppc_inst_dump(regs
->nip
, 1, 0);
636 printf("enter ? for help\n");
646 if (regs
->msr
& MSR_DE
) {
647 bp
= at_breakpoint(regs
->nip
);
649 regs
->nip
= (unsigned long) &bp
->instr
[0];
650 atomic_inc(&bp
->ref_count
);
654 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
655 bp
= at_breakpoint(regs
->nip
);
657 int stepped
= emulate_step(regs
, bp
->instr
[0]);
659 regs
->nip
= (unsigned long) &bp
->instr
[0];
660 atomic_inc(&bp
->ref_count
);
661 } else if (stepped
< 0) {
662 printf("Couldn't single-step %s instruction\n",
663 (IS_RFID(bp
->instr
[0])? "rfid": "mtmsrd"));
670 touch_nmi_watchdog();
671 local_irq_restore(flags
);
673 return cmd
!= 'X' && cmd
!= EOF
;
676 int xmon(struct pt_regs
*excp
)
681 ppc_save_regs(®s
);
685 return xmon_core(excp
, 0);
689 irqreturn_t
xmon_irq(int irq
, void *d
)
692 local_irq_save(flags
);
693 printf("Keyboard interrupt\n");
694 xmon(get_irq_regs());
695 local_irq_restore(flags
);
699 static int xmon_bpt(struct pt_regs
*regs
)
702 unsigned long offset
;
704 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
707 /* Are we at the trap at bp->instr[1] for some bp? */
708 bp
= in_breakpoint_table(regs
->nip
, &offset
);
709 if (bp
!= NULL
&& offset
== 4) {
710 regs
->nip
= bp
->address
+ 4;
711 atomic_dec(&bp
->ref_count
);
715 /* Are we at a breakpoint? */
716 bp
= at_breakpoint(regs
->nip
);
725 static int xmon_sstep(struct pt_regs
*regs
)
733 static int xmon_break_match(struct pt_regs
*regs
)
735 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
737 if (dabr
.enabled
== 0)
743 static int xmon_iabr_match(struct pt_regs
*regs
)
745 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
753 static int xmon_ipi(struct pt_regs
*regs
)
756 if (in_xmon
&& !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon
))
762 static int xmon_fault_handler(struct pt_regs
*regs
)
765 unsigned long offset
;
767 if (in_xmon
&& catch_memory_errors
)
768 handle_fault(regs
); /* doesn't return */
770 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
771 bp
= in_breakpoint_table(regs
->nip
, &offset
);
773 regs
->nip
= bp
->address
+ offset
;
774 atomic_dec(&bp
->ref_count
);
781 /* Force enable xmon if not already enabled */
782 static inline void force_enable_xmon(void)
784 /* Enable xmon hooks if needed */
786 printf("xmon: Enabling debugger hooks\n");
791 static struct bpt
*at_breakpoint(unsigned long pc
)
797 for (i
= 0; i
< NBPTS
; ++i
, ++bp
)
798 if (bp
->enabled
&& pc
== bp
->address
)
803 static struct bpt
*in_breakpoint_table(unsigned long nip
, unsigned long *offp
)
807 off
= nip
- (unsigned long) bpts
;
808 if (off
>= sizeof(bpts
))
810 off
%= sizeof(struct bpt
);
811 if (off
!= offsetof(struct bpt
, instr
[0])
812 && off
!= offsetof(struct bpt
, instr
[1]))
814 *offp
= off
- offsetof(struct bpt
, instr
[0]);
815 return (struct bpt
*) (nip
- off
);
818 static struct bpt
*new_breakpoint(unsigned long a
)
823 bp
= at_breakpoint(a
);
827 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
828 if (!bp
->enabled
&& atomic_read(&bp
->ref_count
) == 0) {
830 bp
->instr
[1] = bpinstr
;
831 store_inst(&bp
->instr
[1]);
836 printf("Sorry, no free breakpoints. Please clear one first.\n");
840 static void insert_bpts(void)
846 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
847 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) == 0)
849 if (mread(bp
->address
, &bp
->instr
[0], 4) != 4) {
850 printf("Couldn't read instruction at %lx, "
851 "disabling breakpoint there\n", bp
->address
);
855 if (IS_MTMSRD(bp
->instr
[0]) || IS_RFID(bp
->instr
[0])) {
856 printf("Breakpoint at %lx is on an mtmsrd or rfid "
857 "instruction, disabling it\n", bp
->address
);
861 store_inst(&bp
->instr
[0]);
862 if (bp
->enabled
& BP_CIABR
)
864 if (patch_instruction((unsigned int *)bp
->address
,
866 printf("Couldn't write instruction at %lx, "
867 "disabling breakpoint there\n", bp
->address
);
868 bp
->enabled
&= ~BP_TRAP
;
871 store_inst((void *)bp
->address
);
875 static void insert_cpu_bpts(void)
877 struct arch_hw_breakpoint brk
;
880 brk
.address
= dabr
.address
;
881 brk
.type
= (dabr
.enabled
& HW_BRK_TYPE_DABR
) | HW_BRK_TYPE_PRIV_ALL
;
883 __set_breakpoint(&brk
);
887 set_ciabr(iabr
->address
);
890 static void remove_bpts(void)
897 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
898 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) != BP_TRAP
)
900 if (mread(bp
->address
, &instr
, 4) == 4
902 && patch_instruction(
903 (unsigned int *)bp
->address
, bp
->instr
[0]) != 0)
904 printf("Couldn't remove breakpoint at %lx\n",
907 store_inst((void *)bp
->address
);
911 static void remove_cpu_bpts(void)
913 hw_breakpoint_disable();
917 /* Based on uptime_proc_show(). */
921 struct timespec uptime
;
923 if (setjmp(bus_error_jmp
) == 0) {
924 catch_memory_errors
= 1;
927 get_monotonic_boottime(&uptime
);
928 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime
.tv_sec
,
929 ((unsigned long)uptime
.tv_nsec
/ (NSEC_PER_SEC
/100)));
934 catch_memory_errors
= 0;
937 static void set_lpp_cmd(void)
941 if (!scanhex(&lpp
)) {
942 printf("Invalid number.\n");
945 xmon_set_pagination_lpp(lpp
);
947 /* Command interpreting routine */
948 static char *last_cmd
;
951 cmds(struct pt_regs
*excp
)
958 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
962 printf("%x:", smp_processor_id());
963 #endif /* CONFIG_SMP */
969 if (last_cmd
== NULL
)
971 take_input(last_cmd
);
1005 prregs(excp
); /* print regs */
1020 if (do_spu_cmd() == 0)
1027 if (tracing_enabled
)
1031 printf(" <no input ...>\n");
1035 xmon_puts(help_string
);
1059 #ifdef CONFIG_PPC_STD_MMU
1063 #elif defined(CONFIG_44x)
1067 #elif defined(CONFIG_PPC_BOOK3E)
1076 printf("Unrecognized command: ");
1078 if (' ' < cmd
&& cmd
<= '~')
1081 printf("\\x%x", cmd
);
1083 } while (cmd
!= '\n');
1084 printf(" (type ? for help)\n");
1091 static int do_step(struct pt_regs
*regs
)
1093 regs
->msr
|= MSR_DE
;
1094 mtspr(SPRN_DBCR0
, mfspr(SPRN_DBCR0
) | DBCR0_IC
| DBCR0_IDM
);
1099 * Step a single instruction.
1100 * Some instructions we emulate, others we execute with MSR_SE set.
1102 static int do_step(struct pt_regs
*regs
)
1107 force_enable_xmon();
1108 /* check we are in 64-bit kernel mode, translation enabled */
1109 if ((regs
->msr
& (MSR_64BIT
|MSR_PR
|MSR_IR
)) == (MSR_64BIT
|MSR_IR
)) {
1110 if (mread(regs
->nip
, &instr
, 4) == 4) {
1111 stepped
= emulate_step(regs
, instr
);
1113 printf("Couldn't single-step %s instruction\n",
1114 (IS_RFID(instr
)? "rfid": "mtmsrd"));
1118 regs
->trap
= 0xd00 | (regs
->trap
& 1);
1119 printf("stepped to ");
1120 xmon_print_symbol(regs
->nip
, " ", "\n");
1121 ppc_inst_dump(regs
->nip
, 1, 0);
1126 regs
->msr
|= MSR_SE
;
1131 static void bootcmds(void)
1137 ppc_md
.restart(NULL
);
1138 else if (cmd
== 'h')
1140 else if (cmd
== 'p')
1145 static int cpu_cmd(void)
1148 unsigned long cpu
, first_cpu
, last_cpu
;
1151 if (!scanhex(&cpu
)) {
1152 /* print cpus waiting or in xmon */
1153 printf("cpus stopped:");
1154 last_cpu
= first_cpu
= NR_CPUS
;
1155 for_each_possible_cpu(cpu
) {
1156 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1157 if (cpu
== last_cpu
+ 1) {
1160 if (last_cpu
!= first_cpu
)
1161 printf("-0x%lx", last_cpu
);
1162 last_cpu
= first_cpu
= cpu
;
1163 printf(" 0x%lx", cpu
);
1167 if (last_cpu
!= first_cpu
)
1168 printf("-0x%lx", last_cpu
);
1172 /* try to switch to cpu specified */
1173 if (!cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1174 printf("cpu 0x%lx isn't in xmon\n", cpu
);
1176 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu
);
1177 xmon_show_stack(paca_ptrs
[cpu
]->saved_r1
, 0, 0);
1185 while (!xmon_taken
) {
1186 if (--timeout
== 0) {
1187 if (test_and_set_bit(0, &xmon_taken
))
1189 /* take control back */
1191 xmon_owner
= smp_processor_id();
1192 printf("cpu 0x%lx didn't take control\n", cpu
);
1200 #endif /* CONFIG_SMP */
1203 static unsigned short fcstab
[256] = {
1204 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1205 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1206 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1207 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1208 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1209 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1210 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1211 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1212 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1213 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1214 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1215 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1216 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1217 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1218 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1219 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1220 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1221 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1222 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1223 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1224 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1225 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1226 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1227 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1228 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1229 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1230 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1231 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1232 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1233 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1234 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1235 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1238 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1247 if (!scanhex(&adrs
))
1249 if (!scanhex(&ncsum
))
1252 for (i
= 0; i
< ncsum
; ++i
) {
1253 if (mread(adrs
+i
, &v
, 1) == 0) {
1254 printf("csum stopped at "REG
"\n", adrs
+i
);
1259 printf("%x\n", fcs
);
1263 * Check if this is a suitable place to put a breakpoint.
1265 static long check_bp_loc(unsigned long addr
)
1270 if (!is_kernel_addr(addr
)) {
1271 printf("Breakpoints may only be placed at kernel addresses\n");
1274 if (!mread(addr
, &instr
, sizeof(instr
))) {
1275 printf("Can't read instruction at address %lx\n", addr
);
1278 if (IS_MTMSRD(instr
) || IS_RFID(instr
)) {
1279 printf("Breakpoints may not be placed on mtmsrd or rfid "
1286 static char *breakpoint_help_string
=
1287 "Breakpoint command usage:\n"
1288 "b show breakpoints\n"
1289 "b <addr> [cnt] set breakpoint at given instr addr\n"
1290 "bc clear all breakpoints\n"
1291 "bc <n/addr> clear breakpoint number n or at addr\n"
1292 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1293 "bd <addr> [cnt] set hardware data breakpoint\n"
1306 #ifndef CONFIG_PPC_8xx
1307 static const char badaddr
[] = "Only kernel addresses are permitted for breakpoints\n";
1309 case 'd': /* bd - hardware data breakpoint */
1310 if (!ppc_breakpoint_available()) {
1311 printf("Hardware data breakpoint not supported on this cpu\n");
1318 else if (cmd
== 'w')
1324 if (scanhex(&dabr
.address
)) {
1325 if (!is_kernel_addr(dabr
.address
)) {
1329 dabr
.address
&= ~HW_BRK_TYPE_DABR
;
1330 dabr
.enabled
= mode
| BP_DABR
;
1333 force_enable_xmon();
1336 case 'i': /* bi - hardware instr breakpoint */
1337 if (!cpu_has_feature(CPU_FTR_ARCH_207S
)) {
1338 printf("Hardware instruction breakpoint "
1339 "not supported on this cpu\n");
1343 iabr
->enabled
&= ~BP_CIABR
;
1348 if (!check_bp_loc(a
))
1350 bp
= new_breakpoint(a
);
1352 bp
->enabled
|= BP_CIABR
;
1354 force_enable_xmon();
1361 /* clear all breakpoints */
1362 for (i
= 0; i
< NBPTS
; ++i
)
1363 bpts
[i
].enabled
= 0;
1366 printf("All breakpoints cleared\n");
1370 if (a
<= NBPTS
&& a
>= 1) {
1371 /* assume a breakpoint number */
1372 bp
= &bpts
[a
-1]; /* bp nums are 1 based */
1374 /* assume a breakpoint address */
1375 bp
= at_breakpoint(a
);
1377 printf("No breakpoint at %lx\n", a
);
1382 printf("Cleared breakpoint %tx (", BP_NUM(bp
));
1383 xmon_print_symbol(bp
->address
, " ", ")\n");
1391 printf(breakpoint_help_string
);
1396 /* print all breakpoints */
1397 printf(" type address\n");
1399 printf(" data "REG
" [", dabr
.address
);
1400 if (dabr
.enabled
& 1)
1402 if (dabr
.enabled
& 2)
1406 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
1409 printf("%tx %s ", BP_NUM(bp
),
1410 (bp
->enabled
& BP_CIABR
) ? "inst": "trap");
1411 xmon_print_symbol(bp
->address
, " ", "\n");
1416 if (!check_bp_loc(a
))
1418 bp
= new_breakpoint(a
);
1420 bp
->enabled
|= BP_TRAP
;
1421 force_enable_xmon();
1427 /* Very cheap human name for vector lookup. */
1429 const char *getvecname(unsigned long vec
)
1434 case 0x100: ret
= "(System Reset)"; break;
1435 case 0x200: ret
= "(Machine Check)"; break;
1436 case 0x300: ret
= "(Data Access)"; break;
1438 if (radix_enabled())
1439 ret
= "(Data Access Out of Range)";
1441 ret
= "(Data SLB Access)";
1443 case 0x400: ret
= "(Instruction Access)"; break;
1445 if (radix_enabled())
1446 ret
= "(Instruction Access Out of Range)";
1448 ret
= "(Instruction SLB Access)";
1450 case 0x500: ret
= "(Hardware Interrupt)"; break;
1451 case 0x600: ret
= "(Alignment)"; break;
1452 case 0x700: ret
= "(Program Check)"; break;
1453 case 0x800: ret
= "(FPU Unavailable)"; break;
1454 case 0x900: ret
= "(Decrementer)"; break;
1455 case 0x980: ret
= "(Hypervisor Decrementer)"; break;
1456 case 0xa00: ret
= "(Doorbell)"; break;
1457 case 0xc00: ret
= "(System Call)"; break;
1458 case 0xd00: ret
= "(Single Step)"; break;
1459 case 0xe40: ret
= "(Emulation Assist)"; break;
1460 case 0xe60: ret
= "(HMI)"; break;
1461 case 0xe80: ret
= "(Hypervisor Doorbell)"; break;
1462 case 0xf00: ret
= "(Performance Monitor)"; break;
1463 case 0xf20: ret
= "(Altivec Unavailable)"; break;
1464 case 0x1300: ret
= "(Instruction Breakpoint)"; break;
1465 case 0x1500: ret
= "(Denormalisation)"; break;
1466 case 0x1700: ret
= "(Altivec Assist)"; break;
1472 static void get_function_bounds(unsigned long pc
, unsigned long *startp
,
1473 unsigned long *endp
)
1475 unsigned long size
, offset
;
1478 *startp
= *endp
= 0;
1481 if (setjmp(bus_error_jmp
) == 0) {
1482 catch_memory_errors
= 1;
1484 name
= kallsyms_lookup(pc
, &size
, &offset
, NULL
, tmpstr
);
1486 *startp
= pc
- offset
;
1487 *endp
= pc
- offset
+ size
;
1491 catch_memory_errors
= 0;
1494 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1495 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1497 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
1500 int max_to_print
= 64;
1502 unsigned long newsp
;
1503 unsigned long marker
;
1504 struct pt_regs regs
;
1506 while (max_to_print
--) {
1507 if (!is_kernel_addr(sp
)) {
1509 printf("SP (%lx) is in userspace\n", sp
);
1513 if (!mread(sp
+ LRSAVE_OFFSET
, &ip
, sizeof(unsigned long))
1514 || !mread(sp
, &newsp
, sizeof(unsigned long))) {
1515 printf("Couldn't read stack frame at %lx\n", sp
);
1520 * For the first stack frame, try to work out if
1521 * LR and/or the saved LR value in the bottommost
1522 * stack frame are valid.
1524 if ((pc
| lr
) != 0) {
1525 unsigned long fnstart
, fnend
;
1526 unsigned long nextip
;
1529 get_function_bounds(pc
, &fnstart
, &fnend
);
1532 mread(newsp
+ LRSAVE_OFFSET
, &nextip
,
1533 sizeof(unsigned long));
1535 if (!is_kernel_addr(lr
)
1536 || (fnstart
<= lr
&& lr
< fnend
))
1538 } else if (lr
== nextip
) {
1540 } else if (is_kernel_addr(lr
)
1541 && !(fnstart
<= lr
&& lr
< fnend
)) {
1542 printf("[link register ] ");
1543 xmon_print_symbol(lr
, " ", "\n");
1546 printf("["REG
"] ", sp
);
1547 xmon_print_symbol(ip
, " ", " (unreliable)\n");
1552 printf("["REG
"] ", sp
);
1553 xmon_print_symbol(ip
, " ", "\n");
1556 /* Look for "regshere" marker to see if this is
1557 an exception frame. */
1558 if (mread(sp
+ MARKER_OFFSET
, &marker
, sizeof(unsigned long))
1559 && marker
== STACK_FRAME_REGS_MARKER
) {
1560 if (mread(sp
+ STACK_FRAME_OVERHEAD
, ®s
, sizeof(regs
))
1562 printf("Couldn't read registers at %lx\n",
1563 sp
+ STACK_FRAME_OVERHEAD
);
1566 printf("--- Exception: %lx %s at ", regs
.trap
,
1567 getvecname(TRAP(®s
)));
1570 xmon_print_symbol(pc
, " ", "\n");
1580 static void backtrace(struct pt_regs
*excp
)
1585 xmon_show_stack(sp
, 0, 0);
1587 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
1591 static void print_bug_trap(struct pt_regs
*regs
)
1594 const struct bug_entry
*bug
;
1597 if (regs
->msr
& MSR_PR
)
1598 return; /* not in kernel */
1599 addr
= regs
->nip
; /* address of trap instruction */
1600 if (!is_kernel_addr(addr
))
1602 bug
= find_bug(regs
->nip
);
1605 if (is_warning_bug(bug
))
1608 #ifdef CONFIG_DEBUG_BUGVERBOSE
1609 printf("kernel BUG at %s:%u!\n",
1610 bug
->file
, bug
->line
);
1612 printf("kernel BUG at %px!\n", (void *)bug
->bug_addr
);
1614 #endif /* CONFIG_BUG */
1617 static void excprint(struct pt_regs
*fp
)
1622 printf("cpu 0x%x: ", smp_processor_id());
1623 #endif /* CONFIG_SMP */
1626 printf("Vector: %lx %s at [%px]\n", fp
->trap
, getvecname(trap
), fp
);
1628 xmon_print_symbol(fp
->nip
, ": ", "\n");
1631 xmon_print_symbol(fp
->link
, ": ", "\n");
1633 printf(" sp: %lx\n", fp
->gpr
[1]);
1634 printf(" msr: %lx\n", fp
->msr
);
1636 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600 || trap
== 0x200) {
1637 printf(" dar: %lx\n", fp
->dar
);
1639 printf(" dsisr: %lx\n", fp
->dsisr
);
1642 printf(" current = 0x%px\n", current
);
1644 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1645 local_paca
, local_paca
->irq_soft_mask
, local_paca
->irq_happened
);
1648 printf(" pid = %d, comm = %s\n",
1649 current
->pid
, current
->comm
);
1655 printf(linux_banner
);
1658 static void prregs(struct pt_regs
*fp
)
1662 struct pt_regs regs
;
1664 if (scanhex(&base
)) {
1665 if (setjmp(bus_error_jmp
) == 0) {
1666 catch_memory_errors
= 1;
1668 regs
= *(struct pt_regs
*)base
;
1672 catch_memory_errors
= 0;
1673 printf("*** Error reading registers from "REG
"\n",
1677 catch_memory_errors
= 0;
1682 if (FULL_REGS(fp
)) {
1683 for (n
= 0; n
< 16; ++n
)
1684 printf("R%.2d = "REG
" R%.2d = "REG
"\n",
1685 n
, fp
->gpr
[n
], n
+16, fp
->gpr
[n
+16]);
1687 for (n
= 0; n
< 7; ++n
)
1688 printf("R%.2d = "REG
" R%.2d = "REG
"\n",
1689 n
, fp
->gpr
[n
], n
+7, fp
->gpr
[n
+7]);
1692 for (n
= 0; n
< 32; ++n
) {
1693 printf("R%.2d = %.8lx%s", n
, fp
->gpr
[n
],
1694 (n
& 3) == 3? "\n": " ");
1695 if (n
== 12 && !FULL_REGS(fp
)) {
1702 xmon_print_symbol(fp
->nip
, " ", "\n");
1703 if (TRAP(fp
) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR
)) {
1705 xmon_print_symbol(fp
->orig_gpr3
, " ", "\n");
1708 xmon_print_symbol(fp
->link
, " ", "\n");
1709 printf("msr = "REG
" cr = %.8lx\n", fp
->msr
, fp
->ccr
);
1710 printf("ctr = "REG
" xer = "REG
" trap = %4lx\n",
1711 fp
->ctr
, fp
->xer
, fp
->trap
);
1713 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600)
1714 printf("dar = "REG
" dsisr = %.8lx\n", fp
->dar
, fp
->dsisr
);
1717 static void cacheflush(void)
1720 unsigned long nflush
;
1725 scanhex((void *)&adrs
);
1730 nflush
= (nflush
+ L1_CACHE_BYTES
- 1) / L1_CACHE_BYTES
;
1731 if (setjmp(bus_error_jmp
) == 0) {
1732 catch_memory_errors
= 1;
1736 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1737 cflush((void *) adrs
);
1739 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1740 cinval((void *) adrs
);
1743 /* wait a little while to see if we get a machine check */
1746 catch_memory_errors
= 0;
1749 extern unsigned long xmon_mfspr(int spr
, unsigned long default_value
);
1750 extern void xmon_mtspr(int spr
, unsigned long value
);
1753 read_spr(int n
, unsigned long *vp
)
1755 unsigned long ret
= -1UL;
1758 if (setjmp(bus_error_jmp
) == 0) {
1759 catch_spr_faults
= 1;
1762 ret
= xmon_mfspr(n
, *vp
);
1768 catch_spr_faults
= 0;
1774 write_spr(int n
, unsigned long val
)
1776 if (setjmp(bus_error_jmp
) == 0) {
1777 catch_spr_faults
= 1;
1784 printf("SPR 0x%03x (%4d) Faulted during write\n", n
, n
);
1786 catch_spr_faults
= 0;
1789 static void dump_206_sprs(void)
1792 if (!cpu_has_feature(CPU_FTR_ARCH_206
))
1795 /* Actually some of these pre-date 2.06, but whatevs */
1797 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1798 mfspr(SPRN_SRR0
), mfspr(SPRN_SRR1
), mfspr(SPRN_DSISR
));
1799 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1800 mfspr(SPRN_DSCR
), mfspr(SPRN_PPR
), mfspr(SPRN_PIR
));
1801 printf("amr = %.16lx uamor = %.16lx\n",
1802 mfspr(SPRN_AMR
), mfspr(SPRN_UAMOR
));
1804 if (!(mfmsr() & MSR_HV
))
1807 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1808 mfspr(SPRN_SDR1
), mfspr(SPRN_HDAR
), mfspr(SPRN_HDSISR
));
1809 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1810 mfspr(SPRN_HSRR0
), mfspr(SPRN_HSRR1
), mfspr(SPRN_HDEC
));
1811 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1812 mfspr(SPRN_LPCR
), mfspr(SPRN_PCR
), mfspr(SPRN_LPID
));
1813 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1814 mfspr(SPRN_HSPRG0
), mfspr(SPRN_HSPRG1
), mfspr(SPRN_AMOR
));
1815 printf("dabr = %.16lx dabrx = %.16lx\n",
1816 mfspr(SPRN_DABR
), mfspr(SPRN_DABRX
));
1820 static void dump_207_sprs(void)
1825 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
1828 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1829 mfspr(SPRN_DPDES
), mfspr(SPRN_TIR
), mfspr(SPRN_CIR
));
1831 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1832 mfspr(SPRN_FSCR
), mfspr(SPRN_TAR
), mfspr(SPRN_PSPB
));
1836 /* Only if TM has been enabled in the kernel */
1837 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1838 mfspr(SPRN_TFHAR
), mfspr(SPRN_TFIAR
),
1839 mfspr(SPRN_TEXASR
));
1842 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1843 mfspr(SPRN_MMCR0
), mfspr(SPRN_MMCR1
), mfspr(SPRN_MMCR2
));
1844 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1845 mfspr(SPRN_PMC1
), mfspr(SPRN_PMC2
),
1846 mfspr(SPRN_PMC3
), mfspr(SPRN_PMC4
));
1847 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1848 mfspr(SPRN_MMCRA
), mfspr(SPRN_SIAR
), mfspr(SPRN_PMC5
));
1849 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1850 mfspr(SPRN_SDAR
), mfspr(SPRN_SIER
), mfspr(SPRN_PMC6
));
1851 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1852 mfspr(SPRN_EBBHR
), mfspr(SPRN_EBBRR
), mfspr(SPRN_BESCR
));
1853 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR
));
1855 if (!(msr
& MSR_HV
))
1858 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1859 mfspr(SPRN_HFSCR
), mfspr(SPRN_DHDES
), mfspr(SPRN_RPR
));
1860 printf("dawr = %.16lx dawrx = %.16lx ciabr = %.16lx\n",
1861 mfspr(SPRN_DAWR
), mfspr(SPRN_DAWRX
), mfspr(SPRN_CIABR
));
1865 static void dump_300_sprs(void)
1868 bool hv
= mfmsr() & MSR_HV
;
1870 if (!cpu_has_feature(CPU_FTR_ARCH_300
))
1873 printf("pidr = %.16lx tidr = %.16lx\n",
1874 mfspr(SPRN_PID
), mfspr(SPRN_TIDR
));
1875 printf("asdr = %.16lx psscr = %.16lx\n",
1876 mfspr(SPRN_ASDR
), hv
? mfspr(SPRN_PSSCR
)
1877 : mfspr(SPRN_PSSCR_PR
));
1882 printf("ptcr = %.16lx\n",
1887 static void dump_one_spr(int spr
, bool show_unimplemented
)
1892 if (!read_spr(spr
, &val
)) {
1893 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1897 if (val
== 0xdeadbeef) {
1898 /* Looks like read was a nop, confirm */
1900 if (!read_spr(spr
, &val
)) {
1901 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1905 if (val
== 0x0badcafe) {
1906 if (show_unimplemented
)
1907 printf("SPR 0x%03x (%4d) Unimplemented\n", spr
, spr
);
1912 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr
, spr
, val
);
1915 static void super_regs(void)
1917 static unsigned long regno
;
1925 unsigned long sp
, toc
;
1926 asm("mr %0,1" : "=r" (sp
) :);
1927 asm("mr %0,2" : "=r" (toc
) :);
1929 printf("msr = "REG
" sprg0 = "REG
"\n",
1930 mfmsr(), mfspr(SPRN_SPRG0
));
1931 printf("pvr = "REG
" sprg1 = "REG
"\n",
1932 mfspr(SPRN_PVR
), mfspr(SPRN_SPRG1
));
1933 printf("dec = "REG
" sprg2 = "REG
"\n",
1934 mfspr(SPRN_DEC
), mfspr(SPRN_SPRG2
));
1935 printf("sp = "REG
" sprg3 = "REG
"\n", sp
, mfspr(SPRN_SPRG3
));
1936 printf("toc = "REG
" dar = "REG
"\n", toc
, mfspr(SPRN_DAR
));
1948 read_spr(regno
, &val
);
1950 write_spr(regno
, val
);
1951 dump_one_spr(regno
, true);
1956 dump_one_spr(regno
, true);
1960 for (spr
= 1; spr
< 1024; ++spr
)
1961 dump_one_spr(spr
, false);
1969 * Stuff for reading and writing memory safely
1972 mread(unsigned long adrs
, void *buf
, int size
)
1978 if (setjmp(bus_error_jmp
) == 0) {
1979 catch_memory_errors
= 1;
1985 *(u16
*)q
= *(u16
*)p
;
1988 *(u32
*)q
= *(u32
*)p
;
1991 *(u64
*)q
= *(u64
*)p
;
1994 for( ; n
< size
; ++n
) {
2000 /* wait a little while to see if we get a machine check */
2004 catch_memory_errors
= 0;
2009 mwrite(unsigned long adrs
, void *buf
, int size
)
2015 if (setjmp(bus_error_jmp
) == 0) {
2016 catch_memory_errors
= 1;
2022 *(u16
*)p
= *(u16
*)q
;
2025 *(u32
*)p
= *(u32
*)q
;
2028 *(u64
*)p
= *(u64
*)q
;
2031 for ( ; n
< size
; ++n
) {
2037 /* wait a little while to see if we get a machine check */
2041 printf("*** Error writing address "REG
"\n", adrs
+ n
);
2043 catch_memory_errors
= 0;
2047 static int fault_type
;
2048 static int fault_except
;
2049 static char *fault_chars
[] = { "--", "**", "##" };
2051 static int handle_fault(struct pt_regs
*regs
)
2053 fault_except
= TRAP(regs
);
2054 switch (TRAP(regs
)) {
2066 longjmp(bus_error_jmp
, 1);
2071 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2074 byterev(unsigned char *val
, int size
)
2080 SWAP(val
[0], val
[1], t
);
2083 SWAP(val
[0], val
[3], t
);
2084 SWAP(val
[1], val
[2], t
);
2086 case 8: /* is there really any use for this? */
2087 SWAP(val
[0], val
[7], t
);
2088 SWAP(val
[1], val
[6], t
);
2089 SWAP(val
[2], val
[5], t
);
2090 SWAP(val
[3], val
[4], t
);
2098 static char *memex_help_string
=
2099 "Memory examine command usage:\n"
2100 "m [addr] [flags] examine/change memory\n"
2101 " addr is optional. will start where left off.\n"
2102 " flags may include chars from this set:\n"
2103 " b modify by bytes (default)\n"
2104 " w modify by words (2 byte)\n"
2105 " l modify by longs (4 byte)\n"
2106 " d modify by doubleword (8 byte)\n"
2107 " r toggle reverse byte order mode\n"
2108 " n do not read memory (for i/o spaces)\n"
2109 " . ok to read (default)\n"
2110 "NOTE: flags are saved as defaults\n"
2113 static char *memex_subcmd_help_string
=
2114 "Memory examine subcommands:\n"
2115 " hexval write this val to current location\n"
2116 " 'string' write chars from string to this location\n"
2117 " ' increment address\n"
2118 " ^ decrement address\n"
2119 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2120 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2121 " ` clear no-read flag\n"
2122 " ; stay at this addr\n"
2123 " v change to byte mode\n"
2124 " w change to word (2 byte) mode\n"
2125 " l change to long (4 byte) mode\n"
2126 " u change to doubleword (8 byte) mode\n"
2127 " m addr change current addr\n"
2128 " n toggle no-read flag\n"
2129 " r toggle byte reverse flag\n"
2130 " < count back up count bytes\n"
2131 " > count skip forward count bytes\n"
2132 " x exit this mode\n"
2138 int cmd
, inc
, i
, nslash
;
2140 unsigned char val
[16];
2142 scanhex((void *)&adrs
);
2145 printf(memex_help_string
);
2151 while ((cmd
= skipbl()) != '\n') {
2153 case 'b': size
= 1; break;
2154 case 'w': size
= 2; break;
2155 case 'l': size
= 4; break;
2156 case 'd': size
= 8; break;
2157 case 'r': brev
= !brev
; break;
2158 case 'n': mnoread
= 1; break;
2159 case '.': mnoread
= 0; break;
2168 n
= mread(adrs
, val
, size
);
2169 printf(REG
"%c", adrs
, brev
? 'r': ' ');
2174 for (i
= 0; i
< n
; ++i
)
2175 printf("%.2x", val
[i
]);
2176 for (; i
< size
; ++i
)
2177 printf("%s", fault_chars
[fault_type
]);
2184 for (i
= 0; i
< size
; ++i
)
2185 val
[i
] = n
>> (i
* 8);
2188 mwrite(adrs
, val
, size
);
2201 else if( n
== '\'' )
2203 for (i
= 0; i
< size
; ++i
)
2204 val
[i
] = n
>> (i
* 8);
2207 mwrite(adrs
, val
, size
);
2243 adrs
-= 1 << nslash
;
2247 adrs
+= 1 << nslash
;
2251 adrs
+= 1 << -nslash
;
2255 adrs
-= 1 << -nslash
;
2258 scanhex((void *)&adrs
);
2277 printf(memex_subcmd_help_string
);
2292 case 'n': c
= '\n'; break;
2293 case 'r': c
= '\r'; break;
2294 case 'b': c
= '\b'; break;
2295 case 't': c
= '\t'; break;
2300 static void xmon_rawdump (unsigned long adrs
, long ndump
)
2303 unsigned char temp
[16];
2305 for (n
= ndump
; n
> 0;) {
2307 nr
= mread(adrs
, temp
, r
);
2309 for (m
= 0; m
< r
; ++m
) {
2311 printf("%.2x", temp
[m
]);
2313 printf("%s", fault_chars
[fault_type
]);
2322 static void dump_tracing(void)
2328 ftrace_dump(DUMP_ORIG
);
2330 ftrace_dump(DUMP_ALL
);
2334 static void dump_one_paca(int cpu
)
2336 struct paca_struct
*p
;
2337 #ifdef CONFIG_PPC_BOOK3S_64
2341 if (setjmp(bus_error_jmp
) != 0) {
2342 printf("*** Error dumping paca for cpu 0x%x!\n", cpu
);
2346 catch_memory_errors
= 1;
2351 printf("paca for cpu 0x%x @ %px:\n", cpu
, p
);
2353 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu
) ? "yes" : "no");
2354 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu
) ? "yes" : "no");
2355 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu
) ? "yes" : "no");
2357 #define DUMP(paca, name, format) \
2358 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2359 offsetof(struct paca_struct, name));
2361 DUMP(p
, lock_token
, "%#-*x");
2362 DUMP(p
, paca_index
, "%#-*x");
2363 DUMP(p
, kernel_toc
, "%#-*llx");
2364 DUMP(p
, kernelbase
, "%#-*llx");
2365 DUMP(p
, kernel_msr
, "%#-*llx");
2366 DUMP(p
, emergency_sp
, "%-*px");
2367 #ifdef CONFIG_PPC_BOOK3S_64
2368 DUMP(p
, nmi_emergency_sp
, "%-*px");
2369 DUMP(p
, mc_emergency_sp
, "%-*px");
2370 DUMP(p
, in_nmi
, "%#-*x");
2371 DUMP(p
, in_mce
, "%#-*x");
2372 DUMP(p
, hmi_event_available
, "%#-*x");
2374 DUMP(p
, data_offset
, "%#-*llx");
2375 DUMP(p
, hw_cpu_id
, "%#-*x");
2376 DUMP(p
, cpu_start
, "%#-*x");
2377 DUMP(p
, kexec_state
, "%#-*x");
2378 #ifdef CONFIG_PPC_BOOK3S_64
2379 for (i
= 0; i
< SLB_NUM_BOLTED
; i
++) {
2382 if (!p
->slb_shadow_ptr
)
2385 esid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].esid
);
2386 vsid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].vsid
);
2389 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2390 22, "slb_shadow", i
, esid
, vsid
);
2393 DUMP(p
, vmalloc_sllp
, "%#-*x");
2394 DUMP(p
, slb_cache_ptr
, "%#-*x");
2395 for (i
= 0; i
< SLB_CACHE_ENTRIES
; i
++)
2396 printf(" %-*s[%d] = 0x%016x\n",
2397 22, "slb_cache", i
, p
->slb_cache
[i
]);
2399 DUMP(p
, rfi_flush_fallback_area
, "%-*px");
2401 DUMP(p
, dscr_default
, "%#-*llx");
2402 #ifdef CONFIG_PPC_BOOK3E
2403 DUMP(p
, pgd
, "%-*px");
2404 DUMP(p
, kernel_pgd
, "%-*px");
2405 DUMP(p
, tcd_ptr
, "%-*px");
2406 DUMP(p
, mc_kstack
, "%-*px");
2407 DUMP(p
, crit_kstack
, "%-*px");
2408 DUMP(p
, dbg_kstack
, "%-*px");
2410 DUMP(p
, __current
, "%-*px");
2411 DUMP(p
, kstack
, "%#-*llx");
2412 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p
->kstack
& ~(THREAD_SIZE
- 1));
2413 DUMP(p
, stab_rr
, "%#-*llx");
2414 DUMP(p
, saved_r1
, "%#-*llx");
2415 DUMP(p
, trap_save
, "%#-*x");
2416 DUMP(p
, irq_soft_mask
, "%#-*x");
2417 DUMP(p
, irq_happened
, "%#-*x");
2418 DUMP(p
, io_sync
, "%#-*x");
2419 DUMP(p
, irq_work_pending
, "%#-*x");
2420 DUMP(p
, nap_state_lost
, "%#-*x");
2421 DUMP(p
, sprg_vdso
, "%#-*llx");
2423 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2424 DUMP(p
, tm_scratch
, "%#-*llx");
2427 #ifdef CONFIG_PPC_POWERNV
2428 DUMP(p
, core_idle_state_ptr
, "%-*px");
2429 DUMP(p
, thread_idle_state
, "%#-*x");
2430 DUMP(p
, thread_mask
, "%#-*x");
2431 DUMP(p
, subcore_sibling_mask
, "%#-*x");
2432 DUMP(p
, thread_sibling_pacas
, "%-*px");
2433 DUMP(p
, requested_psscr
, "%#-*llx");
2434 DUMP(p
, stop_sprs
.pid
, "%#-*llx");
2435 DUMP(p
, stop_sprs
.ldbar
, "%#-*llx");
2436 DUMP(p
, stop_sprs
.fscr
, "%#-*llx");
2437 DUMP(p
, stop_sprs
.hfscr
, "%#-*llx");
2438 DUMP(p
, stop_sprs
.mmcr1
, "%#-*llx");
2439 DUMP(p
, stop_sprs
.mmcr2
, "%#-*llx");
2440 DUMP(p
, stop_sprs
.mmcra
, "%#-*llx");
2441 DUMP(p
, dont_stop
.counter
, "%#-*x");
2444 DUMP(p
, accounting
.utime
, "%#-*lx");
2445 DUMP(p
, accounting
.stime
, "%#-*lx");
2446 DUMP(p
, accounting
.utime_scaled
, "%#-*lx");
2447 DUMP(p
, accounting
.starttime
, "%#-*lx");
2448 DUMP(p
, accounting
.starttime_user
, "%#-*lx");
2449 DUMP(p
, accounting
.startspurr
, "%#-*lx");
2450 DUMP(p
, accounting
.utime_sspurr
, "%#-*lx");
2451 DUMP(p
, accounting
.steal_time
, "%#-*lx");
2454 catch_memory_errors
= 0;
2458 static void dump_all_pacas(void)
2462 if (num_possible_cpus() == 0) {
2463 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2467 for_each_possible_cpu(cpu
)
2471 static void dump_pacas(void)
2482 termch
= c
; /* Put c back, it wasn't 'a' */
2487 dump_one_paca(xmon_owner
);
2491 #ifdef CONFIG_PPC_POWERNV
2492 static void dump_one_xive(int cpu
)
2494 unsigned int hwid
= get_hard_smp_processor_id(cpu
);
2496 opal_xive_dump(XIVE_DUMP_TM_HYP
, hwid
);
2497 opal_xive_dump(XIVE_DUMP_TM_POOL
, hwid
);
2498 opal_xive_dump(XIVE_DUMP_TM_OS
, hwid
);
2499 opal_xive_dump(XIVE_DUMP_TM_USER
, hwid
);
2500 opal_xive_dump(XIVE_DUMP_VP
, hwid
);
2501 opal_xive_dump(XIVE_DUMP_EMU_STATE
, hwid
);
2503 if (setjmp(bus_error_jmp
) != 0) {
2504 catch_memory_errors
= 0;
2505 printf("*** Error dumping xive on cpu %d\n", cpu
);
2509 catch_memory_errors
= 1;
2511 xmon_xive_do_dump(cpu
);
2514 catch_memory_errors
= 0;
2517 static void dump_all_xives(void)
2521 if (num_possible_cpus() == 0) {
2522 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2526 for_each_possible_cpu(cpu
)
2530 static void dump_one_xive_irq(u32 num
)
2537 rc
= opal_xive_get_irq_config(num
, &vp
, &prio
, &lirq
);
2538 xmon_printf("IRQ 0x%x config: vp=0x%llx prio=%d lirq=0x%x (rc=%lld)\n",
2539 num
, be64_to_cpu(vp
), prio
, be32_to_cpu(lirq
), rc
);
2542 static void dump_xives(void)
2547 if (!xive_enabled()) {
2548 printf("Xive disabled on this system\n");
2556 } else if (c
== 'i') {
2558 dump_one_xive_irq(num
);
2562 termch
= c
; /* Put c back, it wasn't 'a' */
2567 dump_one_xive(xmon_owner
);
2569 #endif /* CONFIG_PPC_POWERNV */
2571 static void dump_by_size(unsigned long addr
, long count
, int size
)
2573 unsigned char temp
[16];
2577 count
= ALIGN(count
, 16);
2579 for (i
= 0; i
< count
; i
+= 16, addr
+= 16) {
2582 if (mread(addr
, temp
, 16) != 16) {
2583 printf("\nFaulted reading %d bytes from 0x"REG
"\n", 16, addr
);
2587 for (j
= 0; j
< 16; j
+= size
) {
2590 case 1: val
= temp
[j
]; break;
2591 case 2: val
= *(u16
*)&temp
[j
]; break;
2592 case 4: val
= *(u32
*)&temp
[j
]; break;
2593 case 8: val
= *(u64
*)&temp
[j
]; break;
2597 printf("%0*llx", size
* 2, val
);
2606 static char last
[] = { "d?\n" };
2613 xmon_start_pagination();
2615 xmon_end_pagination();
2619 #ifdef CONFIG_PPC_POWERNV
2621 xmon_start_pagination();
2623 xmon_end_pagination();
2636 scanhex((void *)&adrs
);
2643 else if (nidump
> MAX_DUMP
)
2645 adrs
+= ppc_inst_dump(adrs
, nidump
, 1);
2647 } else if (c
== 'l') {
2649 } else if (c
== 'o') {
2651 } else if (c
== 'v') {
2652 /* dump virtual to physical translation */
2654 } else if (c
== 'r') {
2658 xmon_rawdump(adrs
, ndump
);
2665 else if (ndump
> MAX_DUMP
)
2673 ndump
= ALIGN(ndump
, 16);
2674 dump_by_size(adrs
, ndump
, c
- '0');
2679 prdump(adrs
, ndump
);
2688 prdump(unsigned long adrs
, long ndump
)
2690 long n
, m
, c
, r
, nr
;
2691 unsigned char temp
[16];
2693 for (n
= ndump
; n
> 0;) {
2697 nr
= mread(adrs
, temp
, r
);
2699 for (m
= 0; m
< r
; ++m
) {
2700 if ((m
& (sizeof(long) - 1)) == 0 && m
> 0)
2703 printf("%.2x", temp
[m
]);
2705 printf("%s", fault_chars
[fault_type
]);
2707 for (; m
< 16; ++m
) {
2708 if ((m
& (sizeof(long) - 1)) == 0)
2713 for (m
= 0; m
< r
; ++m
) {
2716 putchar(' ' <= c
&& c
<= '~'? c
: '.');
2729 typedef int (*instruction_dump_func
)(unsigned long inst
, unsigned long addr
);
2732 generic_inst_dump(unsigned long adr
, long count
, int praddr
,
2733 instruction_dump_func dump_func
)
2736 unsigned long first_adr
;
2737 unsigned int inst
, last_inst
= 0;
2738 unsigned char val
[4];
2741 for (first_adr
= adr
; count
> 0; --count
, adr
+= 4) {
2742 nr
= mread(adr
, val
, 4);
2745 const char *x
= fault_chars
[fault_type
];
2746 printf(REG
" %s%s%s%s\n", adr
, x
, x
, x
, x
);
2750 inst
= GETWORD(val
);
2751 if (adr
> first_adr
&& inst
== last_inst
) {
2761 printf(REG
" %.8x", adr
, inst
);
2763 dump_func(inst
, adr
);
2766 return adr
- first_adr
;
2770 ppc_inst_dump(unsigned long adr
, long count
, int praddr
)
2772 return generic_inst_dump(adr
, count
, praddr
, print_insn_powerpc
);
2776 print_address(unsigned long addr
)
2778 xmon_print_symbol(addr
, "\t# ", "");
2784 struct kmsg_dumper dumper
= { .active
= 1 };
2785 unsigned char buf
[128];
2788 if (setjmp(bus_error_jmp
) != 0) {
2789 printf("Error dumping printk buffer!\n");
2793 catch_memory_errors
= 1;
2796 kmsg_dump_rewind_nolock(&dumper
);
2797 xmon_start_pagination();
2798 while (kmsg_dump_get_line_nolock(&dumper
, false, buf
, sizeof(buf
), &len
)) {
2802 xmon_end_pagination();
2805 /* wait a little while to see if we get a machine check */
2807 catch_memory_errors
= 0;
2810 #ifdef CONFIG_PPC_POWERNV
2811 static void dump_opal_msglog(void)
2813 unsigned char buf
[128];
2817 if (!firmware_has_feature(FW_FEATURE_OPAL
)) {
2818 printf("Machine is not running OPAL firmware.\n");
2822 if (setjmp(bus_error_jmp
) != 0) {
2823 printf("Error dumping OPAL msglog!\n");
2827 catch_memory_errors
= 1;
2830 xmon_start_pagination();
2831 while ((res
= opal_msglog_copy(buf
, pos
, sizeof(buf
) - 1))) {
2833 printf("Error dumping OPAL msglog! Error: %zd\n", res
);
2840 xmon_end_pagination();
2843 /* wait a little while to see if we get a machine check */
2845 catch_memory_errors
= 0;
2850 * Memory operations - move, set, print differences
2852 static unsigned long mdest
; /* destination address */
2853 static unsigned long msrc
; /* source address */
2854 static unsigned long mval
; /* byte value to set memory to */
2855 static unsigned long mcount
; /* # bytes to affect */
2856 static unsigned long mdiffs
; /* max # differences to print */
2861 scanhex((void *)&mdest
);
2862 if( termch
!= '\n' )
2864 scanhex((void *)(cmd
== 's'? &mval
: &msrc
));
2865 if( termch
!= '\n' )
2867 scanhex((void *)&mcount
);
2870 memmove((void *)mdest
, (void *)msrc
, mcount
);
2873 memset((void *)mdest
, mval
, mcount
);
2876 if( termch
!= '\n' )
2878 scanhex((void *)&mdiffs
);
2879 memdiffs((unsigned char *)mdest
, (unsigned char *)msrc
, mcount
, mdiffs
);
2885 memdiffs(unsigned char *p1
, unsigned char *p2
, unsigned nb
, unsigned maxpr
)
2890 for( n
= nb
; n
> 0; --n
)
2891 if( *p1
++ != *p2
++ )
2892 if( ++prt
<= maxpr
)
2893 printf("%px %.2x # %px %.2x\n", p1
- 1,
2894 p1
[-1], p2
- 1, p2
[-1]);
2896 printf("Total of %d differences\n", prt
);
2899 static unsigned mend
;
2900 static unsigned mask
;
2906 unsigned char val
[4];
2909 scanhex((void *)&mdest
);
2910 if (termch
!= '\n') {
2912 scanhex((void *)&mend
);
2913 if (termch
!= '\n') {
2915 scanhex((void *)&mval
);
2917 if (termch
!= '\n') termch
= 0;
2918 scanhex((void *)&mask
);
2922 for (a
= mdest
; a
< mend
; a
+= 4) {
2923 if (mread(a
, val
, 4) == 4
2924 && ((GETWORD(val
) ^ mval
) & mask
) == 0) {
2925 printf("%.16x: %.16x\n", a
, GETWORD(val
));
2932 static unsigned long mskip
= 0x1000;
2933 static unsigned long mlim
= 0xffffffff;
2943 if (termch
!= '\n') termch
= 0;
2945 if (termch
!= '\n') termch
= 0;
2948 for (a
= mdest
; a
< mlim
; a
+= mskip
) {
2949 ok
= mread(a
, &v
, 1);
2951 printf("%.8x .. ", a
);
2952 } else if (!ok
&& ook
)
2953 printf("%.8lx\n", a
- mskip
);
2959 printf("%.8lx\n", a
- mskip
);
2962 static void show_task(struct task_struct
*tsk
)
2967 * Cloned from kdb_task_state_char(), which is not entirely
2968 * appropriate for calling from xmon. This could be moved
2969 * to a common, generic, routine used by both.
2971 state
= (tsk
->state
== 0) ? 'R' :
2972 (tsk
->state
< 0) ? 'U' :
2973 (tsk
->state
& TASK_UNINTERRUPTIBLE
) ? 'D' :
2974 (tsk
->state
& TASK_STOPPED
) ? 'T' :
2975 (tsk
->state
& TASK_TRACED
) ? 'C' :
2976 (tsk
->exit_state
& EXIT_ZOMBIE
) ? 'Z' :
2977 (tsk
->exit_state
& EXIT_DEAD
) ? 'E' :
2978 (tsk
->state
& TASK_INTERRUPTIBLE
) ? 'S' : '?';
2980 printf("%px %016lx %6d %6d %c %2d %s\n", tsk
,
2982 tsk
->pid
, tsk
->parent
->pid
,
2983 state
, task_thread_info(tsk
)->cpu
,
2987 #ifdef CONFIG_PPC_BOOK3S_64
2988 void format_pte(void *ptep
, unsigned long pte
)
2990 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep
, pte
);
2991 printf("Maps physical address = 0x%016lx\n", pte
& PTE_RPN_MASK
);
2993 printf("Flags = %s%s%s%s%s\n",
2994 (pte
& _PAGE_ACCESSED
) ? "Accessed " : "",
2995 (pte
& _PAGE_DIRTY
) ? "Dirty " : "",
2996 (pte
& _PAGE_READ
) ? "Read " : "",
2997 (pte
& _PAGE_WRITE
) ? "Write " : "",
2998 (pte
& _PAGE_EXEC
) ? "Exec " : "");
3001 static void show_pte(unsigned long addr
)
3003 unsigned long tskv
= 0;
3004 struct task_struct
*tsk
= NULL
;
3005 struct mm_struct
*mm
;
3006 pgd_t
*pgdp
, *pgdir
;
3011 if (!scanhex(&tskv
))
3014 tsk
= (struct task_struct
*)tskv
;
3019 mm
= tsk
->active_mm
;
3021 if (setjmp(bus_error_jmp
) != 0) {
3022 catch_memory_errors
= 0;
3023 printf("*** Error dumping pte for task %px\n", tsk
);
3027 catch_memory_errors
= 1;
3030 if (mm
== &init_mm
) {
3031 pgdp
= pgd_offset_k(addr
);
3032 pgdir
= pgd_offset_k(0);
3034 pgdp
= pgd_offset(mm
, addr
);
3035 pgdir
= pgd_offset(mm
, 0);
3038 if (pgd_none(*pgdp
)) {
3039 printf("no linux page table for address\n");
3043 printf("pgd @ 0x%px\n", pgdir
);
3045 if (pgd_huge(*pgdp
)) {
3046 format_pte(pgdp
, pgd_val(*pgdp
));
3049 printf("pgdp @ 0x%px = 0x%016lx\n", pgdp
, pgd_val(*pgdp
));
3051 pudp
= pud_offset(pgdp
, addr
);
3053 if (pud_none(*pudp
)) {
3054 printf("No valid PUD\n");
3058 if (pud_huge(*pudp
)) {
3059 format_pte(pudp
, pud_val(*pudp
));
3063 printf("pudp @ 0x%px = 0x%016lx\n", pudp
, pud_val(*pudp
));
3065 pmdp
= pmd_offset(pudp
, addr
);
3067 if (pmd_none(*pmdp
)) {
3068 printf("No valid PMD\n");
3072 if (pmd_huge(*pmdp
)) {
3073 format_pte(pmdp
, pmd_val(*pmdp
));
3076 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp
, pmd_val(*pmdp
));
3078 ptep
= pte_offset_map(pmdp
, addr
);
3079 if (pte_none(*ptep
)) {
3080 printf("no valid PTE\n");
3084 format_pte(ptep
, pte_val(*ptep
));
3088 catch_memory_errors
= 0;
3091 static void show_pte(unsigned long addr
)
3093 printf("show_pte not yet implemented\n");
3095 #endif /* CONFIG_PPC_BOOK3S_64 */
3097 static void show_tasks(void)
3100 struct task_struct
*tsk
= NULL
;
3102 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
3105 tsk
= (struct task_struct
*)tskv
;
3107 if (setjmp(bus_error_jmp
) != 0) {
3108 catch_memory_errors
= 0;
3109 printf("*** Error dumping task %px\n", tsk
);
3113 catch_memory_errors
= 1;
3119 for_each_process(tsk
)
3124 catch_memory_errors
= 0;
3127 static void proccall(void)
3129 unsigned long args
[8];
3132 typedef unsigned long (*callfunc_t
)(unsigned long, unsigned long,
3133 unsigned long, unsigned long, unsigned long,
3134 unsigned long, unsigned long, unsigned long);
3137 if (!scanhex(&adrs
))
3141 for (i
= 0; i
< 8; ++i
)
3143 for (i
= 0; i
< 8; ++i
) {
3144 if (!scanhex(&args
[i
]) || termch
== '\n')
3148 func
= (callfunc_t
) adrs
;
3150 if (setjmp(bus_error_jmp
) == 0) {
3151 catch_memory_errors
= 1;
3153 ret
= func(args
[0], args
[1], args
[2], args
[3],
3154 args
[4], args
[5], args
[6], args
[7]);
3156 printf("return value is 0x%lx\n", ret
);
3158 printf("*** %x exception occurred\n", fault_except
);
3160 catch_memory_errors
= 0;
3163 /* Input scanning routines */
3174 while( c
== ' ' || c
== '\t' )
3180 static const char *regnames
[N_PTREGS
] = {
3181 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3182 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3183 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3184 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3185 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3191 "trap", "dar", "dsisr", "res"
3195 scanhex(unsigned long *vp
)
3202 /* parse register name */
3206 for (i
= 0; i
< sizeof(regname
) - 1; ++i
) {
3215 i
= match_string(regnames
, N_PTREGS
, regname
);
3217 printf("invalid register name '%%%s'\n", regname
);
3220 if (xmon_regs
== NULL
) {
3221 printf("regs not available\n");
3224 *vp
= ((unsigned long *)xmon_regs
)[i
];
3228 /* skip leading "0x" if any */
3242 } else if (c
== '$') {
3244 for (i
=0; i
<63; i
++) {
3246 if (isspace(c
) || c
== '\0') {
3254 if (setjmp(bus_error_jmp
) == 0) {
3255 catch_memory_errors
= 1;
3257 *vp
= kallsyms_lookup_name(tmpstr
);
3260 catch_memory_errors
= 0;
3262 printf("unknown symbol '%s'\n", tmpstr
);
3295 static int hexdigit(int c
)
3297 if( '0' <= c
&& c
<= '9' )
3299 if( 'A' <= c
&& c
<= 'F' )
3300 return c
- ('A' - 10);
3301 if( 'a' <= c
&& c
<= 'f' )
3302 return c
- ('a' - 10);
3307 getstring(char *s
, int size
)
3318 } while( c
!= ' ' && c
!= '\t' && c
!= '\n' );
3323 static char line
[256];
3324 static char *lineptr
;
3335 if (lineptr
== NULL
|| *lineptr
== 0) {
3336 if (xmon_gets(line
, sizeof(line
)) == NULL
) {
3346 take_input(char *str
)
3355 int type
= inchar();
3357 static char tmp
[64];
3362 xmon_print_symbol(addr
, ": ", "\n");
3367 if (setjmp(bus_error_jmp
) == 0) {
3368 catch_memory_errors
= 1;
3370 addr
= kallsyms_lookup_name(tmp
);
3372 printf("%s: %lx\n", tmp
, addr
);
3374 printf("Symbol '%s' not found.\n", tmp
);
3377 catch_memory_errors
= 0;
3384 /* Print an address in numeric and symbolic form (if possible) */
3385 static void xmon_print_symbol(unsigned long address
, const char *mid
,
3389 const char *name
= NULL
;
3390 unsigned long offset
, size
;
3392 printf(REG
, address
);
3393 if (setjmp(bus_error_jmp
) == 0) {
3394 catch_memory_errors
= 1;
3396 name
= kallsyms_lookup(address
, &size
, &offset
, &modname
,
3399 /* wait a little while to see if we get a machine check */
3403 catch_memory_errors
= 0;
3406 printf("%s%s+%#lx/%#lx", mid
, name
, offset
, size
);
3408 printf(" [%s]", modname
);
3410 printf("%s", after
);
3413 #ifdef CONFIG_PPC_BOOK3S_64
3414 void dump_segments(void)
3417 unsigned long esid
,vsid
;
3420 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3422 for (i
= 0; i
< mmu_slb_size
; i
++) {
3423 asm volatile("slbmfee %0,%1" : "=r" (esid
) : "r" (i
));
3424 asm volatile("slbmfev %0,%1" : "=r" (vsid
) : "r" (i
));
3429 printf("%02d %016lx %016lx", i
, esid
, vsid
);
3431 if (!(esid
& SLB_ESID_V
)) {
3436 llp
= vsid
& SLB_VSID_LLP
;
3437 if (vsid
& SLB_VSID_B_1T
) {
3438 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3440 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT_1T
,
3443 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3445 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT
,
3452 #ifdef CONFIG_PPC_STD_MMU_32
3453 void dump_segments(void)
3458 for (i
= 0; i
< 16; ++i
)
3459 printf(" %x", mfsrin(i
));
3465 static void dump_tlb_44x(void)
3469 for (i
= 0; i
< PPC44x_TLB_SIZE
; i
++) {
3470 unsigned long w0
,w1
,w2
;
3471 asm volatile("tlbre %0,%1,0" : "=r" (w0
) : "r" (i
));
3472 asm volatile("tlbre %0,%1,1" : "=r" (w1
) : "r" (i
));
3473 asm volatile("tlbre %0,%1,2" : "=r" (w2
) : "r" (i
));
3474 printf("[%02x] %08lx %08lx %08lx ", i
, w0
, w1
, w2
);
3475 if (w0
& PPC44x_TLB_VALID
) {
3476 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3477 w0
& PPC44x_TLB_EPN_MASK
,
3478 w1
& PPC44x_TLB_ERPN_MASK
,
3479 w1
& PPC44x_TLB_RPN_MASK
,
3480 (w2
& PPC44x_TLB_W
) ? 'W' : 'w',
3481 (w2
& PPC44x_TLB_I
) ? 'I' : 'i',
3482 (w2
& PPC44x_TLB_M
) ? 'M' : 'm',
3483 (w2
& PPC44x_TLB_G
) ? 'G' : 'g',
3484 (w2
& PPC44x_TLB_E
) ? 'E' : 'e');
3489 #endif /* CONFIG_44x */
3491 #ifdef CONFIG_PPC_BOOK3E
3492 static void dump_tlb_book3e(void)
3494 u32 mmucfg
, pidmask
, lpidmask
;
3496 int i
, tlb
, ntlbs
, pidsz
, lpidsz
, rasz
, lrat
= 0;
3498 static const char *pgsz_names
[] = {
3533 /* Gather some infos about the MMU */
3534 mmucfg
= mfspr(SPRN_MMUCFG
);
3535 mmu_version
= (mmucfg
& 3) + 1;
3536 ntlbs
= ((mmucfg
>> 2) & 3) + 1;
3537 pidsz
= ((mmucfg
>> 6) & 0x1f) + 1;
3538 lpidsz
= (mmucfg
>> 24) & 0xf;
3539 rasz
= (mmucfg
>> 16) & 0x7f;
3540 if ((mmu_version
> 1) && (mmucfg
& 0x10000))
3542 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3543 mmu_version
, ntlbs
, pidsz
, lpidsz
, rasz
);
3544 pidmask
= (1ul << pidsz
) - 1;
3545 lpidmask
= (1ul << lpidsz
) - 1;
3546 ramask
= (1ull << rasz
) - 1;
3548 for (tlb
= 0; tlb
< ntlbs
; tlb
++) {
3550 int nent
, assoc
, new_cc
= 1;
3551 printf("TLB %d:\n------\n", tlb
);
3554 tlbcfg
= mfspr(SPRN_TLB0CFG
);
3557 tlbcfg
= mfspr(SPRN_TLB1CFG
);
3560 tlbcfg
= mfspr(SPRN_TLB2CFG
);
3563 tlbcfg
= mfspr(SPRN_TLB3CFG
);
3566 printf("Unsupported TLB number !\n");
3569 nent
= tlbcfg
& 0xfff;
3570 assoc
= (tlbcfg
>> 24) & 0xff;
3571 for (i
= 0; i
< nent
; i
++) {
3572 u32 mas0
= MAS0_TLBSEL(tlb
);
3573 u32 mas1
= MAS1_TSIZE(BOOK3E_PAGESZ_4K
);
3576 int esel
= i
, cc
= i
;
3584 mas0
|= MAS0_ESEL(esel
);
3585 mtspr(SPRN_MAS0
, mas0
);
3586 mtspr(SPRN_MAS1
, mas1
);
3587 mtspr(SPRN_MAS2
, mas2
);
3588 asm volatile("tlbre 0,0,0" : : : "memory");
3589 mas1
= mfspr(SPRN_MAS1
);
3590 mas2
= mfspr(SPRN_MAS2
);
3591 mas7_mas3
= mfspr(SPRN_MAS7_MAS3
);
3592 if (assoc
&& (i
% assoc
) == 0)
3594 if (!(mas1
& MAS1_VALID
))
3597 printf("%04x- ", i
);
3599 printf("%04x-%c", cc
, 'A' + esel
);
3601 printf(" |%c", 'A' + esel
);
3603 printf(" %016llx %04x %s %c%c AS%c",
3605 (mas1
>> 16) & 0x3fff,
3606 pgsz_names
[(mas1
>> 7) & 0x1f],
3607 mas1
& MAS1_IND
? 'I' : ' ',
3608 mas1
& MAS1_IPROT
? 'P' : ' ',
3609 mas1
& MAS1_TS
? '1' : '0');
3610 printf(" %c%c%c%c%c%c%c",
3611 mas2
& MAS2_X0
? 'a' : ' ',
3612 mas2
& MAS2_X1
? 'v' : ' ',
3613 mas2
& MAS2_W
? 'w' : ' ',
3614 mas2
& MAS2_I
? 'i' : ' ',
3615 mas2
& MAS2_M
? 'm' : ' ',
3616 mas2
& MAS2_G
? 'g' : ' ',
3617 mas2
& MAS2_E
? 'e' : ' ');
3618 printf(" %016llx", mas7_mas3
& ramask
& ~0x7ffull
);
3619 if (mas1
& MAS1_IND
)
3621 pgsz_names
[(mas7_mas3
>> 1) & 0x1f]);
3623 printf(" U%c%c%c S%c%c%c\n",
3624 mas7_mas3
& MAS3_UX
? 'x' : ' ',
3625 mas7_mas3
& MAS3_UW
? 'w' : ' ',
3626 mas7_mas3
& MAS3_UR
? 'r' : ' ',
3627 mas7_mas3
& MAS3_SX
? 'x' : ' ',
3628 mas7_mas3
& MAS3_SW
? 'w' : ' ',
3629 mas7_mas3
& MAS3_SR
? 'r' : ' ');
3633 #endif /* CONFIG_PPC_BOOK3E */
3635 static void xmon_init(int enable
)
3639 __debugger_ipi
= xmon_ipi
;
3640 __debugger_bpt
= xmon_bpt
;
3641 __debugger_sstep
= xmon_sstep
;
3642 __debugger_iabr_match
= xmon_iabr_match
;
3643 __debugger_break_match
= xmon_break_match
;
3644 __debugger_fault_handler
= xmon_fault_handler
;
3647 __debugger_ipi
= NULL
;
3648 __debugger_bpt
= NULL
;
3649 __debugger_sstep
= NULL
;
3650 __debugger_iabr_match
= NULL
;
3651 __debugger_break_match
= NULL
;
3652 __debugger_fault_handler
= NULL
;
3656 #ifdef CONFIG_MAGIC_SYSRQ
3657 static void sysrq_handle_xmon(int key
)
3659 /* ensure xmon is enabled */
3661 debugger(get_irq_regs());
3666 static struct sysrq_key_op sysrq_xmon_op
= {
3667 .handler
= sysrq_handle_xmon
,
3668 .help_msg
= "xmon(x)",
3669 .action_msg
= "Entering xmon",
3672 static int __init
setup_xmon_sysrq(void)
3674 register_sysrq_key('x', &sysrq_xmon_op
);
3677 device_initcall(setup_xmon_sysrq
);
3678 #endif /* CONFIG_MAGIC_SYSRQ */
3680 #ifdef CONFIG_DEBUG_FS
3681 static void clear_all_bpt(void)
3685 /* clear/unpatch all breakpoints */
3689 /* Disable all breakpoints */
3690 for (i
= 0; i
< NBPTS
; ++i
)
3691 bpts
[i
].enabled
= 0;
3693 /* Clear any data or iabr breakpoints */
3694 if (iabr
|| dabr
.enabled
) {
3699 printf("xmon: All breakpoints cleared\n");
3702 static int xmon_dbgfs_set(void *data
, u64 val
)
3707 /* make sure all breakpoints removed when disabling */
3713 static int xmon_dbgfs_get(void *data
, u64
*val
)
3719 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops
, xmon_dbgfs_get
,
3720 xmon_dbgfs_set
, "%llu\n");
3722 static int __init
setup_xmon_dbgfs(void)
3724 debugfs_create_file("xmon", 0600, powerpc_debugfs_root
, NULL
,
3728 device_initcall(setup_xmon_dbgfs
);
3729 #endif /* CONFIG_DEBUG_FS */
3731 static int xmon_early __initdata
;
3733 static int __init
early_parse_xmon(char *p
)
3735 if (!p
|| strncmp(p
, "early", 5) == 0) {
3736 /* just "xmon" is equivalent to "xmon=early" */
3740 } else if (strncmp(p
, "on", 2) == 0) {
3743 } else if (strncmp(p
, "off", 3) == 0)
3750 early_param("xmon", early_parse_xmon
);
3752 void __init
xmon_setup(void)
3760 #ifdef CONFIG_SPU_BASE
3764 u64 saved_mfc_sr1_RW
;
3765 u32 saved_spu_runcntl_RW
;
3766 unsigned long dump_addr
;
3770 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
3772 static struct spu_info spu_info
[XMON_NUM_SPUS
];
3774 void xmon_register_spus(struct list_head
*list
)
3778 list_for_each_entry(spu
, list
, full_list
) {
3779 if (spu
->number
>= XMON_NUM_SPUS
) {
3784 spu_info
[spu
->number
].spu
= spu
;
3785 spu_info
[spu
->number
].stopped_ok
= 0;
3786 spu_info
[spu
->number
].dump_addr
= (unsigned long)
3787 spu_info
[spu
->number
].spu
->local_store
;
3791 static void stop_spus(void)
3797 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3798 if (!spu_info
[i
].spu
)
3801 if (setjmp(bus_error_jmp
) == 0) {
3802 catch_memory_errors
= 1;
3805 spu
= spu_info
[i
].spu
;
3807 spu_info
[i
].saved_spu_runcntl_RW
=
3808 in_be32(&spu
->problem
->spu_runcntl_RW
);
3810 tmp
= spu_mfc_sr1_get(spu
);
3811 spu_info
[i
].saved_mfc_sr1_RW
= tmp
;
3813 tmp
&= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK
;
3814 spu_mfc_sr1_set(spu
, tmp
);
3819 spu_info
[i
].stopped_ok
= 1;
3821 printf("Stopped spu %.2d (was %s)\n", i
,
3822 spu_info
[i
].saved_spu_runcntl_RW
?
3823 "running" : "stopped");
3825 catch_memory_errors
= 0;
3826 printf("*** Error stopping spu %.2d\n", i
);
3828 catch_memory_errors
= 0;
3832 static void restart_spus(void)
3837 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3838 if (!spu_info
[i
].spu
)
3841 if (!spu_info
[i
].stopped_ok
) {
3842 printf("*** Error, spu %d was not successfully stopped"
3843 ", not restarting\n", i
);
3847 if (setjmp(bus_error_jmp
) == 0) {
3848 catch_memory_errors
= 1;
3851 spu
= spu_info
[i
].spu
;
3852 spu_mfc_sr1_set(spu
, spu_info
[i
].saved_mfc_sr1_RW
);
3853 out_be32(&spu
->problem
->spu_runcntl_RW
,
3854 spu_info
[i
].saved_spu_runcntl_RW
);
3859 printf("Restarted spu %.2d\n", i
);
3861 catch_memory_errors
= 0;
3862 printf("*** Error restarting spu %.2d\n", i
);
3864 catch_memory_errors
= 0;
3868 #define DUMP_WIDTH 23
3869 #define DUMP_VALUE(format, field, value) \
3871 if (setjmp(bus_error_jmp) == 0) { \
3872 catch_memory_errors = 1; \
3874 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3879 catch_memory_errors = 0; \
3880 printf(" %-*s = *** Error reading field.\n", \
3881 DUMP_WIDTH, #field); \
3883 catch_memory_errors = 0; \
3886 #define DUMP_FIELD(obj, format, field) \
3887 DUMP_VALUE(format, field, obj->field)
3889 static void dump_spu_fields(struct spu
*spu
)
3891 printf("Dumping spu fields at address %p:\n", spu
);
3893 DUMP_FIELD(spu
, "0x%x", number
);
3894 DUMP_FIELD(spu
, "%s", name
);
3895 DUMP_FIELD(spu
, "0x%lx", local_store_phys
);
3896 DUMP_FIELD(spu
, "0x%p", local_store
);
3897 DUMP_FIELD(spu
, "0x%lx", ls_size
);
3898 DUMP_FIELD(spu
, "0x%x", node
);
3899 DUMP_FIELD(spu
, "0x%lx", flags
);
3900 DUMP_FIELD(spu
, "%llu", class_0_pending
);
3901 DUMP_FIELD(spu
, "0x%llx", class_0_dar
);
3902 DUMP_FIELD(spu
, "0x%llx", class_1_dar
);
3903 DUMP_FIELD(spu
, "0x%llx", class_1_dsisr
);
3904 DUMP_FIELD(spu
, "0x%x", irqs
[0]);
3905 DUMP_FIELD(spu
, "0x%x", irqs
[1]);
3906 DUMP_FIELD(spu
, "0x%x", irqs
[2]);
3907 DUMP_FIELD(spu
, "0x%x", slb_replace
);
3908 DUMP_FIELD(spu
, "%d", pid
);
3909 DUMP_FIELD(spu
, "0x%p", mm
);
3910 DUMP_FIELD(spu
, "0x%p", ctx
);
3911 DUMP_FIELD(spu
, "0x%p", rq
);
3912 DUMP_FIELD(spu
, "0x%llx", timestamp
);
3913 DUMP_FIELD(spu
, "0x%lx", problem_phys
);
3914 DUMP_FIELD(spu
, "0x%p", problem
);
3915 DUMP_VALUE("0x%x", problem
->spu_runcntl_RW
,
3916 in_be32(&spu
->problem
->spu_runcntl_RW
));
3917 DUMP_VALUE("0x%x", problem
->spu_status_R
,
3918 in_be32(&spu
->problem
->spu_status_R
));
3919 DUMP_VALUE("0x%x", problem
->spu_npc_RW
,
3920 in_be32(&spu
->problem
->spu_npc_RW
));
3921 DUMP_FIELD(spu
, "0x%p", priv2
);
3922 DUMP_FIELD(spu
, "0x%p", pdata
);
3926 spu_inst_dump(unsigned long adr
, long count
, int praddr
)
3928 return generic_inst_dump(adr
, count
, praddr
, print_insn_spu
);
3931 static void dump_spu_ls(unsigned long num
, int subcmd
)
3933 unsigned long offset
, addr
, ls_addr
;
3935 if (setjmp(bus_error_jmp
) == 0) {
3936 catch_memory_errors
= 1;
3938 ls_addr
= (unsigned long)spu_info
[num
].spu
->local_store
;
3942 catch_memory_errors
= 0;
3943 printf("*** Error: accessing spu info for spu %ld\n", num
);
3946 catch_memory_errors
= 0;
3948 if (scanhex(&offset
))
3949 addr
= ls_addr
+ offset
;
3951 addr
= spu_info
[num
].dump_addr
;
3953 if (addr
>= ls_addr
+ LS_SIZE
) {
3954 printf("*** Error: address outside of local store\n");
3960 addr
+= spu_inst_dump(addr
, 16, 1);
3970 spu_info
[num
].dump_addr
= addr
;
3973 static int do_spu_cmd(void)
3975 static unsigned long num
= 0;
3976 int cmd
, subcmd
= 0;
3988 if (isxdigit(subcmd
) || subcmd
== '\n')
3992 if (num
>= XMON_NUM_SPUS
|| !spu_info
[num
].spu
) {
3993 printf("*** Error: invalid spu number\n");
3999 dump_spu_fields(spu_info
[num
].spu
);
4002 dump_spu_ls(num
, subcmd
);
4013 #else /* ! CONFIG_SPU_BASE */
4014 static int do_spu_cmd(void)