xref: /linux/arch/powerpc/xmon/xmon.c (revision d91517839e5d95adc0cf4b28caa7af62a71de526)
1 /*
2  * Routines providing a simple monitor for use on the PowerMac.
3  *
4  * Copyright (C) 1996-2005 Paul Mackerras.
5  * Copyright (C) 2001 PPC64 Team, IBM Corp
6  * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
7  *
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.
12  */
13 #include <linux/errno.h>
14 #include <linux/sched.h>
15 #include <linux/smp.h>
16 #include <linux/mm.h>
17 #include <linux/reboot.h>
18 #include <linux/delay.h>
19 #include <linux/kallsyms.h>
20 #include <linux/kmsg_dump.h>
21 #include <linux/cpumask.h>
22 #include <linux/export.h>
23 #include <linux/sysrq.h>
24 #include <linux/interrupt.h>
25 #include <linux/irq.h>
26 #include <linux/bug.h>
27 
28 #include <asm/ptrace.h>
29 #include <asm/string.h>
30 #include <asm/prom.h>
31 #include <asm/machdep.h>
32 #include <asm/xmon.h>
33 #include <asm/processor.h>
34 #include <asm/pgtable.h>
35 #include <asm/mmu.h>
36 #include <asm/mmu_context.h>
37 #include <asm/cputable.h>
38 #include <asm/rtas.h>
39 #include <asm/sstep.h>
40 #include <asm/irq_regs.h>
41 #include <asm/spu.h>
42 #include <asm/spu_priv1.h>
43 #include <asm/setjmp.h>
44 #include <asm/reg.h>
45 #include <asm/debug.h>
46 #include <asm/hw_breakpoint.h>
47 
48 #ifdef CONFIG_PPC64
49 #include <asm/hvcall.h>
50 #include <asm/paca.h>
51 #endif
52 
53 #include "nonstdio.h"
54 #include "dis-asm.h"
55 
56 #ifdef CONFIG_SMP
57 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
58 static unsigned long xmon_taken = 1;
59 static int xmon_owner;
60 static int xmon_gate;
61 #else
62 #define xmon_owner 0
63 #endif /* CONFIG_SMP */
64 
65 static unsigned long in_xmon __read_mostly = 0;
66 
67 static unsigned long adrs;
68 static int size = 1;
69 #define MAX_DUMP (128 * 1024)
70 static unsigned long ndump = 64;
71 static unsigned long nidump = 16;
72 static unsigned long ncsum = 4096;
73 static int termch;
74 static char tmpstr[128];
75 
76 static long bus_error_jmp[JMP_BUF_LEN];
77 static int catch_memory_errors;
78 static long *xmon_fault_jmp[NR_CPUS];
79 
80 /* Breakpoint stuff */
81 struct bpt {
82 	unsigned long	address;
83 	unsigned int	instr[2];
84 	atomic_t	ref_count;
85 	int		enabled;
86 	unsigned long	pad;
87 };
88 
89 /* Bits in bpt.enabled */
90 #define BP_IABR_TE	1		/* IABR translation enabled */
91 #define BP_IABR		2
92 #define BP_TRAP		8
93 #define BP_DABR		0x10
94 
95 #define NBPTS	256
96 static struct bpt bpts[NBPTS];
97 static struct bpt dabr;
98 static struct bpt *iabr;
99 static unsigned bpinstr = 0x7fe00008;	/* trap */
100 
101 #define BP_NUM(bp)	((bp) - bpts + 1)
102 
103 /* Prototypes */
104 static int cmds(struct pt_regs *);
105 static int mread(unsigned long, void *, int);
106 static int mwrite(unsigned long, void *, int);
107 static int handle_fault(struct pt_regs *);
108 static void byterev(unsigned char *, int);
109 static void memex(void);
110 static int bsesc(void);
111 static void dump(void);
112 static void prdump(unsigned long, long);
113 static int ppc_inst_dump(unsigned long, long, int);
114 static void dump_log_buf(void);
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);
122 int skipbl(void);
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,
149 			    unsigned long pc);
150 static void xmon_print_symbol(unsigned long address, const char *mid,
151 			      const char *after);
152 static const char *getvecname(unsigned long vec);
153 
154 static int do_spu_cmd(void);
155 
156 #ifdef CONFIG_44x
157 static void dump_tlb_44x(void);
158 #endif
159 #ifdef CONFIG_PPC_BOOK3E
160 static void dump_tlb_book3e(void);
161 #endif
162 
163 static int xmon_no_auto_backtrace;
164 
165 extern void xmon_enter(void);
166 extern void xmon_leave(void);
167 
168 #ifdef CONFIG_PPC64
169 #define REG		"%.16lx"
170 #else
171 #define REG		"%.8lx"
172 #endif
173 
174 #define GETWORD(v)	(((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
175 
176 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
177 			 || ('a' <= (c) && (c) <= 'f') \
178 			 || ('A' <= (c) && (c) <= 'F'))
179 #define isalnum(c)	(('0' <= (c) && (c) <= '9') \
180 			 || ('a' <= (c) && (c) <= 'z') \
181 			 || ('A' <= (c) && (c) <= 'Z'))
182 #define isspace(c)	(c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
183 
184 static char *help_string = "\
185 Commands:\n\
186   b	show breakpoints\n\
187   bd	set data breakpoint\n\
188   bi	set instruction breakpoint\n\
189   bc	clear breakpoint\n"
190 #ifdef CONFIG_SMP
191   "\
192   c	print cpus stopped in xmon\n\
193   c#	try to switch to cpu number h (in hex)\n"
194 #endif
195   "\
196   C	checksum\n\
197   d	dump bytes\n\
198   di	dump instructions\n\
199   df	dump float values\n\
200   dd	dump double values\n\
201   dl    dump the kernel log buffer\n"
202 #ifdef CONFIG_PPC64
203   "\
204   dp[#]	dump paca for current cpu, or cpu #\n\
205   dpa	dump paca for all possible cpus\n"
206 #endif
207   "\
208   dr	dump stream of raw bytes\n\
209   e	print exception information\n\
210   f	flush cache\n\
211   la	lookup symbol+offset of specified address\n\
212   ls	lookup address of specified symbol\n\
213   m	examine/change memory\n\
214   mm	move a block of memory\n\
215   ms	set a block of memory\n\
216   md	compare two blocks of memory\n\
217   ml	locate a block of memory\n\
218   mz	zero a block of memory\n\
219   mi	show information about memory allocation\n\
220   p 	call a procedure\n\
221   r	print registers\n\
222   s	single step\n"
223 #ifdef CONFIG_SPU_BASE
224 "  ss	stop execution on all spus\n\
225   sr	restore execution on stopped spus\n\
226   sf  #	dump spu fields for spu # (in hex)\n\
227   sd  #	dump spu local store for spu # (in hex)\n\
228   sdi #	disassemble spu local store for spu # (in hex)\n"
229 #endif
230 "  S	print special registers\n\
231   t	print backtrace\n\
232   x	exit monitor and recover\n\
233   X	exit monitor and dont recover\n"
234 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
235 "  u	dump segment table or SLB\n"
236 #elif defined(CONFIG_PPC_STD_MMU_32)
237 "  u	dump segment registers\n"
238 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
239 "  u	dump TLB\n"
240 #endif
241 "  ?	help\n"
242 "  zr	reboot\n\
243   zh	halt\n"
244 ;
245 
246 static struct pt_regs *xmon_regs;
247 
248 static inline void sync(void)
249 {
250 	asm volatile("sync; isync");
251 }
252 
253 static inline void store_inst(void *p)
254 {
255 	asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
256 }
257 
258 static inline void cflush(void *p)
259 {
260 	asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
261 }
262 
263 static inline void cinval(void *p)
264 {
265 	asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
266 }
267 
268 /*
269  * Disable surveillance (the service processor watchdog function)
270  * while we are in xmon.
271  * XXX we should re-enable it when we leave. :)
272  */
273 #define SURVEILLANCE_TOKEN	9000
274 
275 static inline void disable_surveillance(void)
276 {
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;
280 
281 	/*
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.
287 	 */
288 	args.token = rtas_token("set-indicator");
289 	if (args.token == RTAS_UNKNOWN_SERVICE)
290 		return;
291 	args.nargs = 3;
292 	args.nret = 1;
293 	args.rets = &args.args[3];
294 	args.args[0] = SURVEILLANCE_TOKEN;
295 	args.args[1] = 0;
296 	args.args[2] = 0;
297 	enter_rtas(__pa(&args));
298 #endif /* CONFIG_PPC_PSERIES */
299 }
300 
301 #ifdef CONFIG_SMP
302 static int xmon_speaker;
303 
304 static void get_output_lock(void)
305 {
306 	int me = smp_processor_id() + 0x100;
307 	int last_speaker = 0, prev;
308 	long timeout;
309 
310 	if (xmon_speaker == me)
311 		return;
312 	for (;;) {
313 		if (xmon_speaker == 0) {
314 			last_speaker = cmpxchg(&xmon_speaker, 0, me);
315 			if (last_speaker == 0)
316 				return;
317 		}
318 		timeout = 10000000;
319 		while (xmon_speaker == last_speaker) {
320 			if (--timeout > 0)
321 				continue;
322 			/* hostile takeover */
323 			prev = cmpxchg(&xmon_speaker, last_speaker, me);
324 			if (prev == last_speaker)
325 				return;
326 			break;
327 		}
328 	}
329 }
330 
331 static void release_output_lock(void)
332 {
333 	xmon_speaker = 0;
334 }
335 
336 int cpus_are_in_xmon(void)
337 {
338 	return !cpumask_empty(&cpus_in_xmon);
339 }
340 #endif
341 
342 static inline int unrecoverable_excp(struct pt_regs *regs)
343 {
344 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
345 	/* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
346 	return 0;
347 #else
348 	return ((regs->msr & MSR_RI) == 0);
349 #endif
350 }
351 
352 static int xmon_core(struct pt_regs *regs, int fromipi)
353 {
354 	int cmd = 0;
355 	struct bpt *bp;
356 	long recurse_jmp[JMP_BUF_LEN];
357 	unsigned long offset;
358 	unsigned long flags;
359 #ifdef CONFIG_SMP
360 	int cpu;
361 	int secondary;
362 	unsigned long timeout;
363 #endif
364 
365 	local_irq_save(flags);
366 
367 	bp = in_breakpoint_table(regs->nip, &offset);
368 	if (bp != NULL) {
369 		regs->nip = bp->address + offset;
370 		atomic_dec(&bp->ref_count);
371 	}
372 
373 	remove_cpu_bpts();
374 
375 #ifdef CONFIG_SMP
376 	cpu = smp_processor_id();
377 	if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
378 		get_output_lock();
379 		excprint(regs);
380 		printf("cpu 0x%x: Exception %lx %s in xmon, "
381 		       "returning to main loop\n",
382 		       cpu, regs->trap, getvecname(TRAP(regs)));
383 		release_output_lock();
384 		longjmp(xmon_fault_jmp[cpu], 1);
385 	}
386 
387 	if (setjmp(recurse_jmp) != 0) {
388 		if (!in_xmon || !xmon_gate) {
389 			get_output_lock();
390 			printf("xmon: WARNING: bad recursive fault "
391 			       "on cpu 0x%x\n", cpu);
392 			release_output_lock();
393 			goto waiting;
394 		}
395 		secondary = !(xmon_taken && cpu == xmon_owner);
396 		goto cmdloop;
397 	}
398 
399 	xmon_fault_jmp[cpu] = recurse_jmp;
400 	cpumask_set_cpu(cpu, &cpus_in_xmon);
401 
402 	bp = NULL;
403 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
404 		bp = at_breakpoint(regs->nip);
405 	if (bp || unrecoverable_excp(regs))
406 		fromipi = 0;
407 
408 	if (!fromipi) {
409 		get_output_lock();
410 		excprint(regs);
411 		if (bp) {
412 			printf("cpu 0x%x stopped at breakpoint 0x%x (",
413 			       cpu, BP_NUM(bp));
414 			xmon_print_symbol(regs->nip, " ", ")\n");
415 		}
416 		if (unrecoverable_excp(regs))
417 			printf("WARNING: exception is not recoverable, "
418 			       "can't continue\n");
419 		release_output_lock();
420 	}
421 
422  waiting:
423 	secondary = 1;
424 	while (secondary && !xmon_gate) {
425 		if (in_xmon == 0) {
426 			if (fromipi)
427 				goto leave;
428 			secondary = test_and_set_bit(0, &in_xmon);
429 		}
430 		barrier();
431 	}
432 
433 	if (!secondary && !xmon_gate) {
434 		/* we are the first cpu to come in */
435 		/* interrupt other cpu(s) */
436 		int ncpus = num_online_cpus();
437 
438 		xmon_owner = cpu;
439 		mb();
440 		if (ncpus > 1) {
441 			smp_send_debugger_break();
442 			/* wait for other cpus to come in */
443 			for (timeout = 100000000; timeout != 0; --timeout) {
444 				if (cpumask_weight(&cpus_in_xmon) >= ncpus)
445 					break;
446 				barrier();
447 			}
448 		}
449 		remove_bpts();
450 		disable_surveillance();
451 		/* for breakpoint or single step, print the current instr. */
452 		if (bp || TRAP(regs) == 0xd00)
453 			ppc_inst_dump(regs->nip, 1, 0);
454 		printf("enter ? for help\n");
455 		mb();
456 		xmon_gate = 1;
457 		barrier();
458 	}
459 
460  cmdloop:
461 	while (in_xmon) {
462 		if (secondary) {
463 			if (cpu == xmon_owner) {
464 				if (!test_and_set_bit(0, &xmon_taken)) {
465 					secondary = 0;
466 					continue;
467 				}
468 				/* missed it */
469 				while (cpu == xmon_owner)
470 					barrier();
471 			}
472 			barrier();
473 		} else {
474 			cmd = cmds(regs);
475 			if (cmd != 0) {
476 				/* exiting xmon */
477 				insert_bpts();
478 				xmon_gate = 0;
479 				wmb();
480 				in_xmon = 0;
481 				break;
482 			}
483 			/* have switched to some other cpu */
484 			secondary = 1;
485 		}
486 	}
487  leave:
488 	cpumask_clear_cpu(cpu, &cpus_in_xmon);
489 	xmon_fault_jmp[cpu] = NULL;
490 #else
491 	/* UP is simple... */
492 	if (in_xmon) {
493 		printf("Exception %lx %s in xmon, returning to main loop\n",
494 		       regs->trap, getvecname(TRAP(regs)));
495 		longjmp(xmon_fault_jmp[0], 1);
496 	}
497 	if (setjmp(recurse_jmp) == 0) {
498 		xmon_fault_jmp[0] = recurse_jmp;
499 		in_xmon = 1;
500 
501 		excprint(regs);
502 		bp = at_breakpoint(regs->nip);
503 		if (bp) {
504 			printf("Stopped at breakpoint %x (", BP_NUM(bp));
505 			xmon_print_symbol(regs->nip, " ", ")\n");
506 		}
507 		if (unrecoverable_excp(regs))
508 			printf("WARNING: exception is not recoverable, "
509 			       "can't continue\n");
510 		remove_bpts();
511 		disable_surveillance();
512 		/* for breakpoint or single step, print the current instr. */
513 		if (bp || TRAP(regs) == 0xd00)
514 			ppc_inst_dump(regs->nip, 1, 0);
515 		printf("enter ? for help\n");
516 	}
517 
518 	cmd = cmds(regs);
519 
520 	insert_bpts();
521 	in_xmon = 0;
522 #endif
523 
524 #ifdef CONFIG_BOOKE
525 	if (regs->msr & MSR_DE) {
526 		bp = at_breakpoint(regs->nip);
527 		if (bp != NULL) {
528 			regs->nip = (unsigned long) &bp->instr[0];
529 			atomic_inc(&bp->ref_count);
530 		}
531 	}
532 #else
533 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
534 		bp = at_breakpoint(regs->nip);
535 		if (bp != NULL) {
536 			int stepped = emulate_step(regs, bp->instr[0]);
537 			if (stepped == 0) {
538 				regs->nip = (unsigned long) &bp->instr[0];
539 				atomic_inc(&bp->ref_count);
540 			} else if (stepped < 0) {
541 				printf("Couldn't single-step %s instruction\n",
542 				    (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
543 			}
544 		}
545 	}
546 #endif
547 	insert_cpu_bpts();
548 
549 	local_irq_restore(flags);
550 
551 	return cmd != 'X' && cmd != EOF;
552 }
553 
554 int xmon(struct pt_regs *excp)
555 {
556 	struct pt_regs regs;
557 
558 	if (excp == NULL) {
559 		ppc_save_regs(&regs);
560 		excp = &regs;
561 	}
562 
563 	return xmon_core(excp, 0);
564 }
565 EXPORT_SYMBOL(xmon);
566 
567 irqreturn_t xmon_irq(int irq, void *d)
568 {
569 	unsigned long flags;
570 	local_irq_save(flags);
571 	printf("Keyboard interrupt\n");
572 	xmon(get_irq_regs());
573 	local_irq_restore(flags);
574 	return IRQ_HANDLED;
575 }
576 
577 static int xmon_bpt(struct pt_regs *regs)
578 {
579 	struct bpt *bp;
580 	unsigned long offset;
581 
582 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
583 		return 0;
584 
585 	/* Are we at the trap at bp->instr[1] for some bp? */
586 	bp = in_breakpoint_table(regs->nip, &offset);
587 	if (bp != NULL && offset == 4) {
588 		regs->nip = bp->address + 4;
589 		atomic_dec(&bp->ref_count);
590 		return 1;
591 	}
592 
593 	/* Are we at a breakpoint? */
594 	bp = at_breakpoint(regs->nip);
595 	if (!bp)
596 		return 0;
597 
598 	xmon_core(regs, 0);
599 
600 	return 1;
601 }
602 
603 static int xmon_sstep(struct pt_regs *regs)
604 {
605 	if (user_mode(regs))
606 		return 0;
607 	xmon_core(regs, 0);
608 	return 1;
609 }
610 
611 static int xmon_break_match(struct pt_regs *regs)
612 {
613 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
614 		return 0;
615 	if (dabr.enabled == 0)
616 		return 0;
617 	xmon_core(regs, 0);
618 	return 1;
619 }
620 
621 static int xmon_iabr_match(struct pt_regs *regs)
622 {
623 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
624 		return 0;
625 	if (iabr == NULL)
626 		return 0;
627 	xmon_core(regs, 0);
628 	return 1;
629 }
630 
631 static int xmon_ipi(struct pt_regs *regs)
632 {
633 #ifdef CONFIG_SMP
634 	if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
635 		xmon_core(regs, 1);
636 #endif
637 	return 0;
638 }
639 
640 static int xmon_fault_handler(struct pt_regs *regs)
641 {
642 	struct bpt *bp;
643 	unsigned long offset;
644 
645 	if (in_xmon && catch_memory_errors)
646 		handle_fault(regs);	/* doesn't return */
647 
648 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
649 		bp = in_breakpoint_table(regs->nip, &offset);
650 		if (bp != NULL) {
651 			regs->nip = bp->address + offset;
652 			atomic_dec(&bp->ref_count);
653 		}
654 	}
655 
656 	return 0;
657 }
658 
659 static struct bpt *at_breakpoint(unsigned long pc)
660 {
661 	int i;
662 	struct bpt *bp;
663 
664 	bp = bpts;
665 	for (i = 0; i < NBPTS; ++i, ++bp)
666 		if (bp->enabled && pc == bp->address)
667 			return bp;
668 	return NULL;
669 }
670 
671 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
672 {
673 	unsigned long off;
674 
675 	off = nip - (unsigned long) bpts;
676 	if (off >= sizeof(bpts))
677 		return NULL;
678 	off %= sizeof(struct bpt);
679 	if (off != offsetof(struct bpt, instr[0])
680 	    && off != offsetof(struct bpt, instr[1]))
681 		return NULL;
682 	*offp = off - offsetof(struct bpt, instr[0]);
683 	return (struct bpt *) (nip - off);
684 }
685 
686 static struct bpt *new_breakpoint(unsigned long a)
687 {
688 	struct bpt *bp;
689 
690 	a &= ~3UL;
691 	bp = at_breakpoint(a);
692 	if (bp)
693 		return bp;
694 
695 	for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
696 		if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
697 			bp->address = a;
698 			bp->instr[1] = bpinstr;
699 			store_inst(&bp->instr[1]);
700 			return bp;
701 		}
702 	}
703 
704 	printf("Sorry, no free breakpoints.  Please clear one first.\n");
705 	return NULL;
706 }
707 
708 static void insert_bpts(void)
709 {
710 	int i;
711 	struct bpt *bp;
712 
713 	bp = bpts;
714 	for (i = 0; i < NBPTS; ++i, ++bp) {
715 		if ((bp->enabled & (BP_TRAP|BP_IABR)) == 0)
716 			continue;
717 		if (mread(bp->address, &bp->instr[0], 4) != 4) {
718 			printf("Couldn't read instruction at %lx, "
719 			       "disabling breakpoint there\n", bp->address);
720 			bp->enabled = 0;
721 			continue;
722 		}
723 		if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
724 			printf("Breakpoint at %lx is on an mtmsrd or rfid "
725 			       "instruction, disabling it\n", bp->address);
726 			bp->enabled = 0;
727 			continue;
728 		}
729 		store_inst(&bp->instr[0]);
730 		if (bp->enabled & BP_IABR)
731 			continue;
732 		if (mwrite(bp->address, &bpinstr, 4) != 4) {
733 			printf("Couldn't write instruction at %lx, "
734 			       "disabling breakpoint there\n", bp->address);
735 			bp->enabled &= ~BP_TRAP;
736 			continue;
737 		}
738 		store_inst((void *)bp->address);
739 	}
740 }
741 
742 static void insert_cpu_bpts(void)
743 {
744 	struct arch_hw_breakpoint brk;
745 
746 	if (dabr.enabled) {
747 		brk.address = dabr.address;
748 		brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
749 		brk.len = 8;
750 		set_breakpoint(&brk);
751 	}
752 	if (iabr && cpu_has_feature(CPU_FTR_IABR))
753 		mtspr(SPRN_IABR, iabr->address
754 			 | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
755 }
756 
757 static void remove_bpts(void)
758 {
759 	int i;
760 	struct bpt *bp;
761 	unsigned instr;
762 
763 	bp = bpts;
764 	for (i = 0; i < NBPTS; ++i, ++bp) {
765 		if ((bp->enabled & (BP_TRAP|BP_IABR)) != BP_TRAP)
766 			continue;
767 		if (mread(bp->address, &instr, 4) == 4
768 		    && instr == bpinstr
769 		    && mwrite(bp->address, &bp->instr, 4) != 4)
770 			printf("Couldn't remove breakpoint at %lx\n",
771 			       bp->address);
772 		else
773 			store_inst((void *)bp->address);
774 	}
775 }
776 
777 static void remove_cpu_bpts(void)
778 {
779 	hw_breakpoint_disable();
780 	if (cpu_has_feature(CPU_FTR_IABR))
781 		mtspr(SPRN_IABR, 0);
782 }
783 
784 /* Command interpreting routine */
785 static char *last_cmd;
786 
787 static int
788 cmds(struct pt_regs *excp)
789 {
790 	int cmd = 0;
791 
792 	last_cmd = NULL;
793 	xmon_regs = excp;
794 
795 	if (!xmon_no_auto_backtrace) {
796 		xmon_no_auto_backtrace = 1;
797 		xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
798 	}
799 
800 	for(;;) {
801 #ifdef CONFIG_SMP
802 		printf("%x:", smp_processor_id());
803 #endif /* CONFIG_SMP */
804 		printf("mon> ");
805 		flush_input();
806 		termch = 0;
807 		cmd = skipbl();
808 		if( cmd == '\n' ) {
809 			if (last_cmd == NULL)
810 				continue;
811 			take_input(last_cmd);
812 			last_cmd = NULL;
813 			cmd = inchar();
814 		}
815 		switch (cmd) {
816 		case 'm':
817 			cmd = inchar();
818 			switch (cmd) {
819 			case 'm':
820 			case 's':
821 			case 'd':
822 				memops(cmd);
823 				break;
824 			case 'l':
825 				memlocate();
826 				break;
827 			case 'z':
828 				memzcan();
829 				break;
830 			case 'i':
831 				show_mem(0);
832 				break;
833 			default:
834 				termch = cmd;
835 				memex();
836 			}
837 			break;
838 		case 'd':
839 			dump();
840 			break;
841 		case 'l':
842 			symbol_lookup();
843 			break;
844 		case 'r':
845 			prregs(excp);	/* print regs */
846 			break;
847 		case 'e':
848 			excprint(excp);
849 			break;
850 		case 'S':
851 			super_regs();
852 			break;
853 		case 't':
854 			backtrace(excp);
855 			break;
856 		case 'f':
857 			cacheflush();
858 			break;
859 		case 's':
860 			if (do_spu_cmd() == 0)
861 				break;
862 			if (do_step(excp))
863 				return cmd;
864 			break;
865 		case 'x':
866 		case 'X':
867 			return cmd;
868 		case EOF:
869 			printf(" <no input ...>\n");
870 			mdelay(2000);
871 			return cmd;
872 		case '?':
873 			xmon_puts(help_string);
874 			break;
875 		case 'b':
876 			bpt_cmds();
877 			break;
878 		case 'C':
879 			csum();
880 			break;
881 		case 'c':
882 			if (cpu_cmd())
883 				return 0;
884 			break;
885 		case 'z':
886 			bootcmds();
887 			break;
888 		case 'p':
889 			proccall();
890 			break;
891 #ifdef CONFIG_PPC_STD_MMU
892 		case 'u':
893 			dump_segments();
894 			break;
895 #elif defined(CONFIG_4xx)
896 		case 'u':
897 			dump_tlb_44x();
898 			break;
899 #elif defined(CONFIG_PPC_BOOK3E)
900 		case 'u':
901 			dump_tlb_book3e();
902 			break;
903 #endif
904 		default:
905 			printf("Unrecognized command: ");
906 			do {
907 				if (' ' < cmd && cmd <= '~')
908 					putchar(cmd);
909 				else
910 					printf("\\x%x", cmd);
911 				cmd = inchar();
912 			} while (cmd != '\n');
913 			printf(" (type ? for help)\n");
914 			break;
915 		}
916 	}
917 }
918 
919 #ifdef CONFIG_BOOKE
920 static int do_step(struct pt_regs *regs)
921 {
922 	regs->msr |= MSR_DE;
923 	mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
924 	return 1;
925 }
926 #else
927 /*
928  * Step a single instruction.
929  * Some instructions we emulate, others we execute with MSR_SE set.
930  */
931 static int do_step(struct pt_regs *regs)
932 {
933 	unsigned int instr;
934 	int stepped;
935 
936 	/* check we are in 64-bit kernel mode, translation enabled */
937 	if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
938 		if (mread(regs->nip, &instr, 4) == 4) {
939 			stepped = emulate_step(regs, instr);
940 			if (stepped < 0) {
941 				printf("Couldn't single-step %s instruction\n",
942 				       (IS_RFID(instr)? "rfid": "mtmsrd"));
943 				return 0;
944 			}
945 			if (stepped > 0) {
946 				regs->trap = 0xd00 | (regs->trap & 1);
947 				printf("stepped to ");
948 				xmon_print_symbol(regs->nip, " ", "\n");
949 				ppc_inst_dump(regs->nip, 1, 0);
950 				return 0;
951 			}
952 		}
953 	}
954 	regs->msr |= MSR_SE;
955 	return 1;
956 }
957 #endif
958 
959 static void bootcmds(void)
960 {
961 	int cmd;
962 
963 	cmd = inchar();
964 	if (cmd == 'r')
965 		ppc_md.restart(NULL);
966 	else if (cmd == 'h')
967 		ppc_md.halt();
968 	else if (cmd == 'p')
969 		ppc_md.power_off();
970 }
971 
972 static int cpu_cmd(void)
973 {
974 #ifdef CONFIG_SMP
975 	unsigned long cpu, first_cpu, last_cpu;
976 	int timeout;
977 
978 	if (!scanhex(&cpu)) {
979 		/* print cpus waiting or in xmon */
980 		printf("cpus stopped:");
981 		last_cpu = first_cpu = NR_CPUS;
982 		for_each_possible_cpu(cpu) {
983 			if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
984 				if (cpu == last_cpu + 1) {
985 					last_cpu = cpu;
986 				} else {
987 					if (last_cpu != first_cpu)
988 						printf("-%lx", last_cpu);
989 					last_cpu = first_cpu = cpu;
990 					printf(" %lx", cpu);
991 				}
992 			}
993 		}
994 		if (last_cpu != first_cpu)
995 			printf("-%lx", last_cpu);
996 		printf("\n");
997 		return 0;
998 	}
999 	/* try to switch to cpu specified */
1000 	if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1001 		printf("cpu 0x%x isn't in xmon\n", cpu);
1002 		return 0;
1003 	}
1004 	xmon_taken = 0;
1005 	mb();
1006 	xmon_owner = cpu;
1007 	timeout = 10000000;
1008 	while (!xmon_taken) {
1009 		if (--timeout == 0) {
1010 			if (test_and_set_bit(0, &xmon_taken))
1011 				break;
1012 			/* take control back */
1013 			mb();
1014 			xmon_owner = smp_processor_id();
1015 			printf("cpu %u didn't take control\n", cpu);
1016 			return 0;
1017 		}
1018 		barrier();
1019 	}
1020 	return 1;
1021 #else
1022 	return 0;
1023 #endif /* CONFIG_SMP */
1024 }
1025 
1026 static unsigned short fcstab[256] = {
1027 	0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1028 	0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1029 	0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1030 	0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1031 	0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1032 	0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1033 	0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1034 	0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1035 	0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1036 	0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1037 	0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1038 	0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1039 	0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1040 	0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1041 	0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1042 	0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1043 	0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1044 	0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1045 	0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1046 	0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1047 	0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1048 	0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1049 	0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1050 	0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1051 	0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1052 	0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1053 	0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1054 	0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1055 	0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1056 	0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1057 	0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1058 	0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1059 };
1060 
1061 #define FCS(fcs, c)	(((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1062 
1063 static void
1064 csum(void)
1065 {
1066 	unsigned int i;
1067 	unsigned short fcs;
1068 	unsigned char v;
1069 
1070 	if (!scanhex(&adrs))
1071 		return;
1072 	if (!scanhex(&ncsum))
1073 		return;
1074 	fcs = 0xffff;
1075 	for (i = 0; i < ncsum; ++i) {
1076 		if (mread(adrs+i, &v, 1) == 0) {
1077 			printf("csum stopped at %x\n", adrs+i);
1078 			break;
1079 		}
1080 		fcs = FCS(fcs, v);
1081 	}
1082 	printf("%x\n", fcs);
1083 }
1084 
1085 /*
1086  * Check if this is a suitable place to put a breakpoint.
1087  */
1088 static long check_bp_loc(unsigned long addr)
1089 {
1090 	unsigned int instr;
1091 
1092 	addr &= ~3;
1093 	if (!is_kernel_addr(addr)) {
1094 		printf("Breakpoints may only be placed at kernel addresses\n");
1095 		return 0;
1096 	}
1097 	if (!mread(addr, &instr, sizeof(instr))) {
1098 		printf("Can't read instruction at address %lx\n", addr);
1099 		return 0;
1100 	}
1101 	if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1102 		printf("Breakpoints may not be placed on mtmsrd or rfid "
1103 		       "instructions\n");
1104 		return 0;
1105 	}
1106 	return 1;
1107 }
1108 
1109 static char *breakpoint_help_string =
1110     "Breakpoint command usage:\n"
1111     "b                show breakpoints\n"
1112     "b <addr> [cnt]   set breakpoint at given instr addr\n"
1113     "bc               clear all breakpoints\n"
1114     "bc <n/addr>      clear breakpoint number n or at addr\n"
1115     "bi <addr> [cnt]  set hardware instr breakpoint (POWER3/RS64 only)\n"
1116     "bd <addr> [cnt]  set hardware data breakpoint\n"
1117     "";
1118 
1119 static void
1120 bpt_cmds(void)
1121 {
1122 	int cmd;
1123 	unsigned long a;
1124 	int mode, i;
1125 	struct bpt *bp;
1126 	const char badaddr[] = "Only kernel addresses are permitted "
1127 		"for breakpoints\n";
1128 
1129 	cmd = inchar();
1130 	switch (cmd) {
1131 #ifndef CONFIG_8xx
1132 	case 'd':	/* bd - hardware data breakpoint */
1133 		mode = 7;
1134 		cmd = inchar();
1135 		if (cmd == 'r')
1136 			mode = 5;
1137 		else if (cmd == 'w')
1138 			mode = 6;
1139 		else
1140 			termch = cmd;
1141 		dabr.address = 0;
1142 		dabr.enabled = 0;
1143 		if (scanhex(&dabr.address)) {
1144 			if (!is_kernel_addr(dabr.address)) {
1145 				printf(badaddr);
1146 				break;
1147 			}
1148 			dabr.address &= ~HW_BRK_TYPE_DABR;
1149 			dabr.enabled = mode | BP_DABR;
1150 		}
1151 		break;
1152 
1153 	case 'i':	/* bi - hardware instr breakpoint */
1154 		if (!cpu_has_feature(CPU_FTR_IABR)) {
1155 			printf("Hardware instruction breakpoint "
1156 			       "not supported on this cpu\n");
1157 			break;
1158 		}
1159 		if (iabr) {
1160 			iabr->enabled &= ~(BP_IABR | BP_IABR_TE);
1161 			iabr = NULL;
1162 		}
1163 		if (!scanhex(&a))
1164 			break;
1165 		if (!check_bp_loc(a))
1166 			break;
1167 		bp = new_breakpoint(a);
1168 		if (bp != NULL) {
1169 			bp->enabled |= BP_IABR | BP_IABR_TE;
1170 			iabr = bp;
1171 		}
1172 		break;
1173 #endif
1174 
1175 	case 'c':
1176 		if (!scanhex(&a)) {
1177 			/* clear all breakpoints */
1178 			for (i = 0; i < NBPTS; ++i)
1179 				bpts[i].enabled = 0;
1180 			iabr = NULL;
1181 			dabr.enabled = 0;
1182 			printf("All breakpoints cleared\n");
1183 			break;
1184 		}
1185 
1186 		if (a <= NBPTS && a >= 1) {
1187 			/* assume a breakpoint number */
1188 			bp = &bpts[a-1];	/* bp nums are 1 based */
1189 		} else {
1190 			/* assume a breakpoint address */
1191 			bp = at_breakpoint(a);
1192 			if (bp == NULL) {
1193 				printf("No breakpoint at %x\n", a);
1194 				break;
1195 			}
1196 		}
1197 
1198 		printf("Cleared breakpoint %x (", BP_NUM(bp));
1199 		xmon_print_symbol(bp->address, " ", ")\n");
1200 		bp->enabled = 0;
1201 		break;
1202 
1203 	default:
1204 		termch = cmd;
1205 		cmd = skipbl();
1206 		if (cmd == '?') {
1207 			printf(breakpoint_help_string);
1208 			break;
1209 		}
1210 		termch = cmd;
1211 		if (!scanhex(&a)) {
1212 			/* print all breakpoints */
1213 			printf("   type            address\n");
1214 			if (dabr.enabled) {
1215 				printf("   data   "REG"  [", dabr.address);
1216 				if (dabr.enabled & 1)
1217 					printf("r");
1218 				if (dabr.enabled & 2)
1219 					printf("w");
1220 				printf("]\n");
1221 			}
1222 			for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1223 				if (!bp->enabled)
1224 					continue;
1225 				printf("%2x %s   ", BP_NUM(bp),
1226 				    (bp->enabled & BP_IABR)? "inst": "trap");
1227 				xmon_print_symbol(bp->address, "  ", "\n");
1228 			}
1229 			break;
1230 		}
1231 
1232 		if (!check_bp_loc(a))
1233 			break;
1234 		bp = new_breakpoint(a);
1235 		if (bp != NULL)
1236 			bp->enabled |= BP_TRAP;
1237 		break;
1238 	}
1239 }
1240 
1241 /* Very cheap human name for vector lookup. */
1242 static
1243 const char *getvecname(unsigned long vec)
1244 {
1245 	char *ret;
1246 
1247 	switch (vec) {
1248 	case 0x100:	ret = "(System Reset)"; break;
1249 	case 0x200:	ret = "(Machine Check)"; break;
1250 	case 0x300:	ret = "(Data Access)"; break;
1251 	case 0x380:	ret = "(Data SLB Access)"; break;
1252 	case 0x400:	ret = "(Instruction Access)"; break;
1253 	case 0x480:	ret = "(Instruction SLB Access)"; break;
1254 	case 0x500:	ret = "(Hardware Interrupt)"; break;
1255 	case 0x600:	ret = "(Alignment)"; break;
1256 	case 0x700:	ret = "(Program Check)"; break;
1257 	case 0x800:	ret = "(FPU Unavailable)"; break;
1258 	case 0x900:	ret = "(Decrementer)"; break;
1259 	case 0x980:	ret = "(Hypervisor Decrementer)"; break;
1260 	case 0xa00:	ret = "(Doorbell)"; break;
1261 	case 0xc00:	ret = "(System Call)"; break;
1262 	case 0xd00:	ret = "(Single Step)"; break;
1263 	case 0xe40:	ret = "(Emulation Assist)"; break;
1264 	case 0xe60:	ret = "(HMI)"; break;
1265 	case 0xe80:	ret = "(Hypervisor Doorbell)"; break;
1266 	case 0xf00:	ret = "(Performance Monitor)"; break;
1267 	case 0xf20:	ret = "(Altivec Unavailable)"; break;
1268 	case 0x1300:	ret = "(Instruction Breakpoint)"; break;
1269 	case 0x1500:	ret = "(Denormalisation)"; break;
1270 	case 0x1700:	ret = "(Altivec Assist)"; break;
1271 	default: ret = "";
1272 	}
1273 	return ret;
1274 }
1275 
1276 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1277 				unsigned long *endp)
1278 {
1279 	unsigned long size, offset;
1280 	const char *name;
1281 
1282 	*startp = *endp = 0;
1283 	if (pc == 0)
1284 		return;
1285 	if (setjmp(bus_error_jmp) == 0) {
1286 		catch_memory_errors = 1;
1287 		sync();
1288 		name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1289 		if (name != NULL) {
1290 			*startp = pc - offset;
1291 			*endp = pc - offset + size;
1292 		}
1293 		sync();
1294 	}
1295 	catch_memory_errors = 0;
1296 }
1297 
1298 #define LRSAVE_OFFSET		(STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1299 #define MARKER_OFFSET		(STACK_FRAME_MARKER * sizeof(unsigned long))
1300 
1301 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1302 			    unsigned long pc)
1303 {
1304 	int max_to_print = 64;
1305 	unsigned long ip;
1306 	unsigned long newsp;
1307 	unsigned long marker;
1308 	struct pt_regs regs;
1309 
1310 	while (max_to_print--) {
1311 		if (sp < PAGE_OFFSET) {
1312 			if (sp != 0)
1313 				printf("SP (%lx) is in userspace\n", sp);
1314 			break;
1315 		}
1316 
1317 		if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1318 		    || !mread(sp, &newsp, sizeof(unsigned long))) {
1319 			printf("Couldn't read stack frame at %lx\n", sp);
1320 			break;
1321 		}
1322 
1323 		/*
1324 		 * For the first stack frame, try to work out if
1325 		 * LR and/or the saved LR value in the bottommost
1326 		 * stack frame are valid.
1327 		 */
1328 		if ((pc | lr) != 0) {
1329 			unsigned long fnstart, fnend;
1330 			unsigned long nextip;
1331 			int printip = 1;
1332 
1333 			get_function_bounds(pc, &fnstart, &fnend);
1334 			nextip = 0;
1335 			if (newsp > sp)
1336 				mread(newsp + LRSAVE_OFFSET, &nextip,
1337 				      sizeof(unsigned long));
1338 			if (lr == ip) {
1339 				if (lr < PAGE_OFFSET
1340 				    || (fnstart <= lr && lr < fnend))
1341 					printip = 0;
1342 			} else if (lr == nextip) {
1343 				printip = 0;
1344 			} else if (lr >= PAGE_OFFSET
1345 				   && !(fnstart <= lr && lr < fnend)) {
1346 				printf("[link register   ] ");
1347 				xmon_print_symbol(lr, " ", "\n");
1348 			}
1349 			if (printip) {
1350 				printf("["REG"] ", sp);
1351 				xmon_print_symbol(ip, " ", " (unreliable)\n");
1352 			}
1353 			pc = lr = 0;
1354 
1355 		} else {
1356 			printf("["REG"] ", sp);
1357 			xmon_print_symbol(ip, " ", "\n");
1358 		}
1359 
1360 		/* Look for "regshere" marker to see if this is
1361 		   an exception frame. */
1362 		if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1363 		    && marker == STACK_FRAME_REGS_MARKER) {
1364 			if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1365 			    != sizeof(regs)) {
1366 				printf("Couldn't read registers at %lx\n",
1367 				       sp + STACK_FRAME_OVERHEAD);
1368 				break;
1369 			}
1370 			printf("--- Exception: %lx %s at ", regs.trap,
1371 			       getvecname(TRAP(&regs)));
1372 			pc = regs.nip;
1373 			lr = regs.link;
1374 			xmon_print_symbol(pc, " ", "\n");
1375 		}
1376 
1377 		if (newsp == 0)
1378 			break;
1379 
1380 		sp = newsp;
1381 	}
1382 }
1383 
1384 static void backtrace(struct pt_regs *excp)
1385 {
1386 	unsigned long sp;
1387 
1388 	if (scanhex(&sp))
1389 		xmon_show_stack(sp, 0, 0);
1390 	else
1391 		xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1392 	scannl();
1393 }
1394 
1395 static void print_bug_trap(struct pt_regs *regs)
1396 {
1397 #ifdef CONFIG_BUG
1398 	const struct bug_entry *bug;
1399 	unsigned long addr;
1400 
1401 	if (regs->msr & MSR_PR)
1402 		return;		/* not in kernel */
1403 	addr = regs->nip;	/* address of trap instruction */
1404 	if (addr < PAGE_OFFSET)
1405 		return;
1406 	bug = find_bug(regs->nip);
1407 	if (bug == NULL)
1408 		return;
1409 	if (is_warning_bug(bug))
1410 		return;
1411 
1412 #ifdef CONFIG_DEBUG_BUGVERBOSE
1413 	printf("kernel BUG at %s:%u!\n",
1414 	       bug->file, bug->line);
1415 #else
1416 	printf("kernel BUG at %p!\n", (void *)bug->bug_addr);
1417 #endif
1418 #endif /* CONFIG_BUG */
1419 }
1420 
1421 static void excprint(struct pt_regs *fp)
1422 {
1423 	unsigned long trap;
1424 
1425 #ifdef CONFIG_SMP
1426 	printf("cpu 0x%x: ", smp_processor_id());
1427 #endif /* CONFIG_SMP */
1428 
1429 	trap = TRAP(fp);
1430 	printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp);
1431 	printf("    pc: ");
1432 	xmon_print_symbol(fp->nip, ": ", "\n");
1433 
1434 	printf("    lr: ", fp->link);
1435 	xmon_print_symbol(fp->link, ": ", "\n");
1436 
1437 	printf("    sp: %lx\n", fp->gpr[1]);
1438 	printf("   msr: %lx\n", fp->msr);
1439 
1440 	if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1441 		printf("   dar: %lx\n", fp->dar);
1442 		if (trap != 0x380)
1443 			printf(" dsisr: %lx\n", fp->dsisr);
1444 	}
1445 
1446 	printf("  current = 0x%lx\n", current);
1447 #ifdef CONFIG_PPC64
1448 	printf("  paca    = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n",
1449 	       local_paca, local_paca->soft_enabled, local_paca->irq_happened);
1450 #endif
1451 	if (current) {
1452 		printf("    pid   = %ld, comm = %s\n",
1453 		       current->pid, current->comm);
1454 	}
1455 
1456 	if (trap == 0x700)
1457 		print_bug_trap(fp);
1458 }
1459 
1460 static void prregs(struct pt_regs *fp)
1461 {
1462 	int n, trap;
1463 	unsigned long base;
1464 	struct pt_regs regs;
1465 
1466 	if (scanhex(&base)) {
1467 		if (setjmp(bus_error_jmp) == 0) {
1468 			catch_memory_errors = 1;
1469 			sync();
1470 			regs = *(struct pt_regs *)base;
1471 			sync();
1472 			__delay(200);
1473 		} else {
1474 			catch_memory_errors = 0;
1475 			printf("*** Error reading registers from "REG"\n",
1476 			       base);
1477 			return;
1478 		}
1479 		catch_memory_errors = 0;
1480 		fp = &regs;
1481 	}
1482 
1483 #ifdef CONFIG_PPC64
1484 	if (FULL_REGS(fp)) {
1485 		for (n = 0; n < 16; ++n)
1486 			printf("R%.2ld = "REG"   R%.2ld = "REG"\n",
1487 			       n, fp->gpr[n], n+16, fp->gpr[n+16]);
1488 	} else {
1489 		for (n = 0; n < 7; ++n)
1490 			printf("R%.2ld = "REG"   R%.2ld = "REG"\n",
1491 			       n, fp->gpr[n], n+7, fp->gpr[n+7]);
1492 	}
1493 #else
1494 	for (n = 0; n < 32; ++n) {
1495 		printf("R%.2d = %.8x%s", n, fp->gpr[n],
1496 		       (n & 3) == 3? "\n": "   ");
1497 		if (n == 12 && !FULL_REGS(fp)) {
1498 			printf("\n");
1499 			break;
1500 		}
1501 	}
1502 #endif
1503 	printf("pc  = ");
1504 	xmon_print_symbol(fp->nip, " ", "\n");
1505 	if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1506 		printf("cfar= ");
1507 		xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1508 	}
1509 	printf("lr  = ");
1510 	xmon_print_symbol(fp->link, " ", "\n");
1511 	printf("msr = "REG"   cr  = %.8lx\n", fp->msr, fp->ccr);
1512 	printf("ctr = "REG"   xer = "REG"   trap = %4lx\n",
1513 	       fp->ctr, fp->xer, fp->trap);
1514 	trap = TRAP(fp);
1515 	if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1516 		printf("dar = "REG"   dsisr = %.8lx\n", fp->dar, fp->dsisr);
1517 }
1518 
1519 static void cacheflush(void)
1520 {
1521 	int cmd;
1522 	unsigned long nflush;
1523 
1524 	cmd = inchar();
1525 	if (cmd != 'i')
1526 		termch = cmd;
1527 	scanhex((void *)&adrs);
1528 	if (termch != '\n')
1529 		termch = 0;
1530 	nflush = 1;
1531 	scanhex(&nflush);
1532 	nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1533 	if (setjmp(bus_error_jmp) == 0) {
1534 		catch_memory_errors = 1;
1535 		sync();
1536 
1537 		if (cmd != 'i') {
1538 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1539 				cflush((void *) adrs);
1540 		} else {
1541 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1542 				cinval((void *) adrs);
1543 		}
1544 		sync();
1545 		/* wait a little while to see if we get a machine check */
1546 		__delay(200);
1547 	}
1548 	catch_memory_errors = 0;
1549 }
1550 
1551 static unsigned long
1552 read_spr(int n)
1553 {
1554 	unsigned int instrs[2];
1555 	unsigned long (*code)(void);
1556 	unsigned long ret = -1UL;
1557 #ifdef CONFIG_PPC64
1558 	unsigned long opd[3];
1559 
1560 	opd[0] = (unsigned long)instrs;
1561 	opd[1] = 0;
1562 	opd[2] = 0;
1563 	code = (unsigned long (*)(void)) opd;
1564 #else
1565 	code = (unsigned long (*)(void)) instrs;
1566 #endif
1567 
1568 	/* mfspr r3,n; blr */
1569 	instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1570 	instrs[1] = 0x4e800020;
1571 	store_inst(instrs);
1572 	store_inst(instrs+1);
1573 
1574 	if (setjmp(bus_error_jmp) == 0) {
1575 		catch_memory_errors = 1;
1576 		sync();
1577 
1578 		ret = code();
1579 
1580 		sync();
1581 		/* wait a little while to see if we get a machine check */
1582 		__delay(200);
1583 		n = size;
1584 	}
1585 
1586 	return ret;
1587 }
1588 
1589 static void
1590 write_spr(int n, unsigned long val)
1591 {
1592 	unsigned int instrs[2];
1593 	unsigned long (*code)(unsigned long);
1594 #ifdef CONFIG_PPC64
1595 	unsigned long opd[3];
1596 
1597 	opd[0] = (unsigned long)instrs;
1598 	opd[1] = 0;
1599 	opd[2] = 0;
1600 	code = (unsigned long (*)(unsigned long)) opd;
1601 #else
1602 	code = (unsigned long (*)(unsigned long)) instrs;
1603 #endif
1604 
1605 	instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1606 	instrs[1] = 0x4e800020;
1607 	store_inst(instrs);
1608 	store_inst(instrs+1);
1609 
1610 	if (setjmp(bus_error_jmp) == 0) {
1611 		catch_memory_errors = 1;
1612 		sync();
1613 
1614 		code(val);
1615 
1616 		sync();
1617 		/* wait a little while to see if we get a machine check */
1618 		__delay(200);
1619 		n = size;
1620 	}
1621 }
1622 
1623 static unsigned long regno;
1624 extern char exc_prolog;
1625 extern char dec_exc;
1626 
1627 static void super_regs(void)
1628 {
1629 	int cmd;
1630 	unsigned long val;
1631 
1632 	cmd = skipbl();
1633 	if (cmd == '\n') {
1634 		unsigned long sp, toc;
1635 		asm("mr %0,1" : "=r" (sp) :);
1636 		asm("mr %0,2" : "=r" (toc) :);
1637 
1638 		printf("msr  = "REG"  sprg0= "REG"\n",
1639 		       mfmsr(), mfspr(SPRN_SPRG0));
1640 		printf("pvr  = "REG"  sprg1= "REG"\n",
1641 		       mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1642 		printf("dec  = "REG"  sprg2= "REG"\n",
1643 		       mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1644 		printf("sp   = "REG"  sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3));
1645 		printf("toc  = "REG"  dar  = "REG"\n", toc, mfspr(SPRN_DAR));
1646 
1647 		return;
1648 	}
1649 
1650 	scanhex(&regno);
1651 	switch (cmd) {
1652 	case 'w':
1653 		val = read_spr(regno);
1654 		scanhex(&val);
1655 		write_spr(regno, val);
1656 		/* fall through */
1657 	case 'r':
1658 		printf("spr %lx = %lx\n", regno, read_spr(regno));
1659 		break;
1660 	}
1661 	scannl();
1662 }
1663 
1664 /*
1665  * Stuff for reading and writing memory safely
1666  */
1667 static int
1668 mread(unsigned long adrs, void *buf, int size)
1669 {
1670 	volatile int n;
1671 	char *p, *q;
1672 
1673 	n = 0;
1674 	if (setjmp(bus_error_jmp) == 0) {
1675 		catch_memory_errors = 1;
1676 		sync();
1677 		p = (char *)adrs;
1678 		q = (char *)buf;
1679 		switch (size) {
1680 		case 2:
1681 			*(u16 *)q = *(u16 *)p;
1682 			break;
1683 		case 4:
1684 			*(u32 *)q = *(u32 *)p;
1685 			break;
1686 		case 8:
1687 			*(u64 *)q = *(u64 *)p;
1688 			break;
1689 		default:
1690 			for( ; n < size; ++n) {
1691 				*q++ = *p++;
1692 				sync();
1693 			}
1694 		}
1695 		sync();
1696 		/* wait a little while to see if we get a machine check */
1697 		__delay(200);
1698 		n = size;
1699 	}
1700 	catch_memory_errors = 0;
1701 	return n;
1702 }
1703 
1704 static int
1705 mwrite(unsigned long adrs, void *buf, int size)
1706 {
1707 	volatile int n;
1708 	char *p, *q;
1709 
1710 	n = 0;
1711 	if (setjmp(bus_error_jmp) == 0) {
1712 		catch_memory_errors = 1;
1713 		sync();
1714 		p = (char *) adrs;
1715 		q = (char *) buf;
1716 		switch (size) {
1717 		case 2:
1718 			*(u16 *)p = *(u16 *)q;
1719 			break;
1720 		case 4:
1721 			*(u32 *)p = *(u32 *)q;
1722 			break;
1723 		case 8:
1724 			*(u64 *)p = *(u64 *)q;
1725 			break;
1726 		default:
1727 			for ( ; n < size; ++n) {
1728 				*p++ = *q++;
1729 				sync();
1730 			}
1731 		}
1732 		sync();
1733 		/* wait a little while to see if we get a machine check */
1734 		__delay(200);
1735 		n = size;
1736 	} else {
1737 		printf("*** Error writing address %x\n", adrs + n);
1738 	}
1739 	catch_memory_errors = 0;
1740 	return n;
1741 }
1742 
1743 static int fault_type;
1744 static int fault_except;
1745 static char *fault_chars[] = { "--", "**", "##" };
1746 
1747 static int handle_fault(struct pt_regs *regs)
1748 {
1749 	fault_except = TRAP(regs);
1750 	switch (TRAP(regs)) {
1751 	case 0x200:
1752 		fault_type = 0;
1753 		break;
1754 	case 0x300:
1755 	case 0x380:
1756 		fault_type = 1;
1757 		break;
1758 	default:
1759 		fault_type = 2;
1760 	}
1761 
1762 	longjmp(bus_error_jmp, 1);
1763 
1764 	return 0;
1765 }
1766 
1767 #define SWAP(a, b, t)	((t) = (a), (a) = (b), (b) = (t))
1768 
1769 static void
1770 byterev(unsigned char *val, int size)
1771 {
1772 	int t;
1773 
1774 	switch (size) {
1775 	case 2:
1776 		SWAP(val[0], val[1], t);
1777 		break;
1778 	case 4:
1779 		SWAP(val[0], val[3], t);
1780 		SWAP(val[1], val[2], t);
1781 		break;
1782 	case 8: /* is there really any use for this? */
1783 		SWAP(val[0], val[7], t);
1784 		SWAP(val[1], val[6], t);
1785 		SWAP(val[2], val[5], t);
1786 		SWAP(val[3], val[4], t);
1787 		break;
1788 	}
1789 }
1790 
1791 static int brev;
1792 static int mnoread;
1793 
1794 static char *memex_help_string =
1795     "Memory examine command usage:\n"
1796     "m [addr] [flags] examine/change memory\n"
1797     "  addr is optional.  will start where left off.\n"
1798     "  flags may include chars from this set:\n"
1799     "    b   modify by bytes (default)\n"
1800     "    w   modify by words (2 byte)\n"
1801     "    l   modify by longs (4 byte)\n"
1802     "    d   modify by doubleword (8 byte)\n"
1803     "    r   toggle reverse byte order mode\n"
1804     "    n   do not read memory (for i/o spaces)\n"
1805     "    .   ok to read (default)\n"
1806     "NOTE: flags are saved as defaults\n"
1807     "";
1808 
1809 static char *memex_subcmd_help_string =
1810     "Memory examine subcommands:\n"
1811     "  hexval   write this val to current location\n"
1812     "  'string' write chars from string to this location\n"
1813     "  '        increment address\n"
1814     "  ^        decrement address\n"
1815     "  /        increment addr by 0x10.  //=0x100, ///=0x1000, etc\n"
1816     "  \\        decrement addr by 0x10.  \\\\=0x100, \\\\\\=0x1000, etc\n"
1817     "  `        clear no-read flag\n"
1818     "  ;        stay at this addr\n"
1819     "  v        change to byte mode\n"
1820     "  w        change to word (2 byte) mode\n"
1821     "  l        change to long (4 byte) mode\n"
1822     "  u        change to doubleword (8 byte) mode\n"
1823     "  m addr   change current addr\n"
1824     "  n        toggle no-read flag\n"
1825     "  r        toggle byte reverse flag\n"
1826     "  < count  back up count bytes\n"
1827     "  > count  skip forward count bytes\n"
1828     "  x        exit this mode\n"
1829     "";
1830 
1831 static void
1832 memex(void)
1833 {
1834 	int cmd, inc, i, nslash;
1835 	unsigned long n;
1836 	unsigned char val[16];
1837 
1838 	scanhex((void *)&adrs);
1839 	cmd = skipbl();
1840 	if (cmd == '?') {
1841 		printf(memex_help_string);
1842 		return;
1843 	} else {
1844 		termch = cmd;
1845 	}
1846 	last_cmd = "m\n";
1847 	while ((cmd = skipbl()) != '\n') {
1848 		switch( cmd ){
1849 		case 'b':	size = 1;	break;
1850 		case 'w':	size = 2;	break;
1851 		case 'l':	size = 4;	break;
1852 		case 'd':	size = 8;	break;
1853 		case 'r': 	brev = !brev;	break;
1854 		case 'n':	mnoread = 1;	break;
1855 		case '.':	mnoread = 0;	break;
1856 		}
1857 	}
1858 	if( size <= 0 )
1859 		size = 1;
1860 	else if( size > 8 )
1861 		size = 8;
1862 	for(;;){
1863 		if (!mnoread)
1864 			n = mread(adrs, val, size);
1865 		printf(REG"%c", adrs, brev? 'r': ' ');
1866 		if (!mnoread) {
1867 			if (brev)
1868 				byterev(val, size);
1869 			putchar(' ');
1870 			for (i = 0; i < n; ++i)
1871 				printf("%.2x", val[i]);
1872 			for (; i < size; ++i)
1873 				printf("%s", fault_chars[fault_type]);
1874 		}
1875 		putchar(' ');
1876 		inc = size;
1877 		nslash = 0;
1878 		for(;;){
1879 			if( scanhex(&n) ){
1880 				for (i = 0; i < size; ++i)
1881 					val[i] = n >> (i * 8);
1882 				if (!brev)
1883 					byterev(val, size);
1884 				mwrite(adrs, val, size);
1885 				inc = size;
1886 			}
1887 			cmd = skipbl();
1888 			if (cmd == '\n')
1889 				break;
1890 			inc = 0;
1891 			switch (cmd) {
1892 			case '\'':
1893 				for(;;){
1894 					n = inchar();
1895 					if( n == '\\' )
1896 						n = bsesc();
1897 					else if( n == '\'' )
1898 						break;
1899 					for (i = 0; i < size; ++i)
1900 						val[i] = n >> (i * 8);
1901 					if (!brev)
1902 						byterev(val, size);
1903 					mwrite(adrs, val, size);
1904 					adrs += size;
1905 				}
1906 				adrs -= size;
1907 				inc = size;
1908 				break;
1909 			case ',':
1910 				adrs += size;
1911 				break;
1912 			case '.':
1913 				mnoread = 0;
1914 				break;
1915 			case ';':
1916 				break;
1917 			case 'x':
1918 			case EOF:
1919 				scannl();
1920 				return;
1921 			case 'b':
1922 			case 'v':
1923 				size = 1;
1924 				break;
1925 			case 'w':
1926 				size = 2;
1927 				break;
1928 			case 'l':
1929 				size = 4;
1930 				break;
1931 			case 'u':
1932 				size = 8;
1933 				break;
1934 			case '^':
1935 				adrs -= size;
1936 				break;
1937 				break;
1938 			case '/':
1939 				if (nslash > 0)
1940 					adrs -= 1 << nslash;
1941 				else
1942 					nslash = 0;
1943 				nslash += 4;
1944 				adrs += 1 << nslash;
1945 				break;
1946 			case '\\':
1947 				if (nslash < 0)
1948 					adrs += 1 << -nslash;
1949 				else
1950 					nslash = 0;
1951 				nslash -= 4;
1952 				adrs -= 1 << -nslash;
1953 				break;
1954 			case 'm':
1955 				scanhex((void *)&adrs);
1956 				break;
1957 			case 'n':
1958 				mnoread = 1;
1959 				break;
1960 			case 'r':
1961 				brev = !brev;
1962 				break;
1963 			case '<':
1964 				n = size;
1965 				scanhex(&n);
1966 				adrs -= n;
1967 				break;
1968 			case '>':
1969 				n = size;
1970 				scanhex(&n);
1971 				adrs += n;
1972 				break;
1973 			case '?':
1974 				printf(memex_subcmd_help_string);
1975 				break;
1976 			}
1977 		}
1978 		adrs += inc;
1979 	}
1980 }
1981 
1982 static int
1983 bsesc(void)
1984 {
1985 	int c;
1986 
1987 	c = inchar();
1988 	switch( c ){
1989 	case 'n':	c = '\n';	break;
1990 	case 'r':	c = '\r';	break;
1991 	case 'b':	c = '\b';	break;
1992 	case 't':	c = '\t';	break;
1993 	}
1994 	return c;
1995 }
1996 
1997 static void xmon_rawdump (unsigned long adrs, long ndump)
1998 {
1999 	long n, m, r, nr;
2000 	unsigned char temp[16];
2001 
2002 	for (n = ndump; n > 0;) {
2003 		r = n < 16? n: 16;
2004 		nr = mread(adrs, temp, r);
2005 		adrs += nr;
2006 		for (m = 0; m < r; ++m) {
2007 			if (m < nr)
2008 				printf("%.2x", temp[m]);
2009 			else
2010 				printf("%s", fault_chars[fault_type]);
2011 		}
2012 		n -= r;
2013 		if (nr < r)
2014 			break;
2015 	}
2016 	printf("\n");
2017 }
2018 
2019 #ifdef CONFIG_PPC64
2020 static void dump_one_paca(int cpu)
2021 {
2022 	struct paca_struct *p;
2023 
2024 	if (setjmp(bus_error_jmp) != 0) {
2025 		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2026 		return;
2027 	}
2028 
2029 	catch_memory_errors = 1;
2030 	sync();
2031 
2032 	p = &paca[cpu];
2033 
2034 	printf("paca for cpu 0x%x @ %p:\n", cpu, p);
2035 
2036 	printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
2037 	printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
2038 	printf(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no");
2039 
2040 #define DUMP(paca, name, format) \
2041 	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
2042 		offsetof(struct paca_struct, name));
2043 
2044 	DUMP(p, lock_token, "x");
2045 	DUMP(p, paca_index, "x");
2046 	DUMP(p, kernel_toc, "lx");
2047 	DUMP(p, kernelbase, "lx");
2048 	DUMP(p, kernel_msr, "lx");
2049 #ifdef CONFIG_PPC_STD_MMU_64
2050 	DUMP(p, stab_real, "lx");
2051 	DUMP(p, stab_addr, "lx");
2052 #endif
2053 	DUMP(p, emergency_sp, "p");
2054 #ifdef CONFIG_PPC_BOOK3S_64
2055 	DUMP(p, mc_emergency_sp, "p");
2056 	DUMP(p, in_mce, "x");
2057 #endif
2058 	DUMP(p, data_offset, "lx");
2059 	DUMP(p, hw_cpu_id, "x");
2060 	DUMP(p, cpu_start, "x");
2061 	DUMP(p, kexec_state, "x");
2062 	DUMP(p, __current, "p");
2063 	DUMP(p, kstack, "lx");
2064 	DUMP(p, stab_rr, "lx");
2065 	DUMP(p, saved_r1, "lx");
2066 	DUMP(p, trap_save, "x");
2067 	DUMP(p, soft_enabled, "x");
2068 	DUMP(p, irq_happened, "x");
2069 	DUMP(p, io_sync, "x");
2070 	DUMP(p, irq_work_pending, "x");
2071 	DUMP(p, nap_state_lost, "x");
2072 
2073 #undef DUMP
2074 
2075 	catch_memory_errors = 0;
2076 	sync();
2077 }
2078 
2079 static void dump_all_pacas(void)
2080 {
2081 	int cpu;
2082 
2083 	if (num_possible_cpus() == 0) {
2084 		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2085 		return;
2086 	}
2087 
2088 	for_each_possible_cpu(cpu)
2089 		dump_one_paca(cpu);
2090 }
2091 
2092 static void dump_pacas(void)
2093 {
2094 	unsigned long num;
2095 	int c;
2096 
2097 	c = inchar();
2098 	if (c == 'a') {
2099 		dump_all_pacas();
2100 		return;
2101 	}
2102 
2103 	termch = c;	/* Put c back, it wasn't 'a' */
2104 
2105 	if (scanhex(&num))
2106 		dump_one_paca(num);
2107 	else
2108 		dump_one_paca(xmon_owner);
2109 }
2110 #endif
2111 
2112 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
2113 			 || ('a' <= (c) && (c) <= 'f') \
2114 			 || ('A' <= (c) && (c) <= 'F'))
2115 static void
2116 dump(void)
2117 {
2118 	int c;
2119 
2120 	c = inchar();
2121 
2122 #ifdef CONFIG_PPC64
2123 	if (c == 'p') {
2124 		dump_pacas();
2125 		return;
2126 	}
2127 #endif
2128 
2129 	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
2130 		termch = c;
2131 	scanhex((void *)&adrs);
2132 	if (termch != '\n')
2133 		termch = 0;
2134 	if (c == 'i') {
2135 		scanhex(&nidump);
2136 		if (nidump == 0)
2137 			nidump = 16;
2138 		else if (nidump > MAX_DUMP)
2139 			nidump = MAX_DUMP;
2140 		adrs += ppc_inst_dump(adrs, nidump, 1);
2141 		last_cmd = "di\n";
2142 	} else if (c == 'l') {
2143 		dump_log_buf();
2144 	} else if (c == 'r') {
2145 		scanhex(&ndump);
2146 		if (ndump == 0)
2147 			ndump = 64;
2148 		xmon_rawdump(adrs, ndump);
2149 		adrs += ndump;
2150 		last_cmd = "dr\n";
2151 	} else {
2152 		scanhex(&ndump);
2153 		if (ndump == 0)
2154 			ndump = 64;
2155 		else if (ndump > MAX_DUMP)
2156 			ndump = MAX_DUMP;
2157 		prdump(adrs, ndump);
2158 		adrs += ndump;
2159 		last_cmd = "d\n";
2160 	}
2161 }
2162 
2163 static void
2164 prdump(unsigned long adrs, long ndump)
2165 {
2166 	long n, m, c, r, nr;
2167 	unsigned char temp[16];
2168 
2169 	for (n = ndump; n > 0;) {
2170 		printf(REG, adrs);
2171 		putchar(' ');
2172 		r = n < 16? n: 16;
2173 		nr = mread(adrs, temp, r);
2174 		adrs += nr;
2175 		for (m = 0; m < r; ++m) {
2176 			if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2177 				putchar(' ');
2178 			if (m < nr)
2179 				printf("%.2x", temp[m]);
2180 			else
2181 				printf("%s", fault_chars[fault_type]);
2182 		}
2183 		for (; m < 16; ++m) {
2184 			if ((m & (sizeof(long) - 1)) == 0)
2185 				putchar(' ');
2186 			printf("  ");
2187 		}
2188 		printf("  |");
2189 		for (m = 0; m < r; ++m) {
2190 			if (m < nr) {
2191 				c = temp[m];
2192 				putchar(' ' <= c && c <= '~'? c: '.');
2193 			} else
2194 				putchar(' ');
2195 		}
2196 		n -= r;
2197 		for (; m < 16; ++m)
2198 			putchar(' ');
2199 		printf("|\n");
2200 		if (nr < r)
2201 			break;
2202 	}
2203 }
2204 
2205 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2206 
2207 static int
2208 generic_inst_dump(unsigned long adr, long count, int praddr,
2209 			instruction_dump_func dump_func)
2210 {
2211 	int nr, dotted;
2212 	unsigned long first_adr;
2213 	unsigned long inst, last_inst = 0;
2214 	unsigned char val[4];
2215 
2216 	dotted = 0;
2217 	for (first_adr = adr; count > 0; --count, adr += 4) {
2218 		nr = mread(adr, val, 4);
2219 		if (nr == 0) {
2220 			if (praddr) {
2221 				const char *x = fault_chars[fault_type];
2222 				printf(REG"  %s%s%s%s\n", adr, x, x, x, x);
2223 			}
2224 			break;
2225 		}
2226 		inst = GETWORD(val);
2227 		if (adr > first_adr && inst == last_inst) {
2228 			if (!dotted) {
2229 				printf(" ...\n");
2230 				dotted = 1;
2231 			}
2232 			continue;
2233 		}
2234 		dotted = 0;
2235 		last_inst = inst;
2236 		if (praddr)
2237 			printf(REG"  %.8x", adr, inst);
2238 		printf("\t");
2239 		dump_func(inst, adr);
2240 		printf("\n");
2241 	}
2242 	return adr - first_adr;
2243 }
2244 
2245 static int
2246 ppc_inst_dump(unsigned long adr, long count, int praddr)
2247 {
2248 	return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2249 }
2250 
2251 void
2252 print_address(unsigned long addr)
2253 {
2254 	xmon_print_symbol(addr, "\t# ", "");
2255 }
2256 
2257 void
2258 dump_log_buf(void)
2259 {
2260 	struct kmsg_dumper dumper = { .active = 1 };
2261 	unsigned char buf[128];
2262 	size_t len;
2263 
2264 	if (setjmp(bus_error_jmp) != 0) {
2265 		printf("Error dumping printk buffer!\n");
2266 		return;
2267 	}
2268 
2269 	catch_memory_errors = 1;
2270 	sync();
2271 
2272 	kmsg_dump_rewind_nolock(&dumper);
2273 	while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2274 		buf[len] = '\0';
2275 		printf("%s", buf);
2276 	}
2277 
2278 	sync();
2279 	/* wait a little while to see if we get a machine check */
2280 	__delay(200);
2281 	catch_memory_errors = 0;
2282 }
2283 
2284 /*
2285  * Memory operations - move, set, print differences
2286  */
2287 static unsigned long mdest;		/* destination address */
2288 static unsigned long msrc;		/* source address */
2289 static unsigned long mval;		/* byte value to set memory to */
2290 static unsigned long mcount;		/* # bytes to affect */
2291 static unsigned long mdiffs;		/* max # differences to print */
2292 
2293 static void
2294 memops(int cmd)
2295 {
2296 	scanhex((void *)&mdest);
2297 	if( termch != '\n' )
2298 		termch = 0;
2299 	scanhex((void *)(cmd == 's'? &mval: &msrc));
2300 	if( termch != '\n' )
2301 		termch = 0;
2302 	scanhex((void *)&mcount);
2303 	switch( cmd ){
2304 	case 'm':
2305 		memmove((void *)mdest, (void *)msrc, mcount);
2306 		break;
2307 	case 's':
2308 		memset((void *)mdest, mval, mcount);
2309 		break;
2310 	case 'd':
2311 		if( termch != '\n' )
2312 			termch = 0;
2313 		scanhex((void *)&mdiffs);
2314 		memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2315 		break;
2316 	}
2317 }
2318 
2319 static void
2320 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2321 {
2322 	unsigned n, prt;
2323 
2324 	prt = 0;
2325 	for( n = nb; n > 0; --n )
2326 		if( *p1++ != *p2++ )
2327 			if( ++prt <= maxpr )
2328 				printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,
2329 					p1[-1], p2 - 1, p2[-1]);
2330 	if( prt > maxpr )
2331 		printf("Total of %d differences\n", prt);
2332 }
2333 
2334 static unsigned mend;
2335 static unsigned mask;
2336 
2337 static void
2338 memlocate(void)
2339 {
2340 	unsigned a, n;
2341 	unsigned char val[4];
2342 
2343 	last_cmd = "ml";
2344 	scanhex((void *)&mdest);
2345 	if (termch != '\n') {
2346 		termch = 0;
2347 		scanhex((void *)&mend);
2348 		if (termch != '\n') {
2349 			termch = 0;
2350 			scanhex((void *)&mval);
2351 			mask = ~0;
2352 			if (termch != '\n') termch = 0;
2353 			scanhex((void *)&mask);
2354 		}
2355 	}
2356 	n = 0;
2357 	for (a = mdest; a < mend; a += 4) {
2358 		if (mread(a, val, 4) == 4
2359 			&& ((GETWORD(val) ^ mval) & mask) == 0) {
2360 			printf("%.16x:  %.16x\n", a, GETWORD(val));
2361 			if (++n >= 10)
2362 				break;
2363 		}
2364 	}
2365 }
2366 
2367 static unsigned long mskip = 0x1000;
2368 static unsigned long mlim = 0xffffffff;
2369 
2370 static void
2371 memzcan(void)
2372 {
2373 	unsigned char v;
2374 	unsigned a;
2375 	int ok, ook;
2376 
2377 	scanhex(&mdest);
2378 	if (termch != '\n') termch = 0;
2379 	scanhex(&mskip);
2380 	if (termch != '\n') termch = 0;
2381 	scanhex(&mlim);
2382 	ook = 0;
2383 	for (a = mdest; a < mlim; a += mskip) {
2384 		ok = mread(a, &v, 1);
2385 		if (ok && !ook) {
2386 			printf("%.8x .. ", a);
2387 		} else if (!ok && ook)
2388 			printf("%.8x\n", a - mskip);
2389 		ook = ok;
2390 		if (a + mskip < a)
2391 			break;
2392 	}
2393 	if (ook)
2394 		printf("%.8x\n", a - mskip);
2395 }
2396 
2397 static void proccall(void)
2398 {
2399 	unsigned long args[8];
2400 	unsigned long ret;
2401 	int i;
2402 	typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
2403 			unsigned long, unsigned long, unsigned long,
2404 			unsigned long, unsigned long, unsigned long);
2405 	callfunc_t func;
2406 
2407 	if (!scanhex(&adrs))
2408 		return;
2409 	if (termch != '\n')
2410 		termch = 0;
2411 	for (i = 0; i < 8; ++i)
2412 		args[i] = 0;
2413 	for (i = 0; i < 8; ++i) {
2414 		if (!scanhex(&args[i]) || termch == '\n')
2415 			break;
2416 		termch = 0;
2417 	}
2418 	func = (callfunc_t) adrs;
2419 	ret = 0;
2420 	if (setjmp(bus_error_jmp) == 0) {
2421 		catch_memory_errors = 1;
2422 		sync();
2423 		ret = func(args[0], args[1], args[2], args[3],
2424 			   args[4], args[5], args[6], args[7]);
2425 		sync();
2426 		printf("return value is %x\n", ret);
2427 	} else {
2428 		printf("*** %x exception occurred\n", fault_except);
2429 	}
2430 	catch_memory_errors = 0;
2431 }
2432 
2433 /* Input scanning routines */
2434 int
2435 skipbl(void)
2436 {
2437 	int c;
2438 
2439 	if( termch != 0 ){
2440 		c = termch;
2441 		termch = 0;
2442 	} else
2443 		c = inchar();
2444 	while( c == ' ' || c == '\t' )
2445 		c = inchar();
2446 	return c;
2447 }
2448 
2449 #define N_PTREGS	44
2450 static char *regnames[N_PTREGS] = {
2451 	"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2452 	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2453 	"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2454 	"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2455 	"pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2456 #ifdef CONFIG_PPC64
2457 	"softe",
2458 #else
2459 	"mq",
2460 #endif
2461 	"trap", "dar", "dsisr", "res"
2462 };
2463 
2464 int
2465 scanhex(unsigned long *vp)
2466 {
2467 	int c, d;
2468 	unsigned long v;
2469 
2470 	c = skipbl();
2471 	if (c == '%') {
2472 		/* parse register name */
2473 		char regname[8];
2474 		int i;
2475 
2476 		for (i = 0; i < sizeof(regname) - 1; ++i) {
2477 			c = inchar();
2478 			if (!isalnum(c)) {
2479 				termch = c;
2480 				break;
2481 			}
2482 			regname[i] = c;
2483 		}
2484 		regname[i] = 0;
2485 		for (i = 0; i < N_PTREGS; ++i) {
2486 			if (strcmp(regnames[i], regname) == 0) {
2487 				if (xmon_regs == NULL) {
2488 					printf("regs not available\n");
2489 					return 0;
2490 				}
2491 				*vp = ((unsigned long *)xmon_regs)[i];
2492 				return 1;
2493 			}
2494 		}
2495 		printf("invalid register name '%%%s'\n", regname);
2496 		return 0;
2497 	}
2498 
2499 	/* skip leading "0x" if any */
2500 
2501 	if (c == '0') {
2502 		c = inchar();
2503 		if (c == 'x') {
2504 			c = inchar();
2505 		} else {
2506 			d = hexdigit(c);
2507 			if (d == EOF) {
2508 				termch = c;
2509 				*vp = 0;
2510 				return 1;
2511 			}
2512 		}
2513 	} else if (c == '$') {
2514 		int i;
2515 		for (i=0; i<63; i++) {
2516 			c = inchar();
2517 			if (isspace(c)) {
2518 				termch = c;
2519 				break;
2520 			}
2521 			tmpstr[i] = c;
2522 		}
2523 		tmpstr[i++] = 0;
2524 		*vp = 0;
2525 		if (setjmp(bus_error_jmp) == 0) {
2526 			catch_memory_errors = 1;
2527 			sync();
2528 			*vp = kallsyms_lookup_name(tmpstr);
2529 			sync();
2530 		}
2531 		catch_memory_errors = 0;
2532 		if (!(*vp)) {
2533 			printf("unknown symbol '%s'\n", tmpstr);
2534 			return 0;
2535 		}
2536 		return 1;
2537 	}
2538 
2539 	d = hexdigit(c);
2540 	if (d == EOF) {
2541 		termch = c;
2542 		return 0;
2543 	}
2544 	v = 0;
2545 	do {
2546 		v = (v << 4) + d;
2547 		c = inchar();
2548 		d = hexdigit(c);
2549 	} while (d != EOF);
2550 	termch = c;
2551 	*vp = v;
2552 	return 1;
2553 }
2554 
2555 static void
2556 scannl(void)
2557 {
2558 	int c;
2559 
2560 	c = termch;
2561 	termch = 0;
2562 	while( c != '\n' )
2563 		c = inchar();
2564 }
2565 
2566 static int hexdigit(int c)
2567 {
2568 	if( '0' <= c && c <= '9' )
2569 		return c - '0';
2570 	if( 'A' <= c && c <= 'F' )
2571 		return c - ('A' - 10);
2572 	if( 'a' <= c && c <= 'f' )
2573 		return c - ('a' - 10);
2574 	return EOF;
2575 }
2576 
2577 void
2578 getstring(char *s, int size)
2579 {
2580 	int c;
2581 
2582 	c = skipbl();
2583 	do {
2584 		if( size > 1 ){
2585 			*s++ = c;
2586 			--size;
2587 		}
2588 		c = inchar();
2589 	} while( c != ' ' && c != '\t' && c != '\n' );
2590 	termch = c;
2591 	*s = 0;
2592 }
2593 
2594 static char line[256];
2595 static char *lineptr;
2596 
2597 static void
2598 flush_input(void)
2599 {
2600 	lineptr = NULL;
2601 }
2602 
2603 static int
2604 inchar(void)
2605 {
2606 	if (lineptr == NULL || *lineptr == 0) {
2607 		if (xmon_gets(line, sizeof(line)) == NULL) {
2608 			lineptr = NULL;
2609 			return EOF;
2610 		}
2611 		lineptr = line;
2612 	}
2613 	return *lineptr++;
2614 }
2615 
2616 static void
2617 take_input(char *str)
2618 {
2619 	lineptr = str;
2620 }
2621 
2622 
2623 static void
2624 symbol_lookup(void)
2625 {
2626 	int type = inchar();
2627 	unsigned long addr;
2628 	static char tmp[64];
2629 
2630 	switch (type) {
2631 	case 'a':
2632 		if (scanhex(&addr))
2633 			xmon_print_symbol(addr, ": ", "\n");
2634 		termch = 0;
2635 		break;
2636 	case 's':
2637 		getstring(tmp, 64);
2638 		if (setjmp(bus_error_jmp) == 0) {
2639 			catch_memory_errors = 1;
2640 			sync();
2641 			addr = kallsyms_lookup_name(tmp);
2642 			if (addr)
2643 				printf("%s: %lx\n", tmp, addr);
2644 			else
2645 				printf("Symbol '%s' not found.\n", tmp);
2646 			sync();
2647 		}
2648 		catch_memory_errors = 0;
2649 		termch = 0;
2650 		break;
2651 	}
2652 }
2653 
2654 
2655 /* Print an address in numeric and symbolic form (if possible) */
2656 static void xmon_print_symbol(unsigned long address, const char *mid,
2657 			      const char *after)
2658 {
2659 	char *modname;
2660 	const char *name = NULL;
2661 	unsigned long offset, size;
2662 
2663 	printf(REG, address);
2664 	if (setjmp(bus_error_jmp) == 0) {
2665 		catch_memory_errors = 1;
2666 		sync();
2667 		name = kallsyms_lookup(address, &size, &offset, &modname,
2668 				       tmpstr);
2669 		sync();
2670 		/* wait a little while to see if we get a machine check */
2671 		__delay(200);
2672 	}
2673 
2674 	catch_memory_errors = 0;
2675 
2676 	if (name) {
2677 		printf("%s%s+%#lx/%#lx", mid, name, offset, size);
2678 		if (modname)
2679 			printf(" [%s]", modname);
2680 	}
2681 	printf("%s", after);
2682 }
2683 
2684 #ifdef CONFIG_PPC_BOOK3S_64
2685 static void dump_slb(void)
2686 {
2687 	int i;
2688 	unsigned long esid,vsid,valid;
2689 	unsigned long llp;
2690 
2691 	printf("SLB contents of cpu %x\n", smp_processor_id());
2692 
2693 	for (i = 0; i < mmu_slb_size; i++) {
2694 		asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
2695 		asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
2696 		valid = (esid & SLB_ESID_V);
2697 		if (valid | esid | vsid) {
2698 			printf("%02d %016lx %016lx", i, esid, vsid);
2699 			if (valid) {
2700 				llp = vsid & SLB_VSID_LLP;
2701 				if (vsid & SLB_VSID_B_1T) {
2702 					printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",
2703 						GET_ESID_1T(esid),
2704 						(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
2705 						llp);
2706 				} else {
2707 					printf(" 256M ESID=%9lx  VSID=%13lx LLP:%3lx \n",
2708 						GET_ESID(esid),
2709 						(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
2710 						llp);
2711 				}
2712 			} else
2713 				printf("\n");
2714 		}
2715 	}
2716 }
2717 
2718 static void dump_stab(void)
2719 {
2720 	int i;
2721 	unsigned long *tmp = (unsigned long *)local_paca->stab_addr;
2722 
2723 	printf("Segment table contents of cpu %x\n", smp_processor_id());
2724 
2725 	for (i = 0; i < PAGE_SIZE/16; i++) {
2726 		unsigned long a, b;
2727 
2728 		a = *tmp++;
2729 		b = *tmp++;
2730 
2731 		if (a || b) {
2732 			printf("%03d %016lx ", i, a);
2733 			printf("%016lx\n", b);
2734 		}
2735 	}
2736 }
2737 
2738 void dump_segments(void)
2739 {
2740 	if (mmu_has_feature(MMU_FTR_SLB))
2741 		dump_slb();
2742 	else
2743 		dump_stab();
2744 }
2745 #endif
2746 
2747 #ifdef CONFIG_PPC_STD_MMU_32
2748 void dump_segments(void)
2749 {
2750 	int i;
2751 
2752 	printf("sr0-15 =");
2753 	for (i = 0; i < 16; ++i)
2754 		printf(" %x", mfsrin(i));
2755 	printf("\n");
2756 }
2757 #endif
2758 
2759 #ifdef CONFIG_44x
2760 static void dump_tlb_44x(void)
2761 {
2762 	int i;
2763 
2764 	for (i = 0; i < PPC44x_TLB_SIZE; i++) {
2765 		unsigned long w0,w1,w2;
2766 		asm volatile("tlbre  %0,%1,0" : "=r" (w0) : "r" (i));
2767 		asm volatile("tlbre  %0,%1,1" : "=r" (w1) : "r" (i));
2768 		asm volatile("tlbre  %0,%1,2" : "=r" (w2) : "r" (i));
2769 		printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
2770 		if (w0 & PPC44x_TLB_VALID) {
2771 			printf("V %08x -> %01x%08x %c%c%c%c%c",
2772 			       w0 & PPC44x_TLB_EPN_MASK,
2773 			       w1 & PPC44x_TLB_ERPN_MASK,
2774 			       w1 & PPC44x_TLB_RPN_MASK,
2775 			       (w2 & PPC44x_TLB_W) ? 'W' : 'w',
2776 			       (w2 & PPC44x_TLB_I) ? 'I' : 'i',
2777 			       (w2 & PPC44x_TLB_M) ? 'M' : 'm',
2778 			       (w2 & PPC44x_TLB_G) ? 'G' : 'g',
2779 			       (w2 & PPC44x_TLB_E) ? 'E' : 'e');
2780 		}
2781 		printf("\n");
2782 	}
2783 }
2784 #endif /* CONFIG_44x */
2785 
2786 #ifdef CONFIG_PPC_BOOK3E
2787 static void dump_tlb_book3e(void)
2788 {
2789 	u32 mmucfg, pidmask, lpidmask;
2790 	u64 ramask;
2791 	int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
2792 	int mmu_version;
2793 	static const char *pgsz_names[] = {
2794 		"  1K",
2795 		"  2K",
2796 		"  4K",
2797 		"  8K",
2798 		" 16K",
2799 		" 32K",
2800 		" 64K",
2801 		"128K",
2802 		"256K",
2803 		"512K",
2804 		"  1M",
2805 		"  2M",
2806 		"  4M",
2807 		"  8M",
2808 		" 16M",
2809 		" 32M",
2810 		" 64M",
2811 		"128M",
2812 		"256M",
2813 		"512M",
2814 		"  1G",
2815 		"  2G",
2816 		"  4G",
2817 		"  8G",
2818 		" 16G",
2819 		" 32G",
2820 		" 64G",
2821 		"128G",
2822 		"256G",
2823 		"512G",
2824 		"  1T",
2825 		"  2T",
2826 	};
2827 
2828 	/* Gather some infos about the MMU */
2829 	mmucfg = mfspr(SPRN_MMUCFG);
2830 	mmu_version = (mmucfg & 3) + 1;
2831 	ntlbs = ((mmucfg >> 2) & 3) + 1;
2832 	pidsz = ((mmucfg >> 6) & 0x1f) + 1;
2833 	lpidsz = (mmucfg >> 24) & 0xf;
2834 	rasz = (mmucfg >> 16) & 0x7f;
2835 	if ((mmu_version > 1) && (mmucfg & 0x10000))
2836 		lrat = 1;
2837 	printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
2838 	       mmu_version, ntlbs, pidsz, lpidsz, rasz);
2839 	pidmask = (1ul << pidsz) - 1;
2840 	lpidmask = (1ul << lpidsz) - 1;
2841 	ramask = (1ull << rasz) - 1;
2842 
2843 	for (tlb = 0; tlb < ntlbs; tlb++) {
2844 		u32 tlbcfg;
2845 		int nent, assoc, new_cc = 1;
2846 		printf("TLB %d:\n------\n", tlb);
2847 		switch(tlb) {
2848 		case 0:
2849 			tlbcfg = mfspr(SPRN_TLB0CFG);
2850 			break;
2851 		case 1:
2852 			tlbcfg = mfspr(SPRN_TLB1CFG);
2853 			break;
2854 		case 2:
2855 			tlbcfg = mfspr(SPRN_TLB2CFG);
2856 			break;
2857 		case 3:
2858 			tlbcfg = mfspr(SPRN_TLB3CFG);
2859 			break;
2860 		default:
2861 			printf("Unsupported TLB number !\n");
2862 			continue;
2863 		}
2864 		nent = tlbcfg & 0xfff;
2865 		assoc = (tlbcfg >> 24) & 0xff;
2866 		for (i = 0; i < nent; i++) {
2867 			u32 mas0 = MAS0_TLBSEL(tlb);
2868 			u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
2869 			u64 mas2 = 0;
2870 			u64 mas7_mas3;
2871 			int esel = i, cc = i;
2872 
2873 			if (assoc != 0) {
2874 				cc = i / assoc;
2875 				esel = i % assoc;
2876 				mas2 = cc * 0x1000;
2877 			}
2878 
2879 			mas0 |= MAS0_ESEL(esel);
2880 			mtspr(SPRN_MAS0, mas0);
2881 			mtspr(SPRN_MAS1, mas1);
2882 			mtspr(SPRN_MAS2, mas2);
2883 			asm volatile("tlbre  0,0,0" : : : "memory");
2884 			mas1 = mfspr(SPRN_MAS1);
2885 			mas2 = mfspr(SPRN_MAS2);
2886 			mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
2887 			if (assoc && (i % assoc) == 0)
2888 				new_cc = 1;
2889 			if (!(mas1 & MAS1_VALID))
2890 				continue;
2891 			if (assoc == 0)
2892 				printf("%04x- ", i);
2893 			else if (new_cc)
2894 				printf("%04x-%c", cc, 'A' + esel);
2895 			else
2896 				printf("    |%c", 'A' + esel);
2897 			new_cc = 0;
2898 			printf(" %016llx %04x %s %c%c AS%c",
2899 			       mas2 & ~0x3ffull,
2900 			       (mas1 >> 16) & 0x3fff,
2901 			       pgsz_names[(mas1 >> 7) & 0x1f],
2902 			       mas1 & MAS1_IND ? 'I' : ' ',
2903 			       mas1 & MAS1_IPROT ? 'P' : ' ',
2904 			       mas1 & MAS1_TS ? '1' : '0');
2905 			printf(" %c%c%c%c%c%c%c",
2906 			       mas2 & MAS2_X0 ? 'a' : ' ',
2907 			       mas2 & MAS2_X1 ? 'v' : ' ',
2908 			       mas2 & MAS2_W  ? 'w' : ' ',
2909 			       mas2 & MAS2_I  ? 'i' : ' ',
2910 			       mas2 & MAS2_M  ? 'm' : ' ',
2911 			       mas2 & MAS2_G  ? 'g' : ' ',
2912 			       mas2 & MAS2_E  ? 'e' : ' ');
2913 			printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
2914 			if (mas1 & MAS1_IND)
2915 				printf(" %s\n",
2916 				       pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
2917 			else
2918 				printf(" U%c%c%c S%c%c%c\n",
2919 				       mas7_mas3 & MAS3_UX ? 'x' : ' ',
2920 				       mas7_mas3 & MAS3_UW ? 'w' : ' ',
2921 				       mas7_mas3 & MAS3_UR ? 'r' : ' ',
2922 				       mas7_mas3 & MAS3_SX ? 'x' : ' ',
2923 				       mas7_mas3 & MAS3_SW ? 'w' : ' ',
2924 				       mas7_mas3 & MAS3_SR ? 'r' : ' ');
2925 		}
2926 	}
2927 }
2928 #endif /* CONFIG_PPC_BOOK3E */
2929 
2930 static void xmon_init(int enable)
2931 {
2932 	if (enable) {
2933 		__debugger = xmon;
2934 		__debugger_ipi = xmon_ipi;
2935 		__debugger_bpt = xmon_bpt;
2936 		__debugger_sstep = xmon_sstep;
2937 		__debugger_iabr_match = xmon_iabr_match;
2938 		__debugger_break_match = xmon_break_match;
2939 		__debugger_fault_handler = xmon_fault_handler;
2940 	} else {
2941 		__debugger = NULL;
2942 		__debugger_ipi = NULL;
2943 		__debugger_bpt = NULL;
2944 		__debugger_sstep = NULL;
2945 		__debugger_iabr_match = NULL;
2946 		__debugger_break_match = NULL;
2947 		__debugger_fault_handler = NULL;
2948 	}
2949 }
2950 
2951 #ifdef CONFIG_MAGIC_SYSRQ
2952 static void sysrq_handle_xmon(int key)
2953 {
2954 	/* ensure xmon is enabled */
2955 	xmon_init(1);
2956 	debugger(get_irq_regs());
2957 }
2958 
2959 static struct sysrq_key_op sysrq_xmon_op = {
2960 	.handler =	sysrq_handle_xmon,
2961 	.help_msg =	"xmon(x)",
2962 	.action_msg =	"Entering xmon",
2963 };
2964 
2965 static int __init setup_xmon_sysrq(void)
2966 {
2967 	register_sysrq_key('x', &sysrq_xmon_op);
2968 	return 0;
2969 }
2970 __initcall(setup_xmon_sysrq);
2971 #endif /* CONFIG_MAGIC_SYSRQ */
2972 
2973 static int __initdata xmon_early, xmon_off;
2974 
2975 static int __init early_parse_xmon(char *p)
2976 {
2977 	if (!p || strncmp(p, "early", 5) == 0) {
2978 		/* just "xmon" is equivalent to "xmon=early" */
2979 		xmon_init(1);
2980 		xmon_early = 1;
2981 	} else if (strncmp(p, "on", 2) == 0)
2982 		xmon_init(1);
2983 	else if (strncmp(p, "off", 3) == 0)
2984 		xmon_off = 1;
2985 	else if (strncmp(p, "nobt", 4) == 0)
2986 		xmon_no_auto_backtrace = 1;
2987 	else
2988 		return 1;
2989 
2990 	return 0;
2991 }
2992 early_param("xmon", early_parse_xmon);
2993 
2994 void __init xmon_setup(void)
2995 {
2996 #ifdef CONFIG_XMON_DEFAULT
2997 	if (!xmon_off)
2998 		xmon_init(1);
2999 #endif
3000 	if (xmon_early)
3001 		debugger(NULL);
3002 }
3003 
3004 #ifdef CONFIG_SPU_BASE
3005 
3006 struct spu_info {
3007 	struct spu *spu;
3008 	u64 saved_mfc_sr1_RW;
3009 	u32 saved_spu_runcntl_RW;
3010 	unsigned long dump_addr;
3011 	u8 stopped_ok;
3012 };
3013 
3014 #define XMON_NUM_SPUS	16	/* Enough for current hardware */
3015 
3016 static struct spu_info spu_info[XMON_NUM_SPUS];
3017 
3018 void xmon_register_spus(struct list_head *list)
3019 {
3020 	struct spu *spu;
3021 
3022 	list_for_each_entry(spu, list, full_list) {
3023 		if (spu->number >= XMON_NUM_SPUS) {
3024 			WARN_ON(1);
3025 			continue;
3026 		}
3027 
3028 		spu_info[spu->number].spu = spu;
3029 		spu_info[spu->number].stopped_ok = 0;
3030 		spu_info[spu->number].dump_addr = (unsigned long)
3031 				spu_info[spu->number].spu->local_store;
3032 	}
3033 }
3034 
3035 static void stop_spus(void)
3036 {
3037 	struct spu *spu;
3038 	int i;
3039 	u64 tmp;
3040 
3041 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3042 		if (!spu_info[i].spu)
3043 			continue;
3044 
3045 		if (setjmp(bus_error_jmp) == 0) {
3046 			catch_memory_errors = 1;
3047 			sync();
3048 
3049 			spu = spu_info[i].spu;
3050 
3051 			spu_info[i].saved_spu_runcntl_RW =
3052 				in_be32(&spu->problem->spu_runcntl_RW);
3053 
3054 			tmp = spu_mfc_sr1_get(spu);
3055 			spu_info[i].saved_mfc_sr1_RW = tmp;
3056 
3057 			tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3058 			spu_mfc_sr1_set(spu, tmp);
3059 
3060 			sync();
3061 			__delay(200);
3062 
3063 			spu_info[i].stopped_ok = 1;
3064 
3065 			printf("Stopped spu %.2d (was %s)\n", i,
3066 					spu_info[i].saved_spu_runcntl_RW ?
3067 					"running" : "stopped");
3068 		} else {
3069 			catch_memory_errors = 0;
3070 			printf("*** Error stopping spu %.2d\n", i);
3071 		}
3072 		catch_memory_errors = 0;
3073 	}
3074 }
3075 
3076 static void restart_spus(void)
3077 {
3078 	struct spu *spu;
3079 	int i;
3080 
3081 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3082 		if (!spu_info[i].spu)
3083 			continue;
3084 
3085 		if (!spu_info[i].stopped_ok) {
3086 			printf("*** Error, spu %d was not successfully stopped"
3087 					", not restarting\n", i);
3088 			continue;
3089 		}
3090 
3091 		if (setjmp(bus_error_jmp) == 0) {
3092 			catch_memory_errors = 1;
3093 			sync();
3094 
3095 			spu = spu_info[i].spu;
3096 			spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3097 			out_be32(&spu->problem->spu_runcntl_RW,
3098 					spu_info[i].saved_spu_runcntl_RW);
3099 
3100 			sync();
3101 			__delay(200);
3102 
3103 			printf("Restarted spu %.2d\n", i);
3104 		} else {
3105 			catch_memory_errors = 0;
3106 			printf("*** Error restarting spu %.2d\n", i);
3107 		}
3108 		catch_memory_errors = 0;
3109 	}
3110 }
3111 
3112 #define DUMP_WIDTH	23
3113 #define DUMP_VALUE(format, field, value)				\
3114 do {									\
3115 	if (setjmp(bus_error_jmp) == 0) {				\
3116 		catch_memory_errors = 1;				\
3117 		sync();							\
3118 		printf("  %-*s = "format"\n", DUMP_WIDTH,		\
3119 				#field, value);				\
3120 		sync();							\
3121 		__delay(200);						\
3122 	} else {							\
3123 		catch_memory_errors = 0;				\
3124 		printf("  %-*s = *** Error reading field.\n",		\
3125 					DUMP_WIDTH, #field);		\
3126 	}								\
3127 	catch_memory_errors = 0;					\
3128 } while (0)
3129 
3130 #define DUMP_FIELD(obj, format, field)	\
3131 	DUMP_VALUE(format, field, obj->field)
3132 
3133 static void dump_spu_fields(struct spu *spu)
3134 {
3135 	printf("Dumping spu fields at address %p:\n", spu);
3136 
3137 	DUMP_FIELD(spu, "0x%x", number);
3138 	DUMP_FIELD(spu, "%s", name);
3139 	DUMP_FIELD(spu, "0x%lx", local_store_phys);
3140 	DUMP_FIELD(spu, "0x%p", local_store);
3141 	DUMP_FIELD(spu, "0x%lx", ls_size);
3142 	DUMP_FIELD(spu, "0x%x", node);
3143 	DUMP_FIELD(spu, "0x%lx", flags);
3144 	DUMP_FIELD(spu, "%d", class_0_pending);
3145 	DUMP_FIELD(spu, "0x%lx", class_0_dar);
3146 	DUMP_FIELD(spu, "0x%lx", class_1_dar);
3147 	DUMP_FIELD(spu, "0x%lx", class_1_dsisr);
3148 	DUMP_FIELD(spu, "0x%lx", irqs[0]);
3149 	DUMP_FIELD(spu, "0x%lx", irqs[1]);
3150 	DUMP_FIELD(spu, "0x%lx", irqs[2]);
3151 	DUMP_FIELD(spu, "0x%x", slb_replace);
3152 	DUMP_FIELD(spu, "%d", pid);
3153 	DUMP_FIELD(spu, "0x%p", mm);
3154 	DUMP_FIELD(spu, "0x%p", ctx);
3155 	DUMP_FIELD(spu, "0x%p", rq);
3156 	DUMP_FIELD(spu, "0x%p", timestamp);
3157 	DUMP_FIELD(spu, "0x%lx", problem_phys);
3158 	DUMP_FIELD(spu, "0x%p", problem);
3159 	DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
3160 			in_be32(&spu->problem->spu_runcntl_RW));
3161 	DUMP_VALUE("0x%x", problem->spu_status_R,
3162 			in_be32(&spu->problem->spu_status_R));
3163 	DUMP_VALUE("0x%x", problem->spu_npc_RW,
3164 			in_be32(&spu->problem->spu_npc_RW));
3165 	DUMP_FIELD(spu, "0x%p", priv2);
3166 	DUMP_FIELD(spu, "0x%p", pdata);
3167 }
3168 
3169 int
3170 spu_inst_dump(unsigned long adr, long count, int praddr)
3171 {
3172 	return generic_inst_dump(adr, count, praddr, print_insn_spu);
3173 }
3174 
3175 static void dump_spu_ls(unsigned long num, int subcmd)
3176 {
3177 	unsigned long offset, addr, ls_addr;
3178 
3179 	if (setjmp(bus_error_jmp) == 0) {
3180 		catch_memory_errors = 1;
3181 		sync();
3182 		ls_addr = (unsigned long)spu_info[num].spu->local_store;
3183 		sync();
3184 		__delay(200);
3185 	} else {
3186 		catch_memory_errors = 0;
3187 		printf("*** Error: accessing spu info for spu %d\n", num);
3188 		return;
3189 	}
3190 	catch_memory_errors = 0;
3191 
3192 	if (scanhex(&offset))
3193 		addr = ls_addr + offset;
3194 	else
3195 		addr = spu_info[num].dump_addr;
3196 
3197 	if (addr >= ls_addr + LS_SIZE) {
3198 		printf("*** Error: address outside of local store\n");
3199 		return;
3200 	}
3201 
3202 	switch (subcmd) {
3203 	case 'i':
3204 		addr += spu_inst_dump(addr, 16, 1);
3205 		last_cmd = "sdi\n";
3206 		break;
3207 	default:
3208 		prdump(addr, 64);
3209 		addr += 64;
3210 		last_cmd = "sd\n";
3211 		break;
3212 	}
3213 
3214 	spu_info[num].dump_addr = addr;
3215 }
3216 
3217 static int do_spu_cmd(void)
3218 {
3219 	static unsigned long num = 0;
3220 	int cmd, subcmd = 0;
3221 
3222 	cmd = inchar();
3223 	switch (cmd) {
3224 	case 's':
3225 		stop_spus();
3226 		break;
3227 	case 'r':
3228 		restart_spus();
3229 		break;
3230 	case 'd':
3231 		subcmd = inchar();
3232 		if (isxdigit(subcmd) || subcmd == '\n')
3233 			termch = subcmd;
3234 	case 'f':
3235 		scanhex(&num);
3236 		if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
3237 			printf("*** Error: invalid spu number\n");
3238 			return 0;
3239 		}
3240 
3241 		switch (cmd) {
3242 		case 'f':
3243 			dump_spu_fields(spu_info[num].spu);
3244 			break;
3245 		default:
3246 			dump_spu_ls(num, subcmd);
3247 			break;
3248 		}
3249 
3250 		break;
3251 	default:
3252 		return -1;
3253 	}
3254 
3255 	return 0;
3256 }
3257 #else /* ! CONFIG_SPU_BASE */
3258 static int do_spu_cmd(void)
3259 {
3260 	return -1;
3261 }
3262 #endif
3263