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>
26 #include <asm/ptrace.h>
27 #include <asm/string.h>
29 #include <asm/machdep.h>
31 #include <asm/processor.h>
32 #include <asm/pgtable.h>
34 #include <asm/mmu_context.h>
35 #include <asm/cputable.h>
37 #include <asm/sstep.h>
39 #include <asm/irq_regs.h>
41 #include <asm/spu_priv1.h>
44 #include <asm/hvcall.h>
50 #define scanhex xmon_scanhex
51 #define skipbl xmon_skipbl
54 cpumask_t cpus_in_xmon = CPU_MASK_NONE;
55 static unsigned long xmon_taken = 1;
56 static int xmon_owner;
58 #endif /* CONFIG_SMP */
60 static unsigned long in_xmon = 0;
62 static unsigned long adrs;
64 #define MAX_DUMP (128 * 1024)
65 static unsigned long ndump = 64;
66 static unsigned long nidump = 16;
67 static unsigned long ncsum = 4096;
69 static char tmpstr[128];
71 #define JMP_BUF_LEN 23
72 static long bus_error_jmp[JMP_BUF_LEN];
73 static int catch_memory_errors;
74 static long *xmon_fault_jmp[NR_CPUS];
75 #define setjmp xmon_setjmp
76 #define longjmp xmon_longjmp
78 /* Breakpoint stuff */
80 unsigned long address;
81 unsigned int instr[2];
87 /* Bits in bpt.enabled */
88 #define BP_IABR_TE 1 /* IABR translation enabled */
94 static struct bpt bpts[NBPTS];
95 static struct bpt dabr;
96 static struct bpt *iabr;
97 static unsigned bpinstr = 0x7fe00008; /* trap */
99 #define BP_NUM(bp) ((bp) - bpts + 1)
102 static int cmds(struct pt_regs *);
103 static int mread(unsigned long, void *, int);
104 static int mwrite(unsigned long, void *, int);
105 static int handle_fault(struct pt_regs *);
106 static void byterev(unsigned char *, int);
107 static void memex(void);
108 static int bsesc(void);
109 static void dump(void);
110 static void prdump(unsigned long, long);
111 static int ppc_inst_dump(unsigned long, long, int);
112 void print_address(unsigned long);
113 static void backtrace(struct pt_regs *);
114 static void excprint(struct pt_regs *);
115 static void prregs(struct pt_regs *);
116 static void memops(int);
117 static void memlocate(void);
118 static void memzcan(void);
119 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
121 int scanhex(unsigned long *valp);
122 static void scannl(void);
123 static int hexdigit(int);
124 void getstring(char *, int);
125 static void flush_input(void);
126 static int inchar(void);
127 static void take_input(char *);
128 static unsigned long read_spr(int);
129 static void write_spr(int, unsigned long);
130 static void super_regs(void);
131 static void remove_bpts(void);
132 static void insert_bpts(void);
133 static void remove_cpu_bpts(void);
134 static void insert_cpu_bpts(void);
135 static struct bpt *at_breakpoint(unsigned long pc);
136 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
137 static int do_step(struct pt_regs *);
138 static void bpt_cmds(void);
139 static void cacheflush(void);
140 static int cpu_cmd(void);
141 static void csum(void);
142 static void bootcmds(void);
143 static void proccall(void);
144 void dump_segments(void);
145 static void symbol_lookup(void);
146 static void xmon_show_stack(unsigned long sp, unsigned long lr,
148 static void xmon_print_symbol(unsigned long address, const char *mid,
150 static const char *getvecname(unsigned long vec);
152 static int do_spu_cmd(void);
154 int xmon_no_auto_backtrace;
156 extern int print_insn_powerpc(unsigned long, unsigned long, int);
158 extern void xmon_enter(void);
159 extern void xmon_leave(void);
161 extern long setjmp(long *);
162 extern void longjmp(long *, long);
163 extern void xmon_save_regs(struct pt_regs *);
167 #define REGS_PER_LINE 4
168 #define LAST_VOLATILE 13
171 #define REGS_PER_LINE 8
172 #define LAST_VOLATILE 12
175 #define GETWORD(v) (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
177 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
178 || ('a' <= (c) && (c) <= 'f') \
179 || ('A' <= (c) && (c) <= 'F'))
180 #define isalnum(c) (('0' <= (c) && (c) <= '9') \
181 || ('a' <= (c) && (c) <= 'z') \
182 || ('A' <= (c) && (c) <= 'Z'))
183 #define isspace(c) (c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
185 static char *help_string = "\
187 b show breakpoints\n\
188 bd set data breakpoint\n\
189 bi set instruction breakpoint\n\
190 bc clear breakpoint\n"
193 c print cpus stopped in xmon\n\
194 c# try to switch to cpu number h (in hex)\n"
199 di dump instructions\n\
200 df dump float values\n\
201 dd dump double values\n\
202 dr dump stream of raw bytes\n\
203 e print exception information\n\
205 la lookup symbol+offset of specified address\n\
206 ls lookup address of specified symbol\n\
207 m examine/change memory\n\
208 mm move a block of memory\n\
209 ms set a block of memory\n\
210 md compare two blocks of memory\n\
211 ml locate a block of memory\n\
212 mz zero a block of memory\n\
213 mi show information about memory allocation\n\
214 p call a procedure\n\
217 #ifdef CONFIG_PPC_CELL
218 " ss stop execution on all spus\n\
219 sr restore execution on stopped spus\n\
220 sf # dump spu fields for spu # (in hex)\n"
222 " S print special registers\n\
224 x exit monitor and recover\n\
225 X exit monitor and dont recover\n"
227 " u dump segment table or SLB\n"
229 #ifdef CONFIG_PPC_STD_MMU_32
230 " u dump segment registers\n"
237 static struct pt_regs *xmon_regs;
239 static inline void sync(void)
241 asm volatile("sync; isync");
244 static inline void store_inst(void *p)
246 asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
249 static inline void cflush(void *p)
251 asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
254 static inline void cinval(void *p)
256 asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
260 * Disable surveillance (the service processor watchdog function)
261 * while we are in xmon.
262 * XXX we should re-enable it when we leave. :)
264 #define SURVEILLANCE_TOKEN 9000
266 static inline void disable_surveillance(void)
268 #ifdef CONFIG_PPC_PSERIES
269 /* Since this can't be a module, args should end up below 4GB. */
270 static struct rtas_args args;
273 * At this point we have got all the cpus we can into
274 * xmon, so there is hopefully no other cpu calling RTAS
275 * at the moment, even though we don't take rtas.lock.
276 * If we did try to take rtas.lock there would be a
277 * real possibility of deadlock.
279 args.token = rtas_token("set-indicator");
280 if (args.token == RTAS_UNKNOWN_SERVICE)
284 args.rets = &args.args[3];
285 args.args[0] = SURVEILLANCE_TOKEN;
288 enter_rtas(__pa(&args));
289 #endif /* CONFIG_PPC_PSERIES */
293 static int xmon_speaker;
295 static void get_output_lock(void)
297 int me = smp_processor_id() + 0x100;
298 int last_speaker = 0, prev;
301 if (xmon_speaker == me)
304 if (xmon_speaker == 0) {
305 last_speaker = cmpxchg(&xmon_speaker, 0, me);
306 if (last_speaker == 0)
310 while (xmon_speaker == last_speaker) {
313 /* hostile takeover */
314 prev = cmpxchg(&xmon_speaker, last_speaker, me);
315 if (prev == last_speaker)
322 static void release_output_lock(void)
328 static int xmon_core(struct pt_regs *regs, int fromipi)
333 long recurse_jmp[JMP_BUF_LEN];
334 unsigned long offset;
338 unsigned long timeout;
342 mtmsr(msr & ~MSR_EE); /* disable interrupts */
344 bp = in_breakpoint_table(regs->nip, &offset);
346 regs->nip = bp->address + offset;
347 atomic_dec(&bp->ref_count);
353 cpu = smp_processor_id();
354 if (cpu_isset(cpu, cpus_in_xmon)) {
357 printf("cpu 0x%x: Exception %lx %s in xmon, "
358 "returning to main loop\n",
359 cpu, regs->trap, getvecname(TRAP(regs)));
360 release_output_lock();
361 longjmp(xmon_fault_jmp[cpu], 1);
364 if (setjmp(recurse_jmp) != 0) {
365 if (!in_xmon || !xmon_gate) {
367 printf("xmon: WARNING: bad recursive fault "
368 "on cpu 0x%x\n", cpu);
369 release_output_lock();
372 secondary = !(xmon_taken && cpu == xmon_owner);
376 xmon_fault_jmp[cpu] = recurse_jmp;
377 cpu_set(cpu, cpus_in_xmon);
380 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF))
381 bp = at_breakpoint(regs->nip);
382 if (bp || (regs->msr & MSR_RI) == 0)
389 printf("cpu 0x%x stopped at breakpoint 0x%x (",
391 xmon_print_symbol(regs->nip, " ", ")\n");
393 if ((regs->msr & MSR_RI) == 0)
394 printf("WARNING: exception is not recoverable, "
396 release_output_lock();
401 while (secondary && !xmon_gate) {
405 secondary = test_and_set_bit(0, &in_xmon);
410 if (!secondary && !xmon_gate) {
411 /* we are the first cpu to come in */
412 /* interrupt other cpu(s) */
413 int ncpus = num_online_cpus();
418 smp_send_debugger_break(MSG_ALL_BUT_SELF);
419 /* wait for other cpus to come in */
420 for (timeout = 100000000; timeout != 0; --timeout) {
421 if (cpus_weight(cpus_in_xmon) >= ncpus)
427 disable_surveillance();
428 /* for breakpoint or single step, print the current instr. */
429 if (bp || TRAP(regs) == 0xd00)
430 ppc_inst_dump(regs->nip, 1, 0);
431 printf("enter ? for help\n");
440 if (cpu == xmon_owner) {
441 if (!test_and_set_bit(0, &xmon_taken)) {
446 while (cpu == xmon_owner)
460 /* have switched to some other cpu */
465 cpu_clear(cpu, cpus_in_xmon);
466 xmon_fault_jmp[cpu] = NULL;
468 /* UP is simple... */
470 printf("Exception %lx %s in xmon, returning to main loop\n",
471 regs->trap, getvecname(TRAP(regs)));
472 longjmp(xmon_fault_jmp[0], 1);
474 if (setjmp(recurse_jmp) == 0) {
475 xmon_fault_jmp[0] = recurse_jmp;
479 bp = at_breakpoint(regs->nip);
481 printf("Stopped at breakpoint %x (", BP_NUM(bp));
482 xmon_print_symbol(regs->nip, " ", ")\n");
484 if ((regs->msr & MSR_RI) == 0)
485 printf("WARNING: exception is not recoverable, "
488 disable_surveillance();
489 /* for breakpoint or single step, print the current instr. */
490 if (bp || TRAP(regs) == 0xd00)
491 ppc_inst_dump(regs->nip, 1, 0);
492 printf("enter ? for help\n");
501 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF)) {
502 bp = at_breakpoint(regs->nip);
504 int stepped = emulate_step(regs, bp->instr[0]);
506 regs->nip = (unsigned long) &bp->instr[0];
507 atomic_inc(&bp->ref_count);
508 } else if (stepped < 0) {
509 printf("Couldn't single-step %s instruction\n",
510 (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
517 mtmsr(msr); /* restore interrupt enable */
519 return cmd != 'X' && cmd != EOF;
522 int xmon(struct pt_regs *excp)
527 xmon_save_regs(®s);
531 return xmon_core(excp, 0);
535 irqreturn_t xmon_irq(int irq, void *d)
538 local_irq_save(flags);
539 printf("Keyboard interrupt\n");
540 xmon(get_irq_regs());
541 local_irq_restore(flags);
545 static int xmon_bpt(struct pt_regs *regs)
548 unsigned long offset;
550 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
553 /* Are we at the trap at bp->instr[1] for some bp? */
554 bp = in_breakpoint_table(regs->nip, &offset);
555 if (bp != NULL && offset == 4) {
556 regs->nip = bp->address + 4;
557 atomic_dec(&bp->ref_count);
561 /* Are we at a breakpoint? */
562 bp = at_breakpoint(regs->nip);
571 static int xmon_sstep(struct pt_regs *regs)
579 static int xmon_dabr_match(struct pt_regs *regs)
581 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
583 if (dabr.enabled == 0)
589 static int xmon_iabr_match(struct pt_regs *regs)
591 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) != (MSR_IR|MSR_SF))
599 static int xmon_ipi(struct pt_regs *regs)
602 if (in_xmon && !cpu_isset(smp_processor_id(), cpus_in_xmon))
608 static int xmon_fault_handler(struct pt_regs *regs)
611 unsigned long offset;
613 if (in_xmon && catch_memory_errors)
614 handle_fault(regs); /* doesn't return */
616 if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF)) {
617 bp = in_breakpoint_table(regs->nip, &offset);
619 regs->nip = bp->address + offset;
620 atomic_dec(&bp->ref_count);
627 static struct bpt *at_breakpoint(unsigned long pc)
633 for (i = 0; i < NBPTS; ++i, ++bp)
634 if (bp->enabled && pc == bp->address)
639 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
643 off = nip - (unsigned long) bpts;
644 if (off >= sizeof(bpts))
646 off %= sizeof(struct bpt);
647 if (off != offsetof(struct bpt, instr[0])
648 && off != offsetof(struct bpt, instr[1]))
650 *offp = off - offsetof(struct bpt, instr[0]);
651 return (struct bpt *) (nip - off);
654 static struct bpt *new_breakpoint(unsigned long a)
659 bp = at_breakpoint(a);
663 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
664 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
666 bp->instr[1] = bpinstr;
667 store_inst(&bp->instr[1]);
672 printf("Sorry, no free breakpoints. Please clear one first.\n");
676 static void insert_bpts(void)
682 for (i = 0; i < NBPTS; ++i, ++bp) {
683 if ((bp->enabled & (BP_TRAP|BP_IABR)) == 0)
685 if (mread(bp->address, &bp->instr[0], 4) != 4) {
686 printf("Couldn't read instruction at %lx, "
687 "disabling breakpoint there\n", bp->address);
691 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
692 printf("Breakpoint at %lx is on an mtmsrd or rfid "
693 "instruction, disabling it\n", bp->address);
697 store_inst(&bp->instr[0]);
698 if (bp->enabled & BP_IABR)
700 if (mwrite(bp->address, &bpinstr, 4) != 4) {
701 printf("Couldn't write instruction at %lx, "
702 "disabling breakpoint there\n", bp->address);
703 bp->enabled &= ~BP_TRAP;
706 store_inst((void *)bp->address);
710 static void insert_cpu_bpts(void)
713 set_dabr(dabr.address | (dabr.enabled & 7));
714 if (iabr && cpu_has_feature(CPU_FTR_IABR))
715 mtspr(SPRN_IABR, iabr->address
716 | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
719 static void remove_bpts(void)
726 for (i = 0; i < NBPTS; ++i, ++bp) {
727 if ((bp->enabled & (BP_TRAP|BP_IABR)) != BP_TRAP)
729 if (mread(bp->address, &instr, 4) == 4
731 && mwrite(bp->address, &bp->instr, 4) != 4)
732 printf("Couldn't remove breakpoint at %lx\n",
735 store_inst((void *)bp->address);
739 static void remove_cpu_bpts(void)
742 if (cpu_has_feature(CPU_FTR_IABR))
746 /* Command interpreting routine */
747 static char *last_cmd;
750 cmds(struct pt_regs *excp)
757 if (!xmon_no_auto_backtrace) {
758 xmon_no_auto_backtrace = 1;
759 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
764 printf("%x:", smp_processor_id());
765 #endif /* CONFIG_SMP */
771 if (last_cmd == NULL)
773 take_input(last_cmd);
807 prregs(excp); /* print regs */
822 if (do_spu_cmd() == 0)
831 printf(" <no input ...>\n");
853 #ifdef CONFIG_PPC_STD_MMU
859 printf("Unrecognized command: ");
861 if (' ' < cmd && cmd <= '~')
864 printf("\\x%x", cmd);
866 } while (cmd != '\n');
867 printf(" (type ? for help)\n");
874 * Step a single instruction.
875 * Some instructions we emulate, others we execute with MSR_SE set.
877 static int do_step(struct pt_regs *regs)
882 /* check we are in 64-bit kernel mode, translation enabled */
883 if ((regs->msr & (MSR_SF|MSR_PR|MSR_IR)) == (MSR_SF|MSR_IR)) {
884 if (mread(regs->nip, &instr, 4) == 4) {
885 stepped = emulate_step(regs, instr);
887 printf("Couldn't single-step %s instruction\n",
888 (IS_RFID(instr)? "rfid": "mtmsrd"));
892 regs->trap = 0xd00 | (regs->trap & 1);
893 printf("stepped to ");
894 xmon_print_symbol(regs->nip, " ", "\n");
895 ppc_inst_dump(regs->nip, 1, 0);
904 static void bootcmds(void)
910 ppc_md.restart(NULL);
917 static int cpu_cmd(void)
924 if (!scanhex(&cpu)) {
925 /* print cpus waiting or in xmon */
926 printf("cpus stopped:");
928 for (cpu = 0; cpu < NR_CPUS; ++cpu) {
929 if (cpu_isset(cpu, cpus_in_xmon)) {
935 printf("-%x", cpu - 1);
940 printf("-%x", NR_CPUS - 1);
944 /* try to switch to cpu specified */
945 if (!cpu_isset(cpu, cpus_in_xmon)) {
946 printf("cpu 0x%x isn't in xmon\n", cpu);
953 while (!xmon_taken) {
954 if (--timeout == 0) {
955 if (test_and_set_bit(0, &xmon_taken))
957 /* take control back */
959 xmon_owner = smp_processor_id();
960 printf("cpu %u didn't take control\n", cpu);
968 #endif /* CONFIG_SMP */
971 static unsigned short fcstab[256] = {
972 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
973 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
974 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
975 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
976 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
977 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
978 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
979 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
980 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
981 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
982 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
983 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
984 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
985 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
986 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
987 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
988 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
989 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
990 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
991 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
992 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
993 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
994 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
995 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
996 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
997 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
998 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
999 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1000 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1001 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1002 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1003 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1006 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1015 if (!scanhex(&adrs))
1017 if (!scanhex(&ncsum))
1020 for (i = 0; i < ncsum; ++i) {
1021 if (mread(adrs+i, &v, 1) == 0) {
1022 printf("csum stopped at %x\n", adrs+i);
1027 printf("%x\n", fcs);
1031 * Check if this is a suitable place to put a breakpoint.
1033 static long check_bp_loc(unsigned long addr)
1038 if (!is_kernel_addr(addr)) {
1039 printf("Breakpoints may only be placed at kernel addresses\n");
1042 if (!mread(addr, &instr, sizeof(instr))) {
1043 printf("Can't read instruction at address %lx\n", addr);
1046 if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1047 printf("Breakpoints may not be placed on mtmsrd or rfid "
1054 static char *breakpoint_help_string =
1055 "Breakpoint command usage:\n"
1056 "b show breakpoints\n"
1057 "b <addr> [cnt] set breakpoint at given instr addr\n"
1058 "bc clear all breakpoints\n"
1059 "bc <n/addr> clear breakpoint number n or at addr\n"
1060 "bi <addr> [cnt] set hardware instr breakpoint (POWER3/RS64 only)\n"
1061 "bd <addr> [cnt] set hardware data breakpoint\n"
1071 const char badaddr[] = "Only kernel addresses are permitted "
1072 "for breakpoints\n";
1077 case 'd': /* bd - hardware data breakpoint */
1082 else if (cmd == 'w')
1088 if (scanhex(&dabr.address)) {
1089 if (!is_kernel_addr(dabr.address)) {
1094 dabr.enabled = mode | BP_DABR;
1098 case 'i': /* bi - hardware instr breakpoint */
1099 if (!cpu_has_feature(CPU_FTR_IABR)) {
1100 printf("Hardware instruction breakpoint "
1101 "not supported on this cpu\n");
1105 iabr->enabled &= ~(BP_IABR | BP_IABR_TE);
1110 if (!check_bp_loc(a))
1112 bp = new_breakpoint(a);
1114 bp->enabled |= BP_IABR | BP_IABR_TE;
1122 /* clear all breakpoints */
1123 for (i = 0; i < NBPTS; ++i)
1124 bpts[i].enabled = 0;
1127 printf("All breakpoints cleared\n");
1131 if (a <= NBPTS && a >= 1) {
1132 /* assume a breakpoint number */
1133 bp = &bpts[a-1]; /* bp nums are 1 based */
1135 /* assume a breakpoint address */
1136 bp = at_breakpoint(a);
1138 printf("No breakpoint at %x\n", a);
1143 printf("Cleared breakpoint %x (", BP_NUM(bp));
1144 xmon_print_symbol(bp->address, " ", ")\n");
1152 printf(breakpoint_help_string);
1157 /* print all breakpoints */
1158 printf(" type address\n");
1160 printf(" data "REG" [", dabr.address);
1161 if (dabr.enabled & 1)
1163 if (dabr.enabled & 2)
1167 for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1170 printf("%2x %s ", BP_NUM(bp),
1171 (bp->enabled & BP_IABR)? "inst": "trap");
1172 xmon_print_symbol(bp->address, " ", "\n");
1177 if (!check_bp_loc(a))
1179 bp = new_breakpoint(a);
1181 bp->enabled |= BP_TRAP;
1186 /* Very cheap human name for vector lookup. */
1188 const char *getvecname(unsigned long vec)
1193 case 0x100: ret = "(System Reset)"; break;
1194 case 0x200: ret = "(Machine Check)"; break;
1195 case 0x300: ret = "(Data Access)"; break;
1196 case 0x380: ret = "(Data SLB Access)"; break;
1197 case 0x400: ret = "(Instruction Access)"; break;
1198 case 0x480: ret = "(Instruction SLB Access)"; break;
1199 case 0x500: ret = "(Hardware Interrupt)"; break;
1200 case 0x600: ret = "(Alignment)"; break;
1201 case 0x700: ret = "(Program Check)"; break;
1202 case 0x800: ret = "(FPU Unavailable)"; break;
1203 case 0x900: ret = "(Decrementer)"; break;
1204 case 0xc00: ret = "(System Call)"; break;
1205 case 0xd00: ret = "(Single Step)"; break;
1206 case 0xf00: ret = "(Performance Monitor)"; break;
1207 case 0xf20: ret = "(Altivec Unavailable)"; break;
1208 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1214 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1215 unsigned long *endp)
1217 unsigned long size, offset;
1221 *startp = *endp = 0;
1224 if (setjmp(bus_error_jmp) == 0) {
1225 catch_memory_errors = 1;
1227 name = kallsyms_lookup(pc, &size, &offset, &modname, tmpstr);
1229 *startp = pc - offset;
1230 *endp = pc - offset + size;
1234 catch_memory_errors = 0;
1237 static int xmon_depth_to_print = 64;
1240 #define LRSAVE_OFFSET 0x10
1241 #define REG_FRAME_MARKER 0x7265677368657265ul /* "regshere" */
1242 #define MARKER_OFFSET 0x60
1243 #define REGS_OFFSET 0x70
1245 #define LRSAVE_OFFSET 4
1246 #define REG_FRAME_MARKER 0x72656773
1247 #define MARKER_OFFSET 8
1248 #define REGS_OFFSET 16
1251 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1255 unsigned long newsp;
1256 unsigned long marker;
1258 struct pt_regs regs;
1261 if (sp < PAGE_OFFSET) {
1263 printf("SP (%lx) is in userspace\n", sp);
1267 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1268 || !mread(sp, &newsp, sizeof(unsigned long))) {
1269 printf("Couldn't read stack frame at %lx\n", sp);
1274 * For the first stack frame, try to work out if
1275 * LR and/or the saved LR value in the bottommost
1276 * stack frame are valid.
1278 if ((pc | lr) != 0) {
1279 unsigned long fnstart, fnend;
1280 unsigned long nextip;
1283 get_function_bounds(pc, &fnstart, &fnend);
1286 mread(newsp + LRSAVE_OFFSET, &nextip,
1287 sizeof(unsigned long));
1289 if (lr < PAGE_OFFSET
1290 || (fnstart <= lr && lr < fnend))
1292 } else if (lr == nextip) {
1294 } else if (lr >= PAGE_OFFSET
1295 && !(fnstart <= lr && lr < fnend)) {
1296 printf("[link register ] ");
1297 xmon_print_symbol(lr, " ", "\n");
1300 printf("["REG"] ", sp);
1301 xmon_print_symbol(ip, " ", " (unreliable)\n");
1306 printf("["REG"] ", sp);
1307 xmon_print_symbol(ip, " ", "\n");
1310 /* Look for "regshere" marker to see if this is
1311 an exception frame. */
1312 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1313 && marker == REG_FRAME_MARKER) {
1314 if (mread(sp + REGS_OFFSET, ®s, sizeof(regs))
1316 printf("Couldn't read registers at %lx\n",
1320 printf("--- Exception: %lx %s at ", regs.trap,
1321 getvecname(TRAP(®s)));
1324 xmon_print_symbol(pc, " ", "\n");
1331 } while (count++ < xmon_depth_to_print);
1334 static void backtrace(struct pt_regs *excp)
1339 xmon_show_stack(sp, 0, 0);
1341 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1345 static void print_bug_trap(struct pt_regs *regs)
1347 struct bug_entry *bug;
1350 if (regs->msr & MSR_PR)
1351 return; /* not in kernel */
1352 addr = regs->nip; /* address of trap instruction */
1353 if (addr < PAGE_OFFSET)
1355 bug = find_bug(regs->nip);
1358 if (bug->line & BUG_WARNING_TRAP)
1361 printf("kernel BUG in %s at %s:%d!\n",
1362 bug->function, bug->file, (unsigned int)bug->line);
1365 void excprint(struct pt_regs *fp)
1370 printf("cpu 0x%x: ", smp_processor_id());
1371 #endif /* CONFIG_SMP */
1374 printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp);
1376 xmon_print_symbol(fp->nip, ": ", "\n");
1378 printf(" lr: ", fp->link);
1379 xmon_print_symbol(fp->link, ": ", "\n");
1381 printf(" sp: %lx\n", fp->gpr[1]);
1382 printf(" msr: %lx\n", fp->msr);
1384 if (trap == 0x300 || trap == 0x380 || trap == 0x600) {
1385 printf(" dar: %lx\n", fp->dar);
1387 printf(" dsisr: %lx\n", fp->dsisr);
1390 printf(" current = 0x%lx\n", current);
1392 printf(" paca = 0x%lx\n", get_paca());
1395 printf(" pid = %ld, comm = %s\n",
1396 current->pid, current->comm);
1403 void prregs(struct pt_regs *fp)
1407 struct pt_regs regs;
1409 if (scanhex(&base)) {
1410 if (setjmp(bus_error_jmp) == 0) {
1411 catch_memory_errors = 1;
1413 regs = *(struct pt_regs *)base;
1417 catch_memory_errors = 0;
1418 printf("*** Error reading registers from "REG"\n",
1422 catch_memory_errors = 0;
1427 if (FULL_REGS(fp)) {
1428 for (n = 0; n < 16; ++n)
1429 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1430 n, fp->gpr[n], n+16, fp->gpr[n+16]);
1432 for (n = 0; n < 7; ++n)
1433 printf("R%.2ld = "REG" R%.2ld = "REG"\n",
1434 n, fp->gpr[n], n+7, fp->gpr[n+7]);
1437 for (n = 0; n < 32; ++n) {
1438 printf("R%.2d = %.8x%s", n, fp->gpr[n],
1439 (n & 3) == 3? "\n": " ");
1440 if (n == 12 && !FULL_REGS(fp)) {
1447 xmon_print_symbol(fp->nip, " ", "\n");
1449 xmon_print_symbol(fp->link, " ", "\n");
1450 printf("msr = "REG" cr = %.8lx\n", fp->msr, fp->ccr);
1451 printf("ctr = "REG" xer = "REG" trap = %4lx\n",
1452 fp->ctr, fp->xer, fp->trap);
1454 if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1455 printf("dar = "REG" dsisr = %.8lx\n", fp->dar, fp->dsisr);
1458 void cacheflush(void)
1461 unsigned long nflush;
1466 scanhex((void *)&adrs);
1471 nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1472 if (setjmp(bus_error_jmp) == 0) {
1473 catch_memory_errors = 1;
1477 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1478 cflush((void *) adrs);
1480 for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1481 cinval((void *) adrs);
1484 /* wait a little while to see if we get a machine check */
1487 catch_memory_errors = 0;
1493 unsigned int instrs[2];
1494 unsigned long (*code)(void);
1495 unsigned long ret = -1UL;
1497 unsigned long opd[3];
1499 opd[0] = (unsigned long)instrs;
1502 code = (unsigned long (*)(void)) opd;
1504 code = (unsigned long (*)(void)) instrs;
1507 /* mfspr r3,n; blr */
1508 instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1509 instrs[1] = 0x4e800020;
1511 store_inst(instrs+1);
1513 if (setjmp(bus_error_jmp) == 0) {
1514 catch_memory_errors = 1;
1520 /* wait a little while to see if we get a machine check */
1529 write_spr(int n, unsigned long val)
1531 unsigned int instrs[2];
1532 unsigned long (*code)(unsigned long);
1534 unsigned long opd[3];
1536 opd[0] = (unsigned long)instrs;
1539 code = (unsigned long (*)(unsigned long)) opd;
1541 code = (unsigned long (*)(unsigned long)) instrs;
1544 instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1545 instrs[1] = 0x4e800020;
1547 store_inst(instrs+1);
1549 if (setjmp(bus_error_jmp) == 0) {
1550 catch_memory_errors = 1;
1556 /* wait a little while to see if we get a machine check */
1562 static unsigned long regno;
1563 extern char exc_prolog;
1564 extern char dec_exc;
1566 void super_regs(void)
1570 #ifdef CONFIG_PPC_ISERIES
1571 struct paca_struct *ptrPaca = NULL;
1572 struct lppaca *ptrLpPaca = NULL;
1573 struct ItLpRegSave *ptrLpRegSave = NULL;
1578 unsigned long sp, toc;
1579 asm("mr %0,1" : "=r" (sp) :);
1580 asm("mr %0,2" : "=r" (toc) :);
1582 printf("msr = "REG" sprg0= "REG"\n",
1583 mfmsr(), mfspr(SPRN_SPRG0));
1584 printf("pvr = "REG" sprg1= "REG"\n",
1585 mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1586 printf("dec = "REG" sprg2= "REG"\n",
1587 mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1588 printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3));
1589 printf("toc = "REG" dar = "REG"\n", toc, mfspr(SPRN_DAR));
1590 #ifdef CONFIG_PPC_ISERIES
1591 // Dump out relevant Paca data areas.
1593 ptrPaca = get_paca();
1595 printf(" Local Processor Control Area (LpPaca): \n");
1596 ptrLpPaca = ptrPaca->lppaca_ptr;
1597 printf(" Saved Srr0=%.16lx Saved Srr1=%.16lx \n",
1598 ptrLpPaca->saved_srr0, ptrLpPaca->saved_srr1);
1599 printf(" Saved Gpr3=%.16lx Saved Gpr4=%.16lx \n",
1600 ptrLpPaca->saved_gpr3, ptrLpPaca->saved_gpr4);
1601 printf(" Saved Gpr5=%.16lx \n", ptrLpPaca->saved_gpr5);
1603 printf(" Local Processor Register Save Area (LpRegSave): \n");
1604 ptrLpRegSave = ptrPaca->reg_save_ptr;
1605 printf(" Saved Sprg0=%.16lx Saved Sprg1=%.16lx \n",
1606 ptrLpRegSave->xSPRG0, ptrLpRegSave->xSPRG0);
1607 printf(" Saved Sprg2=%.16lx Saved Sprg3=%.16lx \n",
1608 ptrLpRegSave->xSPRG2, ptrLpRegSave->xSPRG3);
1609 printf(" Saved Msr =%.16lx Saved Nia =%.16lx \n",
1610 ptrLpRegSave->xMSR, ptrLpRegSave->xNIA);
1619 val = read_spr(regno);
1621 write_spr(regno, val);
1624 printf("spr %lx = %lx\n", regno, read_spr(regno));
1631 * Stuff for reading and writing memory safely
1634 mread(unsigned long adrs, void *buf, int size)
1640 if (setjmp(bus_error_jmp) == 0) {
1641 catch_memory_errors = 1;
1647 *(u16 *)q = *(u16 *)p;
1650 *(u32 *)q = *(u32 *)p;
1653 *(u64 *)q = *(u64 *)p;
1656 for( ; n < size; ++n) {
1662 /* wait a little while to see if we get a machine check */
1666 catch_memory_errors = 0;
1671 mwrite(unsigned long adrs, void *buf, int size)
1677 if (setjmp(bus_error_jmp) == 0) {
1678 catch_memory_errors = 1;
1684 *(u16 *)p = *(u16 *)q;
1687 *(u32 *)p = *(u32 *)q;
1690 *(u64 *)p = *(u64 *)q;
1693 for ( ; n < size; ++n) {
1699 /* wait a little while to see if we get a machine check */
1703 printf("*** Error writing address %x\n", adrs + n);
1705 catch_memory_errors = 0;
1709 static int fault_type;
1710 static int fault_except;
1711 static char *fault_chars[] = { "--", "**", "##" };
1713 static int handle_fault(struct pt_regs *regs)
1715 fault_except = TRAP(regs);
1716 switch (TRAP(regs)) {
1728 longjmp(bus_error_jmp, 1);
1733 #define SWAP(a, b, t) ((t) = (a), (a) = (b), (b) = (t))
1736 byterev(unsigned char *val, int size)
1742 SWAP(val[0], val[1], t);
1745 SWAP(val[0], val[3], t);
1746 SWAP(val[1], val[2], t);
1748 case 8: /* is there really any use for this? */
1749 SWAP(val[0], val[7], t);
1750 SWAP(val[1], val[6], t);
1751 SWAP(val[2], val[5], t);
1752 SWAP(val[3], val[4], t);
1760 static char *memex_help_string =
1761 "Memory examine command usage:\n"
1762 "m [addr] [flags] examine/change memory\n"
1763 " addr is optional. will start where left off.\n"
1764 " flags may include chars from this set:\n"
1765 " b modify by bytes (default)\n"
1766 " w modify by words (2 byte)\n"
1767 " l modify by longs (4 byte)\n"
1768 " d modify by doubleword (8 byte)\n"
1769 " r toggle reverse byte order mode\n"
1770 " n do not read memory (for i/o spaces)\n"
1771 " . ok to read (default)\n"
1772 "NOTE: flags are saved as defaults\n"
1775 static char *memex_subcmd_help_string =
1776 "Memory examine subcommands:\n"
1777 " hexval write this val to current location\n"
1778 " 'string' write chars from string to this location\n"
1779 " ' increment address\n"
1780 " ^ decrement address\n"
1781 " / increment addr by 0x10. //=0x100, ///=0x1000, etc\n"
1782 " \\ decrement addr by 0x10. \\\\=0x100, \\\\\\=0x1000, etc\n"
1783 " ` clear no-read flag\n"
1784 " ; stay at this addr\n"
1785 " v change to byte mode\n"
1786 " w change to word (2 byte) mode\n"
1787 " l change to long (4 byte) mode\n"
1788 " u change to doubleword (8 byte) mode\n"
1789 " m addr change current addr\n"
1790 " n toggle no-read flag\n"
1791 " r toggle byte reverse flag\n"
1792 " < count back up count bytes\n"
1793 " > count skip forward count bytes\n"
1794 " x exit this mode\n"
1800 int cmd, inc, i, nslash;
1802 unsigned char val[16];
1804 scanhex((void *)&adrs);
1807 printf(memex_help_string);
1813 while ((cmd = skipbl()) != '\n') {
1815 case 'b': size = 1; break;
1816 case 'w': size = 2; break;
1817 case 'l': size = 4; break;
1818 case 'd': size = 8; break;
1819 case 'r': brev = !brev; break;
1820 case 'n': mnoread = 1; break;
1821 case '.': mnoread = 0; break;
1830 n = mread(adrs, val, size);
1831 printf(REG"%c", adrs, brev? 'r': ' ');
1836 for (i = 0; i < n; ++i)
1837 printf("%.2x", val[i]);
1838 for (; i < size; ++i)
1839 printf("%s", fault_chars[fault_type]);
1846 for (i = 0; i < size; ++i)
1847 val[i] = n >> (i * 8);
1850 mwrite(adrs, val, size);
1863 else if( n == '\'' )
1865 for (i = 0; i < size; ++i)
1866 val[i] = n >> (i * 8);
1869 mwrite(adrs, val, size);
1906 adrs -= 1 << nslash;
1910 adrs += 1 << nslash;
1914 adrs += 1 << -nslash;
1918 adrs -= 1 << -nslash;
1921 scanhex((void *)&adrs);
1940 printf(memex_subcmd_help_string);
1955 case 'n': c = '\n'; break;
1956 case 'r': c = '\r'; break;
1957 case 'b': c = '\b'; break;
1958 case 't': c = '\t'; break;
1963 static void xmon_rawdump (unsigned long adrs, long ndump)
1966 unsigned char temp[16];
1968 for (n = ndump; n > 0;) {
1970 nr = mread(adrs, temp, r);
1972 for (m = 0; m < r; ++m) {
1974 printf("%.2x", temp[m]);
1976 printf("%s", fault_chars[fault_type]);
1985 #define isxdigit(c) (('0' <= (c) && (c) <= '9') \
1986 || ('a' <= (c) && (c) <= 'f') \
1987 || ('A' <= (c) && (c) <= 'F'))
1994 if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
1996 scanhex((void *)&adrs);
2003 else if (nidump > MAX_DUMP)
2005 adrs += ppc_inst_dump(adrs, nidump, 1);
2007 } else if (c == 'r') {
2011 xmon_rawdump(adrs, ndump);
2018 else if (ndump > MAX_DUMP)
2020 prdump(adrs, ndump);
2027 prdump(unsigned long adrs, long ndump)
2029 long n, m, c, r, nr;
2030 unsigned char temp[16];
2032 for (n = ndump; n > 0;) {
2036 nr = mread(adrs, temp, r);
2038 for (m = 0; m < r; ++m) {
2039 if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2042 printf("%.2x", temp[m]);
2044 printf("%s", fault_chars[fault_type]);
2046 for (; m < 16; ++m) {
2047 if ((m & (sizeof(long) - 1)) == 0)
2052 for (m = 0; m < r; ++m) {
2055 putchar(' ' <= c && c <= '~'? c: '.');
2069 ppc_inst_dump(unsigned long adr, long count, int praddr)
2072 unsigned long first_adr;
2073 unsigned long inst, last_inst = 0;
2074 unsigned char val[4];
2077 for (first_adr = adr; count > 0; --count, adr += 4) {
2078 nr = mread(adr, val, 4);
2081 const char *x = fault_chars[fault_type];
2082 printf(REG" %s%s%s%s\n", adr, x, x, x, x);
2086 inst = GETWORD(val);
2087 if (adr > first_adr && inst == last_inst) {
2097 printf(REG" %.8x", adr, inst);
2099 print_insn_powerpc(inst, adr, 0); /* always returns 4 */
2102 return adr - first_adr;
2106 print_address(unsigned long addr)
2108 xmon_print_symbol(addr, "\t# ", "");
2113 * Memory operations - move, set, print differences
2115 static unsigned long mdest; /* destination address */
2116 static unsigned long msrc; /* source address */
2117 static unsigned long mval; /* byte value to set memory to */
2118 static unsigned long mcount; /* # bytes to affect */
2119 static unsigned long mdiffs; /* max # differences to print */
2124 scanhex((void *)&mdest);
2125 if( termch != '\n' )
2127 scanhex((void *)(cmd == 's'? &mval: &msrc));
2128 if( termch != '\n' )
2130 scanhex((void *)&mcount);
2133 memmove((void *)mdest, (void *)msrc, mcount);
2136 memset((void *)mdest, mval, mcount);
2139 if( termch != '\n' )
2141 scanhex((void *)&mdiffs);
2142 memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2148 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2153 for( n = nb; n > 0; --n )
2154 if( *p1++ != *p2++ )
2155 if( ++prt <= maxpr )
2156 printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,
2157 p1[-1], p2 - 1, p2[-1]);
2159 printf("Total of %d differences\n", prt);
2162 static unsigned mend;
2163 static unsigned mask;
2169 unsigned char val[4];
2172 scanhex((void *)&mdest);
2173 if (termch != '\n') {
2175 scanhex((void *)&mend);
2176 if (termch != '\n') {
2178 scanhex((void *)&mval);
2180 if (termch != '\n') termch = 0;
2181 scanhex((void *)&mask);
2185 for (a = mdest; a < mend; a += 4) {
2186 if (mread(a, val, 4) == 4
2187 && ((GETWORD(val) ^ mval) & mask) == 0) {
2188 printf("%.16x: %.16x\n", a, GETWORD(val));
2195 static unsigned long mskip = 0x1000;
2196 static unsigned long mlim = 0xffffffff;
2206 if (termch != '\n') termch = 0;
2208 if (termch != '\n') termch = 0;
2211 for (a = mdest; a < mlim; a += mskip) {
2212 ok = mread(a, &v, 1);
2214 printf("%.8x .. ", a);
2215 } else if (!ok && ook)
2216 printf("%.8x\n", a - mskip);
2222 printf("%.8x\n", a - mskip);
2227 unsigned long args[8];
2230 typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
2231 unsigned long, unsigned long, unsigned long,
2232 unsigned long, unsigned long, unsigned long);
2235 if (!scanhex(&adrs))
2239 for (i = 0; i < 8; ++i)
2241 for (i = 0; i < 8; ++i) {
2242 if (!scanhex(&args[i]) || termch == '\n')
2246 func = (callfunc_t) adrs;
2248 if (setjmp(bus_error_jmp) == 0) {
2249 catch_memory_errors = 1;
2251 ret = func(args[0], args[1], args[2], args[3],
2252 args[4], args[5], args[6], args[7]);
2254 printf("return value is %x\n", ret);
2256 printf("*** %x exception occurred\n", fault_except);
2258 catch_memory_errors = 0;
2261 /* Input scanning routines */
2272 while( c == ' ' || c == '\t' )
2278 static char *regnames[N_PTREGS] = {
2279 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2280 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2281 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2282 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2283 "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2289 "trap", "dar", "dsisr", "res"
2293 scanhex(unsigned long *vp)
2300 /* parse register name */
2304 for (i = 0; i < sizeof(regname) - 1; ++i) {
2313 for (i = 0; i < N_PTREGS; ++i) {
2314 if (strcmp(regnames[i], regname) == 0) {
2315 if (xmon_regs == NULL) {
2316 printf("regs not available\n");
2319 *vp = ((unsigned long *)xmon_regs)[i];
2323 printf("invalid register name '%%%s'\n", regname);
2327 /* skip leading "0x" if any */
2341 } else if (c == '$') {
2343 for (i=0; i<63; i++) {
2353 if (setjmp(bus_error_jmp) == 0) {
2354 catch_memory_errors = 1;
2356 *vp = kallsyms_lookup_name(tmpstr);
2359 catch_memory_errors = 0;
2361 printf("unknown symbol '%s'\n", tmpstr);
2396 if( '0' <= c && c <= '9' )
2398 if( 'A' <= c && c <= 'F' )
2399 return c - ('A' - 10);
2400 if( 'a' <= c && c <= 'f' )
2401 return c - ('a' - 10);
2406 getstring(char *s, int size)
2417 } while( c != ' ' && c != '\t' && c != '\n' );
2422 static char line[256];
2423 static char *lineptr;
2434 if (lineptr == NULL || *lineptr == 0) {
2435 if (xmon_gets(line, sizeof(line)) == NULL) {
2445 take_input(char *str)
2454 int type = inchar();
2456 static char tmp[64];
2461 xmon_print_symbol(addr, ": ", "\n");
2466 if (setjmp(bus_error_jmp) == 0) {
2467 catch_memory_errors = 1;
2469 addr = kallsyms_lookup_name(tmp);
2471 printf("%s: %lx\n", tmp, addr);
2473 printf("Symbol '%s' not found.\n", tmp);
2476 catch_memory_errors = 0;
2483 /* Print an address in numeric and symbolic form (if possible) */
2484 static void xmon_print_symbol(unsigned long address, const char *mid,
2488 const char *name = NULL;
2489 unsigned long offset, size;
2491 printf(REG, address);
2492 if (setjmp(bus_error_jmp) == 0) {
2493 catch_memory_errors = 1;
2495 name = kallsyms_lookup(address, &size, &offset, &modname,
2498 /* wait a little while to see if we get a machine check */
2502 catch_memory_errors = 0;
2505 printf("%s%s+%#lx/%#lx", mid, name, offset, size);
2507 printf(" [%s]", modname);
2509 printf("%s", after);
2513 static void dump_slb(void)
2518 printf("SLB contents of cpu %x\n", smp_processor_id());
2520 for (i = 0; i < SLB_NUM_ENTRIES; i++) {
2521 asm volatile("slbmfee %0,%1" : "=r" (tmp) : "r" (i));
2522 printf("%02d %016lx ", i, tmp);
2524 asm volatile("slbmfev %0,%1" : "=r" (tmp) : "r" (i));
2525 printf("%016lx\n", tmp);
2529 static void dump_stab(void)
2532 unsigned long *tmp = (unsigned long *)get_paca()->stab_addr;
2534 printf("Segment table contents of cpu %x\n", smp_processor_id());
2536 for (i = 0; i < PAGE_SIZE/16; i++) {
2543 printf("%03d %016lx ", i, a);
2544 printf("%016lx\n", b);
2549 void dump_segments(void)
2551 if (cpu_has_feature(CPU_FTR_SLB))
2558 #ifdef CONFIG_PPC_STD_MMU_32
2559 void dump_segments(void)
2564 for (i = 0; i < 16; ++i)
2565 printf(" %x", mfsrin(i));
2570 void xmon_init(int enable)
2574 __debugger_ipi = xmon_ipi;
2575 __debugger_bpt = xmon_bpt;
2576 __debugger_sstep = xmon_sstep;
2577 __debugger_iabr_match = xmon_iabr_match;
2578 __debugger_dabr_match = xmon_dabr_match;
2579 __debugger_fault_handler = xmon_fault_handler;
2582 __debugger_ipi = NULL;
2583 __debugger_bpt = NULL;
2584 __debugger_sstep = NULL;
2585 __debugger_iabr_match = NULL;
2586 __debugger_dabr_match = NULL;
2587 __debugger_fault_handler = NULL;
2592 #ifdef CONFIG_MAGIC_SYSRQ
2593 static void sysrq_handle_xmon(int key, struct tty_struct *tty)
2595 /* ensure xmon is enabled */
2597 debugger(get_irq_regs());
2600 static struct sysrq_key_op sysrq_xmon_op =
2602 .handler = sysrq_handle_xmon,
2604 .action_msg = "Entering xmon",
2607 static int __init setup_xmon_sysrq(void)
2609 register_sysrq_key('x', &sysrq_xmon_op);
2612 __initcall(setup_xmon_sysrq);
2613 #endif /* CONFIG_MAGIC_SYSRQ */
2615 int __initdata xmon_early, xmon_off;
2617 static int __init early_parse_xmon(char *p)
2619 if (!p || strncmp(p, "early", 5) == 0) {
2620 /* just "xmon" is equivalent to "xmon=early" */
2623 } else if (strncmp(p, "on", 2) == 0)
2625 else if (strncmp(p, "off", 3) == 0)
2627 else if (strncmp(p, "nobt", 4) == 0)
2628 xmon_no_auto_backtrace = 1;
2634 early_param("xmon", early_parse_xmon);
2636 void __init xmon_setup(void)
2638 #ifdef CONFIG_XMON_DEFAULT
2646 #ifdef CONFIG_PPC_CELL
2650 u64 saved_mfc_sr1_RW;
2651 u32 saved_spu_runcntl_RW;
2655 #define XMON_NUM_SPUS 16 /* Enough for current hardware */
2657 static struct spu_info spu_info[XMON_NUM_SPUS];
2659 void xmon_register_spus(struct list_head *list)
2663 list_for_each_entry(spu, list, full_list) {
2664 if (spu->number >= XMON_NUM_SPUS) {
2669 spu_info[spu->number].spu = spu;
2670 spu_info[spu->number].stopped_ok = 0;
2674 static void stop_spus(void)
2680 for (i = 0; i < XMON_NUM_SPUS; i++) {
2681 if (!spu_info[i].spu)
2684 if (setjmp(bus_error_jmp) == 0) {
2685 catch_memory_errors = 1;
2688 spu = spu_info[i].spu;
2690 spu_info[i].saved_spu_runcntl_RW =
2691 in_be32(&spu->problem->spu_runcntl_RW);
2693 tmp = spu_mfc_sr1_get(spu);
2694 spu_info[i].saved_mfc_sr1_RW = tmp;
2696 tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
2697 spu_mfc_sr1_set(spu, tmp);
2702 spu_info[i].stopped_ok = 1;
2703 printf("Stopped spu %.2d\n", i);
2705 catch_memory_errors = 0;
2706 printf("*** Error stopping spu %.2d\n", i);
2708 catch_memory_errors = 0;
2712 static void restart_spus(void)
2717 for (i = 0; i < XMON_NUM_SPUS; i++) {
2718 if (!spu_info[i].spu)
2721 if (!spu_info[i].stopped_ok) {
2722 printf("*** Error, spu %d was not successfully stopped"
2723 ", not restarting\n", i);
2727 if (setjmp(bus_error_jmp) == 0) {
2728 catch_memory_errors = 1;
2731 spu = spu_info[i].spu;
2732 spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
2733 out_be32(&spu->problem->spu_runcntl_RW,
2734 spu_info[i].saved_spu_runcntl_RW);
2739 printf("Restarted spu %.2d\n", i);
2741 catch_memory_errors = 0;
2742 printf("*** Error restarting spu %.2d\n", i);
2744 catch_memory_errors = 0;
2748 #define DUMP_WIDTH 23
2749 #define DUMP_FIELD(obj, format, field) \
2751 if (setjmp(bus_error_jmp) == 0) { \
2752 catch_memory_errors = 1; \
2754 printf(" %-*s = "format"\n", DUMP_WIDTH, \
2755 #field, obj->field); \
2759 catch_memory_errors = 0; \
2760 printf(" %-*s = *** Error reading field.\n", \
2761 DUMP_WIDTH, #field); \
2763 catch_memory_errors = 0; \
2766 static void dump_spu_fields(struct spu *spu)
2768 printf("Dumping spu fields at address %p:\n", spu);
2770 DUMP_FIELD(spu, "0x%x", number);
2771 DUMP_FIELD(spu, "%s", name);
2772 DUMP_FIELD(spu, "%s", devnode->full_name);
2773 DUMP_FIELD(spu, "0x%x", nid);
2774 DUMP_FIELD(spu, "0x%lx", local_store_phys);
2775 DUMP_FIELD(spu, "0x%p", local_store);
2776 DUMP_FIELD(spu, "0x%lx", ls_size);
2777 DUMP_FIELD(spu, "0x%x", node);
2778 DUMP_FIELD(spu, "0x%lx", flags);
2779 DUMP_FIELD(spu, "0x%lx", dar);
2780 DUMP_FIELD(spu, "0x%lx", dsisr);
2781 DUMP_FIELD(spu, "%d", class_0_pending);
2782 DUMP_FIELD(spu, "0x%lx", irqs[0]);
2783 DUMP_FIELD(spu, "0x%lx", irqs[1]);
2784 DUMP_FIELD(spu, "0x%lx", irqs[2]);
2785 DUMP_FIELD(spu, "0x%x", slb_replace);
2786 DUMP_FIELD(spu, "%d", pid);
2787 DUMP_FIELD(spu, "%d", prio);
2788 DUMP_FIELD(spu, "0x%p", mm);
2789 DUMP_FIELD(spu, "0x%p", ctx);
2790 DUMP_FIELD(spu, "0x%p", rq);
2791 DUMP_FIELD(spu, "0x%p", timestamp);
2792 DUMP_FIELD(spu, "0x%lx", problem_phys);
2793 DUMP_FIELD(spu, "0x%p", problem);
2794 DUMP_FIELD(spu, "0x%x", problem->spu_runcntl_RW);
2795 DUMP_FIELD(spu, "0x%x", problem->spu_status_R);
2796 DUMP_FIELD(spu, "0x%x", problem->spu_npc_RW);
2797 DUMP_FIELD(spu, "0x%p", priv1);
2800 DUMP_FIELD(spu, "0x%lx", priv1->mfc_sr1_RW);
2802 DUMP_FIELD(spu, "0x%p", priv2);
2805 static int do_spu_cmd(void)
2807 unsigned long num = 0;
2819 if (scanhex(&num) && num < XMON_NUM_SPUS && spu_info[num].spu)
2820 dump_spu_fields(spu_info[num].spu);
2822 printf("*** Error: invalid spu number\n");
2830 #else /* ! CONFIG_PPC_CELL */
2831 static int do_spu_cmd(void)