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