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