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