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.
13 #include <linux/errno.h>
14 #include <linux/sched.h>
15 #include <linux/smp.h>
17 #include <linux/reboot.h>
18 #include <linux/delay.h>
19 #include <linux/kallsyms.h>
20 #include <linux/kmsg_dump.h>
21 #include <linux/cpumask.h>
22 #include <linux/export.h>
23 #include <linux/sysrq.h>
24 #include <linux/interrupt.h>
25 #include <linux/irq.h>
26 #include <linux/bug.h>
27 #include <linux/nmi.h>
28 #include <linux/ctype.h>
30 #include <asm/ptrace.h>
31 #include <asm/string.h>
33 #include <asm/machdep.h>
35 #include <asm/processor.h>
36 #include <asm/pgtable.h>
38 #include <asm/mmu_context.h>
39 #include <asm/cputable.h>
41 #include <asm/sstep.h>
42 #include <asm/irq_regs.h>
44 #include <asm/spu_priv1.h>
45 #include <asm/setjmp.h>
47 #include <asm/debug.h>
48 #include <asm/hw_breakpoint.h>
51 #include <asm/firmware.h>
54 #include <asm/hvcall.h>
58 #if defined(CONFIG_PPC_SPLPAR)
59 #include <asm/plpar_wrappers.h>
61 static inline long plapr_set_ciabr(unsigned long ciabr
) {return 0; };
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 static unsigned long in_xmon __read_mostly
= 0;
78 static unsigned long adrs
;
80 #define MAX_DUMP (128 * 1024)
81 static unsigned long ndump
= 64;
82 static unsigned long nidump
= 16;
83 static unsigned long ncsum
= 4096;
85 static char tmpstr
[128];
87 static long bus_error_jmp
[JMP_BUF_LEN
];
88 static int catch_memory_errors
;
89 static int catch_spr_faults
;
90 static long *xmon_fault_jmp
[NR_CPUS
];
92 /* Breakpoint stuff */
94 unsigned long address
;
95 unsigned int instr
[2];
101 /* Bits in bpt.enabled */
107 static struct bpt bpts
[NBPTS
];
108 static struct bpt dabr
;
109 static struct bpt
*iabr
;
110 static unsigned bpinstr
= 0x7fe00008; /* trap */
112 #define BP_NUM(bp) ((bp) - bpts + 1)
115 static int cmds(struct pt_regs
*);
116 static int mread(unsigned long, void *, int);
117 static int mwrite(unsigned long, void *, int);
118 static int handle_fault(struct pt_regs
*);
119 static void byterev(unsigned char *, int);
120 static void memex(void);
121 static int bsesc(void);
122 static void dump(void);
123 static void prdump(unsigned long, long);
124 static int ppc_inst_dump(unsigned long, long, int);
125 static void dump_log_buf(void);
127 #ifdef CONFIG_PPC_POWERNV
128 static void dump_opal_msglog(void);
130 static inline void dump_opal_msglog(void)
132 printf("Machine is not running OPAL firmware.\n");
136 static void backtrace(struct pt_regs
*);
137 static void excprint(struct pt_regs
*);
138 static void prregs(struct pt_regs
*);
139 static void memops(int);
140 static void memlocate(void);
141 static void memzcan(void);
142 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
144 int scanhex(unsigned long *valp
);
145 static void scannl(void);
146 static int hexdigit(int);
147 void getstring(char *, int);
148 static void flush_input(void);
149 static int inchar(void);
150 static void take_input(char *);
151 static int read_spr(int, unsigned long *);
152 static void write_spr(int, unsigned long);
153 static void super_regs(void);
154 static void remove_bpts(void);
155 static void insert_bpts(void);
156 static void remove_cpu_bpts(void);
157 static void insert_cpu_bpts(void);
158 static struct bpt
*at_breakpoint(unsigned long pc
);
159 static struct bpt
*in_breakpoint_table(unsigned long pc
, unsigned long *offp
);
160 static int do_step(struct pt_regs
*);
161 static void bpt_cmds(void);
162 static void cacheflush(void);
163 static int cpu_cmd(void);
164 static void csum(void);
165 static void bootcmds(void);
166 static void proccall(void);
167 static void show_tasks(void);
168 void dump_segments(void);
169 static void symbol_lookup(void);
170 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
172 static void xmon_print_symbol(unsigned long address
, const char *mid
,
174 static const char *getvecname(unsigned long vec
);
176 static int do_spu_cmd(void);
179 static void dump_tlb_44x(void);
181 #ifdef CONFIG_PPC_BOOK3E
182 static void dump_tlb_book3e(void);
185 static int xmon_no_auto_backtrace
;
193 #ifdef __LITTLE_ENDIAN__
194 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
196 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
199 static char *help_string
= "\
201 b show breakpoints\n\
202 bd set data breakpoint\n\
203 bi set instruction breakpoint\n\
204 bc clear breakpoint\n"
207 c print cpus stopped in xmon\n\
208 c# try to switch to cpu number h (in hex)\n"
213 di dump instructions\n\
214 df dump float values\n\
215 dd dump double values\n\
216 dl dump the kernel log buffer\n"
217 #ifdef CONFIG_PPC_POWERNV
219 do dump the OPAL message log\n"
223 dp[#] dump paca for current cpu, or cpu #\n\
224 dpa dump paca for all possible cpus\n"
227 dr dump stream of raw bytes\n\
228 e print exception information\n\
230 la lookup symbol+offset of specified address\n\
231 ls lookup address of specified symbol\n\
232 m examine/change memory\n\
233 mm move a block of memory\n\
234 ms set a block of memory\n\
235 md compare two blocks of memory\n\
236 ml locate a block of memory\n\
237 mz zero a block of memory\n\
238 mi show information about memory allocation\n\
239 p call a procedure\n\
240 P list processes/tasks\n\
243 #ifdef CONFIG_SPU_BASE
244 " ss stop execution on all spus\n\
245 sr restore execution on stopped spus\n\
246 sf # dump spu fields for spu # (in hex)\n\
247 sd # dump spu local store for spu # (in hex)\n\
248 sdi # disassemble spu local store for spu # (in hex)\n"
250 " S print special registers\n\
253 Sw #v write v to SPR #\n\
255 x exit monitor and recover\n\
256 X exit monitor and don't recover\n"
257 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
258 " u dump segment table or SLB\n"
259 #elif defined(CONFIG_PPC_STD_MMU_32)
260 " u dump segment registers\n"
261 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
265 " # n limit output to n lines per page (for dp, dpa, dl)\n"
270 static struct pt_regs
*xmon_regs
;
272 static inline void sync(void)
274 asm volatile("sync; isync");
277 static inline void store_inst(void *p
)
279 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p
));
282 static inline void cflush(void *p
)
284 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p
));
287 static inline void cinval(void *p
)
289 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p
));
293 * write_ciabr() - write the CIABR SPR
294 * @ciabr: The value to write.
296 * This function writes a value to the CIARB register either directly
297 * through mtspr instruction if the kernel is in HV privilege mode or
298 * call a hypervisor function to achieve the same in case the kernel
299 * is in supervisor privilege mode.
301 static void write_ciabr(unsigned long ciabr
)
303 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
306 if (cpu_has_feature(CPU_FTR_HVMODE
)) {
307 mtspr(SPRN_CIABR
, ciabr
);
310 plapr_set_ciabr(ciabr
);
314 * set_ciabr() - set the CIABR
315 * @addr: The value to set.
317 * This function sets the correct privilege value into the the HW
318 * breakpoint address before writing it up in the CIABR register.
320 static void set_ciabr(unsigned long addr
)
324 if (cpu_has_feature(CPU_FTR_HVMODE
))
325 addr
|= CIABR_PRIV_HYPER
;
327 addr
|= CIABR_PRIV_SUPER
;
332 * Disable surveillance (the service processor watchdog function)
333 * while we are in xmon.
334 * XXX we should re-enable it when we leave. :)
336 #define SURVEILLANCE_TOKEN 9000
338 static inline void disable_surveillance(void)
340 #ifdef CONFIG_PPC_PSERIES
341 /* Since this can't be a module, args should end up below 4GB. */
342 static struct rtas_args args
;
346 * At this point we have got all the cpus we can into
347 * xmon, so there is hopefully no other cpu calling RTAS
348 * at the moment, even though we don't take rtas.lock.
349 * If we did try to take rtas.lock there would be a
350 * real possibility of deadlock.
352 token
= rtas_token("set-indicator");
353 if (token
== RTAS_UNKNOWN_SERVICE
)
356 rtas_call_unlocked(&args
, token
, 3, 1, NULL
, SURVEILLANCE_TOKEN
, 0, 0);
358 #endif /* CONFIG_PPC_PSERIES */
362 static int xmon_speaker
;
364 static void get_output_lock(void)
366 int me
= smp_processor_id() + 0x100;
367 int last_speaker
= 0, prev
;
370 if (xmon_speaker
== me
)
374 last_speaker
= cmpxchg(&xmon_speaker
, 0, me
);
375 if (last_speaker
== 0)
379 * Wait a full second for the lock, we might be on a slow
380 * console, but check every 100us.
383 while (xmon_speaker
== last_speaker
) {
389 /* hostile takeover */
390 prev
= cmpxchg(&xmon_speaker
, last_speaker
, me
);
391 if (prev
== last_speaker
)
398 static void release_output_lock(void)
403 int cpus_are_in_xmon(void)
405 return !cpumask_empty(&cpus_in_xmon
);
409 static inline int unrecoverable_excp(struct pt_regs
*regs
)
411 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
412 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
415 return ((regs
->msr
& MSR_RI
) == 0);
419 static int xmon_core(struct pt_regs
*regs
, int fromipi
)
423 long recurse_jmp
[JMP_BUF_LEN
];
424 unsigned long offset
;
429 unsigned long timeout
;
432 local_irq_save(flags
);
435 bp
= in_breakpoint_table(regs
->nip
, &offset
);
437 regs
->nip
= bp
->address
+ offset
;
438 atomic_dec(&bp
->ref_count
);
444 cpu
= smp_processor_id();
445 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
447 * We catch SPR read/write faults here because the 0x700, 0xf60
448 * etc. handlers don't call debugger_fault_handler().
450 if (catch_spr_faults
)
451 longjmp(bus_error_jmp
, 1);
454 printf("cpu 0x%x: Exception %lx %s in xmon, "
455 "returning to main loop\n",
456 cpu
, regs
->trap
, getvecname(TRAP(regs
)));
457 release_output_lock();
458 longjmp(xmon_fault_jmp
[cpu
], 1);
461 if (setjmp(recurse_jmp
) != 0) {
462 if (!in_xmon
|| !xmon_gate
) {
464 printf("xmon: WARNING: bad recursive fault "
465 "on cpu 0x%x\n", cpu
);
466 release_output_lock();
469 secondary
= !(xmon_taken
&& cpu
== xmon_owner
);
473 xmon_fault_jmp
[cpu
] = recurse_jmp
;
476 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
))
477 bp
= at_breakpoint(regs
->nip
);
478 if (bp
|| unrecoverable_excp(regs
))
485 printf("cpu 0x%x stopped at breakpoint 0x%lx (",
487 xmon_print_symbol(regs
->nip
, " ", ")\n");
489 if (unrecoverable_excp(regs
))
490 printf("WARNING: exception is not recoverable, "
492 release_output_lock();
495 cpumask_set_cpu(cpu
, &cpus_in_xmon
);
499 while (secondary
&& !xmon_gate
) {
503 secondary
= test_and_set_bit(0, &in_xmon
);
508 if (!secondary
&& !xmon_gate
) {
509 /* we are the first cpu to come in */
510 /* interrupt other cpu(s) */
511 int ncpus
= num_online_cpus();
516 smp_send_debugger_break();
517 /* wait for other cpus to come in */
518 for (timeout
= 100000000; timeout
!= 0; --timeout
) {
519 if (cpumask_weight(&cpus_in_xmon
) >= ncpus
)
525 disable_surveillance();
526 /* for breakpoint or single step, print the current instr. */
527 if (bp
|| TRAP(regs
) == 0xd00)
528 ppc_inst_dump(regs
->nip
, 1, 0);
529 printf("enter ? for help\n");
538 if (cpu
== xmon_owner
) {
539 if (!test_and_set_bit(0, &xmon_taken
)) {
544 while (cpu
== xmon_owner
)
558 /* have switched to some other cpu */
563 cpumask_clear_cpu(cpu
, &cpus_in_xmon
);
564 xmon_fault_jmp
[cpu
] = NULL
;
566 /* UP is simple... */
568 printf("Exception %lx %s in xmon, returning to main loop\n",
569 regs
->trap
, getvecname(TRAP(regs
)));
570 longjmp(xmon_fault_jmp
[0], 1);
572 if (setjmp(recurse_jmp
) == 0) {
573 xmon_fault_jmp
[0] = recurse_jmp
;
577 bp
= at_breakpoint(regs
->nip
);
579 printf("Stopped at breakpoint %lx (", BP_NUM(bp
));
580 xmon_print_symbol(regs
->nip
, " ", ")\n");
582 if (unrecoverable_excp(regs
))
583 printf("WARNING: exception is not recoverable, "
586 disable_surveillance();
587 /* for breakpoint or single step, print the current instr. */
588 if (bp
|| TRAP(regs
) == 0xd00)
589 ppc_inst_dump(regs
->nip
, 1, 0);
590 printf("enter ? for help\n");
600 if (regs
->msr
& MSR_DE
) {
601 bp
= at_breakpoint(regs
->nip
);
603 regs
->nip
= (unsigned long) &bp
->instr
[0];
604 atomic_inc(&bp
->ref_count
);
608 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
609 bp
= at_breakpoint(regs
->nip
);
611 int stepped
= emulate_step(regs
, bp
->instr
[0]);
613 regs
->nip
= (unsigned long) &bp
->instr
[0];
614 atomic_inc(&bp
->ref_count
);
615 } else if (stepped
< 0) {
616 printf("Couldn't single-step %s instruction\n",
617 (IS_RFID(bp
->instr
[0])? "rfid": "mtmsrd"));
624 touch_nmi_watchdog();
625 local_irq_restore(flags
);
627 return cmd
!= 'X' && cmd
!= EOF
;
630 int xmon(struct pt_regs
*excp
)
635 ppc_save_regs(®s
);
639 return xmon_core(excp
, 0);
643 irqreturn_t
xmon_irq(int irq
, void *d
)
646 local_irq_save(flags
);
647 printf("Keyboard interrupt\n");
648 xmon(get_irq_regs());
649 local_irq_restore(flags
);
653 static int xmon_bpt(struct pt_regs
*regs
)
656 unsigned long offset
;
658 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
661 /* Are we at the trap at bp->instr[1] for some bp? */
662 bp
= in_breakpoint_table(regs
->nip
, &offset
);
663 if (bp
!= NULL
&& offset
== 4) {
664 regs
->nip
= bp
->address
+ 4;
665 atomic_dec(&bp
->ref_count
);
669 /* Are we at a breakpoint? */
670 bp
= at_breakpoint(regs
->nip
);
679 static int xmon_sstep(struct pt_regs
*regs
)
687 static int xmon_break_match(struct pt_regs
*regs
)
689 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
691 if (dabr
.enabled
== 0)
697 static int xmon_iabr_match(struct pt_regs
*regs
)
699 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) != (MSR_IR
|MSR_64BIT
))
707 static int xmon_ipi(struct pt_regs
*regs
)
710 if (in_xmon
&& !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon
))
716 static int xmon_fault_handler(struct pt_regs
*regs
)
719 unsigned long offset
;
721 if (in_xmon
&& catch_memory_errors
)
722 handle_fault(regs
); /* doesn't return */
724 if ((regs
->msr
& (MSR_IR
|MSR_PR
|MSR_64BIT
)) == (MSR_IR
|MSR_64BIT
)) {
725 bp
= in_breakpoint_table(regs
->nip
, &offset
);
727 regs
->nip
= bp
->address
+ offset
;
728 atomic_dec(&bp
->ref_count
);
735 static struct bpt
*at_breakpoint(unsigned long pc
)
741 for (i
= 0; i
< NBPTS
; ++i
, ++bp
)
742 if (bp
->enabled
&& pc
== bp
->address
)
747 static struct bpt
*in_breakpoint_table(unsigned long nip
, unsigned long *offp
)
751 off
= nip
- (unsigned long) bpts
;
752 if (off
>= sizeof(bpts
))
754 off
%= sizeof(struct bpt
);
755 if (off
!= offsetof(struct bpt
, instr
[0])
756 && off
!= offsetof(struct bpt
, instr
[1]))
758 *offp
= off
- offsetof(struct bpt
, instr
[0]);
759 return (struct bpt
*) (nip
- off
);
762 static struct bpt
*new_breakpoint(unsigned long a
)
767 bp
= at_breakpoint(a
);
771 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
772 if (!bp
->enabled
&& atomic_read(&bp
->ref_count
) == 0) {
774 bp
->instr
[1] = bpinstr
;
775 store_inst(&bp
->instr
[1]);
780 printf("Sorry, no free breakpoints. Please clear one first.\n");
784 static void insert_bpts(void)
790 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
791 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) == 0)
793 if (mread(bp
->address
, &bp
->instr
[0], 4) != 4) {
794 printf("Couldn't read instruction at %lx, "
795 "disabling breakpoint there\n", bp
->address
);
799 if (IS_MTMSRD(bp
->instr
[0]) || IS_RFID(bp
->instr
[0])) {
800 printf("Breakpoint at %lx is on an mtmsrd or rfid "
801 "instruction, disabling it\n", bp
->address
);
805 store_inst(&bp
->instr
[0]);
806 if (bp
->enabled
& BP_CIABR
)
808 if (mwrite(bp
->address
, &bpinstr
, 4) != 4) {
809 printf("Couldn't write instruction at %lx, "
810 "disabling breakpoint there\n", bp
->address
);
811 bp
->enabled
&= ~BP_TRAP
;
814 store_inst((void *)bp
->address
);
818 static void insert_cpu_bpts(void)
820 struct arch_hw_breakpoint brk
;
823 brk
.address
= dabr
.address
;
824 brk
.type
= (dabr
.enabled
& HW_BRK_TYPE_DABR
) | HW_BRK_TYPE_PRIV_ALL
;
826 __set_breakpoint(&brk
);
830 set_ciabr(iabr
->address
);
833 static void remove_bpts(void)
840 for (i
= 0; i
< NBPTS
; ++i
, ++bp
) {
841 if ((bp
->enabled
& (BP_TRAP
|BP_CIABR
)) != BP_TRAP
)
843 if (mread(bp
->address
, &instr
, 4) == 4
845 && mwrite(bp
->address
, &bp
->instr
, 4) != 4)
846 printf("Couldn't remove breakpoint at %lx\n",
849 store_inst((void *)bp
->address
);
853 static void remove_cpu_bpts(void)
855 hw_breakpoint_disable();
859 static void set_lpp_cmd(void)
863 if (!scanhex(&lpp
)) {
864 printf("Invalid number.\n");
867 xmon_set_pagination_lpp(lpp
);
869 /* Command interpreting routine */
870 static char *last_cmd
;
873 cmds(struct pt_regs
*excp
)
880 if (!xmon_no_auto_backtrace
) {
881 xmon_no_auto_backtrace
= 1;
882 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
887 printf("%x:", smp_processor_id());
888 #endif /* CONFIG_SMP */
894 if (last_cmd
== NULL
)
896 take_input(last_cmd
);
930 prregs(excp
); /* print regs */
945 if (do_spu_cmd() == 0)
954 printf(" <no input ...>\n");
958 xmon_puts(help_string
);
982 #ifdef CONFIG_PPC_STD_MMU
986 #elif defined(CONFIG_44x)
990 #elif defined(CONFIG_PPC_BOOK3E)
996 printf("Unrecognized command: ");
998 if (' ' < cmd
&& cmd
<= '~')
1001 printf("\\x%x", cmd
);
1003 } while (cmd
!= '\n');
1004 printf(" (type ? for help)\n");
1011 static int do_step(struct pt_regs
*regs
)
1013 regs
->msr
|= MSR_DE
;
1014 mtspr(SPRN_DBCR0
, mfspr(SPRN_DBCR0
) | DBCR0_IC
| DBCR0_IDM
);
1019 * Step a single instruction.
1020 * Some instructions we emulate, others we execute with MSR_SE set.
1022 static int do_step(struct pt_regs
*regs
)
1027 /* check we are in 64-bit kernel mode, translation enabled */
1028 if ((regs
->msr
& (MSR_64BIT
|MSR_PR
|MSR_IR
)) == (MSR_64BIT
|MSR_IR
)) {
1029 if (mread(regs
->nip
, &instr
, 4) == 4) {
1030 stepped
= emulate_step(regs
, instr
);
1032 printf("Couldn't single-step %s instruction\n",
1033 (IS_RFID(instr
)? "rfid": "mtmsrd"));
1037 regs
->trap
= 0xd00 | (regs
->trap
& 1);
1038 printf("stepped to ");
1039 xmon_print_symbol(regs
->nip
, " ", "\n");
1040 ppc_inst_dump(regs
->nip
, 1, 0);
1045 regs
->msr
|= MSR_SE
;
1050 static void bootcmds(void)
1056 ppc_md
.restart(NULL
);
1057 else if (cmd
== 'h')
1059 else if (cmd
== 'p')
1064 static int cpu_cmd(void)
1067 unsigned long cpu
, first_cpu
, last_cpu
;
1070 if (!scanhex(&cpu
)) {
1071 /* print cpus waiting or in xmon */
1072 printf("cpus stopped:");
1073 last_cpu
= first_cpu
= NR_CPUS
;
1074 for_each_possible_cpu(cpu
) {
1075 if (cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1076 if (cpu
== last_cpu
+ 1) {
1079 if (last_cpu
!= first_cpu
)
1080 printf("-0x%lx", last_cpu
);
1081 last_cpu
= first_cpu
= cpu
;
1082 printf(" 0x%lx", cpu
);
1086 if (last_cpu
!= first_cpu
)
1087 printf("-0x%lx", last_cpu
);
1091 /* try to switch to cpu specified */
1092 if (!cpumask_test_cpu(cpu
, &cpus_in_xmon
)) {
1093 printf("cpu 0x%x isn't in xmon\n", cpu
);
1100 while (!xmon_taken
) {
1101 if (--timeout
== 0) {
1102 if (test_and_set_bit(0, &xmon_taken
))
1104 /* take control back */
1106 xmon_owner
= smp_processor_id();
1107 printf("cpu 0x%x didn't take control\n", cpu
);
1115 #endif /* CONFIG_SMP */
1118 static unsigned short fcstab
[256] = {
1119 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1120 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1121 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1122 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1123 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1124 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1125 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1126 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1127 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1128 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1129 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1130 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1131 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1132 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1133 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1134 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1135 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1136 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1137 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1138 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1139 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1140 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1141 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1142 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1143 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1144 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1145 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1146 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1147 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1148 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1149 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1150 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1153 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1162 if (!scanhex(&adrs
))
1164 if (!scanhex(&ncsum
))
1167 for (i
= 0; i
< ncsum
; ++i
) {
1168 if (mread(adrs
+i
, &v
, 1) == 0) {
1169 printf("csum stopped at "REG
"\n", adrs
+i
);
1174 printf("%x\n", fcs
);
1178 * Check if this is a suitable place to put a breakpoint.
1180 static long check_bp_loc(unsigned long addr
)
1185 if (!is_kernel_addr(addr
)) {
1186 printf("Breakpoints may only be placed at kernel addresses\n");
1189 if (!mread(addr
, &instr
, sizeof(instr
))) {
1190 printf("Can't read instruction at address %lx\n", addr
);
1193 if (IS_MTMSRD(instr
) || IS_RFID(instr
)) {
1194 printf("Breakpoints may not be placed on mtmsrd or rfid "
1201 static char *breakpoint_help_string
=
1202 "Breakpoint command usage:\n"
1203 "b show breakpoints\n"
1204 "b <addr> [cnt] set breakpoint at given instr addr\n"
1205 "bc clear all breakpoints\n"
1206 "bc <n/addr> clear breakpoint number n or at addr\n"
1207 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1208 "bd <addr> [cnt] set hardware data breakpoint\n"
1218 const char badaddr
[] = "Only kernel addresses are permitted "
1219 "for breakpoints\n";
1224 case 'd': /* bd - hardware data breakpoint */
1229 else if (cmd
== 'w')
1235 if (scanhex(&dabr
.address
)) {
1236 if (!is_kernel_addr(dabr
.address
)) {
1240 dabr
.address
&= ~HW_BRK_TYPE_DABR
;
1241 dabr
.enabled
= mode
| BP_DABR
;
1245 case 'i': /* bi - hardware instr breakpoint */
1246 if (!cpu_has_feature(CPU_FTR_ARCH_207S
)) {
1247 printf("Hardware instruction breakpoint "
1248 "not supported on this cpu\n");
1252 iabr
->enabled
&= ~BP_CIABR
;
1257 if (!check_bp_loc(a
))
1259 bp
= new_breakpoint(a
);
1261 bp
->enabled
|= BP_CIABR
;
1269 /* clear all breakpoints */
1270 for (i
= 0; i
< NBPTS
; ++i
)
1271 bpts
[i
].enabled
= 0;
1274 printf("All breakpoints cleared\n");
1278 if (a
<= NBPTS
&& a
>= 1) {
1279 /* assume a breakpoint number */
1280 bp
= &bpts
[a
-1]; /* bp nums are 1 based */
1282 /* assume a breakpoint address */
1283 bp
= at_breakpoint(a
);
1285 printf("No breakpoint at %lx\n", a
);
1290 printf("Cleared breakpoint %lx (", BP_NUM(bp
));
1291 xmon_print_symbol(bp
->address
, " ", ")\n");
1299 printf(breakpoint_help_string
);
1304 /* print all breakpoints */
1305 printf(" type address\n");
1307 printf(" data "REG
" [", dabr
.address
);
1308 if (dabr
.enabled
& 1)
1310 if (dabr
.enabled
& 2)
1314 for (bp
= bpts
; bp
< &bpts
[NBPTS
]; ++bp
) {
1317 printf("%2x %s ", BP_NUM(bp
),
1318 (bp
->enabled
& BP_CIABR
) ? "inst": "trap");
1319 xmon_print_symbol(bp
->address
, " ", "\n");
1324 if (!check_bp_loc(a
))
1326 bp
= new_breakpoint(a
);
1328 bp
->enabled
|= BP_TRAP
;
1333 /* Very cheap human name for vector lookup. */
1335 const char *getvecname(unsigned long vec
)
1340 case 0x100: ret
= "(System Reset)"; break;
1341 case 0x200: ret
= "(Machine Check)"; break;
1342 case 0x300: ret
= "(Data Access)"; break;
1343 case 0x380: ret
= "(Data SLB Access)"; break;
1344 case 0x400: ret
= "(Instruction Access)"; break;
1345 case 0x480: ret
= "(Instruction SLB Access)"; break;
1346 case 0x500: ret
= "(Hardware Interrupt)"; break;
1347 case 0x600: ret
= "(Alignment)"; break;
1348 case 0x700: ret
= "(Program Check)"; break;
1349 case 0x800: ret
= "(FPU Unavailable)"; break;
1350 case 0x900: ret
= "(Decrementer)"; break;
1351 case 0x980: ret
= "(Hypervisor Decrementer)"; break;
1352 case 0xa00: ret
= "(Doorbell)"; break;
1353 case 0xc00: ret
= "(System Call)"; break;
1354 case 0xd00: ret
= "(Single Step)"; break;
1355 case 0xe40: ret
= "(Emulation Assist)"; break;
1356 case 0xe60: ret
= "(HMI)"; break;
1357 case 0xe80: ret
= "(Hypervisor Doorbell)"; break;
1358 case 0xf00: ret
= "(Performance Monitor)"; break;
1359 case 0xf20: ret
= "(Altivec Unavailable)"; break;
1360 case 0x1300: ret
= "(Instruction Breakpoint)"; break;
1361 case 0x1500: ret
= "(Denormalisation)"; break;
1362 case 0x1700: ret
= "(Altivec Assist)"; break;
1368 static void get_function_bounds(unsigned long pc
, unsigned long *startp
,
1369 unsigned long *endp
)
1371 unsigned long size
, offset
;
1374 *startp
= *endp
= 0;
1377 if (setjmp(bus_error_jmp
) == 0) {
1378 catch_memory_errors
= 1;
1380 name
= kallsyms_lookup(pc
, &size
, &offset
, NULL
, tmpstr
);
1382 *startp
= pc
- offset
;
1383 *endp
= pc
- offset
+ size
;
1387 catch_memory_errors
= 0;
1390 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1391 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1393 static void xmon_show_stack(unsigned long sp
, unsigned long lr
,
1396 int max_to_print
= 64;
1398 unsigned long newsp
;
1399 unsigned long marker
;
1400 struct pt_regs regs
;
1402 while (max_to_print
--) {
1403 if (sp
< PAGE_OFFSET
) {
1405 printf("SP (%lx) is in userspace\n", sp
);
1409 if (!mread(sp
+ LRSAVE_OFFSET
, &ip
, sizeof(unsigned long))
1410 || !mread(sp
, &newsp
, sizeof(unsigned long))) {
1411 printf("Couldn't read stack frame at %lx\n", sp
);
1416 * For the first stack frame, try to work out if
1417 * LR and/or the saved LR value in the bottommost
1418 * stack frame are valid.
1420 if ((pc
| lr
) != 0) {
1421 unsigned long fnstart
, fnend
;
1422 unsigned long nextip
;
1425 get_function_bounds(pc
, &fnstart
, &fnend
);
1428 mread(newsp
+ LRSAVE_OFFSET
, &nextip
,
1429 sizeof(unsigned long));
1431 if (lr
< PAGE_OFFSET
1432 || (fnstart
<= lr
&& lr
< fnend
))
1434 } else if (lr
== nextip
) {
1436 } else if (lr
>= PAGE_OFFSET
1437 && !(fnstart
<= lr
&& lr
< fnend
)) {
1438 printf("[link register ] ");
1439 xmon_print_symbol(lr
, " ", "\n");
1442 printf("["REG
"] ", sp
);
1443 xmon_print_symbol(ip
, " ", " (unreliable)\n");
1448 printf("["REG
"] ", sp
);
1449 xmon_print_symbol(ip
, " ", "\n");
1452 /* Look for "regshere" marker to see if this is
1453 an exception frame. */
1454 if (mread(sp
+ MARKER_OFFSET
, &marker
, sizeof(unsigned long))
1455 && marker
== STACK_FRAME_REGS_MARKER
) {
1456 if (mread(sp
+ STACK_FRAME_OVERHEAD
, ®s
, sizeof(regs
))
1458 printf("Couldn't read registers at %lx\n",
1459 sp
+ STACK_FRAME_OVERHEAD
);
1462 printf("--- Exception: %lx %s at ", regs
.trap
,
1463 getvecname(TRAP(®s
)));
1466 xmon_print_symbol(pc
, " ", "\n");
1476 static void backtrace(struct pt_regs
*excp
)
1481 xmon_show_stack(sp
, 0, 0);
1483 xmon_show_stack(excp
->gpr
[1], excp
->link
, excp
->nip
);
1487 static void print_bug_trap(struct pt_regs
*regs
)
1490 const struct bug_entry
*bug
;
1493 if (regs
->msr
& MSR_PR
)
1494 return; /* not in kernel */
1495 addr
= regs
->nip
; /* address of trap instruction */
1496 if (addr
< PAGE_OFFSET
)
1498 bug
= find_bug(regs
->nip
);
1501 if (is_warning_bug(bug
))
1504 #ifdef CONFIG_DEBUG_BUGVERBOSE
1505 printf("kernel BUG at %s:%u!\n",
1506 bug
->file
, bug
->line
);
1508 printf("kernel BUG at %p!\n", (void *)bug
->bug_addr
);
1510 #endif /* CONFIG_BUG */
1513 static void excprint(struct pt_regs
*fp
)
1518 printf("cpu 0x%x: ", smp_processor_id());
1519 #endif /* CONFIG_SMP */
1522 printf("Vector: %lx %s at [%lx]\n", fp
->trap
, getvecname(trap
), fp
);
1524 xmon_print_symbol(fp
->nip
, ": ", "\n");
1526 printf(" lr: ", fp
->link
);
1527 xmon_print_symbol(fp
->link
, ": ", "\n");
1529 printf(" sp: %lx\n", fp
->gpr
[1]);
1530 printf(" msr: %lx\n", fp
->msr
);
1532 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600 || trap
== 0x200) {
1533 printf(" dar: %lx\n", fp
->dar
);
1535 printf(" dsisr: %lx\n", fp
->dsisr
);
1538 printf(" current = 0x%lx\n", current
);
1540 printf(" paca = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n",
1541 local_paca
, local_paca
->soft_enabled
, local_paca
->irq_happened
);
1544 printf(" pid = %ld, comm = %s\n",
1545 current
->pid
, current
->comm
);
1551 printf(linux_banner
);
1554 static void prregs(struct pt_regs
*fp
)
1558 struct pt_regs regs
;
1560 if (scanhex(&base
)) {
1561 if (setjmp(bus_error_jmp
) == 0) {
1562 catch_memory_errors
= 1;
1564 regs
= *(struct pt_regs
*)base
;
1568 catch_memory_errors
= 0;
1569 printf("*** Error reading registers from "REG
"\n",
1573 catch_memory_errors
= 0;
1578 if (FULL_REGS(fp
)) {
1579 for (n
= 0; n
< 16; ++n
)
1580 printf("R%.2ld = "REG
" R%.2ld = "REG
"\n",
1581 n
, fp
->gpr
[n
], n
+16, fp
->gpr
[n
+16]);
1583 for (n
= 0; n
< 7; ++n
)
1584 printf("R%.2ld = "REG
" R%.2ld = "REG
"\n",
1585 n
, fp
->gpr
[n
], n
+7, fp
->gpr
[n
+7]);
1588 for (n
= 0; n
< 32; ++n
) {
1589 printf("R%.2d = %.8x%s", n
, fp
->gpr
[n
],
1590 (n
& 3) == 3? "\n": " ");
1591 if (n
== 12 && !FULL_REGS(fp
)) {
1598 xmon_print_symbol(fp
->nip
, " ", "\n");
1599 if (TRAP(fp
) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR
)) {
1601 xmon_print_symbol(fp
->orig_gpr3
, " ", "\n");
1604 xmon_print_symbol(fp
->link
, " ", "\n");
1605 printf("msr = "REG
" cr = %.8lx\n", fp
->msr
, fp
->ccr
);
1606 printf("ctr = "REG
" xer = "REG
" trap = %4lx\n",
1607 fp
->ctr
, fp
->xer
, fp
->trap
);
1609 if (trap
== 0x300 || trap
== 0x380 || trap
== 0x600)
1610 printf("dar = "REG
" dsisr = %.8lx\n", fp
->dar
, fp
->dsisr
);
1613 static void cacheflush(void)
1616 unsigned long nflush
;
1621 scanhex((void *)&adrs
);
1626 nflush
= (nflush
+ L1_CACHE_BYTES
- 1) / L1_CACHE_BYTES
;
1627 if (setjmp(bus_error_jmp
) == 0) {
1628 catch_memory_errors
= 1;
1632 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1633 cflush((void *) adrs
);
1635 for (; nflush
> 0; --nflush
, adrs
+= L1_CACHE_BYTES
)
1636 cinval((void *) adrs
);
1639 /* wait a little while to see if we get a machine check */
1642 catch_memory_errors
= 0;
1645 extern unsigned long xmon_mfspr(int spr
, unsigned long default_value
);
1646 extern void xmon_mtspr(int spr
, unsigned long value
);
1649 read_spr(int n
, unsigned long *vp
)
1651 unsigned long ret
= -1UL;
1654 if (setjmp(bus_error_jmp
) == 0) {
1655 catch_spr_faults
= 1;
1658 ret
= xmon_mfspr(n
, *vp
);
1664 catch_spr_faults
= 0;
1670 write_spr(int n
, unsigned long val
)
1672 if (setjmp(bus_error_jmp
) == 0) {
1673 catch_spr_faults
= 1;
1680 printf("SPR 0x%03x (%4d) Faulted during write\n", n
, n
);
1682 catch_spr_faults
= 0;
1685 static void dump_206_sprs(void)
1688 if (!cpu_has_feature(CPU_FTR_ARCH_206
))
1691 /* Actually some of these pre-date 2.06, but whatevs */
1693 printf("srr0 = %.16x srr1 = %.16x dsisr = %.8x\n",
1694 mfspr(SPRN_SRR0
), mfspr(SPRN_SRR1
), mfspr(SPRN_DSISR
));
1695 printf("dscr = %.16x ppr = %.16x pir = %.8x\n",
1696 mfspr(SPRN_DSCR
), mfspr(SPRN_PPR
), mfspr(SPRN_PIR
));
1698 if (!(mfmsr() & MSR_HV
))
1701 printf("sdr1 = %.16x hdar = %.16x hdsisr = %.8x\n",
1702 mfspr(SPRN_SDR1
), mfspr(SPRN_HDAR
), mfspr(SPRN_HDSISR
));
1703 printf("hsrr0 = %.16x hsrr1 = %.16x hdec = %.8x\n",
1704 mfspr(SPRN_HSRR0
), mfspr(SPRN_HSRR1
), mfspr(SPRN_HDEC
));
1705 printf("lpcr = %.16x pcr = %.16x lpidr = %.8x\n",
1706 mfspr(SPRN_LPCR
), mfspr(SPRN_PCR
), mfspr(SPRN_LPID
));
1707 printf("hsprg0 = %.16x hsprg1 = %.16x\n",
1708 mfspr(SPRN_HSPRG0
), mfspr(SPRN_HSPRG1
));
1709 printf("dabr = %.16x dabrx = %.16x\n",
1710 mfspr(SPRN_DABR
), mfspr(SPRN_DABRX
));
1714 static void dump_207_sprs(void)
1719 if (!cpu_has_feature(CPU_FTR_ARCH_207S
))
1722 printf("dpdes = %.16x tir = %.16x cir = %.8x\n",
1723 mfspr(SPRN_DPDES
), mfspr(SPRN_TIR
), mfspr(SPRN_CIR
));
1725 printf("fscr = %.16x tar = %.16x pspb = %.8x\n",
1726 mfspr(SPRN_FSCR
), mfspr(SPRN_TAR
), mfspr(SPRN_PSPB
));
1730 /* Only if TM has been enabled in the kernel */
1731 printf("tfhar = %.16x tfiar = %.16x texasr = %.16x\n",
1732 mfspr(SPRN_TFHAR
), mfspr(SPRN_TFIAR
),
1733 mfspr(SPRN_TEXASR
));
1736 printf("mmcr0 = %.16x mmcr1 = %.16x mmcr2 = %.16x\n",
1737 mfspr(SPRN_MMCR0
), mfspr(SPRN_MMCR1
), mfspr(SPRN_MMCR2
));
1738 printf("pmc1 = %.8x pmc2 = %.8x pmc3 = %.8x pmc4 = %.8x\n",
1739 mfspr(SPRN_PMC1
), mfspr(SPRN_PMC2
),
1740 mfspr(SPRN_PMC3
), mfspr(SPRN_PMC4
));
1741 printf("mmcra = %.16x siar = %.16x pmc5 = %.8x\n",
1742 mfspr(SPRN_MMCRA
), mfspr(SPRN_SIAR
), mfspr(SPRN_PMC5
));
1743 printf("sdar = %.16x sier = %.16x pmc6 = %.8x\n",
1744 mfspr(SPRN_SDAR
), mfspr(SPRN_SIER
), mfspr(SPRN_PMC6
));
1745 printf("ebbhr = %.16x ebbrr = %.16x bescr = %.16x\n",
1746 mfspr(SPRN_EBBHR
), mfspr(SPRN_EBBRR
), mfspr(SPRN_BESCR
));
1748 if (!(msr
& MSR_HV
))
1751 printf("hfscr = %.16x dhdes = %.16x rpr = %.16x\n",
1752 mfspr(SPRN_HFSCR
), mfspr(SPRN_DHDES
), mfspr(SPRN_RPR
));
1753 printf("dawr = %.16x dawrx = %.16x ciabr = %.16x\n",
1754 mfspr(SPRN_DAWR
), mfspr(SPRN_DAWRX
), mfspr(SPRN_CIABR
));
1758 static void dump_one_spr(int spr
, bool show_unimplemented
)
1763 if (!read_spr(spr
, &val
)) {
1764 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1768 if (val
== 0xdeadbeef) {
1769 /* Looks like read was a nop, confirm */
1771 if (!read_spr(spr
, &val
)) {
1772 printf("SPR 0x%03x (%4d) Faulted during read\n", spr
, spr
);
1776 if (val
== 0x0badcafe) {
1777 if (show_unimplemented
)
1778 printf("SPR 0x%03x (%4d) Unimplemented\n", spr
, spr
);
1783 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr
, spr
, val
);
1786 static void super_regs(void)
1788 static unsigned long regno
;
1796 unsigned long sp
, toc
;
1797 asm("mr %0,1" : "=r" (sp
) :);
1798 asm("mr %0,2" : "=r" (toc
) :);
1800 printf("msr = "REG
" sprg0 = "REG
"\n",
1801 mfmsr(), mfspr(SPRN_SPRG0
));
1802 printf("pvr = "REG
" sprg1 = "REG
"\n",
1803 mfspr(SPRN_PVR
), mfspr(SPRN_SPRG1
));
1804 printf("dec = "REG
" sprg2 = "REG
"\n",
1805 mfspr(SPRN_DEC
), mfspr(SPRN_SPRG2
));
1806 printf("sp = "REG
" sprg3 = "REG
"\n", sp
, mfspr(SPRN_SPRG3
));
1807 printf("toc = "REG
" dar = "REG
"\n", toc
, mfspr(SPRN_DAR
));
1818 read_spr(regno
, &val
);
1820 write_spr(regno
, val
);
1821 dump_one_spr(regno
, true);
1826 dump_one_spr(regno
, true);
1830 for (spr
= 1; spr
< 1024; ++spr
)
1831 dump_one_spr(spr
, false);
1839 * Stuff for reading and writing memory safely
1842 mread(unsigned long adrs
, void *buf
, int size
)
1848 if (setjmp(bus_error_jmp
) == 0) {
1849 catch_memory_errors
= 1;
1855 *(u16
*)q
= *(u16
*)p
;
1858 *(u32
*)q
= *(u32
*)p
;
1861 *(u64
*)q
= *(u64
*)p
;
1864 for( ; n
< size
; ++n
) {
1870 /* wait a little while to see if we get a machine check */
1874 catch_memory_errors
= 0;
1879 mwrite(unsigned long adrs
, void *buf
, int size
)
1885 if (setjmp(bus_error_jmp
) == 0) {
1886 catch_memory_errors
= 1;
1892 *(u16
*)p
= *(u16
*)q
;
1895 *(u32
*)p
= *(u32
*)q
;
1898 *(u64
*)p
= *(u64
*)q
;
1901 for ( ; n
< size
; ++n
) {
1907 /* wait a little while to see if we get a machine check */
1911 printf("*** Error writing address "REG
"\n", adrs
+ n
);
1913 catch_memory_errors
= 0;
1917 static int fault_type
;
1918 static int fault_except
;
1919 static char *fault_chars
[] = { "--", "**", "##" };
1921 static int handle_fault(struct pt_regs
*regs
)
1923 fault_except
= TRAP(regs
);
1924 switch (TRAP(regs
)) {
1936 longjmp(bus_error_jmp
, 1);
1941 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
1944 byterev(unsigned char *val
, int size
)
1950 SWAP(val
[0], val
[1], t
);
1953 SWAP(val
[0], val
[3], t
);
1954 SWAP(val
[1], val
[2], t
);
1956 case 8: /* is there really any use for this? */
1957 SWAP(val
[0], val
[7], t
);
1958 SWAP(val
[1], val
[6], t
);
1959 SWAP(val
[2], val
[5], t
);
1960 SWAP(val
[3], val
[4], t
);
1968 static char *memex_help_string
=
1969 "Memory examine command usage:\n"
1970 "m [addr] [flags] examine/change memory\n"
1971 " addr is optional. will start where left off.\n"
1972 " flags may include chars from this set:\n"
1973 " b modify by bytes (default)\n"
1974 " w modify by words (2 byte)\n"
1975 " l modify by longs (4 byte)\n"
1976 " d modify by doubleword (8 byte)\n"
1977 " r toggle reverse byte order mode\n"
1978 " n do not read memory (for i/o spaces)\n"
1979 " . ok to read (default)\n"
1980 "NOTE: flags are saved as defaults\n"
1983 static char *memex_subcmd_help_string
=
1984 "Memory examine subcommands:\n"
1985 " hexval write this val to current location\n"
1986 " 'string' write chars from string to this location\n"
1987 " ' increment address\n"
1988 " ^ decrement address\n"
1989 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
1990 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
1991 " ` clear no-read flag\n"
1992 " ; stay at this addr\n"
1993 " v change to byte mode\n"
1994 " w change to word (2 byte) mode\n"
1995 " l change to long (4 byte) mode\n"
1996 " u change to doubleword (8 byte) mode\n"
1997 " m addr change current addr\n"
1998 " n toggle no-read flag\n"
1999 " r toggle byte reverse flag\n"
2000 " < count back up count bytes\n"
2001 " > count skip forward count bytes\n"
2002 " x exit this mode\n"
2008 int cmd
, inc
, i
, nslash
;
2010 unsigned char val
[16];
2012 scanhex((void *)&adrs
);
2015 printf(memex_help_string
);
2021 while ((cmd
= skipbl()) != '\n') {
2023 case 'b': size
= 1; break;
2024 case 'w': size
= 2; break;
2025 case 'l': size
= 4; break;
2026 case 'd': size
= 8; break;
2027 case 'r': brev
= !brev
; break;
2028 case 'n': mnoread
= 1; break;
2029 case '.': mnoread
= 0; break;
2038 n
= mread(adrs
, val
, size
);
2039 printf(REG
"%c", adrs
, brev
? 'r': ' ');
2044 for (i
= 0; i
< n
; ++i
)
2045 printf("%.2x", val
[i
]);
2046 for (; i
< size
; ++i
)
2047 printf("%s", fault_chars
[fault_type
]);
2054 for (i
= 0; i
< size
; ++i
)
2055 val
[i
] = n
>> (i
* 8);
2058 mwrite(adrs
, val
, size
);
2071 else if( n
== '\'' )
2073 for (i
= 0; i
< size
; ++i
)
2074 val
[i
] = n
>> (i
* 8);
2077 mwrite(adrs
, val
, size
);
2113 adrs
-= 1 << nslash
;
2117 adrs
+= 1 << nslash
;
2121 adrs
+= 1 << -nslash
;
2125 adrs
-= 1 << -nslash
;
2128 scanhex((void *)&adrs
);
2147 printf(memex_subcmd_help_string
);
2162 case 'n': c
= '\n'; break;
2163 case 'r': c
= '\r'; break;
2164 case 'b': c
= '\b'; break;
2165 case 't': c
= '\t'; break;
2170 static void xmon_rawdump (unsigned long adrs
, long ndump
)
2173 unsigned char temp
[16];
2175 for (n
= ndump
; n
> 0;) {
2177 nr
= mread(adrs
, temp
, r
);
2179 for (m
= 0; m
< r
; ++m
) {
2181 printf("%.2x", temp
[m
]);
2183 printf("%s", fault_chars
[fault_type
]);
2193 static void dump_one_paca(int cpu
)
2195 struct paca_struct
*p
;
2196 #ifdef CONFIG_PPC_STD_MMU_64
2200 if (setjmp(bus_error_jmp
) != 0) {
2201 printf("*** Error dumping paca for cpu 0x%x!\n", cpu
);
2205 catch_memory_errors
= 1;
2210 printf("paca for cpu 0x%x @ %p:\n", cpu
, p
);
2212 printf(" %-*s = %s\n", 20, "possible", cpu_possible(cpu
) ? "yes" : "no");
2213 printf(" %-*s = %s\n", 20, "present", cpu_present(cpu
) ? "yes" : "no");
2214 printf(" %-*s = %s\n", 20, "online", cpu_online(cpu
) ? "yes" : "no");
2216 #define DUMP(paca, name, format) \
2217 printf(" %-*s = %#-*"format"\t(0x%lx)\n", 20, #name, 18, paca->name, \
2218 offsetof(struct paca_struct, name));
2220 DUMP(p
, lock_token
, "x");
2221 DUMP(p
, paca_index
, "x");
2222 DUMP(p
, kernel_toc
, "lx");
2223 DUMP(p
, kernelbase
, "lx");
2224 DUMP(p
, kernel_msr
, "lx");
2225 DUMP(p
, emergency_sp
, "p");
2226 #ifdef CONFIG_PPC_BOOK3S_64
2227 DUMP(p
, mc_emergency_sp
, "p");
2228 DUMP(p
, in_mce
, "x");
2229 DUMP(p
, hmi_event_available
, "x");
2231 DUMP(p
, data_offset
, "lx");
2232 DUMP(p
, hw_cpu_id
, "x");
2233 DUMP(p
, cpu_start
, "x");
2234 DUMP(p
, kexec_state
, "x");
2235 #ifdef CONFIG_PPC_STD_MMU_64
2236 for (i
= 0; i
< SLB_NUM_BOLTED
; i
++) {
2239 if (!p
->slb_shadow_ptr
)
2242 esid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].esid
);
2243 vsid
= be64_to_cpu(p
->slb_shadow_ptr
->save_area
[i
].vsid
);
2246 printf(" slb_shadow[%d]: = 0x%016lx 0x%016lx\n",
2250 DUMP(p
, vmalloc_sllp
, "x");
2251 DUMP(p
, slb_cache_ptr
, "x");
2252 for (i
= 0; i
< SLB_CACHE_ENTRIES
; i
++)
2253 printf(" slb_cache[%d]: = 0x%016lx\n", i
, p
->slb_cache
[i
]);
2255 DUMP(p
, dscr_default
, "llx");
2256 #ifdef CONFIG_PPC_BOOK3E
2258 DUMP(p
, kernel_pgd
, "p");
2259 DUMP(p
, tcd_ptr
, "p");
2260 DUMP(p
, mc_kstack
, "p");
2261 DUMP(p
, crit_kstack
, "p");
2262 DUMP(p
, dbg_kstack
, "p");
2264 DUMP(p
, __current
, "p");
2265 DUMP(p
, kstack
, "lx");
2266 DUMP(p
, stab_rr
, "lx");
2267 DUMP(p
, saved_r1
, "lx");
2268 DUMP(p
, trap_save
, "x");
2269 DUMP(p
, soft_enabled
, "x");
2270 DUMP(p
, irq_happened
, "x");
2271 DUMP(p
, io_sync
, "x");
2272 DUMP(p
, irq_work_pending
, "x");
2273 DUMP(p
, nap_state_lost
, "x");
2274 DUMP(p
, sprg_vdso
, "llx");
2276 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2277 DUMP(p
, tm_scratch
, "llx");
2280 #ifdef CONFIG_PPC_POWERNV
2281 DUMP(p
, core_idle_state_ptr
, "p");
2282 DUMP(p
, thread_idle_state
, "x");
2283 DUMP(p
, thread_mask
, "x");
2284 DUMP(p
, subcore_sibling_mask
, "x");
2287 DUMP(p
, accounting
.user_time
, "llx");
2288 DUMP(p
, accounting
.system_time
, "llx");
2289 DUMP(p
, accounting
.user_time_scaled
, "llx");
2290 DUMP(p
, accounting
.starttime
, "llx");
2291 DUMP(p
, accounting
.starttime_user
, "llx");
2292 DUMP(p
, accounting
.startspurr
, "llx");
2293 DUMP(p
, accounting
.utime_sspurr
, "llx");
2294 DUMP(p
, stolen_time
, "llx");
2297 catch_memory_errors
= 0;
2301 static void dump_all_pacas(void)
2305 if (num_possible_cpus() == 0) {
2306 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2310 for_each_possible_cpu(cpu
)
2314 static void dump_pacas(void)
2325 termch
= c
; /* Put c back, it wasn't 'a' */
2330 dump_one_paca(xmon_owner
);
2343 xmon_start_pagination();
2345 xmon_end_pagination();
2350 if ((isxdigit(c
) && c
!= 'f' && c
!= 'd') || c
== '\n')
2352 scanhex((void *)&adrs
);
2359 else if (nidump
> MAX_DUMP
)
2361 adrs
+= ppc_inst_dump(adrs
, nidump
, 1);
2363 } else if (c
== 'l') {
2365 } else if (c
== 'o') {
2367 } else if (c
== 'r') {
2371 xmon_rawdump(adrs
, ndump
);
2378 else if (ndump
> MAX_DUMP
)
2380 prdump(adrs
, ndump
);
2387 prdump(unsigned long adrs
, long ndump
)
2389 long n
, m
, c
, r
, nr
;
2390 unsigned char temp
[16];
2392 for (n
= ndump
; n
> 0;) {
2396 nr
= mread(adrs
, temp
, r
);
2398 for (m
= 0; m
< r
; ++m
) {
2399 if ((m
& (sizeof(long) - 1)) == 0 && m
> 0)
2402 printf("%.2x", temp
[m
]);
2404 printf("%s", fault_chars
[fault_type
]);
2406 for (; m
< 16; ++m
) {
2407 if ((m
& (sizeof(long) - 1)) == 0)
2412 for (m
= 0; m
< r
; ++m
) {
2415 putchar(' ' <= c
&& c
<= '~'? c
: '.');
2428 typedef int (*instruction_dump_func
)(unsigned long inst
, unsigned long addr
);
2431 generic_inst_dump(unsigned long adr
, long count
, int praddr
,
2432 instruction_dump_func dump_func
)
2435 unsigned long first_adr
;
2436 unsigned long inst
, last_inst
= 0;
2437 unsigned char val
[4];
2440 for (first_adr
= adr
; count
> 0; --count
, adr
+= 4) {
2441 nr
= mread(adr
, val
, 4);
2444 const char *x
= fault_chars
[fault_type
];
2445 printf(REG
" %s%s%s%s\n", adr
, x
, x
, x
, x
);
2449 inst
= GETWORD(val
);
2450 if (adr
> first_adr
&& inst
== last_inst
) {
2460 printf(REG
" %.8x", adr
, inst
);
2462 dump_func(inst
, adr
);
2465 return adr
- first_adr
;
2469 ppc_inst_dump(unsigned long adr
, long count
, int praddr
)
2471 return generic_inst_dump(adr
, count
, praddr
, print_insn_powerpc
);
2475 print_address(unsigned long addr
)
2477 xmon_print_symbol(addr
, "\t# ", "");
2483 struct kmsg_dumper dumper
= { .active
= 1 };
2484 unsigned char buf
[128];
2487 if (setjmp(bus_error_jmp
) != 0) {
2488 printf("Error dumping printk buffer!\n");
2492 catch_memory_errors
= 1;
2495 kmsg_dump_rewind_nolock(&dumper
);
2496 xmon_start_pagination();
2497 while (kmsg_dump_get_line_nolock(&dumper
, false, buf
, sizeof(buf
), &len
)) {
2501 xmon_end_pagination();
2504 /* wait a little while to see if we get a machine check */
2506 catch_memory_errors
= 0;
2509 #ifdef CONFIG_PPC_POWERNV
2510 static void dump_opal_msglog(void)
2512 unsigned char buf
[128];
2516 if (!firmware_has_feature(FW_FEATURE_OPAL
)) {
2517 printf("Machine is not running OPAL firmware.\n");
2521 if (setjmp(bus_error_jmp
) != 0) {
2522 printf("Error dumping OPAL msglog!\n");
2526 catch_memory_errors
= 1;
2529 xmon_start_pagination();
2530 while ((res
= opal_msglog_copy(buf
, pos
, sizeof(buf
) - 1))) {
2532 printf("Error dumping OPAL msglog! Error: %zd\n", res
);
2539 xmon_end_pagination();
2542 /* wait a little while to see if we get a machine check */
2544 catch_memory_errors
= 0;
2549 * Memory operations - move, set, print differences
2551 static unsigned long mdest
; /* destination address */
2552 static unsigned long msrc
; /* source address */
2553 static unsigned long mval
; /* byte value to set memory to */
2554 static unsigned long mcount
; /* # bytes to affect */
2555 static unsigned long mdiffs
; /* max # differences to print */
2560 scanhex((void *)&mdest
);
2561 if( termch
!= '\n' )
2563 scanhex((void *)(cmd
== 's'? &mval
: &msrc
));
2564 if( termch
!= '\n' )
2566 scanhex((void *)&mcount
);
2569 memmove((void *)mdest
, (void *)msrc
, mcount
);
2572 memset((void *)mdest
, mval
, mcount
);
2575 if( termch
!= '\n' )
2577 scanhex((void *)&mdiffs
);
2578 memdiffs((unsigned char *)mdest
, (unsigned char *)msrc
, mcount
, mdiffs
);
2584 memdiffs(unsigned char *p1
, unsigned char *p2
, unsigned nb
, unsigned maxpr
)
2589 for( n
= nb
; n
> 0; --n
)
2590 if( *p1
++ != *p2
++ )
2591 if( ++prt
<= maxpr
)
2592 printf("%.16x %.2x # %.16x %.2x\n", p1
- 1,
2593 p1
[-1], p2
- 1, p2
[-1]);
2595 printf("Total of %d differences\n", prt
);
2598 static unsigned mend
;
2599 static unsigned mask
;
2605 unsigned char val
[4];
2608 scanhex((void *)&mdest
);
2609 if (termch
!= '\n') {
2611 scanhex((void *)&mend
);
2612 if (termch
!= '\n') {
2614 scanhex((void *)&mval
);
2616 if (termch
!= '\n') termch
= 0;
2617 scanhex((void *)&mask
);
2621 for (a
= mdest
; a
< mend
; a
+= 4) {
2622 if (mread(a
, val
, 4) == 4
2623 && ((GETWORD(val
) ^ mval
) & mask
) == 0) {
2624 printf("%.16x: %.16x\n", a
, GETWORD(val
));
2631 static unsigned long mskip
= 0x1000;
2632 static unsigned long mlim
= 0xffffffff;
2642 if (termch
!= '\n') termch
= 0;
2644 if (termch
!= '\n') termch
= 0;
2647 for (a
= mdest
; a
< mlim
; a
+= mskip
) {
2648 ok
= mread(a
, &v
, 1);
2650 printf("%.8x .. ", a
);
2651 } else if (!ok
&& ook
)
2652 printf("%.8x\n", a
- mskip
);
2658 printf("%.8x\n", a
- mskip
);
2661 static void show_task(struct task_struct
*tsk
)
2666 * Cloned from kdb_task_state_char(), which is not entirely
2667 * appropriate for calling from xmon. This could be moved
2668 * to a common, generic, routine used by both.
2670 state
= (tsk
->state
== 0) ? 'R' :
2671 (tsk
->state
< 0) ? 'U' :
2672 (tsk
->state
& TASK_UNINTERRUPTIBLE
) ? 'D' :
2673 (tsk
->state
& TASK_STOPPED
) ? 'T' :
2674 (tsk
->state
& TASK_TRACED
) ? 'C' :
2675 (tsk
->exit_state
& EXIT_ZOMBIE
) ? 'Z' :
2676 (tsk
->exit_state
& EXIT_DEAD
) ? 'E' :
2677 (tsk
->state
& TASK_INTERRUPTIBLE
) ? 'S' : '?';
2679 printf("%p %016lx %6d %6d %c %2d %s\n", tsk
,
2681 tsk
->pid
, tsk
->parent
->pid
,
2682 state
, task_thread_info(tsk
)->cpu
,
2686 static void show_tasks(void)
2689 struct task_struct
*tsk
= NULL
;
2691 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
2694 tsk
= (struct task_struct
*)tskv
;
2696 if (setjmp(bus_error_jmp
) != 0) {
2697 catch_memory_errors
= 0;
2698 printf("*** Error dumping task %p\n", tsk
);
2702 catch_memory_errors
= 1;
2708 for_each_process(tsk
)
2713 catch_memory_errors
= 0;
2716 static void proccall(void)
2718 unsigned long args
[8];
2721 typedef unsigned long (*callfunc_t
)(unsigned long, unsigned long,
2722 unsigned long, unsigned long, unsigned long,
2723 unsigned long, unsigned long, unsigned long);
2726 if (!scanhex(&adrs
))
2730 for (i
= 0; i
< 8; ++i
)
2732 for (i
= 0; i
< 8; ++i
) {
2733 if (!scanhex(&args
[i
]) || termch
== '\n')
2737 func
= (callfunc_t
) adrs
;
2739 if (setjmp(bus_error_jmp
) == 0) {
2740 catch_memory_errors
= 1;
2742 ret
= func(args
[0], args
[1], args
[2], args
[3],
2743 args
[4], args
[5], args
[6], args
[7]);
2745 printf("return value is 0x%lx\n", ret
);
2747 printf("*** %x exception occurred\n", fault_except
);
2749 catch_memory_errors
= 0;
2752 /* Input scanning routines */
2763 while( c
== ' ' || c
== '\t' )
2769 static char *regnames
[N_PTREGS
] = {
2770 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2771 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2772 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2773 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2774 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2780 "trap", "dar", "dsisr", "res"
2784 scanhex(unsigned long *vp
)
2791 /* parse register name */
2795 for (i
= 0; i
< sizeof(regname
) - 1; ++i
) {
2804 for (i
= 0; i
< N_PTREGS
; ++i
) {
2805 if (strcmp(regnames
[i
], regname
) == 0) {
2806 if (xmon_regs
== NULL
) {
2807 printf("regs not available\n");
2810 *vp
= ((unsigned long *)xmon_regs
)[i
];
2814 printf("invalid register name '%%%s'\n", regname
);
2818 /* skip leading "0x" if any */
2832 } else if (c
== '$') {
2834 for (i
=0; i
<63; i
++) {
2836 if (isspace(c
) || c
== '\0') {
2844 if (setjmp(bus_error_jmp
) == 0) {
2845 catch_memory_errors
= 1;
2847 *vp
= kallsyms_lookup_name(tmpstr
);
2850 catch_memory_errors
= 0;
2852 printf("unknown symbol '%s'\n", tmpstr
);
2885 static int hexdigit(int c
)
2887 if( '0' <= c
&& c
<= '9' )
2889 if( 'A' <= c
&& c
<= 'F' )
2890 return c
- ('A' - 10);
2891 if( 'a' <= c
&& c
<= 'f' )
2892 return c
- ('a' - 10);
2897 getstring(char *s
, int size
)
2908 } while( c
!= ' ' && c
!= '\t' && c
!= '\n' );
2913 static char line
[256];
2914 static char *lineptr
;
2925 if (lineptr
== NULL
|| *lineptr
== 0) {
2926 if (xmon_gets(line
, sizeof(line
)) == NULL
) {
2936 take_input(char *str
)
2945 int type
= inchar();
2947 static char tmp
[64];
2952 xmon_print_symbol(addr
, ": ", "\n");
2957 if (setjmp(bus_error_jmp
) == 0) {
2958 catch_memory_errors
= 1;
2960 addr
= kallsyms_lookup_name(tmp
);
2962 printf("%s: %lx\n", tmp
, addr
);
2964 printf("Symbol '%s' not found.\n", tmp
);
2967 catch_memory_errors
= 0;
2974 /* Print an address in numeric and symbolic form (if possible) */
2975 static void xmon_print_symbol(unsigned long address
, const char *mid
,
2979 const char *name
= NULL
;
2980 unsigned long offset
, size
;
2982 printf(REG
, address
);
2983 if (setjmp(bus_error_jmp
) == 0) {
2984 catch_memory_errors
= 1;
2986 name
= kallsyms_lookup(address
, &size
, &offset
, &modname
,
2989 /* wait a little while to see if we get a machine check */
2993 catch_memory_errors
= 0;
2996 printf("%s%s+%#lx/%#lx", mid
, name
, offset
, size
);
2998 printf(" [%s]", modname
);
3000 printf("%s", after
);
3003 #ifdef CONFIG_PPC_STD_MMU_64
3004 void dump_segments(void)
3007 unsigned long esid
,vsid
;
3010 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3012 for (i
= 0; i
< mmu_slb_size
; i
++) {
3013 asm volatile("slbmfee %0,%1" : "=r" (esid
) : "r" (i
));
3014 asm volatile("slbmfev %0,%1" : "=r" (vsid
) : "r" (i
));
3016 printf("%02d %016lx %016lx", i
, esid
, vsid
);
3017 if (esid
& SLB_ESID_V
) {
3018 llp
= vsid
& SLB_VSID_LLP
;
3019 if (vsid
& SLB_VSID_B_1T
) {
3020 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3022 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT_1T
,
3025 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3027 (vsid
& ~SLB_VSID_B
) >> SLB_VSID_SHIFT
,
3037 #ifdef CONFIG_PPC_STD_MMU_32
3038 void dump_segments(void)
3043 for (i
= 0; i
< 16; ++i
)
3044 printf(" %x", mfsrin(i
));
3050 static void dump_tlb_44x(void)
3054 for (i
= 0; i
< PPC44x_TLB_SIZE
; i
++) {
3055 unsigned long w0
,w1
,w2
;
3056 asm volatile("tlbre %0,%1,0" : "=r" (w0
) : "r" (i
));
3057 asm volatile("tlbre %0,%1,1" : "=r" (w1
) : "r" (i
));
3058 asm volatile("tlbre %0,%1,2" : "=r" (w2
) : "r" (i
));
3059 printf("[%02x] %08x %08x %08x ", i
, w0
, w1
, w2
);
3060 if (w0
& PPC44x_TLB_VALID
) {
3061 printf("V %08x -> %01x%08x %c%c%c%c%c",
3062 w0
& PPC44x_TLB_EPN_MASK
,
3063 w1
& PPC44x_TLB_ERPN_MASK
,
3064 w1
& PPC44x_TLB_RPN_MASK
,
3065 (w2
& PPC44x_TLB_W
) ? 'W' : 'w',
3066 (w2
& PPC44x_TLB_I
) ? 'I' : 'i',
3067 (w2
& PPC44x_TLB_M
) ? 'M' : 'm',
3068 (w2
& PPC44x_TLB_G
) ? 'G' : 'g',
3069 (w2
& PPC44x_TLB_E
) ? 'E' : 'e');
3074 #endif /* CONFIG_44x */
3076 #ifdef CONFIG_PPC_BOOK3E
3077 static void dump_tlb_book3e(void)
3079 u32 mmucfg
, pidmask
, lpidmask
;
3081 int i
, tlb
, ntlbs
, pidsz
, lpidsz
, rasz
, lrat
= 0;
3083 static const char *pgsz_names
[] = {
3118 /* Gather some infos about the MMU */
3119 mmucfg
= mfspr(SPRN_MMUCFG
);
3120 mmu_version
= (mmucfg
& 3) + 1;
3121 ntlbs
= ((mmucfg
>> 2) & 3) + 1;
3122 pidsz
= ((mmucfg
>> 6) & 0x1f) + 1;
3123 lpidsz
= (mmucfg
>> 24) & 0xf;
3124 rasz
= (mmucfg
>> 16) & 0x7f;
3125 if ((mmu_version
> 1) && (mmucfg
& 0x10000))
3127 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3128 mmu_version
, ntlbs
, pidsz
, lpidsz
, rasz
);
3129 pidmask
= (1ul << pidsz
) - 1;
3130 lpidmask
= (1ul << lpidsz
) - 1;
3131 ramask
= (1ull << rasz
) - 1;
3133 for (tlb
= 0; tlb
< ntlbs
; tlb
++) {
3135 int nent
, assoc
, new_cc
= 1;
3136 printf("TLB %d:\n------\n", tlb
);
3139 tlbcfg
= mfspr(SPRN_TLB0CFG
);
3142 tlbcfg
= mfspr(SPRN_TLB1CFG
);
3145 tlbcfg
= mfspr(SPRN_TLB2CFG
);
3148 tlbcfg
= mfspr(SPRN_TLB3CFG
);
3151 printf("Unsupported TLB number !\n");
3154 nent
= tlbcfg
& 0xfff;
3155 assoc
= (tlbcfg
>> 24) & 0xff;
3156 for (i
= 0; i
< nent
; i
++) {
3157 u32 mas0
= MAS0_TLBSEL(tlb
);
3158 u32 mas1
= MAS1_TSIZE(BOOK3E_PAGESZ_4K
);
3161 int esel
= i
, cc
= i
;
3169 mas0
|= MAS0_ESEL(esel
);
3170 mtspr(SPRN_MAS0
, mas0
);
3171 mtspr(SPRN_MAS1
, mas1
);
3172 mtspr(SPRN_MAS2
, mas2
);
3173 asm volatile("tlbre 0,0,0" : : : "memory");
3174 mas1
= mfspr(SPRN_MAS1
);
3175 mas2
= mfspr(SPRN_MAS2
);
3176 mas7_mas3
= mfspr(SPRN_MAS7_MAS3
);
3177 if (assoc
&& (i
% assoc
) == 0)
3179 if (!(mas1
& MAS1_VALID
))
3182 printf("%04x- ", i
);
3184 printf("%04x-%c", cc
, 'A' + esel
);
3186 printf(" |%c", 'A' + esel
);
3188 printf(" %016llx %04x %s %c%c AS%c",
3190 (mas1
>> 16) & 0x3fff,
3191 pgsz_names
[(mas1
>> 7) & 0x1f],
3192 mas1
& MAS1_IND
? 'I' : ' ',
3193 mas1
& MAS1_IPROT
? 'P' : ' ',
3194 mas1
& MAS1_TS
? '1' : '0');
3195 printf(" %c%c%c%c%c%c%c",
3196 mas2
& MAS2_X0
? 'a' : ' ',
3197 mas2
& MAS2_X1
? 'v' : ' ',
3198 mas2
& MAS2_W
? 'w' : ' ',
3199 mas2
& MAS2_I
? 'i' : ' ',
3200 mas2
& MAS2_M
? 'm' : ' ',
3201 mas2
& MAS2_G
? 'g' : ' ',
3202 mas2
& MAS2_E
? 'e' : ' ');
3203 printf(" %016llx", mas7_mas3
& ramask
& ~0x7ffull
);
3204 if (mas1
& MAS1_IND
)
3206 pgsz_names
[(mas7_mas3
>> 1) & 0x1f]);
3208 printf(" U%c%c%c S%c%c%c\n",
3209 mas7_mas3
& MAS3_UX
? 'x' : ' ',
3210 mas7_mas3
& MAS3_UW
? 'w' : ' ',
3211 mas7_mas3
& MAS3_UR
? 'r' : ' ',
3212 mas7_mas3
& MAS3_SX
? 'x' : ' ',
3213 mas7_mas3
& MAS3_SW
? 'w' : ' ',
3214 mas7_mas3
& MAS3_SR
? 'r' : ' ');
3218 #endif /* CONFIG_PPC_BOOK3E */
3220 static void xmon_init(int enable
)
3224 __debugger_ipi
= xmon_ipi
;
3225 __debugger_bpt
= xmon_bpt
;
3226 __debugger_sstep
= xmon_sstep
;
3227 __debugger_iabr_match
= xmon_iabr_match
;
3228 __debugger_break_match
= xmon_break_match
;
3229 __debugger_fault_handler
= xmon_fault_handler
;
3232 __debugger_ipi
= NULL
;
3233 __debugger_bpt
= NULL
;
3234 __debugger_sstep
= NULL
;
3235 __debugger_iabr_match
= NULL
;
3236 __debugger_break_match
= NULL
;
3237 __debugger_fault_handler
= NULL
;
3241 #ifdef CONFIG_MAGIC_SYSRQ
3242 static void sysrq_handle_xmon(int key
)
3244 /* ensure xmon is enabled */
3246 debugger(get_irq_regs());
3249 static struct sysrq_key_op sysrq_xmon_op
= {
3250 .handler
= sysrq_handle_xmon
,
3251 .help_msg
= "xmon(x)",
3252 .action_msg
= "Entering xmon",
3255 static int __init
setup_xmon_sysrq(void)
3257 register_sysrq_key('x', &sysrq_xmon_op
);
3260 __initcall(setup_xmon_sysrq
);
3261 #endif /* CONFIG_MAGIC_SYSRQ */
3263 static int __initdata xmon_early
, xmon_off
;
3265 static int __init
early_parse_xmon(char *p
)
3267 if (!p
|| strncmp(p
, "early", 5) == 0) {
3268 /* just "xmon" is equivalent to "xmon=early" */
3271 } else if (strncmp(p
, "on", 2) == 0)
3273 else if (strncmp(p
, "off", 3) == 0)
3275 else if (strncmp(p
, "nobt", 4) == 0)
3276 xmon_no_auto_backtrace
= 1;
3282 early_param("xmon", early_parse_xmon
);
3284 void __init
xmon_setup(void)
3286 #ifdef CONFIG_XMON_DEFAULT
3294 #ifdef CONFIG_SPU_BASE
3298 u64 saved_mfc_sr1_RW
;
3299 u32 saved_spu_runcntl_RW
;
3300 unsigned long dump_addr
;
3304 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
3306 static struct spu_info spu_info
[XMON_NUM_SPUS
];
3308 void xmon_register_spus(struct list_head
*list
)
3312 list_for_each_entry(spu
, list
, full_list
) {
3313 if (spu
->number
>= XMON_NUM_SPUS
) {
3318 spu_info
[spu
->number
].spu
= spu
;
3319 spu_info
[spu
->number
].stopped_ok
= 0;
3320 spu_info
[spu
->number
].dump_addr
= (unsigned long)
3321 spu_info
[spu
->number
].spu
->local_store
;
3325 static void stop_spus(void)
3331 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3332 if (!spu_info
[i
].spu
)
3335 if (setjmp(bus_error_jmp
) == 0) {
3336 catch_memory_errors
= 1;
3339 spu
= spu_info
[i
].spu
;
3341 spu_info
[i
].saved_spu_runcntl_RW
=
3342 in_be32(&spu
->problem
->spu_runcntl_RW
);
3344 tmp
= spu_mfc_sr1_get(spu
);
3345 spu_info
[i
].saved_mfc_sr1_RW
= tmp
;
3347 tmp
&= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK
;
3348 spu_mfc_sr1_set(spu
, tmp
);
3353 spu_info
[i
].stopped_ok
= 1;
3355 printf("Stopped spu %.2d (was %s)\n", i
,
3356 spu_info
[i
].saved_spu_runcntl_RW
?
3357 "running" : "stopped");
3359 catch_memory_errors
= 0;
3360 printf("*** Error stopping spu %.2d\n", i
);
3362 catch_memory_errors
= 0;
3366 static void restart_spus(void)
3371 for (i
= 0; i
< XMON_NUM_SPUS
; i
++) {
3372 if (!spu_info
[i
].spu
)
3375 if (!spu_info
[i
].stopped_ok
) {
3376 printf("*** Error, spu %d was not successfully stopped"
3377 ", not restarting\n", i
);
3381 if (setjmp(bus_error_jmp
) == 0) {
3382 catch_memory_errors
= 1;
3385 spu
= spu_info
[i
].spu
;
3386 spu_mfc_sr1_set(spu
, spu_info
[i
].saved_mfc_sr1_RW
);
3387 out_be32(&spu
->problem
->spu_runcntl_RW
,
3388 spu_info
[i
].saved_spu_runcntl_RW
);
3393 printf("Restarted spu %.2d\n", i
);
3395 catch_memory_errors
= 0;
3396 printf("*** Error restarting spu %.2d\n", i
);
3398 catch_memory_errors
= 0;
3402 #define DUMP_WIDTH 23
3403 #define DUMP_VALUE(format, field, value) \
3405 if (setjmp(bus_error_jmp) == 0) { \
3406 catch_memory_errors = 1; \
3408 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3413 catch_memory_errors = 0; \
3414 printf(" %-*s = *** Error reading field.\n", \
3415 DUMP_WIDTH, #field); \
3417 catch_memory_errors = 0; \
3420 #define DUMP_FIELD(obj, format, field) \
3421 DUMP_VALUE(format, field, obj->field)
3423 static void dump_spu_fields(struct spu
*spu
)
3425 printf("Dumping spu fields at address %p:\n", spu
);
3427 DUMP_FIELD(spu
, "0x%x", number
);
3428 DUMP_FIELD(spu
, "%s", name
);
3429 DUMP_FIELD(spu
, "0x%lx", local_store_phys
);
3430 DUMP_FIELD(spu
, "0x%p", local_store
);
3431 DUMP_FIELD(spu
, "0x%lx", ls_size
);
3432 DUMP_FIELD(spu
, "0x%x", node
);
3433 DUMP_FIELD(spu
, "0x%lx", flags
);
3434 DUMP_FIELD(spu
, "%d", class_0_pending
);
3435 DUMP_FIELD(spu
, "0x%lx", class_0_dar
);
3436 DUMP_FIELD(spu
, "0x%lx", class_1_dar
);
3437 DUMP_FIELD(spu
, "0x%lx", class_1_dsisr
);
3438 DUMP_FIELD(spu
, "0x%lx", irqs
[0]);
3439 DUMP_FIELD(spu
, "0x%lx", irqs
[1]);
3440 DUMP_FIELD(spu
, "0x%lx", irqs
[2]);
3441 DUMP_FIELD(spu
, "0x%x", slb_replace
);
3442 DUMP_FIELD(spu
, "%d", pid
);
3443 DUMP_FIELD(spu
, "0x%p", mm
);
3444 DUMP_FIELD(spu
, "0x%p", ctx
);
3445 DUMP_FIELD(spu
, "0x%p", rq
);
3446 DUMP_FIELD(spu
, "0x%p", timestamp
);
3447 DUMP_FIELD(spu
, "0x%lx", problem_phys
);
3448 DUMP_FIELD(spu
, "0x%p", problem
);
3449 DUMP_VALUE("0x%x", problem
->spu_runcntl_RW
,
3450 in_be32(&spu
->problem
->spu_runcntl_RW
));
3451 DUMP_VALUE("0x%x", problem
->spu_status_R
,
3452 in_be32(&spu
->problem
->spu_status_R
));
3453 DUMP_VALUE("0x%x", problem
->spu_npc_RW
,
3454 in_be32(&spu
->problem
->spu_npc_RW
));
3455 DUMP_FIELD(spu
, "0x%p", priv2
);
3456 DUMP_FIELD(spu
, "0x%p", pdata
);
3460 spu_inst_dump(unsigned long adr
, long count
, int praddr
)
3462 return generic_inst_dump(adr
, count
, praddr
, print_insn_spu
);
3465 static void dump_spu_ls(unsigned long num
, int subcmd
)
3467 unsigned long offset
, addr
, ls_addr
;
3469 if (setjmp(bus_error_jmp
) == 0) {
3470 catch_memory_errors
= 1;
3472 ls_addr
= (unsigned long)spu_info
[num
].spu
->local_store
;
3476 catch_memory_errors
= 0;
3477 printf("*** Error: accessing spu info for spu %d\n", num
);
3480 catch_memory_errors
= 0;
3482 if (scanhex(&offset
))
3483 addr
= ls_addr
+ offset
;
3485 addr
= spu_info
[num
].dump_addr
;
3487 if (addr
>= ls_addr
+ LS_SIZE
) {
3488 printf("*** Error: address outside of local store\n");
3494 addr
+= spu_inst_dump(addr
, 16, 1);
3504 spu_info
[num
].dump_addr
= addr
;
3507 static int do_spu_cmd(void)
3509 static unsigned long num
= 0;
3510 int cmd
, subcmd
= 0;
3522 if (isxdigit(subcmd
) || subcmd
== '\n')
3526 if (num
>= XMON_NUM_SPUS
|| !spu_info
[num
].spu
) {
3527 printf("*** Error: invalid spu number\n");
3533 dump_spu_fields(spu_info
[num
].spu
);
3536 dump_spu_ls(num
, subcmd
);
3547 #else /* ! CONFIG_SPU_BASE */
3548 static int do_spu_cmd(void)