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