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