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/cpumask.h>
21 #include <linux/export.h>
22 #include <linux/sysrq.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/bug.h>
27 #include <asm/ptrace.h>
28 #include <asm/string.h>
30 #include <asm/machdep.h>
32 #include <asm/processor.h>
33 #include <asm/pgtable.h>
35 #include <asm/mmu_context.h>
36 #include <asm/cputable.h>
38 #include <asm/sstep.h>
39 #include <asm/irq_regs.h>
41 #include <asm/spu_priv1.h>
42 #include <asm/setjmp.h>
44 #include <asm/debug.h>
47 #include <asm/hvcall.h>
54 #define scanhex xmon_scanhex
55 #define skipbl xmon_skipbl
58 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
59 static unsigned long xmon_taken = 1;
60 static int xmon_owner;
62 #endif /* CONFIG_SMP */
64 static unsigned long in_xmon __read_mostly = 0;
66 static unsigned long adrs;
68 #define MAX_DUMP (128 * 1024)
69 static unsigned long ndump = 64;
70 static unsigned long nidump = 16;
71 static unsigned long ncsum = 4096;
73 static char tmpstr[128];
75 static long bus_error_jmp[JMP_BUF_LEN];
76 static int catch_memory_errors;
77 static long *xmon_fault_jmp[NR_CPUS];
79 /* Breakpoint stuff */
81 unsigned long address;
82 unsigned int instr[2];
88 /* Bits in bpt.enabled */
89 #define BP_IABR_TE 1 /* IABR translation enabled */
95 static struct bpt bpts[NBPTS];
96 static struct bpt dabr;
97 static struct bpt *iabr;
98 static unsigned bpinstr = 0x7fe00008; /* trap */
100 #define BP_NUM(bp) ((bp) - bpts + 1)
103 static int cmds(struct pt_regs *);
104 static int mread(unsigned long, void *, int);
105 static int mwrite(unsigned long, void *, int);
106 static int handle_fault(struct pt_regs *);
107 static void byterev(unsigned char *, int);
108 static void memex(void);
109 static int bsesc(void);
110 static void dump(void);
111 static void prdump(unsigned long, long);
112 static int ppc_inst_dump(unsigned long, long, int);
113 static void dump_log_buf(void);
114 static void backtrace(struct pt_regs *);
115 static void excprint(struct pt_regs *);
116 static void prregs(struct pt_regs *);
117 static void memops(int);
118 static void memlocate(void);
119 static void memzcan(void);
120 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
122 int scanhex(unsigned long *valp);
123 static void scannl(void);
124 static int hexdigit(int);
125 void getstring(char *, int);
126 static void flush_input(void);
127 static int inchar(void);
128 static void take_input(char *);
129 static unsigned long read_spr(int);
130 static void write_spr(int, unsigned long);
131 static void super_regs(void);
132 static void remove_bpts(void);
133 static void insert_bpts(void);
134 static void remove_cpu_bpts(void);
135 static void insert_cpu_bpts(void);
136 static struct bpt *at_breakpoint(unsigned long pc);
137 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
138 static int do_step(struct pt_regs *);
139 static void bpt_cmds(void);
140 static void cacheflush(void);
141 static void xmon_show_dmesg(void);
142 static int cpu_cmd(void);
143 static void csum(void);
144 static void bootcmds(void);
145 static void proccall(void);
146 void dump_segments(void);
147 static void symbol_lookup(void);
148 static void xmon_show_stack(unsigned long sp, unsigned long lr,
150 static void xmon_print_symbol(unsigned long address, const char *mid,
152 static const char *getvecname(unsigned long vec);
154 static int do_spu_cmd(void);
157 static void dump_tlb_44x(void);
159 #ifdef CONFIG_PPC_BOOK3E
160 static void dump_tlb_book3e(void);
163 static int xmon_no_auto_backtrace;
165 extern void xmon_enter(void);
166 extern void xmon_leave(void);
170 #define REGS_PER_LINE 4
171 #define LAST_VOLATILE 13
174 #define REGS_PER_LINE 8
175 #define LAST_VOLATILE 12
178 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
180 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
181 || ('a' <= (c) && (c) <= 'f') \
182 || ('A' <= (c) && (c) <= 'F'))
183 #define isalnum(c) (('0' <= (c) && (c) <= '9') \
184 || ('a' <= (c) && (c) <= 'z') \
185 || ('A' <= (c) && (c) <= 'Z'))
186 #define isspace(c) (c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
188 static char *help_string = "\
190 b show breakpoints\n\
191 bd set data breakpoint\n\
192 bi set instruction breakpoint\n\
193 bc clear breakpoint\n"
196 c print cpus stopped in xmon\n\
197 c# try to switch to cpu number h (in hex)\n"
201 D show dmesg (printk) buffer\n\
203 di dump instructions\n\
204 df dump float values\n\
205 dd dump double values\n\
206 dl dump the kernel log buffer\n\
207 dr dump stream of raw bytes\n\
208 e print exception information\n\
210 la lookup symbol+offset of specified address\n\
211 ls lookup address of specified symbol\n\
212 m examine/change memory\n\
213 mm move a block of memory\n\
214 ms set a block of memory\n\
215 md compare two blocks of memory\n\
216 ml locate a block of memory\n\
217 mz zero a block of memory\n\
218 mi show information about memory allocation\n\
219 p call a procedure\n\
222 #ifdef CONFIG_SPU_BASE
223 " ss stop execution on all spus\n\
224 sr restore execution on stopped spus\n\
225 sf # dump spu fields for spu # (in hex)\n\
226 sd # dump spu local store for spu # (in hex)\n\
227 sdi # disassemble spu local store for spu # (in hex)\n"
229 " S print special registers\n\
231 x exit monitor and recover\n\
232 X exit monitor and dont recover\n"
233 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
234 " u dump segment table or SLB\n"
235 #elif defined(CONFIG_PPC_STD_MMU_32)
236 " u dump segment registers\n"
237 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
245 static struct pt_regs *xmon_regs;
247 static inline void sync(void)
249 asm volatile("sync; isync");
252 static inline void store_inst(void *p)
254 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
257 static inline void cflush(void *p)
259 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
262 static inline void cinval(void *p)
264 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
268 * Disable surveillance (the service processor watchdog function)
269 * while we are in xmon.
270 * XXX we should re-enable it when we leave. :)
272 #define SURVEILLANCE_TOKEN 9000
274 static inline void disable_surveillance(void)
276 #ifdef CONFIG_PPC_PSERIES
277 /* Since this can't be a module, args should end up below 4GB. */
278 static struct rtas_args args;
281 * At this point we have got all the cpus we can into
282 * xmon, so there is hopefully no other cpu calling RTAS
283 * at the moment, even though we don't take rtas.lock.
284 * If we did try to take rtas.lock there would be a
285 * real possibility of deadlock.
287 args.token = rtas_token("set-indicator");
288 if (args.token == RTAS_UNKNOWN_SERVICE)
292 args.rets = &args.args[3];
293 args.args[0] = SURVEILLANCE_TOKEN;
296 enter_rtas(__pa(&args));
297 #endif /* CONFIG_PPC_PSERIES */
301 static int xmon_speaker;
303 static void get_output_lock(void)
305 int me = smp_processor_id() + 0x100;
306 int last_speaker = 0, prev;
309 if (xmon_speaker == me)
312 if (xmon_speaker == 0) {
313 last_speaker = cmpxchg(&xmon_speaker, 0, me);
314 if (last_speaker == 0)
318 while (xmon_speaker == last_speaker) {
321 /* hostile takeover */
322 prev = cmpxchg(&xmon_speaker, last_speaker, me);
323 if (prev == last_speaker)
330 static void release_output_lock(void)
335 int cpus_are_in_xmon(void)
337 return !cpumask_empty(&cpus_in_xmon);
341 static inline int unrecoverable_excp(struct pt_regs *regs)
343 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
344 /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
347 return ((regs->msr & MSR_RI) == 0);
351 static int xmon_core(struct pt_regs *regs, int fromipi)
355 long recurse_jmp[JMP_BUF_LEN];
356 unsigned long offset;
361 unsigned long timeout;
364 local_irq_save(flags);
366 bp = in_breakpoint_table(regs->nip, &offset);
368 regs->nip = bp->address + offset;
369 atomic_dec(&bp->ref_count);
375 cpu = smp_processor_id();
376 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
379 printf("cpu 0x%x: Exception %lx %s in xmon, "
380 "returning to main loop\n",
381 cpu, regs->trap, getvecname(TRAP(regs)));
382 release_output_lock();
383 longjmp(xmon_fault_jmp[cpu], 1);
386 if (setjmp(recurse_jmp) != 0) {
387 if (!in_xmon || !xmon_gate) {
389 printf("xmon: WARNING: bad recursive fault "
390 "on cpu 0x%x\n", cpu);
391 release_output_lock();
394 secondary = !(xmon_taken && cpu == xmon_owner);
398 xmon_fault_jmp[cpu] = recurse_jmp;
399 cpumask_set_cpu(cpu, &cpus_in_xmon);
402 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
403 bp = at_breakpoint(regs->nip);
404 if (bp || unrecoverable_excp(regs))
411 printf("cpu 0x%x stopped at breakpoint 0x%x (",
413 xmon_print_symbol(regs->nip, " ", ")\n");
415 if (unrecoverable_excp(regs))
416 printf("WARNING: exception is not recoverable, "
418 release_output_lock();
423 while (secondary && !xmon_gate) {
427 secondary = test_and_set_bit(0, &in_xmon);
432 if (!secondary && !xmon_gate) {
433 /* we are the first cpu to come in */
434 /* interrupt other cpu(s) */
435 int ncpus = num_online_cpus();
440 smp_send_debugger_break();
441 /* wait for other cpus to come in */
442 for (timeout = 100000000; timeout != 0; --timeout) {
443 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
449 disable_surveillance();
450 /* for breakpoint or single step, print the current instr. */
451 if (bp || TRAP(regs) == 0xd00)
452 ppc_inst_dump(regs->nip, 1, 0);
453 printf("enter ? for help\n");
462 if (cpu == xmon_owner) {
463 if (!test_and_set_bit(0, &xmon_taken)) {
468 while (cpu == xmon_owner)
482 /* have switched to some other cpu */
487 cpumask_clear_cpu(cpu, &cpus_in_xmon);
488 xmon_fault_jmp[cpu] = NULL;
490 /* UP is simple... */
492 printf("Exception %lx %s in xmon, returning to main loop\n",
493 regs->trap, getvecname(TRAP(regs)));
494 longjmp(xmon_fault_jmp[0], 1);
496 if (setjmp(recurse_jmp) == 0) {
497 xmon_fault_jmp[0] = recurse_jmp;
501 bp = at_breakpoint(regs->nip);
503 printf("Stopped at breakpoint %x (", BP_NUM(bp));
504 xmon_print_symbol(regs->nip, " ", ")\n");
506 if (unrecoverable_excp(regs))
507 printf("WARNING: exception is not recoverable, "
510 disable_surveillance();
511 /* for breakpoint or single step, print the current instr. */
512 if (bp || TRAP(regs) == 0xd00)
513 ppc_inst_dump(regs->nip, 1, 0);
514 printf("enter ? for help\n");
524 if (regs->msr & MSR_DE) {
525 bp = at_breakpoint(regs->nip);
527 regs->nip = (unsigned long) &bp->instr[0];
528 atomic_inc(&bp->ref_count);
532 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
533 bp = at_breakpoint(regs->nip);
535 int stepped = emulate_step(regs, bp->instr[0]);
537 regs->nip = (unsigned long) &bp->instr[0];
538 atomic_inc(&bp->ref_count);
539 } else if (stepped < 0) {
540 printf("Couldn't single-step %s instruction\n",
541 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
548 local_irq_restore(flags);
550 return cmd != 'X' && cmd != EOF;
553 int xmon(struct pt_regs *excp)
558 ppc_save_regs(®s);
562 return xmon_core(excp, 0);
566 irqreturn_t xmon_irq(int irq, void *d)
569 local_irq_save(flags);
570 printf("Keyboard interrupt\n");
571 xmon(get_irq_regs());
572 local_irq_restore(flags);
576 static int xmon_bpt(struct pt_regs *regs)
579 unsigned long offset;
581 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
584 /* Are we at the trap at bp->instr[1] for some bp? */
585 bp = in_breakpoint_table(regs->nip, &offset);
586 if (bp != NULL && offset == 4) {
587 regs->nip = bp->address + 4;
588 atomic_dec(&bp->ref_count);
592 /* Are we at a breakpoint? */
593 bp = at_breakpoint(regs->nip);
602 static int xmon_sstep(struct pt_regs *regs)
610 static int xmon_dabr_match(struct pt_regs *regs)
612 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
614 if (dabr.enabled == 0)
620 static int xmon_iabr_match(struct pt_regs *regs)
622 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
630 static int xmon_ipi(struct pt_regs *regs)
633 if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
639 static int xmon_fault_handler(struct pt_regs *regs)
642 unsigned long offset;
644 if (in_xmon && catch_memory_errors)
645 handle_fault(regs); /* doesn't return */
647 if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
648 bp = in_breakpoint_table(regs->nip, &offset);
650 regs->nip = bp->address + offset;
651 atomic_dec(&bp->ref_count);
658 static struct bpt *at_breakpoint(unsigned long pc)
664 for (i = 0; i < NBPTS; ++i, ++bp)
665 if (bp->enabled && pc == bp->address)
670 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
674 off = nip - (unsigned long) bpts;
675 if (off >= sizeof(bpts))
677 off %= sizeof(struct bpt);
678 if (off != offsetof(struct bpt, instr[0])
679 && off != offsetof(struct bpt, instr[1]))
681 *offp = off - offsetof(struct bpt, instr[0]);
682 return (struct bpt *) (nip - off);
685 static struct bpt *new_breakpoint(unsigned long a)
690 bp = at_breakpoint(a);
694 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
695 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
697 bp->instr[1] = bpinstr;
698 store_inst(&bp->instr[1]);
703 printf("Sorry, no free breakpoints. Please clear one first.\n");
707 static void insert_bpts(void)
713 for (i = 0; i < NBPTS; ++i, ++bp) {
714 if ((bp->enabled & (BP_TRAP|BP_IABR)) == 0)
716 if (mread(bp->address, &bp->instr[0], 4) != 4) {
717 printf("Couldn't read instruction at %lx, "
718 "disabling breakpoint there\n", bp->address);
722 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
723 printf("Breakpoint at %lx is on an mtmsrd or rfid "
724 "instruction, disabling it\n", bp->address);
728 store_inst(&bp->instr[0]);
729 if (bp->enabled & BP_IABR)
731 if (mwrite(bp->address, &bpinstr, 4) != 4) {
732 printf("Couldn't write instruction at %lx, "
733 "disabling breakpoint there\n", bp->address);
734 bp->enabled &= ~BP_TRAP;
737 store_inst((void *)bp->address);
741 static void insert_cpu_bpts(void)
744 set_dabr(dabr.address | (dabr.enabled & 7));
745 if (iabr && cpu_has_feature(CPU_FTR_IABR))
746 mtspr(SPRN_IABR, iabr->address
747 | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
750 static void remove_bpts(void)
757 for (i = 0; i < NBPTS; ++i, ++bp) {
758 if ((bp->enabled & (BP_TRAP|BP_IABR)) != BP_TRAP)
760 if (mread(bp->address, &instr, 4) == 4
762 && mwrite(bp->address, &bp->instr, 4) != 4)
763 printf("Couldn't remove breakpoint at %lx\n",
766 store_inst((void *)bp->address);
770 static void remove_cpu_bpts(void)
773 if (cpu_has_feature(CPU_FTR_IABR))
777 /* Command interpreting routine */
778 static char *last_cmd;
781 cmds(struct pt_regs *excp)
788 if (!xmon_no_auto_backtrace) {
789 xmon_no_auto_backtrace = 1;
790 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
795 printf("%x:", smp_processor_id());
796 #endif /* CONFIG_SMP */
802 if (last_cmd == NULL)
804 take_input(last_cmd);
841 prregs(excp); /* print regs */
856 if (do_spu_cmd() == 0)
865 printf(" <no input ...>\n");
869 xmon_puts(help_string);
887 #ifdef CONFIG_PPC_STD_MMU
891 #elif defined(CONFIG_4xx)
895 #elif defined(CONFIG_PPC_BOOK3E)
901 printf("Unrecognized command: ");
903 if (' ' < cmd && cmd <= '~')
906 printf("\\x%x", cmd);
908 } while (cmd != '\n');
909 printf(" (type ? for help)\n");
916 static int do_step(struct pt_regs *regs)
919 mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
924 * Step a single instruction.
925 * Some instructions we emulate, others we execute with MSR_SE set.
927 static int do_step(struct pt_regs *regs)
932 /* check we are in 64-bit kernel mode, translation enabled */
933 if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
934 if (mread(regs->nip, &instr, 4) == 4) {
935 stepped = emulate_step(regs, instr);
937 printf("Couldn't single-step %s instruction\n",
938 (IS_RFID(instr)? "rfid": "mtmsrd"));
942 regs->trap = 0xd00 | (regs->trap & 1);
943 printf("stepped to ");
944 xmon_print_symbol(regs->nip, " ", "\n");
945 ppc_inst_dump(regs->nip, 1, 0);
955 static void bootcmds(void)
961 ppc_md.restart(NULL);
968 static int cpu_cmd(void)
975 if (!scanhex(&cpu)) {
976 /* print cpus waiting or in xmon */
977 printf("cpus stopped:");
979 for (cpu = 0; cpu < NR_CPUS; ++cpu) {
980 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
986 printf("-%x", cpu - 1);
991 printf("-%x", NR_CPUS - 1);
995 /* try to switch to cpu specified */
996 if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
997 printf("cpu 0x%x isn't in xmon\n", cpu);
1004 while (!xmon_taken) {
1005 if (--timeout == 0) {
1006 if (test_and_set_bit(0, &xmon_taken))
1008 /* take control back */
1010 xmon_owner = smp_processor_id();
1011 printf("cpu %u didn't take control\n", cpu);
1019 #endif /* CONFIG_SMP */
1022 static unsigned short fcstab[256] = {
1023 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1024 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1025 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1026 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1027 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1028 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1029 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1030 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1031 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1032 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1033 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1034 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1035 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1036 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1037 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1038 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1039 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1040 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1041 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1042 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1043 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1044 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1045 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1046 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1047 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1048 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1049 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1050 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1051 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1052 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1053 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1054 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1057 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1066 if (!scanhex(&adrs))
1068 if (!scanhex(&ncsum))
1071 for (i = 0; i < ncsum; ++i) {
1072 if (mread(adrs+i, &v, 1) == 0) {
1073 printf("csum stopped at %x\n", adrs+i);
1078 printf("%x\n", fcs);
1082 * Check if this is a suitable place to put a breakpoint.
1084 static long check_bp_loc(unsigned long addr)
1089 if (!is_kernel_addr(addr)) {
1090 printf("Breakpoints may only be placed at kernel addresses\n");
1093 if (!mread(addr, &instr, sizeof(instr))) {
1094 printf("Can't read instruction at address %lx\n", addr);
1097 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1098 printf("Breakpoints may not be placed on mtmsrd or rfid "
1105 static char *breakpoint_help_string =
1106 "Breakpoint command usage:\n"
1107 "b show breakpoints\n"
1108 "b <addr> [cnt] set breakpoint at given instr addr\n"
1109 "bc clear all breakpoints\n"
1110 "bc <n/addr> clear breakpoint number n or at addr\n"
1111 "bi <addr> [cnt] set hardware instr breakpoint (POWER3/RS64 only)\n"
1112 "bd <addr> [cnt] set hardware data breakpoint\n"
1122 const char badaddr[] = "Only kernel addresses are permitted "
1123 "for breakpoints\n";
1128 case 'd': /* bd - hardware data breakpoint */
1133 else if (cmd == 'w')
1139 if (scanhex(&dabr.address)) {
1140 if (!is_kernel_addr(dabr.address)) {
1145 dabr.enabled = mode | BP_DABR;
1149 case 'i': /* bi - hardware instr breakpoint */
1150 if (!cpu_has_feature(CPU_FTR_IABR)) {
1151 printf("Hardware instruction breakpoint "
1152 "not supported on this cpu\n");
1156 iabr->enabled &= ~(BP_IABR | BP_IABR_TE);
1161 if (!check_bp_loc(a))
1163 bp = new_breakpoint(a);
1165 bp->enabled |= BP_IABR | BP_IABR_TE;
1173 /* clear all breakpoints */
1174 for (i = 0; i < NBPTS; ++i)
1175 bpts[i].enabled = 0;
1178 printf("All breakpoints cleared\n");
1182 if (a <= NBPTS && a >= 1) {
1183 /* assume a breakpoint number */
1184 bp = &bpts[a-1]; /* bp nums are 1 based */
1186 /* assume a breakpoint address */
1187 bp = at_breakpoint(a);
1189 printf("No breakpoint at %x\n", a);
1194 printf("Cleared breakpoint %x (", BP_NUM(bp));
1195 xmon_print_symbol(bp->address, " ", ")\n");
1203 printf(breakpoint_help_string);
1208 /* print all breakpoints */
1209 printf(" type address\n");
1211 printf(" data "REG" [", dabr.address);
1212 if (dabr.enabled & 1)
1214 if (dabr.enabled & 2)
1218 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1221 printf("%2x %s ", BP_NUM(bp),
1222 (bp->enabled & BP_IABR)? "inst": "trap");
1223 xmon_print_symbol(bp->address, " ", "\n");
1228 if (!check_bp_loc(a))
1230 bp = new_breakpoint(a);
1232 bp->enabled |= BP_TRAP;
1237 /* Very cheap human name for vector lookup. */
1239 const char *getvecname(unsigned long vec)
1244 case 0x100: ret = "(System Reset)"; break;
1245 case 0x200: ret = "(Machine Check)"; break;
1246 case 0x300: ret = "(Data Access)"; break;
1247 case 0x380: ret = "(Data SLB Access)"; break;
1248 case 0x400: ret = "(Instruction Access)"; break;
1249 case 0x480: ret = "(Instruction SLB Access)"; break;
1250 case 0x500: ret = "(Hardware Interrupt)"; break;
1251 case 0x600: ret = "(Alignment)"; break;
1252 case 0x700: ret = "(Program Check)"; break;
1253 case 0x800: ret = "(FPU Unavailable)"; break;
1254 case 0x900: ret = "(Decrementer)"; break;
1255 case 0xc00: ret = "(System Call)"; break;
1256 case 0xd00: ret = "(Single Step)"; break;
1257 case 0xf00: ret = "(Performance Monitor)"; break;
1258 case 0xf20: ret = "(Altivec Unavailable)"; break;
1259 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1265 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1266 unsigned long *endp)
1268 unsigned long size, offset;
1271 *startp = *endp = 0;
1274 if (setjmp(bus_error_jmp) == 0) {
1275 catch_memory_errors = 1;
1277 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1279 *startp = pc - offset;
1280 *endp = pc - offset + size;
1284 catch_memory_errors = 0;
1287 static int xmon_depth_to_print = 64;
1289 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1290 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
1292 #ifdef __powerpc64__
1293 #define REGS_OFFSET 0x70
1295 #define REGS_OFFSET 16
1298 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1302 unsigned long newsp;
1303 unsigned long marker;
1305 struct pt_regs regs;
1308 if (sp < PAGE_OFFSET) {
1310 printf("SP (%lx) is in userspace\n", sp);
1314 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1315 || !mread(sp, &newsp, sizeof(unsigned long))) {
1316 printf("Couldn't read stack frame at %lx\n", sp);
1321 * For the first stack frame, try to work out if
1322 * LR and/or the saved LR value in the bottommost
1323 * stack frame are valid.
1325 if ((pc | lr) != 0) {
1326 unsigned long fnstart, fnend;
1327 unsigned long nextip;
1330 get_function_bounds(pc, &fnstart, &fnend);
1333 mread(newsp + LRSAVE_OFFSET, &nextip,
1334 sizeof(unsigned long));
1336 if (lr < PAGE_OFFSET
1337 || (fnstart <= lr && lr < fnend))
1339 } else if (lr == nextip) {
1341 } else if (lr >= PAGE_OFFSET
1342 && !(fnstart <= lr && lr < fnend)) {
1343 printf("[link register ] ");
1344 xmon_print_symbol(lr, " ", "\n");
1347 printf("["REG"] ", sp);
1348 xmon_print_symbol(ip, " ", " (unreliable)\n");
1353 printf("["REG"] ", sp);
1354 xmon_print_symbol(ip, " ", "\n");
1357 /* Look for "regshere" marker to see if this is
1358 an exception frame. */
1359 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1360 && marker == STACK_FRAME_REGS_MARKER) {
1361 if (mread(sp + REGS_OFFSET, ®s, sizeof(regs))
1363 printf("Couldn't read registers at %lx\n",
1367 printf("--- Exception: %lx %s at ", regs.trap,
1368 getvecname(TRAP(®s)));
1371 xmon_print_symbol(pc, " ", "\n");
1378 } while (count++ < xmon_depth_to_print);
1381 static void backtrace(struct pt_regs *excp)
1386 xmon_show_stack(sp, 0, 0);
1388 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1392 static void print_bug_trap(struct pt_regs *regs)
1395 const struct bug_entry *bug;
1398 if (regs->msr & MSR_PR)
1399 return; /* not in kernel */
1400 addr = regs->nip; /* address of trap instruction */
1401 if (addr < PAGE_OFFSET)
1403 bug = find_bug(regs->nip);
1406 if (is_warning_bug(bug))
1409 #ifdef CONFIG_DEBUG_BUGVERBOSE
1410 printf("kernel BUG at %s:%u!\n",
1411 bug->file, bug->line);
1413 printf("kernel BUG at %p!\n", (void *)bug->bug_addr);
1415 #endif /* CONFIG_BUG */
1418 static void excprint(struct pt_regs *fp)
1423 printf("cpu 0x%x: ", smp_processor_id());
1424 #endif /* CONFIG_SMP */
1427 printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp);
1429 xmon_print_symbol(fp->nip, ": ", "\n");
1431 printf(" lr: ", fp->link);
1432 xmon_print_symbol(fp->link, ": ", "\n");
1434 printf(" sp: %lx\n", fp->gpr[1]);
1435 printf(" msr: %lx\n", fp->msr);
1437 if (trap == 0x300 || trap == 0x380 || trap == 0x600) {
1438 printf(" dar: %lx\n", fp->dar);
1440 printf(" dsisr: %lx\n", fp->dsisr);
1443 printf(" current = 0x%lx\n", current);
1445 printf(" paca = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n",
1446 local_paca, local_paca->soft_enabled, local_paca->irq_happened);
1449 printf(" pid = %ld, comm = %s\n",
1450 current->pid, current->comm);
1457 static void prregs(struct pt_regs *fp)
1461 struct pt_regs regs;
1463 if (scanhex(&base)) {
1464 if (setjmp(bus_error_jmp) == 0) {
1465 catch_memory_errors = 1;
1467 regs = *(struct pt_regs *)base;
1471 catch_memory_errors = 0;
1472 printf("*** Error reading registers from "REG"\n",
1476 catch_memory_errors = 0;
1481 if (FULL_REGS(fp)) {
1482 for (n = 0; n < 16; ++n)
1483 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1484 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1486 for (n = 0; n < 7; ++n)
1487 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1488 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1491 for (n = 0; n < 32; ++n) {
1492 printf("R%.2d = %.8x%s", n, fp->gpr[n],
1493 (n & 3) == 3? "\n": " ");
1494 if (n == 12 && !FULL_REGS(fp)) {
1501 xmon_print_symbol(fp->nip, " ", "\n");
1502 if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1504 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1507 xmon_print_symbol(fp->link, " ", "\n");
1508 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1509 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1510 fp->ctr, fp->xer, fp->trap);
1512 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1513 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1516 static void cacheflush(void)
1519 unsigned long nflush;
1524 scanhex((void *)&adrs);
1529 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1530 if (setjmp(bus_error_jmp) == 0) {
1531 catch_memory_errors = 1;
1535 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1536 cflush((void *) adrs);
1538 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1539 cinval((void *) adrs);
1542 /* wait a little while to see if we get a machine check */
1545 catch_memory_errors = 0;
1548 static unsigned long
1551 unsigned int instrs[2];
1552 unsigned long (*code)(void);
1553 unsigned long ret = -1UL;
1555 unsigned long opd[3];
1557 opd[0] = (unsigned long)instrs;
1560 code = (unsigned long (*)(void)) opd;
1562 code = (unsigned long (*)(void)) instrs;
1565 /* mfspr r3,n; blr */
1566 instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1567 instrs[1] = 0x4e800020;
1569 store_inst(instrs+1);
1571 if (setjmp(bus_error_jmp) == 0) {
1572 catch_memory_errors = 1;
1578 /* wait a little while to see if we get a machine check */
1587 write_spr(int n, unsigned long val)
1589 unsigned int instrs[2];
1590 unsigned long (*code)(unsigned long);
1592 unsigned long opd[3];
1594 opd[0] = (unsigned long)instrs;
1597 code = (unsigned long (*)(unsigned long)) opd;
1599 code = (unsigned long (*)(unsigned long)) instrs;
1602 instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1603 instrs[1] = 0x4e800020;
1605 store_inst(instrs+1);
1607 if (setjmp(bus_error_jmp) == 0) {
1608 catch_memory_errors = 1;
1614 /* wait a little while to see if we get a machine check */
1620 static unsigned long regno;
1621 extern char exc_prolog;
1622 extern char dec_exc;
1624 static void super_regs(void)
1631 unsigned long sp, toc;
1632 asm("mr %0,1" : "=r" (sp) :);
1633 asm("mr %0,2" : "=r" (toc) :);
1635 printf("msr = "REG" sprg0= "REG"\n",
1636 mfmsr(), mfspr(SPRN_SPRG0));
1637 printf("pvr = "REG" sprg1= "REG"\n",
1638 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1639 printf("dec = "REG" sprg2= "REG"\n",
1640 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1641 printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3));
1642 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
1650 val = read_spr(regno);
1652 write_spr(regno, val);
1655 printf("spr %lx = %lx\n", regno, read_spr(regno));
1662 * Stuff for reading and writing memory safely
1665 mread(unsigned long adrs, void *buf, int size)
1671 if (setjmp(bus_error_jmp) == 0) {
1672 catch_memory_errors = 1;
1678 *(u16 *)q = *(u16 *)p;
1681 *(u32 *)q = *(u32 *)p;
1684 *(u64 *)q = *(u64 *)p;
1687 for( ; n < size; ++n) {
1693 /* wait a little while to see if we get a machine check */
1697 catch_memory_errors = 0;
1702 mwrite(unsigned long adrs, void *buf, int size)
1708 if (setjmp(bus_error_jmp) == 0) {
1709 catch_memory_errors = 1;
1715 *(u16 *)p = *(u16 *)q;
1718 *(u32 *)p = *(u32 *)q;
1721 *(u64 *)p = *(u64 *)q;
1724 for ( ; n < size; ++n) {
1730 /* wait a little while to see if we get a machine check */
1734 printf("*** Error writing address %x\n", adrs + n);
1736 catch_memory_errors = 0;
1740 static int fault_type;
1741 static int fault_except;
1742 static char *fault_chars[] = { "--", "**", "##" };
1744 static int handle_fault(struct pt_regs *regs)
1746 fault_except = TRAP(regs);
1747 switch (TRAP(regs)) {
1759 longjmp(bus_error_jmp, 1);
1764 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
1767 byterev(unsigned char *val, int size)
1773 SWAP(val[0], val[1], t);
1776 SWAP(val[0], val[3], t);
1777 SWAP(val[1], val[2], t);
1779 case 8: /* is there really any use for this? */
1780 SWAP(val[0], val[7], t);
1781 SWAP(val[1], val[6], t);
1782 SWAP(val[2], val[5], t);
1783 SWAP(val[3], val[4], t);
1791 static char *memex_help_string =
1792 "Memory examine command usage:\n"
1793 "m [addr] [flags] examine/change memory\n"
1794 " addr is optional. will start where left off.\n"
1795 " flags may include chars from this set:\n"
1796 " b modify by bytes (default)\n"
1797 " w modify by words (2 byte)\n"
1798 " l modify by longs (4 byte)\n"
1799 " d modify by doubleword (8 byte)\n"
1800 " r toggle reverse byte order mode\n"
1801 " n do not read memory (for i/o spaces)\n"
1802 " . ok to read (default)\n"
1803 "NOTE: flags are saved as defaults\n"
1806 static char *memex_subcmd_help_string =
1807 "Memory examine subcommands:\n"
1808 " hexval write this val to current location\n"
1809 " 'string' write chars from string to this location\n"
1810 " ' increment address\n"
1811 " ^ decrement address\n"
1812 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
1813 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
1814 " ` clear no-read flag\n"
1815 " ; stay at this addr\n"
1816 " v change to byte mode\n"
1817 " w change to word (2 byte) mode\n"
1818 " l change to long (4 byte) mode\n"
1819 " u change to doubleword (8 byte) mode\n"
1820 " m addr change current addr\n"
1821 " n toggle no-read flag\n"
1822 " r toggle byte reverse flag\n"
1823 " < count back up count bytes\n"
1824 " > count skip forward count bytes\n"
1825 " x exit this mode\n"
1831 int cmd, inc, i, nslash;
1833 unsigned char val[16];
1835 scanhex((void *)&adrs);
1838 printf(memex_help_string);
1844 while ((cmd = skipbl()) != '\n') {
1846 case 'b': size = 1; break;
1847 case 'w': size = 2; break;
1848 case 'l': size = 4; break;
1849 case 'd': size = 8; break;
1850 case 'r': brev = !brev; break;
1851 case 'n': mnoread = 1; break;
1852 case '.': mnoread = 0; break;
1861 n = mread(adrs, val, size);
1862 printf(REG"%c", adrs, brev? 'r': ' ');
1867 for (i = 0; i < n; ++i)
1868 printf("%.2x", val[i]);
1869 for (; i < size; ++i)
1870 printf("%s", fault_chars[fault_type]);
1877 for (i = 0; i < size; ++i)
1878 val[i] = n >> (i * 8);
1881 mwrite(adrs, val, size);
1894 else if( n == '\'' )
1896 for (i = 0; i < size; ++i)
1897 val[i] = n >> (i * 8);
1900 mwrite(adrs, val, size);
1937 adrs -= 1 << nslash;
1941 adrs += 1 << nslash;
1945 adrs += 1 << -nslash;
1949 adrs -= 1 << -nslash;
1952 scanhex((void *)&adrs);
1971 printf(memex_subcmd_help_string);
1986 case 'n': c = '\n'; break;
1987 case 'r': c = '\r'; break;
1988 case 'b': c = '\b'; break;
1989 case 't': c = '\t'; break;
1994 static void xmon_rawdump (unsigned long adrs, long ndump)
1997 unsigned char temp[16];
1999 for (n = ndump; n > 0;) {
2001 nr = mread(adrs, temp, r);
2003 for (m = 0; m < r; ++m) {
2005 printf("%.2x", temp[m]);
2007 printf("%s", fault_chars[fault_type]);
2016 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
2017 || ('a' <= (c) && (c) <= 'f') \
2018 || ('A' <= (c) && (c) <= 'F'))
2025 if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
2027 scanhex((void *)&adrs);
2034 else if (nidump > MAX_DUMP)
2036 adrs += ppc_inst_dump(adrs, nidump, 1);
2038 } else if (c == 'l') {
2040 } else if (c == 'r') {
2044 xmon_rawdump(adrs, ndump);
2051 else if (ndump > MAX_DUMP)
2053 prdump(adrs, ndump);
2060 prdump(unsigned long adrs, long ndump)
2062 long n, m, c, r, nr;
2063 unsigned char temp[16];
2065 for (n = ndump; n > 0;) {
2069 nr = mread(adrs, temp, r);
2071 for (m = 0; m < r; ++m) {
2072 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2075 printf("%.2x", temp[m]);
2077 printf("%s", fault_chars[fault_type]);
2079 for (; m < 16; ++m) {
2080 if ((m & (sizeof(long) - 1)) == 0)
2085 for (m = 0; m < r; ++m) {
2088 putchar(' ' <= c && c <= '~'? c: '.');
2101 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2104 generic_inst_dump(unsigned long adr, long count, int praddr,
2105 instruction_dump_func dump_func)
2108 unsigned long first_adr;
2109 unsigned long inst, last_inst = 0;
2110 unsigned char val[4];
2113 for (first_adr = adr; count > 0; --count, adr += 4) {
2114 nr = mread(adr, val, 4);
2117 const char *x = fault_chars[fault_type];
2118 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2122 inst = GETWORD(val);
2123 if (adr > first_adr && inst == last_inst) {
2133 printf(REG" %.8x", adr, inst);
2135 dump_func(inst, adr);
2138 return adr - first_adr;
2142 ppc_inst_dump(unsigned long adr, long count, int praddr)
2144 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2148 print_address(unsigned long addr)
2150 xmon_print_symbol(addr, "\t# ", "");
2156 const unsigned long size = 128;
2157 unsigned long end, addr;
2158 unsigned char buf[size + 1];
2163 if (setjmp(bus_error_jmp) != 0) {
2164 printf("Unable to lookup symbol __log_buf!\n");
2168 catch_memory_errors = 1;
2170 addr = kallsyms_lookup_name("__log_buf");
2173 printf("Symbol __log_buf not found!\n");
2175 end = addr + (1 << CONFIG_LOG_BUF_SHIFT);
2176 while (addr < end) {
2177 if (! mread(addr, buf, size)) {
2178 printf("Can't read memory at address 0x%lx\n", addr);
2184 if (strlen(buf) < size)
2192 /* wait a little while to see if we get a machine check */
2194 catch_memory_errors = 0;
2198 * Memory operations - move, set, print differences
2200 static unsigned long mdest; /* destination address */
2201 static unsigned long msrc; /* source address */
2202 static unsigned long mval; /* byte value to set memory to */
2203 static unsigned long mcount; /* # bytes to affect */
2204 static unsigned long mdiffs; /* max # differences to print */
2209 scanhex((void *)&mdest);
2210 if( termch != '\n' )
2212 scanhex((void *)(cmd == 's'? &mval: &msrc));
2213 if( termch != '\n' )
2215 scanhex((void *)&mcount);
2218 memmove((void *)mdest, (void *)msrc, mcount);
2221 memset((void *)mdest, mval, mcount);
2224 if( termch != '\n' )
2226 scanhex((void *)&mdiffs);
2227 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2233 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2238 for( n = nb; n > 0; --n )
2239 if( *p1++ != *p2++ )
2240 if( ++prt <= maxpr )
2241 printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,
2242 p1[-1], p2 - 1, p2[-1]);
2244 printf("Total of %d differences\n", prt);
2247 static unsigned mend;
2248 static unsigned mask;
2254 unsigned char val[4];
2257 scanhex((void *)&mdest);
2258 if (termch != '\n') {
2260 scanhex((void *)&mend);
2261 if (termch != '\n') {
2263 scanhex((void *)&mval);
2265 if (termch != '\n') termch = 0;
2266 scanhex((void *)&mask);
2270 for (a = mdest; a < mend; a += 4) {
2271 if (mread(a, val, 4) == 4
2272 && ((GETWORD(val) ^ mval) & mask) == 0) {
2273 printf("%.16x: %.16x\n", a, GETWORD(val));
2280 static unsigned long mskip = 0x1000;
2281 static unsigned long mlim = 0xffffffff;
2291 if (termch != '\n') termch = 0;
2293 if (termch != '\n') termch = 0;
2296 for (a = mdest; a < mlim; a += mskip) {
2297 ok = mread(a, &v, 1);
2299 printf("%.8x .. ", a);
2300 } else if (!ok && ook)
2301 printf("%.8x\n", a - mskip);
2307 printf("%.8x\n", a - mskip);
2310 static void proccall(void)
2312 unsigned long args[8];
2315 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
2316 unsigned long, unsigned long, unsigned long,
2317 unsigned long, unsigned long, unsigned long);
2320 if (!scanhex(&adrs))
2324 for (i = 0; i < 8; ++i)
2326 for (i = 0; i < 8; ++i) {
2327 if (!scanhex(&args[i]) || termch == '\n')
2331 func = (callfunc_t) adrs;
2333 if (setjmp(bus_error_jmp) == 0) {
2334 catch_memory_errors = 1;
2336 ret = func(args[0], args[1], args[2], args[3],
2337 args[4], args[5], args[6], args[7]);
2339 printf("return value is %x\n", ret);
2341 printf("*** %x exception occurred\n", fault_except);
2343 catch_memory_errors = 0;
2346 /* Input scanning routines */
2357 while( c == ' ' || c == '\t' )
2363 static char *regnames[N_PTREGS] = {
2364 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2365 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2366 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2367 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2368 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2374 "trap", "dar", "dsisr", "res"
2378 scanhex(unsigned long *vp)
2385 /* parse register name */
2389 for (i = 0; i < sizeof(regname) - 1; ++i) {
2398 for (i = 0; i < N_PTREGS; ++i) {
2399 if (strcmp(regnames[i], regname) == 0) {
2400 if (xmon_regs == NULL) {
2401 printf("regs not available\n");
2404 *vp = ((unsigned long *)xmon_regs)[i];
2408 printf("invalid register name '%%%s'\n", regname);
2412 /* skip leading "0x" if any */
2426 } else if (c == '$') {
2428 for (i=0; i<63; i++) {
2438 if (setjmp(bus_error_jmp) == 0) {
2439 catch_memory_errors = 1;
2441 *vp = kallsyms_lookup_name(tmpstr);
2444 catch_memory_errors = 0;
2446 printf("unknown symbol '%s'\n", tmpstr);
2479 static int hexdigit(int c)
2481 if( '0' <= c && c <= '9' )
2483 if( 'A' <= c && c <= 'F' )
2484 return c - ('A' - 10);
2485 if( 'a' <= c && c <= 'f' )
2486 return c - ('a' - 10);
2491 getstring(char *s, int size)
2502 } while( c != ' ' && c != '\t' && c != '\n' );
2507 static char line[256];
2508 static char *lineptr;
2519 if (lineptr == NULL || *lineptr == 0) {
2520 if (xmon_gets(line, sizeof(line)) == NULL) {
2530 take_input(char *str)
2539 int type = inchar();
2541 static char tmp[64];
2546 xmon_print_symbol(addr, ": ", "\n");
2551 if (setjmp(bus_error_jmp) == 0) {
2552 catch_memory_errors = 1;
2554 addr = kallsyms_lookup_name(tmp);
2556 printf("%s: %lx\n", tmp, addr);
2558 printf("Symbol '%s' not found.\n", tmp);
2561 catch_memory_errors = 0;
2568 /* Print an address in numeric and symbolic form (if possible) */
2569 static void xmon_print_symbol(unsigned long address, const char *mid,
2573 const char *name = NULL;
2574 unsigned long offset, size;
2576 printf(REG, address);
2577 if (setjmp(bus_error_jmp) == 0) {
2578 catch_memory_errors = 1;
2580 name = kallsyms_lookup(address, &size, &offset, &modname,
2583 /* wait a little while to see if we get a machine check */
2587 catch_memory_errors = 0;
2590 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
2592 printf(" [%s]", modname);
2594 printf("%s", after);
2597 extern void kdb_syslog_data(char *syslog_data[]);
2598 #define SYSLOG_WRAP(p) if (p < syslog_data[0]) p = syslog_data[1]-1; \
2599 else if (p >= syslog_data[1]) p = syslog_data[0];
2601 static void xmon_show_dmesg(void)
2603 char *syslog_data[4], *start, *end, c;
2606 /* syslog_data[0,1] physical start, end+1.
2607 * syslog_data[2,3] logical start, end+1.
2609 kdb_syslog_data(syslog_data);
2610 if (syslog_data[2] == syslog_data[3])
2612 logsize = syslog_data[1] - syslog_data[0];
2613 start = syslog_data[0] + (syslog_data[2] - syslog_data[0]) % logsize;
2614 end = syslog_data[0] + (syslog_data[3] - syslog_data[0]) % logsize;
2616 /* Do a line at a time (max 200 chars) to reduce overhead */
2632 while (*start && chars < 200) {
2637 if (start == end || c == '\n')
2641 printf("%.*s", chars, p);
2649 #ifdef CONFIG_PPC_BOOK3S_64
2650 static void dump_slb(void)
2653 unsigned long esid,vsid,valid;
2656 printf("SLB contents of cpu %x\n", smp_processor_id());
2658 for (i = 0; i < mmu_slb_size; i++) {
2659 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
2660 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
2661 valid = (esid & SLB_ESID_V);
2662 if (valid | esid | vsid) {
2663 printf("%02d %016lx %016lx", i, esid, vsid);
2665 llp = vsid & SLB_VSID_LLP;
2666 if (vsid & SLB_VSID_B_1T) {
2667 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
2669 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
2672 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
2674 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
2683 static void dump_stab(void)
2686 unsigned long *tmp = (unsigned long *)local_paca->stab_addr;
2688 printf("Segment table contents of cpu %x\n", smp_processor_id());
2690 for (i = 0; i < PAGE_SIZE/16; i++) {
2697 printf("%03d %016lx ", i, a);
2698 printf("%016lx\n", b);
2703 void dump_segments(void)
2705 if (mmu_has_feature(MMU_FTR_SLB))
2712 #ifdef CONFIG_PPC_STD_MMU_32
2713 void dump_segments(void)
2718 for (i = 0; i < 16; ++i)
2719 printf(" %x", mfsrin(i));
2725 static void dump_tlb_44x(void)
2729 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
2730 unsigned long w0,w1,w2;
2731 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
2732 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
2733 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
2734 printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
2735 if (w0 & PPC44x_TLB_VALID) {
2736 printf("V %08x -> %01x%08x %c%c%c%c%c",
2737 w0 & PPC44x_TLB_EPN_MASK,
2738 w1 & PPC44x_TLB_ERPN_MASK,
2739 w1 & PPC44x_TLB_RPN_MASK,
2740 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
2741 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
2742 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
2743 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
2744 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
2749 #endif /* CONFIG_44x */
2751 #ifdef CONFIG_PPC_BOOK3E
2752 static void dump_tlb_book3e(void)
2754 u32 mmucfg, pidmask, lpidmask;
2756 int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
2758 static const char *pgsz_names[] = {
2793 /* Gather some infos about the MMU */
2794 mmucfg = mfspr(SPRN_MMUCFG);
2795 mmu_version = (mmucfg & 3) + 1;
2796 ntlbs = ((mmucfg >> 2) & 3) + 1;
2797 pidsz = ((mmucfg >> 6) & 0x1f) + 1;
2798 lpidsz = (mmucfg >> 24) & 0xf;
2799 rasz = (mmucfg >> 16) & 0x7f;
2800 if ((mmu_version > 1) && (mmucfg & 0x10000))
2802 printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
2803 mmu_version, ntlbs, pidsz, lpidsz, rasz);
2804 pidmask = (1ul << pidsz) - 1;
2805 lpidmask = (1ul << lpidsz) - 1;
2806 ramask = (1ull << rasz) - 1;
2808 for (tlb = 0; tlb < ntlbs; tlb++) {
2810 int nent, assoc, new_cc = 1;
2811 printf("TLB %d:\n------\n", tlb);
2814 tlbcfg = mfspr(SPRN_TLB0CFG);
2817 tlbcfg = mfspr(SPRN_TLB1CFG);
2820 tlbcfg = mfspr(SPRN_TLB2CFG);
2823 tlbcfg = mfspr(SPRN_TLB3CFG);
2826 printf("Unsupported TLB number !\n");
2829 nent = tlbcfg & 0xfff;
2830 assoc = (tlbcfg >> 24) & 0xff;
2831 for (i = 0; i < nent; i++) {
2832 u32 mas0 = MAS0_TLBSEL(tlb);
2833 u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
2836 int esel = i, cc = i;
2844 mas0 |= MAS0_ESEL(esel);
2845 mtspr(SPRN_MAS0, mas0);
2846 mtspr(SPRN_MAS1, mas1);
2847 mtspr(SPRN_MAS2, mas2);
2848 asm volatile("tlbre 0,0,0" : : : "memory");
2849 mas1 = mfspr(SPRN_MAS1);
2850 mas2 = mfspr(SPRN_MAS2);
2851 mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
2852 if (assoc && (i % assoc) == 0)
2854 if (!(mas1 & MAS1_VALID))
2857 printf("%04x- ", i);
2859 printf("%04x-%c", cc, 'A' + esel);
2861 printf(" |%c", 'A' + esel);
2863 printf(" %016llx %04x %s %c%c AS%c",
2865 (mas1 >> 16) & 0x3fff,
2866 pgsz_names[(mas1 >> 7) & 0x1f],
2867 mas1 & MAS1_IND ? 'I' : ' ',
2868 mas1 & MAS1_IPROT ? 'P' : ' ',
2869 mas1 & MAS1_TS ? '1' : '0');
2870 printf(" %c%c%c%c%c%c%c",
2871 mas2 & MAS2_X0 ? 'a' : ' ',
2872 mas2 & MAS2_X1 ? 'v' : ' ',
2873 mas2 & MAS2_W ? 'w' : ' ',
2874 mas2 & MAS2_I ? 'i' : ' ',
2875 mas2 & MAS2_M ? 'm' : ' ',
2876 mas2 & MAS2_G ? 'g' : ' ',
2877 mas2 & MAS2_E ? 'e' : ' ');
2878 printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
2879 if (mas1 & MAS1_IND)
2881 pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
2883 printf(" U%c%c%c S%c%c%c\n",
2884 mas7_mas3 & MAS3_UX ? 'x' : ' ',
2885 mas7_mas3 & MAS3_UW ? 'w' : ' ',
2886 mas7_mas3 & MAS3_UR ? 'r' : ' ',
2887 mas7_mas3 & MAS3_SX ? 'x' : ' ',
2888 mas7_mas3 & MAS3_SW ? 'w' : ' ',
2889 mas7_mas3 & MAS3_SR ? 'r' : ' ');
2893 #endif /* CONFIG_PPC_BOOK3E */
2895 static void xmon_init(int enable)
2899 __debugger_ipi = xmon_ipi;
2900 __debugger_bpt = xmon_bpt;
2901 __debugger_sstep = xmon_sstep;
2902 __debugger_iabr_match = xmon_iabr_match;
2903 __debugger_dabr_match = xmon_dabr_match;
2904 __debugger_fault_handler = xmon_fault_handler;
2907 __debugger_ipi = NULL;
2908 __debugger_bpt = NULL;
2909 __debugger_sstep = NULL;
2910 __debugger_iabr_match = NULL;
2911 __debugger_dabr_match = NULL;
2912 __debugger_fault_handler = NULL;
2917 #ifdef CONFIG_MAGIC_SYSRQ
2918 static void sysrq_handle_xmon(int key)
2920 /* ensure xmon is enabled */
2922 debugger(get_irq_regs());
2925 static struct sysrq_key_op sysrq_xmon_op = {
2926 .handler = sysrq_handle_xmon,
2928 .action_msg = "Entering xmon",
2931 static int __init setup_xmon_sysrq(void)
2933 register_sysrq_key('x', &sysrq_xmon_op);
2936 __initcall(setup_xmon_sysrq);
2937 #endif /* CONFIG_MAGIC_SYSRQ */
2939 static int __initdata xmon_early, xmon_off;
2941 static int __init early_parse_xmon(char *p)
2943 if (!p || strncmp(p, "early", 5) == 0) {
2944 /* just "xmon" is equivalent to "xmon=early" */
2947 } else if (strncmp(p, "on", 2) == 0)
2949 else if (strncmp(p, "off", 3) == 0)
2951 else if (strncmp(p, "nobt", 4) == 0)
2952 xmon_no_auto_backtrace = 1;
2958 early_param("xmon", early_parse_xmon);
2960 void __init xmon_setup(void)
2962 #ifdef CONFIG_XMON_DEFAULT
2970 #ifdef CONFIG_SPU_BASE
2974 u64 saved_mfc_sr1_RW;
2975 u32 saved_spu_runcntl_RW;
2976 unsigned long dump_addr;
2980 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
2982 static struct spu_info spu_info[XMON_NUM_SPUS];
2984 void xmon_register_spus(struct list_head *list)
2988 list_for_each_entry(spu, list, full_list) {
2989 if (spu->number >= XMON_NUM_SPUS) {
2994 spu_info[spu->number].spu = spu;
2995 spu_info[spu->number].stopped_ok = 0;
2996 spu_info[spu->number].dump_addr = (unsigned long)
2997 spu_info[spu->number].spu->local_store;
3001 static void stop_spus(void)
3007 for (i = 0; i < XMON_NUM_SPUS; i++) {
3008 if (!spu_info[i].spu)
3011 if (setjmp(bus_error_jmp) == 0) {
3012 catch_memory_errors = 1;
3015 spu = spu_info[i].spu;
3017 spu_info[i].saved_spu_runcntl_RW =
3018 in_be32(&spu->problem->spu_runcntl_RW);
3020 tmp = spu_mfc_sr1_get(spu);
3021 spu_info[i].saved_mfc_sr1_RW = tmp;
3023 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3024 spu_mfc_sr1_set(spu, tmp);
3029 spu_info[i].stopped_ok = 1;
3031 printf("Stopped spu %.2d (was %s)\n", i,
3032 spu_info[i].saved_spu_runcntl_RW ?
3033 "running" : "stopped");
3035 catch_memory_errors = 0;
3036 printf("*** Error stopping spu %.2d\n", i);
3038 catch_memory_errors = 0;
3042 static void restart_spus(void)
3047 for (i = 0; i < XMON_NUM_SPUS; i++) {
3048 if (!spu_info[i].spu)
3051 if (!spu_info[i].stopped_ok) {
3052 printf("*** Error, spu %d was not successfully stopped"
3053 ", not restarting\n", i);
3057 if (setjmp(bus_error_jmp) == 0) {
3058 catch_memory_errors = 1;
3061 spu = spu_info[i].spu;
3062 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3063 out_be32(&spu->problem->spu_runcntl_RW,
3064 spu_info[i].saved_spu_runcntl_RW);
3069 printf("Restarted spu %.2d\n", i);
3071 catch_memory_errors = 0;
3072 printf("*** Error restarting spu %.2d\n", i);
3074 catch_memory_errors = 0;
3078 #define DUMP_WIDTH 23
3079 #define DUMP_VALUE(format, field, value) \
3081 if (setjmp(bus_error_jmp) == 0) { \
3082 catch_memory_errors = 1; \
3084 printf(" %-*s = "format"\n", DUMP_WIDTH, \
3089 catch_memory_errors = 0; \
3090 printf(" %-*s = *** Error reading field.\n", \
3091 DUMP_WIDTH, #field); \
3093 catch_memory_errors = 0; \
3096 #define DUMP_FIELD(obj, format, field) \
3097 DUMP_VALUE(format, field, obj->field)
3099 static void dump_spu_fields(struct spu *spu)
3101 printf("Dumping spu fields at address %p:\n", spu);
3103 DUMP_FIELD(spu, "0x%x", number);
3104 DUMP_FIELD(spu, "%s", name);
3105 DUMP_FIELD(spu, "0x%lx", local_store_phys);
3106 DUMP_FIELD(spu, "0x%p", local_store);
3107 DUMP_FIELD(spu, "0x%lx", ls_size);
3108 DUMP_FIELD(spu, "0x%x", node);
3109 DUMP_FIELD(spu, "0x%lx", flags);
3110 DUMP_FIELD(spu, "%d", class_0_pending);
3111 DUMP_FIELD(spu, "0x%lx", class_0_dar);
3112 DUMP_FIELD(spu, "0x%lx", class_1_dar);
3113 DUMP_FIELD(spu, "0x%lx", class_1_dsisr);
3114 DUMP_FIELD(spu, "0x%lx", irqs[0]);
3115 DUMP_FIELD(spu, "0x%lx", irqs[1]);
3116 DUMP_FIELD(spu, "0x%lx", irqs[2]);
3117 DUMP_FIELD(spu, "0x%x", slb_replace);
3118 DUMP_FIELD(spu, "%d", pid);
3119 DUMP_FIELD(spu, "0x%p", mm);
3120 DUMP_FIELD(spu, "0x%p", ctx);
3121 DUMP_FIELD(spu, "0x%p", rq);
3122 DUMP_FIELD(spu, "0x%p", timestamp);
3123 DUMP_FIELD(spu, "0x%lx", problem_phys);
3124 DUMP_FIELD(spu, "0x%p", problem);
3125 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
3126 in_be32(&spu->problem->spu_runcntl_RW));
3127 DUMP_VALUE("0x%x", problem->spu_status_R,
3128 in_be32(&spu->problem->spu_status_R));
3129 DUMP_VALUE("0x%x", problem->spu_npc_RW,
3130 in_be32(&spu->problem->spu_npc_RW));
3131 DUMP_FIELD(spu, "0x%p", priv2);
3132 DUMP_FIELD(spu, "0x%p", pdata);
3136 spu_inst_dump(unsigned long adr, long count, int praddr)
3138 return generic_inst_dump(adr, count, praddr, print_insn_spu);
3141 static void dump_spu_ls(unsigned long num, int subcmd)
3143 unsigned long offset, addr, ls_addr;
3145 if (setjmp(bus_error_jmp) == 0) {
3146 catch_memory_errors = 1;
3148 ls_addr = (unsigned long)spu_info[num].spu->local_store;
3152 catch_memory_errors = 0;
3153 printf("*** Error: accessing spu info for spu %d\n", num);
3156 catch_memory_errors = 0;
3158 if (scanhex(&offset))
3159 addr = ls_addr + offset;
3161 addr = spu_info[num].dump_addr;
3163 if (addr >= ls_addr + LS_SIZE) {
3164 printf("*** Error: address outside of local store\n");
3170 addr += spu_inst_dump(addr, 16, 1);
3180 spu_info[num].dump_addr = addr;
3183 static int do_spu_cmd(void)
3185 static unsigned long num = 0;
3186 int cmd, subcmd = 0;
3198 if (isxdigit(subcmd) || subcmd == '\n')
3202 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
3203 printf("*** Error: invalid spu number\n");
3209 dump_spu_fields(spu_info[num].spu);
3212 dump_spu_ls(num, subcmd);
3223 #else /* ! CONFIG_SPU_BASE */
3224 static int do_spu_cmd(void)