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