2 * Routines providing a simple monitor for use on the PowerMac.
4 * Copyright (C) 1996-2005 Paul Mackerras.
5 * Copyright (C) 2001 PPC64 Team, IBM Corp
6 * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version
11 * 2 of the License, or (at your option) any later version.
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/sched/signal.h>
17 #include <linux/smp.h>
19 #include <linux/reboot.h>
20 #include <linux/delay.h>
21 #include <linux/kallsyms.h>
22 #include <linux/kmsg_dump.h>
23 #include <linux/cpumask.h>
24 #include <linux/export.h>
25 #include <linux/sysrq.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/bug.h>
29 #include <linux/nmi.h>
30 #include <linux/ctype.h>
31 #include <linux/highmem.h>
33 #include <asm/debugfs.h>
34 #include <asm/ptrace.h>
36 #include <asm/string.h>
38 #include <asm/machdep.h>
40 #include <asm/processor.h>
41 #include <asm/pgtable.h>
43 #include <asm/mmu_context.h>
44 #include <asm/plpar_wrappers.h>
45 #include <asm/cputable.h>
47 #include <asm/sstep.h>
48 #include <asm/irq_regs.h>
50 #include <asm/spu_priv1.h>
51 #include <asm/setjmp.h>
53 #include <asm/debug.h>
54 #include <asm/hw_breakpoint.h>
57 #include <asm/firmware.h>
58 #include <asm/code-patching.h>
59 #include <asm/sections.h>
62 #include <asm/hvcall.h>
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 #ifdef CONFIG_PPC_PSERIES
79 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
81 static unsigned long in_xmon __read_mostly = 0;
82 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
83 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
85 static unsigned long adrs;
87 #define MAX_DUMP (128 * 1024)
88 static unsigned long ndump = 64;
89 static unsigned long nidump = 16;
90 static unsigned long ncsum = 4096;
92 static char tmpstr[128];
93 static int tracing_enabled;
95 static long bus_error_jmp[JMP_BUF_LEN];
96 static int catch_memory_errors;
97 static int catch_spr_faults;
98 static long *xmon_fault_jmp[NR_CPUS];
100 /* Breakpoint stuff */
102 unsigned long address;
103 unsigned int instr[2];
109 /* Bits in bpt.enabled */
115 static struct bpt bpts[NBPTS];
116 static struct bpt dabr;
117 static struct bpt *iabr;
118 static unsigned bpinstr = 0x7fe00008; /* trap */
120 #define BP_NUM(bp) ((bp) - bpts + 1)
123 static int cmds(struct pt_regs *);
124 static int mread(unsigned long, void *, int);
125 static int mwrite(unsigned long, void *, int);
126 static int handle_fault(struct pt_regs *);
127 static void byterev(unsigned char *, int);
128 static void memex(void);
129 static int bsesc(void);
130 static void dump(void);
131 static void show_pte(unsigned long);
132 static void prdump(unsigned long, long);
133 static int ppc_inst_dump(unsigned long, long, int);
134 static void dump_log_buf(void);
136 #ifdef CONFIG_PPC_POWERNV
137 static void dump_opal_msglog(void);
139 static inline void dump_opal_msglog(void)
141 printf("Machine is not running OPAL firmware.\n");
145 static void backtrace(struct pt_regs *);
146 static void excprint(struct pt_regs *);
147 static void prregs(struct pt_regs *);
148 static void memops(int);
149 static void memlocate(void);
150 static void memzcan(void);
151 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
153 int scanhex(unsigned long *valp);
154 static void scannl(void);
155 static int hexdigit(int);
156 void getstring(char *, int);
157 static void flush_input(void);
158 static int inchar(void);
159 static void take_input(char *);
160 static int read_spr(int, unsigned long *);
161 static void write_spr(int, unsigned long);
162 static void super_regs(void);
163 static void remove_bpts(void);
164 static void insert_bpts(void);
165 static void remove_cpu_bpts(void);
166 static void insert_cpu_bpts(void);
167 static struct bpt *at_breakpoint(unsigned long pc);
168 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
169 static int do_step(struct pt_regs *);
170 static void bpt_cmds(void);
171 static void cacheflush(void);
172 static int cpu_cmd(void);
173 static void csum(void);
174 static void bootcmds(void);
175 static void proccall(void);
176 static void show_tasks(void);
177 void dump_segments(void);
178 static void symbol_lookup(void);
179 static void xmon_show_stack(unsigned long sp, unsigned long lr,
181 static void xmon_print_symbol(unsigned long address, const char *mid,
183 static const char *getvecname(unsigned long vec);
185 static int do_spu_cmd(void);
188 static void dump_tlb_44x(void);
190 #ifdef CONFIG_PPC_BOOK3E
191 static void dump_tlb_book3e(void);
200 #ifdef __LITTLE_ENDIAN__
201 #define GETWORD(v) (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
203 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
206 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
208 static char *help_string = "\
210 b show breakpoints\n\
211 bd set data breakpoint\n\
212 bi set instruction breakpoint\n\
213 bc clear breakpoint\n"
216 c print cpus stopped in xmon\n\
217 c# try to switch to cpu number h (in hex)\n"
222 d1 dump 1 byte values\n\
223 d2 dump 2 byte values\n\
224 d4 dump 4 byte values\n\
225 d8 dump 8 byte values\n\
226 di dump instructions\n\
227 df dump float values\n\
228 dd dump double values\n\
229 dl dump the kernel log buffer\n"
230 #ifdef CONFIG_PPC_POWERNV
232 do dump the OPAL message log\n"
236 dp[#] dump paca for current cpu, or cpu #\n\
237 dpa dump paca for all possible cpus\n"
240 dr dump stream of raw bytes\n\
241 dv dump virtual address translation \n\
242 dt dump the tracing buffers (uses printk)\n\
243 dtc dump the tracing buffers for current CPU (uses printk)\n\
245 #ifdef CONFIG_PPC_POWERNV
246 " dx# dump xive on CPU #\n\
247 dxi# dump xive irq state #\n\
248 dxa dump xive on all CPUs\n"
250 " e print exception information\n\
252 la lookup symbol+offset of specified address\n\
253 ls lookup address of specified symbol\n\
254 lp s [#] lookup address of percpu symbol s for current cpu, or cpu #\n\
255 m examine/change memory\n\
256 mm move a block of memory\n\
257 ms set a block of memory\n\
258 md compare two blocks of memory\n\
259 ml locate a block of memory\n\
260 mz zero a block of memory\n\
261 mi show information about memory allocation\n\
262 p call a procedure\n\
263 P list processes/tasks\n\
266 #ifdef CONFIG_SPU_BASE
267 " ss stop execution on all spus\n\
268 sr restore execution on stopped spus\n\
269 sf # dump spu fields for spu # (in hex)\n\
270 sd # dump spu local store for spu # (in hex)\n\
271 sdi # disassemble spu local store for spu # (in hex)\n"
273 " S print special registers\n\
276 Sw #v write v to SPR #\n\
278 x exit monitor and recover\n\
279 X exit monitor and don't recover\n"
280 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
281 " u dump segment table or SLB\n"
282 #elif defined(CONFIG_PPC_BOOK3S_32)
283 " u dump segment registers\n"
284 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
287 " U show uptime information\n"
289 " # n limit output to n lines per page (for dp, dpa, dl)\n"
294 static struct pt_regs *xmon_regs;
296 static inline void sync(void)
298 asm volatile("sync; isync");
301 static inline void store_inst(void *p)
303 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
306 static inline void cflush(void *p)
308 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
311 static inline void cinval(void *p)
313 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
317 * write_ciabr() - write the CIABR SPR
318 * @ciabr: The value to write.
320 * This function writes a value to the CIARB register either directly
321 * through mtspr instruction if the kernel is in HV privilege mode or
322 * call a hypervisor function to achieve the same in case the kernel
323 * is in supervisor privilege mode.
325 static void write_ciabr(unsigned long ciabr)
327 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
330 if (cpu_has_feature(CPU_FTR_HVMODE)) {
331 mtspr(SPRN_CIABR, ciabr);
334 plpar_set_ciabr(ciabr);
338 * set_ciabr() - set the CIABR
339 * @addr: The value to set.
341 * This function sets the correct privilege value into the the HW
342 * breakpoint address before writing it up in the CIABR register.
344 static void set_ciabr(unsigned long addr)
348 if (cpu_has_feature(CPU_FTR_HVMODE))
349 addr |= CIABR_PRIV_HYPER;
351 addr |= CIABR_PRIV_SUPER;
356 * Disable surveillance (the service processor watchdog function)
357 * while we are in xmon.
358 * XXX we should re-enable it when we leave. :)
360 #define SURVEILLANCE_TOKEN 9000
362 static inline void disable_surveillance(void)
364 #ifdef CONFIG_PPC_PSERIES
365 /* Since this can't be a module, args should end up below 4GB. */
366 static struct rtas_args args;
369 * At this point we have got all the cpus we can into
370 * xmon, so there is hopefully no other cpu calling RTAS
371 * at the moment, even though we don't take rtas.lock.
372 * If we did try to take rtas.lock there would be a
373 * real possibility of deadlock.
375 if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
378 rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
379 SURVEILLANCE_TOKEN, 0, 0);
381 #endif /* CONFIG_PPC_PSERIES */
385 static int xmon_speaker;
387 static void get_output_lock(void)
389 int me = smp_processor_id() + 0x100;
390 int last_speaker = 0, prev;
393 if (xmon_speaker == me)
397 last_speaker = cmpxchg(&xmon_speaker, 0, me);
398 if (last_speaker == 0)
402 * Wait a full second for the lock, we might be on a slow
403 * console, but check every 100us.
406 while (xmon_speaker == last_speaker) {
412 /* hostile takeover */
413 prev = cmpxchg(&xmon_speaker, last_speaker, me);
414 if (prev == last_speaker)
421 static void release_output_lock(void)
426 int cpus_are_in_xmon(void)
428 return !cpumask_empty(&cpus_in_xmon);
431 static bool wait_for_other_cpus(int ncpus)
433 unsigned long timeout;
435 /* We wait for 2s, which is a metric "little while" */
436 for (timeout = 20000; timeout != 0; --timeout) {
437 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
445 #endif /* CONFIG_SMP */
447 static inline int unrecoverable_excp(struct pt_regs *regs)
449 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
450 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
453 return ((regs->msr & MSR_RI) == 0);
457 static int xmon_core(struct pt_regs *regs, int fromipi)
461 long recurse_jmp[JMP_BUF_LEN];
462 unsigned long offset;
469 local_irq_save(flags);
473 tracing_enabled = tracing_is_on();
477 bp = in_breakpoint_table(regs->nip, &offset);
479 regs->nip = bp->address + offset;
480 atomic_dec(&bp->ref_count);
486 cpu = smp_processor_id();
487 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
489 * We catch SPR read/write faults here because the 0x700, 0xf60
490 * etc. handlers don't call debugger_fault_handler().
492 if (catch_spr_faults)
493 longjmp(bus_error_jmp, 1);
496 printf("cpu 0x%x: Exception %lx %s in xmon, "
497 "returning to main loop\n",
498 cpu, regs->trap, getvecname(TRAP(regs)));
499 release_output_lock();
500 longjmp(xmon_fault_jmp[cpu], 1);
503 if (setjmp(recurse_jmp) != 0) {
504 if (!in_xmon || !xmon_gate) {
506 printf("xmon: WARNING: bad recursive fault "
507 "on cpu 0x%x\n", cpu);
508 release_output_lock();
511 secondary = !(xmon_taken && cpu == xmon_owner);
515 xmon_fault_jmp[cpu] = recurse_jmp;
518 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
519 bp = at_breakpoint(regs->nip);
520 if (bp || unrecoverable_excp(regs))
527 printf("cpu 0x%x stopped at breakpoint 0x%tx (",
529 xmon_print_symbol(regs->nip, " ", ")\n");
531 if (unrecoverable_excp(regs))
532 printf("WARNING: exception is not recoverable, "
534 release_output_lock();
537 cpumask_set_cpu(cpu, &cpus_in_xmon);
542 while (secondary && !xmon_gate) {
548 secondary = test_and_set_bit(0, &in_xmon);
551 touch_nmi_watchdog();
555 if (!secondary && !xmon_gate) {
556 /* we are the first cpu to come in */
557 /* interrupt other cpu(s) */
558 int ncpus = num_online_cpus();
564 * A system reset (trap == 0x100) can be triggered on
565 * all CPUs, so when we come in via 0x100 try waiting
566 * for the other CPUs to come in before we send the
567 * debugger break (IPI). This is similar to
568 * crash_kexec_secondary().
570 if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
571 smp_send_debugger_break();
573 wait_for_other_cpus(ncpus);
576 disable_surveillance();
577 /* for breakpoint or single step, print the current instr. */
578 if (bp || TRAP(regs) == 0xd00)
579 ppc_inst_dump(regs->nip, 1, 0);
580 printf("enter ? for help\n");
584 touch_nmi_watchdog();
591 if (cpu == xmon_owner) {
592 if (!test_and_set_bit(0, &xmon_taken)) {
598 while (cpu == xmon_owner)
602 touch_nmi_watchdog();
613 /* have switched to some other cpu */
618 cpumask_clear_cpu(cpu, &cpus_in_xmon);
619 xmon_fault_jmp[cpu] = NULL;
621 /* UP is simple... */
623 printf("Exception %lx %s in xmon, returning to main loop\n",
624 regs->trap, getvecname(TRAP(regs)));
625 longjmp(xmon_fault_jmp[0], 1);
627 if (setjmp(recurse_jmp) == 0) {
628 xmon_fault_jmp[0] = recurse_jmp;
632 bp = at_breakpoint(regs->nip);
634 printf("Stopped at breakpoint %tx (", BP_NUM(bp));
635 xmon_print_symbol(regs->nip, " ", ")\n");
637 if (unrecoverable_excp(regs))
638 printf("WARNING: exception is not recoverable, "
641 disable_surveillance();
642 /* for breakpoint or single step, print the current instr. */
643 if (bp || TRAP(regs) == 0xd00)
644 ppc_inst_dump(regs->nip, 1, 0);
645 printf("enter ? for help\n");
655 if (regs->msr & MSR_DE) {
656 bp = at_breakpoint(regs->nip);
658 regs->nip = (unsigned long) &bp->instr[0];
659 atomic_inc(&bp->ref_count);
663 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
664 bp = at_breakpoint(regs->nip);
666 int stepped = emulate_step(regs, bp->instr[0]);
668 regs->nip = (unsigned long) &bp->instr[0];
669 atomic_inc(&bp->ref_count);
670 } else if (stepped < 0) {
671 printf("Couldn't single-step %s instruction\n",
672 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
679 touch_nmi_watchdog();
680 local_irq_restore(flags);
682 return cmd != 'X' && cmd != EOF;
685 int xmon(struct pt_regs *excp)
690 ppc_save_regs(®s);
694 return xmon_core(excp, 0);
698 irqreturn_t xmon_irq(int irq, void *d)
701 local_irq_save(flags);
702 printf("Keyboard interrupt\n");
703 xmon(get_irq_regs());
704 local_irq_restore(flags);
708 static int xmon_bpt(struct pt_regs *regs)
711 unsigned long offset;
713 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
716 /* Are we at the trap at bp->instr[1] for some bp? */
717 bp = in_breakpoint_table(regs->nip, &offset);
718 if (bp != NULL && offset == 4) {
719 regs->nip = bp->address + 4;
720 atomic_dec(&bp->ref_count);
724 /* Are we at a breakpoint? */
725 bp = at_breakpoint(regs->nip);
734 static int xmon_sstep(struct pt_regs *regs)
742 static int xmon_break_match(struct pt_regs *regs)
744 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
746 if (dabr.enabled == 0)
752 static int xmon_iabr_match(struct pt_regs *regs)
754 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
762 static int xmon_ipi(struct pt_regs *regs)
765 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
771 static int xmon_fault_handler(struct pt_regs *regs)
774 unsigned long offset;
776 if (in_xmon && catch_memory_errors)
777 handle_fault(regs); /* doesn't return */
779 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
780 bp = in_breakpoint_table(regs->nip, &offset);
782 regs->nip = bp->address + offset;
783 atomic_dec(&bp->ref_count);
790 /* Force enable xmon if not already enabled */
791 static inline void force_enable_xmon(void)
793 /* Enable xmon hooks if needed */
795 printf("xmon: Enabling debugger hooks\n");
800 static struct bpt *at_breakpoint(unsigned long pc)
806 for (i = 0; i < NBPTS; ++i, ++bp)
807 if (bp->enabled && pc == bp->address)
812 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
816 off = nip - (unsigned long) bpts;
817 if (off >= sizeof(bpts))
819 off %= sizeof(struct bpt);
820 if (off != offsetof(struct bpt, instr[0])
821 && off != offsetof(struct bpt, instr[1]))
823 *offp = off - offsetof(struct bpt, instr[0]);
824 return (struct bpt *) (nip - off);
827 static struct bpt *new_breakpoint(unsigned long a)
832 bp = at_breakpoint(a);
836 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
837 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
839 bp->instr[1] = bpinstr;
840 store_inst(&bp->instr[1]);
845 printf("Sorry, no free breakpoints. Please clear one first.\n");
849 static void insert_bpts(void)
855 for (i = 0; i < NBPTS; ++i, ++bp) {
856 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
858 if (mread(bp->address, &bp->instr[0], 4) != 4) {
859 printf("Couldn't read instruction at %lx, "
860 "disabling breakpoint there\n", bp->address);
864 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
865 printf("Breakpoint at %lx is on an mtmsrd or rfid "
866 "instruction, disabling it\n", bp->address);
870 store_inst(&bp->instr[0]);
871 if (bp->enabled & BP_CIABR)
873 if (patch_instruction((unsigned int *)bp->address,
875 printf("Couldn't write instruction at %lx, "
876 "disabling breakpoint there\n", bp->address);
877 bp->enabled &= ~BP_TRAP;
880 store_inst((void *)bp->address);
884 static void insert_cpu_bpts(void)
886 struct arch_hw_breakpoint brk;
889 brk.address = dabr.address;
890 brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
892 __set_breakpoint(&brk);
896 set_ciabr(iabr->address);
899 static void remove_bpts(void)
906 for (i = 0; i < NBPTS; ++i, ++bp) {
907 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
909 if (mread(bp->address, &instr, 4) == 4
911 && patch_instruction(
912 (unsigned int *)bp->address, bp->instr[0]) != 0)
913 printf("Couldn't remove breakpoint at %lx\n",
916 store_inst((void *)bp->address);
920 static void remove_cpu_bpts(void)
922 hw_breakpoint_disable();
926 /* Based on uptime_proc_show(). */
930 struct timespec64 uptime;
932 if (setjmp(bus_error_jmp) == 0) {
933 catch_memory_errors = 1;
936 ktime_get_coarse_boottime_ts64(&uptime);
937 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
938 ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
943 catch_memory_errors = 0;
946 static void set_lpp_cmd(void)
950 if (!scanhex(&lpp)) {
951 printf("Invalid number.\n");
954 xmon_set_pagination_lpp(lpp);
956 /* Command interpreting routine */
957 static char *last_cmd;
960 cmds(struct pt_regs *excp)
967 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
971 printf("%x:", smp_processor_id());
972 #endif /* CONFIG_SMP */
978 if (last_cmd == NULL)
980 take_input(last_cmd);
1018 prregs(excp); /* print regs */
1033 if (do_spu_cmd() == 0)
1040 if (tracing_enabled)
1044 printf(" <no input ...>\n");
1048 xmon_puts(help_string);
1055 printf(xmon_ro_msg);
1072 printf(xmon_ro_msg);
1080 #ifdef CONFIG_PPC_BOOK3S
1084 #elif defined(CONFIG_44x)
1088 #elif defined(CONFIG_PPC_BOOK3E)
1097 printf("Unrecognized command: ");
1099 if (' ' < cmd && cmd <= '~')
1102 printf("\\x%x", cmd);
1104 } while (cmd != '\n');
1105 printf(" (type ? for help)\n");
1112 static int do_step(struct pt_regs *regs)
1114 regs->msr |= MSR_DE;
1115 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1120 * Step a single instruction.
1121 * Some instructions we emulate, others we execute with MSR_SE set.
1123 static int do_step(struct pt_regs *regs)
1128 force_enable_xmon();
1129 /* check we are in 64-bit kernel mode, translation enabled */
1130 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1131 if (mread(regs->nip, &instr, 4) == 4) {
1132 stepped = emulate_step(regs, instr);
1134 printf("Couldn't single-step %s instruction\n",
1135 (IS_RFID(instr)? "rfid": "mtmsrd"));
1139 regs->trap = 0xd00 | (regs->trap & 1);
1140 printf("stepped to ");
1141 xmon_print_symbol(regs->nip, " ", "\n");
1142 ppc_inst_dump(regs->nip, 1, 0);
1147 regs->msr |= MSR_SE;
1152 static void bootcmds(void)
1158 ppc_md.restart(NULL);
1159 else if (cmd == 'h')
1161 else if (cmd == 'p')
1166 static int cpu_cmd(void)
1169 unsigned long cpu, first_cpu, last_cpu;
1172 if (!scanhex(&cpu)) {
1173 /* print cpus waiting or in xmon */
1174 printf("cpus stopped:");
1175 last_cpu = first_cpu = NR_CPUS;
1176 for_each_possible_cpu(cpu) {
1177 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1178 if (cpu == last_cpu + 1) {
1181 if (last_cpu != first_cpu)
1182 printf("-0x%lx", last_cpu);
1183 last_cpu = first_cpu = cpu;
1184 printf(" 0x%lx", cpu);
1188 if (last_cpu != first_cpu)
1189 printf("-0x%lx", last_cpu);
1193 /* try to switch to cpu specified */
1194 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1195 printf("cpu 0x%lx isn't in xmon\n", cpu);
1197 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1198 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1206 while (!xmon_taken) {
1207 if (--timeout == 0) {
1208 if (test_and_set_bit(0, &xmon_taken))
1210 /* take control back */
1212 xmon_owner = smp_processor_id();
1213 printf("cpu 0x%lx didn't take control\n", cpu);
1221 #endif /* CONFIG_SMP */
1224 static unsigned short fcstab[256] = {
1225 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1226 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1227 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1228 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1229 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1230 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1231 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1232 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1233 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1234 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1235 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1236 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1237 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1238 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1239 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1240 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1241 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1242 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1243 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1244 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1245 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1246 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1247 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1248 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1249 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1250 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1251 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1252 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1253 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1254 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1255 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1256 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1259 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1268 if (!scanhex(&adrs))
1270 if (!scanhex(&ncsum))
1273 for (i = 0; i < ncsum; ++i) {
1274 if (mread(adrs+i, &v, 1) == 0) {
1275 printf("csum stopped at "REG"\n", adrs+i);
1280 printf("%x\n", fcs);
1284 * Check if this is a suitable place to put a breakpoint.
1286 static long check_bp_loc(unsigned long addr)
1291 if (!is_kernel_addr(addr)) {
1292 printf("Breakpoints may only be placed at kernel addresses\n");
1295 if (!mread(addr, &instr, sizeof(instr))) {
1296 printf("Can't read instruction at address %lx\n", addr);
1299 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1300 printf("Breakpoints may not be placed on mtmsrd or rfid "
1307 static char *breakpoint_help_string =
1308 "Breakpoint command usage:\n"
1309 "b show breakpoints\n"
1310 "b <addr> [cnt] set breakpoint at given instr addr\n"
1311 "bc clear all breakpoints\n"
1312 "bc <n/addr> clear breakpoint number n or at addr\n"
1313 "bi <addr> [cnt] set hardware instr breakpoint (POWER8 only)\n"
1314 "bd <addr> [cnt] set hardware data breakpoint\n"
1327 #ifndef CONFIG_PPC_8xx
1328 static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1330 case 'd': /* bd - hardware data breakpoint */
1331 if (!ppc_breakpoint_available()) {
1332 printf("Hardware data breakpoint not supported on this cpu\n");
1339 else if (cmd == 'w')
1345 if (scanhex(&dabr.address)) {
1346 if (!is_kernel_addr(dabr.address)) {
1350 dabr.address &= ~HW_BRK_TYPE_DABR;
1351 dabr.enabled = mode | BP_DABR;
1354 force_enable_xmon();
1357 case 'i': /* bi - hardware instr breakpoint */
1358 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1359 printf("Hardware instruction breakpoint "
1360 "not supported on this cpu\n");
1364 iabr->enabled &= ~BP_CIABR;
1369 if (!check_bp_loc(a))
1371 bp = new_breakpoint(a);
1373 bp->enabled |= BP_CIABR;
1375 force_enable_xmon();
1382 /* clear all breakpoints */
1383 for (i = 0; i < NBPTS; ++i)
1384 bpts[i].enabled = 0;
1387 printf("All breakpoints cleared\n");
1391 if (a <= NBPTS && a >= 1) {
1392 /* assume a breakpoint number */
1393 bp = &bpts[a-1]; /* bp nums are 1 based */
1395 /* assume a breakpoint address */
1396 bp = at_breakpoint(a);
1398 printf("No breakpoint at %lx\n", a);
1403 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1404 xmon_print_symbol(bp->address, " ", ")\n");
1412 printf(breakpoint_help_string);
1417 /* print all breakpoints */
1418 printf(" type address\n");
1420 printf(" data "REG" [", dabr.address);
1421 if (dabr.enabled & 1)
1423 if (dabr.enabled & 2)
1427 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1430 printf("%tx %s ", BP_NUM(bp),
1431 (bp->enabled & BP_CIABR) ? "inst": "trap");
1432 xmon_print_symbol(bp->address, " ", "\n");
1437 if (!check_bp_loc(a))
1439 bp = new_breakpoint(a);
1441 bp->enabled |= BP_TRAP;
1442 force_enable_xmon();
1448 /* Very cheap human name for vector lookup. */
1450 const char *getvecname(unsigned long vec)
1455 case 0x100: ret = "(System Reset)"; break;
1456 case 0x200: ret = "(Machine Check)"; break;
1457 case 0x300: ret = "(Data Access)"; break;
1459 if (radix_enabled())
1460 ret = "(Data Access Out of Range)";
1462 ret = "(Data SLB Access)";
1464 case 0x400: ret = "(Instruction Access)"; break;
1466 if (radix_enabled())
1467 ret = "(Instruction Access Out of Range)";
1469 ret = "(Instruction SLB Access)";
1471 case 0x500: ret = "(Hardware Interrupt)"; break;
1472 case 0x600: ret = "(Alignment)"; break;
1473 case 0x700: ret = "(Program Check)"; break;
1474 case 0x800: ret = "(FPU Unavailable)"; break;
1475 case 0x900: ret = "(Decrementer)"; break;
1476 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1477 case 0xa00: ret = "(Doorbell)"; break;
1478 case 0xc00: ret = "(System Call)"; break;
1479 case 0xd00: ret = "(Single Step)"; break;
1480 case 0xe40: ret = "(Emulation Assist)"; break;
1481 case 0xe60: ret = "(HMI)"; break;
1482 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1483 case 0xf00: ret = "(Performance Monitor)"; break;
1484 case 0xf20: ret = "(Altivec Unavailable)"; break;
1485 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1486 case 0x1500: ret = "(Denormalisation)"; break;
1487 case 0x1700: ret = "(Altivec Assist)"; break;
1493 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1494 unsigned long *endp)
1496 unsigned long size, offset;
1499 *startp = *endp = 0;
1502 if (setjmp(bus_error_jmp) == 0) {
1503 catch_memory_errors = 1;
1505 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1507 *startp = pc - offset;
1508 *endp = pc - offset + size;
1512 catch_memory_errors = 0;
1515 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1516 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1518 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1521 int max_to_print = 64;
1523 unsigned long newsp;
1524 unsigned long marker;
1525 struct pt_regs regs;
1527 while (max_to_print--) {
1528 if (!is_kernel_addr(sp)) {
1530 printf("SP (%lx) is in userspace\n", sp);
1534 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1535 || !mread(sp, &newsp, sizeof(unsigned long))) {
1536 printf("Couldn't read stack frame at %lx\n", sp);
1541 * For the first stack frame, try to work out if
1542 * LR and/or the saved LR value in the bottommost
1543 * stack frame are valid.
1545 if ((pc | lr) != 0) {
1546 unsigned long fnstart, fnend;
1547 unsigned long nextip;
1550 get_function_bounds(pc, &fnstart, &fnend);
1553 mread(newsp + LRSAVE_OFFSET, &nextip,
1554 sizeof(unsigned long));
1556 if (!is_kernel_addr(lr)
1557 || (fnstart <= lr && lr < fnend))
1559 } else if (lr == nextip) {
1561 } else if (is_kernel_addr(lr)
1562 && !(fnstart <= lr && lr < fnend)) {
1563 printf("[link register ] ");
1564 xmon_print_symbol(lr, " ", "\n");
1567 printf("["REG"] ", sp);
1568 xmon_print_symbol(ip, " ", " (unreliable)\n");
1573 printf("["REG"] ", sp);
1574 xmon_print_symbol(ip, " ", "\n");
1577 /* Look for "regshere" marker to see if this is
1578 an exception frame. */
1579 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1580 && marker == STACK_FRAME_REGS_MARKER) {
1581 if (mread(sp + STACK_FRAME_OVERHEAD, ®s, sizeof(regs))
1583 printf("Couldn't read registers at %lx\n",
1584 sp + STACK_FRAME_OVERHEAD);
1587 printf("--- Exception: %lx %s at ", regs.trap,
1588 getvecname(TRAP(®s)));
1591 xmon_print_symbol(pc, " ", "\n");
1601 static void backtrace(struct pt_regs *excp)
1606 xmon_show_stack(sp, 0, 0);
1608 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1612 static void print_bug_trap(struct pt_regs *regs)
1615 const struct bug_entry *bug;
1618 if (regs->msr & MSR_PR)
1619 return; /* not in kernel */
1620 addr = regs->nip; /* address of trap instruction */
1621 if (!is_kernel_addr(addr))
1623 bug = find_bug(regs->nip);
1626 if (is_warning_bug(bug))
1629 #ifdef CONFIG_DEBUG_BUGVERBOSE
1630 printf("kernel BUG at %s:%u!\n",
1631 bug->file, bug->line);
1633 printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1635 #endif /* CONFIG_BUG */
1638 static void excprint(struct pt_regs *fp)
1643 printf("cpu 0x%x: ", smp_processor_id());
1644 #endif /* CONFIG_SMP */
1647 printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1649 xmon_print_symbol(fp->nip, ": ", "\n");
1652 xmon_print_symbol(fp->link, ": ", "\n");
1654 printf(" sp: %lx\n", fp->gpr[1]);
1655 printf(" msr: %lx\n", fp->msr);
1657 if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1658 printf(" dar: %lx\n", fp->dar);
1660 printf(" dsisr: %lx\n", fp->dsisr);
1663 printf(" current = 0x%px\n", current);
1665 printf(" paca = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1666 local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1669 printf(" pid = %d, comm = %s\n",
1670 current->pid, current->comm);
1676 printf(linux_banner);
1679 static void prregs(struct pt_regs *fp)
1683 struct pt_regs regs;
1685 if (scanhex(&base)) {
1686 if (setjmp(bus_error_jmp) == 0) {
1687 catch_memory_errors = 1;
1689 regs = *(struct pt_regs *)base;
1693 catch_memory_errors = 0;
1694 printf("*** Error reading registers from "REG"\n",
1698 catch_memory_errors = 0;
1703 if (FULL_REGS(fp)) {
1704 for (n = 0; n < 16; ++n)
1705 printf("R%.2d = "REG" R%.2d = "REG"\n",
1706 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1708 for (n = 0; n < 7; ++n)
1709 printf("R%.2d = "REG" R%.2d = "REG"\n",
1710 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1713 for (n = 0; n < 32; ++n) {
1714 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1715 (n & 3) == 3? "\n": " ");
1716 if (n == 12 && !FULL_REGS(fp)) {
1723 xmon_print_symbol(fp->nip, " ", "\n");
1724 if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1726 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1729 xmon_print_symbol(fp->link, " ", "\n");
1730 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1731 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1732 fp->ctr, fp->xer, fp->trap);
1734 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1735 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1738 static void cacheflush(void)
1741 unsigned long nflush;
1746 scanhex((void *)&adrs);
1751 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1752 if (setjmp(bus_error_jmp) == 0) {
1753 catch_memory_errors = 1;
1757 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1758 cflush((void *) adrs);
1760 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1761 cinval((void *) adrs);
1764 /* wait a little while to see if we get a machine check */
1767 catch_memory_errors = 0;
1770 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1771 extern void xmon_mtspr(int spr, unsigned long value);
1774 read_spr(int n, unsigned long *vp)
1776 unsigned long ret = -1UL;
1779 if (setjmp(bus_error_jmp) == 0) {
1780 catch_spr_faults = 1;
1783 ret = xmon_mfspr(n, *vp);
1789 catch_spr_faults = 0;
1795 write_spr(int n, unsigned long val)
1798 printf(xmon_ro_msg);
1802 if (setjmp(bus_error_jmp) == 0) {
1803 catch_spr_faults = 1;
1810 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1812 catch_spr_faults = 0;
1815 static void dump_206_sprs(void)
1818 if (!cpu_has_feature(CPU_FTR_ARCH_206))
1821 /* Actually some of these pre-date 2.06, but whatevs */
1823 printf("srr0 = %.16lx srr1 = %.16lx dsisr = %.8lx\n",
1824 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1825 printf("dscr = %.16lx ppr = %.16lx pir = %.8lx\n",
1826 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1827 printf("amr = %.16lx uamor = %.16lx\n",
1828 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1830 if (!(mfmsr() & MSR_HV))
1833 printf("sdr1 = %.16lx hdar = %.16lx hdsisr = %.8lx\n",
1834 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1835 printf("hsrr0 = %.16lx hsrr1 = %.16lx hdec = %.16lx\n",
1836 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1837 printf("lpcr = %.16lx pcr = %.16lx lpidr = %.8lx\n",
1838 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1839 printf("hsprg0 = %.16lx hsprg1 = %.16lx amor = %.16lx\n",
1840 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1841 printf("dabr = %.16lx dabrx = %.16lx\n",
1842 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1846 static void dump_207_sprs(void)
1851 if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1854 printf("dpdes = %.16lx tir = %.16lx cir = %.8lx\n",
1855 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1857 printf("fscr = %.16lx tar = %.16lx pspb = %.8lx\n",
1858 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1862 /* Only if TM has been enabled in the kernel */
1863 printf("tfhar = %.16lx tfiar = %.16lx texasr = %.16lx\n",
1864 mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1865 mfspr(SPRN_TEXASR));
1868 printf("mmcr0 = %.16lx mmcr1 = %.16lx mmcr2 = %.16lx\n",
1869 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1870 printf("pmc1 = %.8lx pmc2 = %.8lx pmc3 = %.8lx pmc4 = %.8lx\n",
1871 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1872 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1873 printf("mmcra = %.16lx siar = %.16lx pmc5 = %.8lx\n",
1874 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1875 printf("sdar = %.16lx sier = %.16lx pmc6 = %.8lx\n",
1876 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1877 printf("ebbhr = %.16lx ebbrr = %.16lx bescr = %.16lx\n",
1878 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1879 printf("iamr = %.16lx\n", mfspr(SPRN_IAMR));
1881 if (!(msr & MSR_HV))
1884 printf("hfscr = %.16lx dhdes = %.16lx rpr = %.16lx\n",
1885 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1886 printf("dawr = %.16lx dawrx = %.16lx ciabr = %.16lx\n",
1887 mfspr(SPRN_DAWR), mfspr(SPRN_DAWRX), mfspr(SPRN_CIABR));
1891 static void dump_300_sprs(void)
1894 bool hv = mfmsr() & MSR_HV;
1896 if (!cpu_has_feature(CPU_FTR_ARCH_300))
1899 printf("pidr = %.16lx tidr = %.16lx\n",
1900 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
1901 printf("asdr = %.16lx psscr = %.16lx\n",
1902 mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR)
1903 : mfspr(SPRN_PSSCR_PR));
1908 printf("ptcr = %.16lx\n",
1913 static void dump_one_spr(int spr, bool show_unimplemented)
1918 if (!read_spr(spr, &val)) {
1919 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1923 if (val == 0xdeadbeef) {
1924 /* Looks like read was a nop, confirm */
1926 if (!read_spr(spr, &val)) {
1927 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1931 if (val == 0x0badcafe) {
1932 if (show_unimplemented)
1933 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
1938 printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
1941 static void super_regs(void)
1943 static unsigned long regno;
1951 unsigned long sp, toc;
1952 asm("mr %0,1" : "=r" (sp) :);
1953 asm("mr %0,2" : "=r" (toc) :);
1955 printf("msr = "REG" sprg0 = "REG"\n",
1956 mfmsr(), mfspr(SPRN_SPRG0));
1957 printf("pvr = "REG" sprg1 = "REG"\n",
1958 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1959 printf("dec = "REG" sprg2 = "REG"\n",
1960 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1961 printf("sp = "REG" sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
1962 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
1974 read_spr(regno, &val);
1976 write_spr(regno, val);
1977 dump_one_spr(regno, true);
1982 dump_one_spr(regno, true);
1986 for (spr = 1; spr < 1024; ++spr)
1987 dump_one_spr(spr, false);
1995 * Stuff for reading and writing memory safely
1998 mread(unsigned long adrs, void *buf, int size)
2004 if (setjmp(bus_error_jmp) == 0) {
2005 catch_memory_errors = 1;
2011 *(u16 *)q = *(u16 *)p;
2014 *(u32 *)q = *(u32 *)p;
2017 *(u64 *)q = *(u64 *)p;
2020 for( ; n < size; ++n) {
2026 /* wait a little while to see if we get a machine check */
2030 catch_memory_errors = 0;
2035 mwrite(unsigned long adrs, void *buf, int size)
2043 printf(xmon_ro_msg);
2047 if (setjmp(bus_error_jmp) == 0) {
2048 catch_memory_errors = 1;
2054 *(u16 *)p = *(u16 *)q;
2057 *(u32 *)p = *(u32 *)q;
2060 *(u64 *)p = *(u64 *)q;
2063 for ( ; n < size; ++n) {
2069 /* wait a little while to see if we get a machine check */
2073 printf("*** Error writing address "REG"\n", adrs + n);
2075 catch_memory_errors = 0;
2079 static int fault_type;
2080 static int fault_except;
2081 static char *fault_chars[] = { "--", "**", "##" };
2083 static int handle_fault(struct pt_regs *regs)
2085 fault_except = TRAP(regs);
2086 switch (TRAP(regs)) {
2098 longjmp(bus_error_jmp, 1);
2103 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
2106 byterev(unsigned char *val, int size)
2112 SWAP(val[0], val[1], t);
2115 SWAP(val[0], val[3], t);
2116 SWAP(val[1], val[2], t);
2118 case 8: /* is there really any use for this? */
2119 SWAP(val[0], val[7], t);
2120 SWAP(val[1], val[6], t);
2121 SWAP(val[2], val[5], t);
2122 SWAP(val[3], val[4], t);
2130 static char *memex_help_string =
2131 "Memory examine command usage:\n"
2132 "m [addr] [flags] examine/change memory\n"
2133 " addr is optional. will start where left off.\n"
2134 " flags may include chars from this set:\n"
2135 " b modify by bytes (default)\n"
2136 " w modify by words (2 byte)\n"
2137 " l modify by longs (4 byte)\n"
2138 " d modify by doubleword (8 byte)\n"
2139 " r toggle reverse byte order mode\n"
2140 " n do not read memory (for i/o spaces)\n"
2141 " . ok to read (default)\n"
2142 "NOTE: flags are saved as defaults\n"
2145 static char *memex_subcmd_help_string =
2146 "Memory examine subcommands:\n"
2147 " hexval write this val to current location\n"
2148 " 'string' write chars from string to this location\n"
2149 " ' increment address\n"
2150 " ^ decrement address\n"
2151 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
2152 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
2153 " ` clear no-read flag\n"
2154 " ; stay at this addr\n"
2155 " v change to byte mode\n"
2156 " w change to word (2 byte) mode\n"
2157 " l change to long (4 byte) mode\n"
2158 " u change to doubleword (8 byte) mode\n"
2159 " m addr change current addr\n"
2160 " n toggle no-read flag\n"
2161 " r toggle byte reverse flag\n"
2162 " < count back up count bytes\n"
2163 " > count skip forward count bytes\n"
2164 " x exit this mode\n"
2170 int cmd, inc, i, nslash;
2172 unsigned char val[16];
2174 scanhex((void *)&adrs);
2177 printf(memex_help_string);
2183 while ((cmd = skipbl()) != '\n') {
2185 case 'b': size = 1; break;
2186 case 'w': size = 2; break;
2187 case 'l': size = 4; break;
2188 case 'd': size = 8; break;
2189 case 'r': brev = !brev; break;
2190 case 'n': mnoread = 1; break;
2191 case '.': mnoread = 0; break;
2200 n = mread(adrs, val, size);
2201 printf(REG"%c", adrs, brev? 'r': ' ');
2206 for (i = 0; i < n; ++i)
2207 printf("%.2x", val[i]);
2208 for (; i < size; ++i)
2209 printf("%s", fault_chars[fault_type]);
2216 for (i = 0; i < size; ++i)
2217 val[i] = n >> (i * 8);
2220 mwrite(adrs, val, size);
2233 else if( n == '\'' )
2235 for (i = 0; i < size; ++i)
2236 val[i] = n >> (i * 8);
2239 mwrite(adrs, val, size);
2275 adrs -= 1 << nslash;
2279 adrs += 1 << nslash;
2283 adrs += 1 << -nslash;
2287 adrs -= 1 << -nslash;
2290 scanhex((void *)&adrs);
2309 printf(memex_subcmd_help_string);
2324 case 'n': c = '\n'; break;
2325 case 'r': c = '\r'; break;
2326 case 'b': c = '\b'; break;
2327 case 't': c = '\t'; break;
2332 static void xmon_rawdump (unsigned long adrs, long ndump)
2335 unsigned char temp[16];
2337 for (n = ndump; n > 0;) {
2339 nr = mread(adrs, temp, r);
2341 for (m = 0; m < r; ++m) {
2343 printf("%.2x", temp[m]);
2345 printf("%s", fault_chars[fault_type]);
2354 static void dump_tracing(void)
2360 ftrace_dump(DUMP_ORIG);
2362 ftrace_dump(DUMP_ALL);
2366 static void dump_one_paca(int cpu)
2368 struct paca_struct *p;
2369 #ifdef CONFIG_PPC_BOOK3S_64
2373 if (setjmp(bus_error_jmp) != 0) {
2374 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2378 catch_memory_errors = 1;
2383 printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2385 printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2386 printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2387 printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2389 #define DUMP(paca, name, format) \
2390 printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2391 offsetof(struct paca_struct, name));
2393 DUMP(p, lock_token, "%#-*x");
2394 DUMP(p, paca_index, "%#-*x");
2395 DUMP(p, kernel_toc, "%#-*llx");
2396 DUMP(p, kernelbase, "%#-*llx");
2397 DUMP(p, kernel_msr, "%#-*llx");
2398 DUMP(p, emergency_sp, "%-*px");
2399 #ifdef CONFIG_PPC_BOOK3S_64
2400 DUMP(p, nmi_emergency_sp, "%-*px");
2401 DUMP(p, mc_emergency_sp, "%-*px");
2402 DUMP(p, in_nmi, "%#-*x");
2403 DUMP(p, in_mce, "%#-*x");
2404 DUMP(p, hmi_event_available, "%#-*x");
2406 DUMP(p, data_offset, "%#-*llx");
2407 DUMP(p, hw_cpu_id, "%#-*x");
2408 DUMP(p, cpu_start, "%#-*x");
2409 DUMP(p, kexec_state, "%#-*x");
2410 #ifdef CONFIG_PPC_BOOK3S_64
2411 if (!early_radix_enabled()) {
2412 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2415 if (!p->slb_shadow_ptr)
2418 esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2419 vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2422 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2423 22, "slb_shadow", i, esid, vsid);
2426 DUMP(p, vmalloc_sllp, "%#-*x");
2427 DUMP(p, stab_rr, "%#-*x");
2428 DUMP(p, slb_used_bitmap, "%#-*x");
2429 DUMP(p, slb_kern_bitmap, "%#-*x");
2431 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2432 DUMP(p, slb_cache_ptr, "%#-*x");
2433 for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2434 printf(" %-*s[%d] = 0x%016x\n",
2435 22, "slb_cache", i, p->slb_cache[i]);
2439 DUMP(p, rfi_flush_fallback_area, "%-*px");
2441 DUMP(p, dscr_default, "%#-*llx");
2442 #ifdef CONFIG_PPC_BOOK3E
2443 DUMP(p, pgd, "%-*px");
2444 DUMP(p, kernel_pgd, "%-*px");
2445 DUMP(p, tcd_ptr, "%-*px");
2446 DUMP(p, mc_kstack, "%-*px");
2447 DUMP(p, crit_kstack, "%-*px");
2448 DUMP(p, dbg_kstack, "%-*px");
2450 DUMP(p, __current, "%-*px");
2451 DUMP(p, kstack, "%#-*llx");
2452 printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2453 #ifdef CONFIG_STACKPROTECTOR
2454 DUMP(p, canary, "%#-*lx");
2456 DUMP(p, saved_r1, "%#-*llx");
2457 DUMP(p, trap_save, "%#-*x");
2458 DUMP(p, irq_soft_mask, "%#-*x");
2459 DUMP(p, irq_happened, "%#-*x");
2460 #ifdef CONFIG_MMIOWB
2461 DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2462 DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2464 DUMP(p, irq_work_pending, "%#-*x");
2465 DUMP(p, sprg_vdso, "%#-*llx");
2467 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2468 DUMP(p, tm_scratch, "%#-*llx");
2471 #ifdef CONFIG_PPC_POWERNV
2472 DUMP(p, idle_state, "%#-*lx");
2473 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2474 DUMP(p, thread_idle_state, "%#-*x");
2475 DUMP(p, subcore_sibling_mask, "%#-*x");
2477 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2478 DUMP(p, requested_psscr, "%#-*llx");
2479 DUMP(p, dont_stop.counter, "%#-*x");
2484 DUMP(p, accounting.utime, "%#-*lx");
2485 DUMP(p, accounting.stime, "%#-*lx");
2486 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2487 DUMP(p, accounting.utime_scaled, "%#-*lx");
2489 DUMP(p, accounting.starttime, "%#-*lx");
2490 DUMP(p, accounting.starttime_user, "%#-*lx");
2491 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2492 DUMP(p, accounting.startspurr, "%#-*lx");
2493 DUMP(p, accounting.utime_sspurr, "%#-*lx");
2495 DUMP(p, accounting.steal_time, "%#-*lx");
2498 catch_memory_errors = 0;
2502 static void dump_all_pacas(void)
2506 if (num_possible_cpus() == 0) {
2507 printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2511 for_each_possible_cpu(cpu)
2515 static void dump_pacas(void)
2526 termch = c; /* Put c back, it wasn't 'a' */
2531 dump_one_paca(xmon_owner);
2535 #ifdef CONFIG_PPC_POWERNV
2536 static void dump_one_xive(int cpu)
2538 unsigned int hwid = get_hard_smp_processor_id(cpu);
2540 opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2541 opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2542 opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2543 opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2544 opal_xive_dump(XIVE_DUMP_VP, hwid);
2545 opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2547 if (setjmp(bus_error_jmp) != 0) {
2548 catch_memory_errors = 0;
2549 printf("*** Error dumping xive on cpu %d\n", cpu);
2553 catch_memory_errors = 1;
2555 xmon_xive_do_dump(cpu);
2558 catch_memory_errors = 0;
2561 static void dump_all_xives(void)
2565 if (num_possible_cpus() == 0) {
2566 printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2570 for_each_possible_cpu(cpu)
2574 static void dump_one_xive_irq(u32 num)
2581 rc = opal_xive_get_irq_config(num, &vp, &prio, &lirq);
2582 xmon_printf("IRQ 0x%x config: vp=0x%llx prio=%d lirq=0x%x (rc=%lld)\n",
2583 num, be64_to_cpu(vp), prio, be32_to_cpu(lirq), rc);
2586 static void dump_xives(void)
2591 if (!xive_enabled()) {
2592 printf("Xive disabled on this system\n");
2600 } else if (c == 'i') {
2602 dump_one_xive_irq(num);
2606 termch = c; /* Put c back, it wasn't 'a' */
2611 dump_one_xive(xmon_owner);
2613 #endif /* CONFIG_PPC_POWERNV */
2615 static void dump_by_size(unsigned long addr, long count, int size)
2617 unsigned char temp[16];
2621 count = ALIGN(count, 16);
2623 for (i = 0; i < count; i += 16, addr += 16) {
2626 if (mread(addr, temp, 16) != 16) {
2627 printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2631 for (j = 0; j < 16; j += size) {
2634 case 1: val = temp[j]; break;
2635 case 2: val = *(u16 *)&temp[j]; break;
2636 case 4: val = *(u32 *)&temp[j]; break;
2637 case 8: val = *(u64 *)&temp[j]; break;
2641 printf("%0*llx", size * 2, val);
2650 static char last[] = { "d?\n" };
2657 xmon_start_pagination();
2659 xmon_end_pagination();
2663 #ifdef CONFIG_PPC_POWERNV
2665 xmon_start_pagination();
2667 xmon_end_pagination();
2680 scanhex((void *)&adrs);
2687 else if (nidump > MAX_DUMP)
2689 adrs += ppc_inst_dump(adrs, nidump, 1);
2691 } else if (c == 'l') {
2693 } else if (c == 'o') {
2695 } else if (c == 'v') {
2696 /* dump virtual to physical translation */
2698 } else if (c == 'r') {
2702 xmon_rawdump(adrs, ndump);
2709 else if (ndump > MAX_DUMP)
2717 ndump = ALIGN(ndump, 16);
2718 dump_by_size(adrs, ndump, c - '0');
2723 prdump(adrs, ndump);
2732 prdump(unsigned long adrs, long ndump)
2734 long n, m, c, r, nr;
2735 unsigned char temp[16];
2737 for (n = ndump; n > 0;) {
2741 nr = mread(adrs, temp, r);
2743 for (m = 0; m < r; ++m) {
2744 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2747 printf("%.2x", temp[m]);
2749 printf("%s", fault_chars[fault_type]);
2751 for (; m < 16; ++m) {
2752 if ((m & (sizeof(long) - 1)) == 0)
2757 for (m = 0; m < r; ++m) {
2760 putchar(' ' <= c && c <= '~'? c: '.');
2773 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2776 generic_inst_dump(unsigned long adr, long count, int praddr,
2777 instruction_dump_func dump_func)
2780 unsigned long first_adr;
2781 unsigned int inst, last_inst = 0;
2782 unsigned char val[4];
2785 for (first_adr = adr; count > 0; --count, adr += 4) {
2786 nr = mread(adr, val, 4);
2789 const char *x = fault_chars[fault_type];
2790 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2794 inst = GETWORD(val);
2795 if (adr > first_adr && inst == last_inst) {
2805 printf(REG" %.8x", adr, inst);
2807 dump_func(inst, adr);
2810 return adr - first_adr;
2814 ppc_inst_dump(unsigned long adr, long count, int praddr)
2816 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2820 print_address(unsigned long addr)
2822 xmon_print_symbol(addr, "\t# ", "");
2828 struct kmsg_dumper dumper = { .active = 1 };
2829 unsigned char buf[128];
2832 if (setjmp(bus_error_jmp) != 0) {
2833 printf("Error dumping printk buffer!\n");
2837 catch_memory_errors = 1;
2840 kmsg_dump_rewind_nolock(&dumper);
2841 xmon_start_pagination();
2842 while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2846 xmon_end_pagination();
2849 /* wait a little while to see if we get a machine check */
2851 catch_memory_errors = 0;
2854 #ifdef CONFIG_PPC_POWERNV
2855 static void dump_opal_msglog(void)
2857 unsigned char buf[128];
2861 if (!firmware_has_feature(FW_FEATURE_OPAL)) {
2862 printf("Machine is not running OPAL firmware.\n");
2866 if (setjmp(bus_error_jmp) != 0) {
2867 printf("Error dumping OPAL msglog!\n");
2871 catch_memory_errors = 1;
2874 xmon_start_pagination();
2875 while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
2877 printf("Error dumping OPAL msglog! Error: %zd\n", res);
2884 xmon_end_pagination();
2887 /* wait a little while to see if we get a machine check */
2889 catch_memory_errors = 0;
2894 * Memory operations - move, set, print differences
2896 static unsigned long mdest; /* destination address */
2897 static unsigned long msrc; /* source address */
2898 static unsigned long mval; /* byte value to set memory to */
2899 static unsigned long mcount; /* # bytes to affect */
2900 static unsigned long mdiffs; /* max # differences to print */
2905 scanhex((void *)&mdest);
2906 if( termch != '\n' )
2908 scanhex((void *)(cmd == 's'? &mval: &msrc));
2909 if( termch != '\n' )
2911 scanhex((void *)&mcount);
2915 printf(xmon_ro_msg);
2918 memmove((void *)mdest, (void *)msrc, mcount);
2922 printf(xmon_ro_msg);
2925 memset((void *)mdest, mval, mcount);
2928 if( termch != '\n' )
2930 scanhex((void *)&mdiffs);
2931 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2937 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2942 for( n = nb; n > 0; --n )
2943 if( *p1++ != *p2++ )
2944 if( ++prt <= maxpr )
2945 printf("%px %.2x # %px %.2x\n", p1 - 1,
2946 p1[-1], p2 - 1, p2[-1]);
2948 printf("Total of %d differences\n", prt);
2951 static unsigned mend;
2952 static unsigned mask;
2958 unsigned char val[4];
2961 scanhex((void *)&mdest);
2962 if (termch != '\n') {
2964 scanhex((void *)&mend);
2965 if (termch != '\n') {
2967 scanhex((void *)&mval);
2969 if (termch != '\n') termch = 0;
2970 scanhex((void *)&mask);
2974 for (a = mdest; a < mend; a += 4) {
2975 if (mread(a, val, 4) == 4
2976 && ((GETWORD(val) ^ mval) & mask) == 0) {
2977 printf("%.16x: %.16x\n", a, GETWORD(val));
2984 static unsigned long mskip = 0x1000;
2985 static unsigned long mlim = 0xffffffff;
2995 if (termch != '\n') termch = 0;
2997 if (termch != '\n') termch = 0;
3000 for (a = mdest; a < mlim; a += mskip) {
3001 ok = mread(a, &v, 1);
3003 printf("%.8x .. ", a);
3004 } else if (!ok && ook)
3005 printf("%.8lx\n", a - mskip);
3011 printf("%.8lx\n", a - mskip);
3014 static void show_task(struct task_struct *tsk)
3019 * Cloned from kdb_task_state_char(), which is not entirely
3020 * appropriate for calling from xmon. This could be moved
3021 * to a common, generic, routine used by both.
3023 state = (tsk->state == 0) ? 'R' :
3024 (tsk->state < 0) ? 'U' :
3025 (tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
3026 (tsk->state & TASK_STOPPED) ? 'T' :
3027 (tsk->state & TASK_TRACED) ? 'C' :
3028 (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3029 (tsk->exit_state & EXIT_DEAD) ? 'E' :
3030 (tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3032 printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
3034 tsk->pid, rcu_dereference(tsk->parent)->pid,
3035 state, task_cpu(tsk),
3039 #ifdef CONFIG_PPC_BOOK3S_64
3040 static void format_pte(void *ptep, unsigned long pte)
3042 pte_t entry = __pte(pte);
3044 printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3045 printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3047 printf("Flags = %s%s%s%s%s\n",
3048 pte_young(entry) ? "Accessed " : "",
3049 pte_dirty(entry) ? "Dirty " : "",
3050 pte_read(entry) ? "Read " : "",
3051 pte_write(entry) ? "Write " : "",
3052 pte_exec(entry) ? "Exec " : "");
3055 static void show_pte(unsigned long addr)
3057 unsigned long tskv = 0;
3058 struct task_struct *tsk = NULL;
3059 struct mm_struct *mm;
3060 pgd_t *pgdp, *pgdir;
3065 if (!scanhex(&tskv))
3068 tsk = (struct task_struct *)tskv;
3073 mm = tsk->active_mm;
3075 if (setjmp(bus_error_jmp) != 0) {
3076 catch_memory_errors = 0;
3077 printf("*** Error dumping pte for task %px\n", tsk);
3081 catch_memory_errors = 1;
3084 if (mm == &init_mm) {
3085 pgdp = pgd_offset_k(addr);
3086 pgdir = pgd_offset_k(0);
3088 pgdp = pgd_offset(mm, addr);
3089 pgdir = pgd_offset(mm, 0);
3092 if (pgd_none(*pgdp)) {
3093 printf("no linux page table for address\n");
3097 printf("pgd @ 0x%px\n", pgdir);
3099 if (pgd_huge(*pgdp)) {
3100 format_pte(pgdp, pgd_val(*pgdp));
3103 printf("pgdp @ 0x%px = 0x%016lx\n", pgdp, pgd_val(*pgdp));
3105 pudp = pud_offset(pgdp, addr);
3107 if (pud_none(*pudp)) {
3108 printf("No valid PUD\n");
3112 if (pud_huge(*pudp)) {
3113 format_pte(pudp, pud_val(*pudp));
3117 printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3119 pmdp = pmd_offset(pudp, addr);
3121 if (pmd_none(*pmdp)) {
3122 printf("No valid PMD\n");
3126 if (pmd_huge(*pmdp)) {
3127 format_pte(pmdp, pmd_val(*pmdp));
3130 printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3132 ptep = pte_offset_map(pmdp, addr);
3133 if (pte_none(*ptep)) {
3134 printf("no valid PTE\n");
3138 format_pte(ptep, pte_val(*ptep));
3142 catch_memory_errors = 0;
3145 static void show_pte(unsigned long addr)
3147 printf("show_pte not yet implemented\n");
3149 #endif /* CONFIG_PPC_BOOK3S_64 */
3151 static void show_tasks(void)
3154 struct task_struct *tsk = NULL;
3156 printf(" task_struct ->thread.ksp PID PPID S P CMD\n");
3159 tsk = (struct task_struct *)tskv;
3161 if (setjmp(bus_error_jmp) != 0) {
3162 catch_memory_errors = 0;
3163 printf("*** Error dumping task %px\n", tsk);
3167 catch_memory_errors = 1;
3173 for_each_process(tsk)
3178 catch_memory_errors = 0;
3181 static void proccall(void)
3183 unsigned long args[8];
3186 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3187 unsigned long, unsigned long, unsigned long,
3188 unsigned long, unsigned long, unsigned long);
3191 if (!scanhex(&adrs))
3195 for (i = 0; i < 8; ++i)
3197 for (i = 0; i < 8; ++i) {
3198 if (!scanhex(&args[i]) || termch == '\n')
3202 func = (callfunc_t) adrs;
3204 if (setjmp(bus_error_jmp) == 0) {
3205 catch_memory_errors = 1;
3207 ret = func(args[0], args[1], args[2], args[3],
3208 args[4], args[5], args[6], args[7]);
3210 printf("return value is 0x%lx\n", ret);
3212 printf("*** %x exception occurred\n", fault_except);
3214 catch_memory_errors = 0;
3217 /* Input scanning routines */
3228 while( c == ' ' || c == '\t' )
3234 static const char *regnames[N_PTREGS] = {
3235 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3236 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3237 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3238 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3239 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3245 "trap", "dar", "dsisr", "res"
3249 scanhex(unsigned long *vp)
3256 /* parse register name */
3260 for (i = 0; i < sizeof(regname) - 1; ++i) {
3269 i = match_string(regnames, N_PTREGS, regname);
3271 printf("invalid register name '%%%s'\n", regname);
3274 if (xmon_regs == NULL) {
3275 printf("regs not available\n");
3278 *vp = ((unsigned long *)xmon_regs)[i];
3282 /* skip leading "0x" if any */
3296 } else if (c == '$') {
3298 for (i=0; i<63; i++) {
3300 if (isspace(c) || c == '\0') {
3308 if (setjmp(bus_error_jmp) == 0) {
3309 catch_memory_errors = 1;
3311 *vp = kallsyms_lookup_name(tmpstr);
3314 catch_memory_errors = 0;
3316 printf("unknown symbol '%s'\n", tmpstr);
3349 static int hexdigit(int c)
3351 if( '0' <= c && c <= '9' )
3353 if( 'A' <= c && c <= 'F' )
3354 return c - ('A' - 10);
3355 if( 'a' <= c && c <= 'f' )
3356 return c - ('a' - 10);
3361 getstring(char *s, int size)
3372 } while( c != ' ' && c != '\t' && c != '\n' );
3377 static char line[256];
3378 static char *lineptr;
3389 if (lineptr == NULL || *lineptr == 0) {
3390 if (xmon_gets(line, sizeof(line)) == NULL) {
3400 take_input(char *str)
3409 int type = inchar();
3410 unsigned long addr, cpu;
3411 void __percpu *ptr = NULL;
3412 static char tmp[64];
3417 xmon_print_symbol(addr, ": ", "\n");
3422 if (setjmp(bus_error_jmp) == 0) {
3423 catch_memory_errors = 1;
3425 addr = kallsyms_lookup_name(tmp);
3427 printf("%s: %lx\n", tmp, addr);
3429 printf("Symbol '%s' not found.\n", tmp);
3432 catch_memory_errors = 0;
3437 if (setjmp(bus_error_jmp) == 0) {
3438 catch_memory_errors = 1;
3440 ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3445 ptr >= (void __percpu *)__per_cpu_start &&
3446 ptr < (void __percpu *)__per_cpu_end)
3448 if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3449 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3451 cpu = raw_smp_processor_id();
3452 addr = (unsigned long)this_cpu_ptr(ptr);
3455 printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3457 printf("Percpu symbol '%s' not found.\n", tmp);
3460 catch_memory_errors = 0;
3467 /* Print an address in numeric and symbolic form (if possible) */
3468 static void xmon_print_symbol(unsigned long address, const char *mid,
3472 const char *name = NULL;
3473 unsigned long offset, size;
3475 printf(REG, address);
3476 if (setjmp(bus_error_jmp) == 0) {
3477 catch_memory_errors = 1;
3479 name = kallsyms_lookup(address, &size, &offset, &modname,
3482 /* wait a little while to see if we get a machine check */
3486 catch_memory_errors = 0;
3489 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3491 printf(" [%s]", modname);
3493 printf("%s", after);
3496 #ifdef CONFIG_PPC_BOOK3S_64
3497 void dump_segments(void)
3500 unsigned long esid,vsid;
3503 printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3505 for (i = 0; i < mmu_slb_size; i++) {
3506 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
3507 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
3512 printf("%02d %016lx %016lx", i, esid, vsid);
3514 if (!(esid & SLB_ESID_V)) {
3519 llp = vsid & SLB_VSID_LLP;
3520 if (vsid & SLB_VSID_B_1T) {
3521 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
3523 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3526 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
3528 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3535 #ifdef CONFIG_PPC_BOOK3S_32
3536 void dump_segments(void)
3541 for (i = 0; i < 16; ++i)
3542 printf(" %x", mfsrin(i << 28));
3548 static void dump_tlb_44x(void)
3552 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3553 unsigned long w0,w1,w2;
3554 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
3555 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
3556 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
3557 printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3558 if (w0 & PPC44x_TLB_VALID) {
3559 printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3560 w0 & PPC44x_TLB_EPN_MASK,
3561 w1 & PPC44x_TLB_ERPN_MASK,
3562 w1 & PPC44x_TLB_RPN_MASK,
3563 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3564 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3565 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3566 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3567 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3572 #endif /* CONFIG_44x */
3574 #ifdef CONFIG_PPC_BOOK3E
3575 static void dump_tlb_book3e(void)
3577 u32 mmucfg, pidmask, lpidmask;
3579 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3581 static const char *pgsz_names[] = {
3616 /* Gather some infos about the MMU */
3617 mmucfg = mfspr(SPRN_MMUCFG);
3618 mmu_version = (mmucfg & 3) + 1;
3619 ntlbs = ((mmucfg >> 2) & 3) + 1;
3620 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3621 lpidsz = (mmucfg >> 24) & 0xf;
3622 rasz = (mmucfg >> 16) & 0x7f;
3623 if ((mmu_version > 1) && (mmucfg & 0x10000))
3625 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3626 mmu_version, ntlbs, pidsz, lpidsz, rasz);
3627 pidmask = (1ul << pidsz) - 1;
3628 lpidmask = (1ul << lpidsz) - 1;
3629 ramask = (1ull << rasz) - 1;
3631 for (tlb = 0; tlb < ntlbs; tlb++) {
3633 int nent, assoc, new_cc = 1;
3634 printf("TLB %d:\n------\n", tlb);
3637 tlbcfg = mfspr(SPRN_TLB0CFG);
3640 tlbcfg = mfspr(SPRN_TLB1CFG);
3643 tlbcfg = mfspr(SPRN_TLB2CFG);
3646 tlbcfg = mfspr(SPRN_TLB3CFG);
3649 printf("Unsupported TLB number !\n");
3652 nent = tlbcfg & 0xfff;
3653 assoc = (tlbcfg >> 24) & 0xff;
3654 for (i = 0; i < nent; i++) {
3655 u32 mas0 = MAS0_TLBSEL(tlb);
3656 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3659 int esel = i, cc = i;
3667 mas0 |= MAS0_ESEL(esel);
3668 mtspr(SPRN_MAS0, mas0);
3669 mtspr(SPRN_MAS1, mas1);
3670 mtspr(SPRN_MAS2, mas2);
3671 asm volatile("tlbre 0,0,0" : : : "memory");
3672 mas1 = mfspr(SPRN_MAS1);
3673 mas2 = mfspr(SPRN_MAS2);
3674 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3675 if (assoc && (i % assoc) == 0)
3677 if (!(mas1 & MAS1_VALID))
3680 printf("%04x- ", i);
3682 printf("%04x-%c", cc, 'A' + esel);
3684 printf(" |%c", 'A' + esel);
3686 printf(" %016llx %04x %s %c%c AS%c",
3688 (mas1 >> 16) & 0x3fff,
3689 pgsz_names[(mas1 >> 7) & 0x1f],
3690 mas1 & MAS1_IND ? 'I' : ' ',
3691 mas1 & MAS1_IPROT ? 'P' : ' ',
3692 mas1 & MAS1_TS ? '1' : '0');
3693 printf(" %c%c%c%c%c%c%c",
3694 mas2 & MAS2_X0 ? 'a' : ' ',
3695 mas2 & MAS2_X1 ? 'v' : ' ',
3696 mas2 & MAS2_W ? 'w' : ' ',
3697 mas2 & MAS2_I ? 'i' : ' ',
3698 mas2 & MAS2_M ? 'm' : ' ',
3699 mas2 & MAS2_G ? 'g' : ' ',
3700 mas2 & MAS2_E ? 'e' : ' ');
3701 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3702 if (mas1 & MAS1_IND)
3704 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3706 printf(" U%c%c%c S%c%c%c\n",
3707 mas7_mas3 & MAS3_UX ? 'x' : ' ',
3708 mas7_mas3 & MAS3_UW ? 'w' : ' ',
3709 mas7_mas3 & MAS3_UR ? 'r' : ' ',
3710 mas7_mas3 & MAS3_SX ? 'x' : ' ',
3711 mas7_mas3 & MAS3_SW ? 'w' : ' ',
3712 mas7_mas3 & MAS3_SR ? 'r' : ' ');
3716 #endif /* CONFIG_PPC_BOOK3E */
3718 static void xmon_init(int enable)
3722 __debugger_ipi = xmon_ipi;
3723 __debugger_bpt = xmon_bpt;
3724 __debugger_sstep = xmon_sstep;
3725 __debugger_iabr_match = xmon_iabr_match;
3726 __debugger_break_match = xmon_break_match;
3727 __debugger_fault_handler = xmon_fault_handler;
3729 #ifdef CONFIG_PPC_PSERIES
3731 * Get the token here to avoid trying to get a lock
3732 * during the crash, causing a deadlock.
3734 set_indicator_token = rtas_token("set-indicator");
3738 __debugger_ipi = NULL;
3739 __debugger_bpt = NULL;
3740 __debugger_sstep = NULL;
3741 __debugger_iabr_match = NULL;
3742 __debugger_break_match = NULL;
3743 __debugger_fault_handler = NULL;
3747 #ifdef CONFIG_MAGIC_SYSRQ
3748 static void sysrq_handle_xmon(int key)
3750 /* ensure xmon is enabled */
3752 debugger(get_irq_regs());
3757 static struct sysrq_key_op sysrq_xmon_op = {
3758 .handler = sysrq_handle_xmon,
3759 .help_msg = "xmon(x)",
3760 .action_msg = "Entering xmon",
3763 static int __init setup_xmon_sysrq(void)
3765 register_sysrq_key('x', &sysrq_xmon_op);
3768 device_initcall(setup_xmon_sysrq);
3769 #endif /* CONFIG_MAGIC_SYSRQ */
3771 #ifdef CONFIG_DEBUG_FS
3772 static void clear_all_bpt(void)
3776 /* clear/unpatch all breakpoints */
3780 /* Disable all breakpoints */
3781 for (i = 0; i < NBPTS; ++i)
3782 bpts[i].enabled = 0;
3784 /* Clear any data or iabr breakpoints */
3785 if (iabr || dabr.enabled) {
3790 printf("xmon: All breakpoints cleared\n");
3793 static int xmon_dbgfs_set(void *data, u64 val)
3798 /* make sure all breakpoints removed when disabling */
3804 static int xmon_dbgfs_get(void *data, u64 *val)
3810 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3811 xmon_dbgfs_set, "%llu\n");
3813 static int __init setup_xmon_dbgfs(void)
3815 debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3819 device_initcall(setup_xmon_dbgfs);
3820 #endif /* CONFIG_DEBUG_FS */
3822 static int xmon_early __initdata;
3824 static int __init early_parse_xmon(char *p)
3826 if (!p || strncmp(p, "early", 5) == 0) {
3827 /* just "xmon" is equivalent to "xmon=early" */
3831 } else if (strncmp(p, "on", 2) == 0) {
3834 } else if (strncmp(p, "rw", 2) == 0) {
3838 } else if (strncmp(p, "ro", 2) == 0) {
3842 } else if (strncmp(p, "off", 3) == 0)
3849 early_param("xmon", early_parse_xmon);
3851 void __init xmon_setup(void)
3859 #ifdef CONFIG_SPU_BASE
3863 u64 saved_mfc_sr1_RW;
3864 u32 saved_spu_runcntl_RW;
3865 unsigned long dump_addr;
3869 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
3871 static struct spu_info spu_info[XMON_NUM_SPUS];
3873 void xmon_register_spus(struct list_head *list)
3877 list_for_each_entry(spu, list, full_list) {
3878 if (spu->number >= XMON_NUM_SPUS) {
3883 spu_info[spu->number].spu = spu;
3884 spu_info[spu->number].stopped_ok = 0;
3885 spu_info[spu->number].dump_addr = (unsigned long)
3886 spu_info[spu->number].spu->local_store;
3890 static void stop_spus(void)
3896 for (i = 0; i < XMON_NUM_SPUS; i++) {
3897 if (!spu_info[i].spu)
3900 if (setjmp(bus_error_jmp) == 0) {
3901 catch_memory_errors = 1;
3904 spu = spu_info[i].spu;
3906 spu_info[i].saved_spu_runcntl_RW =
3907 in_be32(&spu->problem->spu_runcntl_RW);
3909 tmp = spu_mfc_sr1_get(spu);
3910 spu_info[i].saved_mfc_sr1_RW = tmp;
3912 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3913 spu_mfc_sr1_set(spu, tmp);
3918 spu_info[i].stopped_ok = 1;
3920 printf("Stopped spu %.2d (was %s)\n", i,
3921 spu_info[i].saved_spu_runcntl_RW ?
3922 "running" : "stopped");
3924 catch_memory_errors = 0;
3925 printf("*** Error stopping spu %.2d\n", i);
3927 catch_memory_errors = 0;
3931 static void restart_spus(void)
3936 for (i = 0; i < XMON_NUM_SPUS; i++) {
3937 if (!spu_info[i].spu)
3940 if (!spu_info[i].stopped_ok) {
3941 printf("*** Error, spu %d was not successfully stopped"
3942 ", not restarting\n", i);
3946 if (setjmp(bus_error_jmp) == 0) {
3947 catch_memory_errors = 1;
3950 spu = spu_info[i].spu;
3951 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3952 out_be32(&spu->problem->spu_runcntl_RW,
3953 spu_info[i].saved_spu_runcntl_RW);
3958 printf("Restarted spu %.2d\n", i);
3960 catch_memory_errors = 0;
3961 printf("*** Error restarting spu %.2d\n", i);
3963 catch_memory_errors = 0;
3967 #define DUMP_WIDTH 23
3968 #define DUMP_VALUE(format, field, value) \
3970 if (setjmp(bus_error_jmp) == 0) { \
3971 catch_memory_errors = 1; \
3973 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3978 catch_memory_errors = 0; \
3979 printf(" %-*s = *** Error reading field.\n", \
3980 DUMP_WIDTH, #field); \
3982 catch_memory_errors = 0; \
3985 #define DUMP_FIELD(obj, format, field) \
3986 DUMP_VALUE(format, field, obj->field)
3988 static void dump_spu_fields(struct spu *spu)
3990 printf("Dumping spu fields at address %p:\n", spu);
3992 DUMP_FIELD(spu, "0x%x", number);
3993 DUMP_FIELD(spu, "%s", name);
3994 DUMP_FIELD(spu, "0x%lx", local_store_phys);
3995 DUMP_FIELD(spu, "0x%p", local_store);
3996 DUMP_FIELD(spu, "0x%lx", ls_size);
3997 DUMP_FIELD(spu, "0x%x", node);
3998 DUMP_FIELD(spu, "0x%lx", flags);
3999 DUMP_FIELD(spu, "%llu", class_0_pending);
4000 DUMP_FIELD(spu, "0x%llx", class_0_dar);
4001 DUMP_FIELD(spu, "0x%llx", class_1_dar);
4002 DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4003 DUMP_FIELD(spu, "0x%x", irqs[0]);
4004 DUMP_FIELD(spu, "0x%x", irqs[1]);
4005 DUMP_FIELD(spu, "0x%x", irqs[2]);
4006 DUMP_FIELD(spu, "0x%x", slb_replace);
4007 DUMP_FIELD(spu, "%d", pid);
4008 DUMP_FIELD(spu, "0x%p", mm);
4009 DUMP_FIELD(spu, "0x%p", ctx);
4010 DUMP_FIELD(spu, "0x%p", rq);
4011 DUMP_FIELD(spu, "0x%llx", timestamp);
4012 DUMP_FIELD(spu, "0x%lx", problem_phys);
4013 DUMP_FIELD(spu, "0x%p", problem);
4014 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4015 in_be32(&spu->problem->spu_runcntl_RW));
4016 DUMP_VALUE("0x%x", problem->spu_status_R,
4017 in_be32(&spu->problem->spu_status_R));
4018 DUMP_VALUE("0x%x", problem->spu_npc_RW,
4019 in_be32(&spu->problem->spu_npc_RW));
4020 DUMP_FIELD(spu, "0x%p", priv2);
4021 DUMP_FIELD(spu, "0x%p", pdata);
4025 spu_inst_dump(unsigned long adr, long count, int praddr)
4027 return generic_inst_dump(adr, count, praddr, print_insn_spu);
4030 static void dump_spu_ls(unsigned long num, int subcmd)
4032 unsigned long offset, addr, ls_addr;
4034 if (setjmp(bus_error_jmp) == 0) {
4035 catch_memory_errors = 1;
4037 ls_addr = (unsigned long)spu_info[num].spu->local_store;
4041 catch_memory_errors = 0;
4042 printf("*** Error: accessing spu info for spu %ld\n", num);
4045 catch_memory_errors = 0;
4047 if (scanhex(&offset))
4048 addr = ls_addr + offset;
4050 addr = spu_info[num].dump_addr;
4052 if (addr >= ls_addr + LS_SIZE) {
4053 printf("*** Error: address outside of local store\n");
4059 addr += spu_inst_dump(addr, 16, 1);
4069 spu_info[num].dump_addr = addr;
4072 static int do_spu_cmd(void)
4074 static unsigned long num = 0;
4075 int cmd, subcmd = 0;
4087 if (isxdigit(subcmd) || subcmd == '\n')
4092 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4093 printf("*** Error: invalid spu number\n");
4099 dump_spu_fields(spu_info[num].spu);
4102 dump_spu_ls(num, subcmd);
4113 #else /* ! CONFIG_SPU_BASE */
4114 static int do_spu_cmd(void)