xref: /openbmc/linux/arch/powerpc/xmon/xmon.c (revision ba61bb17)
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 
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/sched/signal.h>
17 #include <linux/smp.h>
18 #include <linux/mm.h>
19 #include <linux/reboot.h>
20 #include <linux/delay.h>
21 #include <linux/kallsyms.h>
22 #include <linux/kmsg_dump.h>
23 #include <linux/cpumask.h>
24 #include <linux/export.h>
25 #include <linux/sysrq.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/bug.h>
29 #include <linux/nmi.h>
30 #include <linux/ctype.h>
31 #include <linux/highmem.h>
32 
33 #include <asm/debugfs.h>
34 #include <asm/ptrace.h>
35 #include <asm/smp.h>
36 #include <asm/string.h>
37 #include <asm/prom.h>
38 #include <asm/machdep.h>
39 #include <asm/xmon.h>
40 #include <asm/processor.h>
41 #include <asm/pgtable.h>
42 #include <asm/mmu.h>
43 #include <asm/mmu_context.h>
44 #include <asm/plpar_wrappers.h>
45 #include <asm/cputable.h>
46 #include <asm/rtas.h>
47 #include <asm/sstep.h>
48 #include <asm/irq_regs.h>
49 #include <asm/spu.h>
50 #include <asm/spu_priv1.h>
51 #include <asm/setjmp.h>
52 #include <asm/reg.h>
53 #include <asm/debug.h>
54 #include <asm/hw_breakpoint.h>
55 #include <asm/xive.h>
56 #include <asm/opal.h>
57 #include <asm/firmware.h>
58 #include <asm/code-patching.h>
59 
60 #ifdef CONFIG_PPC64
61 #include <asm/hvcall.h>
62 #include <asm/paca.h>
63 #endif
64 
65 #include "nonstdio.h"
66 #include "dis-asm.h"
67 
68 #ifdef CONFIG_SMP
69 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
70 static unsigned long xmon_taken = 1;
71 static int xmon_owner;
72 static int xmon_gate;
73 #else
74 #define xmon_owner 0
75 #endif /* CONFIG_SMP */
76 
77 static unsigned long in_xmon __read_mostly = 0;
78 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
79 
80 static unsigned long adrs;
81 static int size = 1;
82 #define MAX_DUMP (128 * 1024)
83 static unsigned long ndump = 64;
84 static unsigned long nidump = 16;
85 static unsigned long ncsum = 4096;
86 static int termch;
87 static char tmpstr[128];
88 static int tracing_enabled;
89 
90 static long bus_error_jmp[JMP_BUF_LEN];
91 static int catch_memory_errors;
92 static int catch_spr_faults;
93 static long *xmon_fault_jmp[NR_CPUS];
94 
95 /* Breakpoint stuff */
96 struct bpt {
97 	unsigned long	address;
98 	unsigned int	instr[2];
99 	atomic_t	ref_count;
100 	int		enabled;
101 	unsigned long	pad;
102 };
103 
104 /* Bits in bpt.enabled */
105 #define BP_CIABR	1
106 #define BP_TRAP		2
107 #define BP_DABR		4
108 
109 #define NBPTS	256
110 static struct bpt bpts[NBPTS];
111 static struct bpt dabr;
112 static struct bpt *iabr;
113 static unsigned bpinstr = 0x7fe00008;	/* trap */
114 
115 #define BP_NUM(bp)	((bp) - bpts + 1)
116 
117 /* Prototypes */
118 static int cmds(struct pt_regs *);
119 static int mread(unsigned long, void *, int);
120 static int mwrite(unsigned long, void *, int);
121 static int handle_fault(struct pt_regs *);
122 static void byterev(unsigned char *, int);
123 static void memex(void);
124 static int bsesc(void);
125 static void dump(void);
126 static void show_pte(unsigned long);
127 static void prdump(unsigned long, long);
128 static int ppc_inst_dump(unsigned long, long, int);
129 static void dump_log_buf(void);
130 
131 #ifdef CONFIG_PPC_POWERNV
132 static void dump_opal_msglog(void);
133 #else
134 static inline void dump_opal_msglog(void)
135 {
136 	printf("Machine is not running OPAL firmware.\n");
137 }
138 #endif
139 
140 static void backtrace(struct pt_regs *);
141 static void excprint(struct pt_regs *);
142 static void prregs(struct pt_regs *);
143 static void memops(int);
144 static void memlocate(void);
145 static void memzcan(void);
146 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
147 int skipbl(void);
148 int scanhex(unsigned long *valp);
149 static void scannl(void);
150 static int hexdigit(int);
151 void getstring(char *, int);
152 static void flush_input(void);
153 static int inchar(void);
154 static void take_input(char *);
155 static int  read_spr(int, unsigned long *);
156 static void write_spr(int, unsigned long);
157 static void super_regs(void);
158 static void remove_bpts(void);
159 static void insert_bpts(void);
160 static void remove_cpu_bpts(void);
161 static void insert_cpu_bpts(void);
162 static struct bpt *at_breakpoint(unsigned long pc);
163 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
164 static int  do_step(struct pt_regs *);
165 static void bpt_cmds(void);
166 static void cacheflush(void);
167 static int  cpu_cmd(void);
168 static void csum(void);
169 static void bootcmds(void);
170 static void proccall(void);
171 static void show_tasks(void);
172 void dump_segments(void);
173 static void symbol_lookup(void);
174 static void xmon_show_stack(unsigned long sp, unsigned long lr,
175 			    unsigned long pc);
176 static void xmon_print_symbol(unsigned long address, const char *mid,
177 			      const char *after);
178 static const char *getvecname(unsigned long vec);
179 
180 static int do_spu_cmd(void);
181 
182 #ifdef CONFIG_44x
183 static void dump_tlb_44x(void);
184 #endif
185 #ifdef CONFIG_PPC_BOOK3E
186 static void dump_tlb_book3e(void);
187 #endif
188 
189 #ifdef CONFIG_PPC64
190 #define REG		"%.16lx"
191 #else
192 #define REG		"%.8lx"
193 #endif
194 
195 #ifdef __LITTLE_ENDIAN__
196 #define GETWORD(v)	(((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
197 #else
198 #define GETWORD(v)	(((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
199 #endif
200 
201 static char *help_string = "\
202 Commands:\n\
203   b	show breakpoints\n\
204   bd	set data breakpoint\n\
205   bi	set instruction breakpoint\n\
206   bc	clear breakpoint\n"
207 #ifdef CONFIG_SMP
208   "\
209   c	print cpus stopped in xmon\n\
210   c#	try to switch to cpu number h (in hex)\n"
211 #endif
212   "\
213   C	checksum\n\
214   d	dump bytes\n\
215   d1	dump 1 byte values\n\
216   d2	dump 2 byte values\n\
217   d4	dump 4 byte values\n\
218   d8	dump 8 byte values\n\
219   di	dump instructions\n\
220   df	dump float values\n\
221   dd	dump double values\n\
222   dl    dump the kernel log buffer\n"
223 #ifdef CONFIG_PPC_POWERNV
224   "\
225   do    dump the OPAL message log\n"
226 #endif
227 #ifdef CONFIG_PPC64
228   "\
229   dp[#]	dump paca for current cpu, or cpu #\n\
230   dpa	dump paca for all possible cpus\n"
231 #endif
232   "\
233   dr	dump stream of raw bytes\n\
234   dv	dump virtual address translation \n\
235   dt	dump the tracing buffers (uses printk)\n\
236   dtc	dump the tracing buffers for current CPU (uses printk)\n\
237 "
238 #ifdef CONFIG_PPC_POWERNV
239 "  dx#   dump xive on CPU #\n\
240   dxi#  dump xive irq state #\n\
241   dxa   dump xive on all CPUs\n"
242 #endif
243 "  e	print exception information\n\
244   f	flush cache\n\
245   la	lookup symbol+offset of specified address\n\
246   ls	lookup address of specified symbol\n\
247   m	examine/change memory\n\
248   mm	move a block of memory\n\
249   ms	set a block of memory\n\
250   md	compare two blocks of memory\n\
251   ml	locate a block of memory\n\
252   mz	zero a block of memory\n\
253   mi	show information about memory allocation\n\
254   p 	call a procedure\n\
255   P 	list processes/tasks\n\
256   r	print registers\n\
257   s	single step\n"
258 #ifdef CONFIG_SPU_BASE
259 "  ss	stop execution on all spus\n\
260   sr	restore execution on stopped spus\n\
261   sf  #	dump spu fields for spu # (in hex)\n\
262   sd  #	dump spu local store for spu # (in hex)\n\
263   sdi #	disassemble spu local store for spu # (in hex)\n"
264 #endif
265 "  S	print special registers\n\
266   Sa    print all SPRs\n\
267   Sr #	read SPR #\n\
268   Sw #v write v to SPR #\n\
269   t	print backtrace\n\
270   x	exit monitor and recover\n\
271   X	exit monitor and don't recover\n"
272 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
273 "  u	dump segment table or SLB\n"
274 #elif defined(CONFIG_PPC_STD_MMU_32)
275 "  u	dump segment registers\n"
276 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
277 "  u	dump TLB\n"
278 #endif
279 "  U	show uptime information\n"
280 "  ?	help\n"
281 "  # n	limit output to n lines per page (for dp, dpa, dl)\n"
282 "  zr	reboot\n\
283   zh	halt\n"
284 ;
285 
286 static struct pt_regs *xmon_regs;
287 
288 static inline void sync(void)
289 {
290 	asm volatile("sync; isync");
291 }
292 
293 static inline void store_inst(void *p)
294 {
295 	asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
296 }
297 
298 static inline void cflush(void *p)
299 {
300 	asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
301 }
302 
303 static inline void cinval(void *p)
304 {
305 	asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
306 }
307 
308 /**
309  * write_ciabr() - write the CIABR SPR
310  * @ciabr:	The value to write.
311  *
312  * This function writes a value to the CIARB register either directly
313  * through mtspr instruction if the kernel is in HV privilege mode or
314  * call a hypervisor function to achieve the same in case the kernel
315  * is in supervisor privilege mode.
316  */
317 static void write_ciabr(unsigned long ciabr)
318 {
319 	if (!cpu_has_feature(CPU_FTR_ARCH_207S))
320 		return;
321 
322 	if (cpu_has_feature(CPU_FTR_HVMODE)) {
323 		mtspr(SPRN_CIABR, ciabr);
324 		return;
325 	}
326 	plpar_set_ciabr(ciabr);
327 }
328 
329 /**
330  * set_ciabr() - set the CIABR
331  * @addr:	The value to set.
332  *
333  * This function sets the correct privilege value into the the HW
334  * breakpoint address before writing it up in the CIABR register.
335  */
336 static void set_ciabr(unsigned long addr)
337 {
338 	addr &= ~CIABR_PRIV;
339 
340 	if (cpu_has_feature(CPU_FTR_HVMODE))
341 		addr |= CIABR_PRIV_HYPER;
342 	else
343 		addr |= CIABR_PRIV_SUPER;
344 	write_ciabr(addr);
345 }
346 
347 /*
348  * Disable surveillance (the service processor watchdog function)
349  * while we are in xmon.
350  * XXX we should re-enable it when we leave. :)
351  */
352 #define SURVEILLANCE_TOKEN	9000
353 
354 static inline void disable_surveillance(void)
355 {
356 #ifdef CONFIG_PPC_PSERIES
357 	/* Since this can't be a module, args should end up below 4GB. */
358 	static struct rtas_args args;
359 	int token;
360 
361 	/*
362 	 * At this point we have got all the cpus we can into
363 	 * xmon, so there is hopefully no other cpu calling RTAS
364 	 * at the moment, even though we don't take rtas.lock.
365 	 * If we did try to take rtas.lock there would be a
366 	 * real possibility of deadlock.
367 	 */
368 	token = rtas_token("set-indicator");
369 	if (token == RTAS_UNKNOWN_SERVICE)
370 		return;
371 
372 	rtas_call_unlocked(&args, token, 3, 1, NULL, SURVEILLANCE_TOKEN, 0, 0);
373 
374 #endif /* CONFIG_PPC_PSERIES */
375 }
376 
377 #ifdef CONFIG_SMP
378 static int xmon_speaker;
379 
380 static void get_output_lock(void)
381 {
382 	int me = smp_processor_id() + 0x100;
383 	int last_speaker = 0, prev;
384 	long timeout;
385 
386 	if (xmon_speaker == me)
387 		return;
388 
389 	for (;;) {
390 		last_speaker = cmpxchg(&xmon_speaker, 0, me);
391 		if (last_speaker == 0)
392 			return;
393 
394 		/*
395 		 * Wait a full second for the lock, we might be on a slow
396 		 * console, but check every 100us.
397 		 */
398 		timeout = 10000;
399 		while (xmon_speaker == last_speaker) {
400 			if (--timeout > 0) {
401 				udelay(100);
402 				continue;
403 			}
404 
405 			/* hostile takeover */
406 			prev = cmpxchg(&xmon_speaker, last_speaker, me);
407 			if (prev == last_speaker)
408 				return;
409 			break;
410 		}
411 	}
412 }
413 
414 static void release_output_lock(void)
415 {
416 	xmon_speaker = 0;
417 }
418 
419 int cpus_are_in_xmon(void)
420 {
421 	return !cpumask_empty(&cpus_in_xmon);
422 }
423 
424 static bool wait_for_other_cpus(int ncpus)
425 {
426 	unsigned long timeout;
427 
428 	/* We wait for 2s, which is a metric "little while" */
429 	for (timeout = 20000; timeout != 0; --timeout) {
430 		if (cpumask_weight(&cpus_in_xmon) >= ncpus)
431 			return true;
432 		udelay(100);
433 		barrier();
434 	}
435 
436 	return false;
437 }
438 #endif /* CONFIG_SMP */
439 
440 static inline int unrecoverable_excp(struct pt_regs *regs)
441 {
442 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
443 	/* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
444 	return 0;
445 #else
446 	return ((regs->msr & MSR_RI) == 0);
447 #endif
448 }
449 
450 static int xmon_core(struct pt_regs *regs, int fromipi)
451 {
452 	int cmd = 0;
453 	struct bpt *bp;
454 	long recurse_jmp[JMP_BUF_LEN];
455 	unsigned long offset;
456 	unsigned long flags;
457 #ifdef CONFIG_SMP
458 	int cpu;
459 	int secondary;
460 #endif
461 
462 	local_irq_save(flags);
463 	hard_irq_disable();
464 
465 	tracing_enabled = tracing_is_on();
466 	tracing_off();
467 
468 	bp = in_breakpoint_table(regs->nip, &offset);
469 	if (bp != NULL) {
470 		regs->nip = bp->address + offset;
471 		atomic_dec(&bp->ref_count);
472 	}
473 
474 	remove_cpu_bpts();
475 
476 #ifdef CONFIG_SMP
477 	cpu = smp_processor_id();
478 	if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
479 		/*
480 		 * We catch SPR read/write faults here because the 0x700, 0xf60
481 		 * etc. handlers don't call debugger_fault_handler().
482 		 */
483 		if (catch_spr_faults)
484 			longjmp(bus_error_jmp, 1);
485 		get_output_lock();
486 		excprint(regs);
487 		printf("cpu 0x%x: Exception %lx %s in xmon, "
488 		       "returning to main loop\n",
489 		       cpu, regs->trap, getvecname(TRAP(regs)));
490 		release_output_lock();
491 		longjmp(xmon_fault_jmp[cpu], 1);
492 	}
493 
494 	if (setjmp(recurse_jmp) != 0) {
495 		if (!in_xmon || !xmon_gate) {
496 			get_output_lock();
497 			printf("xmon: WARNING: bad recursive fault "
498 			       "on cpu 0x%x\n", cpu);
499 			release_output_lock();
500 			goto waiting;
501 		}
502 		secondary = !(xmon_taken && cpu == xmon_owner);
503 		goto cmdloop;
504 	}
505 
506 	xmon_fault_jmp[cpu] = recurse_jmp;
507 
508 	bp = NULL;
509 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
510 		bp = at_breakpoint(regs->nip);
511 	if (bp || unrecoverable_excp(regs))
512 		fromipi = 0;
513 
514 	if (!fromipi) {
515 		get_output_lock();
516 		excprint(regs);
517 		if (bp) {
518 			printf("cpu 0x%x stopped at breakpoint 0x%tx (",
519 			       cpu, BP_NUM(bp));
520 			xmon_print_symbol(regs->nip, " ", ")\n");
521 		}
522 		if (unrecoverable_excp(regs))
523 			printf("WARNING: exception is not recoverable, "
524 			       "can't continue\n");
525 		release_output_lock();
526 	}
527 
528 	cpumask_set_cpu(cpu, &cpus_in_xmon);
529 
530  waiting:
531 	secondary = 1;
532 	spin_begin();
533 	while (secondary && !xmon_gate) {
534 		if (in_xmon == 0) {
535 			if (fromipi) {
536 				spin_end();
537 				goto leave;
538 			}
539 			secondary = test_and_set_bit(0, &in_xmon);
540 		}
541 		spin_cpu_relax();
542 		touch_nmi_watchdog();
543 	}
544 	spin_end();
545 
546 	if (!secondary && !xmon_gate) {
547 		/* we are the first cpu to come in */
548 		/* interrupt other cpu(s) */
549 		int ncpus = num_online_cpus();
550 
551 		xmon_owner = cpu;
552 		mb();
553 		if (ncpus > 1) {
554 			/*
555 			 * A system reset (trap == 0x100) can be triggered on
556 			 * all CPUs, so when we come in via 0x100 try waiting
557 			 * for the other CPUs to come in before we send the
558 			 * debugger break (IPI). This is similar to
559 			 * crash_kexec_secondary().
560 			 */
561 			if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
562 				smp_send_debugger_break();
563 
564 			wait_for_other_cpus(ncpus);
565 		}
566 		remove_bpts();
567 		disable_surveillance();
568 		/* for breakpoint or single step, print the current instr. */
569 		if (bp || TRAP(regs) == 0xd00)
570 			ppc_inst_dump(regs->nip, 1, 0);
571 		printf("enter ? for help\n");
572 		mb();
573 		xmon_gate = 1;
574 		barrier();
575 		touch_nmi_watchdog();
576 	}
577 
578  cmdloop:
579 	while (in_xmon) {
580 		if (secondary) {
581 			spin_begin();
582 			if (cpu == xmon_owner) {
583 				if (!test_and_set_bit(0, &xmon_taken)) {
584 					secondary = 0;
585 					spin_end();
586 					continue;
587 				}
588 				/* missed it */
589 				while (cpu == xmon_owner)
590 					spin_cpu_relax();
591 			}
592 			spin_cpu_relax();
593 			touch_nmi_watchdog();
594 		} else {
595 			cmd = cmds(regs);
596 			if (cmd != 0) {
597 				/* exiting xmon */
598 				insert_bpts();
599 				xmon_gate = 0;
600 				wmb();
601 				in_xmon = 0;
602 				break;
603 			}
604 			/* have switched to some other cpu */
605 			secondary = 1;
606 		}
607 	}
608  leave:
609 	cpumask_clear_cpu(cpu, &cpus_in_xmon);
610 	xmon_fault_jmp[cpu] = NULL;
611 #else
612 	/* UP is simple... */
613 	if (in_xmon) {
614 		printf("Exception %lx %s in xmon, returning to main loop\n",
615 		       regs->trap, getvecname(TRAP(regs)));
616 		longjmp(xmon_fault_jmp[0], 1);
617 	}
618 	if (setjmp(recurse_jmp) == 0) {
619 		xmon_fault_jmp[0] = recurse_jmp;
620 		in_xmon = 1;
621 
622 		excprint(regs);
623 		bp = at_breakpoint(regs->nip);
624 		if (bp) {
625 			printf("Stopped at breakpoint %tx (", BP_NUM(bp));
626 			xmon_print_symbol(regs->nip, " ", ")\n");
627 		}
628 		if (unrecoverable_excp(regs))
629 			printf("WARNING: exception is not recoverable, "
630 			       "can't continue\n");
631 		remove_bpts();
632 		disable_surveillance();
633 		/* for breakpoint or single step, print the current instr. */
634 		if (bp || TRAP(regs) == 0xd00)
635 			ppc_inst_dump(regs->nip, 1, 0);
636 		printf("enter ? for help\n");
637 	}
638 
639 	cmd = cmds(regs);
640 
641 	insert_bpts();
642 	in_xmon = 0;
643 #endif
644 
645 #ifdef CONFIG_BOOKE
646 	if (regs->msr & MSR_DE) {
647 		bp = at_breakpoint(regs->nip);
648 		if (bp != NULL) {
649 			regs->nip = (unsigned long) &bp->instr[0];
650 			atomic_inc(&bp->ref_count);
651 		}
652 	}
653 #else
654 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
655 		bp = at_breakpoint(regs->nip);
656 		if (bp != NULL) {
657 			int stepped = emulate_step(regs, bp->instr[0]);
658 			if (stepped == 0) {
659 				regs->nip = (unsigned long) &bp->instr[0];
660 				atomic_inc(&bp->ref_count);
661 			} else if (stepped < 0) {
662 				printf("Couldn't single-step %s instruction\n",
663 				    (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
664 			}
665 		}
666 	}
667 #endif
668 	insert_cpu_bpts();
669 
670 	touch_nmi_watchdog();
671 	local_irq_restore(flags);
672 
673 	return cmd != 'X' && cmd != EOF;
674 }
675 
676 int xmon(struct pt_regs *excp)
677 {
678 	struct pt_regs regs;
679 
680 	if (excp == NULL) {
681 		ppc_save_regs(&regs);
682 		excp = &regs;
683 	}
684 
685 	return xmon_core(excp, 0);
686 }
687 EXPORT_SYMBOL(xmon);
688 
689 irqreturn_t xmon_irq(int irq, void *d)
690 {
691 	unsigned long flags;
692 	local_irq_save(flags);
693 	printf("Keyboard interrupt\n");
694 	xmon(get_irq_regs());
695 	local_irq_restore(flags);
696 	return IRQ_HANDLED;
697 }
698 
699 static int xmon_bpt(struct pt_regs *regs)
700 {
701 	struct bpt *bp;
702 	unsigned long offset;
703 
704 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
705 		return 0;
706 
707 	/* Are we at the trap at bp->instr[1] for some bp? */
708 	bp = in_breakpoint_table(regs->nip, &offset);
709 	if (bp != NULL && offset == 4) {
710 		regs->nip = bp->address + 4;
711 		atomic_dec(&bp->ref_count);
712 		return 1;
713 	}
714 
715 	/* Are we at a breakpoint? */
716 	bp = at_breakpoint(regs->nip);
717 	if (!bp)
718 		return 0;
719 
720 	xmon_core(regs, 0);
721 
722 	return 1;
723 }
724 
725 static int xmon_sstep(struct pt_regs *regs)
726 {
727 	if (user_mode(regs))
728 		return 0;
729 	xmon_core(regs, 0);
730 	return 1;
731 }
732 
733 static int xmon_break_match(struct pt_regs *regs)
734 {
735 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
736 		return 0;
737 	if (dabr.enabled == 0)
738 		return 0;
739 	xmon_core(regs, 0);
740 	return 1;
741 }
742 
743 static int xmon_iabr_match(struct pt_regs *regs)
744 {
745 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
746 		return 0;
747 	if (iabr == NULL)
748 		return 0;
749 	xmon_core(regs, 0);
750 	return 1;
751 }
752 
753 static int xmon_ipi(struct pt_regs *regs)
754 {
755 #ifdef CONFIG_SMP
756 	if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
757 		xmon_core(regs, 1);
758 #endif
759 	return 0;
760 }
761 
762 static int xmon_fault_handler(struct pt_regs *regs)
763 {
764 	struct bpt *bp;
765 	unsigned long offset;
766 
767 	if (in_xmon && catch_memory_errors)
768 		handle_fault(regs);	/* doesn't return */
769 
770 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
771 		bp = in_breakpoint_table(regs->nip, &offset);
772 		if (bp != NULL) {
773 			regs->nip = bp->address + offset;
774 			atomic_dec(&bp->ref_count);
775 		}
776 	}
777 
778 	return 0;
779 }
780 
781 /* Force enable xmon if not already enabled */
782 static inline void force_enable_xmon(void)
783 {
784 	/* Enable xmon hooks if needed */
785 	if (!xmon_on) {
786 		printf("xmon: Enabling debugger hooks\n");
787 		xmon_on = 1;
788 	}
789 }
790 
791 static struct bpt *at_breakpoint(unsigned long pc)
792 {
793 	int i;
794 	struct bpt *bp;
795 
796 	bp = bpts;
797 	for (i = 0; i < NBPTS; ++i, ++bp)
798 		if (bp->enabled && pc == bp->address)
799 			return bp;
800 	return NULL;
801 }
802 
803 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
804 {
805 	unsigned long off;
806 
807 	off = nip - (unsigned long) bpts;
808 	if (off >= sizeof(bpts))
809 		return NULL;
810 	off %= sizeof(struct bpt);
811 	if (off != offsetof(struct bpt, instr[0])
812 	    && off != offsetof(struct bpt, instr[1]))
813 		return NULL;
814 	*offp = off - offsetof(struct bpt, instr[0]);
815 	return (struct bpt *) (nip - off);
816 }
817 
818 static struct bpt *new_breakpoint(unsigned long a)
819 {
820 	struct bpt *bp;
821 
822 	a &= ~3UL;
823 	bp = at_breakpoint(a);
824 	if (bp)
825 		return bp;
826 
827 	for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
828 		if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
829 			bp->address = a;
830 			bp->instr[1] = bpinstr;
831 			store_inst(&bp->instr[1]);
832 			return bp;
833 		}
834 	}
835 
836 	printf("Sorry, no free breakpoints.  Please clear one first.\n");
837 	return NULL;
838 }
839 
840 static void insert_bpts(void)
841 {
842 	int i;
843 	struct bpt *bp;
844 
845 	bp = bpts;
846 	for (i = 0; i < NBPTS; ++i, ++bp) {
847 		if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
848 			continue;
849 		if (mread(bp->address, &bp->instr[0], 4) != 4) {
850 			printf("Couldn't read instruction at %lx, "
851 			       "disabling breakpoint there\n", bp->address);
852 			bp->enabled = 0;
853 			continue;
854 		}
855 		if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
856 			printf("Breakpoint at %lx is on an mtmsrd or rfid "
857 			       "instruction, disabling it\n", bp->address);
858 			bp->enabled = 0;
859 			continue;
860 		}
861 		store_inst(&bp->instr[0]);
862 		if (bp->enabled & BP_CIABR)
863 			continue;
864 		if (patch_instruction((unsigned int *)bp->address,
865 							bpinstr) != 0) {
866 			printf("Couldn't write instruction at %lx, "
867 			       "disabling breakpoint there\n", bp->address);
868 			bp->enabled &= ~BP_TRAP;
869 			continue;
870 		}
871 		store_inst((void *)bp->address);
872 	}
873 }
874 
875 static void insert_cpu_bpts(void)
876 {
877 	struct arch_hw_breakpoint brk;
878 
879 	if (dabr.enabled) {
880 		brk.address = dabr.address;
881 		brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
882 		brk.len = 8;
883 		__set_breakpoint(&brk);
884 	}
885 
886 	if (iabr)
887 		set_ciabr(iabr->address);
888 }
889 
890 static void remove_bpts(void)
891 {
892 	int i;
893 	struct bpt *bp;
894 	unsigned instr;
895 
896 	bp = bpts;
897 	for (i = 0; i < NBPTS; ++i, ++bp) {
898 		if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
899 			continue;
900 		if (mread(bp->address, &instr, 4) == 4
901 		    && instr == bpinstr
902 		    && patch_instruction(
903 			(unsigned int *)bp->address, bp->instr[0]) != 0)
904 			printf("Couldn't remove breakpoint at %lx\n",
905 			       bp->address);
906 		else
907 			store_inst((void *)bp->address);
908 	}
909 }
910 
911 static void remove_cpu_bpts(void)
912 {
913 	hw_breakpoint_disable();
914 	write_ciabr(0);
915 }
916 
917 /* Based on uptime_proc_show(). */
918 static void
919 show_uptime(void)
920 {
921 	struct timespec uptime;
922 
923 	if (setjmp(bus_error_jmp) == 0) {
924 		catch_memory_errors = 1;
925 		sync();
926 
927 		get_monotonic_boottime(&uptime);
928 		printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
929 			((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
930 
931 		sync();
932 		__delay(200);						\
933 	}
934 	catch_memory_errors = 0;
935 }
936 
937 static void set_lpp_cmd(void)
938 {
939 	unsigned long lpp;
940 
941 	if (!scanhex(&lpp)) {
942 		printf("Invalid number.\n");
943 		lpp = 0;
944 	}
945 	xmon_set_pagination_lpp(lpp);
946 }
947 /* Command interpreting routine */
948 static char *last_cmd;
949 
950 static int
951 cmds(struct pt_regs *excp)
952 {
953 	int cmd = 0;
954 
955 	last_cmd = NULL;
956 	xmon_regs = excp;
957 
958 	xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
959 
960 	for(;;) {
961 #ifdef CONFIG_SMP
962 		printf("%x:", smp_processor_id());
963 #endif /* CONFIG_SMP */
964 		printf("mon> ");
965 		flush_input();
966 		termch = 0;
967 		cmd = skipbl();
968 		if( cmd == '\n' ) {
969 			if (last_cmd == NULL)
970 				continue;
971 			take_input(last_cmd);
972 			last_cmd = NULL;
973 			cmd = inchar();
974 		}
975 		switch (cmd) {
976 		case 'm':
977 			cmd = inchar();
978 			switch (cmd) {
979 			case 'm':
980 			case 's':
981 			case 'd':
982 				memops(cmd);
983 				break;
984 			case 'l':
985 				memlocate();
986 				break;
987 			case 'z':
988 				memzcan();
989 				break;
990 			case 'i':
991 				show_mem(0, NULL);
992 				break;
993 			default:
994 				termch = cmd;
995 				memex();
996 			}
997 			break;
998 		case 'd':
999 			dump();
1000 			break;
1001 		case 'l':
1002 			symbol_lookup();
1003 			break;
1004 		case 'r':
1005 			prregs(excp);	/* print regs */
1006 			break;
1007 		case 'e':
1008 			excprint(excp);
1009 			break;
1010 		case 'S':
1011 			super_regs();
1012 			break;
1013 		case 't':
1014 			backtrace(excp);
1015 			break;
1016 		case 'f':
1017 			cacheflush();
1018 			break;
1019 		case 's':
1020 			if (do_spu_cmd() == 0)
1021 				break;
1022 			if (do_step(excp))
1023 				return cmd;
1024 			break;
1025 		case 'x':
1026 		case 'X':
1027 			if (tracing_enabled)
1028 				tracing_on();
1029 			return cmd;
1030 		case EOF:
1031 			printf(" <no input ...>\n");
1032 			mdelay(2000);
1033 			return cmd;
1034 		case '?':
1035 			xmon_puts(help_string);
1036 			break;
1037 		case '#':
1038 			set_lpp_cmd();
1039 			break;
1040 		case 'b':
1041 			bpt_cmds();
1042 			break;
1043 		case 'C':
1044 			csum();
1045 			break;
1046 		case 'c':
1047 			if (cpu_cmd())
1048 				return 0;
1049 			break;
1050 		case 'z':
1051 			bootcmds();
1052 			break;
1053 		case 'p':
1054 			proccall();
1055 			break;
1056 		case 'P':
1057 			show_tasks();
1058 			break;
1059 #ifdef CONFIG_PPC_STD_MMU
1060 		case 'u':
1061 			dump_segments();
1062 			break;
1063 #elif defined(CONFIG_44x)
1064 		case 'u':
1065 			dump_tlb_44x();
1066 			break;
1067 #elif defined(CONFIG_PPC_BOOK3E)
1068 		case 'u':
1069 			dump_tlb_book3e();
1070 			break;
1071 #endif
1072 		case 'U':
1073 			show_uptime();
1074 			break;
1075 		default:
1076 			printf("Unrecognized command: ");
1077 			do {
1078 				if (' ' < cmd && cmd <= '~')
1079 					putchar(cmd);
1080 				else
1081 					printf("\\x%x", cmd);
1082 				cmd = inchar();
1083 			} while (cmd != '\n');
1084 			printf(" (type ? for help)\n");
1085 			break;
1086 		}
1087 	}
1088 }
1089 
1090 #ifdef CONFIG_BOOKE
1091 static int do_step(struct pt_regs *regs)
1092 {
1093 	regs->msr |= MSR_DE;
1094 	mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1095 	return 1;
1096 }
1097 #else
1098 /*
1099  * Step a single instruction.
1100  * Some instructions we emulate, others we execute with MSR_SE set.
1101  */
1102 static int do_step(struct pt_regs *regs)
1103 {
1104 	unsigned int instr;
1105 	int stepped;
1106 
1107 	force_enable_xmon();
1108 	/* check we are in 64-bit kernel mode, translation enabled */
1109 	if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1110 		if (mread(regs->nip, &instr, 4) == 4) {
1111 			stepped = emulate_step(regs, instr);
1112 			if (stepped < 0) {
1113 				printf("Couldn't single-step %s instruction\n",
1114 				       (IS_RFID(instr)? "rfid": "mtmsrd"));
1115 				return 0;
1116 			}
1117 			if (stepped > 0) {
1118 				regs->trap = 0xd00 | (regs->trap & 1);
1119 				printf("stepped to ");
1120 				xmon_print_symbol(regs->nip, " ", "\n");
1121 				ppc_inst_dump(regs->nip, 1, 0);
1122 				return 0;
1123 			}
1124 		}
1125 	}
1126 	regs->msr |= MSR_SE;
1127 	return 1;
1128 }
1129 #endif
1130 
1131 static void bootcmds(void)
1132 {
1133 	int cmd;
1134 
1135 	cmd = inchar();
1136 	if (cmd == 'r')
1137 		ppc_md.restart(NULL);
1138 	else if (cmd == 'h')
1139 		ppc_md.halt();
1140 	else if (cmd == 'p')
1141 		if (pm_power_off)
1142 			pm_power_off();
1143 }
1144 
1145 static int cpu_cmd(void)
1146 {
1147 #ifdef CONFIG_SMP
1148 	unsigned long cpu, first_cpu, last_cpu;
1149 	int timeout;
1150 
1151 	if (!scanhex(&cpu)) {
1152 		/* print cpus waiting or in xmon */
1153 		printf("cpus stopped:");
1154 		last_cpu = first_cpu = NR_CPUS;
1155 		for_each_possible_cpu(cpu) {
1156 			if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1157 				if (cpu == last_cpu + 1) {
1158 					last_cpu = cpu;
1159 				} else {
1160 					if (last_cpu != first_cpu)
1161 						printf("-0x%lx", last_cpu);
1162 					last_cpu = first_cpu = cpu;
1163 					printf(" 0x%lx", cpu);
1164 				}
1165 			}
1166 		}
1167 		if (last_cpu != first_cpu)
1168 			printf("-0x%lx", last_cpu);
1169 		printf("\n");
1170 		return 0;
1171 	}
1172 	/* try to switch to cpu specified */
1173 	if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1174 		printf("cpu 0x%lx isn't in xmon\n", cpu);
1175 #ifdef CONFIG_PPC64
1176 		printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1177 		xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1178 #endif
1179 		return 0;
1180 	}
1181 	xmon_taken = 0;
1182 	mb();
1183 	xmon_owner = cpu;
1184 	timeout = 10000000;
1185 	while (!xmon_taken) {
1186 		if (--timeout == 0) {
1187 			if (test_and_set_bit(0, &xmon_taken))
1188 				break;
1189 			/* take control back */
1190 			mb();
1191 			xmon_owner = smp_processor_id();
1192 			printf("cpu 0x%lx didn't take control\n", cpu);
1193 			return 0;
1194 		}
1195 		barrier();
1196 	}
1197 	return 1;
1198 #else
1199 	return 0;
1200 #endif /* CONFIG_SMP */
1201 }
1202 
1203 static unsigned short fcstab[256] = {
1204 	0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1205 	0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1206 	0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1207 	0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1208 	0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1209 	0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1210 	0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1211 	0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1212 	0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1213 	0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1214 	0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1215 	0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1216 	0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1217 	0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1218 	0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1219 	0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1220 	0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1221 	0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1222 	0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1223 	0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1224 	0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1225 	0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1226 	0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1227 	0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1228 	0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1229 	0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1230 	0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1231 	0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1232 	0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1233 	0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1234 	0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1235 	0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1236 };
1237 
1238 #define FCS(fcs, c)	(((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1239 
1240 static void
1241 csum(void)
1242 {
1243 	unsigned int i;
1244 	unsigned short fcs;
1245 	unsigned char v;
1246 
1247 	if (!scanhex(&adrs))
1248 		return;
1249 	if (!scanhex(&ncsum))
1250 		return;
1251 	fcs = 0xffff;
1252 	for (i = 0; i < ncsum; ++i) {
1253 		if (mread(adrs+i, &v, 1) == 0) {
1254 			printf("csum stopped at "REG"\n", adrs+i);
1255 			break;
1256 		}
1257 		fcs = FCS(fcs, v);
1258 	}
1259 	printf("%x\n", fcs);
1260 }
1261 
1262 /*
1263  * Check if this is a suitable place to put a breakpoint.
1264  */
1265 static long check_bp_loc(unsigned long addr)
1266 {
1267 	unsigned int instr;
1268 
1269 	addr &= ~3;
1270 	if (!is_kernel_addr(addr)) {
1271 		printf("Breakpoints may only be placed at kernel addresses\n");
1272 		return 0;
1273 	}
1274 	if (!mread(addr, &instr, sizeof(instr))) {
1275 		printf("Can't read instruction at address %lx\n", addr);
1276 		return 0;
1277 	}
1278 	if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1279 		printf("Breakpoints may not be placed on mtmsrd or rfid "
1280 		       "instructions\n");
1281 		return 0;
1282 	}
1283 	return 1;
1284 }
1285 
1286 static char *breakpoint_help_string =
1287     "Breakpoint command usage:\n"
1288     "b                show breakpoints\n"
1289     "b <addr> [cnt]   set breakpoint at given instr addr\n"
1290     "bc               clear all breakpoints\n"
1291     "bc <n/addr>      clear breakpoint number n or at addr\n"
1292     "bi <addr> [cnt]  set hardware instr breakpoint (POWER8 only)\n"
1293     "bd <addr> [cnt]  set hardware data breakpoint\n"
1294     "";
1295 
1296 static void
1297 bpt_cmds(void)
1298 {
1299 	int cmd;
1300 	unsigned long a;
1301 	int i;
1302 	struct bpt *bp;
1303 
1304 	cmd = inchar();
1305 	switch (cmd) {
1306 #ifndef CONFIG_PPC_8xx
1307 	static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1308 	int mode;
1309 	case 'd':	/* bd - hardware data breakpoint */
1310 		if (!ppc_breakpoint_available()) {
1311 			printf("Hardware data breakpoint not supported on this cpu\n");
1312 			break;
1313 		}
1314 		mode = 7;
1315 		cmd = inchar();
1316 		if (cmd == 'r')
1317 			mode = 5;
1318 		else if (cmd == 'w')
1319 			mode = 6;
1320 		else
1321 			termch = cmd;
1322 		dabr.address = 0;
1323 		dabr.enabled = 0;
1324 		if (scanhex(&dabr.address)) {
1325 			if (!is_kernel_addr(dabr.address)) {
1326 				printf(badaddr);
1327 				break;
1328 			}
1329 			dabr.address &= ~HW_BRK_TYPE_DABR;
1330 			dabr.enabled = mode | BP_DABR;
1331 		}
1332 
1333 		force_enable_xmon();
1334 		break;
1335 
1336 	case 'i':	/* bi - hardware instr breakpoint */
1337 		if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1338 			printf("Hardware instruction breakpoint "
1339 			       "not supported on this cpu\n");
1340 			break;
1341 		}
1342 		if (iabr) {
1343 			iabr->enabled &= ~BP_CIABR;
1344 			iabr = NULL;
1345 		}
1346 		if (!scanhex(&a))
1347 			break;
1348 		if (!check_bp_loc(a))
1349 			break;
1350 		bp = new_breakpoint(a);
1351 		if (bp != NULL) {
1352 			bp->enabled |= BP_CIABR;
1353 			iabr = bp;
1354 			force_enable_xmon();
1355 		}
1356 		break;
1357 #endif
1358 
1359 	case 'c':
1360 		if (!scanhex(&a)) {
1361 			/* clear all breakpoints */
1362 			for (i = 0; i < NBPTS; ++i)
1363 				bpts[i].enabled = 0;
1364 			iabr = NULL;
1365 			dabr.enabled = 0;
1366 			printf("All breakpoints cleared\n");
1367 			break;
1368 		}
1369 
1370 		if (a <= NBPTS && a >= 1) {
1371 			/* assume a breakpoint number */
1372 			bp = &bpts[a-1];	/* bp nums are 1 based */
1373 		} else {
1374 			/* assume a breakpoint address */
1375 			bp = at_breakpoint(a);
1376 			if (bp == NULL) {
1377 				printf("No breakpoint at %lx\n", a);
1378 				break;
1379 			}
1380 		}
1381 
1382 		printf("Cleared breakpoint %tx (", BP_NUM(bp));
1383 		xmon_print_symbol(bp->address, " ", ")\n");
1384 		bp->enabled = 0;
1385 		break;
1386 
1387 	default:
1388 		termch = cmd;
1389 		cmd = skipbl();
1390 		if (cmd == '?') {
1391 			printf(breakpoint_help_string);
1392 			break;
1393 		}
1394 		termch = cmd;
1395 		if (!scanhex(&a)) {
1396 			/* print all breakpoints */
1397 			printf("   type            address\n");
1398 			if (dabr.enabled) {
1399 				printf("   data   "REG"  [", dabr.address);
1400 				if (dabr.enabled & 1)
1401 					printf("r");
1402 				if (dabr.enabled & 2)
1403 					printf("w");
1404 				printf("]\n");
1405 			}
1406 			for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1407 				if (!bp->enabled)
1408 					continue;
1409 				printf("%tx %s   ", BP_NUM(bp),
1410 				    (bp->enabled & BP_CIABR) ? "inst": "trap");
1411 				xmon_print_symbol(bp->address, "  ", "\n");
1412 			}
1413 			break;
1414 		}
1415 
1416 		if (!check_bp_loc(a))
1417 			break;
1418 		bp = new_breakpoint(a);
1419 		if (bp != NULL) {
1420 			bp->enabled |= BP_TRAP;
1421 			force_enable_xmon();
1422 		}
1423 		break;
1424 	}
1425 }
1426 
1427 /* Very cheap human name for vector lookup. */
1428 static
1429 const char *getvecname(unsigned long vec)
1430 {
1431 	char *ret;
1432 
1433 	switch (vec) {
1434 	case 0x100:	ret = "(System Reset)"; break;
1435 	case 0x200:	ret = "(Machine Check)"; break;
1436 	case 0x300:	ret = "(Data Access)"; break;
1437 	case 0x380:
1438 		if (radix_enabled())
1439 			ret = "(Data Access Out of Range)";
1440 		else
1441 			ret = "(Data SLB Access)";
1442 		break;
1443 	case 0x400:	ret = "(Instruction Access)"; break;
1444 	case 0x480:
1445 		if (radix_enabled())
1446 			ret = "(Instruction Access Out of Range)";
1447 		else
1448 			ret = "(Instruction SLB Access)";
1449 		break;
1450 	case 0x500:	ret = "(Hardware Interrupt)"; break;
1451 	case 0x600:	ret = "(Alignment)"; break;
1452 	case 0x700:	ret = "(Program Check)"; break;
1453 	case 0x800:	ret = "(FPU Unavailable)"; break;
1454 	case 0x900:	ret = "(Decrementer)"; break;
1455 	case 0x980:	ret = "(Hypervisor Decrementer)"; break;
1456 	case 0xa00:	ret = "(Doorbell)"; break;
1457 	case 0xc00:	ret = "(System Call)"; break;
1458 	case 0xd00:	ret = "(Single Step)"; break;
1459 	case 0xe40:	ret = "(Emulation Assist)"; break;
1460 	case 0xe60:	ret = "(HMI)"; break;
1461 	case 0xe80:	ret = "(Hypervisor Doorbell)"; break;
1462 	case 0xf00:	ret = "(Performance Monitor)"; break;
1463 	case 0xf20:	ret = "(Altivec Unavailable)"; break;
1464 	case 0x1300:	ret = "(Instruction Breakpoint)"; break;
1465 	case 0x1500:	ret = "(Denormalisation)"; break;
1466 	case 0x1700:	ret = "(Altivec Assist)"; break;
1467 	default: ret = "";
1468 	}
1469 	return ret;
1470 }
1471 
1472 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1473 				unsigned long *endp)
1474 {
1475 	unsigned long size, offset;
1476 	const char *name;
1477 
1478 	*startp = *endp = 0;
1479 	if (pc == 0)
1480 		return;
1481 	if (setjmp(bus_error_jmp) == 0) {
1482 		catch_memory_errors = 1;
1483 		sync();
1484 		name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1485 		if (name != NULL) {
1486 			*startp = pc - offset;
1487 			*endp = pc - offset + size;
1488 		}
1489 		sync();
1490 	}
1491 	catch_memory_errors = 0;
1492 }
1493 
1494 #define LRSAVE_OFFSET		(STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1495 #define MARKER_OFFSET		(STACK_FRAME_MARKER * sizeof(unsigned long))
1496 
1497 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1498 			    unsigned long pc)
1499 {
1500 	int max_to_print = 64;
1501 	unsigned long ip;
1502 	unsigned long newsp;
1503 	unsigned long marker;
1504 	struct pt_regs regs;
1505 
1506 	while (max_to_print--) {
1507 		if (!is_kernel_addr(sp)) {
1508 			if (sp != 0)
1509 				printf("SP (%lx) is in userspace\n", sp);
1510 			break;
1511 		}
1512 
1513 		if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1514 		    || !mread(sp, &newsp, sizeof(unsigned long))) {
1515 			printf("Couldn't read stack frame at %lx\n", sp);
1516 			break;
1517 		}
1518 
1519 		/*
1520 		 * For the first stack frame, try to work out if
1521 		 * LR and/or the saved LR value in the bottommost
1522 		 * stack frame are valid.
1523 		 */
1524 		if ((pc | lr) != 0) {
1525 			unsigned long fnstart, fnend;
1526 			unsigned long nextip;
1527 			int printip = 1;
1528 
1529 			get_function_bounds(pc, &fnstart, &fnend);
1530 			nextip = 0;
1531 			if (newsp > sp)
1532 				mread(newsp + LRSAVE_OFFSET, &nextip,
1533 				      sizeof(unsigned long));
1534 			if (lr == ip) {
1535 				if (!is_kernel_addr(lr)
1536 				    || (fnstart <= lr && lr < fnend))
1537 					printip = 0;
1538 			} else if (lr == nextip) {
1539 				printip = 0;
1540 			} else if (is_kernel_addr(lr)
1541 				   && !(fnstart <= lr && lr < fnend)) {
1542 				printf("[link register   ] ");
1543 				xmon_print_symbol(lr, " ", "\n");
1544 			}
1545 			if (printip) {
1546 				printf("["REG"] ", sp);
1547 				xmon_print_symbol(ip, " ", " (unreliable)\n");
1548 			}
1549 			pc = lr = 0;
1550 
1551 		} else {
1552 			printf("["REG"] ", sp);
1553 			xmon_print_symbol(ip, " ", "\n");
1554 		}
1555 
1556 		/* Look for "regshere" marker to see if this is
1557 		   an exception frame. */
1558 		if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1559 		    && marker == STACK_FRAME_REGS_MARKER) {
1560 			if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1561 			    != sizeof(regs)) {
1562 				printf("Couldn't read registers at %lx\n",
1563 				       sp + STACK_FRAME_OVERHEAD);
1564 				break;
1565 			}
1566 			printf("--- Exception: %lx %s at ", regs.trap,
1567 			       getvecname(TRAP(&regs)));
1568 			pc = regs.nip;
1569 			lr = regs.link;
1570 			xmon_print_symbol(pc, " ", "\n");
1571 		}
1572 
1573 		if (newsp == 0)
1574 			break;
1575 
1576 		sp = newsp;
1577 	}
1578 }
1579 
1580 static void backtrace(struct pt_regs *excp)
1581 {
1582 	unsigned long sp;
1583 
1584 	if (scanhex(&sp))
1585 		xmon_show_stack(sp, 0, 0);
1586 	else
1587 		xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1588 	scannl();
1589 }
1590 
1591 static void print_bug_trap(struct pt_regs *regs)
1592 {
1593 #ifdef CONFIG_BUG
1594 	const struct bug_entry *bug;
1595 	unsigned long addr;
1596 
1597 	if (regs->msr & MSR_PR)
1598 		return;		/* not in kernel */
1599 	addr = regs->nip;	/* address of trap instruction */
1600 	if (!is_kernel_addr(addr))
1601 		return;
1602 	bug = find_bug(regs->nip);
1603 	if (bug == NULL)
1604 		return;
1605 	if (is_warning_bug(bug))
1606 		return;
1607 
1608 #ifdef CONFIG_DEBUG_BUGVERBOSE
1609 	printf("kernel BUG at %s:%u!\n",
1610 	       bug->file, bug->line);
1611 #else
1612 	printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1613 #endif
1614 #endif /* CONFIG_BUG */
1615 }
1616 
1617 static void excprint(struct pt_regs *fp)
1618 {
1619 	unsigned long trap;
1620 
1621 #ifdef CONFIG_SMP
1622 	printf("cpu 0x%x: ", smp_processor_id());
1623 #endif /* CONFIG_SMP */
1624 
1625 	trap = TRAP(fp);
1626 	printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1627 	printf("    pc: ");
1628 	xmon_print_symbol(fp->nip, ": ", "\n");
1629 
1630 	printf("    lr: ");
1631 	xmon_print_symbol(fp->link, ": ", "\n");
1632 
1633 	printf("    sp: %lx\n", fp->gpr[1]);
1634 	printf("   msr: %lx\n", fp->msr);
1635 
1636 	if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1637 		printf("   dar: %lx\n", fp->dar);
1638 		if (trap != 0x380)
1639 			printf(" dsisr: %lx\n", fp->dsisr);
1640 	}
1641 
1642 	printf("  current = 0x%px\n", current);
1643 #ifdef CONFIG_PPC64
1644 	printf("  paca    = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1645 	       local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1646 #endif
1647 	if (current) {
1648 		printf("    pid   = %d, comm = %s\n",
1649 		       current->pid, current->comm);
1650 	}
1651 
1652 	if (trap == 0x700)
1653 		print_bug_trap(fp);
1654 
1655 	printf(linux_banner);
1656 }
1657 
1658 static void prregs(struct pt_regs *fp)
1659 {
1660 	int n, trap;
1661 	unsigned long base;
1662 	struct pt_regs regs;
1663 
1664 	if (scanhex(&base)) {
1665 		if (setjmp(bus_error_jmp) == 0) {
1666 			catch_memory_errors = 1;
1667 			sync();
1668 			regs = *(struct pt_regs *)base;
1669 			sync();
1670 			__delay(200);
1671 		} else {
1672 			catch_memory_errors = 0;
1673 			printf("*** Error reading registers from "REG"\n",
1674 			       base);
1675 			return;
1676 		}
1677 		catch_memory_errors = 0;
1678 		fp = &regs;
1679 	}
1680 
1681 #ifdef CONFIG_PPC64
1682 	if (FULL_REGS(fp)) {
1683 		for (n = 0; n < 16; ++n)
1684 			printf("R%.2d = "REG"   R%.2d = "REG"\n",
1685 			       n, fp->gpr[n], n+16, fp->gpr[n+16]);
1686 	} else {
1687 		for (n = 0; n < 7; ++n)
1688 			printf("R%.2d = "REG"   R%.2d = "REG"\n",
1689 			       n, fp->gpr[n], n+7, fp->gpr[n+7]);
1690 	}
1691 #else
1692 	for (n = 0; n < 32; ++n) {
1693 		printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1694 		       (n & 3) == 3? "\n": "   ");
1695 		if (n == 12 && !FULL_REGS(fp)) {
1696 			printf("\n");
1697 			break;
1698 		}
1699 	}
1700 #endif
1701 	printf("pc  = ");
1702 	xmon_print_symbol(fp->nip, " ", "\n");
1703 	if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1704 		printf("cfar= ");
1705 		xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1706 	}
1707 	printf("lr  = ");
1708 	xmon_print_symbol(fp->link, " ", "\n");
1709 	printf("msr = "REG"   cr  = %.8lx\n", fp->msr, fp->ccr);
1710 	printf("ctr = "REG"   xer = "REG"   trap = %4lx\n",
1711 	       fp->ctr, fp->xer, fp->trap);
1712 	trap = TRAP(fp);
1713 	if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1714 		printf("dar = "REG"   dsisr = %.8lx\n", fp->dar, fp->dsisr);
1715 }
1716 
1717 static void cacheflush(void)
1718 {
1719 	int cmd;
1720 	unsigned long nflush;
1721 
1722 	cmd = inchar();
1723 	if (cmd != 'i')
1724 		termch = cmd;
1725 	scanhex((void *)&adrs);
1726 	if (termch != '\n')
1727 		termch = 0;
1728 	nflush = 1;
1729 	scanhex(&nflush);
1730 	nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1731 	if (setjmp(bus_error_jmp) == 0) {
1732 		catch_memory_errors = 1;
1733 		sync();
1734 
1735 		if (cmd != 'i') {
1736 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1737 				cflush((void *) adrs);
1738 		} else {
1739 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1740 				cinval((void *) adrs);
1741 		}
1742 		sync();
1743 		/* wait a little while to see if we get a machine check */
1744 		__delay(200);
1745 	}
1746 	catch_memory_errors = 0;
1747 }
1748 
1749 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1750 extern void xmon_mtspr(int spr, unsigned long value);
1751 
1752 static int
1753 read_spr(int n, unsigned long *vp)
1754 {
1755 	unsigned long ret = -1UL;
1756 	int ok = 0;
1757 
1758 	if (setjmp(bus_error_jmp) == 0) {
1759 		catch_spr_faults = 1;
1760 		sync();
1761 
1762 		ret = xmon_mfspr(n, *vp);
1763 
1764 		sync();
1765 		*vp = ret;
1766 		ok = 1;
1767 	}
1768 	catch_spr_faults = 0;
1769 
1770 	return ok;
1771 }
1772 
1773 static void
1774 write_spr(int n, unsigned long val)
1775 {
1776 	if (setjmp(bus_error_jmp) == 0) {
1777 		catch_spr_faults = 1;
1778 		sync();
1779 
1780 		xmon_mtspr(n, val);
1781 
1782 		sync();
1783 	} else {
1784 		printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1785 	}
1786 	catch_spr_faults = 0;
1787 }
1788 
1789 static void dump_206_sprs(void)
1790 {
1791 #ifdef CONFIG_PPC64
1792 	if (!cpu_has_feature(CPU_FTR_ARCH_206))
1793 		return;
1794 
1795 	/* Actually some of these pre-date 2.06, but whatevs */
1796 
1797 	printf("srr0   = %.16lx  srr1  = %.16lx dsisr  = %.8lx\n",
1798 		mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1799 	printf("dscr   = %.16lx  ppr   = %.16lx pir    = %.8lx\n",
1800 		mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1801 	printf("amr    = %.16lx  uamor = %.16lx\n",
1802 		mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1803 
1804 	if (!(mfmsr() & MSR_HV))
1805 		return;
1806 
1807 	printf("sdr1   = %.16lx  hdar  = %.16lx hdsisr = %.8lx\n",
1808 		mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1809 	printf("hsrr0  = %.16lx hsrr1  = %.16lx hdec   = %.16lx\n",
1810 		mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1811 	printf("lpcr   = %.16lx  pcr   = %.16lx lpidr  = %.8lx\n",
1812 		mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1813 	printf("hsprg0 = %.16lx hsprg1 = %.16lx amor   = %.16lx\n",
1814 		mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1815 	printf("dabr   = %.16lx dabrx  = %.16lx\n",
1816 		mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1817 #endif
1818 }
1819 
1820 static void dump_207_sprs(void)
1821 {
1822 #ifdef CONFIG_PPC64
1823 	unsigned long msr;
1824 
1825 	if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1826 		return;
1827 
1828 	printf("dpdes  = %.16lx  tir   = %.16lx cir    = %.8lx\n",
1829 		mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1830 
1831 	printf("fscr   = %.16lx  tar   = %.16lx pspb   = %.8lx\n",
1832 		mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1833 
1834 	msr = mfmsr();
1835 	if (msr & MSR_TM) {
1836 		/* Only if TM has been enabled in the kernel */
1837 		printf("tfhar  = %.16lx  tfiar = %.16lx texasr = %.16lx\n",
1838 			mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1839 			mfspr(SPRN_TEXASR));
1840 	}
1841 
1842 	printf("mmcr0  = %.16lx  mmcr1 = %.16lx mmcr2  = %.16lx\n",
1843 		mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1844 	printf("pmc1   = %.8lx pmc2 = %.8lx  pmc3 = %.8lx  pmc4   = %.8lx\n",
1845 		mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1846 		mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1847 	printf("mmcra  = %.16lx   siar = %.16lx pmc5   = %.8lx\n",
1848 		mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1849 	printf("sdar   = %.16lx   sier = %.16lx pmc6   = %.8lx\n",
1850 		mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1851 	printf("ebbhr  = %.16lx  ebbrr = %.16lx bescr  = %.16lx\n",
1852 		mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1853 	printf("iamr   = %.16lx\n", mfspr(SPRN_IAMR));
1854 
1855 	if (!(msr & MSR_HV))
1856 		return;
1857 
1858 	printf("hfscr  = %.16lx  dhdes = %.16lx rpr    = %.16lx\n",
1859 		mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1860 	printf("dawr   = %.16lx  dawrx = %.16lx ciabr  = %.16lx\n",
1861 		mfspr(SPRN_DAWR), mfspr(SPRN_DAWRX), mfspr(SPRN_CIABR));
1862 #endif
1863 }
1864 
1865 static void dump_300_sprs(void)
1866 {
1867 #ifdef CONFIG_PPC64
1868 	bool hv = mfmsr() & MSR_HV;
1869 
1870 	if (!cpu_has_feature(CPU_FTR_ARCH_300))
1871 		return;
1872 
1873 	printf("pidr   = %.16lx  tidr  = %.16lx\n",
1874 		mfspr(SPRN_PID), mfspr(SPRN_TIDR));
1875 	printf("asdr   = %.16lx  psscr = %.16lx\n",
1876 		mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR)
1877 					: mfspr(SPRN_PSSCR_PR));
1878 
1879 	if (!hv)
1880 		return;
1881 
1882 	printf("ptcr   = %.16lx\n",
1883 		mfspr(SPRN_PTCR));
1884 #endif
1885 }
1886 
1887 static void dump_one_spr(int spr, bool show_unimplemented)
1888 {
1889 	unsigned long val;
1890 
1891 	val = 0xdeadbeef;
1892 	if (!read_spr(spr, &val)) {
1893 		printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1894 		return;
1895 	}
1896 
1897 	if (val == 0xdeadbeef) {
1898 		/* Looks like read was a nop, confirm */
1899 		val = 0x0badcafe;
1900 		if (!read_spr(spr, &val)) {
1901 			printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1902 			return;
1903 		}
1904 
1905 		if (val == 0x0badcafe) {
1906 			if (show_unimplemented)
1907 				printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
1908 			return;
1909 		}
1910 	}
1911 
1912 	printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
1913 }
1914 
1915 static void super_regs(void)
1916 {
1917 	static unsigned long regno;
1918 	int cmd;
1919 	int spr;
1920 
1921 	cmd = skipbl();
1922 
1923 	switch (cmd) {
1924 	case '\n': {
1925 		unsigned long sp, toc;
1926 		asm("mr %0,1" : "=r" (sp) :);
1927 		asm("mr %0,2" : "=r" (toc) :);
1928 
1929 		printf("msr    = "REG"  sprg0 = "REG"\n",
1930 		       mfmsr(), mfspr(SPRN_SPRG0));
1931 		printf("pvr    = "REG"  sprg1 = "REG"\n",
1932 		       mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1933 		printf("dec    = "REG"  sprg2 = "REG"\n",
1934 		       mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1935 		printf("sp     = "REG"  sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
1936 		printf("toc    = "REG"  dar   = "REG"\n", toc, mfspr(SPRN_DAR));
1937 
1938 		dump_206_sprs();
1939 		dump_207_sprs();
1940 		dump_300_sprs();
1941 
1942 		return;
1943 	}
1944 	case 'w': {
1945 		unsigned long val;
1946 		scanhex(&regno);
1947 		val = 0;
1948 		read_spr(regno, &val);
1949 		scanhex(&val);
1950 		write_spr(regno, val);
1951 		dump_one_spr(regno, true);
1952 		break;
1953 	}
1954 	case 'r':
1955 		scanhex(&regno);
1956 		dump_one_spr(regno, true);
1957 		break;
1958 	case 'a':
1959 		/* dump ALL SPRs */
1960 		for (spr = 1; spr < 1024; ++spr)
1961 			dump_one_spr(spr, false);
1962 		break;
1963 	}
1964 
1965 	scannl();
1966 }
1967 
1968 /*
1969  * Stuff for reading and writing memory safely
1970  */
1971 static int
1972 mread(unsigned long adrs, void *buf, int size)
1973 {
1974 	volatile int n;
1975 	char *p, *q;
1976 
1977 	n = 0;
1978 	if (setjmp(bus_error_jmp) == 0) {
1979 		catch_memory_errors = 1;
1980 		sync();
1981 		p = (char *)adrs;
1982 		q = (char *)buf;
1983 		switch (size) {
1984 		case 2:
1985 			*(u16 *)q = *(u16 *)p;
1986 			break;
1987 		case 4:
1988 			*(u32 *)q = *(u32 *)p;
1989 			break;
1990 		case 8:
1991 			*(u64 *)q = *(u64 *)p;
1992 			break;
1993 		default:
1994 			for( ; n < size; ++n) {
1995 				*q++ = *p++;
1996 				sync();
1997 			}
1998 		}
1999 		sync();
2000 		/* wait a little while to see if we get a machine check */
2001 		__delay(200);
2002 		n = size;
2003 	}
2004 	catch_memory_errors = 0;
2005 	return n;
2006 }
2007 
2008 static int
2009 mwrite(unsigned long adrs, void *buf, int size)
2010 {
2011 	volatile int n;
2012 	char *p, *q;
2013 
2014 	n = 0;
2015 	if (setjmp(bus_error_jmp) == 0) {
2016 		catch_memory_errors = 1;
2017 		sync();
2018 		p = (char *) adrs;
2019 		q = (char *) buf;
2020 		switch (size) {
2021 		case 2:
2022 			*(u16 *)p = *(u16 *)q;
2023 			break;
2024 		case 4:
2025 			*(u32 *)p = *(u32 *)q;
2026 			break;
2027 		case 8:
2028 			*(u64 *)p = *(u64 *)q;
2029 			break;
2030 		default:
2031 			for ( ; n < size; ++n) {
2032 				*p++ = *q++;
2033 				sync();
2034 			}
2035 		}
2036 		sync();
2037 		/* wait a little while to see if we get a machine check */
2038 		__delay(200);
2039 		n = size;
2040 	} else {
2041 		printf("*** Error writing address "REG"\n", adrs + n);
2042 	}
2043 	catch_memory_errors = 0;
2044 	return n;
2045 }
2046 
2047 static int fault_type;
2048 static int fault_except;
2049 static char *fault_chars[] = { "--", "**", "##" };
2050 
2051 static int handle_fault(struct pt_regs *regs)
2052 {
2053 	fault_except = TRAP(regs);
2054 	switch (TRAP(regs)) {
2055 	case 0x200:
2056 		fault_type = 0;
2057 		break;
2058 	case 0x300:
2059 	case 0x380:
2060 		fault_type = 1;
2061 		break;
2062 	default:
2063 		fault_type = 2;
2064 	}
2065 
2066 	longjmp(bus_error_jmp, 1);
2067 
2068 	return 0;
2069 }
2070 
2071 #define SWAP(a, b, t)	((t) = (a), (a) = (b), (b) = (t))
2072 
2073 static void
2074 byterev(unsigned char *val, int size)
2075 {
2076 	int t;
2077 
2078 	switch (size) {
2079 	case 2:
2080 		SWAP(val[0], val[1], t);
2081 		break;
2082 	case 4:
2083 		SWAP(val[0], val[3], t);
2084 		SWAP(val[1], val[2], t);
2085 		break;
2086 	case 8: /* is there really any use for this? */
2087 		SWAP(val[0], val[7], t);
2088 		SWAP(val[1], val[6], t);
2089 		SWAP(val[2], val[5], t);
2090 		SWAP(val[3], val[4], t);
2091 		break;
2092 	}
2093 }
2094 
2095 static int brev;
2096 static int mnoread;
2097 
2098 static char *memex_help_string =
2099     "Memory examine command usage:\n"
2100     "m [addr] [flags] examine/change memory\n"
2101     "  addr is optional.  will start where left off.\n"
2102     "  flags may include chars from this set:\n"
2103     "    b   modify by bytes (default)\n"
2104     "    w   modify by words (2 byte)\n"
2105     "    l   modify by longs (4 byte)\n"
2106     "    d   modify by doubleword (8 byte)\n"
2107     "    r   toggle reverse byte order mode\n"
2108     "    n   do not read memory (for i/o spaces)\n"
2109     "    .   ok to read (default)\n"
2110     "NOTE: flags are saved as defaults\n"
2111     "";
2112 
2113 static char *memex_subcmd_help_string =
2114     "Memory examine subcommands:\n"
2115     "  hexval   write this val to current location\n"
2116     "  'string' write chars from string to this location\n"
2117     "  '        increment address\n"
2118     "  ^        decrement address\n"
2119     "  /        increment addr by 0x10.  //=0x100, ///=0x1000, etc\n"
2120     "  \\        decrement addr by 0x10.  \\\\=0x100, \\\\\\=0x1000, etc\n"
2121     "  `        clear no-read flag\n"
2122     "  ;        stay at this addr\n"
2123     "  v        change to byte mode\n"
2124     "  w        change to word (2 byte) mode\n"
2125     "  l        change to long (4 byte) mode\n"
2126     "  u        change to doubleword (8 byte) mode\n"
2127     "  m addr   change current addr\n"
2128     "  n        toggle no-read flag\n"
2129     "  r        toggle byte reverse flag\n"
2130     "  < count  back up count bytes\n"
2131     "  > count  skip forward count bytes\n"
2132     "  x        exit this mode\n"
2133     "";
2134 
2135 static void
2136 memex(void)
2137 {
2138 	int cmd, inc, i, nslash;
2139 	unsigned long n;
2140 	unsigned char val[16];
2141 
2142 	scanhex((void *)&adrs);
2143 	cmd = skipbl();
2144 	if (cmd == '?') {
2145 		printf(memex_help_string);
2146 		return;
2147 	} else {
2148 		termch = cmd;
2149 	}
2150 	last_cmd = "m\n";
2151 	while ((cmd = skipbl()) != '\n') {
2152 		switch( cmd ){
2153 		case 'b':	size = 1;	break;
2154 		case 'w':	size = 2;	break;
2155 		case 'l':	size = 4;	break;
2156 		case 'd':	size = 8;	break;
2157 		case 'r': 	brev = !brev;	break;
2158 		case 'n':	mnoread = 1;	break;
2159 		case '.':	mnoread = 0;	break;
2160 		}
2161 	}
2162 	if( size <= 0 )
2163 		size = 1;
2164 	else if( size > 8 )
2165 		size = 8;
2166 	for(;;){
2167 		if (!mnoread)
2168 			n = mread(adrs, val, size);
2169 		printf(REG"%c", adrs, brev? 'r': ' ');
2170 		if (!mnoread) {
2171 			if (brev)
2172 				byterev(val, size);
2173 			putchar(' ');
2174 			for (i = 0; i < n; ++i)
2175 				printf("%.2x", val[i]);
2176 			for (; i < size; ++i)
2177 				printf("%s", fault_chars[fault_type]);
2178 		}
2179 		putchar(' ');
2180 		inc = size;
2181 		nslash = 0;
2182 		for(;;){
2183 			if( scanhex(&n) ){
2184 				for (i = 0; i < size; ++i)
2185 					val[i] = n >> (i * 8);
2186 				if (!brev)
2187 					byterev(val, size);
2188 				mwrite(adrs, val, size);
2189 				inc = size;
2190 			}
2191 			cmd = skipbl();
2192 			if (cmd == '\n')
2193 				break;
2194 			inc = 0;
2195 			switch (cmd) {
2196 			case '\'':
2197 				for(;;){
2198 					n = inchar();
2199 					if( n == '\\' )
2200 						n = bsesc();
2201 					else if( n == '\'' )
2202 						break;
2203 					for (i = 0; i < size; ++i)
2204 						val[i] = n >> (i * 8);
2205 					if (!brev)
2206 						byterev(val, size);
2207 					mwrite(adrs, val, size);
2208 					adrs += size;
2209 				}
2210 				adrs -= size;
2211 				inc = size;
2212 				break;
2213 			case ',':
2214 				adrs += size;
2215 				break;
2216 			case '.':
2217 				mnoread = 0;
2218 				break;
2219 			case ';':
2220 				break;
2221 			case 'x':
2222 			case EOF:
2223 				scannl();
2224 				return;
2225 			case 'b':
2226 			case 'v':
2227 				size = 1;
2228 				break;
2229 			case 'w':
2230 				size = 2;
2231 				break;
2232 			case 'l':
2233 				size = 4;
2234 				break;
2235 			case 'u':
2236 				size = 8;
2237 				break;
2238 			case '^':
2239 				adrs -= size;
2240 				break;
2241 			case '/':
2242 				if (nslash > 0)
2243 					adrs -= 1 << nslash;
2244 				else
2245 					nslash = 0;
2246 				nslash += 4;
2247 				adrs += 1 << nslash;
2248 				break;
2249 			case '\\':
2250 				if (nslash < 0)
2251 					adrs += 1 << -nslash;
2252 				else
2253 					nslash = 0;
2254 				nslash -= 4;
2255 				adrs -= 1 << -nslash;
2256 				break;
2257 			case 'm':
2258 				scanhex((void *)&adrs);
2259 				break;
2260 			case 'n':
2261 				mnoread = 1;
2262 				break;
2263 			case 'r':
2264 				brev = !brev;
2265 				break;
2266 			case '<':
2267 				n = size;
2268 				scanhex(&n);
2269 				adrs -= n;
2270 				break;
2271 			case '>':
2272 				n = size;
2273 				scanhex(&n);
2274 				adrs += n;
2275 				break;
2276 			case '?':
2277 				printf(memex_subcmd_help_string);
2278 				break;
2279 			}
2280 		}
2281 		adrs += inc;
2282 	}
2283 }
2284 
2285 static int
2286 bsesc(void)
2287 {
2288 	int c;
2289 
2290 	c = inchar();
2291 	switch( c ){
2292 	case 'n':	c = '\n';	break;
2293 	case 'r':	c = '\r';	break;
2294 	case 'b':	c = '\b';	break;
2295 	case 't':	c = '\t';	break;
2296 	}
2297 	return c;
2298 }
2299 
2300 static void xmon_rawdump (unsigned long adrs, long ndump)
2301 {
2302 	long n, m, r, nr;
2303 	unsigned char temp[16];
2304 
2305 	for (n = ndump; n > 0;) {
2306 		r = n < 16? n: 16;
2307 		nr = mread(adrs, temp, r);
2308 		adrs += nr;
2309 		for (m = 0; m < r; ++m) {
2310 			if (m < nr)
2311 				printf("%.2x", temp[m]);
2312 			else
2313 				printf("%s", fault_chars[fault_type]);
2314 		}
2315 		n -= r;
2316 		if (nr < r)
2317 			break;
2318 	}
2319 	printf("\n");
2320 }
2321 
2322 static void dump_tracing(void)
2323 {
2324 	int c;
2325 
2326 	c = inchar();
2327 	if (c == 'c')
2328 		ftrace_dump(DUMP_ORIG);
2329 	else
2330 		ftrace_dump(DUMP_ALL);
2331 }
2332 
2333 #ifdef CONFIG_PPC64
2334 static void dump_one_paca(int cpu)
2335 {
2336 	struct paca_struct *p;
2337 #ifdef CONFIG_PPC_BOOK3S_64
2338 	int i = 0;
2339 #endif
2340 
2341 	if (setjmp(bus_error_jmp) != 0) {
2342 		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2343 		return;
2344 	}
2345 
2346 	catch_memory_errors = 1;
2347 	sync();
2348 
2349 	p = paca_ptrs[cpu];
2350 
2351 	printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2352 
2353 	printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2354 	printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2355 	printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2356 
2357 #define DUMP(paca, name, format)				\
2358 	printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2359 		offsetof(struct paca_struct, name));
2360 
2361 	DUMP(p, lock_token, "%#-*x");
2362 	DUMP(p, paca_index, "%#-*x");
2363 	DUMP(p, kernel_toc, "%#-*llx");
2364 	DUMP(p, kernelbase, "%#-*llx");
2365 	DUMP(p, kernel_msr, "%#-*llx");
2366 	DUMP(p, emergency_sp, "%-*px");
2367 #ifdef CONFIG_PPC_BOOK3S_64
2368 	DUMP(p, nmi_emergency_sp, "%-*px");
2369 	DUMP(p, mc_emergency_sp, "%-*px");
2370 	DUMP(p, in_nmi, "%#-*x");
2371 	DUMP(p, in_mce, "%#-*x");
2372 	DUMP(p, hmi_event_available, "%#-*x");
2373 #endif
2374 	DUMP(p, data_offset, "%#-*llx");
2375 	DUMP(p, hw_cpu_id, "%#-*x");
2376 	DUMP(p, cpu_start, "%#-*x");
2377 	DUMP(p, kexec_state, "%#-*x");
2378 #ifdef CONFIG_PPC_BOOK3S_64
2379 	for (i = 0; i < SLB_NUM_BOLTED; i++) {
2380 		u64 esid, vsid;
2381 
2382 		if (!p->slb_shadow_ptr)
2383 			continue;
2384 
2385 		esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2386 		vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2387 
2388 		if (esid || vsid) {
2389 			printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2390 			       22, "slb_shadow", i, esid, vsid);
2391 		}
2392 	}
2393 	DUMP(p, vmalloc_sllp, "%#-*x");
2394 	DUMP(p, slb_cache_ptr, "%#-*x");
2395 	for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2396 		printf(" %-*s[%d] = 0x%016x\n",
2397 		       22, "slb_cache", i, p->slb_cache[i]);
2398 
2399 	DUMP(p, rfi_flush_fallback_area, "%-*px");
2400 #endif
2401 	DUMP(p, dscr_default, "%#-*llx");
2402 #ifdef CONFIG_PPC_BOOK3E
2403 	DUMP(p, pgd, "%-*px");
2404 	DUMP(p, kernel_pgd, "%-*px");
2405 	DUMP(p, tcd_ptr, "%-*px");
2406 	DUMP(p, mc_kstack, "%-*px");
2407 	DUMP(p, crit_kstack, "%-*px");
2408 	DUMP(p, dbg_kstack, "%-*px");
2409 #endif
2410 	DUMP(p, __current, "%-*px");
2411 	DUMP(p, kstack, "%#-*llx");
2412 	printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2413 	DUMP(p, stab_rr, "%#-*llx");
2414 	DUMP(p, saved_r1, "%#-*llx");
2415 	DUMP(p, trap_save, "%#-*x");
2416 	DUMP(p, irq_soft_mask, "%#-*x");
2417 	DUMP(p, irq_happened, "%#-*x");
2418 	DUMP(p, io_sync, "%#-*x");
2419 	DUMP(p, irq_work_pending, "%#-*x");
2420 	DUMP(p, nap_state_lost, "%#-*x");
2421 	DUMP(p, sprg_vdso, "%#-*llx");
2422 
2423 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2424 	DUMP(p, tm_scratch, "%#-*llx");
2425 #endif
2426 
2427 #ifdef CONFIG_PPC_POWERNV
2428 	DUMP(p, core_idle_state_ptr, "%-*px");
2429 	DUMP(p, thread_idle_state, "%#-*x");
2430 	DUMP(p, thread_mask, "%#-*x");
2431 	DUMP(p, subcore_sibling_mask, "%#-*x");
2432 	DUMP(p, thread_sibling_pacas, "%-*px");
2433 	DUMP(p, requested_psscr, "%#-*llx");
2434 	DUMP(p, stop_sprs.pid, "%#-*llx");
2435 	DUMP(p, stop_sprs.ldbar, "%#-*llx");
2436 	DUMP(p, stop_sprs.fscr, "%#-*llx");
2437 	DUMP(p, stop_sprs.hfscr, "%#-*llx");
2438 	DUMP(p, stop_sprs.mmcr1, "%#-*llx");
2439 	DUMP(p, stop_sprs.mmcr2, "%#-*llx");
2440 	DUMP(p, stop_sprs.mmcra, "%#-*llx");
2441 	DUMP(p, dont_stop.counter, "%#-*x");
2442 #endif
2443 
2444 	DUMP(p, accounting.utime, "%#-*lx");
2445 	DUMP(p, accounting.stime, "%#-*lx");
2446 	DUMP(p, accounting.utime_scaled, "%#-*lx");
2447 	DUMP(p, accounting.starttime, "%#-*lx");
2448 	DUMP(p, accounting.starttime_user, "%#-*lx");
2449 	DUMP(p, accounting.startspurr, "%#-*lx");
2450 	DUMP(p, accounting.utime_sspurr, "%#-*lx");
2451 	DUMP(p, accounting.steal_time, "%#-*lx");
2452 #undef DUMP
2453 
2454 	catch_memory_errors = 0;
2455 	sync();
2456 }
2457 
2458 static void dump_all_pacas(void)
2459 {
2460 	int cpu;
2461 
2462 	if (num_possible_cpus() == 0) {
2463 		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2464 		return;
2465 	}
2466 
2467 	for_each_possible_cpu(cpu)
2468 		dump_one_paca(cpu);
2469 }
2470 
2471 static void dump_pacas(void)
2472 {
2473 	unsigned long num;
2474 	int c;
2475 
2476 	c = inchar();
2477 	if (c == 'a') {
2478 		dump_all_pacas();
2479 		return;
2480 	}
2481 
2482 	termch = c;	/* Put c back, it wasn't 'a' */
2483 
2484 	if (scanhex(&num))
2485 		dump_one_paca(num);
2486 	else
2487 		dump_one_paca(xmon_owner);
2488 }
2489 #endif
2490 
2491 #ifdef CONFIG_PPC_POWERNV
2492 static void dump_one_xive(int cpu)
2493 {
2494 	unsigned int hwid = get_hard_smp_processor_id(cpu);
2495 
2496 	opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2497 	opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2498 	opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2499 	opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2500 	opal_xive_dump(XIVE_DUMP_VP, hwid);
2501 	opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2502 
2503 	if (setjmp(bus_error_jmp) != 0) {
2504 		catch_memory_errors = 0;
2505 		printf("*** Error dumping xive on cpu %d\n", cpu);
2506 		return;
2507 	}
2508 
2509 	catch_memory_errors = 1;
2510 	sync();
2511 	xmon_xive_do_dump(cpu);
2512 	sync();
2513 	__delay(200);
2514 	catch_memory_errors = 0;
2515 }
2516 
2517 static void dump_all_xives(void)
2518 {
2519 	int cpu;
2520 
2521 	if (num_possible_cpus() == 0) {
2522 		printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2523 		return;
2524 	}
2525 
2526 	for_each_possible_cpu(cpu)
2527 		dump_one_xive(cpu);
2528 }
2529 
2530 static void dump_one_xive_irq(u32 num)
2531 {
2532 	s64 rc;
2533 	__be64 vp;
2534 	u8 prio;
2535 	__be32 lirq;
2536 
2537 	rc = opal_xive_get_irq_config(num, &vp, &prio, &lirq);
2538 	xmon_printf("IRQ 0x%x config: vp=0x%llx prio=%d lirq=0x%x (rc=%lld)\n",
2539 		    num, be64_to_cpu(vp), prio, be32_to_cpu(lirq), rc);
2540 }
2541 
2542 static void dump_xives(void)
2543 {
2544 	unsigned long num;
2545 	int c;
2546 
2547 	if (!xive_enabled()) {
2548 		printf("Xive disabled on this system\n");
2549 		return;
2550 	}
2551 
2552 	c = inchar();
2553 	if (c == 'a') {
2554 		dump_all_xives();
2555 		return;
2556 	} else if (c == 'i') {
2557 		if (scanhex(&num))
2558 			dump_one_xive_irq(num);
2559 		return;
2560 	}
2561 
2562 	termch = c;	/* Put c back, it wasn't 'a' */
2563 
2564 	if (scanhex(&num))
2565 		dump_one_xive(num);
2566 	else
2567 		dump_one_xive(xmon_owner);
2568 }
2569 #endif /* CONFIG_PPC_POWERNV */
2570 
2571 static void dump_by_size(unsigned long addr, long count, int size)
2572 {
2573 	unsigned char temp[16];
2574 	int i, j;
2575 	u64 val;
2576 
2577 	count = ALIGN(count, 16);
2578 
2579 	for (i = 0; i < count; i += 16, addr += 16) {
2580 		printf(REG, addr);
2581 
2582 		if (mread(addr, temp, 16) != 16) {
2583 			printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2584 			return;
2585 		}
2586 
2587 		for (j = 0; j < 16; j += size) {
2588 			putchar(' ');
2589 			switch (size) {
2590 			case 1: val = temp[j]; break;
2591 			case 2: val = *(u16 *)&temp[j]; break;
2592 			case 4: val = *(u32 *)&temp[j]; break;
2593 			case 8: val = *(u64 *)&temp[j]; break;
2594 			default: val = 0;
2595 			}
2596 
2597 			printf("%0*llx", size * 2, val);
2598 		}
2599 		printf("\n");
2600 	}
2601 }
2602 
2603 static void
2604 dump(void)
2605 {
2606 	static char last[] = { "d?\n" };
2607 	int c;
2608 
2609 	c = inchar();
2610 
2611 #ifdef CONFIG_PPC64
2612 	if (c == 'p') {
2613 		xmon_start_pagination();
2614 		dump_pacas();
2615 		xmon_end_pagination();
2616 		return;
2617 	}
2618 #endif
2619 #ifdef CONFIG_PPC_POWERNV
2620 	if (c == 'x') {
2621 		xmon_start_pagination();
2622 		dump_xives();
2623 		xmon_end_pagination();
2624 		return;
2625 	}
2626 #endif
2627 
2628 	if (c == 't') {
2629 		dump_tracing();
2630 		return;
2631 	}
2632 
2633 	if (c == '\n')
2634 		termch = c;
2635 
2636 	scanhex((void *)&adrs);
2637 	if (termch != '\n')
2638 		termch = 0;
2639 	if (c == 'i') {
2640 		scanhex(&nidump);
2641 		if (nidump == 0)
2642 			nidump = 16;
2643 		else if (nidump > MAX_DUMP)
2644 			nidump = MAX_DUMP;
2645 		adrs += ppc_inst_dump(adrs, nidump, 1);
2646 		last_cmd = "di\n";
2647 	} else if (c == 'l') {
2648 		dump_log_buf();
2649 	} else if (c == 'o') {
2650 		dump_opal_msglog();
2651 	} else if (c == 'v') {
2652 		/* dump virtual to physical translation */
2653 		show_pte(adrs);
2654 	} else if (c == 'r') {
2655 		scanhex(&ndump);
2656 		if (ndump == 0)
2657 			ndump = 64;
2658 		xmon_rawdump(adrs, ndump);
2659 		adrs += ndump;
2660 		last_cmd = "dr\n";
2661 	} else {
2662 		scanhex(&ndump);
2663 		if (ndump == 0)
2664 			ndump = 64;
2665 		else if (ndump > MAX_DUMP)
2666 			ndump = MAX_DUMP;
2667 
2668 		switch (c) {
2669 		case '8':
2670 		case '4':
2671 		case '2':
2672 		case '1':
2673 			ndump = ALIGN(ndump, 16);
2674 			dump_by_size(adrs, ndump, c - '0');
2675 			last[1] = c;
2676 			last_cmd = last;
2677 			break;
2678 		default:
2679 			prdump(adrs, ndump);
2680 			last_cmd = "d\n";
2681 		}
2682 
2683 		adrs += ndump;
2684 	}
2685 }
2686 
2687 static void
2688 prdump(unsigned long adrs, long ndump)
2689 {
2690 	long n, m, c, r, nr;
2691 	unsigned char temp[16];
2692 
2693 	for (n = ndump; n > 0;) {
2694 		printf(REG, adrs);
2695 		putchar(' ');
2696 		r = n < 16? n: 16;
2697 		nr = mread(adrs, temp, r);
2698 		adrs += nr;
2699 		for (m = 0; m < r; ++m) {
2700 			if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2701 				putchar(' ');
2702 			if (m < nr)
2703 				printf("%.2x", temp[m]);
2704 			else
2705 				printf("%s", fault_chars[fault_type]);
2706 		}
2707 		for (; m < 16; ++m) {
2708 			if ((m & (sizeof(long) - 1)) == 0)
2709 				putchar(' ');
2710 			printf("  ");
2711 		}
2712 		printf("  |");
2713 		for (m = 0; m < r; ++m) {
2714 			if (m < nr) {
2715 				c = temp[m];
2716 				putchar(' ' <= c && c <= '~'? c: '.');
2717 			} else
2718 				putchar(' ');
2719 		}
2720 		n -= r;
2721 		for (; m < 16; ++m)
2722 			putchar(' ');
2723 		printf("|\n");
2724 		if (nr < r)
2725 			break;
2726 	}
2727 }
2728 
2729 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2730 
2731 static int
2732 generic_inst_dump(unsigned long adr, long count, int praddr,
2733 			instruction_dump_func dump_func)
2734 {
2735 	int nr, dotted;
2736 	unsigned long first_adr;
2737 	unsigned long inst, last_inst = 0;
2738 	unsigned char val[4];
2739 
2740 	dotted = 0;
2741 	for (first_adr = adr; count > 0; --count, adr += 4) {
2742 		nr = mread(adr, val, 4);
2743 		if (nr == 0) {
2744 			if (praddr) {
2745 				const char *x = fault_chars[fault_type];
2746 				printf(REG"  %s%s%s%s\n", adr, x, x, x, x);
2747 			}
2748 			break;
2749 		}
2750 		inst = GETWORD(val);
2751 		if (adr > first_adr && inst == last_inst) {
2752 			if (!dotted) {
2753 				printf(" ...\n");
2754 				dotted = 1;
2755 			}
2756 			continue;
2757 		}
2758 		dotted = 0;
2759 		last_inst = inst;
2760 		if (praddr)
2761 			printf(REG"  %.8lx", adr, inst);
2762 		printf("\t");
2763 		dump_func(inst, adr);
2764 		printf("\n");
2765 	}
2766 	return adr - first_adr;
2767 }
2768 
2769 static int
2770 ppc_inst_dump(unsigned long adr, long count, int praddr)
2771 {
2772 	return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2773 }
2774 
2775 void
2776 print_address(unsigned long addr)
2777 {
2778 	xmon_print_symbol(addr, "\t# ", "");
2779 }
2780 
2781 void
2782 dump_log_buf(void)
2783 {
2784 	struct kmsg_dumper dumper = { .active = 1 };
2785 	unsigned char buf[128];
2786 	size_t len;
2787 
2788 	if (setjmp(bus_error_jmp) != 0) {
2789 		printf("Error dumping printk buffer!\n");
2790 		return;
2791 	}
2792 
2793 	catch_memory_errors = 1;
2794 	sync();
2795 
2796 	kmsg_dump_rewind_nolock(&dumper);
2797 	xmon_start_pagination();
2798 	while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2799 		buf[len] = '\0';
2800 		printf("%s", buf);
2801 	}
2802 	xmon_end_pagination();
2803 
2804 	sync();
2805 	/* wait a little while to see if we get a machine check */
2806 	__delay(200);
2807 	catch_memory_errors = 0;
2808 }
2809 
2810 #ifdef CONFIG_PPC_POWERNV
2811 static void dump_opal_msglog(void)
2812 {
2813 	unsigned char buf[128];
2814 	ssize_t res;
2815 	loff_t pos = 0;
2816 
2817 	if (!firmware_has_feature(FW_FEATURE_OPAL)) {
2818 		printf("Machine is not running OPAL firmware.\n");
2819 		return;
2820 	}
2821 
2822 	if (setjmp(bus_error_jmp) != 0) {
2823 		printf("Error dumping OPAL msglog!\n");
2824 		return;
2825 	}
2826 
2827 	catch_memory_errors = 1;
2828 	sync();
2829 
2830 	xmon_start_pagination();
2831 	while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
2832 		if (res < 0) {
2833 			printf("Error dumping OPAL msglog! Error: %zd\n", res);
2834 			break;
2835 		}
2836 		buf[res] = '\0';
2837 		printf("%s", buf);
2838 		pos += res;
2839 	}
2840 	xmon_end_pagination();
2841 
2842 	sync();
2843 	/* wait a little while to see if we get a machine check */
2844 	__delay(200);
2845 	catch_memory_errors = 0;
2846 }
2847 #endif
2848 
2849 /*
2850  * Memory operations - move, set, print differences
2851  */
2852 static unsigned long mdest;		/* destination address */
2853 static unsigned long msrc;		/* source address */
2854 static unsigned long mval;		/* byte value to set memory to */
2855 static unsigned long mcount;		/* # bytes to affect */
2856 static unsigned long mdiffs;		/* max # differences to print */
2857 
2858 static void
2859 memops(int cmd)
2860 {
2861 	scanhex((void *)&mdest);
2862 	if( termch != '\n' )
2863 		termch = 0;
2864 	scanhex((void *)(cmd == 's'? &mval: &msrc));
2865 	if( termch != '\n' )
2866 		termch = 0;
2867 	scanhex((void *)&mcount);
2868 	switch( cmd ){
2869 	case 'm':
2870 		memmove((void *)mdest, (void *)msrc, mcount);
2871 		break;
2872 	case 's':
2873 		memset((void *)mdest, mval, mcount);
2874 		break;
2875 	case 'd':
2876 		if( termch != '\n' )
2877 			termch = 0;
2878 		scanhex((void *)&mdiffs);
2879 		memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2880 		break;
2881 	}
2882 }
2883 
2884 static void
2885 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2886 {
2887 	unsigned n, prt;
2888 
2889 	prt = 0;
2890 	for( n = nb; n > 0; --n )
2891 		if( *p1++ != *p2++ )
2892 			if( ++prt <= maxpr )
2893 				printf("%px %.2x # %px %.2x\n", p1 - 1,
2894 					p1[-1], p2 - 1, p2[-1]);
2895 	if( prt > maxpr )
2896 		printf("Total of %d differences\n", prt);
2897 }
2898 
2899 static unsigned mend;
2900 static unsigned mask;
2901 
2902 static void
2903 memlocate(void)
2904 {
2905 	unsigned a, n;
2906 	unsigned char val[4];
2907 
2908 	last_cmd = "ml";
2909 	scanhex((void *)&mdest);
2910 	if (termch != '\n') {
2911 		termch = 0;
2912 		scanhex((void *)&mend);
2913 		if (termch != '\n') {
2914 			termch = 0;
2915 			scanhex((void *)&mval);
2916 			mask = ~0;
2917 			if (termch != '\n') termch = 0;
2918 			scanhex((void *)&mask);
2919 		}
2920 	}
2921 	n = 0;
2922 	for (a = mdest; a < mend; a += 4) {
2923 		if (mread(a, val, 4) == 4
2924 			&& ((GETWORD(val) ^ mval) & mask) == 0) {
2925 			printf("%.16x:  %.16x\n", a, GETWORD(val));
2926 			if (++n >= 10)
2927 				break;
2928 		}
2929 	}
2930 }
2931 
2932 static unsigned long mskip = 0x1000;
2933 static unsigned long mlim = 0xffffffff;
2934 
2935 static void
2936 memzcan(void)
2937 {
2938 	unsigned char v;
2939 	unsigned a;
2940 	int ok, ook;
2941 
2942 	scanhex(&mdest);
2943 	if (termch != '\n') termch = 0;
2944 	scanhex(&mskip);
2945 	if (termch != '\n') termch = 0;
2946 	scanhex(&mlim);
2947 	ook = 0;
2948 	for (a = mdest; a < mlim; a += mskip) {
2949 		ok = mread(a, &v, 1);
2950 		if (ok && !ook) {
2951 			printf("%.8x .. ", a);
2952 		} else if (!ok && ook)
2953 			printf("%.8lx\n", a - mskip);
2954 		ook = ok;
2955 		if (a + mskip < a)
2956 			break;
2957 	}
2958 	if (ook)
2959 		printf("%.8lx\n", a - mskip);
2960 }
2961 
2962 static void show_task(struct task_struct *tsk)
2963 {
2964 	char state;
2965 
2966 	/*
2967 	 * Cloned from kdb_task_state_char(), which is not entirely
2968 	 * appropriate for calling from xmon. This could be moved
2969 	 * to a common, generic, routine used by both.
2970 	 */
2971 	state = (tsk->state == 0) ? 'R' :
2972 		(tsk->state < 0) ? 'U' :
2973 		(tsk->state & TASK_UNINTERRUPTIBLE) ? 'D' :
2974 		(tsk->state & TASK_STOPPED) ? 'T' :
2975 		(tsk->state & TASK_TRACED) ? 'C' :
2976 		(tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
2977 		(tsk->exit_state & EXIT_DEAD) ? 'E' :
2978 		(tsk->state & TASK_INTERRUPTIBLE) ? 'S' : '?';
2979 
2980 	printf("%px %016lx %6d %6d %c %2d %s\n", tsk,
2981 		tsk->thread.ksp,
2982 		tsk->pid, tsk->parent->pid,
2983 		state, task_thread_info(tsk)->cpu,
2984 		tsk->comm);
2985 }
2986 
2987 #ifdef CONFIG_PPC_BOOK3S_64
2988 void format_pte(void *ptep, unsigned long pte)
2989 {
2990 	printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
2991 	printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
2992 
2993 	printf("Flags = %s%s%s%s%s\n",
2994 	       (pte & _PAGE_ACCESSED) ? "Accessed " : "",
2995 	       (pte & _PAGE_DIRTY)    ? "Dirty " : "",
2996 	       (pte & _PAGE_READ)     ? "Read " : "",
2997 	       (pte & _PAGE_WRITE)    ? "Write " : "",
2998 	       (pte & _PAGE_EXEC)     ? "Exec " : "");
2999 }
3000 
3001 static void show_pte(unsigned long addr)
3002 {
3003 	unsigned long tskv = 0;
3004 	struct task_struct *tsk = NULL;
3005 	struct mm_struct *mm;
3006 	pgd_t *pgdp, *pgdir;
3007 	pud_t *pudp;
3008 	pmd_t *pmdp;
3009 	pte_t *ptep;
3010 
3011 	if (!scanhex(&tskv))
3012 		mm = &init_mm;
3013 	else
3014 		tsk = (struct task_struct *)tskv;
3015 
3016 	if (tsk == NULL)
3017 		mm = &init_mm;
3018 	else
3019 		mm = tsk->active_mm;
3020 
3021 	if (setjmp(bus_error_jmp) != 0) {
3022 		catch_memory_errors = 0;
3023 		printf("*** Error dumping pte for task %px\n", tsk);
3024 		return;
3025 	}
3026 
3027 	catch_memory_errors = 1;
3028 	sync();
3029 
3030 	if (mm == &init_mm) {
3031 		pgdp = pgd_offset_k(addr);
3032 		pgdir = pgd_offset_k(0);
3033 	} else {
3034 		pgdp = pgd_offset(mm, addr);
3035 		pgdir = pgd_offset(mm, 0);
3036 	}
3037 
3038 	if (pgd_none(*pgdp)) {
3039 		printf("no linux page table for address\n");
3040 		return;
3041 	}
3042 
3043 	printf("pgd  @ 0x%px\n", pgdir);
3044 
3045 	if (pgd_huge(*pgdp)) {
3046 		format_pte(pgdp, pgd_val(*pgdp));
3047 		return;
3048 	}
3049 	printf("pgdp @ 0x%px = 0x%016lx\n", pgdp, pgd_val(*pgdp));
3050 
3051 	pudp = pud_offset(pgdp, addr);
3052 
3053 	if (pud_none(*pudp)) {
3054 		printf("No valid PUD\n");
3055 		return;
3056 	}
3057 
3058 	if (pud_huge(*pudp)) {
3059 		format_pte(pudp, pud_val(*pudp));
3060 		return;
3061 	}
3062 
3063 	printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3064 
3065 	pmdp = pmd_offset(pudp, addr);
3066 
3067 	if (pmd_none(*pmdp)) {
3068 		printf("No valid PMD\n");
3069 		return;
3070 	}
3071 
3072 	if (pmd_huge(*pmdp)) {
3073 		format_pte(pmdp, pmd_val(*pmdp));
3074 		return;
3075 	}
3076 	printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3077 
3078 	ptep = pte_offset_map(pmdp, addr);
3079 	if (pte_none(*ptep)) {
3080 		printf("no valid PTE\n");
3081 		return;
3082 	}
3083 
3084 	format_pte(ptep, pte_val(*ptep));
3085 
3086 	sync();
3087 	__delay(200);
3088 	catch_memory_errors = 0;
3089 }
3090 #else
3091 static void show_pte(unsigned long addr)
3092 {
3093 	printf("show_pte not yet implemented\n");
3094 }
3095 #endif /* CONFIG_PPC_BOOK3S_64 */
3096 
3097 static void show_tasks(void)
3098 {
3099 	unsigned long tskv;
3100 	struct task_struct *tsk = NULL;
3101 
3102 	printf("     task_struct     ->thread.ksp    PID   PPID S  P CMD\n");
3103 
3104 	if (scanhex(&tskv))
3105 		tsk = (struct task_struct *)tskv;
3106 
3107 	if (setjmp(bus_error_jmp) != 0) {
3108 		catch_memory_errors = 0;
3109 		printf("*** Error dumping task %px\n", tsk);
3110 		return;
3111 	}
3112 
3113 	catch_memory_errors = 1;
3114 	sync();
3115 
3116 	if (tsk)
3117 		show_task(tsk);
3118 	else
3119 		for_each_process(tsk)
3120 			show_task(tsk);
3121 
3122 	sync();
3123 	__delay(200);
3124 	catch_memory_errors = 0;
3125 }
3126 
3127 static void proccall(void)
3128 {
3129 	unsigned long args[8];
3130 	unsigned long ret;
3131 	int i;
3132 	typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3133 			unsigned long, unsigned long, unsigned long,
3134 			unsigned long, unsigned long, unsigned long);
3135 	callfunc_t func;
3136 
3137 	if (!scanhex(&adrs))
3138 		return;
3139 	if (termch != '\n')
3140 		termch = 0;
3141 	for (i = 0; i < 8; ++i)
3142 		args[i] = 0;
3143 	for (i = 0; i < 8; ++i) {
3144 		if (!scanhex(&args[i]) || termch == '\n')
3145 			break;
3146 		termch = 0;
3147 	}
3148 	func = (callfunc_t) adrs;
3149 	ret = 0;
3150 	if (setjmp(bus_error_jmp) == 0) {
3151 		catch_memory_errors = 1;
3152 		sync();
3153 		ret = func(args[0], args[1], args[2], args[3],
3154 			   args[4], args[5], args[6], args[7]);
3155 		sync();
3156 		printf("return value is 0x%lx\n", ret);
3157 	} else {
3158 		printf("*** %x exception occurred\n", fault_except);
3159 	}
3160 	catch_memory_errors = 0;
3161 }
3162 
3163 /* Input scanning routines */
3164 int
3165 skipbl(void)
3166 {
3167 	int c;
3168 
3169 	if( termch != 0 ){
3170 		c = termch;
3171 		termch = 0;
3172 	} else
3173 		c = inchar();
3174 	while( c == ' ' || c == '\t' )
3175 		c = inchar();
3176 	return c;
3177 }
3178 
3179 #define N_PTREGS	44
3180 static const char *regnames[N_PTREGS] = {
3181 	"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3182 	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3183 	"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3184 	"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3185 	"pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3186 #ifdef CONFIG_PPC64
3187 	"softe",
3188 #else
3189 	"mq",
3190 #endif
3191 	"trap", "dar", "dsisr", "res"
3192 };
3193 
3194 int
3195 scanhex(unsigned long *vp)
3196 {
3197 	int c, d;
3198 	unsigned long v;
3199 
3200 	c = skipbl();
3201 	if (c == '%') {
3202 		/* parse register name */
3203 		char regname[8];
3204 		int i;
3205 
3206 		for (i = 0; i < sizeof(regname) - 1; ++i) {
3207 			c = inchar();
3208 			if (!isalnum(c)) {
3209 				termch = c;
3210 				break;
3211 			}
3212 			regname[i] = c;
3213 		}
3214 		regname[i] = 0;
3215 		i = match_string(regnames, N_PTREGS, regname);
3216 		if (i < 0) {
3217 			printf("invalid register name '%%%s'\n", regname);
3218 			return 0;
3219 		}
3220 		if (xmon_regs == NULL) {
3221 			printf("regs not available\n");
3222 			return 0;
3223 		}
3224 		*vp = ((unsigned long *)xmon_regs)[i];
3225 		return 1;
3226 	}
3227 
3228 	/* skip leading "0x" if any */
3229 
3230 	if (c == '0') {
3231 		c = inchar();
3232 		if (c == 'x') {
3233 			c = inchar();
3234 		} else {
3235 			d = hexdigit(c);
3236 			if (d == EOF) {
3237 				termch = c;
3238 				*vp = 0;
3239 				return 1;
3240 			}
3241 		}
3242 	} else if (c == '$') {
3243 		int i;
3244 		for (i=0; i<63; i++) {
3245 			c = inchar();
3246 			if (isspace(c) || c == '\0') {
3247 				termch = c;
3248 				break;
3249 			}
3250 			tmpstr[i] = c;
3251 		}
3252 		tmpstr[i++] = 0;
3253 		*vp = 0;
3254 		if (setjmp(bus_error_jmp) == 0) {
3255 			catch_memory_errors = 1;
3256 			sync();
3257 			*vp = kallsyms_lookup_name(tmpstr);
3258 			sync();
3259 		}
3260 		catch_memory_errors = 0;
3261 		if (!(*vp)) {
3262 			printf("unknown symbol '%s'\n", tmpstr);
3263 			return 0;
3264 		}
3265 		return 1;
3266 	}
3267 
3268 	d = hexdigit(c);
3269 	if (d == EOF) {
3270 		termch = c;
3271 		return 0;
3272 	}
3273 	v = 0;
3274 	do {
3275 		v = (v << 4) + d;
3276 		c = inchar();
3277 		d = hexdigit(c);
3278 	} while (d != EOF);
3279 	termch = c;
3280 	*vp = v;
3281 	return 1;
3282 }
3283 
3284 static void
3285 scannl(void)
3286 {
3287 	int c;
3288 
3289 	c = termch;
3290 	termch = 0;
3291 	while( c != '\n' )
3292 		c = inchar();
3293 }
3294 
3295 static int hexdigit(int c)
3296 {
3297 	if( '0' <= c && c <= '9' )
3298 		return c - '0';
3299 	if( 'A' <= c && c <= 'F' )
3300 		return c - ('A' - 10);
3301 	if( 'a' <= c && c <= 'f' )
3302 		return c - ('a' - 10);
3303 	return EOF;
3304 }
3305 
3306 void
3307 getstring(char *s, int size)
3308 {
3309 	int c;
3310 
3311 	c = skipbl();
3312 	do {
3313 		if( size > 1 ){
3314 			*s++ = c;
3315 			--size;
3316 		}
3317 		c = inchar();
3318 	} while( c != ' ' && c != '\t' && c != '\n' );
3319 	termch = c;
3320 	*s = 0;
3321 }
3322 
3323 static char line[256];
3324 static char *lineptr;
3325 
3326 static void
3327 flush_input(void)
3328 {
3329 	lineptr = NULL;
3330 }
3331 
3332 static int
3333 inchar(void)
3334 {
3335 	if (lineptr == NULL || *lineptr == 0) {
3336 		if (xmon_gets(line, sizeof(line)) == NULL) {
3337 			lineptr = NULL;
3338 			return EOF;
3339 		}
3340 		lineptr = line;
3341 	}
3342 	return *lineptr++;
3343 }
3344 
3345 static void
3346 take_input(char *str)
3347 {
3348 	lineptr = str;
3349 }
3350 
3351 
3352 static void
3353 symbol_lookup(void)
3354 {
3355 	int type = inchar();
3356 	unsigned long addr;
3357 	static char tmp[64];
3358 
3359 	switch (type) {
3360 	case 'a':
3361 		if (scanhex(&addr))
3362 			xmon_print_symbol(addr, ": ", "\n");
3363 		termch = 0;
3364 		break;
3365 	case 's':
3366 		getstring(tmp, 64);
3367 		if (setjmp(bus_error_jmp) == 0) {
3368 			catch_memory_errors = 1;
3369 			sync();
3370 			addr = kallsyms_lookup_name(tmp);
3371 			if (addr)
3372 				printf("%s: %lx\n", tmp, addr);
3373 			else
3374 				printf("Symbol '%s' not found.\n", tmp);
3375 			sync();
3376 		}
3377 		catch_memory_errors = 0;
3378 		termch = 0;
3379 		break;
3380 	}
3381 }
3382 
3383 
3384 /* Print an address in numeric and symbolic form (if possible) */
3385 static void xmon_print_symbol(unsigned long address, const char *mid,
3386 			      const char *after)
3387 {
3388 	char *modname;
3389 	const char *name = NULL;
3390 	unsigned long offset, size;
3391 
3392 	printf(REG, address);
3393 	if (setjmp(bus_error_jmp) == 0) {
3394 		catch_memory_errors = 1;
3395 		sync();
3396 		name = kallsyms_lookup(address, &size, &offset, &modname,
3397 				       tmpstr);
3398 		sync();
3399 		/* wait a little while to see if we get a machine check */
3400 		__delay(200);
3401 	}
3402 
3403 	catch_memory_errors = 0;
3404 
3405 	if (name) {
3406 		printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3407 		if (modname)
3408 			printf(" [%s]", modname);
3409 	}
3410 	printf("%s", after);
3411 }
3412 
3413 #ifdef CONFIG_PPC_BOOK3S_64
3414 void dump_segments(void)
3415 {
3416 	int i;
3417 	unsigned long esid,vsid;
3418 	unsigned long llp;
3419 
3420 	printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3421 
3422 	for (i = 0; i < mmu_slb_size; i++) {
3423 		asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
3424 		asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
3425 
3426 		if (!esid && !vsid)
3427 			continue;
3428 
3429 		printf("%02d %016lx %016lx", i, esid, vsid);
3430 
3431 		if (!(esid & SLB_ESID_V)) {
3432 			printf("\n");
3433 			continue;
3434 		}
3435 
3436 		llp = vsid & SLB_VSID_LLP;
3437 		if (vsid & SLB_VSID_B_1T) {
3438 			printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",
3439 				GET_ESID_1T(esid),
3440 				(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3441 				llp);
3442 		} else {
3443 			printf(" 256M ESID=%9lx  VSID=%13lx LLP:%3lx \n",
3444 				GET_ESID(esid),
3445 				(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3446 				llp);
3447 		}
3448 	}
3449 }
3450 #endif
3451 
3452 #ifdef CONFIG_PPC_STD_MMU_32
3453 void dump_segments(void)
3454 {
3455 	int i;
3456 
3457 	printf("sr0-15 =");
3458 	for (i = 0; i < 16; ++i)
3459 		printf(" %x", mfsrin(i));
3460 	printf("\n");
3461 }
3462 #endif
3463 
3464 #ifdef CONFIG_44x
3465 static void dump_tlb_44x(void)
3466 {
3467 	int i;
3468 
3469 	for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3470 		unsigned long w0,w1,w2;
3471 		asm volatile("tlbre  %0,%1,0" : "=r" (w0) : "r" (i));
3472 		asm volatile("tlbre  %0,%1,1" : "=r" (w1) : "r" (i));
3473 		asm volatile("tlbre  %0,%1,2" : "=r" (w2) : "r" (i));
3474 		printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3475 		if (w0 & PPC44x_TLB_VALID) {
3476 			printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3477 			       w0 & PPC44x_TLB_EPN_MASK,
3478 			       w1 & PPC44x_TLB_ERPN_MASK,
3479 			       w1 & PPC44x_TLB_RPN_MASK,
3480 			       (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3481 			       (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3482 			       (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3483 			       (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3484 			       (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3485 		}
3486 		printf("\n");
3487 	}
3488 }
3489 #endif /* CONFIG_44x */
3490 
3491 #ifdef CONFIG_PPC_BOOK3E
3492 static void dump_tlb_book3e(void)
3493 {
3494 	u32 mmucfg, pidmask, lpidmask;
3495 	u64 ramask;
3496 	int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3497 	int mmu_version;
3498 	static const char *pgsz_names[] = {
3499 		"  1K",
3500 		"  2K",
3501 		"  4K",
3502 		"  8K",
3503 		" 16K",
3504 		" 32K",
3505 		" 64K",
3506 		"128K",
3507 		"256K",
3508 		"512K",
3509 		"  1M",
3510 		"  2M",
3511 		"  4M",
3512 		"  8M",
3513 		" 16M",
3514 		" 32M",
3515 		" 64M",
3516 		"128M",
3517 		"256M",
3518 		"512M",
3519 		"  1G",
3520 		"  2G",
3521 		"  4G",
3522 		"  8G",
3523 		" 16G",
3524 		" 32G",
3525 		" 64G",
3526 		"128G",
3527 		"256G",
3528 		"512G",
3529 		"  1T",
3530 		"  2T",
3531 	};
3532 
3533 	/* Gather some infos about the MMU */
3534 	mmucfg = mfspr(SPRN_MMUCFG);
3535 	mmu_version = (mmucfg & 3) + 1;
3536 	ntlbs = ((mmucfg >> 2) & 3) + 1;
3537 	pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3538 	lpidsz = (mmucfg >> 24) & 0xf;
3539 	rasz = (mmucfg >> 16) & 0x7f;
3540 	if ((mmu_version > 1) && (mmucfg & 0x10000))
3541 		lrat = 1;
3542 	printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3543 	       mmu_version, ntlbs, pidsz, lpidsz, rasz);
3544 	pidmask = (1ul << pidsz) - 1;
3545 	lpidmask = (1ul << lpidsz) - 1;
3546 	ramask = (1ull << rasz) - 1;
3547 
3548 	for (tlb = 0; tlb < ntlbs; tlb++) {
3549 		u32 tlbcfg;
3550 		int nent, assoc, new_cc = 1;
3551 		printf("TLB %d:\n------\n", tlb);
3552 		switch(tlb) {
3553 		case 0:
3554 			tlbcfg = mfspr(SPRN_TLB0CFG);
3555 			break;
3556 		case 1:
3557 			tlbcfg = mfspr(SPRN_TLB1CFG);
3558 			break;
3559 		case 2:
3560 			tlbcfg = mfspr(SPRN_TLB2CFG);
3561 			break;
3562 		case 3:
3563 			tlbcfg = mfspr(SPRN_TLB3CFG);
3564 			break;
3565 		default:
3566 			printf("Unsupported TLB number !\n");
3567 			continue;
3568 		}
3569 		nent = tlbcfg & 0xfff;
3570 		assoc = (tlbcfg >> 24) & 0xff;
3571 		for (i = 0; i < nent; i++) {
3572 			u32 mas0 = MAS0_TLBSEL(tlb);
3573 			u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3574 			u64 mas2 = 0;
3575 			u64 mas7_mas3;
3576 			int esel = i, cc = i;
3577 
3578 			if (assoc != 0) {
3579 				cc = i / assoc;
3580 				esel = i % assoc;
3581 				mas2 = cc * 0x1000;
3582 			}
3583 
3584 			mas0 |= MAS0_ESEL(esel);
3585 			mtspr(SPRN_MAS0, mas0);
3586 			mtspr(SPRN_MAS1, mas1);
3587 			mtspr(SPRN_MAS2, mas2);
3588 			asm volatile("tlbre  0,0,0" : : : "memory");
3589 			mas1 = mfspr(SPRN_MAS1);
3590 			mas2 = mfspr(SPRN_MAS2);
3591 			mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3592 			if (assoc && (i % assoc) == 0)
3593 				new_cc = 1;
3594 			if (!(mas1 & MAS1_VALID))
3595 				continue;
3596 			if (assoc == 0)
3597 				printf("%04x- ", i);
3598 			else if (new_cc)
3599 				printf("%04x-%c", cc, 'A' + esel);
3600 			else
3601 				printf("    |%c", 'A' + esel);
3602 			new_cc = 0;
3603 			printf(" %016llx %04x %s %c%c AS%c",
3604 			       mas2 & ~0x3ffull,
3605 			       (mas1 >> 16) & 0x3fff,
3606 			       pgsz_names[(mas1 >> 7) & 0x1f],
3607 			       mas1 & MAS1_IND ? 'I' : ' ',
3608 			       mas1 & MAS1_IPROT ? 'P' : ' ',
3609 			       mas1 & MAS1_TS ? '1' : '0');
3610 			printf(" %c%c%c%c%c%c%c",
3611 			       mas2 & MAS2_X0 ? 'a' : ' ',
3612 			       mas2 & MAS2_X1 ? 'v' : ' ',
3613 			       mas2 & MAS2_W  ? 'w' : ' ',
3614 			       mas2 & MAS2_I  ? 'i' : ' ',
3615 			       mas2 & MAS2_M  ? 'm' : ' ',
3616 			       mas2 & MAS2_G  ? 'g' : ' ',
3617 			       mas2 & MAS2_E  ? 'e' : ' ');
3618 			printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3619 			if (mas1 & MAS1_IND)
3620 				printf(" %s\n",
3621 				       pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3622 			else
3623 				printf(" U%c%c%c S%c%c%c\n",
3624 				       mas7_mas3 & MAS3_UX ? 'x' : ' ',
3625 				       mas7_mas3 & MAS3_UW ? 'w' : ' ',
3626 				       mas7_mas3 & MAS3_UR ? 'r' : ' ',
3627 				       mas7_mas3 & MAS3_SX ? 'x' : ' ',
3628 				       mas7_mas3 & MAS3_SW ? 'w' : ' ',
3629 				       mas7_mas3 & MAS3_SR ? 'r' : ' ');
3630 		}
3631 	}
3632 }
3633 #endif /* CONFIG_PPC_BOOK3E */
3634 
3635 static void xmon_init(int enable)
3636 {
3637 	if (enable) {
3638 		__debugger = xmon;
3639 		__debugger_ipi = xmon_ipi;
3640 		__debugger_bpt = xmon_bpt;
3641 		__debugger_sstep = xmon_sstep;
3642 		__debugger_iabr_match = xmon_iabr_match;
3643 		__debugger_break_match = xmon_break_match;
3644 		__debugger_fault_handler = xmon_fault_handler;
3645 	} else {
3646 		__debugger = NULL;
3647 		__debugger_ipi = NULL;
3648 		__debugger_bpt = NULL;
3649 		__debugger_sstep = NULL;
3650 		__debugger_iabr_match = NULL;
3651 		__debugger_break_match = NULL;
3652 		__debugger_fault_handler = NULL;
3653 	}
3654 }
3655 
3656 #ifdef CONFIG_MAGIC_SYSRQ
3657 static void sysrq_handle_xmon(int key)
3658 {
3659 	/* ensure xmon is enabled */
3660 	xmon_init(1);
3661 	debugger(get_irq_regs());
3662 	if (!xmon_on)
3663 		xmon_init(0);
3664 }
3665 
3666 static struct sysrq_key_op sysrq_xmon_op = {
3667 	.handler =	sysrq_handle_xmon,
3668 	.help_msg =	"xmon(x)",
3669 	.action_msg =	"Entering xmon",
3670 };
3671 
3672 static int __init setup_xmon_sysrq(void)
3673 {
3674 	register_sysrq_key('x', &sysrq_xmon_op);
3675 	return 0;
3676 }
3677 device_initcall(setup_xmon_sysrq);
3678 #endif /* CONFIG_MAGIC_SYSRQ */
3679 
3680 #ifdef CONFIG_DEBUG_FS
3681 static void clear_all_bpt(void)
3682 {
3683 	int i;
3684 
3685 	/* clear/unpatch all breakpoints */
3686 	remove_bpts();
3687 	remove_cpu_bpts();
3688 
3689 	/* Disable all breakpoints */
3690 	for (i = 0; i < NBPTS; ++i)
3691 		bpts[i].enabled = 0;
3692 
3693 	/* Clear any data or iabr breakpoints */
3694 	if (iabr || dabr.enabled) {
3695 		iabr = NULL;
3696 		dabr.enabled = 0;
3697 	}
3698 
3699 	printf("xmon: All breakpoints cleared\n");
3700 }
3701 
3702 static int xmon_dbgfs_set(void *data, u64 val)
3703 {
3704 	xmon_on = !!val;
3705 	xmon_init(xmon_on);
3706 
3707 	/* make sure all breakpoints removed when disabling */
3708 	if (!xmon_on)
3709 		clear_all_bpt();
3710 	return 0;
3711 }
3712 
3713 static int xmon_dbgfs_get(void *data, u64 *val)
3714 {
3715 	*val = xmon_on;
3716 	return 0;
3717 }
3718 
3719 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
3720 			xmon_dbgfs_set, "%llu\n");
3721 
3722 static int __init setup_xmon_dbgfs(void)
3723 {
3724 	debugfs_create_file("xmon", 0600, powerpc_debugfs_root, NULL,
3725 				&xmon_dbgfs_ops);
3726 	return 0;
3727 }
3728 device_initcall(setup_xmon_dbgfs);
3729 #endif /* CONFIG_DEBUG_FS */
3730 
3731 static int xmon_early __initdata;
3732 
3733 static int __init early_parse_xmon(char *p)
3734 {
3735 	if (!p || strncmp(p, "early", 5) == 0) {
3736 		/* just "xmon" is equivalent to "xmon=early" */
3737 		xmon_init(1);
3738 		xmon_early = 1;
3739 		xmon_on = 1;
3740 	} else if (strncmp(p, "on", 2) == 0) {
3741 		xmon_init(1);
3742 		xmon_on = 1;
3743 	} else if (strncmp(p, "off", 3) == 0)
3744 		xmon_on = 0;
3745 	else
3746 		return 1;
3747 
3748 	return 0;
3749 }
3750 early_param("xmon", early_parse_xmon);
3751 
3752 void __init xmon_setup(void)
3753 {
3754 	if (xmon_on)
3755 		xmon_init(1);
3756 	if (xmon_early)
3757 		debugger(NULL);
3758 }
3759 
3760 #ifdef CONFIG_SPU_BASE
3761 
3762 struct spu_info {
3763 	struct spu *spu;
3764 	u64 saved_mfc_sr1_RW;
3765 	u32 saved_spu_runcntl_RW;
3766 	unsigned long dump_addr;
3767 	u8 stopped_ok;
3768 };
3769 
3770 #define XMON_NUM_SPUS	16	/* Enough for current hardware */
3771 
3772 static struct spu_info spu_info[XMON_NUM_SPUS];
3773 
3774 void xmon_register_spus(struct list_head *list)
3775 {
3776 	struct spu *spu;
3777 
3778 	list_for_each_entry(spu, list, full_list) {
3779 		if (spu->number >= XMON_NUM_SPUS) {
3780 			WARN_ON(1);
3781 			continue;
3782 		}
3783 
3784 		spu_info[spu->number].spu = spu;
3785 		spu_info[spu->number].stopped_ok = 0;
3786 		spu_info[spu->number].dump_addr = (unsigned long)
3787 				spu_info[spu->number].spu->local_store;
3788 	}
3789 }
3790 
3791 static void stop_spus(void)
3792 {
3793 	struct spu *spu;
3794 	int i;
3795 	u64 tmp;
3796 
3797 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3798 		if (!spu_info[i].spu)
3799 			continue;
3800 
3801 		if (setjmp(bus_error_jmp) == 0) {
3802 			catch_memory_errors = 1;
3803 			sync();
3804 
3805 			spu = spu_info[i].spu;
3806 
3807 			spu_info[i].saved_spu_runcntl_RW =
3808 				in_be32(&spu->problem->spu_runcntl_RW);
3809 
3810 			tmp = spu_mfc_sr1_get(spu);
3811 			spu_info[i].saved_mfc_sr1_RW = tmp;
3812 
3813 			tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3814 			spu_mfc_sr1_set(spu, tmp);
3815 
3816 			sync();
3817 			__delay(200);
3818 
3819 			spu_info[i].stopped_ok = 1;
3820 
3821 			printf("Stopped spu %.2d (was %s)\n", i,
3822 					spu_info[i].saved_spu_runcntl_RW ?
3823 					"running" : "stopped");
3824 		} else {
3825 			catch_memory_errors = 0;
3826 			printf("*** Error stopping spu %.2d\n", i);
3827 		}
3828 		catch_memory_errors = 0;
3829 	}
3830 }
3831 
3832 static void restart_spus(void)
3833 {
3834 	struct spu *spu;
3835 	int i;
3836 
3837 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3838 		if (!spu_info[i].spu)
3839 			continue;
3840 
3841 		if (!spu_info[i].stopped_ok) {
3842 			printf("*** Error, spu %d was not successfully stopped"
3843 					", not restarting\n", i);
3844 			continue;
3845 		}
3846 
3847 		if (setjmp(bus_error_jmp) == 0) {
3848 			catch_memory_errors = 1;
3849 			sync();
3850 
3851 			spu = spu_info[i].spu;
3852 			spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3853 			out_be32(&spu->problem->spu_runcntl_RW,
3854 					spu_info[i].saved_spu_runcntl_RW);
3855 
3856 			sync();
3857 			__delay(200);
3858 
3859 			printf("Restarted spu %.2d\n", i);
3860 		} else {
3861 			catch_memory_errors = 0;
3862 			printf("*** Error restarting spu %.2d\n", i);
3863 		}
3864 		catch_memory_errors = 0;
3865 	}
3866 }
3867 
3868 #define DUMP_WIDTH	23
3869 #define DUMP_VALUE(format, field, value)				\
3870 do {									\
3871 	if (setjmp(bus_error_jmp) == 0) {				\
3872 		catch_memory_errors = 1;				\
3873 		sync();							\
3874 		printf("  %-*s = "format"\n", DUMP_WIDTH,		\
3875 				#field, value);				\
3876 		sync();							\
3877 		__delay(200);						\
3878 	} else {							\
3879 		catch_memory_errors = 0;				\
3880 		printf("  %-*s = *** Error reading field.\n",		\
3881 					DUMP_WIDTH, #field);		\
3882 	}								\
3883 	catch_memory_errors = 0;					\
3884 } while (0)
3885 
3886 #define DUMP_FIELD(obj, format, field)	\
3887 	DUMP_VALUE(format, field, obj->field)
3888 
3889 static void dump_spu_fields(struct spu *spu)
3890 {
3891 	printf("Dumping spu fields at address %p:\n", spu);
3892 
3893 	DUMP_FIELD(spu, "0x%x", number);
3894 	DUMP_FIELD(spu, "%s", name);
3895 	DUMP_FIELD(spu, "0x%lx", local_store_phys);
3896 	DUMP_FIELD(spu, "0x%p", local_store);
3897 	DUMP_FIELD(spu, "0x%lx", ls_size);
3898 	DUMP_FIELD(spu, "0x%x", node);
3899 	DUMP_FIELD(spu, "0x%lx", flags);
3900 	DUMP_FIELD(spu, "%llu", class_0_pending);
3901 	DUMP_FIELD(spu, "0x%llx", class_0_dar);
3902 	DUMP_FIELD(spu, "0x%llx", class_1_dar);
3903 	DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
3904 	DUMP_FIELD(spu, "0x%x", irqs[0]);
3905 	DUMP_FIELD(spu, "0x%x", irqs[1]);
3906 	DUMP_FIELD(spu, "0x%x", irqs[2]);
3907 	DUMP_FIELD(spu, "0x%x", slb_replace);
3908 	DUMP_FIELD(spu, "%d", pid);
3909 	DUMP_FIELD(spu, "0x%p", mm);
3910 	DUMP_FIELD(spu, "0x%p", ctx);
3911 	DUMP_FIELD(spu, "0x%p", rq);
3912 	DUMP_FIELD(spu, "0x%llx", timestamp);
3913 	DUMP_FIELD(spu, "0x%lx", problem_phys);
3914 	DUMP_FIELD(spu, "0x%p", problem);
3915 	DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
3916 			in_be32(&spu->problem->spu_runcntl_RW));
3917 	DUMP_VALUE("0x%x", problem->spu_status_R,
3918 			in_be32(&spu->problem->spu_status_R));
3919 	DUMP_VALUE("0x%x", problem->spu_npc_RW,
3920 			in_be32(&spu->problem->spu_npc_RW));
3921 	DUMP_FIELD(spu, "0x%p", priv2);
3922 	DUMP_FIELD(spu, "0x%p", pdata);
3923 }
3924 
3925 int
3926 spu_inst_dump(unsigned long adr, long count, int praddr)
3927 {
3928 	return generic_inst_dump(adr, count, praddr, print_insn_spu);
3929 }
3930 
3931 static void dump_spu_ls(unsigned long num, int subcmd)
3932 {
3933 	unsigned long offset, addr, ls_addr;
3934 
3935 	if (setjmp(bus_error_jmp) == 0) {
3936 		catch_memory_errors = 1;
3937 		sync();
3938 		ls_addr = (unsigned long)spu_info[num].spu->local_store;
3939 		sync();
3940 		__delay(200);
3941 	} else {
3942 		catch_memory_errors = 0;
3943 		printf("*** Error: accessing spu info for spu %ld\n", num);
3944 		return;
3945 	}
3946 	catch_memory_errors = 0;
3947 
3948 	if (scanhex(&offset))
3949 		addr = ls_addr + offset;
3950 	else
3951 		addr = spu_info[num].dump_addr;
3952 
3953 	if (addr >= ls_addr + LS_SIZE) {
3954 		printf("*** Error: address outside of local store\n");
3955 		return;
3956 	}
3957 
3958 	switch (subcmd) {
3959 	case 'i':
3960 		addr += spu_inst_dump(addr, 16, 1);
3961 		last_cmd = "sdi\n";
3962 		break;
3963 	default:
3964 		prdump(addr, 64);
3965 		addr += 64;
3966 		last_cmd = "sd\n";
3967 		break;
3968 	}
3969 
3970 	spu_info[num].dump_addr = addr;
3971 }
3972 
3973 static int do_spu_cmd(void)
3974 {
3975 	static unsigned long num = 0;
3976 	int cmd, subcmd = 0;
3977 
3978 	cmd = inchar();
3979 	switch (cmd) {
3980 	case 's':
3981 		stop_spus();
3982 		break;
3983 	case 'r':
3984 		restart_spus();
3985 		break;
3986 	case 'd':
3987 		subcmd = inchar();
3988 		if (isxdigit(subcmd) || subcmd == '\n')
3989 			termch = subcmd;
3990 	case 'f':
3991 		scanhex(&num);
3992 		if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
3993 			printf("*** Error: invalid spu number\n");
3994 			return 0;
3995 		}
3996 
3997 		switch (cmd) {
3998 		case 'f':
3999 			dump_spu_fields(spu_info[num].spu);
4000 			break;
4001 		default:
4002 			dump_spu_ls(num, subcmd);
4003 			break;
4004 		}
4005 
4006 		break;
4007 	default:
4008 		return -1;
4009 	}
4010 
4011 	return 0;
4012 }
4013 #else /* ! CONFIG_SPU_BASE */
4014 static int do_spu_cmd(void)
4015 {
4016 	return -1;
4017 }
4018 #endif
4019