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>
32 #include <asm/ptrace.h>
33 #include <asm/string.h>
35 #include <asm/machdep.h>
37 #include <asm/processor.h>
38 #include <asm/pgtable.h>
40 #include <asm/mmu_context.h>
41 #include <asm/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>
56 #include <asm/hvcall.h>
60 #if defined(CONFIG_PPC_SPLPAR)
61 #include <asm/plpar_wrappers.h>
63 static inline long plapr_set_ciabr(unsigned long ciabr
) {return 0; };
70 static cpumask_t cpus_in_xmon
= CPU_MASK_NONE
;
71 static unsigned long xmon_taken
= 1;
72 static int xmon_owner
;
76 #endif /* CONFIG_SMP */
78 static unsigned long in_xmon __read_mostly
= 0;
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];
89 static long bus_error_jmp
[JMP_BUF_LEN
];
90 static int catch_memory_errors
;
91 static int catch_spr_faults
;
92 static long *xmon_fault_jmp
[NR_CPUS
];
94 /* Breakpoint stuff */
96 unsigned long address
;
97 unsigned int instr
[2];
103 /* Bits in bpt.enabled */
109 static struct bpt bpts
[NBPTS
];
110 static struct bpt dabr
;
111 static struct bpt
*iabr
;
112 static unsigned bpinstr
= 0x7fe00008; /* trap */
114 #define BP_NUM(bp) ((bp) - bpts + 1)
117 static int cmds(struct pt_regs
*);
118 static int mread(unsigned long, void *, int);
119 static int mwrite(unsigned long, void *, int);
120 static int handle_fault(struct pt_regs
*);
121 static void byterev(unsigned char *, int);
122 static void memex(void);
123 static int bsesc(void);
124 static void dump(void);
125 static void prdump(unsigned long, long);
126 static int ppc_inst_dump(unsigned long, long, int);
127 static void dump_log_buf(void);
129 #ifdef CONFIG_PPC_POWERNV
130 static void dump_opal_msglog(void);
132 static inline void dump_opal_msglog(void)
134 printf("Machine is not running OPAL firmware.\n");
138 static void backtrace(struct pt_regs
*);
139 static void excprint(struct pt_regs
*);
140 static void prregs(struct pt_regs
*);
141 static void memops(int);
142 static void memlocate(void);
143 static void memzcan(void);
144 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
146 int scanhex(unsigned long *valp
);
147 static void scannl(void);
148 static int hexdigit(int);
149 void getstring(char *, int);
150 static void flush_input(void);
151 static int inchar(void);
152 static void take_input(char *);
153 static int read_spr(int, unsigned long *);
154 static void write_spr(int, unsigned long);
155 static void super_regs(void);
156 static void remove_bpts(void);
157 static void insert_bpts(void);
158 static void remove_cpu_bpts(void);
159 static void insert_cpu_bpts(void);
160 static struct bpt
*at_breakpoint(unsigned long pc
);
161 static struct bpt
*in_breakpoint_table(unsigned long pc
, unsigned long *offp
);
162 static int do_step(struct pt_regs
*);
163 static void bpt_cmds(void);
164 static void cacheflush(void);
165 static int cpu_cmd(void);
166 static void csum(void);
167 static void bootcmds(void);
168 static void proccall(void);
169 static void show_tasks(void);
170 void dump_segments(void);
171 static void symbol_lookup(void);
172 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
174 static void xmon_print_symbol(unsigned long address
, const char *mid
,
176 static const char *getvecname(unsigned long vec
);
178 static int do_spu_cmd(void);
181 static void dump_tlb_44x(void);
183 #ifdef CONFIG_PPC_BOOK3E
184 static void dump_tlb_book3e(void);
187 static int xmon_no_auto_backtrace
;
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 dt dump the tracing buffers (uses printk)\n\
235 e print exception information\n\
237 la lookup symbol+offset of specified address\n\
238 ls lookup address of specified symbol\n\
239 m examine/change memory\n\
240 mm move a block of memory\n\
241 ms set a block of memory\n\
242 md compare two blocks of memory\n\
243 ml locate a block of memory\n\
244 mz zero a block of memory\n\
245 mi show information about memory allocation\n\
246 p call a procedure\n\
247 P list processes/tasks\n\
250 #ifdef CONFIG_SPU_BASE
251 " ss stop execution on all spus\n\
252 sr restore execution on stopped spus\n\
253 sf # dump spu fields for spu # (in hex)\n\
254 sd # dump spu local store for spu # (in hex)\n\
255 sdi # disassemble spu local store for spu # (in hex)\n"
257 " S print special registers\n\
260 Sw #v write v to SPR #\n\
262 x exit monitor and recover\n\
263 X exit monitor and don't recover\n"
264 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
265 " u dump segment table or SLB\n"
266 #elif defined(CONFIG_PPC_STD_MMU_32)
267 " u dump segment registers\n"
268 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
272 " # n limit output to n lines per page (for dp, dpa, dl)\n"
277 static struct pt_regs
*xmon_regs
;
279 static inline void sync(void)
281 asm volatile("sync; isync");
284 static inline void store_inst(void *p
)
286 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p
));
289 static inline void cflush(void *p
)
291 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p
));
294 static inline void cinval(void *p
)
296 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p
));
300 * write_ciabr() - write the CIABR SPR
301 * @ciabr: The value to write.
303 * This function writes a value to the CIARB register either directly
304 * through mtspr instruction if the kernel is in HV privilege mode or
305 * call a hypervisor function to achieve the same in case the kernel
306 * is in supervisor privilege mode.
308 static void write_ciabr(unsigned long ciabr
)
310 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
313 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
314 mtspr(SPRN_CIABR
, ciabr
);
317 plapr_set_ciabr(ciabr
);
321 * set_ciabr() - set the CIABR
322 * @addr: The value to set.
324 * This function sets the correct privilege value into the the HW
325 * breakpoint address before writing it up in the CIABR register.
327 static void set_ciabr(unsigned long addr
)
331 if (cpu_has_feature(CPU_FTR_HVMODE
))
332 addr
|= CIABR_PRIV_HYPER
;
334 addr
|= CIABR_PRIV_SUPER
;
339 * Disable surveillance (the service processor watchdog function)
340 * while we are in xmon.
341 * XXX we should re-enable it when we leave. :)
343 #define SURVEILLANCE_TOKEN 9000
345 static inline void disable_surveillance(void)
347 #ifdef CONFIG_PPC_PSERIES
348 /* Since this can't be a module, args should end up below 4GB. */
349 static struct rtas_args args
;
353 * At this point we have got all the cpus we can into
354 * xmon, so there is hopefully no other cpu calling RTAS
355 * at the moment, even though we don't take rtas.lock.
356 * If we did try to take rtas.lock there would be a
357 * real possibility of deadlock.
359 token
= rtas_token("set-indicator");
360 if (token
== RTAS_UNKNOWN_SERVICE
)
363 rtas_call_unlocked(&args
, token
, 3, 1, NULL
, SURVEILLANCE_TOKEN
, 0, 0);
365 #endif /* CONFIG_PPC_PSERIES */
369 static int xmon_speaker
;
371 static void get_output_lock(void)
373 int me
= smp_processor_id() + 0x100;
374 int last_speaker
= 0, prev
;
377 if (xmon_speaker
== me
)
381 last_speaker
= cmpxchg(&xmon_speaker
, 0, me
);
382 if (last_speaker
== 0)
386 * Wait a full second for the lock, we might be on a slow
387 * console, but check every 100us.
390 while (xmon_speaker
== last_speaker
) {
396 /* hostile takeover */
397 prev
= cmpxchg(&xmon_speaker
, last_speaker
, me
);
398 if (prev
== last_speaker
)
405 static void release_output_lock(void)
410 int cpus_are_in_xmon(void)
412 return !cpumask_empty(&cpus_in_xmon
);
416 static inline int unrecoverable_excp(struct pt_regs
*regs
)
418 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
419 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
422 return ((regs
->msr
& MSR_RI
) == 0);
426 static int xmon_core(struct pt_regs
*regs
, int fromipi
)
430 long recurse_jmp
[JMP_BUF_LEN
];
431 unsigned long offset
;
436 unsigned long timeout
;
439 local_irq_save(flags
);
442 bp
= in_breakpoint_table(regs
->nip
, &offset
);
444 regs
->nip
= bp
->address
+ offset
;
445 atomic_dec(&bp
->ref_count
);
451 cpu
= smp_processor_id();
452 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
454 * We catch SPR read/write faults here because the 0x700, 0xf60
455 * etc. handlers don't call debugger_fault_handler().
457 if (catch_spr_faults
)
458 longjmp(bus_error_jmp
, 1);
461 printf("cpu 0x%x: Exception %lx %s in xmon, "
462 "returning to main loop\n",
463 cpu
, regs
->trap
, getvecname(TRAP(regs
)));
464 release_output_lock();
465 longjmp(xmon_fault_jmp
[cpu
], 1);
468 if (setjmp(recurse_jmp
) != 0) {
469 if (!in_xmon
|| !xmon_gate
) {
471 printf("xmon: WARNING: bad recursive fault "
472 "on cpu 0x%x\n", cpu
);
473 release_output_lock();
476 secondary
= !(xmon_taken
&& cpu
== xmon_owner
);
480 xmon_fault_jmp
[cpu
] = recurse_jmp
;
483 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
))
484 bp
= at_breakpoint(regs
->nip
);
485 if (bp
|| unrecoverable_excp(regs
))
492 printf("cpu 0x%x stopped at breakpoint 0x%lx (",
494 xmon_print_symbol(regs
->nip
, " ", ")\n");
496 if (unrecoverable_excp(regs
))
497 printf("WARNING: exception is not recoverable, "
499 release_output_lock();
502 cpumask_set_cpu(cpu
, &cpus_in_xmon
);
506 while (secondary
&& !xmon_gate
) {
510 secondary
= test_and_set_bit(0, &in_xmon
);
515 if (!secondary
&& !xmon_gate
) {
516 /* we are the first cpu to come in */
517 /* interrupt other cpu(s) */
518 int ncpus
= num_online_cpus();
523 smp_send_debugger_break();
524 /* wait for other cpus to come in */
525 for (timeout
= 100000000; timeout
!= 0; --timeout
) {
526 if (cpumask_weight(&cpus_in_xmon
) >= ncpus
)
532 disable_surveillance();
533 /* for breakpoint or single step, print the current instr. */
534 if (bp
|| TRAP(regs
) == 0xd00)
535 ppc_inst_dump(regs
->nip
, 1, 0);
536 printf("enter ? for help\n");
545 if (cpu
== xmon_owner
) {
546 if (!test_and_set_bit(0, &xmon_taken
)) {
551 while (cpu
== xmon_owner
)
565 /* have switched to some other cpu */
570 cpumask_clear_cpu(cpu
, &cpus_in_xmon
);
571 xmon_fault_jmp
[cpu
] = NULL
;
573 /* UP is simple... */
575 printf("Exception %lx %s in xmon, returning to main loop\n",
576 regs
->trap
, getvecname(TRAP(regs
)));
577 longjmp(xmon_fault_jmp
[0], 1);
579 if (setjmp(recurse_jmp
) == 0) {
580 xmon_fault_jmp
[0] = recurse_jmp
;
584 bp
= at_breakpoint(regs
->nip
);
586 printf("Stopped at breakpoint %lx (", BP_NUM(bp
));
587 xmon_print_symbol(regs
->nip
, " ", ")\n");
589 if (unrecoverable_excp(regs
))
590 printf("WARNING: exception is not recoverable, "
593 disable_surveillance();
594 /* for breakpoint or single step, print the current instr. */
595 if (bp
|| TRAP(regs
) == 0xd00)
596 ppc_inst_dump(regs
->nip
, 1, 0);
597 printf("enter ? for help\n");
607 if (regs
->msr
& MSR_DE
) {
608 bp
= at_breakpoint(regs
->nip
);
610 regs
->nip
= (unsigned long) &bp
->instr
[0];
611 atomic_inc(&bp
->ref_count
);
615 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
616 bp
= at_breakpoint(regs
->nip
);
618 int stepped
= emulate_step(regs
, bp
->instr
[0]);
620 regs
->nip
= (unsigned long) &bp
->instr
[0];
621 atomic_inc(&bp
->ref_count
);
622 } else if (stepped
< 0) {
623 printf("Couldn't single-step %s instruction\n",
624 (IS_RFID(bp
->instr
[0])? "rfid": "mtmsrd"));
631 touch_nmi_watchdog();
632 local_irq_restore(flags
);
634 return cmd
!= 'X' && cmd
!= EOF
;
637 int xmon(struct pt_regs
*excp
)
642 ppc_save_regs(®s
);
646 return xmon_core(excp
, 0);
650 irqreturn_t
xmon_irq(int irq
, void *d
)
653 local_irq_save(flags
);
654 printf("Keyboard interrupt\n");
655 xmon(get_irq_regs());
656 local_irq_restore(flags
);
660 static int xmon_bpt(struct pt_regs
*regs
)
663 unsigned long offset
;
665 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
668 /* Are we at the trap at bp->instr[1] for some bp? */
669 bp
= in_breakpoint_table(regs
->nip
, &offset
);
670 if (bp
!= NULL
&& offset
== 4) {
671 regs
->nip
= bp
->address
+ 4;
672 atomic_dec(&bp
->ref_count
);
676 /* Are we at a breakpoint? */
677 bp
= at_breakpoint(regs
->nip
);
686 static int xmon_sstep(struct pt_regs
*regs
)
694 static int xmon_break_match(struct pt_regs
*regs
)
696 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
698 if (dabr
.enabled
== 0)
704 static int xmon_iabr_match(struct pt_regs
*regs
)
706 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
714 static int xmon_ipi(struct pt_regs
*regs
)
717 if (in_xmon
&& !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon
))
723 static int xmon_fault_handler(struct pt_regs
*regs
)
726 unsigned long offset
;
728 if (in_xmon
&& catch_memory_errors
)
729 handle_fault(regs
); /* doesn't return */
731 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
732 bp
= in_breakpoint_table(regs
->nip
, &offset
);
734 regs
->nip
= bp
->address
+ offset
;
735 atomic_dec(&bp
->ref_count
);
742 static struct bpt
*at_breakpoint(unsigned long pc
)
748 for (i
= 0; i
< NBPTS
; ++i
, ++bp
)
749 if (bp
->enabled
&& pc
== bp
->address
)
754 static struct bpt
*in_breakpoint_table(unsigned long nip
, unsigned long *offp
)
758 off
= nip
- (unsigned long) bpts
;
759 if (off
>= sizeof(bpts
))
761 off
%= sizeof(struct bpt
);
762 if (off
!= offsetof(struct bpt
, instr
[0])
763 && off
!= offsetof(struct bpt
, instr
[1]))
765 *offp
= off
- offsetof(struct bpt
, instr
[0]);
766 return (struct bpt
*) (nip
- off
);
769 static struct bpt
*new_breakpoint(unsigned long a
)
774 bp
= at_breakpoint(a
);
778 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
779 if (!bp
->enabled
&& atomic_read(&bp
->ref_count
) == 0) {
781 bp
->instr
[1] = bpinstr
;
782 store_inst(&bp
->instr
[1]);
787 printf("Sorry, no free breakpoints. Please clear one first.\n");
791 static void insert_bpts(void)
797 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
798 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) == 0)
800 if (mread(bp
->address
, &bp
->instr
[0], 4) != 4) {
801 printf("Couldn't read instruction at %lx, "
802 "disabling breakpoint there\n", bp
->address
);
806 if (IS_MTMSRD(bp
->instr
[0]) || IS_RFID(bp
->instr
[0])) {
807 printf("Breakpoint at %lx is on an mtmsrd or rfid "
808 "instruction, disabling it\n", bp
->address
);
812 store_inst(&bp
->instr
[0]);
813 if (bp
->enabled
& BP_CIABR
)
815 if (mwrite(bp
->address
, &bpinstr
, 4) != 4) {
816 printf("Couldn't write instruction at %lx, "
817 "disabling breakpoint there\n", bp
->address
);
818 bp
->enabled
&= ~BP_TRAP
;
821 store_inst((void *)bp
->address
);
825 static void insert_cpu_bpts(void)
827 struct arch_hw_breakpoint brk
;
830 brk
.address
= dabr
.address
;
831 brk
.type
= (dabr
.enabled
& HW_BRK_TYPE_DABR
) | HW_BRK_TYPE_PRIV_ALL
;
833 __set_breakpoint(&brk
);
837 set_ciabr(iabr
->address
);
840 static void remove_bpts(void)
847 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
848 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) != BP_TRAP
)
850 if (mread(bp
->address
, &instr
, 4) == 4
852 && mwrite(bp
->address
, &bp
->instr
, 4) != 4)
853 printf("Couldn't remove breakpoint at %lx\n",
856 store_inst((void *)bp
->address
);
860 static void remove_cpu_bpts(void)
862 hw_breakpoint_disable();
866 static void set_lpp_cmd(void)
870 if (!scanhex(&lpp
)) {
871 printf("Invalid number.\n");
874 xmon_set_pagination_lpp(lpp
);
876 /* Command interpreting routine */
877 static char *last_cmd
;
880 cmds(struct pt_regs
*excp
)
887 if (!xmon_no_auto_backtrace
) {
888 xmon_no_auto_backtrace
= 1;
889 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
894 printf("%x:", smp_processor_id());
895 #endif /* CONFIG_SMP */
901 if (last_cmd
== NULL
)
903 take_input(last_cmd
);
937 prregs(excp
); /* print regs */
952 if (do_spu_cmd() == 0)
961 printf(" <no input ...>\n");
965 xmon_puts(help_string
);
989 #ifdef CONFIG_PPC_STD_MMU
993 #elif defined(CONFIG_44x)
997 #elif defined(CONFIG_PPC_BOOK3E)
1003 printf("Unrecognized command: ");
1005 if (' ' < cmd
&& cmd
<= '~')
1008 printf("\\x%x", cmd
);
1010 } while (cmd
!= '\n');
1011 printf(" (type ? for help)\n");
1018 static int do_step(struct pt_regs
*regs
)
1020 regs
->msr
|= MSR_DE
;
1021 mtspr(SPRN_DBCR0
, mfspr(SPRN_DBCR0
) | DBCR0_IC
| DBCR0_IDM
);
1026 * Step a single instruction.
1027 * Some instructions we emulate, others we execute with MSR_SE set.
1029 static int do_step(struct pt_regs
*regs
)
1034 /* check we are in 64-bit kernel mode, translation enabled */
1035 if ((regs
->msr
& (MSR_64BIT
|MSR_PR
|MSR_IR
)) == (MSR_64BIT
|MSR_IR
)) {
1036 if (mread(regs
->nip
, &instr
, 4) == 4) {
1037 stepped
= emulate_step(regs
, instr
);
1039 printf("Couldn't single-step %s instruction\n",
1040 (IS_RFID(instr
)? "rfid": "mtmsrd"));
1044 regs
->trap
= 0xd00 | (regs
->trap
& 1);
1045 printf("stepped to ");
1046 xmon_print_symbol(regs
->nip
, " ", "\n");
1047 ppc_inst_dump(regs
->nip
, 1, 0);
1052 regs
->msr
|= MSR_SE
;
1057 static void bootcmds(void)
1063 ppc_md
.restart(NULL
);
1064 else if (cmd
== 'h')
1066 else if (cmd
== 'p')
1071 static int cpu_cmd(void)
1074 unsigned long cpu
, first_cpu
, last_cpu
;
1077 if (!scanhex(&cpu
)) {
1078 /* print cpus waiting or in xmon */
1079 printf("cpus stopped:");
1080 last_cpu
= first_cpu
= NR_CPUS
;
1081 for_each_possible_cpu(cpu
) {
1082 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1083 if (cpu
== last_cpu
+ 1) {
1086 if (last_cpu
!= first_cpu
)
1087 printf("-0x%lx", last_cpu
);
1088 last_cpu
= first_cpu
= cpu
;
1089 printf(" 0x%lx", cpu
);
1093 if (last_cpu
!= first_cpu
)
1094 printf("-0x%lx", last_cpu
);
1098 /* try to switch to cpu specified */
1099 if (!cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1100 printf("cpu 0x%x isn't in xmon\n", cpu
);
1107 while (!xmon_taken
) {
1108 if (--timeout
== 0) {
1109 if (test_and_set_bit(0, &xmon_taken
))
1111 /* take control back */
1113 xmon_owner
= smp_processor_id();
1114 printf("cpu 0x%x didn't take control\n", cpu
);
1122 #endif /* CONFIG_SMP */
1125 static unsigned short fcstab
[256] = {
1126 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1127 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1128 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1129 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1130 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1131 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1132 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1133 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1134 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1135 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1136 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1137 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1138 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1139 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1140 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1141 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1142 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1143 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1144 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1145 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1146 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1147 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1148 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1149 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1150 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1151 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1152 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1153 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1154 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1155 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1156 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1157 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1160 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1169 if (!scanhex(&adrs
))
1171 if (!scanhex(&ncsum
))
1174 for (i
= 0; i
< ncsum
; ++i
) {
1175 if (mread(adrs
+i
, &v
, 1) == 0) {
1176 printf("csum stopped at "REG
"\n", adrs
+i
);
1181 printf("%x\n", fcs
);
1185 * Check if this is a suitable place to put a breakpoint.
1187 static long check_bp_loc(unsigned long addr
)
1192 if (!is_kernel_addr(addr
)) {
1193 printf("Breakpoints may only be placed at kernel addresses\n");
1196 if (!mread(addr
, &instr
, sizeof(instr
))) {
1197 printf("Can't read instruction at address %lx\n", addr
);
1200 if (IS_MTMSRD(instr
) || IS_RFID(instr
)) {
1201 printf("Breakpoints may not be placed on mtmsrd or rfid "
1208 static char *breakpoint_help_string
=
1209 "Breakpoint command usage:\n"
1210 "b show breakpoints\n"
1211 "b <addr> [cnt] set breakpoint at given instr addr\n"
1212 "bc clear all breakpoints\n"
1213 "bc <n/addr> clear breakpoint number n or at addr\n"
1214 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1215 "bd <addr> [cnt] set hardware data breakpoint\n"
1225 const char badaddr
[] = "Only kernel addresses are permitted "
1226 "for breakpoints\n";
1231 case 'd': /* bd - hardware data breakpoint */
1236 else if (cmd
== 'w')
1242 if (scanhex(&dabr
.address
)) {
1243 if (!is_kernel_addr(dabr
.address
)) {
1247 dabr
.address
&= ~HW_BRK_TYPE_DABR
;
1248 dabr
.enabled
= mode
| BP_DABR
;
1252 case 'i': /* bi - hardware instr breakpoint */
1253 if (!cpu_has_feature(CPU_FTR_ARCH_207S
)) {
1254 printf("Hardware instruction breakpoint "
1255 "not supported on this cpu\n");
1259 iabr
->enabled
&= ~BP_CIABR
;
1264 if (!check_bp_loc(a
))
1266 bp
= new_breakpoint(a
);
1268 bp
->enabled
|= BP_CIABR
;
1276 /* clear all breakpoints */
1277 for (i
= 0; i
< NBPTS
; ++i
)
1278 bpts
[i
].enabled
= 0;
1281 printf("All breakpoints cleared\n");
1285 if (a
<= NBPTS
&& a
>= 1) {
1286 /* assume a breakpoint number */
1287 bp
= &bpts
[a
-1]; /* bp nums are 1 based */
1289 /* assume a breakpoint address */
1290 bp
= at_breakpoint(a
);
1292 printf("No breakpoint at %lx\n", a
);
1297 printf("Cleared breakpoint %lx (", BP_NUM(bp
));
1298 xmon_print_symbol(bp
->address
, " ", ")\n");
1306 printf(breakpoint_help_string
);
1311 /* print all breakpoints */
1312 printf(" type address\n");
1314 printf(" data "REG
" [", dabr
.address
);
1315 if (dabr
.enabled
& 1)
1317 if (dabr
.enabled
& 2)
1321 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
1324 printf("%2x %s ", BP_NUM(bp
),
1325 (bp
->enabled
& BP_CIABR
) ? "inst": "trap");
1326 xmon_print_symbol(bp
->address
, " ", "\n");
1331 if (!check_bp_loc(a
))
1333 bp
= new_breakpoint(a
);
1335 bp
->enabled
|= BP_TRAP
;
1340 /* Very cheap human name for vector lookup. */
1342 const char *getvecname(unsigned long vec
)
1347 case 0x100: ret
= "(System Reset)"; break;
1348 case 0x200: ret
= "(Machine Check)"; break;
1349 case 0x300: ret
= "(Data Access)"; break;
1350 case 0x380: ret
= "(Data SLB Access)"; break;
1351 case 0x400: ret
= "(Instruction Access)"; break;
1352 case 0x480: ret
= "(Instruction SLB Access)"; break;
1353 case 0x500: ret
= "(Hardware Interrupt)"; break;
1354 case 0x600: ret
= "(Alignment)"; break;
1355 case 0x700: ret
= "(Program Check)"; break;
1356 case 0x800: ret
= "(FPU Unavailable)"; break;
1357 case 0x900: ret
= "(Decrementer)"; break;
1358 case 0x980: ret
= "(Hypervisor Decrementer)"; break;
1359 case 0xa00: ret
= "(Doorbell)"; break;
1360 case 0xc00: ret
= "(System Call)"; break;
1361 case 0xd00: ret
= "(Single Step)"; break;
1362 case 0xe40: ret
= "(Emulation Assist)"; break;
1363 case 0xe60: ret
= "(HMI)"; break;
1364 case 0xe80: ret
= "(Hypervisor Doorbell)"; break;
1365 case 0xf00: ret
= "(Performance Monitor)"; break;
1366 case 0xf20: ret
= "(Altivec Unavailable)"; break;
1367 case 0x1300: ret
= "(Instruction Breakpoint)"; break;
1368 case 0x1500: ret
= "(Denormalisation)"; break;
1369 case 0x1700: ret
= "(Altivec Assist)"; break;
1375 static void get_function_bounds(unsigned long pc
, unsigned long *startp
,
1376 unsigned long *endp
)
1378 unsigned long size
, offset
;
1381 *startp
= *endp
= 0;
1384 if (setjmp(bus_error_jmp
) == 0) {
1385 catch_memory_errors
= 1;
1387 name
= kallsyms_lookup(pc
, &size
, &offset
, NULL
, tmpstr
);
1389 *startp
= pc
- offset
;
1390 *endp
= pc
- offset
+ size
;
1394 catch_memory_errors
= 0;
1397 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1398 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1400 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
1403 int max_to_print
= 64;
1405 unsigned long newsp
;
1406 unsigned long marker
;
1407 struct pt_regs regs
;
1409 while (max_to_print
--) {
1410 if (!is_kernel_addr(sp
)) {
1412 printf("SP (%lx) is in userspace\n", sp
);
1416 if (!mread(sp
+ LRSAVE_OFFSET
, &ip
, sizeof(unsigned long))
1417 || !mread(sp
, &newsp
, sizeof(unsigned long))) {
1418 printf("Couldn't read stack frame at %lx\n", sp
);
1423 * For the first stack frame, try to work out if
1424 * LR and/or the saved LR value in the bottommost
1425 * stack frame are valid.
1427 if ((pc
| lr
) != 0) {
1428 unsigned long fnstart
, fnend
;
1429 unsigned long nextip
;
1432 get_function_bounds(pc
, &fnstart
, &fnend
);
1435 mread(newsp
+ LRSAVE_OFFSET
, &nextip
,
1436 sizeof(unsigned long));
1438 if (!is_kernel_addr(lr
)
1439 || (fnstart
<= lr
&& lr
< fnend
))
1441 } else if (lr
== nextip
) {
1443 } else if (is_kernel_addr(lr
)
1444 && !(fnstart
<= lr
&& lr
< fnend
)) {
1445 printf("[link register ] ");
1446 xmon_print_symbol(lr
, " ", "\n");
1449 printf("["REG
"] ", sp
);
1450 xmon_print_symbol(ip
, " ", " (unreliable)\n");
1455 printf("["REG
"] ", sp
);
1456 xmon_print_symbol(ip
, " ", "\n");
1459 /* Look for "regshere" marker to see if this is
1460 an exception frame. */
1461 if (mread(sp
+ MARKER_OFFSET
, &marker
, sizeof(unsigned long))
1462 && marker
== STACK_FRAME_REGS_MARKER
) {
1463 if (mread(sp
+ STACK_FRAME_OVERHEAD
, ®s
, sizeof(regs
))
1465 printf("Couldn't read registers at %lx\n",
1466 sp
+ STACK_FRAME_OVERHEAD
);
1469 printf("--- Exception: %lx %s at ", regs
.trap
,
1470 getvecname(TRAP(®s
)));
1473 xmon_print_symbol(pc
, " ", "\n");
1483 static void backtrace(struct pt_regs
*excp
)
1488 xmon_show_stack(sp
, 0, 0);
1490 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
1494 static void print_bug_trap(struct pt_regs
*regs
)
1497 const struct bug_entry
*bug
;
1500 if (regs
->msr
& MSR_PR
)
1501 return; /* not in kernel */
1502 addr
= regs
->nip
; /* address of trap instruction */
1503 if (!is_kernel_addr(addr
))
1505 bug
= find_bug(regs
->nip
);
1508 if (is_warning_bug(bug
))
1511 #ifdef CONFIG_DEBUG_BUGVERBOSE
1512 printf("kernel BUG at %s:%u!\n",
1513 bug
->file
, bug
->line
);
1515 printf("kernel BUG at %p!\n", (void *)bug
->bug_addr
);
1517 #endif /* CONFIG_BUG */
1520 static void excprint(struct pt_regs
*fp
)
1525 printf("cpu 0x%x: ", smp_processor_id());
1526 #endif /* CONFIG_SMP */
1529 printf("Vector: %lx %s at [%lx]\n", fp
->trap
, getvecname(trap
), fp
);
1531 xmon_print_symbol(fp
->nip
, ": ", "\n");
1533 printf(" lr: ", fp
->link
);
1534 xmon_print_symbol(fp
->link
, ": ", "\n");
1536 printf(" sp: %lx\n", fp
->gpr
[1]);
1537 printf(" msr: %lx\n", fp
->msr
);
1539 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600 || trap
== 0x200) {
1540 printf(" dar: %lx\n", fp
->dar
);
1542 printf(" dsisr: %lx\n", fp
->dsisr
);
1545 printf(" current = 0x%lx\n", current
);
1547 printf(" paca = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n",
1548 local_paca
, local_paca
->soft_enabled
, local_paca
->irq_happened
);
1551 printf(" pid = %ld, comm = %s\n",
1552 current
->pid
, current
->comm
);
1558 printf(linux_banner
);
1561 static void prregs(struct pt_regs
*fp
)
1565 struct pt_regs regs
;
1567 if (scanhex(&base
)) {
1568 if (setjmp(bus_error_jmp
) == 0) {
1569 catch_memory_errors
= 1;
1571 regs
= *(struct pt_regs
*)base
;
1575 catch_memory_errors
= 0;
1576 printf("*** Error reading registers from "REG
"\n",
1580 catch_memory_errors
= 0;
1585 if (FULL_REGS(fp
)) {
1586 for (n
= 0; n
< 16; ++n
)
1587 printf("R%.2ld = "REG
" R%.2ld = "REG
"\n",
1588 n
, fp
->gpr
[n
], n
+16, fp
->gpr
[n
+16]);
1590 for (n
= 0; n
< 7; ++n
)
1591 printf("R%.2ld = "REG
" R%.2ld = "REG
"\n",
1592 n
, fp
->gpr
[n
], n
+7, fp
->gpr
[n
+7]);
1595 for (n
= 0; n
< 32; ++n
) {
1596 printf("R%.2d = %.8x%s", n
, fp
->gpr
[n
],
1597 (n
& 3) == 3? "\n": " ");
1598 if (n
== 12 && !FULL_REGS(fp
)) {
1605 xmon_print_symbol(fp
->nip
, " ", "\n");
1606 if (TRAP(fp
) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR
)) {
1608 xmon_print_symbol(fp
->orig_gpr3
, " ", "\n");
1611 xmon_print_symbol(fp
->link
, " ", "\n");
1612 printf("msr = "REG
" cr = %.8lx\n", fp
->msr
, fp
->ccr
);
1613 printf("ctr = "REG
" xer = "REG
" trap = %4lx\n",
1614 fp
->ctr
, fp
->xer
, fp
->trap
);
1616 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600)
1617 printf("dar = "REG
" dsisr = %.8lx\n", fp
->dar
, fp
->dsisr
);
1620 static void cacheflush(void)
1623 unsigned long nflush
;
1628 scanhex((void *)&adrs
);
1633 nflush
= (nflush
+ L1_CACHE_BYTES
- 1) / L1_CACHE_BYTES
;
1634 if (setjmp(bus_error_jmp
) == 0) {
1635 catch_memory_errors
= 1;
1639 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1640 cflush((void *) adrs
);
1642 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1643 cinval((void *) adrs
);
1646 /* wait a little while to see if we get a machine check */
1649 catch_memory_errors
= 0;
1652 extern unsigned long xmon_mfspr(int spr
, unsigned long default_value
);
1653 extern void xmon_mtspr(int spr
, unsigned long value
);
1656 read_spr(int n
, unsigned long *vp
)
1658 unsigned long ret
= -1UL;
1661 if (setjmp(bus_error_jmp
) == 0) {
1662 catch_spr_faults
= 1;
1665 ret
= xmon_mfspr(n
, *vp
);
1671 catch_spr_faults
= 0;
1677 write_spr(int n
, unsigned long val
)
1679 if (setjmp(bus_error_jmp
) == 0) {
1680 catch_spr_faults
= 1;
1687 printf("SPR 0x%03x (%4d) Faulted during write\n", n
, n
);
1689 catch_spr_faults
= 0;
1692 static void dump_206_sprs(void)
1695 if (!cpu_has_feature(CPU_FTR_ARCH_206
))
1698 /* Actually some of these pre-date 2.06, but whatevs */
1700 printf("srr0 = %.16x srr1 = %.16x dsisr = %.8x\n",
1701 mfspr(SPRN_SRR0
), mfspr(SPRN_SRR1
), mfspr(SPRN_DSISR
));
1702 printf("dscr = %.16x ppr = %.16x pir = %.8x\n",
1703 mfspr(SPRN_DSCR
), mfspr(SPRN_PPR
), mfspr(SPRN_PIR
));
1705 if (!(mfmsr() & MSR_HV
))
1708 printf("sdr1 = %.16x hdar = %.16x hdsisr = %.8x\n",
1709 mfspr(SPRN_SDR1
), mfspr(SPRN_HDAR
), mfspr(SPRN_HDSISR
));
1710 printf("hsrr0 = %.16x hsrr1 = %.16x hdec = %.8x\n",
1711 mfspr(SPRN_HSRR0
), mfspr(SPRN_HSRR1
), mfspr(SPRN_HDEC
));
1712 printf("lpcr = %.16x pcr = %.16x lpidr = %.8x\n",
1713 mfspr(SPRN_LPCR
), mfspr(SPRN_PCR
), mfspr(SPRN_LPID
));
1714 printf("hsprg0 = %.16x hsprg1 = %.16x\n",
1715 mfspr(SPRN_HSPRG0
), mfspr(SPRN_HSPRG1
));
1716 printf("dabr = %.16x dabrx = %.16x\n",
1717 mfspr(SPRN_DABR
), mfspr(SPRN_DABRX
));
1721 static void dump_207_sprs(void)
1726 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
1729 printf("dpdes = %.16x tir = %.16x cir = %.8x\n",
1730 mfspr(SPRN_DPDES
), mfspr(SPRN_TIR
), mfspr(SPRN_CIR
));
1732 printf("fscr = %.16x tar = %.16x pspb = %.8x\n",
1733 mfspr(SPRN_FSCR
), mfspr(SPRN_TAR
), mfspr(SPRN_PSPB
));
1737 /* Only if TM has been enabled in the kernel */
1738 printf("tfhar = %.16x tfiar = %.16x texasr = %.16x\n",
1739 mfspr(SPRN_TFHAR
), mfspr(SPRN_TFIAR
),
1740 mfspr(SPRN_TEXASR
));
1743 printf("mmcr0 = %.16x mmcr1 = %.16x mmcr2 = %.16x\n",
1744 mfspr(SPRN_MMCR0
), mfspr(SPRN_MMCR1
), mfspr(SPRN_MMCR2
));
1745 printf("pmc1 = %.8x pmc2 = %.8x pmc3 = %.8x pmc4 = %.8x\n",
1746 mfspr(SPRN_PMC1
), mfspr(SPRN_PMC2
),
1747 mfspr(SPRN_PMC3
), mfspr(SPRN_PMC4
));
1748 printf("mmcra = %.16x siar = %.16x pmc5 = %.8x\n",
1749 mfspr(SPRN_MMCRA
), mfspr(SPRN_SIAR
), mfspr(SPRN_PMC5
));
1750 printf("sdar = %.16x sier = %.16x pmc6 = %.8x\n",
1751 mfspr(SPRN_SDAR
), mfspr(SPRN_SIER
), mfspr(SPRN_PMC6
));
1752 printf("ebbhr = %.16x ebbrr = %.16x bescr = %.16x\n",
1753 mfspr(SPRN_EBBHR
), mfspr(SPRN_EBBRR
), mfspr(SPRN_BESCR
));
1755 if (!(msr
& MSR_HV
))
1758 printf("hfscr = %.16x dhdes = %.16x rpr = %.16x\n",
1759 mfspr(SPRN_HFSCR
), mfspr(SPRN_DHDES
), mfspr(SPRN_RPR
));
1760 printf("dawr = %.16x dawrx = %.16x ciabr = %.16x\n",
1761 mfspr(SPRN_DAWR
), mfspr(SPRN_DAWRX
), mfspr(SPRN_CIABR
));
1765 static void dump_one_spr(int spr
, bool show_unimplemented
)
1770 if (!read_spr(spr
, &val
)) {
1771 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1775 if (val
== 0xdeadbeef) {
1776 /* Looks like read was a nop, confirm */
1778 if (!read_spr(spr
, &val
)) {
1779 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1783 if (val
== 0x0badcafe) {
1784 if (show_unimplemented
)
1785 printf("SPR 0x%03x (%4d) Unimplemented\n", spr
, spr
);
1790 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr
, spr
, val
);
1793 static void super_regs(void)
1795 static unsigned long regno
;
1803 unsigned long sp
, toc
;
1804 asm("mr %0,1" : "=r" (sp
) :);
1805 asm("mr %0,2" : "=r" (toc
) :);
1807 printf("msr = "REG
" sprg0 = "REG
"\n",
1808 mfmsr(), mfspr(SPRN_SPRG0
));
1809 printf("pvr = "REG
" sprg1 = "REG
"\n",
1810 mfspr(SPRN_PVR
), mfspr(SPRN_SPRG1
));
1811 printf("dec = "REG
" sprg2 = "REG
"\n",
1812 mfspr(SPRN_DEC
), mfspr(SPRN_SPRG2
));
1813 printf("sp = "REG
" sprg3 = "REG
"\n", sp
, mfspr(SPRN_SPRG3
));
1814 printf("toc = "REG
" dar = "REG
"\n", toc
, mfspr(SPRN_DAR
));
1825 read_spr(regno
, &val
);
1827 write_spr(regno
, val
);
1828 dump_one_spr(regno
, true);
1833 dump_one_spr(regno
, true);
1837 for (spr
= 1; spr
< 1024; ++spr
)
1838 dump_one_spr(spr
, false);
1846 * Stuff for reading and writing memory safely
1849 mread(unsigned long adrs
, void *buf
, int size
)
1855 if (setjmp(bus_error_jmp
) == 0) {
1856 catch_memory_errors
= 1;
1862 *(u16
*)q
= *(u16
*)p
;
1865 *(u32
*)q
= *(u32
*)p
;
1868 *(u64
*)q
= *(u64
*)p
;
1871 for( ; n
< size
; ++n
) {
1877 /* wait a little while to see if we get a machine check */
1881 catch_memory_errors
= 0;
1886 mwrite(unsigned long adrs
, void *buf
, int size
)
1892 if (setjmp(bus_error_jmp
) == 0) {
1893 catch_memory_errors
= 1;
1899 *(u16
*)p
= *(u16
*)q
;
1902 *(u32
*)p
= *(u32
*)q
;
1905 *(u64
*)p
= *(u64
*)q
;
1908 for ( ; n
< size
; ++n
) {
1914 /* wait a little while to see if we get a machine check */
1918 printf("*** Error writing address "REG
"\n", adrs
+ n
);
1920 catch_memory_errors
= 0;
1924 static int fault_type
;
1925 static int fault_except
;
1926 static char *fault_chars
[] = { "--", "**", "##" };
1928 static int handle_fault(struct pt_regs
*regs
)
1930 fault_except
= TRAP(regs
);
1931 switch (TRAP(regs
)) {
1943 longjmp(bus_error_jmp
, 1);
1948 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
1951 byterev(unsigned char *val
, int size
)
1957 SWAP(val
[0], val
[1], t
);
1960 SWAP(val
[0], val
[3], t
);
1961 SWAP(val
[1], val
[2], t
);
1963 case 8: /* is there really any use for this? */
1964 SWAP(val
[0], val
[7], t
);
1965 SWAP(val
[1], val
[6], t
);
1966 SWAP(val
[2], val
[5], t
);
1967 SWAP(val
[3], val
[4], t
);
1975 static char *memex_help_string
=
1976 "Memory examine command usage:\n"
1977 "m [addr] [flags] examine/change memory\n"
1978 " addr is optional. will start where left off.\n"
1979 " flags may include chars from this set:\n"
1980 " b modify by bytes (default)\n"
1981 " w modify by words (2 byte)\n"
1982 " l modify by longs (4 byte)\n"
1983 " d modify by doubleword (8 byte)\n"
1984 " r toggle reverse byte order mode\n"
1985 " n do not read memory (for i/o spaces)\n"
1986 " . ok to read (default)\n"
1987 "NOTE: flags are saved as defaults\n"
1990 static char *memex_subcmd_help_string
=
1991 "Memory examine subcommands:\n"
1992 " hexval write this val to current location\n"
1993 " 'string' write chars from string to this location\n"
1994 " ' increment address\n"
1995 " ^ decrement address\n"
1996 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
1997 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
1998 " ` clear no-read flag\n"
1999 " ; stay at this addr\n"
2000 " v change to byte mode\n"
2001 " w change to word (2 byte) mode\n"
2002 " l change to long (4 byte) mode\n"
2003 " u change to doubleword (8 byte) mode\n"
2004 " m addr change current addr\n"
2005 " n toggle no-read flag\n"
2006 " r toggle byte reverse flag\n"
2007 " < count back up count bytes\n"
2008 " > count skip forward count bytes\n"
2009 " x exit this mode\n"
2015 int cmd
, inc
, i
, nslash
;
2017 unsigned char val
[16];
2019 scanhex((void *)&adrs
);
2022 printf(memex_help_string
);
2028 while ((cmd
= skipbl()) != '\n') {
2030 case 'b': size
= 1; break;
2031 case 'w': size
= 2; break;
2032 case 'l': size
= 4; break;
2033 case 'd': size
= 8; break;
2034 case 'r': brev
= !brev
; break;
2035 case 'n': mnoread
= 1; break;
2036 case '.': mnoread
= 0; break;
2045 n
= mread(adrs
, val
, size
);
2046 printf(REG
"%c", adrs
, brev
? 'r': ' ');
2051 for (i
= 0; i
< n
; ++i
)
2052 printf("%.2x", val
[i
]);
2053 for (; i
< size
; ++i
)
2054 printf("%s", fault_chars
[fault_type
]);
2061 for (i
= 0; i
< size
; ++i
)
2062 val
[i
] = n
>> (i
* 8);
2065 mwrite(adrs
, val
, size
);
2078 else if( n
== '\'' )
2080 for (i
= 0; i
< size
; ++i
)
2081 val
[i
] = n
>> (i
* 8);
2084 mwrite(adrs
, val
, size
);
2120 adrs
-= 1 << nslash
;
2124 adrs
+= 1 << nslash
;
2128 adrs
+= 1 << -nslash
;
2132 adrs
-= 1 << -nslash
;
2135 scanhex((void *)&adrs
);
2154 printf(memex_subcmd_help_string
);
2169 case 'n': c
= '\n'; break;
2170 case 'r': c
= '\r'; break;
2171 case 'b': c
= '\b'; break;
2172 case 't': c
= '\t'; break;
2177 static void xmon_rawdump (unsigned long adrs
, long ndump
)
2180 unsigned char temp
[16];
2182 for (n
= ndump
; n
> 0;) {
2184 nr
= mread(adrs
, temp
, r
);
2186 for (m
= 0; m
< r
; ++m
) {
2188 printf("%.2x", temp
[m
]);
2190 printf("%s", fault_chars
[fault_type
]);
2200 static void dump_one_paca(int cpu
)
2202 struct paca_struct
*p
;
2203 #ifdef CONFIG_PPC_STD_MMU_64
2207 if (setjmp(bus_error_jmp
) != 0) {
2208 printf("*** Error dumping paca for cpu 0x%x!\n", cpu
);
2212 catch_memory_errors
= 1;
2217 printf("paca for cpu 0x%x @ %p:\n", cpu
, p
);
2219 printf(" %-*s = %s\n", 20, "possible", cpu_possible(cpu
) ? "yes" : "no");
2220 printf(" %-*s = %s\n", 20, "present", cpu_present(cpu
) ? "yes" : "no");
2221 printf(" %-*s = %s\n", 20, "online", cpu_online(cpu
) ? "yes" : "no");
2223 #define DUMP(paca, name, format) \
2224 printf(" %-*s = %#-*"format"\t(0x%lx)\n", 20, #name, 18, paca->name, \
2225 offsetof(struct paca_struct, name));
2227 DUMP(p
, lock_token
, "x");
2228 DUMP(p
, paca_index
, "x");
2229 DUMP(p
, kernel_toc
, "lx");
2230 DUMP(p
, kernelbase
, "lx");
2231 DUMP(p
, kernel_msr
, "lx");
2232 DUMP(p
, emergency_sp
, "p");
2233 #ifdef CONFIG_PPC_BOOK3S_64
2234 DUMP(p
, mc_emergency_sp
, "p");
2235 DUMP(p
, in_mce
, "x");
2236 DUMP(p
, hmi_event_available
, "x");
2238 DUMP(p
, data_offset
, "lx");
2239 DUMP(p
, hw_cpu_id
, "x");
2240 DUMP(p
, cpu_start
, "x");
2241 DUMP(p
, kexec_state
, "x");
2242 #ifdef CONFIG_PPC_STD_MMU_64
2243 for (i
= 0; i
< SLB_NUM_BOLTED
; i
++) {
2246 if (!p
->slb_shadow_ptr
)
2249 esid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].esid
);
2250 vsid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].vsid
);
2253 printf(" slb_shadow[%d]: = 0x%016lx 0x%016lx\n",
2257 DUMP(p
, vmalloc_sllp
, "x");
2258 DUMP(p
, slb_cache_ptr
, "x");
2259 for (i
= 0; i
< SLB_CACHE_ENTRIES
; i
++)
2260 printf(" slb_cache[%d]: = 0x%016lx\n", i
, p
->slb_cache
[i
]);
2262 DUMP(p
, dscr_default
, "llx");
2263 #ifdef CONFIG_PPC_BOOK3E
2265 DUMP(p
, kernel_pgd
, "p");
2266 DUMP(p
, tcd_ptr
, "p");
2267 DUMP(p
, mc_kstack
, "p");
2268 DUMP(p
, crit_kstack
, "p");
2269 DUMP(p
, dbg_kstack
, "p");
2271 DUMP(p
, __current
, "p");
2272 DUMP(p
, kstack
, "lx");
2273 DUMP(p
, stab_rr
, "lx");
2274 DUMP(p
, saved_r1
, "lx");
2275 DUMP(p
, trap_save
, "x");
2276 DUMP(p
, soft_enabled
, "x");
2277 DUMP(p
, irq_happened
, "x");
2278 DUMP(p
, io_sync
, "x");
2279 DUMP(p
, irq_work_pending
, "x");
2280 DUMP(p
, nap_state_lost
, "x");
2281 DUMP(p
, sprg_vdso
, "llx");
2283 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2284 DUMP(p
, tm_scratch
, "llx");
2287 #ifdef CONFIG_PPC_POWERNV
2288 DUMP(p
, core_idle_state_ptr
, "p");
2289 DUMP(p
, thread_idle_state
, "x");
2290 DUMP(p
, thread_mask
, "x");
2291 DUMP(p
, subcore_sibling_mask
, "x");
2294 DUMP(p
, accounting
.utime
, "llx");
2295 DUMP(p
, accounting
.stime
, "llx");
2296 DUMP(p
, accounting
.utime_scaled
, "llx");
2297 DUMP(p
, accounting
.starttime
, "llx");
2298 DUMP(p
, accounting
.starttime_user
, "llx");
2299 DUMP(p
, accounting
.startspurr
, "llx");
2300 DUMP(p
, accounting
.utime_sspurr
, "llx");
2301 DUMP(p
, accounting
.steal_time
, "llx");
2304 catch_memory_errors
= 0;
2308 static void dump_all_pacas(void)
2312 if (num_possible_cpus() == 0) {
2313 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2317 for_each_possible_cpu(cpu
)
2321 static void dump_pacas(void)
2332 termch
= c
; /* Put c back, it wasn't 'a' */
2337 dump_one_paca(xmon_owner
);
2341 static void dump_by_size(unsigned long addr
, long count
, int size
)
2343 unsigned char temp
[16];
2347 count
= ALIGN(count
, 16);
2349 for (i
= 0; i
< count
; i
+= 16, addr
+= 16) {
2352 if (mread(addr
, temp
, 16) != 16) {
2353 printf("\nFaulted reading %d bytes from 0x"REG
"\n", 16, addr
);
2357 for (j
= 0; j
< 16; j
+= size
) {
2360 case 1: val
= temp
[j
]; break;
2361 case 2: val
= *(u16
*)&temp
[j
]; break;
2362 case 4: val
= *(u32
*)&temp
[j
]; break;
2363 case 8: val
= *(u64
*)&temp
[j
]; break;
2367 printf("%0*lx", size
* 2, val
);
2376 static char last
[] = { "d?\n" };
2383 xmon_start_pagination();
2385 xmon_end_pagination();
2393 scanhex((void *)&adrs
);
2400 else if (nidump
> MAX_DUMP
)
2402 adrs
+= ppc_inst_dump(adrs
, nidump
, 1);
2404 } else if (c
== 'l') {
2406 } else if (c
== 'o') {
2408 } else if (c
== 't') {
2409 ftrace_dump(DUMP_ALL
);
2411 } else if (c
== 'r') {
2415 xmon_rawdump(adrs
, ndump
);
2422 else if (ndump
> MAX_DUMP
)
2430 ndump
= ALIGN(ndump
, 16);
2431 dump_by_size(adrs
, ndump
, c
- '0');
2436 prdump(adrs
, ndump
);
2445 prdump(unsigned long adrs
, long ndump
)
2447 long n
, m
, c
, r
, nr
;
2448 unsigned char temp
[16];
2450 for (n
= ndump
; n
> 0;) {
2454 nr
= mread(adrs
, temp
, r
);
2456 for (m
= 0; m
< r
; ++m
) {
2457 if ((m
& (sizeof(long) - 1)) == 0 && m
> 0)
2460 printf("%.2x", temp
[m
]);
2462 printf("%s", fault_chars
[fault_type
]);
2464 for (; m
< 16; ++m
) {
2465 if ((m
& (sizeof(long) - 1)) == 0)
2470 for (m
= 0; m
< r
; ++m
) {
2473 putchar(' ' <= c
&& c
<= '~'? c
: '.');
2486 typedef int (*instruction_dump_func
)(unsigned long inst
, unsigned long addr
);
2489 generic_inst_dump(unsigned long adr
, long count
, int praddr
,
2490 instruction_dump_func dump_func
)
2493 unsigned long first_adr
;
2494 unsigned long inst
, last_inst
= 0;
2495 unsigned char val
[4];
2498 for (first_adr
= adr
; count
> 0; --count
, adr
+= 4) {
2499 nr
= mread(adr
, val
, 4);
2502 const char *x
= fault_chars
[fault_type
];
2503 printf(REG
" %s%s%s%s\n", adr
, x
, x
, x
, x
);
2507 inst
= GETWORD(val
);
2508 if (adr
> first_adr
&& inst
== last_inst
) {
2518 printf(REG
" %.8x", adr
, inst
);
2520 dump_func(inst
, adr
);
2523 return adr
- first_adr
;
2527 ppc_inst_dump(unsigned long adr
, long count
, int praddr
)
2529 return generic_inst_dump(adr
, count
, praddr
, print_insn_powerpc
);
2533 print_address(unsigned long addr
)
2535 xmon_print_symbol(addr
, "\t# ", "");
2541 struct kmsg_dumper dumper
= { .active
= 1 };
2542 unsigned char buf
[128];
2545 if (setjmp(bus_error_jmp
) != 0) {
2546 printf("Error dumping printk buffer!\n");
2550 catch_memory_errors
= 1;
2553 kmsg_dump_rewind_nolock(&dumper
);
2554 xmon_start_pagination();
2555 while (kmsg_dump_get_line_nolock(&dumper
, false, buf
, sizeof(buf
), &len
)) {
2559 xmon_end_pagination();
2562 /* wait a little while to see if we get a machine check */
2564 catch_memory_errors
= 0;
2567 #ifdef CONFIG_PPC_POWERNV
2568 static void dump_opal_msglog(void)
2570 unsigned char buf
[128];
2574 if (!firmware_has_feature(FW_FEATURE_OPAL
)) {
2575 printf("Machine is not running OPAL firmware.\n");
2579 if (setjmp(bus_error_jmp
) != 0) {
2580 printf("Error dumping OPAL msglog!\n");
2584 catch_memory_errors
= 1;
2587 xmon_start_pagination();
2588 while ((res
= opal_msglog_copy(buf
, pos
, sizeof(buf
) - 1))) {
2590 printf("Error dumping OPAL msglog! Error: %zd\n", res
);
2597 xmon_end_pagination();
2600 /* wait a little while to see if we get a machine check */
2602 catch_memory_errors
= 0;
2607 * Memory operations - move, set, print differences
2609 static unsigned long mdest
; /* destination address */
2610 static unsigned long msrc
; /* source address */
2611 static unsigned long mval
; /* byte value to set memory to */
2612 static unsigned long mcount
; /* # bytes to affect */
2613 static unsigned long mdiffs
; /* max # differences to print */
2618 scanhex((void *)&mdest
);
2619 if( termch
!= '\n' )
2621 scanhex((void *)(cmd
== 's'? &mval
: &msrc
));
2622 if( termch
!= '\n' )
2624 scanhex((void *)&mcount
);
2627 memmove((void *)mdest
, (void *)msrc
, mcount
);
2630 memset((void *)mdest
, mval
, mcount
);
2633 if( termch
!= '\n' )
2635 scanhex((void *)&mdiffs
);
2636 memdiffs((unsigned char *)mdest
, (unsigned char *)msrc
, mcount
, mdiffs
);
2642 memdiffs(unsigned char *p1
, unsigned char *p2
, unsigned nb
, unsigned maxpr
)
2647 for( n
= nb
; n
> 0; --n
)
2648 if( *p1
++ != *p2
++ )
2649 if( ++prt
<= maxpr
)
2650 printf("%.16x %.2x # %.16x %.2x\n", p1
- 1,
2651 p1
[-1], p2
- 1, p2
[-1]);
2653 printf("Total of %d differences\n", prt
);
2656 static unsigned mend
;
2657 static unsigned mask
;
2663 unsigned char val
[4];
2666 scanhex((void *)&mdest
);
2667 if (termch
!= '\n') {
2669 scanhex((void *)&mend
);
2670 if (termch
!= '\n') {
2672 scanhex((void *)&mval
);
2674 if (termch
!= '\n') termch
= 0;
2675 scanhex((void *)&mask
);
2679 for (a
= mdest
; a
< mend
; a
+= 4) {
2680 if (mread(a
, val
, 4) == 4
2681 && ((GETWORD(val
) ^ mval
) & mask
) == 0) {
2682 printf("%.16x: %.16x\n", a
, GETWORD(val
));
2689 static unsigned long mskip
= 0x1000;
2690 static unsigned long mlim
= 0xffffffff;
2700 if (termch
!= '\n') termch
= 0;
2702 if (termch
!= '\n') termch
= 0;
2705 for (a
= mdest
; a
< mlim
; a
+= mskip
) {
2706 ok
= mread(a
, &v
, 1);
2708 printf("%.8x .. ", a
);
2709 } else if (!ok
&& ook
)
2710 printf("%.8x\n", a
- mskip
);
2716 printf("%.8x\n", a
- mskip
);
2719 static void show_task(struct task_struct
*tsk
)
2724 * Cloned from kdb_task_state_char(), which is not entirely
2725 * appropriate for calling from xmon. This could be moved
2726 * to a common, generic, routine used by both.
2728 state
= (tsk
->state
== 0) ? 'R' :
2729 (tsk
->state
< 0) ? 'U' :
2730 (tsk
->state
& TASK_UNINTERRUPTIBLE
) ? 'D' :
2731 (tsk
->state
& TASK_STOPPED
) ? 'T' :
2732 (tsk
->state
& TASK_TRACED
) ? 'C' :
2733 (tsk
->exit_state
& EXIT_ZOMBIE
) ? 'Z' :
2734 (tsk
->exit_state
& EXIT_DEAD
) ? 'E' :
2735 (tsk
->state
& TASK_INTERRUPTIBLE
) ? 'S' : '?';
2737 printf("%p %016lx %6d %6d %c %2d %s\n", tsk
,
2739 tsk
->pid
, tsk
->parent
->pid
,
2740 state
, task_thread_info(tsk
)->cpu
,
2744 static void show_tasks(void)
2747 struct task_struct
*tsk
= NULL
;
2749 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
2752 tsk
= (struct task_struct
*)tskv
;
2754 if (setjmp(bus_error_jmp
) != 0) {
2755 catch_memory_errors
= 0;
2756 printf("*** Error dumping task %p\n", tsk
);
2760 catch_memory_errors
= 1;
2766 for_each_process(tsk
)
2771 catch_memory_errors
= 0;
2774 static void proccall(void)
2776 unsigned long args
[8];
2779 typedef unsigned long (*callfunc_t
)(unsigned long, unsigned long,
2780 unsigned long, unsigned long, unsigned long,
2781 unsigned long, unsigned long, unsigned long);
2784 if (!scanhex(&adrs
))
2788 for (i
= 0; i
< 8; ++i
)
2790 for (i
= 0; i
< 8; ++i
) {
2791 if (!scanhex(&args
[i
]) || termch
== '\n')
2795 func
= (callfunc_t
) adrs
;
2797 if (setjmp(bus_error_jmp
) == 0) {
2798 catch_memory_errors
= 1;
2800 ret
= func(args
[0], args
[1], args
[2], args
[3],
2801 args
[4], args
[5], args
[6], args
[7]);
2803 printf("return value is 0x%lx\n", ret
);
2805 printf("*** %x exception occurred\n", fault_except
);
2807 catch_memory_errors
= 0;
2810 /* Input scanning routines */
2821 while( c
== ' ' || c
== '\t' )
2827 static char *regnames
[N_PTREGS
] = {
2828 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2829 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2830 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2831 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2832 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2838 "trap", "dar", "dsisr", "res"
2842 scanhex(unsigned long *vp
)
2849 /* parse register name */
2853 for (i
= 0; i
< sizeof(regname
) - 1; ++i
) {
2862 for (i
= 0; i
< N_PTREGS
; ++i
) {
2863 if (strcmp(regnames
[i
], regname
) == 0) {
2864 if (xmon_regs
== NULL
) {
2865 printf("regs not available\n");
2868 *vp
= ((unsigned long *)xmon_regs
)[i
];
2872 printf("invalid register name '%%%s'\n", regname
);
2876 /* skip leading "0x" if any */
2890 } else if (c
== '$') {
2892 for (i
=0; i
<63; i
++) {
2894 if (isspace(c
) || c
== '\0') {
2902 if (setjmp(bus_error_jmp
) == 0) {
2903 catch_memory_errors
= 1;
2905 *vp
= kallsyms_lookup_name(tmpstr
);
2908 catch_memory_errors
= 0;
2910 printf("unknown symbol '%s'\n", tmpstr
);
2943 static int hexdigit(int c
)
2945 if( '0' <= c
&& c
<= '9' )
2947 if( 'A' <= c
&& c
<= 'F' )
2948 return c
- ('A' - 10);
2949 if( 'a' <= c
&& c
<= 'f' )
2950 return c
- ('a' - 10);
2955 getstring(char *s
, int size
)
2966 } while( c
!= ' ' && c
!= '\t' && c
!= '\n' );
2971 static char line
[256];
2972 static char *lineptr
;
2983 if (lineptr
== NULL
|| *lineptr
== 0) {
2984 if (xmon_gets(line
, sizeof(line
)) == NULL
) {
2994 take_input(char *str
)
3003 int type
= inchar();
3005 static char tmp
[64];
3010 xmon_print_symbol(addr
, ": ", "\n");
3015 if (setjmp(bus_error_jmp
) == 0) {
3016 catch_memory_errors
= 1;
3018 addr
= kallsyms_lookup_name(tmp
);
3020 printf("%s: %lx\n", tmp
, addr
);
3022 printf("Symbol '%s' not found.\n", tmp
);
3025 catch_memory_errors
= 0;
3032 /* Print an address in numeric and symbolic form (if possible) */
3033 static void xmon_print_symbol(unsigned long address
, const char *mid
,
3037 const char *name
= NULL
;
3038 unsigned long offset
, size
;
3040 printf(REG
, address
);
3041 if (setjmp(bus_error_jmp
) == 0) {
3042 catch_memory_errors
= 1;
3044 name
= kallsyms_lookup(address
, &size
, &offset
, &modname
,
3047 /* wait a little while to see if we get a machine check */
3051 catch_memory_errors
= 0;
3054 printf("%s%s+%#lx/%#lx", mid
, name
, offset
, size
);
3056 printf(" [%s]", modname
);
3058 printf("%s", after
);
3061 #ifdef CONFIG_PPC_STD_MMU_64
3062 void dump_segments(void)
3065 unsigned long esid
,vsid
;
3068 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3070 for (i
= 0; i
< mmu_slb_size
; i
++) {
3071 asm volatile("slbmfee %0,%1" : "=r" (esid
) : "r" (i
));
3072 asm volatile("slbmfev %0,%1" : "=r" (vsid
) : "r" (i
));
3074 printf("%02d %016lx %016lx", i
, esid
, vsid
);
3075 if (esid
& SLB_ESID_V
) {
3076 llp
= vsid
& SLB_VSID_LLP
;
3077 if (vsid
& SLB_VSID_B_1T
) {
3078 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3080 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT_1T
,
3083 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3085 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT
,
3095 #ifdef CONFIG_PPC_STD_MMU_32
3096 void dump_segments(void)
3101 for (i
= 0; i
< 16; ++i
)
3102 printf(" %x", mfsrin(i
));
3108 static void dump_tlb_44x(void)
3112 for (i
= 0; i
< PPC44x_TLB_SIZE
; i
++) {
3113 unsigned long w0
,w1
,w2
;
3114 asm volatile("tlbre %0,%1,0" : "=r" (w0
) : "r" (i
));
3115 asm volatile("tlbre %0,%1,1" : "=r" (w1
) : "r" (i
));
3116 asm volatile("tlbre %0,%1,2" : "=r" (w2
) : "r" (i
));
3117 printf("[%02x] %08x %08x %08x ", i
, w0
, w1
, w2
);
3118 if (w0
& PPC44x_TLB_VALID
) {
3119 printf("V %08x -> %01x%08x %c%c%c%c%c",
3120 w0
& PPC44x_TLB_EPN_MASK
,
3121 w1
& PPC44x_TLB_ERPN_MASK
,
3122 w1
& PPC44x_TLB_RPN_MASK
,
3123 (w2
& PPC44x_TLB_W
) ? 'W' : 'w',
3124 (w2
& PPC44x_TLB_I
) ? 'I' : 'i',
3125 (w2
& PPC44x_TLB_M
) ? 'M' : 'm',
3126 (w2
& PPC44x_TLB_G
) ? 'G' : 'g',
3127 (w2
& PPC44x_TLB_E
) ? 'E' : 'e');
3132 #endif /* CONFIG_44x */
3134 #ifdef CONFIG_PPC_BOOK3E
3135 static void dump_tlb_book3e(void)
3137 u32 mmucfg
, pidmask
, lpidmask
;
3139 int i
, tlb
, ntlbs
, pidsz
, lpidsz
, rasz
, lrat
= 0;
3141 static const char *pgsz_names
[] = {
3176 /* Gather some infos about the MMU */
3177 mmucfg
= mfspr(SPRN_MMUCFG
);
3178 mmu_version
= (mmucfg
& 3) + 1;
3179 ntlbs
= ((mmucfg
>> 2) & 3) + 1;
3180 pidsz
= ((mmucfg
>> 6) & 0x1f) + 1;
3181 lpidsz
= (mmucfg
>> 24) & 0xf;
3182 rasz
= (mmucfg
>> 16) & 0x7f;
3183 if ((mmu_version
> 1) && (mmucfg
& 0x10000))
3185 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3186 mmu_version
, ntlbs
, pidsz
, lpidsz
, rasz
);
3187 pidmask
= (1ul << pidsz
) - 1;
3188 lpidmask
= (1ul << lpidsz
) - 1;
3189 ramask
= (1ull << rasz
) - 1;
3191 for (tlb
= 0; tlb
< ntlbs
; tlb
++) {
3193 int nent
, assoc
, new_cc
= 1;
3194 printf("TLB %d:\n------\n", tlb
);
3197 tlbcfg
= mfspr(SPRN_TLB0CFG
);
3200 tlbcfg
= mfspr(SPRN_TLB1CFG
);
3203 tlbcfg
= mfspr(SPRN_TLB2CFG
);
3206 tlbcfg
= mfspr(SPRN_TLB3CFG
);
3209 printf("Unsupported TLB number !\n");
3212 nent
= tlbcfg
& 0xfff;
3213 assoc
= (tlbcfg
>> 24) & 0xff;
3214 for (i
= 0; i
< nent
; i
++) {
3215 u32 mas0
= MAS0_TLBSEL(tlb
);
3216 u32 mas1
= MAS1_TSIZE(BOOK3E_PAGESZ_4K
);
3219 int esel
= i
, cc
= i
;
3227 mas0
|= MAS0_ESEL(esel
);
3228 mtspr(SPRN_MAS0
, mas0
);
3229 mtspr(SPRN_MAS1
, mas1
);
3230 mtspr(SPRN_MAS2
, mas2
);
3231 asm volatile("tlbre 0,0,0" : : : "memory");
3232 mas1
= mfspr(SPRN_MAS1
);
3233 mas2
= mfspr(SPRN_MAS2
);
3234 mas7_mas3
= mfspr(SPRN_MAS7_MAS3
);
3235 if (assoc
&& (i
% assoc
) == 0)
3237 if (!(mas1
& MAS1_VALID
))
3240 printf("%04x- ", i
);
3242 printf("%04x-%c", cc
, 'A' + esel
);
3244 printf(" |%c", 'A' + esel
);
3246 printf(" %016llx %04x %s %c%c AS%c",
3248 (mas1
>> 16) & 0x3fff,
3249 pgsz_names
[(mas1
>> 7) & 0x1f],
3250 mas1
& MAS1_IND
? 'I' : ' ',
3251 mas1
& MAS1_IPROT
? 'P' : ' ',
3252 mas1
& MAS1_TS
? '1' : '0');
3253 printf(" %c%c%c%c%c%c%c",
3254 mas2
& MAS2_X0
? 'a' : ' ',
3255 mas2
& MAS2_X1
? 'v' : ' ',
3256 mas2
& MAS2_W
? 'w' : ' ',
3257 mas2
& MAS2_I
? 'i' : ' ',
3258 mas2
& MAS2_M
? 'm' : ' ',
3259 mas2
& MAS2_G
? 'g' : ' ',
3260 mas2
& MAS2_E
? 'e' : ' ');
3261 printf(" %016llx", mas7_mas3
& ramask
& ~0x7ffull
);
3262 if (mas1
& MAS1_IND
)
3264 pgsz_names
[(mas7_mas3
>> 1) & 0x1f]);
3266 printf(" U%c%c%c S%c%c%c\n",
3267 mas7_mas3
& MAS3_UX
? 'x' : ' ',
3268 mas7_mas3
& MAS3_UW
? 'w' : ' ',
3269 mas7_mas3
& MAS3_UR
? 'r' : ' ',
3270 mas7_mas3
& MAS3_SX
? 'x' : ' ',
3271 mas7_mas3
& MAS3_SW
? 'w' : ' ',
3272 mas7_mas3
& MAS3_SR
? 'r' : ' ');
3276 #endif /* CONFIG_PPC_BOOK3E */
3278 static void xmon_init(int enable
)
3282 __debugger_ipi
= xmon_ipi
;
3283 __debugger_bpt
= xmon_bpt
;
3284 __debugger_sstep
= xmon_sstep
;
3285 __debugger_iabr_match
= xmon_iabr_match
;
3286 __debugger_break_match
= xmon_break_match
;
3287 __debugger_fault_handler
= xmon_fault_handler
;
3290 __debugger_ipi
= NULL
;
3291 __debugger_bpt
= NULL
;
3292 __debugger_sstep
= NULL
;
3293 __debugger_iabr_match
= NULL
;
3294 __debugger_break_match
= NULL
;
3295 __debugger_fault_handler
= NULL
;
3299 #ifdef CONFIG_MAGIC_SYSRQ
3300 static void sysrq_handle_xmon(int key
)
3302 /* ensure xmon is enabled */
3304 debugger(get_irq_regs());
3307 static struct sysrq_key_op sysrq_xmon_op
= {
3308 .handler
= sysrq_handle_xmon
,
3309 .help_msg
= "xmon(x)",
3310 .action_msg
= "Entering xmon",
3313 static int __init
setup_xmon_sysrq(void)
3315 register_sysrq_key('x', &sysrq_xmon_op
);
3318 __initcall(setup_xmon_sysrq
);
3319 #endif /* CONFIG_MAGIC_SYSRQ */
3321 static int __initdata xmon_early
, xmon_off
;
3323 static int __init
early_parse_xmon(char *p
)
3325 if (!p
|| strncmp(p
, "early", 5) == 0) {
3326 /* just "xmon" is equivalent to "xmon=early" */
3329 } else if (strncmp(p
, "on", 2) == 0)
3331 else if (strncmp(p
, "off", 3) == 0)
3333 else if (strncmp(p
, "nobt", 4) == 0)
3334 xmon_no_auto_backtrace
= 1;
3340 early_param("xmon", early_parse_xmon
);
3342 void __init
xmon_setup(void)
3344 #ifdef CONFIG_XMON_DEFAULT
3352 #ifdef CONFIG_SPU_BASE
3356 u64 saved_mfc_sr1_RW
;
3357 u32 saved_spu_runcntl_RW
;
3358 unsigned long dump_addr
;
3362 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
3364 static struct spu_info spu_info
[XMON_NUM_SPUS
];
3366 void xmon_register_spus(struct list_head
*list
)
3370 list_for_each_entry(spu
, list
, full_list
) {
3371 if (spu
->number
>= XMON_NUM_SPUS
) {
3376 spu_info
[spu
->number
].spu
= spu
;
3377 spu_info
[spu
->number
].stopped_ok
= 0;
3378 spu_info
[spu
->number
].dump_addr
= (unsigned long)
3379 spu_info
[spu
->number
].spu
->local_store
;
3383 static void stop_spus(void)
3389 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3390 if (!spu_info
[i
].spu
)
3393 if (setjmp(bus_error_jmp
) == 0) {
3394 catch_memory_errors
= 1;
3397 spu
= spu_info
[i
].spu
;
3399 spu_info
[i
].saved_spu_runcntl_RW
=
3400 in_be32(&spu
->problem
->spu_runcntl_RW
);
3402 tmp
= spu_mfc_sr1_get(spu
);
3403 spu_info
[i
].saved_mfc_sr1_RW
= tmp
;
3405 tmp
&= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK
;
3406 spu_mfc_sr1_set(spu
, tmp
);
3411 spu_info
[i
].stopped_ok
= 1;
3413 printf("Stopped spu %.2d (was %s)\n", i
,
3414 spu_info
[i
].saved_spu_runcntl_RW
?
3415 "running" : "stopped");
3417 catch_memory_errors
= 0;
3418 printf("*** Error stopping spu %.2d\n", i
);
3420 catch_memory_errors
= 0;
3424 static void restart_spus(void)
3429 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3430 if (!spu_info
[i
].spu
)
3433 if (!spu_info
[i
].stopped_ok
) {
3434 printf("*** Error, spu %d was not successfully stopped"
3435 ", not restarting\n", i
);
3439 if (setjmp(bus_error_jmp
) == 0) {
3440 catch_memory_errors
= 1;
3443 spu
= spu_info
[i
].spu
;
3444 spu_mfc_sr1_set(spu
, spu_info
[i
].saved_mfc_sr1_RW
);
3445 out_be32(&spu
->problem
->spu_runcntl_RW
,
3446 spu_info
[i
].saved_spu_runcntl_RW
);
3451 printf("Restarted spu %.2d\n", i
);
3453 catch_memory_errors
= 0;
3454 printf("*** Error restarting spu %.2d\n", i
);
3456 catch_memory_errors
= 0;
3460 #define DUMP_WIDTH 23
3461 #define DUMP_VALUE(format, field, value) \
3463 if (setjmp(bus_error_jmp) == 0) { \
3464 catch_memory_errors = 1; \
3466 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3471 catch_memory_errors = 0; \
3472 printf(" %-*s = *** Error reading field.\n", \
3473 DUMP_WIDTH, #field); \
3475 catch_memory_errors = 0; \
3478 #define DUMP_FIELD(obj, format, field) \
3479 DUMP_VALUE(format, field, obj->field)
3481 static void dump_spu_fields(struct spu
*spu
)
3483 printf("Dumping spu fields at address %p:\n", spu
);
3485 DUMP_FIELD(spu
, "0x%x", number
);
3486 DUMP_FIELD(spu
, "%s", name
);
3487 DUMP_FIELD(spu
, "0x%lx", local_store_phys
);
3488 DUMP_FIELD(spu
, "0x%p", local_store
);
3489 DUMP_FIELD(spu
, "0x%lx", ls_size
);
3490 DUMP_FIELD(spu
, "0x%x", node
);
3491 DUMP_FIELD(spu
, "0x%lx", flags
);
3492 DUMP_FIELD(spu
, "%d", class_0_pending
);
3493 DUMP_FIELD(spu
, "0x%lx", class_0_dar
);
3494 DUMP_FIELD(spu
, "0x%lx", class_1_dar
);
3495 DUMP_FIELD(spu
, "0x%lx", class_1_dsisr
);
3496 DUMP_FIELD(spu
, "0x%lx", irqs
[0]);
3497 DUMP_FIELD(spu
, "0x%lx", irqs
[1]);
3498 DUMP_FIELD(spu
, "0x%lx", irqs
[2]);
3499 DUMP_FIELD(spu
, "0x%x", slb_replace
);
3500 DUMP_FIELD(spu
, "%d", pid
);
3501 DUMP_FIELD(spu
, "0x%p", mm
);
3502 DUMP_FIELD(spu
, "0x%p", ctx
);
3503 DUMP_FIELD(spu
, "0x%p", rq
);
3504 DUMP_FIELD(spu
, "0x%p", timestamp
);
3505 DUMP_FIELD(spu
, "0x%lx", problem_phys
);
3506 DUMP_FIELD(spu
, "0x%p", problem
);
3507 DUMP_VALUE("0x%x", problem
->spu_runcntl_RW
,
3508 in_be32(&spu
->problem
->spu_runcntl_RW
));
3509 DUMP_VALUE("0x%x", problem
->spu_status_R
,
3510 in_be32(&spu
->problem
->spu_status_R
));
3511 DUMP_VALUE("0x%x", problem
->spu_npc_RW
,
3512 in_be32(&spu
->problem
->spu_npc_RW
));
3513 DUMP_FIELD(spu
, "0x%p", priv2
);
3514 DUMP_FIELD(spu
, "0x%p", pdata
);
3518 spu_inst_dump(unsigned long adr
, long count
, int praddr
)
3520 return generic_inst_dump(adr
, count
, praddr
, print_insn_spu
);
3523 static void dump_spu_ls(unsigned long num
, int subcmd
)
3525 unsigned long offset
, addr
, ls_addr
;
3527 if (setjmp(bus_error_jmp
) == 0) {
3528 catch_memory_errors
= 1;
3530 ls_addr
= (unsigned long)spu_info
[num
].spu
->local_store
;
3534 catch_memory_errors
= 0;
3535 printf("*** Error: accessing spu info for spu %d\n", num
);
3538 catch_memory_errors
= 0;
3540 if (scanhex(&offset
))
3541 addr
= ls_addr
+ offset
;
3543 addr
= spu_info
[num
].dump_addr
;
3545 if (addr
>= ls_addr
+ LS_SIZE
) {
3546 printf("*** Error: address outside of local store\n");
3552 addr
+= spu_inst_dump(addr
, 16, 1);
3562 spu_info
[num
].dump_addr
= addr
;
3565 static int do_spu_cmd(void)
3567 static unsigned long num
= 0;
3568 int cmd
, subcmd
= 0;
3580 if (isxdigit(subcmd
) || subcmd
== '\n')
3584 if (num
>= XMON_NUM_SPUS
|| !spu_info
[num
].spu
) {
3585 printf("*** Error: invalid spu number\n");
3591 dump_spu_fields(spu_info
[num
].spu
);
3594 dump_spu_ls(num
, subcmd
);
3605 #else /* ! CONFIG_SPU_BASE */
3606 static int do_spu_cmd(void)