xref: /openbmc/linux/arch/powerpc/xmon/xmon.c (revision c819e2cf)
1 /*
2  * Routines providing a simple monitor for use on the PowerMac.
3  *
4  * Copyright (C) 1996-2005 Paul Mackerras.
5  * Copyright (C) 2001 PPC64 Team, IBM Corp
6  * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
7  *
8  *      This program is free software; you can redistribute it and/or
9  *      modify it under the terms of the GNU General Public License
10  *      as published by the Free Software Foundation; either version
11  *      2 of the License, or (at your option) any later version.
12  */
13 #include <linux/errno.h>
14 #include <linux/sched.h>
15 #include <linux/smp.h>
16 #include <linux/mm.h>
17 #include <linux/reboot.h>
18 #include <linux/delay.h>
19 #include <linux/kallsyms.h>
20 #include <linux/kmsg_dump.h>
21 #include <linux/cpumask.h>
22 #include <linux/export.h>
23 #include <linux/sysrq.h>
24 #include <linux/interrupt.h>
25 #include <linux/irq.h>
26 #include <linux/bug.h>
27 #include <linux/nmi.h>
28 
29 #include <asm/ptrace.h>
30 #include <asm/string.h>
31 #include <asm/prom.h>
32 #include <asm/machdep.h>
33 #include <asm/xmon.h>
34 #include <asm/processor.h>
35 #include <asm/pgtable.h>
36 #include <asm/mmu.h>
37 #include <asm/mmu_context.h>
38 #include <asm/cputable.h>
39 #include <asm/rtas.h>
40 #include <asm/sstep.h>
41 #include <asm/irq_regs.h>
42 #include <asm/spu.h>
43 #include <asm/spu_priv1.h>
44 #include <asm/setjmp.h>
45 #include <asm/reg.h>
46 #include <asm/debug.h>
47 #include <asm/hw_breakpoint.h>
48 
49 #ifdef CONFIG_PPC64
50 #include <asm/hvcall.h>
51 #include <asm/paca.h>
52 #endif
53 
54 #if defined(CONFIG_PPC_SPLPAR)
55 #include <asm/plpar_wrappers.h>
56 #else
57 static inline long plapr_set_ciabr(unsigned long ciabr) {return 0; };
58 #endif
59 
60 #include "nonstdio.h"
61 #include "dis-asm.h"
62 
63 #ifdef CONFIG_SMP
64 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
65 static unsigned long xmon_taken = 1;
66 static int xmon_owner;
67 static int xmon_gate;
68 #else
69 #define xmon_owner 0
70 #endif /* CONFIG_SMP */
71 
72 static unsigned long in_xmon __read_mostly = 0;
73 
74 static unsigned long adrs;
75 static int size = 1;
76 #define MAX_DUMP (128 * 1024)
77 static unsigned long ndump = 64;
78 static unsigned long nidump = 16;
79 static unsigned long ncsum = 4096;
80 static int termch;
81 static char tmpstr[128];
82 
83 static long bus_error_jmp[JMP_BUF_LEN];
84 static int catch_memory_errors;
85 static long *xmon_fault_jmp[NR_CPUS];
86 
87 /* Breakpoint stuff */
88 struct bpt {
89 	unsigned long	address;
90 	unsigned int	instr[2];
91 	atomic_t	ref_count;
92 	int		enabled;
93 	unsigned long	pad;
94 };
95 
96 /* Bits in bpt.enabled */
97 #define BP_CIABR	1
98 #define BP_TRAP		2
99 #define BP_DABR		4
100 
101 #define NBPTS	256
102 static struct bpt bpts[NBPTS];
103 static struct bpt dabr;
104 static struct bpt *iabr;
105 static unsigned bpinstr = 0x7fe00008;	/* trap */
106 
107 #define BP_NUM(bp)	((bp) - bpts + 1)
108 
109 /* Prototypes */
110 static int cmds(struct pt_regs *);
111 static int mread(unsigned long, void *, int);
112 static int mwrite(unsigned long, void *, int);
113 static int handle_fault(struct pt_regs *);
114 static void byterev(unsigned char *, int);
115 static void memex(void);
116 static int bsesc(void);
117 static void dump(void);
118 static void prdump(unsigned long, long);
119 static int ppc_inst_dump(unsigned long, long, int);
120 static void dump_log_buf(void);
121 static void backtrace(struct pt_regs *);
122 static void excprint(struct pt_regs *);
123 static void prregs(struct pt_regs *);
124 static void memops(int);
125 static void memlocate(void);
126 static void memzcan(void);
127 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
128 int skipbl(void);
129 int scanhex(unsigned long *valp);
130 static void scannl(void);
131 static int hexdigit(int);
132 void getstring(char *, int);
133 static void flush_input(void);
134 static int inchar(void);
135 static void take_input(char *);
136 static unsigned long read_spr(int);
137 static void write_spr(int, unsigned long);
138 static void super_regs(void);
139 static void remove_bpts(void);
140 static void insert_bpts(void);
141 static void remove_cpu_bpts(void);
142 static void insert_cpu_bpts(void);
143 static struct bpt *at_breakpoint(unsigned long pc);
144 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
145 static int  do_step(struct pt_regs *);
146 static void bpt_cmds(void);
147 static void cacheflush(void);
148 static int  cpu_cmd(void);
149 static void csum(void);
150 static void bootcmds(void);
151 static void proccall(void);
152 void dump_segments(void);
153 static void symbol_lookup(void);
154 static void xmon_show_stack(unsigned long sp, unsigned long lr,
155 			    unsigned long pc);
156 static void xmon_print_symbol(unsigned long address, const char *mid,
157 			      const char *after);
158 static const char *getvecname(unsigned long vec);
159 
160 static int do_spu_cmd(void);
161 
162 #ifdef CONFIG_44x
163 static void dump_tlb_44x(void);
164 #endif
165 #ifdef CONFIG_PPC_BOOK3E
166 static void dump_tlb_book3e(void);
167 #endif
168 
169 static int xmon_no_auto_backtrace;
170 
171 extern void xmon_enter(void);
172 extern void xmon_leave(void);
173 
174 #ifdef CONFIG_PPC64
175 #define REG		"%.16lx"
176 #else
177 #define REG		"%.8lx"
178 #endif
179 
180 #ifdef __LITTLE_ENDIAN__
181 #define GETWORD(v)	(((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
182 #else
183 #define GETWORD(v)	(((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
184 #endif
185 
186 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
187 			 || ('a' <= (c) && (c) <= 'f') \
188 			 || ('A' <= (c) && (c) <= 'F'))
189 #define isalnum(c)	(('0' <= (c) && (c) <= '9') \
190 			 || ('a' <= (c) && (c) <= 'z') \
191 			 || ('A' <= (c) && (c) <= 'Z'))
192 #define isspace(c)	(c == ' ' || c == '\t' || c == 10 || c == 13 || c == 0)
193 
194 static char *help_string = "\
195 Commands:\n\
196   b	show breakpoints\n\
197   bd	set data breakpoint\n\
198   bi	set instruction breakpoint\n\
199   bc	clear breakpoint\n"
200 #ifdef CONFIG_SMP
201   "\
202   c	print cpus stopped in xmon\n\
203   c#	try to switch to cpu number h (in hex)\n"
204 #endif
205   "\
206   C	checksum\n\
207   d	dump bytes\n\
208   di	dump instructions\n\
209   df	dump float values\n\
210   dd	dump double values\n\
211   dl    dump the kernel log buffer\n"
212 #ifdef CONFIG_PPC64
213   "\
214   dp[#]	dump paca for current cpu, or cpu #\n\
215   dpa	dump paca for all possible cpus\n"
216 #endif
217   "\
218   dr	dump stream of raw bytes\n\
219   e	print exception information\n\
220   f	flush cache\n\
221   la	lookup symbol+offset of specified address\n\
222   ls	lookup address of specified symbol\n\
223   m	examine/change memory\n\
224   mm	move a block of memory\n\
225   ms	set a block of memory\n\
226   md	compare two blocks of memory\n\
227   ml	locate a block of memory\n\
228   mz	zero a block of memory\n\
229   mi	show information about memory allocation\n\
230   p 	call a procedure\n\
231   r	print registers\n\
232   s	single step\n"
233 #ifdef CONFIG_SPU_BASE
234 "  ss	stop execution on all spus\n\
235   sr	restore execution on stopped spus\n\
236   sf  #	dump spu fields for spu # (in hex)\n\
237   sd  #	dump spu local store for spu # (in hex)\n\
238   sdi #	disassemble spu local store for spu # (in hex)\n"
239 #endif
240 "  S	print special registers\n\
241   t	print backtrace\n\
242   x	exit monitor and recover\n\
243   X	exit monitor and dont recover\n"
244 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
245 "  u	dump segment table or SLB\n"
246 #elif defined(CONFIG_PPC_STD_MMU_32)
247 "  u	dump segment registers\n"
248 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
249 "  u	dump TLB\n"
250 #endif
251 "  ?	help\n"
252 "  zr	reboot\n\
253   zh	halt\n"
254 ;
255 
256 static struct pt_regs *xmon_regs;
257 
258 static inline void sync(void)
259 {
260 	asm volatile("sync; isync");
261 }
262 
263 static inline void store_inst(void *p)
264 {
265 	asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
266 }
267 
268 static inline void cflush(void *p)
269 {
270 	asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
271 }
272 
273 static inline void cinval(void *p)
274 {
275 	asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
276 }
277 
278 /**
279  * write_ciabr() - write the CIABR SPR
280  * @ciabr:	The value to write.
281  *
282  * This function writes a value to the CIARB register either directly
283  * through mtspr instruction if the kernel is in HV privilege mode or
284  * call a hypervisor function to achieve the same in case the kernel
285  * is in supervisor privilege mode.
286  */
287 static void write_ciabr(unsigned long ciabr)
288 {
289 	if (!cpu_has_feature(CPU_FTR_ARCH_207S))
290 		return;
291 
292 	if (cpu_has_feature(CPU_FTR_HVMODE)) {
293 		mtspr(SPRN_CIABR, ciabr);
294 		return;
295 	}
296 	plapr_set_ciabr(ciabr);
297 }
298 
299 /**
300  * set_ciabr() - set the CIABR
301  * @addr:	The value to set.
302  *
303  * This function sets the correct privilege value into the the HW
304  * breakpoint address before writing it up in the CIABR register.
305  */
306 static void set_ciabr(unsigned long addr)
307 {
308 	addr &= ~CIABR_PRIV;
309 
310 	if (cpu_has_feature(CPU_FTR_HVMODE))
311 		addr |= CIABR_PRIV_HYPER;
312 	else
313 		addr |= CIABR_PRIV_SUPER;
314 	write_ciabr(addr);
315 }
316 
317 /*
318  * Disable surveillance (the service processor watchdog function)
319  * while we are in xmon.
320  * XXX we should re-enable it when we leave. :)
321  */
322 #define SURVEILLANCE_TOKEN	9000
323 
324 static inline void disable_surveillance(void)
325 {
326 #ifdef CONFIG_PPC_PSERIES
327 	/* Since this can't be a module, args should end up below 4GB. */
328 	static struct rtas_args args;
329 
330 	/*
331 	 * At this point we have got all the cpus we can into
332 	 * xmon, so there is hopefully no other cpu calling RTAS
333 	 * at the moment, even though we don't take rtas.lock.
334 	 * If we did try to take rtas.lock there would be a
335 	 * real possibility of deadlock.
336 	 */
337 	args.token = rtas_token("set-indicator");
338 	if (args.token == RTAS_UNKNOWN_SERVICE)
339 		return;
340 	args.token = cpu_to_be32(args.token);
341 	args.nargs = cpu_to_be32(3);
342 	args.nret = cpu_to_be32(1);
343 	args.rets = &args.args[3];
344 	args.args[0] = cpu_to_be32(SURVEILLANCE_TOKEN);
345 	args.args[1] = 0;
346 	args.args[2] = 0;
347 	enter_rtas(__pa(&args));
348 #endif /* CONFIG_PPC_PSERIES */
349 }
350 
351 #ifdef CONFIG_SMP
352 static int xmon_speaker;
353 
354 static void get_output_lock(void)
355 {
356 	int me = smp_processor_id() + 0x100;
357 	int last_speaker = 0, prev;
358 	long timeout;
359 
360 	if (xmon_speaker == me)
361 		return;
362 
363 	for (;;) {
364 		last_speaker = cmpxchg(&xmon_speaker, 0, me);
365 		if (last_speaker == 0)
366 			return;
367 
368 		/*
369 		 * Wait a full second for the lock, we might be on a slow
370 		 * console, but check every 100us.
371 		 */
372 		timeout = 10000;
373 		while (xmon_speaker == last_speaker) {
374 			if (--timeout > 0) {
375 				udelay(100);
376 				continue;
377 			}
378 
379 			/* hostile takeover */
380 			prev = cmpxchg(&xmon_speaker, last_speaker, me);
381 			if (prev == last_speaker)
382 				return;
383 			break;
384 		}
385 	}
386 }
387 
388 static void release_output_lock(void)
389 {
390 	xmon_speaker = 0;
391 }
392 
393 int cpus_are_in_xmon(void)
394 {
395 	return !cpumask_empty(&cpus_in_xmon);
396 }
397 #endif
398 
399 static inline int unrecoverable_excp(struct pt_regs *regs)
400 {
401 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
402 	/* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
403 	return 0;
404 #else
405 	return ((regs->msr & MSR_RI) == 0);
406 #endif
407 }
408 
409 static int xmon_core(struct pt_regs *regs, int fromipi)
410 {
411 	int cmd = 0;
412 	struct bpt *bp;
413 	long recurse_jmp[JMP_BUF_LEN];
414 	unsigned long offset;
415 	unsigned long flags;
416 #ifdef CONFIG_SMP
417 	int cpu;
418 	int secondary;
419 	unsigned long timeout;
420 #endif
421 
422 	local_irq_save(flags);
423 	hard_irq_disable();
424 
425 	bp = in_breakpoint_table(regs->nip, &offset);
426 	if (bp != NULL) {
427 		regs->nip = bp->address + offset;
428 		atomic_dec(&bp->ref_count);
429 	}
430 
431 	remove_cpu_bpts();
432 
433 #ifdef CONFIG_SMP
434 	cpu = smp_processor_id();
435 	if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
436 		get_output_lock();
437 		excprint(regs);
438 		printf("cpu 0x%x: Exception %lx %s in xmon, "
439 		       "returning to main loop\n",
440 		       cpu, regs->trap, getvecname(TRAP(regs)));
441 		release_output_lock();
442 		longjmp(xmon_fault_jmp[cpu], 1);
443 	}
444 
445 	if (setjmp(recurse_jmp) != 0) {
446 		if (!in_xmon || !xmon_gate) {
447 			get_output_lock();
448 			printf("xmon: WARNING: bad recursive fault "
449 			       "on cpu 0x%x\n", cpu);
450 			release_output_lock();
451 			goto waiting;
452 		}
453 		secondary = !(xmon_taken && cpu == xmon_owner);
454 		goto cmdloop;
455 	}
456 
457 	xmon_fault_jmp[cpu] = recurse_jmp;
458 
459 	bp = NULL;
460 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
461 		bp = at_breakpoint(regs->nip);
462 	if (bp || unrecoverable_excp(regs))
463 		fromipi = 0;
464 
465 	if (!fromipi) {
466 		get_output_lock();
467 		excprint(regs);
468 		if (bp) {
469 			printf("cpu 0x%x stopped at breakpoint 0x%lx (",
470 			       cpu, BP_NUM(bp));
471 			xmon_print_symbol(regs->nip, " ", ")\n");
472 		}
473 		if (unrecoverable_excp(regs))
474 			printf("WARNING: exception is not recoverable, "
475 			       "can't continue\n");
476 		release_output_lock();
477 	}
478 
479 	cpumask_set_cpu(cpu, &cpus_in_xmon);
480 
481  waiting:
482 	secondary = 1;
483 	while (secondary && !xmon_gate) {
484 		if (in_xmon == 0) {
485 			if (fromipi)
486 				goto leave;
487 			secondary = test_and_set_bit(0, &in_xmon);
488 		}
489 		barrier();
490 	}
491 
492 	if (!secondary && !xmon_gate) {
493 		/* we are the first cpu to come in */
494 		/* interrupt other cpu(s) */
495 		int ncpus = num_online_cpus();
496 
497 		xmon_owner = cpu;
498 		mb();
499 		if (ncpus > 1) {
500 			smp_send_debugger_break();
501 			/* wait for other cpus to come in */
502 			for (timeout = 100000000; timeout != 0; --timeout) {
503 				if (cpumask_weight(&cpus_in_xmon) >= ncpus)
504 					break;
505 				barrier();
506 			}
507 		}
508 		remove_bpts();
509 		disable_surveillance();
510 		/* for breakpoint or single step, print the current instr. */
511 		if (bp || TRAP(regs) == 0xd00)
512 			ppc_inst_dump(regs->nip, 1, 0);
513 		printf("enter ? for help\n");
514 		mb();
515 		xmon_gate = 1;
516 		barrier();
517 	}
518 
519  cmdloop:
520 	while (in_xmon) {
521 		if (secondary) {
522 			if (cpu == xmon_owner) {
523 				if (!test_and_set_bit(0, &xmon_taken)) {
524 					secondary = 0;
525 					continue;
526 				}
527 				/* missed it */
528 				while (cpu == xmon_owner)
529 					barrier();
530 			}
531 			barrier();
532 		} else {
533 			cmd = cmds(regs);
534 			if (cmd != 0) {
535 				/* exiting xmon */
536 				insert_bpts();
537 				xmon_gate = 0;
538 				wmb();
539 				in_xmon = 0;
540 				break;
541 			}
542 			/* have switched to some other cpu */
543 			secondary = 1;
544 		}
545 	}
546  leave:
547 	cpumask_clear_cpu(cpu, &cpus_in_xmon);
548 	xmon_fault_jmp[cpu] = NULL;
549 #else
550 	/* UP is simple... */
551 	if (in_xmon) {
552 		printf("Exception %lx %s in xmon, returning to main loop\n",
553 		       regs->trap, getvecname(TRAP(regs)));
554 		longjmp(xmon_fault_jmp[0], 1);
555 	}
556 	if (setjmp(recurse_jmp) == 0) {
557 		xmon_fault_jmp[0] = recurse_jmp;
558 		in_xmon = 1;
559 
560 		excprint(regs);
561 		bp = at_breakpoint(regs->nip);
562 		if (bp) {
563 			printf("Stopped at breakpoint %lx (", BP_NUM(bp));
564 			xmon_print_symbol(regs->nip, " ", ")\n");
565 		}
566 		if (unrecoverable_excp(regs))
567 			printf("WARNING: exception is not recoverable, "
568 			       "can't continue\n");
569 		remove_bpts();
570 		disable_surveillance();
571 		/* for breakpoint or single step, print the current instr. */
572 		if (bp || TRAP(regs) == 0xd00)
573 			ppc_inst_dump(regs->nip, 1, 0);
574 		printf("enter ? for help\n");
575 	}
576 
577 	cmd = cmds(regs);
578 
579 	insert_bpts();
580 	in_xmon = 0;
581 #endif
582 
583 #ifdef CONFIG_BOOKE
584 	if (regs->msr & MSR_DE) {
585 		bp = at_breakpoint(regs->nip);
586 		if (bp != NULL) {
587 			regs->nip = (unsigned long) &bp->instr[0];
588 			atomic_inc(&bp->ref_count);
589 		}
590 	}
591 #else
592 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
593 		bp = at_breakpoint(regs->nip);
594 		if (bp != NULL) {
595 			int stepped = emulate_step(regs, bp->instr[0]);
596 			if (stepped == 0) {
597 				regs->nip = (unsigned long) &bp->instr[0];
598 				atomic_inc(&bp->ref_count);
599 			} else if (stepped < 0) {
600 				printf("Couldn't single-step %s instruction\n",
601 				    (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
602 			}
603 		}
604 	}
605 #endif
606 	insert_cpu_bpts();
607 
608 	touch_nmi_watchdog();
609 	local_irq_restore(flags);
610 
611 	return cmd != 'X' && cmd != EOF;
612 }
613 
614 int xmon(struct pt_regs *excp)
615 {
616 	struct pt_regs regs;
617 
618 	if (excp == NULL) {
619 		ppc_save_regs(&regs);
620 		excp = &regs;
621 	}
622 
623 	return xmon_core(excp, 0);
624 }
625 EXPORT_SYMBOL(xmon);
626 
627 irqreturn_t xmon_irq(int irq, void *d)
628 {
629 	unsigned long flags;
630 	local_irq_save(flags);
631 	printf("Keyboard interrupt\n");
632 	xmon(get_irq_regs());
633 	local_irq_restore(flags);
634 	return IRQ_HANDLED;
635 }
636 
637 static int xmon_bpt(struct pt_regs *regs)
638 {
639 	struct bpt *bp;
640 	unsigned long offset;
641 
642 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
643 		return 0;
644 
645 	/* Are we at the trap at bp->instr[1] for some bp? */
646 	bp = in_breakpoint_table(regs->nip, &offset);
647 	if (bp != NULL && offset == 4) {
648 		regs->nip = bp->address + 4;
649 		atomic_dec(&bp->ref_count);
650 		return 1;
651 	}
652 
653 	/* Are we at a breakpoint? */
654 	bp = at_breakpoint(regs->nip);
655 	if (!bp)
656 		return 0;
657 
658 	xmon_core(regs, 0);
659 
660 	return 1;
661 }
662 
663 static int xmon_sstep(struct pt_regs *regs)
664 {
665 	if (user_mode(regs))
666 		return 0;
667 	xmon_core(regs, 0);
668 	return 1;
669 }
670 
671 static int xmon_break_match(struct pt_regs *regs)
672 {
673 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
674 		return 0;
675 	if (dabr.enabled == 0)
676 		return 0;
677 	xmon_core(regs, 0);
678 	return 1;
679 }
680 
681 static int xmon_iabr_match(struct pt_regs *regs)
682 {
683 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
684 		return 0;
685 	if (iabr == NULL)
686 		return 0;
687 	xmon_core(regs, 0);
688 	return 1;
689 }
690 
691 static int xmon_ipi(struct pt_regs *regs)
692 {
693 #ifdef CONFIG_SMP
694 	if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
695 		xmon_core(regs, 1);
696 #endif
697 	return 0;
698 }
699 
700 static int xmon_fault_handler(struct pt_regs *regs)
701 {
702 	struct bpt *bp;
703 	unsigned long offset;
704 
705 	if (in_xmon && catch_memory_errors)
706 		handle_fault(regs);	/* doesn't return */
707 
708 	if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
709 		bp = in_breakpoint_table(regs->nip, &offset);
710 		if (bp != NULL) {
711 			regs->nip = bp->address + offset;
712 			atomic_dec(&bp->ref_count);
713 		}
714 	}
715 
716 	return 0;
717 }
718 
719 static struct bpt *at_breakpoint(unsigned long pc)
720 {
721 	int i;
722 	struct bpt *bp;
723 
724 	bp = bpts;
725 	for (i = 0; i < NBPTS; ++i, ++bp)
726 		if (bp->enabled && pc == bp->address)
727 			return bp;
728 	return NULL;
729 }
730 
731 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
732 {
733 	unsigned long off;
734 
735 	off = nip - (unsigned long) bpts;
736 	if (off >= sizeof(bpts))
737 		return NULL;
738 	off %= sizeof(struct bpt);
739 	if (off != offsetof(struct bpt, instr[0])
740 	    && off != offsetof(struct bpt, instr[1]))
741 		return NULL;
742 	*offp = off - offsetof(struct bpt, instr[0]);
743 	return (struct bpt *) (nip - off);
744 }
745 
746 static struct bpt *new_breakpoint(unsigned long a)
747 {
748 	struct bpt *bp;
749 
750 	a &= ~3UL;
751 	bp = at_breakpoint(a);
752 	if (bp)
753 		return bp;
754 
755 	for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
756 		if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
757 			bp->address = a;
758 			bp->instr[1] = bpinstr;
759 			store_inst(&bp->instr[1]);
760 			return bp;
761 		}
762 	}
763 
764 	printf("Sorry, no free breakpoints.  Please clear one first.\n");
765 	return NULL;
766 }
767 
768 static void insert_bpts(void)
769 {
770 	int i;
771 	struct bpt *bp;
772 
773 	bp = bpts;
774 	for (i = 0; i < NBPTS; ++i, ++bp) {
775 		if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
776 			continue;
777 		if (mread(bp->address, &bp->instr[0], 4) != 4) {
778 			printf("Couldn't read instruction at %lx, "
779 			       "disabling breakpoint there\n", bp->address);
780 			bp->enabled = 0;
781 			continue;
782 		}
783 		if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
784 			printf("Breakpoint at %lx is on an mtmsrd or rfid "
785 			       "instruction, disabling it\n", bp->address);
786 			bp->enabled = 0;
787 			continue;
788 		}
789 		store_inst(&bp->instr[0]);
790 		if (bp->enabled & BP_CIABR)
791 			continue;
792 		if (mwrite(bp->address, &bpinstr, 4) != 4) {
793 			printf("Couldn't write instruction at %lx, "
794 			       "disabling breakpoint there\n", bp->address);
795 			bp->enabled &= ~BP_TRAP;
796 			continue;
797 		}
798 		store_inst((void *)bp->address);
799 	}
800 }
801 
802 static void insert_cpu_bpts(void)
803 {
804 	struct arch_hw_breakpoint brk;
805 
806 	if (dabr.enabled) {
807 		brk.address = dabr.address;
808 		brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
809 		brk.len = 8;
810 		__set_breakpoint(&brk);
811 	}
812 
813 	if (iabr)
814 		set_ciabr(iabr->address);
815 }
816 
817 static void remove_bpts(void)
818 {
819 	int i;
820 	struct bpt *bp;
821 	unsigned instr;
822 
823 	bp = bpts;
824 	for (i = 0; i < NBPTS; ++i, ++bp) {
825 		if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
826 			continue;
827 		if (mread(bp->address, &instr, 4) == 4
828 		    && instr == bpinstr
829 		    && mwrite(bp->address, &bp->instr, 4) != 4)
830 			printf("Couldn't remove breakpoint at %lx\n",
831 			       bp->address);
832 		else
833 			store_inst((void *)bp->address);
834 	}
835 }
836 
837 static void remove_cpu_bpts(void)
838 {
839 	hw_breakpoint_disable();
840 	write_ciabr(0);
841 }
842 
843 /* Command interpreting routine */
844 static char *last_cmd;
845 
846 static int
847 cmds(struct pt_regs *excp)
848 {
849 	int cmd = 0;
850 
851 	last_cmd = NULL;
852 	xmon_regs = excp;
853 
854 	if (!xmon_no_auto_backtrace) {
855 		xmon_no_auto_backtrace = 1;
856 		xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
857 	}
858 
859 	for(;;) {
860 #ifdef CONFIG_SMP
861 		printf("%x:", smp_processor_id());
862 #endif /* CONFIG_SMP */
863 		printf("mon> ");
864 		flush_input();
865 		termch = 0;
866 		cmd = skipbl();
867 		if( cmd == '\n' ) {
868 			if (last_cmd == NULL)
869 				continue;
870 			take_input(last_cmd);
871 			last_cmd = NULL;
872 			cmd = inchar();
873 		}
874 		switch (cmd) {
875 		case 'm':
876 			cmd = inchar();
877 			switch (cmd) {
878 			case 'm':
879 			case 's':
880 			case 'd':
881 				memops(cmd);
882 				break;
883 			case 'l':
884 				memlocate();
885 				break;
886 			case 'z':
887 				memzcan();
888 				break;
889 			case 'i':
890 				show_mem(0);
891 				break;
892 			default:
893 				termch = cmd;
894 				memex();
895 			}
896 			break;
897 		case 'd':
898 			dump();
899 			break;
900 		case 'l':
901 			symbol_lookup();
902 			break;
903 		case 'r':
904 			prregs(excp);	/* print regs */
905 			break;
906 		case 'e':
907 			excprint(excp);
908 			break;
909 		case 'S':
910 			super_regs();
911 			break;
912 		case 't':
913 			backtrace(excp);
914 			break;
915 		case 'f':
916 			cacheflush();
917 			break;
918 		case 's':
919 			if (do_spu_cmd() == 0)
920 				break;
921 			if (do_step(excp))
922 				return cmd;
923 			break;
924 		case 'x':
925 		case 'X':
926 			return cmd;
927 		case EOF:
928 			printf(" <no input ...>\n");
929 			mdelay(2000);
930 			return cmd;
931 		case '?':
932 			xmon_puts(help_string);
933 			break;
934 		case 'b':
935 			bpt_cmds();
936 			break;
937 		case 'C':
938 			csum();
939 			break;
940 		case 'c':
941 			if (cpu_cmd())
942 				return 0;
943 			break;
944 		case 'z':
945 			bootcmds();
946 			break;
947 		case 'p':
948 			proccall();
949 			break;
950 #ifdef CONFIG_PPC_STD_MMU
951 		case 'u':
952 			dump_segments();
953 			break;
954 #elif defined(CONFIG_44x)
955 		case 'u':
956 			dump_tlb_44x();
957 			break;
958 #elif defined(CONFIG_PPC_BOOK3E)
959 		case 'u':
960 			dump_tlb_book3e();
961 			break;
962 #endif
963 		default:
964 			printf("Unrecognized command: ");
965 			do {
966 				if (' ' < cmd && cmd <= '~')
967 					putchar(cmd);
968 				else
969 					printf("\\x%x", cmd);
970 				cmd = inchar();
971 			} while (cmd != '\n');
972 			printf(" (type ? for help)\n");
973 			break;
974 		}
975 	}
976 }
977 
978 #ifdef CONFIG_BOOKE
979 static int do_step(struct pt_regs *regs)
980 {
981 	regs->msr |= MSR_DE;
982 	mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
983 	return 1;
984 }
985 #else
986 /*
987  * Step a single instruction.
988  * Some instructions we emulate, others we execute with MSR_SE set.
989  */
990 static int do_step(struct pt_regs *regs)
991 {
992 	unsigned int instr;
993 	int stepped;
994 
995 	/* check we are in 64-bit kernel mode, translation enabled */
996 	if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
997 		if (mread(regs->nip, &instr, 4) == 4) {
998 			stepped = emulate_step(regs, instr);
999 			if (stepped < 0) {
1000 				printf("Couldn't single-step %s instruction\n",
1001 				       (IS_RFID(instr)? "rfid": "mtmsrd"));
1002 				return 0;
1003 			}
1004 			if (stepped > 0) {
1005 				regs->trap = 0xd00 | (regs->trap & 1);
1006 				printf("stepped to ");
1007 				xmon_print_symbol(regs->nip, " ", "\n");
1008 				ppc_inst_dump(regs->nip, 1, 0);
1009 				return 0;
1010 			}
1011 		}
1012 	}
1013 	regs->msr |= MSR_SE;
1014 	return 1;
1015 }
1016 #endif
1017 
1018 static void bootcmds(void)
1019 {
1020 	int cmd;
1021 
1022 	cmd = inchar();
1023 	if (cmd == 'r')
1024 		ppc_md.restart(NULL);
1025 	else if (cmd == 'h')
1026 		ppc_md.halt();
1027 	else if (cmd == 'p')
1028 		if (pm_power_off)
1029 			pm_power_off();
1030 }
1031 
1032 static int cpu_cmd(void)
1033 {
1034 #ifdef CONFIG_SMP
1035 	unsigned long cpu, first_cpu, last_cpu;
1036 	int timeout;
1037 
1038 	if (!scanhex(&cpu)) {
1039 		/* print cpus waiting or in xmon */
1040 		printf("cpus stopped:");
1041 		last_cpu = first_cpu = NR_CPUS;
1042 		for_each_possible_cpu(cpu) {
1043 			if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1044 				if (cpu == last_cpu + 1) {
1045 					last_cpu = cpu;
1046 				} else {
1047 					if (last_cpu != first_cpu)
1048 						printf("-0x%lx", last_cpu);
1049 					last_cpu = first_cpu = cpu;
1050 					printf(" 0x%lx", cpu);
1051 				}
1052 			}
1053 		}
1054 		if (last_cpu != first_cpu)
1055 			printf("-0x%lx", last_cpu);
1056 		printf("\n");
1057 		return 0;
1058 	}
1059 	/* try to switch to cpu specified */
1060 	if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1061 		printf("cpu 0x%x isn't in xmon\n", cpu);
1062 		return 0;
1063 	}
1064 	xmon_taken = 0;
1065 	mb();
1066 	xmon_owner = cpu;
1067 	timeout = 10000000;
1068 	while (!xmon_taken) {
1069 		if (--timeout == 0) {
1070 			if (test_and_set_bit(0, &xmon_taken))
1071 				break;
1072 			/* take control back */
1073 			mb();
1074 			xmon_owner = smp_processor_id();
1075 			printf("cpu 0x%x didn't take control\n", cpu);
1076 			return 0;
1077 		}
1078 		barrier();
1079 	}
1080 	return 1;
1081 #else
1082 	return 0;
1083 #endif /* CONFIG_SMP */
1084 }
1085 
1086 static unsigned short fcstab[256] = {
1087 	0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1088 	0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1089 	0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1090 	0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1091 	0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1092 	0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1093 	0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1094 	0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1095 	0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1096 	0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1097 	0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1098 	0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1099 	0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1100 	0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1101 	0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1102 	0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1103 	0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1104 	0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1105 	0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1106 	0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1107 	0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1108 	0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1109 	0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1110 	0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1111 	0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1112 	0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1113 	0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1114 	0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1115 	0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1116 	0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1117 	0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1118 	0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1119 };
1120 
1121 #define FCS(fcs, c)	(((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1122 
1123 static void
1124 csum(void)
1125 {
1126 	unsigned int i;
1127 	unsigned short fcs;
1128 	unsigned char v;
1129 
1130 	if (!scanhex(&adrs))
1131 		return;
1132 	if (!scanhex(&ncsum))
1133 		return;
1134 	fcs = 0xffff;
1135 	for (i = 0; i < ncsum; ++i) {
1136 		if (mread(adrs+i, &v, 1) == 0) {
1137 			printf("csum stopped at "REG"\n", adrs+i);
1138 			break;
1139 		}
1140 		fcs = FCS(fcs, v);
1141 	}
1142 	printf("%x\n", fcs);
1143 }
1144 
1145 /*
1146  * Check if this is a suitable place to put a breakpoint.
1147  */
1148 static long check_bp_loc(unsigned long addr)
1149 {
1150 	unsigned int instr;
1151 
1152 	addr &= ~3;
1153 	if (!is_kernel_addr(addr)) {
1154 		printf("Breakpoints may only be placed at kernel addresses\n");
1155 		return 0;
1156 	}
1157 	if (!mread(addr, &instr, sizeof(instr))) {
1158 		printf("Can't read instruction at address %lx\n", addr);
1159 		return 0;
1160 	}
1161 	if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1162 		printf("Breakpoints may not be placed on mtmsrd or rfid "
1163 		       "instructions\n");
1164 		return 0;
1165 	}
1166 	return 1;
1167 }
1168 
1169 static char *breakpoint_help_string =
1170     "Breakpoint command usage:\n"
1171     "b                show breakpoints\n"
1172     "b <addr> [cnt]   set breakpoint at given instr addr\n"
1173     "bc               clear all breakpoints\n"
1174     "bc <n/addr>      clear breakpoint number n or at addr\n"
1175     "bi <addr> [cnt]  set hardware instr breakpoint (POWER8 only)\n"
1176     "bd <addr> [cnt]  set hardware data breakpoint\n"
1177     "";
1178 
1179 static void
1180 bpt_cmds(void)
1181 {
1182 	int cmd;
1183 	unsigned long a;
1184 	int mode, i;
1185 	struct bpt *bp;
1186 	const char badaddr[] = "Only kernel addresses are permitted "
1187 		"for breakpoints\n";
1188 
1189 	cmd = inchar();
1190 	switch (cmd) {
1191 #ifndef CONFIG_8xx
1192 	case 'd':	/* bd - hardware data breakpoint */
1193 		mode = 7;
1194 		cmd = inchar();
1195 		if (cmd == 'r')
1196 			mode = 5;
1197 		else if (cmd == 'w')
1198 			mode = 6;
1199 		else
1200 			termch = cmd;
1201 		dabr.address = 0;
1202 		dabr.enabled = 0;
1203 		if (scanhex(&dabr.address)) {
1204 			if (!is_kernel_addr(dabr.address)) {
1205 				printf(badaddr);
1206 				break;
1207 			}
1208 			dabr.address &= ~HW_BRK_TYPE_DABR;
1209 			dabr.enabled = mode | BP_DABR;
1210 		}
1211 		break;
1212 
1213 	case 'i':	/* bi - hardware instr breakpoint */
1214 		if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1215 			printf("Hardware instruction breakpoint "
1216 			       "not supported on this cpu\n");
1217 			break;
1218 		}
1219 		if (iabr) {
1220 			iabr->enabled &= ~BP_CIABR;
1221 			iabr = NULL;
1222 		}
1223 		if (!scanhex(&a))
1224 			break;
1225 		if (!check_bp_loc(a))
1226 			break;
1227 		bp = new_breakpoint(a);
1228 		if (bp != NULL) {
1229 			bp->enabled |= BP_CIABR;
1230 			iabr = bp;
1231 		}
1232 		break;
1233 #endif
1234 
1235 	case 'c':
1236 		if (!scanhex(&a)) {
1237 			/* clear all breakpoints */
1238 			for (i = 0; i < NBPTS; ++i)
1239 				bpts[i].enabled = 0;
1240 			iabr = NULL;
1241 			dabr.enabled = 0;
1242 			printf("All breakpoints cleared\n");
1243 			break;
1244 		}
1245 
1246 		if (a <= NBPTS && a >= 1) {
1247 			/* assume a breakpoint number */
1248 			bp = &bpts[a-1];	/* bp nums are 1 based */
1249 		} else {
1250 			/* assume a breakpoint address */
1251 			bp = at_breakpoint(a);
1252 			if (bp == NULL) {
1253 				printf("No breakpoint at %lx\n", a);
1254 				break;
1255 			}
1256 		}
1257 
1258 		printf("Cleared breakpoint %lx (", BP_NUM(bp));
1259 		xmon_print_symbol(bp->address, " ", ")\n");
1260 		bp->enabled = 0;
1261 		break;
1262 
1263 	default:
1264 		termch = cmd;
1265 		cmd = skipbl();
1266 		if (cmd == '?') {
1267 			printf(breakpoint_help_string);
1268 			break;
1269 		}
1270 		termch = cmd;
1271 		if (!scanhex(&a)) {
1272 			/* print all breakpoints */
1273 			printf("   type            address\n");
1274 			if (dabr.enabled) {
1275 				printf("   data   "REG"  [", dabr.address);
1276 				if (dabr.enabled & 1)
1277 					printf("r");
1278 				if (dabr.enabled & 2)
1279 					printf("w");
1280 				printf("]\n");
1281 			}
1282 			for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1283 				if (!bp->enabled)
1284 					continue;
1285 				printf("%2x %s   ", BP_NUM(bp),
1286 				    (bp->enabled & BP_CIABR) ? "inst": "trap");
1287 				xmon_print_symbol(bp->address, "  ", "\n");
1288 			}
1289 			break;
1290 		}
1291 
1292 		if (!check_bp_loc(a))
1293 			break;
1294 		bp = new_breakpoint(a);
1295 		if (bp != NULL)
1296 			bp->enabled |= BP_TRAP;
1297 		break;
1298 	}
1299 }
1300 
1301 /* Very cheap human name for vector lookup. */
1302 static
1303 const char *getvecname(unsigned long vec)
1304 {
1305 	char *ret;
1306 
1307 	switch (vec) {
1308 	case 0x100:	ret = "(System Reset)"; break;
1309 	case 0x200:	ret = "(Machine Check)"; break;
1310 	case 0x300:	ret = "(Data Access)"; break;
1311 	case 0x380:	ret = "(Data SLB Access)"; break;
1312 	case 0x400:	ret = "(Instruction Access)"; break;
1313 	case 0x480:	ret = "(Instruction SLB Access)"; break;
1314 	case 0x500:	ret = "(Hardware Interrupt)"; break;
1315 	case 0x600:	ret = "(Alignment)"; break;
1316 	case 0x700:	ret = "(Program Check)"; break;
1317 	case 0x800:	ret = "(FPU Unavailable)"; break;
1318 	case 0x900:	ret = "(Decrementer)"; break;
1319 	case 0x980:	ret = "(Hypervisor Decrementer)"; break;
1320 	case 0xa00:	ret = "(Doorbell)"; break;
1321 	case 0xc00:	ret = "(System Call)"; break;
1322 	case 0xd00:	ret = "(Single Step)"; break;
1323 	case 0xe40:	ret = "(Emulation Assist)"; break;
1324 	case 0xe60:	ret = "(HMI)"; break;
1325 	case 0xe80:	ret = "(Hypervisor Doorbell)"; break;
1326 	case 0xf00:	ret = "(Performance Monitor)"; break;
1327 	case 0xf20:	ret = "(Altivec Unavailable)"; break;
1328 	case 0x1300:	ret = "(Instruction Breakpoint)"; break;
1329 	case 0x1500:	ret = "(Denormalisation)"; break;
1330 	case 0x1700:	ret = "(Altivec Assist)"; break;
1331 	default: ret = "";
1332 	}
1333 	return ret;
1334 }
1335 
1336 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1337 				unsigned long *endp)
1338 {
1339 	unsigned long size, offset;
1340 	const char *name;
1341 
1342 	*startp = *endp = 0;
1343 	if (pc == 0)
1344 		return;
1345 	if (setjmp(bus_error_jmp) == 0) {
1346 		catch_memory_errors = 1;
1347 		sync();
1348 		name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1349 		if (name != NULL) {
1350 			*startp = pc - offset;
1351 			*endp = pc - offset + size;
1352 		}
1353 		sync();
1354 	}
1355 	catch_memory_errors = 0;
1356 }
1357 
1358 #define LRSAVE_OFFSET		(STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1359 #define MARKER_OFFSET		(STACK_FRAME_MARKER * sizeof(unsigned long))
1360 
1361 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1362 			    unsigned long pc)
1363 {
1364 	int max_to_print = 64;
1365 	unsigned long ip;
1366 	unsigned long newsp;
1367 	unsigned long marker;
1368 	struct pt_regs regs;
1369 
1370 	while (max_to_print--) {
1371 		if (sp < PAGE_OFFSET) {
1372 			if (sp != 0)
1373 				printf("SP (%lx) is in userspace\n", sp);
1374 			break;
1375 		}
1376 
1377 		if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1378 		    || !mread(sp, &newsp, sizeof(unsigned long))) {
1379 			printf("Couldn't read stack frame at %lx\n", sp);
1380 			break;
1381 		}
1382 
1383 		/*
1384 		 * For the first stack frame, try to work out if
1385 		 * LR and/or the saved LR value in the bottommost
1386 		 * stack frame are valid.
1387 		 */
1388 		if ((pc | lr) != 0) {
1389 			unsigned long fnstart, fnend;
1390 			unsigned long nextip;
1391 			int printip = 1;
1392 
1393 			get_function_bounds(pc, &fnstart, &fnend);
1394 			nextip = 0;
1395 			if (newsp > sp)
1396 				mread(newsp + LRSAVE_OFFSET, &nextip,
1397 				      sizeof(unsigned long));
1398 			if (lr == ip) {
1399 				if (lr < PAGE_OFFSET
1400 				    || (fnstart <= lr && lr < fnend))
1401 					printip = 0;
1402 			} else if (lr == nextip) {
1403 				printip = 0;
1404 			} else if (lr >= PAGE_OFFSET
1405 				   && !(fnstart <= lr && lr < fnend)) {
1406 				printf("[link register   ] ");
1407 				xmon_print_symbol(lr, " ", "\n");
1408 			}
1409 			if (printip) {
1410 				printf("["REG"] ", sp);
1411 				xmon_print_symbol(ip, " ", " (unreliable)\n");
1412 			}
1413 			pc = lr = 0;
1414 
1415 		} else {
1416 			printf("["REG"] ", sp);
1417 			xmon_print_symbol(ip, " ", "\n");
1418 		}
1419 
1420 		/* Look for "regshere" marker to see if this is
1421 		   an exception frame. */
1422 		if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1423 		    && marker == STACK_FRAME_REGS_MARKER) {
1424 			if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1425 			    != sizeof(regs)) {
1426 				printf("Couldn't read registers at %lx\n",
1427 				       sp + STACK_FRAME_OVERHEAD);
1428 				break;
1429 			}
1430 			printf("--- Exception: %lx %s at ", regs.trap,
1431 			       getvecname(TRAP(&regs)));
1432 			pc = regs.nip;
1433 			lr = regs.link;
1434 			xmon_print_symbol(pc, " ", "\n");
1435 		}
1436 
1437 		if (newsp == 0)
1438 			break;
1439 
1440 		sp = newsp;
1441 	}
1442 }
1443 
1444 static void backtrace(struct pt_regs *excp)
1445 {
1446 	unsigned long sp;
1447 
1448 	if (scanhex(&sp))
1449 		xmon_show_stack(sp, 0, 0);
1450 	else
1451 		xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1452 	scannl();
1453 }
1454 
1455 static void print_bug_trap(struct pt_regs *regs)
1456 {
1457 #ifdef CONFIG_BUG
1458 	const struct bug_entry *bug;
1459 	unsigned long addr;
1460 
1461 	if (regs->msr & MSR_PR)
1462 		return;		/* not in kernel */
1463 	addr = regs->nip;	/* address of trap instruction */
1464 	if (addr < PAGE_OFFSET)
1465 		return;
1466 	bug = find_bug(regs->nip);
1467 	if (bug == NULL)
1468 		return;
1469 	if (is_warning_bug(bug))
1470 		return;
1471 
1472 #ifdef CONFIG_DEBUG_BUGVERBOSE
1473 	printf("kernel BUG at %s:%u!\n",
1474 	       bug->file, bug->line);
1475 #else
1476 	printf("kernel BUG at %p!\n", (void *)bug->bug_addr);
1477 #endif
1478 #endif /* CONFIG_BUG */
1479 }
1480 
1481 static void excprint(struct pt_regs *fp)
1482 {
1483 	unsigned long trap;
1484 
1485 #ifdef CONFIG_SMP
1486 	printf("cpu 0x%x: ", smp_processor_id());
1487 #endif /* CONFIG_SMP */
1488 
1489 	trap = TRAP(fp);
1490 	printf("Vector: %lx %s at [%lx]\n", fp->trap, getvecname(trap), fp);
1491 	printf("    pc: ");
1492 	xmon_print_symbol(fp->nip, ": ", "\n");
1493 
1494 	printf("    lr: ", fp->link);
1495 	xmon_print_symbol(fp->link, ": ", "\n");
1496 
1497 	printf("    sp: %lx\n", fp->gpr[1]);
1498 	printf("   msr: %lx\n", fp->msr);
1499 
1500 	if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1501 		printf("   dar: %lx\n", fp->dar);
1502 		if (trap != 0x380)
1503 			printf(" dsisr: %lx\n", fp->dsisr);
1504 	}
1505 
1506 	printf("  current = 0x%lx\n", current);
1507 #ifdef CONFIG_PPC64
1508 	printf("  paca    = 0x%lx\t softe: %d\t irq_happened: 0x%02x\n",
1509 	       local_paca, local_paca->soft_enabled, local_paca->irq_happened);
1510 #endif
1511 	if (current) {
1512 		printf("    pid   = %ld, comm = %s\n",
1513 		       current->pid, current->comm);
1514 	}
1515 
1516 	if (trap == 0x700)
1517 		print_bug_trap(fp);
1518 }
1519 
1520 static void prregs(struct pt_regs *fp)
1521 {
1522 	int n, trap;
1523 	unsigned long base;
1524 	struct pt_regs regs;
1525 
1526 	if (scanhex(&base)) {
1527 		if (setjmp(bus_error_jmp) == 0) {
1528 			catch_memory_errors = 1;
1529 			sync();
1530 			regs = *(struct pt_regs *)base;
1531 			sync();
1532 			__delay(200);
1533 		} else {
1534 			catch_memory_errors = 0;
1535 			printf("*** Error reading registers from "REG"\n",
1536 			       base);
1537 			return;
1538 		}
1539 		catch_memory_errors = 0;
1540 		fp = &regs;
1541 	}
1542 
1543 #ifdef CONFIG_PPC64
1544 	if (FULL_REGS(fp)) {
1545 		for (n = 0; n < 16; ++n)
1546 			printf("R%.2ld = "REG"   R%.2ld = "REG"\n",
1547 			       n, fp->gpr[n], n+16, fp->gpr[n+16]);
1548 	} else {
1549 		for (n = 0; n < 7; ++n)
1550 			printf("R%.2ld = "REG"   R%.2ld = "REG"\n",
1551 			       n, fp->gpr[n], n+7, fp->gpr[n+7]);
1552 	}
1553 #else
1554 	for (n = 0; n < 32; ++n) {
1555 		printf("R%.2d = %.8x%s", n, fp->gpr[n],
1556 		       (n & 3) == 3? "\n": "   ");
1557 		if (n == 12 && !FULL_REGS(fp)) {
1558 			printf("\n");
1559 			break;
1560 		}
1561 	}
1562 #endif
1563 	printf("pc  = ");
1564 	xmon_print_symbol(fp->nip, " ", "\n");
1565 	if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1566 		printf("cfar= ");
1567 		xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1568 	}
1569 	printf("lr  = ");
1570 	xmon_print_symbol(fp->link, " ", "\n");
1571 	printf("msr = "REG"   cr  = %.8lx\n", fp->msr, fp->ccr);
1572 	printf("ctr = "REG"   xer = "REG"   trap = %4lx\n",
1573 	       fp->ctr, fp->xer, fp->trap);
1574 	trap = TRAP(fp);
1575 	if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1576 		printf("dar = "REG"   dsisr = %.8lx\n", fp->dar, fp->dsisr);
1577 }
1578 
1579 static void cacheflush(void)
1580 {
1581 	int cmd;
1582 	unsigned long nflush;
1583 
1584 	cmd = inchar();
1585 	if (cmd != 'i')
1586 		termch = cmd;
1587 	scanhex((void *)&adrs);
1588 	if (termch != '\n')
1589 		termch = 0;
1590 	nflush = 1;
1591 	scanhex(&nflush);
1592 	nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1593 	if (setjmp(bus_error_jmp) == 0) {
1594 		catch_memory_errors = 1;
1595 		sync();
1596 
1597 		if (cmd != 'i') {
1598 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1599 				cflush((void *) adrs);
1600 		} else {
1601 			for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1602 				cinval((void *) adrs);
1603 		}
1604 		sync();
1605 		/* wait a little while to see if we get a machine check */
1606 		__delay(200);
1607 	}
1608 	catch_memory_errors = 0;
1609 }
1610 
1611 static unsigned long
1612 read_spr(int n)
1613 {
1614 	unsigned int instrs[2];
1615 	unsigned long (*code)(void);
1616 	unsigned long ret = -1UL;
1617 #ifdef CONFIG_PPC64
1618 	unsigned long opd[3];
1619 
1620 	opd[0] = (unsigned long)instrs;
1621 	opd[1] = 0;
1622 	opd[2] = 0;
1623 	code = (unsigned long (*)(void)) opd;
1624 #else
1625 	code = (unsigned long (*)(void)) instrs;
1626 #endif
1627 
1628 	/* mfspr r3,n; blr */
1629 	instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1630 	instrs[1] = 0x4e800020;
1631 	store_inst(instrs);
1632 	store_inst(instrs+1);
1633 
1634 	if (setjmp(bus_error_jmp) == 0) {
1635 		catch_memory_errors = 1;
1636 		sync();
1637 
1638 		ret = code();
1639 
1640 		sync();
1641 		/* wait a little while to see if we get a machine check */
1642 		__delay(200);
1643 		n = size;
1644 	}
1645 
1646 	return ret;
1647 }
1648 
1649 static void
1650 write_spr(int n, unsigned long val)
1651 {
1652 	unsigned int instrs[2];
1653 	unsigned long (*code)(unsigned long);
1654 #ifdef CONFIG_PPC64
1655 	unsigned long opd[3];
1656 
1657 	opd[0] = (unsigned long)instrs;
1658 	opd[1] = 0;
1659 	opd[2] = 0;
1660 	code = (unsigned long (*)(unsigned long)) opd;
1661 #else
1662 	code = (unsigned long (*)(unsigned long)) instrs;
1663 #endif
1664 
1665 	instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
1666 	instrs[1] = 0x4e800020;
1667 	store_inst(instrs);
1668 	store_inst(instrs+1);
1669 
1670 	if (setjmp(bus_error_jmp) == 0) {
1671 		catch_memory_errors = 1;
1672 		sync();
1673 
1674 		code(val);
1675 
1676 		sync();
1677 		/* wait a little while to see if we get a machine check */
1678 		__delay(200);
1679 		n = size;
1680 	}
1681 }
1682 
1683 static unsigned long regno;
1684 extern char exc_prolog;
1685 extern char dec_exc;
1686 
1687 static void super_regs(void)
1688 {
1689 	int cmd;
1690 	unsigned long val;
1691 
1692 	cmd = skipbl();
1693 	if (cmd == '\n') {
1694 		unsigned long sp, toc;
1695 		asm("mr %0,1" : "=r" (sp) :);
1696 		asm("mr %0,2" : "=r" (toc) :);
1697 
1698 		printf("msr  = "REG"  sprg0= "REG"\n",
1699 		       mfmsr(), mfspr(SPRN_SPRG0));
1700 		printf("pvr  = "REG"  sprg1= "REG"\n",
1701 		       mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1702 		printf("dec  = "REG"  sprg2= "REG"\n",
1703 		       mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1704 		printf("sp   = "REG"  sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3));
1705 		printf("toc  = "REG"  dar  = "REG"\n", toc, mfspr(SPRN_DAR));
1706 
1707 		return;
1708 	}
1709 
1710 	scanhex(&regno);
1711 	switch (cmd) {
1712 	case 'w':
1713 		val = read_spr(regno);
1714 		scanhex(&val);
1715 		write_spr(regno, val);
1716 		/* fall through */
1717 	case 'r':
1718 		printf("spr %lx = %lx\n", regno, read_spr(regno));
1719 		break;
1720 	}
1721 	scannl();
1722 }
1723 
1724 /*
1725  * Stuff for reading and writing memory safely
1726  */
1727 static int
1728 mread(unsigned long adrs, void *buf, int size)
1729 {
1730 	volatile int n;
1731 	char *p, *q;
1732 
1733 	n = 0;
1734 	if (setjmp(bus_error_jmp) == 0) {
1735 		catch_memory_errors = 1;
1736 		sync();
1737 		p = (char *)adrs;
1738 		q = (char *)buf;
1739 		switch (size) {
1740 		case 2:
1741 			*(u16 *)q = *(u16 *)p;
1742 			break;
1743 		case 4:
1744 			*(u32 *)q = *(u32 *)p;
1745 			break;
1746 		case 8:
1747 			*(u64 *)q = *(u64 *)p;
1748 			break;
1749 		default:
1750 			for( ; n < size; ++n) {
1751 				*q++ = *p++;
1752 				sync();
1753 			}
1754 		}
1755 		sync();
1756 		/* wait a little while to see if we get a machine check */
1757 		__delay(200);
1758 		n = size;
1759 	}
1760 	catch_memory_errors = 0;
1761 	return n;
1762 }
1763 
1764 static int
1765 mwrite(unsigned long adrs, void *buf, int size)
1766 {
1767 	volatile int n;
1768 	char *p, *q;
1769 
1770 	n = 0;
1771 	if (setjmp(bus_error_jmp) == 0) {
1772 		catch_memory_errors = 1;
1773 		sync();
1774 		p = (char *) adrs;
1775 		q = (char *) buf;
1776 		switch (size) {
1777 		case 2:
1778 			*(u16 *)p = *(u16 *)q;
1779 			break;
1780 		case 4:
1781 			*(u32 *)p = *(u32 *)q;
1782 			break;
1783 		case 8:
1784 			*(u64 *)p = *(u64 *)q;
1785 			break;
1786 		default:
1787 			for ( ; n < size; ++n) {
1788 				*p++ = *q++;
1789 				sync();
1790 			}
1791 		}
1792 		sync();
1793 		/* wait a little while to see if we get a machine check */
1794 		__delay(200);
1795 		n = size;
1796 	} else {
1797 		printf("*** Error writing address "REG"\n", adrs + n);
1798 	}
1799 	catch_memory_errors = 0;
1800 	return n;
1801 }
1802 
1803 static int fault_type;
1804 static int fault_except;
1805 static char *fault_chars[] = { "--", "**", "##" };
1806 
1807 static int handle_fault(struct pt_regs *regs)
1808 {
1809 	fault_except = TRAP(regs);
1810 	switch (TRAP(regs)) {
1811 	case 0x200:
1812 		fault_type = 0;
1813 		break;
1814 	case 0x300:
1815 	case 0x380:
1816 		fault_type = 1;
1817 		break;
1818 	default:
1819 		fault_type = 2;
1820 	}
1821 
1822 	longjmp(bus_error_jmp, 1);
1823 
1824 	return 0;
1825 }
1826 
1827 #define SWAP(a, b, t)	((t) = (a), (a) = (b), (b) = (t))
1828 
1829 static void
1830 byterev(unsigned char *val, int size)
1831 {
1832 	int t;
1833 
1834 	switch (size) {
1835 	case 2:
1836 		SWAP(val[0], val[1], t);
1837 		break;
1838 	case 4:
1839 		SWAP(val[0], val[3], t);
1840 		SWAP(val[1], val[2], t);
1841 		break;
1842 	case 8: /* is there really any use for this? */
1843 		SWAP(val[0], val[7], t);
1844 		SWAP(val[1], val[6], t);
1845 		SWAP(val[2], val[5], t);
1846 		SWAP(val[3], val[4], t);
1847 		break;
1848 	}
1849 }
1850 
1851 static int brev;
1852 static int mnoread;
1853 
1854 static char *memex_help_string =
1855     "Memory examine command usage:\n"
1856     "m [addr] [flags] examine/change memory\n"
1857     "  addr is optional.  will start where left off.\n"
1858     "  flags may include chars from this set:\n"
1859     "    b   modify by bytes (default)\n"
1860     "    w   modify by words (2 byte)\n"
1861     "    l   modify by longs (4 byte)\n"
1862     "    d   modify by doubleword (8 byte)\n"
1863     "    r   toggle reverse byte order mode\n"
1864     "    n   do not read memory (for i/o spaces)\n"
1865     "    .   ok to read (default)\n"
1866     "NOTE: flags are saved as defaults\n"
1867     "";
1868 
1869 static char *memex_subcmd_help_string =
1870     "Memory examine subcommands:\n"
1871     "  hexval   write this val to current location\n"
1872     "  'string' write chars from string to this location\n"
1873     "  '        increment address\n"
1874     "  ^        decrement address\n"
1875     "  /        increment addr by 0x10.  //=0x100, ///=0x1000, etc\n"
1876     "  \\        decrement addr by 0x10.  \\\\=0x100, \\\\\\=0x1000, etc\n"
1877     "  `        clear no-read flag\n"
1878     "  ;        stay at this addr\n"
1879     "  v        change to byte mode\n"
1880     "  w        change to word (2 byte) mode\n"
1881     "  l        change to long (4 byte) mode\n"
1882     "  u        change to doubleword (8 byte) mode\n"
1883     "  m addr   change current addr\n"
1884     "  n        toggle no-read flag\n"
1885     "  r        toggle byte reverse flag\n"
1886     "  < count  back up count bytes\n"
1887     "  > count  skip forward count bytes\n"
1888     "  x        exit this mode\n"
1889     "";
1890 
1891 static void
1892 memex(void)
1893 {
1894 	int cmd, inc, i, nslash;
1895 	unsigned long n;
1896 	unsigned char val[16];
1897 
1898 	scanhex((void *)&adrs);
1899 	cmd = skipbl();
1900 	if (cmd == '?') {
1901 		printf(memex_help_string);
1902 		return;
1903 	} else {
1904 		termch = cmd;
1905 	}
1906 	last_cmd = "m\n";
1907 	while ((cmd = skipbl()) != '\n') {
1908 		switch( cmd ){
1909 		case 'b':	size = 1;	break;
1910 		case 'w':	size = 2;	break;
1911 		case 'l':	size = 4;	break;
1912 		case 'd':	size = 8;	break;
1913 		case 'r': 	brev = !brev;	break;
1914 		case 'n':	mnoread = 1;	break;
1915 		case '.':	mnoread = 0;	break;
1916 		}
1917 	}
1918 	if( size <= 0 )
1919 		size = 1;
1920 	else if( size > 8 )
1921 		size = 8;
1922 	for(;;){
1923 		if (!mnoread)
1924 			n = mread(adrs, val, size);
1925 		printf(REG"%c", adrs, brev? 'r': ' ');
1926 		if (!mnoread) {
1927 			if (brev)
1928 				byterev(val, size);
1929 			putchar(' ');
1930 			for (i = 0; i < n; ++i)
1931 				printf("%.2x", val[i]);
1932 			for (; i < size; ++i)
1933 				printf("%s", fault_chars[fault_type]);
1934 		}
1935 		putchar(' ');
1936 		inc = size;
1937 		nslash = 0;
1938 		for(;;){
1939 			if( scanhex(&n) ){
1940 				for (i = 0; i < size; ++i)
1941 					val[i] = n >> (i * 8);
1942 				if (!brev)
1943 					byterev(val, size);
1944 				mwrite(adrs, val, size);
1945 				inc = size;
1946 			}
1947 			cmd = skipbl();
1948 			if (cmd == '\n')
1949 				break;
1950 			inc = 0;
1951 			switch (cmd) {
1952 			case '\'':
1953 				for(;;){
1954 					n = inchar();
1955 					if( n == '\\' )
1956 						n = bsesc();
1957 					else if( n == '\'' )
1958 						break;
1959 					for (i = 0; i < size; ++i)
1960 						val[i] = n >> (i * 8);
1961 					if (!brev)
1962 						byterev(val, size);
1963 					mwrite(adrs, val, size);
1964 					adrs += size;
1965 				}
1966 				adrs -= size;
1967 				inc = size;
1968 				break;
1969 			case ',':
1970 				adrs += size;
1971 				break;
1972 			case '.':
1973 				mnoread = 0;
1974 				break;
1975 			case ';':
1976 				break;
1977 			case 'x':
1978 			case EOF:
1979 				scannl();
1980 				return;
1981 			case 'b':
1982 			case 'v':
1983 				size = 1;
1984 				break;
1985 			case 'w':
1986 				size = 2;
1987 				break;
1988 			case 'l':
1989 				size = 4;
1990 				break;
1991 			case 'u':
1992 				size = 8;
1993 				break;
1994 			case '^':
1995 				adrs -= size;
1996 				break;
1997 				break;
1998 			case '/':
1999 				if (nslash > 0)
2000 					adrs -= 1 << nslash;
2001 				else
2002 					nslash = 0;
2003 				nslash += 4;
2004 				adrs += 1 << nslash;
2005 				break;
2006 			case '\\':
2007 				if (nslash < 0)
2008 					adrs += 1 << -nslash;
2009 				else
2010 					nslash = 0;
2011 				nslash -= 4;
2012 				adrs -= 1 << -nslash;
2013 				break;
2014 			case 'm':
2015 				scanhex((void *)&adrs);
2016 				break;
2017 			case 'n':
2018 				mnoread = 1;
2019 				break;
2020 			case 'r':
2021 				brev = !brev;
2022 				break;
2023 			case '<':
2024 				n = size;
2025 				scanhex(&n);
2026 				adrs -= n;
2027 				break;
2028 			case '>':
2029 				n = size;
2030 				scanhex(&n);
2031 				adrs += n;
2032 				break;
2033 			case '?':
2034 				printf(memex_subcmd_help_string);
2035 				break;
2036 			}
2037 		}
2038 		adrs += inc;
2039 	}
2040 }
2041 
2042 static int
2043 bsesc(void)
2044 {
2045 	int c;
2046 
2047 	c = inchar();
2048 	switch( c ){
2049 	case 'n':	c = '\n';	break;
2050 	case 'r':	c = '\r';	break;
2051 	case 'b':	c = '\b';	break;
2052 	case 't':	c = '\t';	break;
2053 	}
2054 	return c;
2055 }
2056 
2057 static void xmon_rawdump (unsigned long adrs, long ndump)
2058 {
2059 	long n, m, r, nr;
2060 	unsigned char temp[16];
2061 
2062 	for (n = ndump; n > 0;) {
2063 		r = n < 16? n: 16;
2064 		nr = mread(adrs, temp, r);
2065 		adrs += nr;
2066 		for (m = 0; m < r; ++m) {
2067 			if (m < nr)
2068 				printf("%.2x", temp[m]);
2069 			else
2070 				printf("%s", fault_chars[fault_type]);
2071 		}
2072 		n -= r;
2073 		if (nr < r)
2074 			break;
2075 	}
2076 	printf("\n");
2077 }
2078 
2079 #ifdef CONFIG_PPC64
2080 static void dump_one_paca(int cpu)
2081 {
2082 	struct paca_struct *p;
2083 
2084 	if (setjmp(bus_error_jmp) != 0) {
2085 		printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2086 		return;
2087 	}
2088 
2089 	catch_memory_errors = 1;
2090 	sync();
2091 
2092 	p = &paca[cpu];
2093 
2094 	printf("paca for cpu 0x%x @ %p:\n", cpu, p);
2095 
2096 	printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
2097 	printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
2098 	printf(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no");
2099 
2100 #define DUMP(paca, name, format) \
2101 	printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
2102 		offsetof(struct paca_struct, name));
2103 
2104 	DUMP(p, lock_token, "x");
2105 	DUMP(p, paca_index, "x");
2106 	DUMP(p, kernel_toc, "lx");
2107 	DUMP(p, kernelbase, "lx");
2108 	DUMP(p, kernel_msr, "lx");
2109 	DUMP(p, emergency_sp, "p");
2110 #ifdef CONFIG_PPC_BOOK3S_64
2111 	DUMP(p, mc_emergency_sp, "p");
2112 	DUMP(p, in_mce, "x");
2113 #endif
2114 	DUMP(p, data_offset, "lx");
2115 	DUMP(p, hw_cpu_id, "x");
2116 	DUMP(p, cpu_start, "x");
2117 	DUMP(p, kexec_state, "x");
2118 	DUMP(p, __current, "p");
2119 	DUMP(p, kstack, "lx");
2120 	DUMP(p, stab_rr, "lx");
2121 	DUMP(p, saved_r1, "lx");
2122 	DUMP(p, trap_save, "x");
2123 	DUMP(p, soft_enabled, "x");
2124 	DUMP(p, irq_happened, "x");
2125 	DUMP(p, io_sync, "x");
2126 	DUMP(p, irq_work_pending, "x");
2127 	DUMP(p, nap_state_lost, "x");
2128 
2129 #undef DUMP
2130 
2131 	catch_memory_errors = 0;
2132 	sync();
2133 }
2134 
2135 static void dump_all_pacas(void)
2136 {
2137 	int cpu;
2138 
2139 	if (num_possible_cpus() == 0) {
2140 		printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2141 		return;
2142 	}
2143 
2144 	for_each_possible_cpu(cpu)
2145 		dump_one_paca(cpu);
2146 }
2147 
2148 static void dump_pacas(void)
2149 {
2150 	unsigned long num;
2151 	int c;
2152 
2153 	c = inchar();
2154 	if (c == 'a') {
2155 		dump_all_pacas();
2156 		return;
2157 	}
2158 
2159 	termch = c;	/* Put c back, it wasn't 'a' */
2160 
2161 	if (scanhex(&num))
2162 		dump_one_paca(num);
2163 	else
2164 		dump_one_paca(xmon_owner);
2165 }
2166 #endif
2167 
2168 #define isxdigit(c)	(('0' <= (c) && (c) <= '9') \
2169 			 || ('a' <= (c) && (c) <= 'f') \
2170 			 || ('A' <= (c) && (c) <= 'F'))
2171 static void
2172 dump(void)
2173 {
2174 	int c;
2175 
2176 	c = inchar();
2177 
2178 #ifdef CONFIG_PPC64
2179 	if (c == 'p') {
2180 		dump_pacas();
2181 		return;
2182 	}
2183 #endif
2184 
2185 	if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n')
2186 		termch = c;
2187 	scanhex((void *)&adrs);
2188 	if (termch != '\n')
2189 		termch = 0;
2190 	if (c == 'i') {
2191 		scanhex(&nidump);
2192 		if (nidump == 0)
2193 			nidump = 16;
2194 		else if (nidump > MAX_DUMP)
2195 			nidump = MAX_DUMP;
2196 		adrs += ppc_inst_dump(adrs, nidump, 1);
2197 		last_cmd = "di\n";
2198 	} else if (c == 'l') {
2199 		dump_log_buf();
2200 	} else if (c == 'r') {
2201 		scanhex(&ndump);
2202 		if (ndump == 0)
2203 			ndump = 64;
2204 		xmon_rawdump(adrs, ndump);
2205 		adrs += ndump;
2206 		last_cmd = "dr\n";
2207 	} else {
2208 		scanhex(&ndump);
2209 		if (ndump == 0)
2210 			ndump = 64;
2211 		else if (ndump > MAX_DUMP)
2212 			ndump = MAX_DUMP;
2213 		prdump(adrs, ndump);
2214 		adrs += ndump;
2215 		last_cmd = "d\n";
2216 	}
2217 }
2218 
2219 static void
2220 prdump(unsigned long adrs, long ndump)
2221 {
2222 	long n, m, c, r, nr;
2223 	unsigned char temp[16];
2224 
2225 	for (n = ndump; n > 0;) {
2226 		printf(REG, adrs);
2227 		putchar(' ');
2228 		r = n < 16? n: 16;
2229 		nr = mread(adrs, temp, r);
2230 		adrs += nr;
2231 		for (m = 0; m < r; ++m) {
2232 			if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2233 				putchar(' ');
2234 			if (m < nr)
2235 				printf("%.2x", temp[m]);
2236 			else
2237 				printf("%s", fault_chars[fault_type]);
2238 		}
2239 		for (; m < 16; ++m) {
2240 			if ((m & (sizeof(long) - 1)) == 0)
2241 				putchar(' ');
2242 			printf("  ");
2243 		}
2244 		printf("  |");
2245 		for (m = 0; m < r; ++m) {
2246 			if (m < nr) {
2247 				c = temp[m];
2248 				putchar(' ' <= c && c <= '~'? c: '.');
2249 			} else
2250 				putchar(' ');
2251 		}
2252 		n -= r;
2253 		for (; m < 16; ++m)
2254 			putchar(' ');
2255 		printf("|\n");
2256 		if (nr < r)
2257 			break;
2258 	}
2259 }
2260 
2261 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
2262 
2263 static int
2264 generic_inst_dump(unsigned long adr, long count, int praddr,
2265 			instruction_dump_func dump_func)
2266 {
2267 	int nr, dotted;
2268 	unsigned long first_adr;
2269 	unsigned long inst, last_inst = 0;
2270 	unsigned char val[4];
2271 
2272 	dotted = 0;
2273 	for (first_adr = adr; count > 0; --count, adr += 4) {
2274 		nr = mread(adr, val, 4);
2275 		if (nr == 0) {
2276 			if (praddr) {
2277 				const char *x = fault_chars[fault_type];
2278 				printf(REG"  %s%s%s%s\n", adr, x, x, x, x);
2279 			}
2280 			break;
2281 		}
2282 		inst = GETWORD(val);
2283 		if (adr > first_adr && inst == last_inst) {
2284 			if (!dotted) {
2285 				printf(" ...\n");
2286 				dotted = 1;
2287 			}
2288 			continue;
2289 		}
2290 		dotted = 0;
2291 		last_inst = inst;
2292 		if (praddr)
2293 			printf(REG"  %.8x", adr, inst);
2294 		printf("\t");
2295 		dump_func(inst, adr);
2296 		printf("\n");
2297 	}
2298 	return adr - first_adr;
2299 }
2300 
2301 static int
2302 ppc_inst_dump(unsigned long adr, long count, int praddr)
2303 {
2304 	return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
2305 }
2306 
2307 void
2308 print_address(unsigned long addr)
2309 {
2310 	xmon_print_symbol(addr, "\t# ", "");
2311 }
2312 
2313 void
2314 dump_log_buf(void)
2315 {
2316 	struct kmsg_dumper dumper = { .active = 1 };
2317 	unsigned char buf[128];
2318 	size_t len;
2319 
2320 	if (setjmp(bus_error_jmp) != 0) {
2321 		printf("Error dumping printk buffer!\n");
2322 		return;
2323 	}
2324 
2325 	catch_memory_errors = 1;
2326 	sync();
2327 
2328 	kmsg_dump_rewind_nolock(&dumper);
2329 	while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
2330 		buf[len] = '\0';
2331 		printf("%s", buf);
2332 	}
2333 
2334 	sync();
2335 	/* wait a little while to see if we get a machine check */
2336 	__delay(200);
2337 	catch_memory_errors = 0;
2338 }
2339 
2340 /*
2341  * Memory operations - move, set, print differences
2342  */
2343 static unsigned long mdest;		/* destination address */
2344 static unsigned long msrc;		/* source address */
2345 static unsigned long mval;		/* byte value to set memory to */
2346 static unsigned long mcount;		/* # bytes to affect */
2347 static unsigned long mdiffs;		/* max # differences to print */
2348 
2349 static void
2350 memops(int cmd)
2351 {
2352 	scanhex((void *)&mdest);
2353 	if( termch != '\n' )
2354 		termch = 0;
2355 	scanhex((void *)(cmd == 's'? &mval: &msrc));
2356 	if( termch != '\n' )
2357 		termch = 0;
2358 	scanhex((void *)&mcount);
2359 	switch( cmd ){
2360 	case 'm':
2361 		memmove((void *)mdest, (void *)msrc, mcount);
2362 		break;
2363 	case 's':
2364 		memset((void *)mdest, mval, mcount);
2365 		break;
2366 	case 'd':
2367 		if( termch != '\n' )
2368 			termch = 0;
2369 		scanhex((void *)&mdiffs);
2370 		memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
2371 		break;
2372 	}
2373 }
2374 
2375 static void
2376 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
2377 {
2378 	unsigned n, prt;
2379 
2380 	prt = 0;
2381 	for( n = nb; n > 0; --n )
2382 		if( *p1++ != *p2++ )
2383 			if( ++prt <= maxpr )
2384 				printf("%.16x %.2x # %.16x %.2x\n", p1 - 1,
2385 					p1[-1], p2 - 1, p2[-1]);
2386 	if( prt > maxpr )
2387 		printf("Total of %d differences\n", prt);
2388 }
2389 
2390 static unsigned mend;
2391 static unsigned mask;
2392 
2393 static void
2394 memlocate(void)
2395 {
2396 	unsigned a, n;
2397 	unsigned char val[4];
2398 
2399 	last_cmd = "ml";
2400 	scanhex((void *)&mdest);
2401 	if (termch != '\n') {
2402 		termch = 0;
2403 		scanhex((void *)&mend);
2404 		if (termch != '\n') {
2405 			termch = 0;
2406 			scanhex((void *)&mval);
2407 			mask = ~0;
2408 			if (termch != '\n') termch = 0;
2409 			scanhex((void *)&mask);
2410 		}
2411 	}
2412 	n = 0;
2413 	for (a = mdest; a < mend; a += 4) {
2414 		if (mread(a, val, 4) == 4
2415 			&& ((GETWORD(val) ^ mval) & mask) == 0) {
2416 			printf("%.16x:  %.16x\n", a, GETWORD(val));
2417 			if (++n >= 10)
2418 				break;
2419 		}
2420 	}
2421 }
2422 
2423 static unsigned long mskip = 0x1000;
2424 static unsigned long mlim = 0xffffffff;
2425 
2426 static void
2427 memzcan(void)
2428 {
2429 	unsigned char v;
2430 	unsigned a;
2431 	int ok, ook;
2432 
2433 	scanhex(&mdest);
2434 	if (termch != '\n') termch = 0;
2435 	scanhex(&mskip);
2436 	if (termch != '\n') termch = 0;
2437 	scanhex(&mlim);
2438 	ook = 0;
2439 	for (a = mdest; a < mlim; a += mskip) {
2440 		ok = mread(a, &v, 1);
2441 		if (ok && !ook) {
2442 			printf("%.8x .. ", a);
2443 		} else if (!ok && ook)
2444 			printf("%.8x\n", a - mskip);
2445 		ook = ok;
2446 		if (a + mskip < a)
2447 			break;
2448 	}
2449 	if (ook)
2450 		printf("%.8x\n", a - mskip);
2451 }
2452 
2453 static void proccall(void)
2454 {
2455 	unsigned long args[8];
2456 	unsigned long ret;
2457 	int i;
2458 	typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
2459 			unsigned long, unsigned long, unsigned long,
2460 			unsigned long, unsigned long, unsigned long);
2461 	callfunc_t func;
2462 
2463 	if (!scanhex(&adrs))
2464 		return;
2465 	if (termch != '\n')
2466 		termch = 0;
2467 	for (i = 0; i < 8; ++i)
2468 		args[i] = 0;
2469 	for (i = 0; i < 8; ++i) {
2470 		if (!scanhex(&args[i]) || termch == '\n')
2471 			break;
2472 		termch = 0;
2473 	}
2474 	func = (callfunc_t) adrs;
2475 	ret = 0;
2476 	if (setjmp(bus_error_jmp) == 0) {
2477 		catch_memory_errors = 1;
2478 		sync();
2479 		ret = func(args[0], args[1], args[2], args[3],
2480 			   args[4], args[5], args[6], args[7]);
2481 		sync();
2482 		printf("return value is 0x%lx\n", ret);
2483 	} else {
2484 		printf("*** %x exception occurred\n", fault_except);
2485 	}
2486 	catch_memory_errors = 0;
2487 }
2488 
2489 /* Input scanning routines */
2490 int
2491 skipbl(void)
2492 {
2493 	int c;
2494 
2495 	if( termch != 0 ){
2496 		c = termch;
2497 		termch = 0;
2498 	} else
2499 		c = inchar();
2500 	while( c == ' ' || c == '\t' )
2501 		c = inchar();
2502 	return c;
2503 }
2504 
2505 #define N_PTREGS	44
2506 static char *regnames[N_PTREGS] = {
2507 	"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
2508 	"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
2509 	"r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
2510 	"r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
2511 	"pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
2512 #ifdef CONFIG_PPC64
2513 	"softe",
2514 #else
2515 	"mq",
2516 #endif
2517 	"trap", "dar", "dsisr", "res"
2518 };
2519 
2520 int
2521 scanhex(unsigned long *vp)
2522 {
2523 	int c, d;
2524 	unsigned long v;
2525 
2526 	c = skipbl();
2527 	if (c == '%') {
2528 		/* parse register name */
2529 		char regname[8];
2530 		int i;
2531 
2532 		for (i = 0; i < sizeof(regname) - 1; ++i) {
2533 			c = inchar();
2534 			if (!isalnum(c)) {
2535 				termch = c;
2536 				break;
2537 			}
2538 			regname[i] = c;
2539 		}
2540 		regname[i] = 0;
2541 		for (i = 0; i < N_PTREGS; ++i) {
2542 			if (strcmp(regnames[i], regname) == 0) {
2543 				if (xmon_regs == NULL) {
2544 					printf("regs not available\n");
2545 					return 0;
2546 				}
2547 				*vp = ((unsigned long *)xmon_regs)[i];
2548 				return 1;
2549 			}
2550 		}
2551 		printf("invalid register name '%%%s'\n", regname);
2552 		return 0;
2553 	}
2554 
2555 	/* skip leading "0x" if any */
2556 
2557 	if (c == '0') {
2558 		c = inchar();
2559 		if (c == 'x') {
2560 			c = inchar();
2561 		} else {
2562 			d = hexdigit(c);
2563 			if (d == EOF) {
2564 				termch = c;
2565 				*vp = 0;
2566 				return 1;
2567 			}
2568 		}
2569 	} else if (c == '$') {
2570 		int i;
2571 		for (i=0; i<63; i++) {
2572 			c = inchar();
2573 			if (isspace(c)) {
2574 				termch = c;
2575 				break;
2576 			}
2577 			tmpstr[i] = c;
2578 		}
2579 		tmpstr[i++] = 0;
2580 		*vp = 0;
2581 		if (setjmp(bus_error_jmp) == 0) {
2582 			catch_memory_errors = 1;
2583 			sync();
2584 			*vp = kallsyms_lookup_name(tmpstr);
2585 			sync();
2586 		}
2587 		catch_memory_errors = 0;
2588 		if (!(*vp)) {
2589 			printf("unknown symbol '%s'\n", tmpstr);
2590 			return 0;
2591 		}
2592 		return 1;
2593 	}
2594 
2595 	d = hexdigit(c);
2596 	if (d == EOF) {
2597 		termch = c;
2598 		return 0;
2599 	}
2600 	v = 0;
2601 	do {
2602 		v = (v << 4) + d;
2603 		c = inchar();
2604 		d = hexdigit(c);
2605 	} while (d != EOF);
2606 	termch = c;
2607 	*vp = v;
2608 	return 1;
2609 }
2610 
2611 static void
2612 scannl(void)
2613 {
2614 	int c;
2615 
2616 	c = termch;
2617 	termch = 0;
2618 	while( c != '\n' )
2619 		c = inchar();
2620 }
2621 
2622 static int hexdigit(int c)
2623 {
2624 	if( '0' <= c && c <= '9' )
2625 		return c - '0';
2626 	if( 'A' <= c && c <= 'F' )
2627 		return c - ('A' - 10);
2628 	if( 'a' <= c && c <= 'f' )
2629 		return c - ('a' - 10);
2630 	return EOF;
2631 }
2632 
2633 void
2634 getstring(char *s, int size)
2635 {
2636 	int c;
2637 
2638 	c = skipbl();
2639 	do {
2640 		if( size > 1 ){
2641 			*s++ = c;
2642 			--size;
2643 		}
2644 		c = inchar();
2645 	} while( c != ' ' && c != '\t' && c != '\n' );
2646 	termch = c;
2647 	*s = 0;
2648 }
2649 
2650 static char line[256];
2651 static char *lineptr;
2652 
2653 static void
2654 flush_input(void)
2655 {
2656 	lineptr = NULL;
2657 }
2658 
2659 static int
2660 inchar(void)
2661 {
2662 	if (lineptr == NULL || *lineptr == 0) {
2663 		if (xmon_gets(line, sizeof(line)) == NULL) {
2664 			lineptr = NULL;
2665 			return EOF;
2666 		}
2667 		lineptr = line;
2668 	}
2669 	return *lineptr++;
2670 }
2671 
2672 static void
2673 take_input(char *str)
2674 {
2675 	lineptr = str;
2676 }
2677 
2678 
2679 static void
2680 symbol_lookup(void)
2681 {
2682 	int type = inchar();
2683 	unsigned long addr;
2684 	static char tmp[64];
2685 
2686 	switch (type) {
2687 	case 'a':
2688 		if (scanhex(&addr))
2689 			xmon_print_symbol(addr, ": ", "\n");
2690 		termch = 0;
2691 		break;
2692 	case 's':
2693 		getstring(tmp, 64);
2694 		if (setjmp(bus_error_jmp) == 0) {
2695 			catch_memory_errors = 1;
2696 			sync();
2697 			addr = kallsyms_lookup_name(tmp);
2698 			if (addr)
2699 				printf("%s: %lx\n", tmp, addr);
2700 			else
2701 				printf("Symbol '%s' not found.\n", tmp);
2702 			sync();
2703 		}
2704 		catch_memory_errors = 0;
2705 		termch = 0;
2706 		break;
2707 	}
2708 }
2709 
2710 
2711 /* Print an address in numeric and symbolic form (if possible) */
2712 static void xmon_print_symbol(unsigned long address, const char *mid,
2713 			      const char *after)
2714 {
2715 	char *modname;
2716 	const char *name = NULL;
2717 	unsigned long offset, size;
2718 
2719 	printf(REG, address);
2720 	if (setjmp(bus_error_jmp) == 0) {
2721 		catch_memory_errors = 1;
2722 		sync();
2723 		name = kallsyms_lookup(address, &size, &offset, &modname,
2724 				       tmpstr);
2725 		sync();
2726 		/* wait a little while to see if we get a machine check */
2727 		__delay(200);
2728 	}
2729 
2730 	catch_memory_errors = 0;
2731 
2732 	if (name) {
2733 		printf("%s%s+%#lx/%#lx", mid, name, offset, size);
2734 		if (modname)
2735 			printf(" [%s]", modname);
2736 	}
2737 	printf("%s", after);
2738 }
2739 
2740 #ifdef CONFIG_PPC_BOOK3S_64
2741 void dump_segments(void)
2742 {
2743 	int i;
2744 	unsigned long esid,vsid,valid;
2745 	unsigned long llp;
2746 
2747 	printf("SLB contents of cpu 0x%x\n", smp_processor_id());
2748 
2749 	for (i = 0; i < mmu_slb_size; i++) {
2750 		asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
2751 		asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
2752 		valid = (esid & SLB_ESID_V);
2753 		if (valid | esid | vsid) {
2754 			printf("%02d %016lx %016lx", i, esid, vsid);
2755 			if (valid) {
2756 				llp = vsid & SLB_VSID_LLP;
2757 				if (vsid & SLB_VSID_B_1T) {
2758 					printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",
2759 						GET_ESID_1T(esid),
2760 						(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
2761 						llp);
2762 				} else {
2763 					printf(" 256M ESID=%9lx  VSID=%13lx LLP:%3lx \n",
2764 						GET_ESID(esid),
2765 						(vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
2766 						llp);
2767 				}
2768 			} else
2769 				printf("\n");
2770 		}
2771 	}
2772 }
2773 #endif
2774 
2775 #ifdef CONFIG_PPC_STD_MMU_32
2776 void dump_segments(void)
2777 {
2778 	int i;
2779 
2780 	printf("sr0-15 =");
2781 	for (i = 0; i < 16; ++i)
2782 		printf(" %x", mfsrin(i));
2783 	printf("\n");
2784 }
2785 #endif
2786 
2787 #ifdef CONFIG_44x
2788 static void dump_tlb_44x(void)
2789 {
2790 	int i;
2791 
2792 	for (i = 0; i < PPC44x_TLB_SIZE; i++) {
2793 		unsigned long w0,w1,w2;
2794 		asm volatile("tlbre  %0,%1,0" : "=r" (w0) : "r" (i));
2795 		asm volatile("tlbre  %0,%1,1" : "=r" (w1) : "r" (i));
2796 		asm volatile("tlbre  %0,%1,2" : "=r" (w2) : "r" (i));
2797 		printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
2798 		if (w0 & PPC44x_TLB_VALID) {
2799 			printf("V %08x -> %01x%08x %c%c%c%c%c",
2800 			       w0 & PPC44x_TLB_EPN_MASK,
2801 			       w1 & PPC44x_TLB_ERPN_MASK,
2802 			       w1 & PPC44x_TLB_RPN_MASK,
2803 			       (w2 & PPC44x_TLB_W) ? 'W' : 'w',
2804 			       (w2 & PPC44x_TLB_I) ? 'I' : 'i',
2805 			       (w2 & PPC44x_TLB_M) ? 'M' : 'm',
2806 			       (w2 & PPC44x_TLB_G) ? 'G' : 'g',
2807 			       (w2 & PPC44x_TLB_E) ? 'E' : 'e');
2808 		}
2809 		printf("\n");
2810 	}
2811 }
2812 #endif /* CONFIG_44x */
2813 
2814 #ifdef CONFIG_PPC_BOOK3E
2815 static void dump_tlb_book3e(void)
2816 {
2817 	u32 mmucfg, pidmask, lpidmask;
2818 	u64 ramask;
2819 	int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
2820 	int mmu_version;
2821 	static const char *pgsz_names[] = {
2822 		"  1K",
2823 		"  2K",
2824 		"  4K",
2825 		"  8K",
2826 		" 16K",
2827 		" 32K",
2828 		" 64K",
2829 		"128K",
2830 		"256K",
2831 		"512K",
2832 		"  1M",
2833 		"  2M",
2834 		"  4M",
2835 		"  8M",
2836 		" 16M",
2837 		" 32M",
2838 		" 64M",
2839 		"128M",
2840 		"256M",
2841 		"512M",
2842 		"  1G",
2843 		"  2G",
2844 		"  4G",
2845 		"  8G",
2846 		" 16G",
2847 		" 32G",
2848 		" 64G",
2849 		"128G",
2850 		"256G",
2851 		"512G",
2852 		"  1T",
2853 		"  2T",
2854 	};
2855 
2856 	/* Gather some infos about the MMU */
2857 	mmucfg = mfspr(SPRN_MMUCFG);
2858 	mmu_version = (mmucfg & 3) + 1;
2859 	ntlbs = ((mmucfg >> 2) & 3) + 1;
2860 	pidsz = ((mmucfg >> 6) & 0x1f) + 1;
2861 	lpidsz = (mmucfg >> 24) & 0xf;
2862 	rasz = (mmucfg >> 16) & 0x7f;
2863 	if ((mmu_version > 1) && (mmucfg & 0x10000))
2864 		lrat = 1;
2865 	printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
2866 	       mmu_version, ntlbs, pidsz, lpidsz, rasz);
2867 	pidmask = (1ul << pidsz) - 1;
2868 	lpidmask = (1ul << lpidsz) - 1;
2869 	ramask = (1ull << rasz) - 1;
2870 
2871 	for (tlb = 0; tlb < ntlbs; tlb++) {
2872 		u32 tlbcfg;
2873 		int nent, assoc, new_cc = 1;
2874 		printf("TLB %d:\n------\n", tlb);
2875 		switch(tlb) {
2876 		case 0:
2877 			tlbcfg = mfspr(SPRN_TLB0CFG);
2878 			break;
2879 		case 1:
2880 			tlbcfg = mfspr(SPRN_TLB1CFG);
2881 			break;
2882 		case 2:
2883 			tlbcfg = mfspr(SPRN_TLB2CFG);
2884 			break;
2885 		case 3:
2886 			tlbcfg = mfspr(SPRN_TLB3CFG);
2887 			break;
2888 		default:
2889 			printf("Unsupported TLB number !\n");
2890 			continue;
2891 		}
2892 		nent = tlbcfg & 0xfff;
2893 		assoc = (tlbcfg >> 24) & 0xff;
2894 		for (i = 0; i < nent; i++) {
2895 			u32 mas0 = MAS0_TLBSEL(tlb);
2896 			u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
2897 			u64 mas2 = 0;
2898 			u64 mas7_mas3;
2899 			int esel = i, cc = i;
2900 
2901 			if (assoc != 0) {
2902 				cc = i / assoc;
2903 				esel = i % assoc;
2904 				mas2 = cc * 0x1000;
2905 			}
2906 
2907 			mas0 |= MAS0_ESEL(esel);
2908 			mtspr(SPRN_MAS0, mas0);
2909 			mtspr(SPRN_MAS1, mas1);
2910 			mtspr(SPRN_MAS2, mas2);
2911 			asm volatile("tlbre  0,0,0" : : : "memory");
2912 			mas1 = mfspr(SPRN_MAS1);
2913 			mas2 = mfspr(SPRN_MAS2);
2914 			mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
2915 			if (assoc && (i % assoc) == 0)
2916 				new_cc = 1;
2917 			if (!(mas1 & MAS1_VALID))
2918 				continue;
2919 			if (assoc == 0)
2920 				printf("%04x- ", i);
2921 			else if (new_cc)
2922 				printf("%04x-%c", cc, 'A' + esel);
2923 			else
2924 				printf("    |%c", 'A' + esel);
2925 			new_cc = 0;
2926 			printf(" %016llx %04x %s %c%c AS%c",
2927 			       mas2 & ~0x3ffull,
2928 			       (mas1 >> 16) & 0x3fff,
2929 			       pgsz_names[(mas1 >> 7) & 0x1f],
2930 			       mas1 & MAS1_IND ? 'I' : ' ',
2931 			       mas1 & MAS1_IPROT ? 'P' : ' ',
2932 			       mas1 & MAS1_TS ? '1' : '0');
2933 			printf(" %c%c%c%c%c%c%c",
2934 			       mas2 & MAS2_X0 ? 'a' : ' ',
2935 			       mas2 & MAS2_X1 ? 'v' : ' ',
2936 			       mas2 & MAS2_W  ? 'w' : ' ',
2937 			       mas2 & MAS2_I  ? 'i' : ' ',
2938 			       mas2 & MAS2_M  ? 'm' : ' ',
2939 			       mas2 & MAS2_G  ? 'g' : ' ',
2940 			       mas2 & MAS2_E  ? 'e' : ' ');
2941 			printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
2942 			if (mas1 & MAS1_IND)
2943 				printf(" %s\n",
2944 				       pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
2945 			else
2946 				printf(" U%c%c%c S%c%c%c\n",
2947 				       mas7_mas3 & MAS3_UX ? 'x' : ' ',
2948 				       mas7_mas3 & MAS3_UW ? 'w' : ' ',
2949 				       mas7_mas3 & MAS3_UR ? 'r' : ' ',
2950 				       mas7_mas3 & MAS3_SX ? 'x' : ' ',
2951 				       mas7_mas3 & MAS3_SW ? 'w' : ' ',
2952 				       mas7_mas3 & MAS3_SR ? 'r' : ' ');
2953 		}
2954 	}
2955 }
2956 #endif /* CONFIG_PPC_BOOK3E */
2957 
2958 static void xmon_init(int enable)
2959 {
2960 	if (enable) {
2961 		__debugger = xmon;
2962 		__debugger_ipi = xmon_ipi;
2963 		__debugger_bpt = xmon_bpt;
2964 		__debugger_sstep = xmon_sstep;
2965 		__debugger_iabr_match = xmon_iabr_match;
2966 		__debugger_break_match = xmon_break_match;
2967 		__debugger_fault_handler = xmon_fault_handler;
2968 	} else {
2969 		__debugger = NULL;
2970 		__debugger_ipi = NULL;
2971 		__debugger_bpt = NULL;
2972 		__debugger_sstep = NULL;
2973 		__debugger_iabr_match = NULL;
2974 		__debugger_break_match = NULL;
2975 		__debugger_fault_handler = NULL;
2976 	}
2977 }
2978 
2979 #ifdef CONFIG_MAGIC_SYSRQ
2980 static void sysrq_handle_xmon(int key)
2981 {
2982 	/* ensure xmon is enabled */
2983 	xmon_init(1);
2984 	debugger(get_irq_regs());
2985 }
2986 
2987 static struct sysrq_key_op sysrq_xmon_op = {
2988 	.handler =	sysrq_handle_xmon,
2989 	.help_msg =	"xmon(x)",
2990 	.action_msg =	"Entering xmon",
2991 };
2992 
2993 static int __init setup_xmon_sysrq(void)
2994 {
2995 	register_sysrq_key('x', &sysrq_xmon_op);
2996 	return 0;
2997 }
2998 __initcall(setup_xmon_sysrq);
2999 #endif /* CONFIG_MAGIC_SYSRQ */
3000 
3001 static int __initdata xmon_early, xmon_off;
3002 
3003 static int __init early_parse_xmon(char *p)
3004 {
3005 	if (!p || strncmp(p, "early", 5) == 0) {
3006 		/* just "xmon" is equivalent to "xmon=early" */
3007 		xmon_init(1);
3008 		xmon_early = 1;
3009 	} else if (strncmp(p, "on", 2) == 0)
3010 		xmon_init(1);
3011 	else if (strncmp(p, "off", 3) == 0)
3012 		xmon_off = 1;
3013 	else if (strncmp(p, "nobt", 4) == 0)
3014 		xmon_no_auto_backtrace = 1;
3015 	else
3016 		return 1;
3017 
3018 	return 0;
3019 }
3020 early_param("xmon", early_parse_xmon);
3021 
3022 void __init xmon_setup(void)
3023 {
3024 #ifdef CONFIG_XMON_DEFAULT
3025 	if (!xmon_off)
3026 		xmon_init(1);
3027 #endif
3028 	if (xmon_early)
3029 		debugger(NULL);
3030 }
3031 
3032 #ifdef CONFIG_SPU_BASE
3033 
3034 struct spu_info {
3035 	struct spu *spu;
3036 	u64 saved_mfc_sr1_RW;
3037 	u32 saved_spu_runcntl_RW;
3038 	unsigned long dump_addr;
3039 	u8 stopped_ok;
3040 };
3041 
3042 #define XMON_NUM_SPUS	16	/* Enough for current hardware */
3043 
3044 static struct spu_info spu_info[XMON_NUM_SPUS];
3045 
3046 void xmon_register_spus(struct list_head *list)
3047 {
3048 	struct spu *spu;
3049 
3050 	list_for_each_entry(spu, list, full_list) {
3051 		if (spu->number >= XMON_NUM_SPUS) {
3052 			WARN_ON(1);
3053 			continue;
3054 		}
3055 
3056 		spu_info[spu->number].spu = spu;
3057 		spu_info[spu->number].stopped_ok = 0;
3058 		spu_info[spu->number].dump_addr = (unsigned long)
3059 				spu_info[spu->number].spu->local_store;
3060 	}
3061 }
3062 
3063 static void stop_spus(void)
3064 {
3065 	struct spu *spu;
3066 	int i;
3067 	u64 tmp;
3068 
3069 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3070 		if (!spu_info[i].spu)
3071 			continue;
3072 
3073 		if (setjmp(bus_error_jmp) == 0) {
3074 			catch_memory_errors = 1;
3075 			sync();
3076 
3077 			spu = spu_info[i].spu;
3078 
3079 			spu_info[i].saved_spu_runcntl_RW =
3080 				in_be32(&spu->problem->spu_runcntl_RW);
3081 
3082 			tmp = spu_mfc_sr1_get(spu);
3083 			spu_info[i].saved_mfc_sr1_RW = tmp;
3084 
3085 			tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
3086 			spu_mfc_sr1_set(spu, tmp);
3087 
3088 			sync();
3089 			__delay(200);
3090 
3091 			spu_info[i].stopped_ok = 1;
3092 
3093 			printf("Stopped spu %.2d (was %s)\n", i,
3094 					spu_info[i].saved_spu_runcntl_RW ?
3095 					"running" : "stopped");
3096 		} else {
3097 			catch_memory_errors = 0;
3098 			printf("*** Error stopping spu %.2d\n", i);
3099 		}
3100 		catch_memory_errors = 0;
3101 	}
3102 }
3103 
3104 static void restart_spus(void)
3105 {
3106 	struct spu *spu;
3107 	int i;
3108 
3109 	for (i = 0; i < XMON_NUM_SPUS; i++) {
3110 		if (!spu_info[i].spu)
3111 			continue;
3112 
3113 		if (!spu_info[i].stopped_ok) {
3114 			printf("*** Error, spu %d was not successfully stopped"
3115 					", not restarting\n", i);
3116 			continue;
3117 		}
3118 
3119 		if (setjmp(bus_error_jmp) == 0) {
3120 			catch_memory_errors = 1;
3121 			sync();
3122 
3123 			spu = spu_info[i].spu;
3124 			spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
3125 			out_be32(&spu->problem->spu_runcntl_RW,
3126 					spu_info[i].saved_spu_runcntl_RW);
3127 
3128 			sync();
3129 			__delay(200);
3130 
3131 			printf("Restarted spu %.2d\n", i);
3132 		} else {
3133 			catch_memory_errors = 0;
3134 			printf("*** Error restarting spu %.2d\n", i);
3135 		}
3136 		catch_memory_errors = 0;
3137 	}
3138 }
3139 
3140 #define DUMP_WIDTH	23
3141 #define DUMP_VALUE(format, field, value)				\
3142 do {									\
3143 	if (setjmp(bus_error_jmp) == 0) {				\
3144 		catch_memory_errors = 1;				\
3145 		sync();							\
3146 		printf("  %-*s = "format"\n", DUMP_WIDTH,		\
3147 				#field, value);				\
3148 		sync();							\
3149 		__delay(200);						\
3150 	} else {							\
3151 		catch_memory_errors = 0;				\
3152 		printf("  %-*s = *** Error reading field.\n",		\
3153 					DUMP_WIDTH, #field);		\
3154 	}								\
3155 	catch_memory_errors = 0;					\
3156 } while (0)
3157 
3158 #define DUMP_FIELD(obj, format, field)	\
3159 	DUMP_VALUE(format, field, obj->field)
3160 
3161 static void dump_spu_fields(struct spu *spu)
3162 {
3163 	printf("Dumping spu fields at address %p:\n", spu);
3164 
3165 	DUMP_FIELD(spu, "0x%x", number);
3166 	DUMP_FIELD(spu, "%s", name);
3167 	DUMP_FIELD(spu, "0x%lx", local_store_phys);
3168 	DUMP_FIELD(spu, "0x%p", local_store);
3169 	DUMP_FIELD(spu, "0x%lx", ls_size);
3170 	DUMP_FIELD(spu, "0x%x", node);
3171 	DUMP_FIELD(spu, "0x%lx", flags);
3172 	DUMP_FIELD(spu, "%d", class_0_pending);
3173 	DUMP_FIELD(spu, "0x%lx", class_0_dar);
3174 	DUMP_FIELD(spu, "0x%lx", class_1_dar);
3175 	DUMP_FIELD(spu, "0x%lx", class_1_dsisr);
3176 	DUMP_FIELD(spu, "0x%lx", irqs[0]);
3177 	DUMP_FIELD(spu, "0x%lx", irqs[1]);
3178 	DUMP_FIELD(spu, "0x%lx", irqs[2]);
3179 	DUMP_FIELD(spu, "0x%x", slb_replace);
3180 	DUMP_FIELD(spu, "%d", pid);
3181 	DUMP_FIELD(spu, "0x%p", mm);
3182 	DUMP_FIELD(spu, "0x%p", ctx);
3183 	DUMP_FIELD(spu, "0x%p", rq);
3184 	DUMP_FIELD(spu, "0x%p", timestamp);
3185 	DUMP_FIELD(spu, "0x%lx", problem_phys);
3186 	DUMP_FIELD(spu, "0x%p", problem);
3187 	DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
3188 			in_be32(&spu->problem->spu_runcntl_RW));
3189 	DUMP_VALUE("0x%x", problem->spu_status_R,
3190 			in_be32(&spu->problem->spu_status_R));
3191 	DUMP_VALUE("0x%x", problem->spu_npc_RW,
3192 			in_be32(&spu->problem->spu_npc_RW));
3193 	DUMP_FIELD(spu, "0x%p", priv2);
3194 	DUMP_FIELD(spu, "0x%p", pdata);
3195 }
3196 
3197 int
3198 spu_inst_dump(unsigned long adr, long count, int praddr)
3199 {
3200 	return generic_inst_dump(adr, count, praddr, print_insn_spu);
3201 }
3202 
3203 static void dump_spu_ls(unsigned long num, int subcmd)
3204 {
3205 	unsigned long offset, addr, ls_addr;
3206 
3207 	if (setjmp(bus_error_jmp) == 0) {
3208 		catch_memory_errors = 1;
3209 		sync();
3210 		ls_addr = (unsigned long)spu_info[num].spu->local_store;
3211 		sync();
3212 		__delay(200);
3213 	} else {
3214 		catch_memory_errors = 0;
3215 		printf("*** Error: accessing spu info for spu %d\n", num);
3216 		return;
3217 	}
3218 	catch_memory_errors = 0;
3219 
3220 	if (scanhex(&offset))
3221 		addr = ls_addr + offset;
3222 	else
3223 		addr = spu_info[num].dump_addr;
3224 
3225 	if (addr >= ls_addr + LS_SIZE) {
3226 		printf("*** Error: address outside of local store\n");
3227 		return;
3228 	}
3229 
3230 	switch (subcmd) {
3231 	case 'i':
3232 		addr += spu_inst_dump(addr, 16, 1);
3233 		last_cmd = "sdi\n";
3234 		break;
3235 	default:
3236 		prdump(addr, 64);
3237 		addr += 64;
3238 		last_cmd = "sd\n";
3239 		break;
3240 	}
3241 
3242 	spu_info[num].dump_addr = addr;
3243 }
3244 
3245 static int do_spu_cmd(void)
3246 {
3247 	static unsigned long num = 0;
3248 	int cmd, subcmd = 0;
3249 
3250 	cmd = inchar();
3251 	switch (cmd) {
3252 	case 's':
3253 		stop_spus();
3254 		break;
3255 	case 'r':
3256 		restart_spus();
3257 		break;
3258 	case 'd':
3259 		subcmd = inchar();
3260 		if (isxdigit(subcmd) || subcmd == '\n')
3261 			termch = subcmd;
3262 	case 'f':
3263 		scanhex(&num);
3264 		if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
3265 			printf("*** Error: invalid spu number\n");
3266 			return 0;
3267 		}
3268 
3269 		switch (cmd) {
3270 		case 'f':
3271 			dump_spu_fields(spu_info[num].spu);
3272 			break;
3273 		default:
3274 			dump_spu_ls(num, subcmd);
3275 			break;
3276 		}
3277 
3278 		break;
3279 	default:
3280 		return -1;
3281 	}
3282 
3283 	return 0;
3284 }
3285 #else /* ! CONFIG_SPU_BASE */
3286 static int do_spu_cmd(void)
3287 {
3288 	return -1;
3289 }
3290 #endif
3291