1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Routines providing a simple monitor for use on the PowerMac.
5 * Copyright (C) 1996-2005 Paul Mackerras.
6 * Copyright (C) 2001 PPC64 Team, IBM Corp
7 * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/sched/signal.h>
13 #include <linux/smp.h>
15 #include <linux/reboot.h>
16 #include <linux/delay.h>
17 #include <linux/kallsyms.h>
18 #include <linux/kmsg_dump.h>
19 #include <linux/cpumask.h>
20 #include <linux/export.h>
21 #include <linux/sysrq.h>
22 #include <linux/interrupt.h>
23 #include <linux/irq.h>
24 #include <linux/bug.h>
25 #include <linux/nmi.h>
26 #include <linux/ctype.h>
27 #include <linux/highmem.h>
28 #include <linux/security.h>
30 #include <asm/debugfs.h>
31 #include <asm/ptrace.h>
33 #include <asm/string.h>
35 #include <asm/machdep.h>
37 #include <asm/processor.h>
39 #include <asm/mmu_context.h>
40 #include <asm/plpar_wrappers.h>
41 #include <asm/cputable.h>
43 #include <asm/sstep.h>
44 #include <asm/irq_regs.h>
46 #include <asm/spu_priv1.h>
47 #include <asm/setjmp.h>
49 #include <asm/debug.h>
50 #include <asm/hw_breakpoint.h>
53 #include <asm/firmware.h>
54 #include <asm/code-patching.h>
55 #include <asm/sections.h>
59 #include <asm/hvcall.h>
65 #include "xmon_bpts.h"
68 static cpumask_t cpus_in_xmon
= CPU_MASK_NONE
;
69 static unsigned long xmon_taken
= 1;
70 static int xmon_owner
;
74 #endif /* CONFIG_SMP */
76 #ifdef CONFIG_PPC_PSERIES
77 static int set_indicator_token
= RTAS_UNKNOWN_SERVICE
;
79 static unsigned long in_xmon __read_mostly
= 0;
80 static int xmon_on
= IS_ENABLED(CONFIG_XMON_DEFAULT
);
81 static bool xmon_is_ro
= IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE
);
83 static unsigned long adrs
;
85 #define MAX_DUMP (64 * 1024)
86 static unsigned long ndump
= 64;
87 #define MAX_IDUMP (MAX_DUMP >> 2)
88 static unsigned long nidump
= 16;
89 static unsigned long ncsum
= 4096;
91 static char tmpstr
[128];
92 static int tracing_enabled
;
94 static long bus_error_jmp
[JMP_BUF_LEN
];
95 static int catch_memory_errors
;
96 static int catch_spr_faults
;
97 static long *xmon_fault_jmp
[NR_CPUS
];
99 /* Breakpoint stuff */
101 unsigned long address
;
102 struct ppc_inst
*instr
;
108 /* Bits in bpt.enabled */
113 static struct bpt bpts
[NBPTS
];
114 static struct bpt dabr
[HBP_NUM_MAX
];
115 static struct bpt
*iabr
;
116 static unsigned bpinstr
= 0x7fe00008; /* trap */
118 #define BP_NUM(bp) ((bp) - bpts + 1)
121 static int cmds(struct pt_regs
*);
122 static int mread(unsigned long, void *, int);
123 static int mwrite(unsigned long, void *, int);
124 static int mread_instr(unsigned long, struct ppc_inst
*);
125 static int handle_fault(struct pt_regs
*);
126 static void byterev(unsigned char *, int);
127 static void memex(void);
128 static int bsesc(void);
129 static void dump(void);
130 static void show_pte(unsigned long);
131 static void prdump(unsigned long, long);
132 static int ppc_inst_dump(unsigned long, long, int);
133 static void dump_log_buf(void);
135 #ifdef CONFIG_PPC_POWERNV
136 static void dump_opal_msglog(void);
138 static inline void dump_opal_msglog(void)
140 printf("Machine is not running OPAL firmware.\n");
144 static void backtrace(struct pt_regs
*);
145 static void excprint(struct pt_regs
*);
146 static void prregs(struct pt_regs
*);
147 static void memops(int);
148 static void memlocate(void);
149 static void memzcan(void);
150 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
152 int scanhex(unsigned long *valp
);
153 static void scannl(void);
154 static int hexdigit(int);
155 void getstring(char *, int);
156 static void flush_input(void);
157 static int inchar(void);
158 static void take_input(char *);
159 static int read_spr(int, unsigned long *);
160 static void write_spr(int, unsigned long);
161 static void super_regs(void);
162 static void remove_bpts(void);
163 static void insert_bpts(void);
164 static void remove_cpu_bpts(void);
165 static void insert_cpu_bpts(void);
166 static struct bpt
*at_breakpoint(unsigned long pc
);
167 static struct bpt
*in_breakpoint_table(unsigned long pc
, unsigned long *offp
);
168 static int do_step(struct pt_regs
*);
169 static void bpt_cmds(void);
170 static void cacheflush(void);
171 static int cpu_cmd(void);
172 static void csum(void);
173 static void bootcmds(void);
174 static void proccall(void);
175 static void show_tasks(void);
176 void dump_segments(void);
177 static void symbol_lookup(void);
178 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
180 static void xmon_print_symbol(unsigned long address
, const char *mid
,
182 static const char *getvecname(unsigned long vec
);
184 static int do_spu_cmd(void);
187 static void dump_tlb_44x(void);
189 #ifdef CONFIG_PPC_BOOK3E
190 static void dump_tlb_book3e(void);
193 static void clear_all_bpt(void);
201 #ifdef __LITTLE_ENDIAN__
202 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
204 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
207 static const char *xmon_ro_msg
= "Operation disabled: xmon in read-only mode\n";
209 static char *help_string
= "\
211 b show breakpoints\n\
212 bd set data breakpoint\n\
213 bi set instruction breakpoint\n\
214 bc clear breakpoint\n"
217 c print cpus stopped in xmon\n\
218 c# try to switch to cpu number h (in hex)\n"
223 d1 dump 1 byte values\n\
224 d2 dump 2 byte values\n\
225 d4 dump 4 byte values\n\
226 d8 dump 8 byte values\n\
227 di dump instructions\n\
228 df dump float values\n\
229 dd dump double values\n\
230 dl dump the kernel log buffer\n"
231 #ifdef CONFIG_PPC_POWERNV
233 do dump the OPAL message log\n"
237 dp[#] dump paca for current cpu, or cpu #\n\
238 dpa dump paca for all possible cpus\n"
241 dr dump stream of raw bytes\n\
242 dv dump virtual address translation \n\
243 dt dump the tracing buffers (uses printk)\n\
244 dtc dump the tracing buffers for current CPU (uses printk)\n\
246 #ifdef CONFIG_PPC_POWERNV
247 " dx# dump xive on CPU #\n\
248 dxi# dump xive irq state #\n\
249 dxa dump xive on all CPUs\n"
251 " e print exception information\n\
253 la lookup symbol+offset of specified address\n\
254 ls lookup address of specified symbol\n\
255 lp s [#] lookup address of percpu symbol s for current cpu, or cpu #\n\
256 m examine/change memory\n\
257 mm move a block of memory\n\
258 ms set a block of memory\n\
259 md compare two blocks of memory\n\
260 ml locate a block of memory\n\
261 mz zero a block of memory\n\
262 mi show information about memory allocation\n\
263 p call a procedure\n\
264 P list processes/tasks\n\
267 #ifdef CONFIG_SPU_BASE
268 " ss stop execution on all spus\n\
269 sr restore execution on stopped spus\n\
270 sf # dump spu fields for spu # (in hex)\n\
271 sd # dump spu local store for spu # (in hex)\n\
272 sdi # disassemble spu local store for spu # (in hex)\n"
274 " S print special registers\n\
277 Sw #v write v to SPR #\n\
279 x exit monitor and recover\n\
280 X exit monitor and don't recover\n"
281 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
282 " u dump segment table or SLB\n"
283 #elif defined(CONFIG_PPC_BOOK3S_32)
284 " u dump segment registers\n"
285 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
288 " U show uptime information\n"
290 " # n limit output to n lines per page (for dp, dpa, dl)\n"
295 #ifdef CONFIG_SECURITY
296 static bool xmon_is_locked_down(void)
298 static bool lockdown
;
301 lockdown
= !!security_locked_down(LOCKDOWN_XMON_RW
);
303 printf("xmon: Disabled due to kernel lockdown\n");
309 xmon_is_ro
= !!security_locked_down(LOCKDOWN_XMON_WR
);
311 printf("xmon: Read-only due to kernel lockdown\n");
316 #else /* CONFIG_SECURITY */
317 static inline bool xmon_is_locked_down(void)
323 static struct pt_regs
*xmon_regs
;
325 static inline void sync(void)
327 asm volatile("sync; isync");
330 static inline void cflush(void *p
)
332 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p
));
335 static inline void cinval(void *p
)
337 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p
));
341 * write_ciabr() - write the CIABR SPR
342 * @ciabr: The value to write.
344 * This function writes a value to the CIARB register either directly
345 * through mtspr instruction if the kernel is in HV privilege mode or
346 * call a hypervisor function to achieve the same in case the kernel
347 * is in supervisor privilege mode.
349 static void write_ciabr(unsigned long ciabr
)
351 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
354 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
355 mtspr(SPRN_CIABR
, ciabr
);
358 plpar_set_ciabr(ciabr
);
362 * set_ciabr() - set the CIABR
363 * @addr: The value to set.
365 * This function sets the correct privilege value into the the HW
366 * breakpoint address before writing it up in the CIABR register.
368 static void set_ciabr(unsigned long addr
)
372 if (cpu_has_feature(CPU_FTR_HVMODE
))
373 addr
|= CIABR_PRIV_HYPER
;
375 addr
|= CIABR_PRIV_SUPER
;
380 * Disable surveillance (the service processor watchdog function)
381 * while we are in xmon.
382 * XXX we should re-enable it when we leave. :)
384 #define SURVEILLANCE_TOKEN 9000
386 static inline void disable_surveillance(void)
388 #ifdef CONFIG_PPC_PSERIES
389 /* Since this can't be a module, args should end up below 4GB. */
390 static struct rtas_args args
;
393 * At this point we have got all the cpus we can into
394 * xmon, so there is hopefully no other cpu calling RTAS
395 * at the moment, even though we don't take rtas.lock.
396 * If we did try to take rtas.lock there would be a
397 * real possibility of deadlock.
399 if (set_indicator_token
== RTAS_UNKNOWN_SERVICE
)
402 rtas_call_unlocked(&args
, set_indicator_token
, 3, 1, NULL
,
403 SURVEILLANCE_TOKEN
, 0, 0);
405 #endif /* CONFIG_PPC_PSERIES */
409 static int xmon_speaker
;
411 static void get_output_lock(void)
413 int me
= smp_processor_id() + 0x100;
414 int last_speaker
= 0, prev
;
417 if (xmon_speaker
== me
)
421 last_speaker
= cmpxchg(&xmon_speaker
, 0, me
);
422 if (last_speaker
== 0)
426 * Wait a full second for the lock, we might be on a slow
427 * console, but check every 100us.
430 while (xmon_speaker
== last_speaker
) {
436 /* hostile takeover */
437 prev
= cmpxchg(&xmon_speaker
, last_speaker
, me
);
438 if (prev
== last_speaker
)
445 static void release_output_lock(void)
450 int cpus_are_in_xmon(void)
452 return !cpumask_empty(&cpus_in_xmon
);
455 static bool wait_for_other_cpus(int ncpus
)
457 unsigned long timeout
;
459 /* We wait for 2s, which is a metric "little while" */
460 for (timeout
= 20000; timeout
!= 0; --timeout
) {
461 if (cpumask_weight(&cpus_in_xmon
) >= ncpus
)
469 #else /* CONFIG_SMP */
470 static inline void get_output_lock(void) {}
471 static inline void release_output_lock(void) {}
474 static inline int unrecoverable_excp(struct pt_regs
*regs
)
476 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
477 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
480 return ((regs
->msr
& MSR_RI
) == 0);
484 static void xmon_touch_watchdogs(void)
486 touch_softlockup_watchdog_sync();
487 rcu_cpu_stall_reset();
488 touch_nmi_watchdog();
491 static int xmon_core(struct pt_regs
*regs
, int fromipi
)
495 long recurse_jmp
[JMP_BUF_LEN
];
497 unsigned long offset
;
504 local_irq_save(flags
);
507 locked_down
= xmon_is_locked_down();
510 tracing_enabled
= tracing_is_on();
514 bp
= in_breakpoint_table(regs
->nip
, &offset
);
516 regs
->nip
= bp
->address
+ offset
;
517 atomic_dec(&bp
->ref_count
);
523 cpu
= smp_processor_id();
524 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
526 * We catch SPR read/write faults here because the 0x700, 0xf60
527 * etc. handlers don't call debugger_fault_handler().
529 if (catch_spr_faults
)
530 longjmp(bus_error_jmp
, 1);
533 printf("cpu 0x%x: Exception %lx %s in xmon, "
534 "returning to main loop\n",
535 cpu
, regs
->trap
, getvecname(TRAP(regs
)));
536 release_output_lock();
537 longjmp(xmon_fault_jmp
[cpu
], 1);
540 if (setjmp(recurse_jmp
) != 0) {
541 if (!in_xmon
|| !xmon_gate
) {
543 printf("xmon: WARNING: bad recursive fault "
544 "on cpu 0x%x\n", cpu
);
545 release_output_lock();
548 secondary
= !(xmon_taken
&& cpu
== xmon_owner
);
552 xmon_fault_jmp
[cpu
] = recurse_jmp
;
555 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
))
556 bp
= at_breakpoint(regs
->nip
);
557 if (bp
|| unrecoverable_excp(regs
))
565 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
567 xmon_print_symbol(regs
->nip
, " ", ")\n");
569 if (unrecoverable_excp(regs
))
570 printf("WARNING: exception is not recoverable, "
572 release_output_lock();
575 cpumask_set_cpu(cpu
, &cpus_in_xmon
);
580 while (secondary
&& !xmon_gate
) {
586 secondary
= test_and_set_bit(0, &in_xmon
);
589 touch_nmi_watchdog();
593 if (!secondary
&& !xmon_gate
) {
594 /* we are the first cpu to come in */
595 /* interrupt other cpu(s) */
596 int ncpus
= num_online_cpus();
602 * A system reset (trap == 0x100) can be triggered on
603 * all CPUs, so when we come in via 0x100 try waiting
604 * for the other CPUs to come in before we send the
605 * debugger break (IPI). This is similar to
606 * crash_kexec_secondary().
608 if (TRAP(regs
) != 0x100 || !wait_for_other_cpus(ncpus
))
609 smp_send_debugger_break();
611 wait_for_other_cpus(ncpus
);
614 disable_surveillance();
617 /* for breakpoint or single step, print curr insn */
618 if (bp
|| TRAP(regs
) == 0xd00)
619 ppc_inst_dump(regs
->nip
, 1, 0);
620 printf("enter ? for help\n");
626 touch_nmi_watchdog();
633 if (cpu
== xmon_owner
) {
634 if (!test_and_set_bit(0, &xmon_taken
)) {
640 while (cpu
== xmon_owner
)
644 touch_nmi_watchdog();
648 if (locked_down
|| cmd
!= 0) {
656 /* have switched to some other cpu */
661 cpumask_clear_cpu(cpu
, &cpus_in_xmon
);
662 xmon_fault_jmp
[cpu
] = NULL
;
664 /* UP is simple... */
666 printf("Exception %lx %s in xmon, returning to main loop\n",
667 regs
->trap
, getvecname(TRAP(regs
)));
668 longjmp(xmon_fault_jmp
[0], 1);
670 if (setjmp(recurse_jmp
) == 0) {
671 xmon_fault_jmp
[0] = recurse_jmp
;
675 bp
= at_breakpoint(regs
->nip
);
677 printf("Stopped at breakpoint %tx (", BP_NUM(bp
));
678 xmon_print_symbol(regs
->nip
, " ", ")\n");
680 if (unrecoverable_excp(regs
))
681 printf("WARNING: exception is not recoverable, "
684 disable_surveillance();
686 /* for breakpoint or single step, print current insn */
687 if (bp
|| TRAP(regs
) == 0xd00)
688 ppc_inst_dump(regs
->nip
, 1, 0);
689 printf("enter ? for help\n");
701 if (regs
->msr
& MSR_DE
) {
702 bp
= at_breakpoint(regs
->nip
);
704 regs
->nip
= (unsigned long) &bp
->instr
[0];
705 atomic_inc(&bp
->ref_count
);
709 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
710 bp
= at_breakpoint(regs
->nip
);
712 int stepped
= emulate_step(regs
, ppc_inst_read(bp
->instr
));
714 regs
->nip
= (unsigned long) &bp
->instr
[0];
715 atomic_inc(&bp
->ref_count
);
716 } else if (stepped
< 0) {
717 printf("Couldn't single-step %s instruction\n",
718 IS_RFID(ppc_inst_read(bp
->instr
))? "rfid": "mtmsrd");
728 xmon_touch_watchdogs();
729 local_irq_restore(flags
);
731 return cmd
!= 'X' && cmd
!= EOF
;
734 int xmon(struct pt_regs
*excp
)
739 ppc_save_regs(®s
);
743 return xmon_core(excp
, 0);
747 irqreturn_t
xmon_irq(int irq
, void *d
)
750 local_irq_save(flags
);
751 printf("Keyboard interrupt\n");
752 xmon(get_irq_regs());
753 local_irq_restore(flags
);
757 static int xmon_bpt(struct pt_regs
*regs
)
760 unsigned long offset
;
762 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
765 /* Are we at the trap at bp->instr[1] for some bp? */
766 bp
= in_breakpoint_table(regs
->nip
, &offset
);
767 if (bp
!= NULL
&& (offset
== 4 || offset
== 8)) {
768 regs
->nip
= bp
->address
+ offset
;
769 atomic_dec(&bp
->ref_count
);
773 /* Are we at a breakpoint? */
774 bp
= at_breakpoint(regs
->nip
);
783 static int xmon_sstep(struct pt_regs
*regs
)
791 static int xmon_break_match(struct pt_regs
*regs
)
795 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
797 for (i
= 0; i
< nr_wp_slots(); i
++) {
808 static int xmon_iabr_match(struct pt_regs
*regs
)
810 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
818 static int xmon_ipi(struct pt_regs
*regs
)
821 if (in_xmon
&& !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon
))
827 static int xmon_fault_handler(struct pt_regs
*regs
)
830 unsigned long offset
;
832 if (in_xmon
&& catch_memory_errors
)
833 handle_fault(regs
); /* doesn't return */
835 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
836 bp
= in_breakpoint_table(regs
->nip
, &offset
);
838 regs
->nip
= bp
->address
+ offset
;
839 atomic_dec(&bp
->ref_count
);
846 /* Force enable xmon if not already enabled */
847 static inline void force_enable_xmon(void)
849 /* Enable xmon hooks if needed */
851 printf("xmon: Enabling debugger hooks\n");
856 static struct bpt
*at_breakpoint(unsigned long pc
)
862 for (i
= 0; i
< NBPTS
; ++i
, ++bp
)
863 if (bp
->enabled
&& pc
== bp
->address
)
868 static struct bpt
*in_breakpoint_table(unsigned long nip
, unsigned long *offp
)
872 off
= nip
- (unsigned long)bpt_table
;
873 if (off
>= sizeof(bpt_table
))
875 *offp
= off
& (BPT_SIZE
- 1);
878 return bpts
+ (off
/ BPT_SIZE
);
881 static struct bpt
*new_breakpoint(unsigned long a
)
886 bp
= at_breakpoint(a
);
890 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
891 if (!bp
->enabled
&& atomic_read(&bp
->ref_count
) == 0) {
893 bp
->instr
= (void *)(bpt_table
+ ((bp
- bpts
) * BPT_WORDS
));
898 printf("Sorry, no free breakpoints. Please clear one first.\n");
902 static void insert_bpts(void)
905 struct ppc_inst instr
, instr2
;
906 struct bpt
*bp
, *bp2
;
909 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
910 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) == 0)
912 if (!mread_instr(bp
->address
, &instr
)) {
913 printf("Couldn't read instruction at %lx, "
914 "disabling breakpoint there\n", bp
->address
);
918 if (IS_MTMSRD(instr
) || IS_RFID(instr
)) {
919 printf("Breakpoint at %lx is on an mtmsrd or rfid "
920 "instruction, disabling it\n", bp
->address
);
925 * Check the address is not a suffix by looking for a prefix in
928 if (mread_instr(bp
->address
- 4, &instr2
) == 8) {
929 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
935 * We might still be a suffix - if the prefix has already been
936 * replaced by a breakpoint we won't catch it with the above
939 bp2
= at_breakpoint(bp
->address
- 4);
940 if (bp2
&& ppc_inst_prefixed(ppc_inst_read(bp2
->instr
))) {
941 printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
947 patch_instruction(bp
->instr
, instr
);
948 patch_instruction(ppc_inst_next(bp
->instr
, &instr
),
950 if (bp
->enabled
& BP_CIABR
)
952 if (patch_instruction((struct ppc_inst
*)bp
->address
,
953 ppc_inst(bpinstr
)) != 0) {
954 printf("Couldn't write instruction at %lx, "
955 "disabling breakpoint there\n", bp
->address
);
956 bp
->enabled
&= ~BP_TRAP
;
962 static void insert_cpu_bpts(void)
965 struct arch_hw_breakpoint brk
;
967 for (i
= 0; i
< nr_wp_slots(); i
++) {
968 if (dabr
[i
].enabled
) {
969 brk
.address
= dabr
[i
].address
;
970 brk
.type
= (dabr
[i
].enabled
& HW_BRK_TYPE_DABR
) | HW_BRK_TYPE_PRIV_ALL
;
973 __set_breakpoint(i
, &brk
);
978 set_ciabr(iabr
->address
);
981 static void remove_bpts(void)
985 struct ppc_inst instr
;
988 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
989 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) != BP_TRAP
)
991 if (mread_instr(bp
->address
, &instr
)
992 && ppc_inst_equal(instr
, ppc_inst(bpinstr
))
993 && patch_instruction(
994 (struct ppc_inst
*)bp
->address
, ppc_inst_read(bp
->instr
)) != 0)
995 printf("Couldn't remove breakpoint at %lx\n",
1000 static void remove_cpu_bpts(void)
1002 hw_breakpoint_disable();
1006 /* Based on uptime_proc_show(). */
1010 struct timespec64 uptime
;
1012 if (setjmp(bus_error_jmp
) == 0) {
1013 catch_memory_errors
= 1;
1016 ktime_get_coarse_boottime_ts64(&uptime
);
1017 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime
.tv_sec
,
1018 ((unsigned long)uptime
.tv_nsec
/ (NSEC_PER_SEC
/100)));
1023 catch_memory_errors
= 0;
1026 static void set_lpp_cmd(void)
1030 if (!scanhex(&lpp
)) {
1031 printf("Invalid number.\n");
1034 xmon_set_pagination_lpp(lpp
);
1036 /* Command interpreting routine */
1037 static char *last_cmd
;
1040 cmds(struct pt_regs
*excp
)
1047 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
1051 printf("%x:", smp_processor_id());
1052 #endif /* CONFIG_SMP */
1058 if (last_cmd
== NULL
)
1060 take_input(last_cmd
);
1078 printf(xmon_ro_msg
);
1098 prregs(excp
); /* print regs */
1113 if (do_spu_cmd() == 0)
1120 if (tracing_enabled
)
1124 printf(" <no input ...>\n");
1128 xmon_puts(help_string
);
1148 printf(xmon_ro_msg
);
1156 #ifdef CONFIG_PPC_BOOK3S
1160 #elif defined(CONFIG_44x)
1164 #elif defined(CONFIG_PPC_BOOK3E)
1173 printf("Unrecognized command: ");
1175 if (' ' < cmd
&& cmd
<= '~')
1178 printf("\\x%x", cmd
);
1180 } while (cmd
!= '\n');
1181 printf(" (type ? for help)\n");
1188 static int do_step(struct pt_regs
*regs
)
1190 regs
->msr
|= MSR_DE
;
1191 mtspr(SPRN_DBCR0
, mfspr(SPRN_DBCR0
) | DBCR0_IC
| DBCR0_IDM
);
1196 * Step a single instruction.
1197 * Some instructions we emulate, others we execute with MSR_SE set.
1199 static int do_step(struct pt_regs
*regs
)
1201 struct ppc_inst instr
;
1204 force_enable_xmon();
1205 /* check we are in 64-bit kernel mode, translation enabled */
1206 if ((regs
->msr
& (MSR_64BIT
|MSR_PR
|MSR_IR
)) == (MSR_64BIT
|MSR_IR
)) {
1207 if (mread_instr(regs
->nip
, &instr
)) {
1208 stepped
= emulate_step(regs
, instr
);
1210 printf("Couldn't single-step %s instruction\n",
1211 (IS_RFID(instr
)? "rfid": "mtmsrd"));
1215 set_trap(regs
, 0xd00);
1216 printf("stepped to ");
1217 xmon_print_symbol(regs
->nip
, " ", "\n");
1218 ppc_inst_dump(regs
->nip
, 1, 0);
1223 regs
->msr
|= MSR_SE
;
1228 static void bootcmds(void)
1236 ppc_md
.restart(tmp
);
1237 } else if (cmd
== 'h') {
1239 } else if (cmd
== 'p') {
1245 static int cpu_cmd(void)
1248 unsigned long cpu
, first_cpu
, last_cpu
;
1251 if (!scanhex(&cpu
)) {
1252 /* print cpus waiting or in xmon */
1253 printf("cpus stopped:");
1254 last_cpu
= first_cpu
= NR_CPUS
;
1255 for_each_possible_cpu(cpu
) {
1256 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1257 if (cpu
== last_cpu
+ 1) {
1260 if (last_cpu
!= first_cpu
)
1261 printf("-0x%lx", last_cpu
);
1262 last_cpu
= first_cpu
= cpu
;
1263 printf(" 0x%lx", cpu
);
1267 if (last_cpu
!= first_cpu
)
1268 printf("-0x%lx", last_cpu
);
1272 /* try to switch to cpu specified */
1273 if (!cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1274 printf("cpu 0x%lx isn't in xmon\n", cpu
);
1276 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu
);
1277 xmon_show_stack(paca_ptrs
[cpu
]->saved_r1
, 0, 0);
1285 while (!xmon_taken
) {
1286 if (--timeout
== 0) {
1287 if (test_and_set_bit(0, &xmon_taken
))
1289 /* take control back */
1291 xmon_owner
= smp_processor_id();
1292 printf("cpu 0x%lx didn't take control\n", cpu
);
1300 #endif /* CONFIG_SMP */
1303 static unsigned short fcstab
[256] = {
1304 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1305 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1306 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1307 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1308 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1309 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1310 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1311 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1312 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1313 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1314 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1315 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1316 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1317 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1318 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1319 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1320 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1321 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1322 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1323 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1324 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1325 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1326 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1327 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1328 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1329 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1330 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1331 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1332 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1333 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1334 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1335 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1338 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1347 if (!scanhex(&adrs
))
1349 if (!scanhex(&ncsum
))
1352 for (i
= 0; i
< ncsum
; ++i
) {
1353 if (mread(adrs
+i
, &v
, 1) == 0) {
1354 printf("csum stopped at "REG
"\n", adrs
+i
);
1359 printf("%x\n", fcs
);
1363 * Check if this is a suitable place to put a breakpoint.
1365 static long check_bp_loc(unsigned long addr
)
1367 struct ppc_inst instr
;
1370 if (!is_kernel_addr(addr
)) {
1371 printf("Breakpoints may only be placed at kernel addresses\n");
1374 if (!mread_instr(addr
, &instr
)) {
1375 printf("Can't read instruction at address %lx\n", addr
);
1378 if (IS_MTMSRD(instr
) || IS_RFID(instr
)) {
1379 printf("Breakpoints may not be placed on mtmsrd or rfid "
1386 #ifndef CONFIG_PPC_8xx
1387 static int find_free_data_bpt(void)
1391 for (i
= 0; i
< nr_wp_slots(); i
++) {
1392 if (!dabr
[i
].enabled
)
1395 printf("Couldn't find free breakpoint register\n");
1400 static void print_data_bpts(void)
1404 for (i
= 0; i
< nr_wp_slots(); i
++) {
1405 if (!dabr
[i
].enabled
)
1408 printf(" data "REG
" [", dabr
[i
].address
);
1409 if (dabr
[i
].enabled
& 1)
1411 if (dabr
[i
].enabled
& 2)
1417 static char *breakpoint_help_string
=
1418 "Breakpoint command usage:\n"
1419 "b show breakpoints\n"
1420 "b <addr> [cnt] set breakpoint at given instr addr\n"
1421 "bc clear all breakpoints\n"
1422 "bc <n/addr> clear breakpoint number n or at addr\n"
1423 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1424 "bd <addr> [cnt] set hardware data breakpoint\n"
1438 #ifndef CONFIG_PPC_8xx
1439 static const char badaddr
[] = "Only kernel addresses are permitted for breakpoints\n";
1441 case 'd': /* bd - hardware data breakpoint */
1443 printf(xmon_ro_msg
);
1446 if (!ppc_breakpoint_available()) {
1447 printf("Hardware data breakpoint not supported on this cpu\n");
1450 i
= find_free_data_bpt();
1457 else if (cmd
== 'w')
1461 dabr
[i
].address
= 0;
1462 dabr
[i
].enabled
= 0;
1463 if (scanhex(&dabr
[i
].address
)) {
1464 if (!is_kernel_addr(dabr
[i
].address
)) {
1468 dabr
[i
].address
&= ~HW_BRK_TYPE_DABR
;
1469 dabr
[i
].enabled
= mode
| BP_DABR
;
1472 force_enable_xmon();
1475 case 'i': /* bi - hardware instr breakpoint */
1477 printf(xmon_ro_msg
);
1480 if (!cpu_has_feature(CPU_FTR_ARCH_207S
)) {
1481 printf("Hardware instruction breakpoint "
1482 "not supported on this cpu\n");
1486 iabr
->enabled
&= ~BP_CIABR
;
1491 if (!check_bp_loc(a
))
1493 bp
= new_breakpoint(a
);
1495 bp
->enabled
|= BP_CIABR
;
1497 force_enable_xmon();
1504 /* clear all breakpoints */
1505 for (i
= 0; i
< NBPTS
; ++i
)
1506 bpts
[i
].enabled
= 0;
1508 for (i
= 0; i
< nr_wp_slots(); i
++)
1509 dabr
[i
].enabled
= 0;
1511 printf("All breakpoints cleared\n");
1515 if (a
<= NBPTS
&& a
>= 1) {
1516 /* assume a breakpoint number */
1517 bp
= &bpts
[a
-1]; /* bp nums are 1 based */
1519 /* assume a breakpoint address */
1520 bp
= at_breakpoint(a
);
1522 printf("No breakpoint at %lx\n", a
);
1527 printf("Cleared breakpoint %tx (", BP_NUM(bp
));
1528 xmon_print_symbol(bp
->address
, " ", ")\n");
1536 printf(breakpoint_help_string
);
1541 if (xmon_is_ro
|| !scanhex(&a
)) {
1542 /* print all breakpoints */
1543 printf(" type address\n");
1545 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
1548 printf("%tx %s ", BP_NUM(bp
),
1549 (bp
->enabled
& BP_CIABR
) ? "inst": "trap");
1550 xmon_print_symbol(bp
->address
, " ", "\n");
1555 if (!check_bp_loc(a
))
1557 bp
= new_breakpoint(a
);
1559 bp
->enabled
|= BP_TRAP
;
1560 force_enable_xmon();
1566 /* Very cheap human name for vector lookup. */
1568 const char *getvecname(unsigned long vec
)
1573 case 0x100: ret
= "(System Reset)"; break;
1574 case 0x200: ret
= "(Machine Check)"; break;
1575 case 0x300: ret
= "(Data Access)"; break;
1577 if (radix_enabled())
1578 ret
= "(Data Access Out of Range)";
1580 ret
= "(Data SLB Access)";
1582 case 0x400: ret
= "(Instruction Access)"; break;
1584 if (radix_enabled())
1585 ret
= "(Instruction Access Out of Range)";
1587 ret
= "(Instruction SLB Access)";
1589 case 0x500: ret
= "(Hardware Interrupt)"; break;
1590 case 0x600: ret
= "(Alignment)"; break;
1591 case 0x700: ret
= "(Program Check)"; break;
1592 case 0x800: ret
= "(FPU Unavailable)"; break;
1593 case 0x900: ret
= "(Decrementer)"; break;
1594 case 0x980: ret
= "(Hypervisor Decrementer)"; break;
1595 case 0xa00: ret
= "(Doorbell)"; break;
1596 case 0xc00: ret
= "(System Call)"; break;
1597 case 0xd00: ret
= "(Single Step)"; break;
1598 case 0xe40: ret
= "(Emulation Assist)"; break;
1599 case 0xe60: ret
= "(HMI)"; break;
1600 case 0xe80: ret
= "(Hypervisor Doorbell)"; break;
1601 case 0xf00: ret
= "(Performance Monitor)"; break;
1602 case 0xf20: ret
= "(Altivec Unavailable)"; break;
1603 case 0x1300: ret
= "(Instruction Breakpoint)"; break;
1604 case 0x1500: ret
= "(Denormalisation)"; break;
1605 case 0x1700: ret
= "(Altivec Assist)"; break;
1606 case 0x3000: ret
= "(System Call Vectored)"; break;
1612 static void get_function_bounds(unsigned long pc
, unsigned long *startp
,
1613 unsigned long *endp
)
1615 unsigned long size
, offset
;
1618 *startp
= *endp
= 0;
1621 if (setjmp(bus_error_jmp
) == 0) {
1622 catch_memory_errors
= 1;
1624 name
= kallsyms_lookup(pc
, &size
, &offset
, NULL
, tmpstr
);
1626 *startp
= pc
- offset
;
1627 *endp
= pc
- offset
+ size
;
1631 catch_memory_errors
= 0;
1634 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1635 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1637 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
1640 int max_to_print
= 64;
1642 unsigned long newsp
;
1643 unsigned long marker
;
1644 struct pt_regs regs
;
1646 while (max_to_print
--) {
1647 if (!is_kernel_addr(sp
)) {
1649 printf("SP (%lx) is in userspace\n", sp
);
1653 if (!mread(sp
+ LRSAVE_OFFSET
, &ip
, sizeof(unsigned long))
1654 || !mread(sp
, &newsp
, sizeof(unsigned long))) {
1655 printf("Couldn't read stack frame at %lx\n", sp
);
1660 * For the first stack frame, try to work out if
1661 * LR and/or the saved LR value in the bottommost
1662 * stack frame are valid.
1664 if ((pc
| lr
) != 0) {
1665 unsigned long fnstart
, fnend
;
1666 unsigned long nextip
;
1669 get_function_bounds(pc
, &fnstart
, &fnend
);
1672 mread(newsp
+ LRSAVE_OFFSET
, &nextip
,
1673 sizeof(unsigned long));
1675 if (!is_kernel_addr(lr
)
1676 || (fnstart
<= lr
&& lr
< fnend
))
1678 } else if (lr
== nextip
) {
1680 } else if (is_kernel_addr(lr
)
1681 && !(fnstart
<= lr
&& lr
< fnend
)) {
1682 printf("[link register ] ");
1683 xmon_print_symbol(lr
, " ", "\n");
1686 printf("["REG
"] ", sp
);
1687 xmon_print_symbol(ip
, " ", " (unreliable)\n");
1692 printf("["REG
"] ", sp
);
1693 xmon_print_symbol(ip
, " ", "\n");
1696 /* Look for "regshere" marker to see if this is
1697 an exception frame. */
1698 if (mread(sp
+ MARKER_OFFSET
, &marker
, sizeof(unsigned long))
1699 && marker
== STACK_FRAME_REGS_MARKER
) {
1700 if (mread(sp
+ STACK_FRAME_OVERHEAD
, ®s
, sizeof(regs
))
1702 printf("Couldn't read registers at %lx\n",
1703 sp
+ STACK_FRAME_OVERHEAD
);
1706 printf("--- Exception: %lx %s at ", regs
.trap
,
1707 getvecname(TRAP(®s
)));
1710 xmon_print_symbol(pc
, " ", "\n");
1720 static void backtrace(struct pt_regs
*excp
)
1725 xmon_show_stack(sp
, 0, 0);
1727 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
1731 static void print_bug_trap(struct pt_regs
*regs
)
1734 const struct bug_entry
*bug
;
1737 if (regs
->msr
& MSR_PR
)
1738 return; /* not in kernel */
1739 addr
= regs
->nip
; /* address of trap instruction */
1740 if (!is_kernel_addr(addr
))
1742 bug
= find_bug(regs
->nip
);
1745 if (is_warning_bug(bug
))
1748 #ifdef CONFIG_DEBUG_BUGVERBOSE
1749 printf("kernel BUG at %s:%u!\n",
1750 (char *)bug
+ bug
->file_disp
, bug
->line
);
1752 printf("kernel BUG at %px!\n", (void *)bug
+ bug
->bug_addr_disp
);
1754 #endif /* CONFIG_BUG */
1757 static void excprint(struct pt_regs
*fp
)
1762 printf("cpu 0x%x: ", smp_processor_id());
1763 #endif /* CONFIG_SMP */
1766 printf("Vector: %lx %s at [%px]\n", fp
->trap
, getvecname(trap
), fp
);
1768 xmon_print_symbol(fp
->nip
, ": ", "\n");
1771 xmon_print_symbol(fp
->link
, ": ", "\n");
1773 printf(" sp: %lx\n", fp
->gpr
[1]);
1774 printf(" msr: %lx\n", fp
->msr
);
1776 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600 || trap
== 0x200) {
1777 printf(" dar: %lx\n", fp
->dar
);
1779 printf(" dsisr: %lx\n", fp
->dsisr
);
1782 printf(" current = 0x%px\n", current
);
1784 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1785 local_paca
, local_paca
->irq_soft_mask
, local_paca
->irq_happened
);
1788 printf(" pid = %d, comm = %s\n",
1789 current
->pid
, current
->comm
);
1795 printf(linux_banner
);
1798 static void prregs(struct pt_regs
*fp
)
1802 struct pt_regs regs
;
1804 if (scanhex(&base
)) {
1805 if (setjmp(bus_error_jmp
) == 0) {
1806 catch_memory_errors
= 1;
1808 regs
= *(struct pt_regs
*)base
;
1812 catch_memory_errors
= 0;
1813 printf("*** Error reading registers from "REG
"\n",
1817 catch_memory_errors
= 0;
1822 if (FULL_REGS(fp
)) {
1823 for (n
= 0; n
< 16; ++n
)
1824 printf("R%.2d = "REG
" R%.2d = "REG
"\n",
1825 n
, fp
->gpr
[n
], n
+16, fp
->gpr
[n
+16]);
1827 for (n
= 0; n
< 7; ++n
)
1828 printf("R%.2d = "REG
" R%.2d = "REG
"\n",
1829 n
, fp
->gpr
[n
], n
+7, fp
->gpr
[n
+7]);
1832 for (n
= 0; n
< 32; ++n
) {
1833 printf("R%.2d = %.8lx%s", n
, fp
->gpr
[n
],
1834 (n
& 3) == 3? "\n": " ");
1835 if (n
== 12 && !FULL_REGS(fp
)) {
1842 xmon_print_symbol(fp
->nip
, " ", "\n");
1843 if (!trap_is_syscall(fp
) && cpu_has_feature(CPU_FTR_CFAR
)) {
1845 xmon_print_symbol(fp
->orig_gpr3
, " ", "\n");
1848 xmon_print_symbol(fp
->link
, " ", "\n");
1849 printf("msr = "REG
" cr = %.8lx\n", fp
->msr
, fp
->ccr
);
1850 printf("ctr = "REG
" xer = "REG
" trap = %4lx\n",
1851 fp
->ctr
, fp
->xer
, fp
->trap
);
1853 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600)
1854 printf("dar = "REG
" dsisr = %.8lx\n", fp
->dar
, fp
->dsisr
);
1857 static void cacheflush(void)
1860 unsigned long nflush
;
1865 scanhex((void *)&adrs
);
1870 nflush
= (nflush
+ L1_CACHE_BYTES
- 1) / L1_CACHE_BYTES
;
1871 if (setjmp(bus_error_jmp
) == 0) {
1872 catch_memory_errors
= 1;
1875 if (cmd
!= 'i' || IS_ENABLED(CONFIG_PPC_BOOK3S_64
)) {
1876 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1877 cflush((void *) adrs
);
1879 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1880 cinval((void *) adrs
);
1883 /* wait a little while to see if we get a machine check */
1886 catch_memory_errors
= 0;
1889 extern unsigned long xmon_mfspr(int spr
, unsigned long default_value
);
1890 extern void xmon_mtspr(int spr
, unsigned long value
);
1893 read_spr(int n
, unsigned long *vp
)
1895 unsigned long ret
= -1UL;
1898 if (setjmp(bus_error_jmp
) == 0) {
1899 catch_spr_faults
= 1;
1902 ret
= xmon_mfspr(n
, *vp
);
1908 catch_spr_faults
= 0;
1914 write_spr(int n
, unsigned long val
)
1917 printf(xmon_ro_msg
);
1921 if (setjmp(bus_error_jmp
) == 0) {
1922 catch_spr_faults
= 1;
1929 printf("SPR 0x%03x (%4d) Faulted during write\n", n
, n
);
1931 catch_spr_faults
= 0;
1934 static void dump_206_sprs(void)
1937 if (!cpu_has_feature(CPU_FTR_ARCH_206
))
1940 /* Actually some of these pre-date 2.06, but whatevs */
1942 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1943 mfspr(SPRN_SRR0
), mfspr(SPRN_SRR1
), mfspr(SPRN_DSISR
));
1944 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1945 mfspr(SPRN_DSCR
), mfspr(SPRN_PPR
), mfspr(SPRN_PIR
));
1946 printf("amr = %.16lx uamor = %.16lx\n",
1947 mfspr(SPRN_AMR
), mfspr(SPRN_UAMOR
));
1949 if (!(mfmsr() & MSR_HV
))
1952 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1953 mfspr(SPRN_SDR1
), mfspr(SPRN_HDAR
), mfspr(SPRN_HDSISR
));
1954 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1955 mfspr(SPRN_HSRR0
), mfspr(SPRN_HSRR1
), mfspr(SPRN_HDEC
));
1956 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1957 mfspr(SPRN_LPCR
), mfspr(SPRN_PCR
), mfspr(SPRN_LPID
));
1958 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1959 mfspr(SPRN_HSPRG0
), mfspr(SPRN_HSPRG1
), mfspr(SPRN_AMOR
));
1960 printf("dabr = %.16lx dabrx = %.16lx\n",
1961 mfspr(SPRN_DABR
), mfspr(SPRN_DABRX
));
1965 static void dump_207_sprs(void)
1970 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
1973 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1974 mfspr(SPRN_DPDES
), mfspr(SPRN_TIR
), mfspr(SPRN_CIR
));
1976 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1977 mfspr(SPRN_FSCR
), mfspr(SPRN_TAR
), mfspr(SPRN_PSPB
));
1981 /* Only if TM has been enabled in the kernel */
1982 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1983 mfspr(SPRN_TFHAR
), mfspr(SPRN_TFIAR
),
1984 mfspr(SPRN_TEXASR
));
1987 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1988 mfspr(SPRN_MMCR0
), mfspr(SPRN_MMCR1
), mfspr(SPRN_MMCR2
));
1989 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1990 mfspr(SPRN_PMC1
), mfspr(SPRN_PMC2
),
1991 mfspr(SPRN_PMC3
), mfspr(SPRN_PMC4
));
1992 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1993 mfspr(SPRN_MMCRA
), mfspr(SPRN_SIAR
), mfspr(SPRN_PMC5
));
1994 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1995 mfspr(SPRN_SDAR
), mfspr(SPRN_SIER
), mfspr(SPRN_PMC6
));
1996 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1997 mfspr(SPRN_EBBHR
), mfspr(SPRN_EBBRR
), mfspr(SPRN_BESCR
));
1998 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR
));
2000 if (!(msr
& MSR_HV
))
2003 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
2004 mfspr(SPRN_HFSCR
), mfspr(SPRN_DHDES
), mfspr(SPRN_RPR
));
2005 printf("dawr0 = %.16lx dawrx0 = %.16lx\n",
2006 mfspr(SPRN_DAWR0
), mfspr(SPRN_DAWRX0
));
2007 if (nr_wp_slots() > 1) {
2008 printf("dawr1 = %.16lx dawrx1 = %.16lx\n",
2009 mfspr(SPRN_DAWR1
), mfspr(SPRN_DAWRX1
));
2011 printf("ciabr = %.16lx\n", mfspr(SPRN_CIABR
));
2015 static void dump_300_sprs(void)
2018 bool hv
= mfmsr() & MSR_HV
;
2020 if (!cpu_has_feature(CPU_FTR_ARCH_300
))
2023 printf("pidr = %.16lx tidr = %.16lx\n",
2024 mfspr(SPRN_PID
), mfspr(SPRN_TIDR
));
2025 printf("psscr = %.16lx\n",
2026 hv
? mfspr(SPRN_PSSCR
) : mfspr(SPRN_PSSCR_PR
));
2031 printf("ptcr = %.16lx asdr = %.16lx\n",
2032 mfspr(SPRN_PTCR
), mfspr(SPRN_ASDR
));
2036 static void dump_310_sprs(void)
2039 if (!cpu_has_feature(CPU_FTR_ARCH_31
))
2042 printf("mmcr3 = %.16lx, sier2 = %.16lx, sier3 = %.16lx\n",
2043 mfspr(SPRN_MMCR3
), mfspr(SPRN_SIER2
), mfspr(SPRN_SIER3
));
2048 static void dump_one_spr(int spr
, bool show_unimplemented
)
2053 if (!read_spr(spr
, &val
)) {
2054 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
2058 if (val
== 0xdeadbeef) {
2059 /* Looks like read was a nop, confirm */
2061 if (!read_spr(spr
, &val
)) {
2062 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
2066 if (val
== 0x0badcafe) {
2067 if (show_unimplemented
)
2068 printf("SPR 0x%03x (%4d) Unimplemented\n", spr
, spr
);
2073 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr
, spr
, val
);
2076 static void super_regs(void)
2078 static unsigned long regno
;
2086 unsigned long sp
, toc
;
2087 asm("mr %0,1" : "=r" (sp
) :);
2088 asm("mr %0,2" : "=r" (toc
) :);
2090 printf("msr = "REG
" sprg0 = "REG
"\n",
2091 mfmsr(), mfspr(SPRN_SPRG0
));
2092 printf("pvr = "REG
" sprg1 = "REG
"\n",
2093 mfspr(SPRN_PVR
), mfspr(SPRN_SPRG1
));
2094 printf("dec = "REG
" sprg2 = "REG
"\n",
2095 mfspr(SPRN_DEC
), mfspr(SPRN_SPRG2
));
2096 printf("sp = "REG
" sprg3 = "REG
"\n", sp
, mfspr(SPRN_SPRG3
));
2097 printf("toc = "REG
" dar = "REG
"\n", toc
, mfspr(SPRN_DAR
));
2110 read_spr(regno
, &val
);
2112 write_spr(regno
, val
);
2113 dump_one_spr(regno
, true);
2118 dump_one_spr(regno
, true);
2122 for (spr
= 1; spr
< 1024; ++spr
)
2123 dump_one_spr(spr
, false);
2131 * Stuff for reading and writing memory safely
2134 mread(unsigned long adrs
, void *buf
, int size
)
2140 if (setjmp(bus_error_jmp
) == 0) {
2141 catch_memory_errors
= 1;
2147 *(u16
*)q
= *(u16
*)p
;
2150 *(u32
*)q
= *(u32
*)p
;
2153 *(u64
*)q
= *(u64
*)p
;
2156 for( ; n
< size
; ++n
) {
2162 /* wait a little while to see if we get a machine check */
2166 catch_memory_errors
= 0;
2171 mwrite(unsigned long adrs
, void *buf
, int size
)
2179 printf(xmon_ro_msg
);
2183 if (setjmp(bus_error_jmp
) == 0) {
2184 catch_memory_errors
= 1;
2190 *(u16
*)p
= *(u16
*)q
;
2193 *(u32
*)p
= *(u32
*)q
;
2196 *(u64
*)p
= *(u64
*)q
;
2199 for ( ; n
< size
; ++n
) {
2205 /* wait a little while to see if we get a machine check */
2209 printf("*** Error writing address "REG
"\n", adrs
+ n
);
2211 catch_memory_errors
= 0;
2216 mread_instr(unsigned long adrs
, struct ppc_inst
*instr
)
2221 if (setjmp(bus_error_jmp
) == 0) {
2222 catch_memory_errors
= 1;
2224 *instr
= ppc_inst_read((struct ppc_inst
*)adrs
);
2226 /* wait a little while to see if we get a machine check */
2228 n
= ppc_inst_len(*instr
);
2230 catch_memory_errors
= 0;
2234 static int fault_type
;
2235 static int fault_except
;
2236 static char *fault_chars
[] = { "--", "**", "##" };
2238 static int handle_fault(struct pt_regs
*regs
)
2240 fault_except
= TRAP(regs
);
2241 switch (TRAP(regs
)) {
2253 longjmp(bus_error_jmp
, 1);
2258 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2261 byterev(unsigned char *val
, int size
)
2267 SWAP(val
[0], val
[1], t
);
2270 SWAP(val
[0], val
[3], t
);
2271 SWAP(val
[1], val
[2], t
);
2273 case 8: /* is there really any use for this? */
2274 SWAP(val
[0], val
[7], t
);
2275 SWAP(val
[1], val
[6], t
);
2276 SWAP(val
[2], val
[5], t
);
2277 SWAP(val
[3], val
[4], t
);
2285 static char *memex_help_string
=
2286 "Memory examine command usage:\n"
2287 "m [addr] [flags] examine/change memory\n"
2288 " addr is optional. will start where left off.\n"
2289 " flags may include chars from this set:\n"
2290 " b modify by bytes (default)\n"
2291 " w modify by words (2 byte)\n"
2292 " l modify by longs (4 byte)\n"
2293 " d modify by doubleword (8 byte)\n"
2294 " r toggle reverse byte order mode\n"
2295 " n do not read memory (for i/o spaces)\n"
2296 " . ok to read (default)\n"
2297 "NOTE: flags are saved as defaults\n"
2300 static char *memex_subcmd_help_string
=
2301 "Memory examine subcommands:\n"
2302 " hexval write this val to current location\n"
2303 " 'string' write chars from string to this location\n"
2304 " ' increment address\n"
2305 " ^ decrement address\n"
2306 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2307 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2308 " ` clear no-read flag\n"
2309 " ; stay at this addr\n"
2310 " v change to byte mode\n"
2311 " w change to word (2 byte) mode\n"
2312 " l change to long (4 byte) mode\n"
2313 " u change to doubleword (8 byte) mode\n"
2314 " m addr change current addr\n"
2315 " n toggle no-read flag\n"
2316 " r toggle byte reverse flag\n"
2317 " < count back up count bytes\n"
2318 " > count skip forward count bytes\n"
2319 " x exit this mode\n"
2325 int cmd
, inc
, i
, nslash
;
2327 unsigned char val
[16];
2329 scanhex((void *)&adrs
);
2332 printf(memex_help_string
);
2338 while ((cmd
= skipbl()) != '\n') {
2340 case 'b': size
= 1; break;
2341 case 'w': size
= 2; break;
2342 case 'l': size
= 4; break;
2343 case 'd': size
= 8; break;
2344 case 'r': brev
= !brev
; break;
2345 case 'n': mnoread
= 1; break;
2346 case '.': mnoread
= 0; break;
2355 n
= mread(adrs
, val
, size
);
2356 printf(REG
"%c", adrs
, brev
? 'r': ' ');
2361 for (i
= 0; i
< n
; ++i
)
2362 printf("%.2x", val
[i
]);
2363 for (; i
< size
; ++i
)
2364 printf("%s", fault_chars
[fault_type
]);
2371 for (i
= 0; i
< size
; ++i
)
2372 val
[i
] = n
>> (i
* 8);
2375 mwrite(adrs
, val
, size
);
2388 else if( n
== '\'' )
2390 for (i
= 0; i
< size
; ++i
)
2391 val
[i
] = n
>> (i
* 8);
2394 mwrite(adrs
, val
, size
);
2430 adrs
-= 1 << nslash
;
2434 adrs
+= 1 << nslash
;
2438 adrs
+= 1 << -nslash
;
2442 adrs
-= 1 << -nslash
;
2445 scanhex((void *)&adrs
);
2464 printf(memex_subcmd_help_string
);
2479 case 'n': c
= '\n'; break;
2480 case 'r': c
= '\r'; break;
2481 case 'b': c
= '\b'; break;
2482 case 't': c
= '\t'; break;
2487 static void xmon_rawdump (unsigned long adrs
, long ndump
)
2490 unsigned char temp
[16];
2492 for (n
= ndump
; n
> 0;) {
2494 nr
= mread(adrs
, temp
, r
);
2496 for (m
= 0; m
< r
; ++m
) {
2498 printf("%.2x", temp
[m
]);
2500 printf("%s", fault_chars
[fault_type
]);
2509 static void dump_tracing(void)
2515 ftrace_dump(DUMP_ORIG
);
2517 ftrace_dump(DUMP_ALL
);
2521 static void dump_one_paca(int cpu
)
2523 struct paca_struct
*p
;
2524 #ifdef CONFIG_PPC_BOOK3S_64
2528 if (setjmp(bus_error_jmp
) != 0) {
2529 printf("*** Error dumping paca for cpu 0x%x!\n", cpu
);
2533 catch_memory_errors
= 1;
2538 printf("paca for cpu 0x%x @ %px:\n", cpu
, p
);
2540 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu
) ? "yes" : "no");
2541 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu
) ? "yes" : "no");
2542 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu
) ? "yes" : "no");
2544 #define DUMP(paca, name, format) \
2545 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2546 offsetof(struct paca_struct, name));
2548 DUMP(p
, lock_token
, "%#-*x");
2549 DUMP(p
, paca_index
, "%#-*x");
2550 DUMP(p
, kernel_toc
, "%#-*llx");
2551 DUMP(p
, kernelbase
, "%#-*llx");
2552 DUMP(p
, kernel_msr
, "%#-*llx");
2553 DUMP(p
, emergency_sp
, "%-*px");
2554 #ifdef CONFIG_PPC_BOOK3S_64
2555 DUMP(p
, nmi_emergency_sp
, "%-*px");
2556 DUMP(p
, mc_emergency_sp
, "%-*px");
2557 DUMP(p
, in_nmi
, "%#-*x");
2558 DUMP(p
, in_mce
, "%#-*x");
2559 DUMP(p
, hmi_event_available
, "%#-*x");
2561 DUMP(p
, data_offset
, "%#-*llx");
2562 DUMP(p
, hw_cpu_id
, "%#-*x");
2563 DUMP(p
, cpu_start
, "%#-*x");
2564 DUMP(p
, kexec_state
, "%#-*x");
2565 #ifdef CONFIG_PPC_BOOK3S_64
2566 if (!early_radix_enabled()) {
2567 for (i
= 0; i
< SLB_NUM_BOLTED
; i
++) {
2570 if (!p
->slb_shadow_ptr
)
2573 esid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].esid
);
2574 vsid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].vsid
);
2577 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2578 22, "slb_shadow", i
, esid
, vsid
);
2581 DUMP(p
, vmalloc_sllp
, "%#-*x");
2582 DUMP(p
, stab_rr
, "%#-*x");
2583 DUMP(p
, slb_used_bitmap
, "%#-*x");
2584 DUMP(p
, slb_kern_bitmap
, "%#-*x");
2586 if (!early_cpu_has_feature(CPU_FTR_ARCH_300
)) {
2587 DUMP(p
, slb_cache_ptr
, "%#-*x");
2588 for (i
= 0; i
< SLB_CACHE_ENTRIES
; i
++)
2589 printf(" %-*s[%d] = 0x%016x\n",
2590 22, "slb_cache", i
, p
->slb_cache
[i
]);
2594 DUMP(p
, rfi_flush_fallback_area
, "%-*px");
2596 DUMP(p
, dscr_default
, "%#-*llx");
2597 #ifdef CONFIG_PPC_BOOK3E
2598 DUMP(p
, pgd
, "%-*px");
2599 DUMP(p
, kernel_pgd
, "%-*px");
2600 DUMP(p
, tcd_ptr
, "%-*px");
2601 DUMP(p
, mc_kstack
, "%-*px");
2602 DUMP(p
, crit_kstack
, "%-*px");
2603 DUMP(p
, dbg_kstack
, "%-*px");
2605 DUMP(p
, __current
, "%-*px");
2606 DUMP(p
, kstack
, "%#-*llx");
2607 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p
->kstack
& ~(THREAD_SIZE
- 1));
2608 #ifdef CONFIG_STACKPROTECTOR
2609 DUMP(p
, canary
, "%#-*lx");
2611 DUMP(p
, saved_r1
, "%#-*llx");
2612 #ifdef CONFIG_PPC_BOOK3E
2613 DUMP(p
, trap_save
, "%#-*x");
2615 DUMP(p
, irq_soft_mask
, "%#-*x");
2616 DUMP(p
, irq_happened
, "%#-*x");
2617 #ifdef CONFIG_MMIOWB
2618 DUMP(p
, mmiowb_state
.nesting_count
, "%#-*x");
2619 DUMP(p
, mmiowb_state
.mmiowb_pending
, "%#-*x");
2621 DUMP(p
, irq_work_pending
, "%#-*x");
2622 DUMP(p
, sprg_vdso
, "%#-*llx");
2624 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2625 DUMP(p
, tm_scratch
, "%#-*llx");
2628 #ifdef CONFIG_PPC_POWERNV
2629 DUMP(p
, idle_state
, "%#-*lx");
2630 if (!early_cpu_has_feature(CPU_FTR_ARCH_300
)) {
2631 DUMP(p
, thread_idle_state
, "%#-*x");
2632 DUMP(p
, subcore_sibling_mask
, "%#-*x");
2634 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2635 DUMP(p
, requested_psscr
, "%#-*llx");
2636 DUMP(p
, dont_stop
.counter
, "%#-*x");
2641 DUMP(p
, accounting
.utime
, "%#-*lx");
2642 DUMP(p
, accounting
.stime
, "%#-*lx");
2643 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2644 DUMP(p
, accounting
.utime_scaled
, "%#-*lx");
2646 DUMP(p
, accounting
.starttime
, "%#-*lx");
2647 DUMP(p
, accounting
.starttime_user
, "%#-*lx");
2648 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2649 DUMP(p
, accounting
.startspurr
, "%#-*lx");
2650 DUMP(p
, accounting
.utime_sspurr
, "%#-*lx");
2652 DUMP(p
, accounting
.steal_time
, "%#-*lx");
2655 catch_memory_errors
= 0;
2659 static void dump_all_pacas(void)
2663 if (num_possible_cpus() == 0) {
2664 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2668 for_each_possible_cpu(cpu
)
2672 static void dump_pacas(void)
2683 termch
= c
; /* Put c back, it wasn't 'a' */
2688 dump_one_paca(xmon_owner
);
2692 #ifdef CONFIG_PPC_POWERNV
2693 static void dump_one_xive(int cpu
)
2695 unsigned int hwid
= get_hard_smp_processor_id(cpu
);
2696 bool hv
= cpu_has_feature(CPU_FTR_HVMODE
);
2699 opal_xive_dump(XIVE_DUMP_TM_HYP
, hwid
);
2700 opal_xive_dump(XIVE_DUMP_TM_POOL
, hwid
);
2701 opal_xive_dump(XIVE_DUMP_TM_OS
, hwid
);
2702 opal_xive_dump(XIVE_DUMP_TM_USER
, hwid
);
2703 opal_xive_dump(XIVE_DUMP_VP
, hwid
);
2704 opal_xive_dump(XIVE_DUMP_EMU_STATE
, hwid
);
2707 if (setjmp(bus_error_jmp
) != 0) {
2708 catch_memory_errors
= 0;
2709 printf("*** Error dumping xive on cpu %d\n", cpu
);
2713 catch_memory_errors
= 1;
2715 xmon_xive_do_dump(cpu
);
2718 catch_memory_errors
= 0;
2721 static void dump_all_xives(void)
2725 if (num_possible_cpus() == 0) {
2726 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2730 for_each_possible_cpu(cpu
)
2734 static void dump_one_xive_irq(u32 num
, struct irq_data
*d
)
2736 xmon_xive_get_irq_config(num
, d
);
2739 static void dump_all_xive_irq(void)
2742 struct irq_desc
*desc
;
2744 for_each_irq_desc(i
, desc
) {
2745 struct irq_data
*d
= irq_desc_get_irq_data(desc
);
2751 hwirq
= (unsigned int)irqd_to_hwirq(d
);
2752 /* IPIs are special (HW number 0) */
2754 dump_one_xive_irq(hwirq
, d
);
2758 static void dump_xives(void)
2763 if (!xive_enabled()) {
2764 printf("Xive disabled on this system\n");
2772 } else if (c
== 'i') {
2774 dump_one_xive_irq(num
, NULL
);
2776 dump_all_xive_irq();
2780 termch
= c
; /* Put c back, it wasn't 'a' */
2785 dump_one_xive(xmon_owner
);
2787 #endif /* CONFIG_PPC_POWERNV */
2789 static void dump_by_size(unsigned long addr
, long count
, int size
)
2791 unsigned char temp
[16];
2795 count
= ALIGN(count
, 16);
2797 for (i
= 0; i
< count
; i
+= 16, addr
+= 16) {
2800 if (mread(addr
, temp
, 16) != 16) {
2801 printf("\nFaulted reading %d bytes from 0x"REG
"\n", 16, addr
);
2805 for (j
= 0; j
< 16; j
+= size
) {
2808 case 1: val
= temp
[j
]; break;
2809 case 2: val
= *(u16
*)&temp
[j
]; break;
2810 case 4: val
= *(u32
*)&temp
[j
]; break;
2811 case 8: val
= *(u64
*)&temp
[j
]; break;
2815 printf("%0*llx", size
* 2, val
);
2818 for (j
= 0; j
< 16; ++j
) {
2820 putchar(' ' <= val
&& val
<= '~' ? val
: '.');
2829 static char last
[] = { "d?\n" };
2836 xmon_start_pagination();
2838 xmon_end_pagination();
2842 #ifdef CONFIG_PPC_POWERNV
2844 xmon_start_pagination();
2846 xmon_end_pagination();
2859 scanhex((void *)&adrs
);
2866 else if (nidump
> MAX_IDUMP
)
2868 adrs
+= ppc_inst_dump(adrs
, nidump
, 1);
2870 } else if (c
== 'l') {
2872 } else if (c
== 'o') {
2874 } else if (c
== 'v') {
2875 /* dump virtual to physical translation */
2877 } else if (c
== 'r') {
2881 xmon_rawdump(adrs
, ndump
);
2888 else if (ndump
> MAX_DUMP
)
2896 ndump
= ALIGN(ndump
, 16);
2897 dump_by_size(adrs
, ndump
, c
- '0');
2902 prdump(adrs
, ndump
);
2911 prdump(unsigned long adrs
, long ndump
)
2913 long n
, m
, c
, r
, nr
;
2914 unsigned char temp
[16];
2916 for (n
= ndump
; n
> 0;) {
2920 nr
= mread(adrs
, temp
, r
);
2922 for (m
= 0; m
< r
; ++m
) {
2923 if ((m
& (sizeof(long) - 1)) == 0 && m
> 0)
2926 printf("%.2x", temp
[m
]);
2928 printf("%s", fault_chars
[fault_type
]);
2930 for (; m
< 16; ++m
) {
2931 if ((m
& (sizeof(long) - 1)) == 0)
2936 for (m
= 0; m
< r
; ++m
) {
2939 putchar(' ' <= c
&& c
<= '~'? c
: '.');
2952 typedef int (*instruction_dump_func
)(unsigned long inst
, unsigned long addr
);
2955 generic_inst_dump(unsigned long adr
, long count
, int praddr
,
2956 instruction_dump_func dump_func
)
2959 unsigned long first_adr
;
2960 struct ppc_inst inst
, last_inst
= ppc_inst(0);
2963 for (first_adr
= adr
; count
> 0; --count
, adr
+= ppc_inst_len(inst
)) {
2964 nr
= mread_instr(adr
, &inst
);
2967 const char *x
= fault_chars
[fault_type
];
2968 printf(REG
" %s%s%s%s\n", adr
, x
, x
, x
, x
);
2972 if (adr
> first_adr
&& ppc_inst_equal(inst
, last_inst
)) {
2982 printf(REG
" %s", adr
, ppc_inst_as_str(inst
));
2984 if (!ppc_inst_prefixed(inst
))
2985 dump_func(ppc_inst_val(inst
), adr
);
2987 dump_func(ppc_inst_as_u64(inst
), adr
);
2990 return adr
- first_adr
;
2994 ppc_inst_dump(unsigned long adr
, long count
, int praddr
)
2996 return generic_inst_dump(adr
, count
, praddr
, print_insn_powerpc
);
3000 print_address(unsigned long addr
)
3002 xmon_print_symbol(addr
, "\t# ", "");
3008 struct kmsg_dumper dumper
= { .active
= 1 };
3009 unsigned char buf
[128];
3012 if (setjmp(bus_error_jmp
) != 0) {
3013 printf("Error dumping printk buffer!\n");
3017 catch_memory_errors
= 1;
3020 kmsg_dump_rewind_nolock(&dumper
);
3021 xmon_start_pagination();
3022 while (kmsg_dump_get_line_nolock(&dumper
, false, buf
, sizeof(buf
), &len
)) {
3026 xmon_end_pagination();
3029 /* wait a little while to see if we get a machine check */
3031 catch_memory_errors
= 0;
3034 #ifdef CONFIG_PPC_POWERNV
3035 static void dump_opal_msglog(void)
3037 unsigned char buf
[128];
3041 if (!firmware_has_feature(FW_FEATURE_OPAL
)) {
3042 printf("Machine is not running OPAL firmware.\n");
3046 if (setjmp(bus_error_jmp
) != 0) {
3047 printf("Error dumping OPAL msglog!\n");
3051 catch_memory_errors
= 1;
3054 xmon_start_pagination();
3055 while ((res
= opal_msglog_copy(buf
, pos
, sizeof(buf
) - 1))) {
3057 printf("Error dumping OPAL msglog! Error: %zd\n", res
);
3064 xmon_end_pagination();
3067 /* wait a little while to see if we get a machine check */
3069 catch_memory_errors
= 0;
3074 * Memory operations - move, set, print differences
3076 static unsigned long mdest
; /* destination address */
3077 static unsigned long msrc
; /* source address */
3078 static unsigned long mval
; /* byte value to set memory to */
3079 static unsigned long mcount
; /* # bytes to affect */
3080 static unsigned long mdiffs
; /* max # differences to print */
3085 scanhex((void *)&mdest
);
3086 if( termch
!= '\n' )
3088 scanhex((void *)(cmd
== 's'? &mval
: &msrc
));
3089 if( termch
!= '\n' )
3091 scanhex((void *)&mcount
);
3095 printf(xmon_ro_msg
);
3098 memmove((void *)mdest
, (void *)msrc
, mcount
);
3102 printf(xmon_ro_msg
);
3105 memset((void *)mdest
, mval
, mcount
);
3108 if( termch
!= '\n' )
3110 scanhex((void *)&mdiffs
);
3111 memdiffs((unsigned char *)mdest
, (unsigned char *)msrc
, mcount
, mdiffs
);
3117 memdiffs(unsigned char *p1
, unsigned char *p2
, unsigned nb
, unsigned maxpr
)
3122 for( n
= nb
; n
> 0; --n
)
3123 if( *p1
++ != *p2
++ )
3124 if( ++prt
<= maxpr
)
3125 printf("%px %.2x # %px %.2x\n", p1
- 1,
3126 p1
[-1], p2
- 1, p2
[-1]);
3128 printf("Total of %d differences\n", prt
);
3131 static unsigned mend
;
3132 static unsigned mask
;
3138 unsigned char val
[4];
3141 scanhex((void *)&mdest
);
3142 if (termch
!= '\n') {
3144 scanhex((void *)&mend
);
3145 if (termch
!= '\n') {
3147 scanhex((void *)&mval
);
3149 if (termch
!= '\n') termch
= 0;
3150 scanhex((void *)&mask
);
3154 for (a
= mdest
; a
< mend
; a
+= 4) {
3155 if (mread(a
, val
, 4) == 4
3156 && ((GETWORD(val
) ^ mval
) & mask
) == 0) {
3157 printf("%.16x: %.16x\n", a
, GETWORD(val
));
3164 static unsigned long mskip
= 0x1000;
3165 static unsigned long mlim
= 0xffffffff;
3175 if (termch
!= '\n') termch
= 0;
3177 if (termch
!= '\n') termch
= 0;
3180 for (a
= mdest
; a
< mlim
; a
+= mskip
) {
3181 ok
= mread(a
, &v
, 1);
3183 printf("%.8x .. ", a
);
3184 } else if (!ok
&& ook
)
3185 printf("%.8lx\n", a
- mskip
);
3191 printf("%.8lx\n", a
- mskip
);
3194 static void show_task(struct task_struct
*tsk
)
3199 * Cloned from kdb_task_state_char(), which is not entirely
3200 * appropriate for calling from xmon. This could be moved
3201 * to a common, generic, routine used by both.
3203 state
= (tsk
->state
== 0) ? 'R' :
3204 (tsk
->state
< 0) ? 'U' :
3205 (tsk
->state
& TASK_UNINTERRUPTIBLE
) ? 'D' :
3206 (tsk
->state
& TASK_STOPPED
) ? 'T' :
3207 (tsk
->state
& TASK_TRACED
) ? 'C' :
3208 (tsk
->exit_state
& EXIT_ZOMBIE
) ? 'Z' :
3209 (tsk
->exit_state
& EXIT_DEAD
) ? 'E' :
3210 (tsk
->state
& TASK_INTERRUPTIBLE
) ? 'S' : '?';
3212 printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk
,
3213 tsk
->thread
.ksp
, tsk
->thread
.regs
,
3214 tsk
->pid
, rcu_dereference(tsk
->parent
)->pid
,
3215 state
, task_cpu(tsk
),
3219 #ifdef CONFIG_PPC_BOOK3S_64
3220 static void format_pte(void *ptep
, unsigned long pte
)
3222 pte_t entry
= __pte(pte
);
3224 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep
, pte
);
3225 printf("Maps physical address = 0x%016lx\n", pte
& PTE_RPN_MASK
);
3227 printf("Flags = %s%s%s%s%s\n",
3228 pte_young(entry
) ? "Accessed " : "",
3229 pte_dirty(entry
) ? "Dirty " : "",
3230 pte_read(entry
) ? "Read " : "",
3231 pte_write(entry
) ? "Write " : "",
3232 pte_exec(entry
) ? "Exec " : "");
3235 static void show_pte(unsigned long addr
)
3237 unsigned long tskv
= 0;
3238 struct task_struct
*tsk
= NULL
;
3239 struct mm_struct
*mm
;
3246 if (!scanhex(&tskv
))
3249 tsk
= (struct task_struct
*)tskv
;
3254 mm
= tsk
->active_mm
;
3256 if (setjmp(bus_error_jmp
) != 0) {
3257 catch_memory_errors
= 0;
3258 printf("*** Error dumping pte for task %px\n", tsk
);
3262 catch_memory_errors
= 1;
3266 pgdp
= pgd_offset_k(addr
);
3268 pgdp
= pgd_offset(mm
, addr
);
3270 p4dp
= p4d_offset(pgdp
, addr
);
3272 if (p4d_none(*p4dp
)) {
3273 printf("No valid P4D\n");
3277 if (p4d_is_leaf(*p4dp
)) {
3278 format_pte(p4dp
, p4d_val(*p4dp
));
3282 printf("p4dp @ 0x%px = 0x%016lx\n", p4dp
, p4d_val(*p4dp
));
3284 pudp
= pud_offset(p4dp
, addr
);
3286 if (pud_none(*pudp
)) {
3287 printf("No valid PUD\n");
3291 if (pud_is_leaf(*pudp
)) {
3292 format_pte(pudp
, pud_val(*pudp
));
3296 printf("pudp @ 0x%px = 0x%016lx\n", pudp
, pud_val(*pudp
));
3298 pmdp
= pmd_offset(pudp
, addr
);
3300 if (pmd_none(*pmdp
)) {
3301 printf("No valid PMD\n");
3305 if (pmd_is_leaf(*pmdp
)) {
3306 format_pte(pmdp
, pmd_val(*pmdp
));
3309 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp
, pmd_val(*pmdp
));
3311 ptep
= pte_offset_map(pmdp
, addr
);
3312 if (pte_none(*ptep
)) {
3313 printf("no valid PTE\n");
3317 format_pte(ptep
, pte_val(*ptep
));
3321 catch_memory_errors
= 0;
3324 static void show_pte(unsigned long addr
)
3326 printf("show_pte not yet implemented\n");
3328 #endif /* CONFIG_PPC_BOOK3S_64 */
3330 static void show_tasks(void)
3333 struct task_struct
*tsk
= NULL
;
3335 printf(" task_struct ->thread.ksp ->thread.regs PID PPID S P CMD\n");
3338 tsk
= (struct task_struct
*)tskv
;
3340 if (setjmp(bus_error_jmp
) != 0) {
3341 catch_memory_errors
= 0;
3342 printf("*** Error dumping task %px\n", tsk
);
3346 catch_memory_errors
= 1;
3352 for_each_process(tsk
)
3357 catch_memory_errors
= 0;
3360 static void proccall(void)
3362 unsigned long args
[8];
3365 typedef unsigned long (*callfunc_t
)(unsigned long, unsigned long,
3366 unsigned long, unsigned long, unsigned long,
3367 unsigned long, unsigned long, unsigned long);
3370 if (!scanhex(&adrs
))
3374 for (i
= 0; i
< 8; ++i
)
3376 for (i
= 0; i
< 8; ++i
) {
3377 if (!scanhex(&args
[i
]) || termch
== '\n')
3381 func
= (callfunc_t
) adrs
;
3383 if (setjmp(bus_error_jmp
) == 0) {
3384 catch_memory_errors
= 1;
3386 ret
= func(args
[0], args
[1], args
[2], args
[3],
3387 args
[4], args
[5], args
[6], args
[7]);
3389 printf("return value is 0x%lx\n", ret
);
3391 printf("*** %x exception occurred\n", fault_except
);
3393 catch_memory_errors
= 0;
3396 /* Input scanning routines */
3407 while( c
== ' ' || c
== '\t' )
3413 static const char *regnames
[N_PTREGS
] = {
3414 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3415 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3416 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3417 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3418 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3424 "trap", "dar", "dsisr", "res"
3428 scanhex(unsigned long *vp
)
3435 /* parse register name */
3439 for (i
= 0; i
< sizeof(regname
) - 1; ++i
) {
3448 i
= match_string(regnames
, N_PTREGS
, regname
);
3450 printf("invalid register name '%%%s'\n", regname
);
3453 if (xmon_regs
== NULL
) {
3454 printf("regs not available\n");
3457 *vp
= ((unsigned long *)xmon_regs
)[i
];
3461 /* skip leading "0x" if any */
3475 } else if (c
== '$') {
3477 for (i
=0; i
<63; i
++) {
3479 if (isspace(c
) || c
== '\0') {
3487 if (setjmp(bus_error_jmp
) == 0) {
3488 catch_memory_errors
= 1;
3490 *vp
= kallsyms_lookup_name(tmpstr
);
3493 catch_memory_errors
= 0;
3495 printf("unknown symbol '%s'\n", tmpstr
);
3528 static int hexdigit(int c
)
3530 if( '0' <= c
&& c
<= '9' )
3532 if( 'A' <= c
&& c
<= 'F' )
3533 return c
- ('A' - 10);
3534 if( 'a' <= c
&& c
<= 'f' )
3535 return c
- ('a' - 10);
3540 getstring(char *s
, int size
)
3556 } while( c
!= ' ' && c
!= '\t' && c
!= '\n' );
3561 static char line
[256];
3562 static char *lineptr
;
3573 if (lineptr
== NULL
|| *lineptr
== 0) {
3574 if (xmon_gets(line
, sizeof(line
)) == NULL
) {
3584 take_input(char *str
)
3593 int type
= inchar();
3594 unsigned long addr
, cpu
;
3595 void __percpu
*ptr
= NULL
;
3596 static char tmp
[64];
3601 xmon_print_symbol(addr
, ": ", "\n");
3606 if (setjmp(bus_error_jmp
) == 0) {
3607 catch_memory_errors
= 1;
3609 addr
= kallsyms_lookup_name(tmp
);
3611 printf("%s: %lx\n", tmp
, addr
);
3613 printf("Symbol '%s' not found.\n", tmp
);
3616 catch_memory_errors
= 0;
3621 if (setjmp(bus_error_jmp
) == 0) {
3622 catch_memory_errors
= 1;
3624 ptr
= (void __percpu
*)kallsyms_lookup_name(tmp
);
3629 ptr
>= (void __percpu
*)__per_cpu_start
&&
3630 ptr
< (void __percpu
*)__per_cpu_end
)
3632 if (scanhex(&cpu
) && cpu
< num_possible_cpus()) {
3633 addr
= (unsigned long)per_cpu_ptr(ptr
, cpu
);
3635 cpu
= raw_smp_processor_id();
3636 addr
= (unsigned long)this_cpu_ptr(ptr
);
3639 printf("%s for cpu 0x%lx: %lx\n", tmp
, cpu
, addr
);
3641 printf("Percpu symbol '%s' not found.\n", tmp
);
3644 catch_memory_errors
= 0;
3651 /* Print an address in numeric and symbolic form (if possible) */
3652 static void xmon_print_symbol(unsigned long address
, const char *mid
,
3656 const char *name
= NULL
;
3657 unsigned long offset
, size
;
3659 printf(REG
, address
);
3660 if (setjmp(bus_error_jmp
) == 0) {
3661 catch_memory_errors
= 1;
3663 name
= kallsyms_lookup(address
, &size
, &offset
, &modname
,
3666 /* wait a little while to see if we get a machine check */
3670 catch_memory_errors
= 0;
3673 printf("%s%s+%#lx/%#lx", mid
, name
, offset
, size
);
3675 printf(" [%s]", modname
);
3677 printf("%s", after
);
3680 #ifdef CONFIG_PPC_BOOK3S_64
3681 void dump_segments(void)
3684 unsigned long esid
,vsid
;
3687 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3689 for (i
= 0; i
< mmu_slb_size
; i
++) {
3690 asm volatile("slbmfee %0,%1" : "=r" (esid
) : "r" (i
));
3691 asm volatile("slbmfev %0,%1" : "=r" (vsid
) : "r" (i
));
3696 printf("%02d %016lx %016lx", i
, esid
, vsid
);
3698 if (!(esid
& SLB_ESID_V
)) {
3703 llp
= vsid
& SLB_VSID_LLP
;
3704 if (vsid
& SLB_VSID_B_1T
) {
3705 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3707 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT_1T
,
3710 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3712 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT
,
3719 #ifdef CONFIG_PPC_BOOK3S_32
3720 void dump_segments(void)
3725 for (i
= 0; i
< 16; ++i
)
3726 printf(" %x", mfsrin(i
<< 28));
3732 static void dump_tlb_44x(void)
3736 for (i
= 0; i
< PPC44x_TLB_SIZE
; i
++) {
3737 unsigned long w0
,w1
,w2
;
3738 asm volatile("tlbre %0,%1,0" : "=r" (w0
) : "r" (i
));
3739 asm volatile("tlbre %0,%1,1" : "=r" (w1
) : "r" (i
));
3740 asm volatile("tlbre %0,%1,2" : "=r" (w2
) : "r" (i
));
3741 printf("[%02x] %08lx %08lx %08lx ", i
, w0
, w1
, w2
);
3742 if (w0
& PPC44x_TLB_VALID
) {
3743 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3744 w0
& PPC44x_TLB_EPN_MASK
,
3745 w1
& PPC44x_TLB_ERPN_MASK
,
3746 w1
& PPC44x_TLB_RPN_MASK
,
3747 (w2
& PPC44x_TLB_W
) ? 'W' : 'w',
3748 (w2
& PPC44x_TLB_I
) ? 'I' : 'i',
3749 (w2
& PPC44x_TLB_M
) ? 'M' : 'm',
3750 (w2
& PPC44x_TLB_G
) ? 'G' : 'g',
3751 (w2
& PPC44x_TLB_E
) ? 'E' : 'e');
3756 #endif /* CONFIG_44x */
3758 #ifdef CONFIG_PPC_BOOK3E
3759 static void dump_tlb_book3e(void)
3761 u32 mmucfg
, pidmask
, lpidmask
;
3763 int i
, tlb
, ntlbs
, pidsz
, lpidsz
, rasz
, lrat
= 0;
3765 static const char *pgsz_names
[] = {
3800 /* Gather some infos about the MMU */
3801 mmucfg
= mfspr(SPRN_MMUCFG
);
3802 mmu_version
= (mmucfg
& 3) + 1;
3803 ntlbs
= ((mmucfg
>> 2) & 3) + 1;
3804 pidsz
= ((mmucfg
>> 6) & 0x1f) + 1;
3805 lpidsz
= (mmucfg
>> 24) & 0xf;
3806 rasz
= (mmucfg
>> 16) & 0x7f;
3807 if ((mmu_version
> 1) && (mmucfg
& 0x10000))
3809 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3810 mmu_version
, ntlbs
, pidsz
, lpidsz
, rasz
);
3811 pidmask
= (1ul << pidsz
) - 1;
3812 lpidmask
= (1ul << lpidsz
) - 1;
3813 ramask
= (1ull << rasz
) - 1;
3815 for (tlb
= 0; tlb
< ntlbs
; tlb
++) {
3817 int nent
, assoc
, new_cc
= 1;
3818 printf("TLB %d:\n------\n", tlb
);
3821 tlbcfg
= mfspr(SPRN_TLB0CFG
);
3824 tlbcfg
= mfspr(SPRN_TLB1CFG
);
3827 tlbcfg
= mfspr(SPRN_TLB2CFG
);
3830 tlbcfg
= mfspr(SPRN_TLB3CFG
);
3833 printf("Unsupported TLB number !\n");
3836 nent
= tlbcfg
& 0xfff;
3837 assoc
= (tlbcfg
>> 24) & 0xff;
3838 for (i
= 0; i
< nent
; i
++) {
3839 u32 mas0
= MAS0_TLBSEL(tlb
);
3840 u32 mas1
= MAS1_TSIZE(BOOK3E_PAGESZ_4K
);
3843 int esel
= i
, cc
= i
;
3851 mas0
|= MAS0_ESEL(esel
);
3852 mtspr(SPRN_MAS0
, mas0
);
3853 mtspr(SPRN_MAS1
, mas1
);
3854 mtspr(SPRN_MAS2
, mas2
);
3855 asm volatile("tlbre 0,0,0" : : : "memory");
3856 mas1
= mfspr(SPRN_MAS1
);
3857 mas2
= mfspr(SPRN_MAS2
);
3858 mas7_mas3
= mfspr(SPRN_MAS7_MAS3
);
3859 if (assoc
&& (i
% assoc
) == 0)
3861 if (!(mas1
& MAS1_VALID
))
3864 printf("%04x- ", i
);
3866 printf("%04x-%c", cc
, 'A' + esel
);
3868 printf(" |%c", 'A' + esel
);
3870 printf(" %016llx %04x %s %c%c AS%c",
3872 (mas1
>> 16) & 0x3fff,
3873 pgsz_names
[(mas1
>> 7) & 0x1f],
3874 mas1
& MAS1_IND
? 'I' : ' ',
3875 mas1
& MAS1_IPROT
? 'P' : ' ',
3876 mas1
& MAS1_TS
? '1' : '0');
3877 printf(" %c%c%c%c%c%c%c",
3878 mas2
& MAS2_X0
? 'a' : ' ',
3879 mas2
& MAS2_X1
? 'v' : ' ',
3880 mas2
& MAS2_W
? 'w' : ' ',
3881 mas2
& MAS2_I
? 'i' : ' ',
3882 mas2
& MAS2_M
? 'm' : ' ',
3883 mas2
& MAS2_G
? 'g' : ' ',
3884 mas2
& MAS2_E
? 'e' : ' ');
3885 printf(" %016llx", mas7_mas3
& ramask
& ~0x7ffull
);
3886 if (mas1
& MAS1_IND
)
3888 pgsz_names
[(mas7_mas3
>> 1) & 0x1f]);
3890 printf(" U%c%c%c S%c%c%c\n",
3891 mas7_mas3
& MAS3_UX
? 'x' : ' ',
3892 mas7_mas3
& MAS3_UW
? 'w' : ' ',
3893 mas7_mas3
& MAS3_UR
? 'r' : ' ',
3894 mas7_mas3
& MAS3_SX
? 'x' : ' ',
3895 mas7_mas3
& MAS3_SW
? 'w' : ' ',
3896 mas7_mas3
& MAS3_SR
? 'r' : ' ');
3900 #endif /* CONFIG_PPC_BOOK3E */
3902 static void xmon_init(int enable
)
3906 __debugger_ipi
= xmon_ipi
;
3907 __debugger_bpt
= xmon_bpt
;
3908 __debugger_sstep
= xmon_sstep
;
3909 __debugger_iabr_match
= xmon_iabr_match
;
3910 __debugger_break_match
= xmon_break_match
;
3911 __debugger_fault_handler
= xmon_fault_handler
;
3913 #ifdef CONFIG_PPC_PSERIES
3915 * Get the token here to avoid trying to get a lock
3916 * during the crash, causing a deadlock.
3918 set_indicator_token
= rtas_token("set-indicator");
3922 __debugger_ipi
= NULL
;
3923 __debugger_bpt
= NULL
;
3924 __debugger_sstep
= NULL
;
3925 __debugger_iabr_match
= NULL
;
3926 __debugger_break_match
= NULL
;
3927 __debugger_fault_handler
= NULL
;
3931 #ifdef CONFIG_MAGIC_SYSRQ
3932 static void sysrq_handle_xmon(int key
)
3934 if (xmon_is_locked_down()) {
3939 /* ensure xmon is enabled */
3941 debugger(get_irq_regs());
3946 static const struct sysrq_key_op sysrq_xmon_op
= {
3947 .handler
= sysrq_handle_xmon
,
3948 .help_msg
= "xmon(x)",
3949 .action_msg
= "Entering xmon",
3952 static int __init
setup_xmon_sysrq(void)
3954 register_sysrq_key('x', &sysrq_xmon_op
);
3957 device_initcall(setup_xmon_sysrq
);
3958 #endif /* CONFIG_MAGIC_SYSRQ */
3960 static void clear_all_bpt(void)
3964 /* clear/unpatch all breakpoints */
3968 /* Disable all breakpoints */
3969 for (i
= 0; i
< NBPTS
; ++i
)
3970 bpts
[i
].enabled
= 0;
3972 /* Clear any data or iabr breakpoints */
3974 for (i
= 0; i
< nr_wp_slots(); i
++)
3975 dabr
[i
].enabled
= 0;
3978 #ifdef CONFIG_DEBUG_FS
3979 static int xmon_dbgfs_set(void *data
, u64 val
)
3984 /* make sure all breakpoints removed when disabling */
3988 printf("xmon: All breakpoints cleared\n");
3989 release_output_lock();
3995 static int xmon_dbgfs_get(void *data
, u64
*val
)
4001 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops
, xmon_dbgfs_get
,
4002 xmon_dbgfs_set
, "%llu\n");
4004 static int __init
setup_xmon_dbgfs(void)
4006 debugfs_create_file("xmon", 0600, powerpc_debugfs_root
, NULL
,
4010 device_initcall(setup_xmon_dbgfs
);
4011 #endif /* CONFIG_DEBUG_FS */
4013 static int xmon_early __initdata
;
4015 static int __init
early_parse_xmon(char *p
)
4017 if (xmon_is_locked_down()) {
4021 } else if (!p
|| strncmp(p
, "early", 5) == 0) {
4022 /* just "xmon" is equivalent to "xmon=early" */
4026 } else if (strncmp(p
, "on", 2) == 0) {
4029 } else if (strncmp(p
, "rw", 2) == 0) {
4033 } else if (strncmp(p
, "ro", 2) == 0) {
4037 } else if (strncmp(p
, "off", 3) == 0)
4044 early_param("xmon", early_parse_xmon
);
4046 void __init
xmon_setup(void)
4054 #ifdef CONFIG_SPU_BASE
4058 u64 saved_mfc_sr1_RW
;
4059 u32 saved_spu_runcntl_RW
;
4060 unsigned long dump_addr
;
4064 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
4066 static struct spu_info spu_info
[XMON_NUM_SPUS
];
4068 void xmon_register_spus(struct list_head
*list
)
4072 list_for_each_entry(spu
, list
, full_list
) {
4073 if (spu
->number
>= XMON_NUM_SPUS
) {
4078 spu_info
[spu
->number
].spu
= spu
;
4079 spu_info
[spu
->number
].stopped_ok
= 0;
4080 spu_info
[spu
->number
].dump_addr
= (unsigned long)
4081 spu_info
[spu
->number
].spu
->local_store
;
4085 static void stop_spus(void)
4091 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
4092 if (!spu_info
[i
].spu
)
4095 if (setjmp(bus_error_jmp
) == 0) {
4096 catch_memory_errors
= 1;
4099 spu
= spu_info
[i
].spu
;
4101 spu_info
[i
].saved_spu_runcntl_RW
=
4102 in_be32(&spu
->problem
->spu_runcntl_RW
);
4104 tmp
= spu_mfc_sr1_get(spu
);
4105 spu_info
[i
].saved_mfc_sr1_RW
= tmp
;
4107 tmp
&= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK
;
4108 spu_mfc_sr1_set(spu
, tmp
);
4113 spu_info
[i
].stopped_ok
= 1;
4115 printf("Stopped spu %.2d (was %s)\n", i
,
4116 spu_info
[i
].saved_spu_runcntl_RW
?
4117 "running" : "stopped");
4119 catch_memory_errors
= 0;
4120 printf("*** Error stopping spu %.2d\n", i
);
4122 catch_memory_errors
= 0;
4126 static void restart_spus(void)
4131 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
4132 if (!spu_info
[i
].spu
)
4135 if (!spu_info
[i
].stopped_ok
) {
4136 printf("*** Error, spu %d was not successfully stopped"
4137 ", not restarting\n", i
);
4141 if (setjmp(bus_error_jmp
) == 0) {
4142 catch_memory_errors
= 1;
4145 spu
= spu_info
[i
].spu
;
4146 spu_mfc_sr1_set(spu
, spu_info
[i
].saved_mfc_sr1_RW
);
4147 out_be32(&spu
->problem
->spu_runcntl_RW
,
4148 spu_info
[i
].saved_spu_runcntl_RW
);
4153 printf("Restarted spu %.2d\n", i
);
4155 catch_memory_errors
= 0;
4156 printf("*** Error restarting spu %.2d\n", i
);
4158 catch_memory_errors
= 0;
4162 #define DUMP_WIDTH 23
4163 #define DUMP_VALUE(format, field, value) \
4165 if (setjmp(bus_error_jmp) == 0) { \
4166 catch_memory_errors = 1; \
4168 printf(" %-*s = "format"\n", DUMP_WIDTH, \
4173 catch_memory_errors = 0; \
4174 printf(" %-*s = *** Error reading field.\n", \
4175 DUMP_WIDTH, #field); \
4177 catch_memory_errors = 0; \
4180 #define DUMP_FIELD(obj, format, field) \
4181 DUMP_VALUE(format, field, obj->field)
4183 static void dump_spu_fields(struct spu
*spu
)
4185 printf("Dumping spu fields at address %p:\n", spu
);
4187 DUMP_FIELD(spu
, "0x%x", number
);
4188 DUMP_FIELD(spu
, "%s", name
);
4189 DUMP_FIELD(spu
, "0x%lx", local_store_phys
);
4190 DUMP_FIELD(spu
, "0x%p", local_store
);
4191 DUMP_FIELD(spu
, "0x%lx", ls_size
);
4192 DUMP_FIELD(spu
, "0x%x", node
);
4193 DUMP_FIELD(spu
, "0x%lx", flags
);
4194 DUMP_FIELD(spu
, "%llu", class_0_pending
);
4195 DUMP_FIELD(spu
, "0x%llx", class_0_dar
);
4196 DUMP_FIELD(spu
, "0x%llx", class_1_dar
);
4197 DUMP_FIELD(spu
, "0x%llx", class_1_dsisr
);
4198 DUMP_FIELD(spu
, "0x%x", irqs
[0]);
4199 DUMP_FIELD(spu
, "0x%x", irqs
[1]);
4200 DUMP_FIELD(spu
, "0x%x", irqs
[2]);
4201 DUMP_FIELD(spu
, "0x%x", slb_replace
);
4202 DUMP_FIELD(spu
, "%d", pid
);
4203 DUMP_FIELD(spu
, "0x%p", mm
);
4204 DUMP_FIELD(spu
, "0x%p", ctx
);
4205 DUMP_FIELD(spu
, "0x%p", rq
);
4206 DUMP_FIELD(spu
, "0x%llx", timestamp
);
4207 DUMP_FIELD(spu
, "0x%lx", problem_phys
);
4208 DUMP_FIELD(spu
, "0x%p", problem
);
4209 DUMP_VALUE("0x%x", problem
->spu_runcntl_RW
,
4210 in_be32(&spu
->problem
->spu_runcntl_RW
));
4211 DUMP_VALUE("0x%x", problem
->spu_status_R
,
4212 in_be32(&spu
->problem
->spu_status_R
));
4213 DUMP_VALUE("0x%x", problem
->spu_npc_RW
,
4214 in_be32(&spu
->problem
->spu_npc_RW
));
4215 DUMP_FIELD(spu
, "0x%p", priv2
);
4216 DUMP_FIELD(spu
, "0x%p", pdata
);
4220 spu_inst_dump(unsigned long adr
, long count
, int praddr
)
4222 return generic_inst_dump(adr
, count
, praddr
, print_insn_spu
);
4225 static void dump_spu_ls(unsigned long num
, int subcmd
)
4227 unsigned long offset
, addr
, ls_addr
;
4229 if (setjmp(bus_error_jmp
) == 0) {
4230 catch_memory_errors
= 1;
4232 ls_addr
= (unsigned long)spu_info
[num
].spu
->local_store
;
4236 catch_memory_errors
= 0;
4237 printf("*** Error: accessing spu info for spu %ld\n", num
);
4240 catch_memory_errors
= 0;
4242 if (scanhex(&offset
))
4243 addr
= ls_addr
+ offset
;
4245 addr
= spu_info
[num
].dump_addr
;
4247 if (addr
>= ls_addr
+ LS_SIZE
) {
4248 printf("*** Error: address outside of local store\n");
4254 addr
+= spu_inst_dump(addr
, 16, 1);
4264 spu_info
[num
].dump_addr
= addr
;
4267 static int do_spu_cmd(void)
4269 static unsigned long num
= 0;
4270 int cmd
, subcmd
= 0;
4282 if (isxdigit(subcmd
) || subcmd
== '\n')
4287 if (num
>= XMON_NUM_SPUS
|| !spu_info
[num
].spu
) {
4288 printf("*** Error: invalid spu number\n");
4294 dump_spu_fields(spu_info
[num
].spu
);
4297 dump_spu_ls(num
, subcmd
);
4308 #else /* ! CONFIG_SPU_BASE */
4309 static int do_spu_cmd(void)