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