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