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