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