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