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/module.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/firmware.h>
45 #include <asm/hvcall.h>
47 #include <asm/iseries/it_lp_reg_save.h>
53 #define scanhex xmon_scanhex
54 #define skipbl xmon_skipbl
57 cpumask_t cpus_in_xmon = CPU_MASK_NONE;
58 static unsigned long xmon_taken = 1;
59 static int xmon_owner;
61 #endif /* CONFIG_SMP */
63 static unsigned long in_xmon = 0;
65 static unsigned long adrs;
67 #define MAX_DUMP (128 * 1024)
68 static unsigned long ndump = 64;
69 static unsigned long nidump = 16;
70 static unsigned long ncsum = 4096;
72 static char tmpstr[128];
74 #define JMP_BUF_LEN 23
75 static long bus_error_jmp[JMP_BUF_LEN];
76 static int catch_memory_errors;
77 static long *xmon_fault_jmp[NR_CPUS];
78 #define setjmp xmon_setjmp
79 #define longjmp xmon_longjmp
81 /* Breakpoint stuff */
83 unsigned long address;
84 unsigned int instr[2];
90 /* Bits in bpt.enabled */
91 #define BP_IABR_TE 1 /* IABR translation enabled */
97 static struct bpt bpts[NBPTS];
98 static struct bpt dabr;
99 static struct bpt *iabr;
100 static unsigned bpinstr = 0x7fe00008; /* trap */
102 #define BP_NUM(bp) ((bp) - bpts + 1)
105 static int cmds(struct pt_regs *);
106 static int mread(unsigned long, void *, int);
107 static int mwrite(unsigned long, void *, int);
108 static int handle_fault(struct pt_regs *);
109 static void byterev(unsigned char *, int);
110 static void memex(void);
111 static int bsesc(void);
112 static void dump(void);
113 static void prdump(unsigned long, long);
114 static int ppc_inst_dump(unsigned long, long, int);
115 static void backtrace(struct pt_regs *);
116 static void excprint(struct pt_regs *);
117 static void prregs(struct pt_regs *);
118 static void memops(int);
119 static void memlocate(void);
120 static void memzcan(void);
121 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
123 int scanhex(unsigned long *valp);
124 static void scannl(void);
125 static int hexdigit(int);
126 void getstring(char *, int);
127 static void flush_input(void);
128 static int inchar(void);
129 static void take_input(char *);
130 static unsigned long read_spr(int);
131 static void write_spr(int, unsigned long);
132 static void super_regs(void);
133 static void remove_bpts(void);
134 static void insert_bpts(void);
135 static void remove_cpu_bpts(void);
136 static void insert_cpu_bpts(void);
137 static struct bpt *at_breakpoint(unsigned long pc);
138 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
139 static int do_step(struct pt_regs *);
140 static void bpt_cmds(void);
141 static void cacheflush(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);
160 int xmon_no_auto_backtrace;
162 extern void xmon_enter(void);
163 extern void xmon_leave(void);
165 extern long setjmp(long *);
166 extern void longjmp(long *, long);
167 extern void xmon_save_regs(struct pt_regs *);
171 #define REGS_PER_LINE 4
172 #define LAST_VOLATILE 13
175 #define REGS_PER_LINE 8
176 #define LAST_VOLATILE 12
179 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
181 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
182 || ('a' <= (c) && (c) <= 'f') \
183 || ('A' <= (c) && (c) <= 'F'))
184 #define isalnum(c) (('0' <= (c) && (c) <= '9') \
185 || ('a' <= (c) && (c) <= 'z') \
186 || ('A' <= (c) && (c) <= 'Z'))
187 #define isspace(c) (c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
189 static char *help_string = "\
191 b show breakpoints\n\
192 bd set data breakpoint\n\
193 bi set instruction breakpoint\n\
194 bc clear breakpoint\n"
197 c print cpus stopped in xmon\n\
198 c# try to switch to cpu number h (in hex)\n"
203 di dump instructions\n\
204 df dump float values\n\
205 dd dump double values\n\
206 dr dump stream of raw bytes\n\
207 e print exception information\n\
209 la lookup symbol+offset of specified address\n\
210 ls lookup address of specified symbol\n\
211 m examine/change memory\n\
212 mm move a block of memory\n\
213 ms set a block of memory\n\
214 md compare two blocks of memory\n\
215 ml locate a block of memory\n\
216 mz zero a block of memory\n\
217 mi show information about memory allocation\n\
218 p call a procedure\n\
221 #ifdef CONFIG_SPU_BASE
222 " ss stop execution on all spus\n\
223 sr restore execution on stopped spus\n\
224 sf # dump spu fields for spu # (in hex)\n\
225 sd # dump spu local store for spu # (in hex)\n\
226 sdi # disassemble spu local store for spu # (in hex)\n"
228 " S print special registers\n\
230 x exit monitor and recover\n\
231 X exit monitor and dont recover\n"
233 " u dump segment table or SLB\n"
235 #ifdef CONFIG_PPC_STD_MMU_32
236 " u dump segment registers\n"
246 static struct pt_regs *xmon_regs;
248 static inline void sync(void)
250 asm volatile("sync; isync");
253 static inline void store_inst(void *p)
255 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
258 static inline void cflush(void *p)
260 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
263 static inline void cinval(void *p)
265 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
269 * Disable surveillance (the service processor watchdog function)
270 * while we are in xmon.
271 * XXX we should re-enable it when we leave. :)
273 #define SURVEILLANCE_TOKEN 9000
275 static inline void disable_surveillance(void)
277 #ifdef CONFIG_PPC_PSERIES
278 /* Since this can't be a module, args should end up below 4GB. */
279 static struct rtas_args args;
282 * At this point we have got all the cpus we can into
283 * xmon, so there is hopefully no other cpu calling RTAS
284 * at the moment, even though we don't take rtas.lock.
285 * If we did try to take rtas.lock there would be a
286 * real possibility of deadlock.
288 args.token = rtas_token("set-indicator");
289 if (args.token == RTAS_UNKNOWN_SERVICE)
293 args.rets = &args.args[3];
294 args.args[0] = SURVEILLANCE_TOKEN;
297 enter_rtas(__pa(&args));
298 #endif /* CONFIG_PPC_PSERIES */
302 static int xmon_speaker;
304 static void get_output_lock(void)
306 int me = smp_processor_id() + 0x100;
307 int last_speaker = 0, prev;
310 if (xmon_speaker == me)
313 if (xmon_speaker == 0) {
314 last_speaker = cmpxchg(&xmon_speaker, 0, me);
315 if (last_speaker == 0)
319 while (xmon_speaker == last_speaker) {
322 /* hostile takeover */
323 prev = cmpxchg(&xmon_speaker, last_speaker, me);
324 if (prev == last_speaker)
331 static void release_output_lock(void)
337 static int xmon_core(struct pt_regs *regs, int fromipi)
341 long recurse_jmp[JMP_BUF_LEN];
342 unsigned long offset;
347 unsigned long timeout;
350 local_irq_save(flags);
352 bp = in_breakpoint_table(regs->nip, &offset);
354 regs->nip = bp->address + offset;
355 atomic_dec(&bp->ref_count);
361 cpu = smp_processor_id();
362 if (cpu_isset(cpu, cpus_in_xmon)) {
365 printf("cpu 0x%x: Exception %lx %s in xmon, "
366 "returning to main loop\n",
367 cpu, regs->trap, getvecname(TRAP(regs)));
368 release_output_lock();
369 longjmp(xmon_fault_jmp[cpu], 1);
372 if (setjmp(recurse_jmp) != 0) {
373 if (!in_xmon || !xmon_gate) {
375 printf("xmon: WARNING: bad recursive fault "
376 "on cpu 0x%x\n", cpu);
377 release_output_lock();
380 secondary = !(xmon_taken && cpu == xmon_owner);
384 xmon_fault_jmp[cpu] = recurse_jmp;
385 cpu_set(cpu, cpus_in_xmon);
388 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF))
389 bp = at_breakpoint(regs->nip);
390 if (bp || (regs->msr & MSR_RI) == 0)
397 printf("cpu 0x%x stopped at breakpoint 0x%x (",
399 xmon_print_symbol(regs->nip, " ", ")\n");
401 if ((regs->msr & MSR_RI) == 0)
402 printf("WARNING: exception is not recoverable, "
404 release_output_lock();
409 while (secondary && !xmon_gate) {
413 secondary = test_and_set_bit(0, &in_xmon);
418 if (!secondary && !xmon_gate) {
419 /* we are the first cpu to come in */
420 /* interrupt other cpu(s) */
421 int ncpus = num_online_cpus();
426 smp_send_debugger_break(MSG_ALL_BUT_SELF);
427 /* wait for other cpus to come in */
428 for (timeout = 100000000; timeout != 0; --timeout) {
429 if (cpus_weight(cpus_in_xmon) >= ncpus)
435 disable_surveillance();
436 /* for breakpoint or single step, print the current instr. */
437 if (bp || TRAP(regs) == 0xd00)
438 ppc_inst_dump(regs->nip, 1, 0);
439 printf("enter ? for help\n");
448 if (cpu == xmon_owner) {
449 if (!test_and_set_bit(0, &xmon_taken)) {
454 while (cpu == xmon_owner)
468 /* have switched to some other cpu */
473 cpu_clear(cpu, cpus_in_xmon);
474 xmon_fault_jmp[cpu] = NULL;
476 /* UP is simple... */
478 printf("Exception %lx %s in xmon, returning to main loop\n",
479 regs->trap, getvecname(TRAP(regs)));
480 longjmp(xmon_fault_jmp[0], 1);
482 if (setjmp(recurse_jmp) == 0) {
483 xmon_fault_jmp[0] = recurse_jmp;
487 bp = at_breakpoint(regs->nip);
489 printf("Stopped at breakpoint %x (", BP_NUM(bp));
490 xmon_print_symbol(regs->nip, " ", ")\n");
492 if ((regs->msr & MSR_RI) == 0)
493 printf("WARNING: exception is not recoverable, "
496 disable_surveillance();
497 /* for breakpoint or single step, print the current instr. */
498 if (bp || TRAP(regs) == 0xd00)
499 ppc_inst_dump(regs->nip, 1, 0);
500 printf("enter ? for help\n");
509 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF)) {
510 bp = at_breakpoint(regs->nip);
512 int stepped = emulate_step(regs, bp->instr[0]);
514 regs->nip = (unsigned long) &bp->instr[0];
515 atomic_inc(&bp->ref_count);
516 } else if (stepped < 0) {
517 printf("Couldn't single-step %s instruction\n",
518 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
525 local_irq_restore(flags);
527 return cmd != 'X' && cmd != EOF;
530 int xmon(struct pt_regs *excp)
535 xmon_save_regs(®s);
539 return xmon_core(excp, 0);
543 irqreturn_t xmon_irq(int irq, void *d)
546 local_irq_save(flags);
547 printf("Keyboard interrupt\n");
548 xmon(get_irq_regs());
549 local_irq_restore(flags);
553 static int xmon_bpt(struct pt_regs *regs)
556 unsigned long offset;
558 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
561 /* Are we at the trap at bp->instr[1] for some bp? */
562 bp = in_breakpoint_table(regs->nip, &offset);
563 if (bp != NULL && offset == 4) {
564 regs->nip = bp->address + 4;
565 atomic_dec(&bp->ref_count);
569 /* Are we at a breakpoint? */
570 bp = at_breakpoint(regs->nip);
579 static int xmon_sstep(struct pt_regs *regs)
587 static int xmon_dabr_match(struct pt_regs *regs)
589 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
591 if (dabr.enabled == 0)
597 static int xmon_iabr_match(struct pt_regs *regs)
599 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
607 static int xmon_ipi(struct pt_regs *regs)
610 if (in_xmon && !cpu_isset(smp_processor_id(), cpus_in_xmon))
616 static int xmon_fault_handler(struct pt_regs *regs)
619 unsigned long offset;
621 if (in_xmon && catch_memory_errors)
622 handle_fault(regs); /* doesn't return */
624 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF)) {
625 bp = in_breakpoint_table(regs->nip, &offset);
627 regs->nip = bp->address + offset;
628 atomic_dec(&bp->ref_count);
635 static struct bpt *at_breakpoint(unsigned long pc)
641 for (i = 0; i < NBPTS; ++i, ++bp)
642 if (bp->enabled && pc == bp->address)
647 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
651 off = nip - (unsigned long) bpts;
652 if (off >= sizeof(bpts))
654 off %= sizeof(struct bpt);
655 if (off != offsetof(struct bpt, instr[0])
656 && off != offsetof(struct bpt, instr[1]))
658 *offp = off - offsetof(struct bpt, instr[0]);
659 return (struct bpt *) (nip - off);
662 static struct bpt *new_breakpoint(unsigned long a)
667 bp = at_breakpoint(a);
671 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
672 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
674 bp->instr[1] = bpinstr;
675 store_inst(&bp->instr[1]);
680 printf("Sorry, no free breakpoints. Please clear one first.\n");
684 static void insert_bpts(void)
690 for (i = 0; i < NBPTS; ++i, ++bp) {
691 if ((bp->enabled & (BP_TRAP|BP_IABR)) == 0)
693 if (mread(bp->address, &bp->instr[0], 4) != 4) {
694 printf("Couldn't read instruction at %lx, "
695 "disabling breakpoint there\n", bp->address);
699 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
700 printf("Breakpoint at %lx is on an mtmsrd or rfid "
701 "instruction, disabling it\n", bp->address);
705 store_inst(&bp->instr[0]);
706 if (bp->enabled & BP_IABR)
708 if (mwrite(bp->address, &bpinstr, 4) != 4) {
709 printf("Couldn't write instruction at %lx, "
710 "disabling breakpoint there\n", bp->address);
711 bp->enabled &= ~BP_TRAP;
714 store_inst((void *)bp->address);
718 static void insert_cpu_bpts(void)
721 set_dabr(dabr.address | (dabr.enabled & 7));
722 if (iabr && cpu_has_feature(CPU_FTR_IABR))
723 mtspr(SPRN_IABR, iabr->address
724 | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
727 static void remove_bpts(void)
734 for (i = 0; i < NBPTS; ++i, ++bp) {
735 if ((bp->enabled & (BP_TRAP|BP_IABR)) != BP_TRAP)
737 if (mread(bp->address, &instr, 4) == 4
739 && mwrite(bp->address, &bp->instr, 4) != 4)
740 printf("Couldn't remove breakpoint at %lx\n",
743 store_inst((void *)bp->address);
747 static void remove_cpu_bpts(void)
750 if (cpu_has_feature(CPU_FTR_IABR))
754 /* Command interpreting routine */
755 static char *last_cmd;
758 cmds(struct pt_regs *excp)
765 if (!xmon_no_auto_backtrace) {
766 xmon_no_auto_backtrace = 1;
767 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
772 printf("%x:", smp_processor_id());
773 #endif /* CONFIG_SMP */
779 if (last_cmd == NULL)
781 take_input(last_cmd);
815 prregs(excp); /* print regs */
830 if (do_spu_cmd() == 0)
839 printf(" <no input ...>\n");
843 xmon_puts(help_string);
861 #ifdef CONFIG_PPC_STD_MMU
872 printf("Unrecognized command: ");
874 if (' ' < cmd && cmd <= '~')
877 printf("\\x%x", cmd);
879 } while (cmd != '\n');
880 printf(" (type ? for help)\n");
887 * Step a single instruction.
888 * Some instructions we emulate, others we execute with MSR_SE set.
890 static int do_step(struct pt_regs *regs)
895 /* check we are in 64-bit kernel mode, translation enabled */
896 if ((regs->msr & (MSR_SF|MSR_PR|MSR_IR)) == (MSR_SF|MSR_IR)) {
897 if (mread(regs->nip, &instr, 4) == 4) {
898 stepped = emulate_step(regs, instr);
900 printf("Couldn't single-step %s instruction\n",
901 (IS_RFID(instr)? "rfid": "mtmsrd"));
905 regs->trap = 0xd00 | (regs->trap & 1);
906 printf("stepped to ");
907 xmon_print_symbol(regs->nip, " ", "\n");
908 ppc_inst_dump(regs->nip, 1, 0);
917 static void bootcmds(void)
923 ppc_md.restart(NULL);
930 static int cpu_cmd(void)
937 if (!scanhex(&cpu)) {
938 /* print cpus waiting or in xmon */
939 printf("cpus stopped:");
941 for (cpu = 0; cpu < NR_CPUS; ++cpu) {
942 if (cpu_isset(cpu, cpus_in_xmon)) {
948 printf("-%x", cpu - 1);
953 printf("-%x", NR_CPUS - 1);
957 /* try to switch to cpu specified */
958 if (!cpu_isset(cpu, cpus_in_xmon)) {
959 printf("cpu 0x%x isn't in xmon\n", cpu);
966 while (!xmon_taken) {
967 if (--timeout == 0) {
968 if (test_and_set_bit(0, &xmon_taken))
970 /* take control back */
972 xmon_owner = smp_processor_id();
973 printf("cpu %u didn't take control\n", cpu);
981 #endif /* CONFIG_SMP */
984 static unsigned short fcstab[256] = {
985 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
986 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
987 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
988 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
989 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
990 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
991 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
992 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
993 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
994 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
995 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
996 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
997 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
998 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
999 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1000 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1001 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1002 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1003 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1004 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1005 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1006 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1007 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1008 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1009 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1010 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1011 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1012 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1013 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1014 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1015 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1016 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1019 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1028 if (!scanhex(&adrs))
1030 if (!scanhex(&ncsum))
1033 for (i = 0; i < ncsum; ++i) {
1034 if (mread(adrs+i, &v, 1) == 0) {
1035 printf("csum stopped at %x\n", adrs+i);
1040 printf("%x\n", fcs);
1044 * Check if this is a suitable place to put a breakpoint.
1046 static long check_bp_loc(unsigned long addr)
1051 if (!is_kernel_addr(addr)) {
1052 printf("Breakpoints may only be placed at kernel addresses\n");
1055 if (!mread(addr, &instr, sizeof(instr))) {
1056 printf("Can't read instruction at address %lx\n", addr);
1059 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1060 printf("Breakpoints may not be placed on mtmsrd or rfid "
1067 static char *breakpoint_help_string =
1068 "Breakpoint command usage:\n"
1069 "b show breakpoints\n"
1070 "b <addr> [cnt] set breakpoint at given instr addr\n"
1071 "bc clear all breakpoints\n"
1072 "bc <n/addr> clear breakpoint number n or at addr\n"
1073 "bi <addr> [cnt] set hardware instr breakpoint (POWER3/RS64 only)\n"
1074 "bd <addr> [cnt] set hardware data breakpoint\n"
1084 const char badaddr[] = "Only kernel addresses are permitted "
1085 "for breakpoints\n";
1090 case 'd': /* bd - hardware data breakpoint */
1095 else if (cmd == 'w')
1101 if (scanhex(&dabr.address)) {
1102 if (!is_kernel_addr(dabr.address)) {
1107 dabr.enabled = mode | BP_DABR;
1111 case 'i': /* bi - hardware instr breakpoint */
1112 if (!cpu_has_feature(CPU_FTR_IABR)) {
1113 printf("Hardware instruction breakpoint "
1114 "not supported on this cpu\n");
1118 iabr->enabled &= ~(BP_IABR | BP_IABR_TE);
1123 if (!check_bp_loc(a))
1125 bp = new_breakpoint(a);
1127 bp->enabled |= BP_IABR | BP_IABR_TE;
1135 /* clear all breakpoints */
1136 for (i = 0; i < NBPTS; ++i)
1137 bpts[i].enabled = 0;
1140 printf("All breakpoints cleared\n");
1144 if (a <= NBPTS && a >= 1) {
1145 /* assume a breakpoint number */
1146 bp = &bpts[a-1]; /* bp nums are 1 based */
1148 /* assume a breakpoint address */
1149 bp = at_breakpoint(a);
1151 printf("No breakpoint at %x\n", a);
1156 printf("Cleared breakpoint %x (", BP_NUM(bp));
1157 xmon_print_symbol(bp->address, " ", ")\n");
1165 printf(breakpoint_help_string);
1170 /* print all breakpoints */
1171 printf(" type address\n");
1173 printf(" data "REG" [", dabr.address);
1174 if (dabr.enabled & 1)
1176 if (dabr.enabled & 2)
1180 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1183 printf("%2x %s ", BP_NUM(bp),
1184 (bp->enabled & BP_IABR)? "inst": "trap");
1185 xmon_print_symbol(bp->address, " ", "\n");
1190 if (!check_bp_loc(a))
1192 bp = new_breakpoint(a);
1194 bp->enabled |= BP_TRAP;
1199 /* Very cheap human name for vector lookup. */
1201 const char *getvecname(unsigned long vec)
1206 case 0x100: ret = "(System Reset)"; break;
1207 case 0x200: ret = "(Machine Check)"; break;
1208 case 0x300: ret = "(Data Access)"; break;
1209 case 0x380: ret = "(Data SLB Access)"; break;
1210 case 0x400: ret = "(Instruction Access)"; break;
1211 case 0x480: ret = "(Instruction SLB Access)"; break;
1212 case 0x500: ret = "(Hardware Interrupt)"; break;
1213 case 0x600: ret = "(Alignment)"; break;
1214 case 0x700: ret = "(Program Check)"; break;
1215 case 0x800: ret = "(FPU Unavailable)"; break;
1216 case 0x900: ret = "(Decrementer)"; break;
1217 case 0xc00: ret = "(System Call)"; break;
1218 case 0xd00: ret = "(Single Step)"; break;
1219 case 0xf00: ret = "(Performance Monitor)"; break;
1220 case 0xf20: ret = "(Altivec Unavailable)"; break;
1221 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1227 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1228 unsigned long *endp)
1230 unsigned long size, offset;
1233 *startp = *endp = 0;
1236 if (setjmp(bus_error_jmp) == 0) {
1237 catch_memory_errors = 1;
1239 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1241 *startp = pc - offset;
1242 *endp = pc - offset + size;
1246 catch_memory_errors = 0;
1249 static int xmon_depth_to_print = 64;
1252 #define LRSAVE_OFFSET 0x10
1253 #define REG_FRAME_MARKER 0x7265677368657265ul /* "regshere" */
1254 #define MARKER_OFFSET 0x60
1255 #define REGS_OFFSET 0x70
1257 #define LRSAVE_OFFSET 4
1258 #define REG_FRAME_MARKER 0x72656773
1259 #define MARKER_OFFSET 8
1260 #define REGS_OFFSET 16
1263 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1267 unsigned long newsp;
1268 unsigned long marker;
1270 struct pt_regs regs;
1273 if (sp < PAGE_OFFSET) {
1275 printf("SP (%lx) is in userspace\n", sp);
1279 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1280 || !mread(sp, &newsp, sizeof(unsigned long))) {
1281 printf("Couldn't read stack frame at %lx\n", sp);
1286 * For the first stack frame, try to work out if
1287 * LR and/or the saved LR value in the bottommost
1288 * stack frame are valid.
1290 if ((pc | lr) != 0) {
1291 unsigned long fnstart, fnend;
1292 unsigned long nextip;
1295 get_function_bounds(pc, &fnstart, &fnend);
1298 mread(newsp + LRSAVE_OFFSET, &nextip,
1299 sizeof(unsigned long));
1301 if (lr < PAGE_OFFSET
1302 || (fnstart <= lr && lr < fnend))
1304 } else if (lr == nextip) {
1306 } else if (lr >= PAGE_OFFSET
1307 && !(fnstart <= lr && lr < fnend)) {
1308 printf("[link register ] ");
1309 xmon_print_symbol(lr, " ", "\n");
1312 printf("["REG"] ", sp);
1313 xmon_print_symbol(ip, " ", " (unreliable)\n");
1318 printf("["REG"] ", sp);
1319 xmon_print_symbol(ip, " ", "\n");
1322 /* Look for "regshere" marker to see if this is
1323 an exception frame. */
1324 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1325 && marker == REG_FRAME_MARKER) {
1326 if (mread(sp + REGS_OFFSET, ®s, sizeof(regs))
1328 printf("Couldn't read registers at %lx\n",
1332 printf("--- Exception: %lx %s at ", regs.trap,
1333 getvecname(TRAP(®s)));
1336 xmon_print_symbol(pc, " ", "\n");
1343 } while (count++ < xmon_depth_to_print);
1346 static void backtrace(struct pt_regs *excp)
1351 xmon_show_stack(sp, 0, 0);
1353 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1357 static void print_bug_trap(struct pt_regs *regs)
1359 const struct bug_entry *bug;
1362 if (regs->msr & MSR_PR)
1363 return; /* not in kernel */
1364 addr = regs->nip; /* address of trap instruction */
1365 if (addr < PAGE_OFFSET)
1367 bug = find_bug(regs->nip);
1370 if (is_warning_bug(bug))
1373 #ifdef CONFIG_DEBUG_BUGVERBOSE
1374 printf("kernel BUG at %s:%u!\n",
1375 bug->file, bug->line);
1377 printf("kernel BUG at %p!\n", (void *)bug->bug_addr);
1381 void excprint(struct pt_regs *fp)
1386 printf("cpu 0x%x: ", smp_processor_id());
1387 #endif /* CONFIG_SMP */
1390 printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp);
1392 xmon_print_symbol(fp->nip, ": ", "\n");
1394 printf(" lr: ", fp->link);
1395 xmon_print_symbol(fp->link, ": ", "\n");
1397 printf(" sp: %lx\n", fp->gpr[1]);
1398 printf(" msr: %lx\n", fp->msr);
1400 if (trap == 0x300 || trap == 0x380 || trap == 0x600) {
1401 printf(" dar: %lx\n", fp->dar);
1403 printf(" dsisr: %lx\n", fp->dsisr);
1406 printf(" current = 0x%lx\n", current);
1408 printf(" paca = 0x%lx\n", get_paca());
1411 printf(" pid = %ld, comm = %s\n",
1412 current->pid, current->comm);
1419 void prregs(struct pt_regs *fp)
1423 struct pt_regs regs;
1425 if (scanhex(&base)) {
1426 if (setjmp(bus_error_jmp) == 0) {
1427 catch_memory_errors = 1;
1429 regs = *(struct pt_regs *)base;
1433 catch_memory_errors = 0;
1434 printf("*** Error reading registers from "REG"\n",
1438 catch_memory_errors = 0;
1443 if (FULL_REGS(fp)) {
1444 for (n = 0; n < 16; ++n)
1445 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1446 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1448 for (n = 0; n < 7; ++n)
1449 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1450 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1453 for (n = 0; n < 32; ++n) {
1454 printf("R%.2d = %.8x%s", n, fp->gpr[n],
1455 (n & 3) == 3? "\n": " ");
1456 if (n == 12 && !FULL_REGS(fp)) {
1463 xmon_print_symbol(fp->nip, " ", "\n");
1465 xmon_print_symbol(fp->link, " ", "\n");
1466 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1467 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1468 fp->ctr, fp->xer, fp->trap);
1470 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1471 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1474 void cacheflush(void)
1477 unsigned long nflush;
1482 scanhex((void *)&adrs);
1487 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1488 if (setjmp(bus_error_jmp) == 0) {
1489 catch_memory_errors = 1;
1493 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1494 cflush((void *) adrs);
1496 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1497 cinval((void *) adrs);
1500 /* wait a little while to see if we get a machine check */
1503 catch_memory_errors = 0;
1509 unsigned int instrs[2];
1510 unsigned long (*code)(void);
1511 unsigned long ret = -1UL;
1513 unsigned long opd[3];
1515 opd[0] = (unsigned long)instrs;
1518 code = (unsigned long (*)(void)) opd;
1520 code = (unsigned long (*)(void)) instrs;
1523 /* mfspr r3,n; blr */
1524 instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1525 instrs[1] = 0x4e800020;
1527 store_inst(instrs+1);
1529 if (setjmp(bus_error_jmp) == 0) {
1530 catch_memory_errors = 1;
1536 /* wait a little while to see if we get a machine check */
1545 write_spr(int n, unsigned long val)
1547 unsigned int instrs[2];
1548 unsigned long (*code)(unsigned long);
1550 unsigned long opd[3];
1552 opd[0] = (unsigned long)instrs;
1555 code = (unsigned long (*)(unsigned long)) opd;
1557 code = (unsigned long (*)(unsigned long)) instrs;
1560 instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1561 instrs[1] = 0x4e800020;
1563 store_inst(instrs+1);
1565 if (setjmp(bus_error_jmp) == 0) {
1566 catch_memory_errors = 1;
1572 /* wait a little while to see if we get a machine check */
1578 static unsigned long regno;
1579 extern char exc_prolog;
1580 extern char dec_exc;
1582 void super_regs(void)
1589 unsigned long sp, toc;
1590 asm("mr %0,1" : "=r" (sp) :);
1591 asm("mr %0,2" : "=r" (toc) :);
1593 printf("msr = "REG" sprg0= "REG"\n",
1594 mfmsr(), mfspr(SPRN_SPRG0));
1595 printf("pvr = "REG" sprg1= "REG"\n",
1596 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1597 printf("dec = "REG" sprg2= "REG"\n",
1598 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1599 printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3));
1600 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
1601 #ifdef CONFIG_PPC_ISERIES
1602 if (firmware_has_feature(FW_FEATURE_ISERIES)) {
1603 struct paca_struct *ptrPaca;
1604 struct lppaca *ptrLpPaca;
1605 struct ItLpRegSave *ptrLpRegSave;
1607 /* Dump out relevant Paca data areas. */
1609 ptrPaca = get_paca();
1611 printf(" Local Processor Control Area (LpPaca): \n");
1612 ptrLpPaca = ptrPaca->lppaca_ptr;
1613 printf(" Saved Srr0=%.16lx Saved Srr1=%.16lx \n",
1614 ptrLpPaca->saved_srr0, ptrLpPaca->saved_srr1);
1615 printf(" Saved Gpr3=%.16lx Saved Gpr4=%.16lx \n",
1616 ptrLpPaca->saved_gpr3, ptrLpPaca->saved_gpr4);
1617 printf(" Saved Gpr5=%.16lx \n", ptrLpPaca->saved_gpr5);
1619 printf(" Local Processor Register Save Area (LpRegSave): \n");
1620 ptrLpRegSave = ptrPaca->reg_save_ptr;
1621 printf(" Saved Sprg0=%.16lx Saved Sprg1=%.16lx \n",
1622 ptrLpRegSave->xSPRG0, ptrLpRegSave->xSPRG0);
1623 printf(" Saved Sprg2=%.16lx Saved Sprg3=%.16lx \n",
1624 ptrLpRegSave->xSPRG2, ptrLpRegSave->xSPRG3);
1625 printf(" Saved Msr =%.16lx Saved Nia =%.16lx \n",
1626 ptrLpRegSave->xMSR, ptrLpRegSave->xNIA);
1636 val = read_spr(regno);
1638 write_spr(regno, val);
1641 printf("spr %lx = %lx\n", regno, read_spr(regno));
1648 * Stuff for reading and writing memory safely
1651 mread(unsigned long adrs, void *buf, int size)
1657 if (setjmp(bus_error_jmp) == 0) {
1658 catch_memory_errors = 1;
1664 *(u16 *)q = *(u16 *)p;
1667 *(u32 *)q = *(u32 *)p;
1670 *(u64 *)q = *(u64 *)p;
1673 for( ; n < size; ++n) {
1679 /* wait a little while to see if we get a machine check */
1683 catch_memory_errors = 0;
1688 mwrite(unsigned long adrs, void *buf, int size)
1694 if (setjmp(bus_error_jmp) == 0) {
1695 catch_memory_errors = 1;
1701 *(u16 *)p = *(u16 *)q;
1704 *(u32 *)p = *(u32 *)q;
1707 *(u64 *)p = *(u64 *)q;
1710 for ( ; n < size; ++n) {
1716 /* wait a little while to see if we get a machine check */
1720 printf("*** Error writing address %x\n", adrs + n);
1722 catch_memory_errors = 0;
1726 static int fault_type;
1727 static int fault_except;
1728 static char *fault_chars[] = { "--", "**", "##" };
1730 static int handle_fault(struct pt_regs *regs)
1732 fault_except = TRAP(regs);
1733 switch (TRAP(regs)) {
1745 longjmp(bus_error_jmp, 1);
1750 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
1753 byterev(unsigned char *val, int size)
1759 SWAP(val[0], val[1], t);
1762 SWAP(val[0], val[3], t);
1763 SWAP(val[1], val[2], t);
1765 case 8: /* is there really any use for this? */
1766 SWAP(val[0], val[7], t);
1767 SWAP(val[1], val[6], t);
1768 SWAP(val[2], val[5], t);
1769 SWAP(val[3], val[4], t);
1777 static char *memex_help_string =
1778 "Memory examine command usage:\n"
1779 "m [addr] [flags] examine/change memory\n"
1780 " addr is optional. will start where left off.\n"
1781 " flags may include chars from this set:\n"
1782 " b modify by bytes (default)\n"
1783 " w modify by words (2 byte)\n"
1784 " l modify by longs (4 byte)\n"
1785 " d modify by doubleword (8 byte)\n"
1786 " r toggle reverse byte order mode\n"
1787 " n do not read memory (for i/o spaces)\n"
1788 " . ok to read (default)\n"
1789 "NOTE: flags are saved as defaults\n"
1792 static char *memex_subcmd_help_string =
1793 "Memory examine subcommands:\n"
1794 " hexval write this val to current location\n"
1795 " 'string' write chars from string to this location\n"
1796 " ' increment address\n"
1797 " ^ decrement address\n"
1798 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
1799 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
1800 " ` clear no-read flag\n"
1801 " ; stay at this addr\n"
1802 " v change to byte mode\n"
1803 " w change to word (2 byte) mode\n"
1804 " l change to long (4 byte) mode\n"
1805 " u change to doubleword (8 byte) mode\n"
1806 " m addr change current addr\n"
1807 " n toggle no-read flag\n"
1808 " r toggle byte reverse flag\n"
1809 " < count back up count bytes\n"
1810 " > count skip forward count bytes\n"
1811 " x exit this mode\n"
1817 int cmd, inc, i, nslash;
1819 unsigned char val[16];
1821 scanhex((void *)&adrs);
1824 printf(memex_help_string);
1830 while ((cmd = skipbl()) != '\n') {
1832 case 'b': size = 1; break;
1833 case 'w': size = 2; break;
1834 case 'l': size = 4; break;
1835 case 'd': size = 8; break;
1836 case 'r': brev = !brev; break;
1837 case 'n': mnoread = 1; break;
1838 case '.': mnoread = 0; break;
1847 n = mread(adrs, val, size);
1848 printf(REG"%c", adrs, brev? 'r': ' ');
1853 for (i = 0; i < n; ++i)
1854 printf("%.2x", val[i]);
1855 for (; i < size; ++i)
1856 printf("%s", fault_chars[fault_type]);
1863 for (i = 0; i < size; ++i)
1864 val[i] = n >> (i * 8);
1867 mwrite(adrs, val, size);
1880 else if( n == '\'' )
1882 for (i = 0; i < size; ++i)
1883 val[i] = n >> (i * 8);
1886 mwrite(adrs, val, size);
1923 adrs -= 1 << nslash;
1927 adrs += 1 << nslash;
1931 adrs += 1 << -nslash;
1935 adrs -= 1 << -nslash;
1938 scanhex((void *)&adrs);
1957 printf(memex_subcmd_help_string);
1972 case 'n': c = '\n'; break;
1973 case 'r': c = '\r'; break;
1974 case 'b': c = '\b'; break;
1975 case 't': c = '\t'; break;
1980 static void xmon_rawdump (unsigned long adrs, long ndump)
1983 unsigned char temp[16];
1985 for (n = ndump; n > 0;) {
1987 nr = mread(adrs, temp, r);
1989 for (m = 0; m < r; ++m) {
1991 printf("%.2x", temp[m]);
1993 printf("%s", fault_chars[fault_type]);
2002 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
2003 || ('a' <= (c) && (c) <= 'f') \
2004 || ('A' <= (c) && (c) <= 'F'))
2011 if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
2013 scanhex((void *)&adrs);
2020 else if (nidump > MAX_DUMP)
2022 adrs += ppc_inst_dump(adrs, nidump, 1);
2024 } else if (c == 'r') {
2028 xmon_rawdump(adrs, ndump);
2035 else if (ndump > MAX_DUMP)
2037 prdump(adrs, ndump);
2044 prdump(unsigned long adrs, long ndump)
2046 long n, m, c, r, nr;
2047 unsigned char temp[16];
2049 for (n = ndump; n > 0;) {
2053 nr = mread(adrs, temp, r);
2055 for (m = 0; m < r; ++m) {
2056 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2059 printf("%.2x", temp[m]);
2061 printf("%s", fault_chars[fault_type]);
2063 for (; m < 16; ++m) {
2064 if ((m & (sizeof(long) - 1)) == 0)
2069 for (m = 0; m < r; ++m) {
2072 putchar(' ' <= c && c <= '~'? c: '.');
2085 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2088 generic_inst_dump(unsigned long adr, long count, int praddr,
2089 instruction_dump_func dump_func)
2092 unsigned long first_adr;
2093 unsigned long inst, last_inst = 0;
2094 unsigned char val[4];
2097 for (first_adr = adr; count > 0; --count, adr += 4) {
2098 nr = mread(adr, val, 4);
2101 const char *x = fault_chars[fault_type];
2102 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2106 inst = GETWORD(val);
2107 if (adr > first_adr && inst == last_inst) {
2117 printf(REG" %.8x", adr, inst);
2119 dump_func(inst, adr);
2122 return adr - first_adr;
2126 ppc_inst_dump(unsigned long adr, long count, int praddr)
2128 return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2132 print_address(unsigned long addr)
2134 xmon_print_symbol(addr, "\t# ", "");
2139 * Memory operations - move, set, print differences
2141 static unsigned long mdest; /* destination address */
2142 static unsigned long msrc; /* source address */
2143 static unsigned long mval; /* byte value to set memory to */
2144 static unsigned long mcount; /* # bytes to affect */
2145 static unsigned long mdiffs; /* max # differences to print */
2150 scanhex((void *)&mdest);
2151 if( termch != '\n' )
2153 scanhex((void *)(cmd == 's'? &mval: &msrc));
2154 if( termch != '\n' )
2156 scanhex((void *)&mcount);
2159 memmove((void *)mdest, (void *)msrc, mcount);
2162 memset((void *)mdest, mval, mcount);
2165 if( termch != '\n' )
2167 scanhex((void *)&mdiffs);
2168 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2174 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2179 for( n = nb; n > 0; --n )
2180 if( *p1++ != *p2++ )
2181 if( ++prt <= maxpr )
2182 printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,
2183 p1[-1], p2 - 1, p2[-1]);
2185 printf("Total of %d differences\n", prt);
2188 static unsigned mend;
2189 static unsigned mask;
2195 unsigned char val[4];
2198 scanhex((void *)&mdest);
2199 if (termch != '\n') {
2201 scanhex((void *)&mend);
2202 if (termch != '\n') {
2204 scanhex((void *)&mval);
2206 if (termch != '\n') termch = 0;
2207 scanhex((void *)&mask);
2211 for (a = mdest; a < mend; a += 4) {
2212 if (mread(a, val, 4) == 4
2213 && ((GETWORD(val) ^ mval) & mask) == 0) {
2214 printf("%.16x: %.16x\n", a, GETWORD(val));
2221 static unsigned long mskip = 0x1000;
2222 static unsigned long mlim = 0xffffffff;
2232 if (termch != '\n') termch = 0;
2234 if (termch != '\n') termch = 0;
2237 for (a = mdest; a < mlim; a += mskip) {
2238 ok = mread(a, &v, 1);
2240 printf("%.8x .. ", a);
2241 } else if (!ok && ook)
2242 printf("%.8x\n", a - mskip);
2248 printf("%.8x\n", a - mskip);
2253 unsigned long args[8];
2256 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
2257 unsigned long, unsigned long, unsigned long,
2258 unsigned long, unsigned long, unsigned long);
2261 if (!scanhex(&adrs))
2265 for (i = 0; i < 8; ++i)
2267 for (i = 0; i < 8; ++i) {
2268 if (!scanhex(&args[i]) || termch == '\n')
2272 func = (callfunc_t) adrs;
2274 if (setjmp(bus_error_jmp) == 0) {
2275 catch_memory_errors = 1;
2277 ret = func(args[0], args[1], args[2], args[3],
2278 args[4], args[5], args[6], args[7]);
2280 printf("return value is %x\n", ret);
2282 printf("*** %x exception occurred\n", fault_except);
2284 catch_memory_errors = 0;
2287 /* Input scanning routines */
2298 while( c == ' ' || c == '\t' )
2304 static char *regnames[N_PTREGS] = {
2305 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2306 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2307 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2308 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2309 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2315 "trap", "dar", "dsisr", "res"
2319 scanhex(unsigned long *vp)
2326 /* parse register name */
2330 for (i = 0; i < sizeof(regname) - 1; ++i) {
2339 for (i = 0; i < N_PTREGS; ++i) {
2340 if (strcmp(regnames[i], regname) == 0) {
2341 if (xmon_regs == NULL) {
2342 printf("regs not available\n");
2345 *vp = ((unsigned long *)xmon_regs)[i];
2349 printf("invalid register name '%%%s'\n", regname);
2353 /* skip leading "0x" if any */
2367 } else if (c == '$') {
2369 for (i=0; i<63; i++) {
2379 if (setjmp(bus_error_jmp) == 0) {
2380 catch_memory_errors = 1;
2382 *vp = kallsyms_lookup_name(tmpstr);
2385 catch_memory_errors = 0;
2387 printf("unknown symbol '%s'\n", tmpstr);
2422 if( '0' <= c && c <= '9' )
2424 if( 'A' <= c && c <= 'F' )
2425 return c - ('A' - 10);
2426 if( 'a' <= c && c <= 'f' )
2427 return c - ('a' - 10);
2432 getstring(char *s, int size)
2443 } while( c != ' ' && c != '\t' && c != '\n' );
2448 static char line[256];
2449 static char *lineptr;
2460 if (lineptr == NULL || *lineptr == 0) {
2461 if (xmon_gets(line, sizeof(line)) == NULL) {
2471 take_input(char *str)
2480 int type = inchar();
2482 static char tmp[64];
2487 xmon_print_symbol(addr, ": ", "\n");
2492 if (setjmp(bus_error_jmp) == 0) {
2493 catch_memory_errors = 1;
2495 addr = kallsyms_lookup_name(tmp);
2497 printf("%s: %lx\n", tmp, addr);
2499 printf("Symbol '%s' not found.\n", tmp);
2502 catch_memory_errors = 0;
2509 /* Print an address in numeric and symbolic form (if possible) */
2510 static void xmon_print_symbol(unsigned long address, const char *mid,
2514 const char *name = NULL;
2515 unsigned long offset, size;
2517 printf(REG, address);
2518 if (setjmp(bus_error_jmp) == 0) {
2519 catch_memory_errors = 1;
2521 name = kallsyms_lookup(address, &size, &offset, &modname,
2524 /* wait a little while to see if we get a machine check */
2528 catch_memory_errors = 0;
2531 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
2533 printf(" [%s]", modname);
2535 printf("%s", after);
2539 static void dump_slb(void)
2542 unsigned long esid,vsid,valid;
2545 printf("SLB contents of cpu %x\n", smp_processor_id());
2547 for (i = 0; i < mmu_slb_size; i++) {
2548 asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
2549 asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
2550 valid = (esid & SLB_ESID_V);
2551 if (valid | esid | vsid) {
2552 printf("%02d %016lx %016lx", i, esid, vsid);
2554 llp = vsid & SLB_VSID_LLP;
2555 if (vsid & SLB_VSID_B_1T) {
2556 printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
2558 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
2561 printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
2563 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
2572 static void dump_stab(void)
2575 unsigned long *tmp = (unsigned long *)get_paca()->stab_addr;
2577 printf("Segment table contents of cpu %x\n", smp_processor_id());
2579 for (i = 0; i < PAGE_SIZE/16; i++) {
2586 printf("%03d %016lx ", i, a);
2587 printf("%016lx\n", b);
2592 void dump_segments(void)
2594 if (cpu_has_feature(CPU_FTR_SLB))
2601 #ifdef CONFIG_PPC_STD_MMU_32
2602 void dump_segments(void)
2607 for (i = 0; i < 16; ++i)
2608 printf(" %x", mfsrin(i));
2614 static void dump_tlb_44x(void)
2618 for (i = 0; i < PPC44x_TLB_SIZE; i++) {
2619 unsigned long w0,w1,w2;
2620 asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
2621 asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
2622 asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
2623 printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
2624 if (w0 & PPC44x_TLB_VALID) {
2625 printf("V %08x -> %01x%08x %c%c%c%c%c",
2626 w0 & PPC44x_TLB_EPN_MASK,
2627 w1 & PPC44x_TLB_ERPN_MASK,
2628 w1 & PPC44x_TLB_RPN_MASK,
2629 (w2 & PPC44x_TLB_W) ? 'W' : 'w',
2630 (w2 & PPC44x_TLB_I) ? 'I' : 'i',
2631 (w2 & PPC44x_TLB_M) ? 'M' : 'm',
2632 (w2 & PPC44x_TLB_G) ? 'G' : 'g',
2633 (w2 & PPC44x_TLB_E) ? 'E' : 'e');
2638 #endif /* CONFIG_44x */
2639 void xmon_init(int enable)
2641 #ifdef CONFIG_PPC_ISERIES
2642 if (firmware_has_feature(FW_FEATURE_ISERIES))
2647 __debugger_ipi = xmon_ipi;
2648 __debugger_bpt = xmon_bpt;
2649 __debugger_sstep = xmon_sstep;
2650 __debugger_iabr_match = xmon_iabr_match;
2651 __debugger_dabr_match = xmon_dabr_match;
2652 __debugger_fault_handler = xmon_fault_handler;
2655 __debugger_ipi = NULL;
2656 __debugger_bpt = NULL;
2657 __debugger_sstep = NULL;
2658 __debugger_iabr_match = NULL;
2659 __debugger_dabr_match = NULL;
2660 __debugger_fault_handler = NULL;
2665 #ifdef CONFIG_MAGIC_SYSRQ
2666 static void sysrq_handle_xmon(int key, struct tty_struct *tty)
2668 /* ensure xmon is enabled */
2670 debugger(get_irq_regs());
2673 static struct sysrq_key_op sysrq_xmon_op =
2675 .handler = sysrq_handle_xmon,
2677 .action_msg = "Entering xmon",
2680 static int __init setup_xmon_sysrq(void)
2682 #ifdef CONFIG_PPC_ISERIES
2683 if (firmware_has_feature(FW_FEATURE_ISERIES))
2686 register_sysrq_key('x', &sysrq_xmon_op);
2689 __initcall(setup_xmon_sysrq);
2690 #endif /* CONFIG_MAGIC_SYSRQ */
2692 static int __initdata xmon_early, xmon_off;
2694 static int __init early_parse_xmon(char *p)
2696 if (!p || strncmp(p, "early", 5) == 0) {
2697 /* just "xmon" is equivalent to "xmon=early" */
2700 } else if (strncmp(p, "on", 2) == 0)
2702 else if (strncmp(p, "off", 3) == 0)
2704 else if (strncmp(p, "nobt", 4) == 0)
2705 xmon_no_auto_backtrace = 1;
2711 early_param("xmon", early_parse_xmon);
2713 void __init xmon_setup(void)
2715 #ifdef CONFIG_XMON_DEFAULT
2723 #ifdef CONFIG_SPU_BASE
2727 u64 saved_mfc_sr1_RW;
2728 u32 saved_spu_runcntl_RW;
2729 unsigned long dump_addr;
2733 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
2735 static struct spu_info spu_info[XMON_NUM_SPUS];
2737 void xmon_register_spus(struct list_head *list)
2741 list_for_each_entry(spu, list, full_list) {
2742 if (spu->number >= XMON_NUM_SPUS) {
2747 spu_info[spu->number].spu = spu;
2748 spu_info[spu->number].stopped_ok = 0;
2749 spu_info[spu->number].dump_addr = (unsigned long)
2750 spu_info[spu->number].spu->local_store;
2754 static void stop_spus(void)
2760 for (i = 0; i < XMON_NUM_SPUS; i++) {
2761 if (!spu_info[i].spu)
2764 if (setjmp(bus_error_jmp) == 0) {
2765 catch_memory_errors = 1;
2768 spu = spu_info[i].spu;
2770 spu_info[i].saved_spu_runcntl_RW =
2771 in_be32(&spu->problem->spu_runcntl_RW);
2773 tmp = spu_mfc_sr1_get(spu);
2774 spu_info[i].saved_mfc_sr1_RW = tmp;
2776 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
2777 spu_mfc_sr1_set(spu, tmp);
2782 spu_info[i].stopped_ok = 1;
2784 printf("Stopped spu %.2d (was %s)\n", i,
2785 spu_info[i].saved_spu_runcntl_RW ?
2786 "running" : "stopped");
2788 catch_memory_errors = 0;
2789 printf("*** Error stopping spu %.2d\n", i);
2791 catch_memory_errors = 0;
2795 static void restart_spus(void)
2800 for (i = 0; i < XMON_NUM_SPUS; i++) {
2801 if (!spu_info[i].spu)
2804 if (!spu_info[i].stopped_ok) {
2805 printf("*** Error, spu %d was not successfully stopped"
2806 ", not restarting\n", i);
2810 if (setjmp(bus_error_jmp) == 0) {
2811 catch_memory_errors = 1;
2814 spu = spu_info[i].spu;
2815 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
2816 out_be32(&spu->problem->spu_runcntl_RW,
2817 spu_info[i].saved_spu_runcntl_RW);
2822 printf("Restarted spu %.2d\n", i);
2824 catch_memory_errors = 0;
2825 printf("*** Error restarting spu %.2d\n", i);
2827 catch_memory_errors = 0;
2831 #define DUMP_WIDTH 23
2832 #define DUMP_VALUE(format, field, value) \
2834 if (setjmp(bus_error_jmp) == 0) { \
2835 catch_memory_errors = 1; \
2837 printf(" %-*s = "format"\n", DUMP_WIDTH, \
2842 catch_memory_errors = 0; \
2843 printf(" %-*s = *** Error reading field.\n", \
2844 DUMP_WIDTH, #field); \
2846 catch_memory_errors = 0; \
2849 #define DUMP_FIELD(obj, format, field) \
2850 DUMP_VALUE(format, field, obj->field)
2852 static void dump_spu_fields(struct spu *spu)
2854 printf("Dumping spu fields at address %p:\n", spu);
2856 DUMP_FIELD(spu, "0x%x", number);
2857 DUMP_FIELD(spu, "%s", name);
2858 DUMP_FIELD(spu, "0x%lx", local_store_phys);
2859 DUMP_FIELD(spu, "0x%p", local_store);
2860 DUMP_FIELD(spu, "0x%lx", ls_size);
2861 DUMP_FIELD(spu, "0x%x", node);
2862 DUMP_FIELD(spu, "0x%lx", flags);
2863 DUMP_FIELD(spu, "0x%lx", dar);
2864 DUMP_FIELD(spu, "0x%lx", dsisr);
2865 DUMP_FIELD(spu, "%d", class_0_pending);
2866 DUMP_FIELD(spu, "0x%lx", irqs[0]);
2867 DUMP_FIELD(spu, "0x%lx", irqs[1]);
2868 DUMP_FIELD(spu, "0x%lx", irqs[2]);
2869 DUMP_FIELD(spu, "0x%x", slb_replace);
2870 DUMP_FIELD(spu, "%d", pid);
2871 DUMP_FIELD(spu, "0x%p", mm);
2872 DUMP_FIELD(spu, "0x%p", ctx);
2873 DUMP_FIELD(spu, "0x%p", rq);
2874 DUMP_FIELD(spu, "0x%p", timestamp);
2875 DUMP_FIELD(spu, "0x%lx", problem_phys);
2876 DUMP_FIELD(spu, "0x%p", problem);
2877 DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
2878 in_be32(&spu->problem->spu_runcntl_RW));
2879 DUMP_VALUE("0x%x", problem->spu_status_R,
2880 in_be32(&spu->problem->spu_status_R));
2881 DUMP_VALUE("0x%x", problem->spu_npc_RW,
2882 in_be32(&spu->problem->spu_npc_RW));
2883 DUMP_FIELD(spu, "0x%p", priv2);
2884 DUMP_FIELD(spu, "0x%p", pdata);
2888 spu_inst_dump(unsigned long adr, long count, int praddr)
2890 return generic_inst_dump(adr, count, praddr, print_insn_spu);
2893 static void dump_spu_ls(unsigned long num, int subcmd)
2895 unsigned long offset, addr, ls_addr;
2897 if (setjmp(bus_error_jmp) == 0) {
2898 catch_memory_errors = 1;
2900 ls_addr = (unsigned long)spu_info[num].spu->local_store;
2904 catch_memory_errors = 0;
2905 printf("*** Error: accessing spu info for spu %d\n", num);
2908 catch_memory_errors = 0;
2910 if (scanhex(&offset))
2911 addr = ls_addr + offset;
2913 addr = spu_info[num].dump_addr;
2915 if (addr >= ls_addr + LS_SIZE) {
2916 printf("*** Error: address outside of local store\n");
2922 addr += spu_inst_dump(addr, 16, 1);
2932 spu_info[num].dump_addr = addr;
2935 static int do_spu_cmd(void)
2937 static unsigned long num = 0;
2938 int cmd, subcmd = 0;
2950 if (isxdigit(subcmd) || subcmd == '\n')
2954 if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
2955 printf("*** Error: invalid spu number\n");
2961 dump_spu_fields(spu_info[num].spu);
2964 dump_spu_ls(num, subcmd);
2975 #else /* ! CONFIG_SPU_BASE */
2976 static int do_spu_cmd(void)