1b0149b2bb6c9236493a3c0eb2260fc6aeba6c8b
[linux-2.6-block.git] / arch / powerpc / xmon / xmon.c
1 /*
2  * Routines providing a simple monitor for use on the PowerMac.
3  *
4  * Copyright (C) 1996-2005 Paul Mackerras.
5  * Copyright (C) 2001 PPC64 Team, IBM Corp
6  * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
7  *
8  *      This program is free software; you can redistribute it and/or
9  *      modify it under the terms of the GNU General Public License
10  *      as published by the Free Software Foundation; either version
11  *      2 of the License, or (at your option) any later version.
12  */
13
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/sched/signal.h>
17 #include <linux/smp.h>
18 #include <linux/mm.h>
19 #include <linux/reboot.h>
20 #include <linux/delay.h>
21 #include <linux/kallsyms.h>
22 #include <linux/kmsg_dump.h>
23 #include <linux/cpumask.h>
24 #include <linux/export.h>
25 #include <linux/sysrq.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/bug.h>
29 #include <linux/nmi.h>
30 #include <linux/ctype.h>
31 #include <linux/highmem.h>
32
33 #include <asm/debugfs.h>
34 #include <asm/ptrace.h>
35 #include <asm/smp.h>
36 #include <asm/string.h>
37 #include <asm/prom.h>
38 #include <asm/machdep.h>
39 #include <asm/xmon.h>
40 #include <asm/processor.h>
41 #include <asm/pgtable.h>
42 #include <asm/mmu.h>
43 #include <asm/mmu_context.h>
44 #include <asm/plpar_wrappers.h>
45 #include <asm/cputable.h>
46 #include <asm/rtas.h>
47 #include <asm/sstep.h>
48 #include <asm/irq_regs.h>
49 #include <asm/spu.h>
50 #include <asm/spu_priv1.h>
51 #include <asm/setjmp.h>
52 #include <asm/reg.h>
53 #include <asm/debug.h>
54 #include <asm/hw_breakpoint.h>
55 #include <asm/xive.h>
56 #include <asm/opal.h>
57 #include <asm/firmware.h>
58 #include <asm/code-patching.h>
59 #include <asm/sections.h>
60
61 #ifdef CONFIG_PPC64
62 #include <asm/hvcall.h>
63 #include <asm/paca.h>
64 #endif
65
66 #include "nonstdio.h"
67 #include "dis-asm.h"
68
69 #ifdef CONFIG_SMP
70 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
71 static unsigned long xmon_taken = 1;
72 static int xmon_owner;
73 static int xmon_gate;
74 #else
75 #define xmon_owner 0
76 #endif /* CONFIG_SMP */
77
78 #ifdef CONFIG_PPC_PSERIES
79 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
80 #endif
81 static unsigned long in_xmon __read_mostly = 0;
82 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
83 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
84
85 static unsigned long adrs;
86 static int size = 1;
87 #define MAX_DUMP (128 * 1024)
88 static unsigned long ndump = 64;
89 static unsigned long nidump = 16;
90 static unsigned long ncsum = 4096;
91 static int termch;
92 static char tmpstr[128];
93 static int tracing_enabled;
94
95 static long bus_error_jmp[JMP_BUF_LEN];
96 static int catch_memory_errors;
97 static int catch_spr_faults;
98 static long *xmon_fault_jmp[NR_CPUS];
99
100 /* Breakpoint stuff */
101 struct bpt {
102         unsigned long   address;
103         unsigned int    instr[2];
104         atomic_t        ref_count;
105         int             enabled;
106         unsigned long   pad;
107 };
108
109 /* Bits in bpt.enabled */
110 #define BP_CIABR        1
111 #define BP_TRAP         2
112 #define BP_DABR         4
113
114 #define NBPTS   256
115 static struct bpt bpts[NBPTS];
116 static struct bpt dabr;
117 static struct bpt *iabr;
118 static unsigned bpinstr = 0x7fe00008;   /* trap */
119
120 #define BP_NUM(bp)      ((bp) - bpts + 1)
121
122 /* Prototypes */
123 static int cmds(struct pt_regs *);
124 static int mread(unsigned long, void *, int);
125 static int mwrite(unsigned long, void *, int);
126 static int handle_fault(struct pt_regs *);
127 static void byterev(unsigned char *, int);
128 static void memex(void);
129 static int bsesc(void);
130 static void dump(void);
131 static void show_pte(unsigned long);
132 static void prdump(unsigned long, long);
133 static int ppc_inst_dump(unsigned long, long, int);
134 static void dump_log_buf(void);
135
136 #ifdef CONFIG_PPC_POWERNV
137 static void dump_opal_msglog(void);
138 #else
139 static inline void dump_opal_msglog(void)
140 {
141         printf("Machine is not running OPAL firmware.\n");
142 }
143 #endif
144
145 static void backtrace(struct pt_regs *);
146 static void excprint(struct pt_regs *);
147 static void prregs(struct pt_regs *);
148 static void memops(int);
149 static void memlocate(void);
150 static void memzcan(void);
151 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
152 int skipbl(void);
153 int scanhex(unsigned long *valp);
154 static void scannl(void);
155 static int hexdigit(int);
156 void getstring(char *, int);
157 static void flush_input(void);
158 static int inchar(void);
159 static void take_input(char *);
160 static int  read_spr(int, unsigned long *);
161 static void write_spr(int, unsigned long);
162 static void super_regs(void);
163 static void remove_bpts(void);
164 static void insert_bpts(void);
165 static void remove_cpu_bpts(void);
166 static void insert_cpu_bpts(void);
167 static struct bpt *at_breakpoint(unsigned long pc);
168 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
169 static int  do_step(struct pt_regs *);
170 static void bpt_cmds(void);
171 static void cacheflush(void);
172 static int  cpu_cmd(void);
173 static void csum(void);
174 static void bootcmds(void);
175 static void proccall(void);
176 static void show_tasks(void);
177 void dump_segments(void);
178 static void symbol_lookup(void);
179 static void xmon_show_stack(unsigned long sp, unsigned long lr,
180                             unsigned long pc);
181 static void xmon_print_symbol(unsigned long address, const char *mid,
182                               const char *after);
183 static const char *getvecname(unsigned long vec);
184
185 static int do_spu_cmd(void);
186
187 #ifdef CONFIG_44x
188 static void dump_tlb_44x(void);
189 #endif
190 #ifdef CONFIG_PPC_BOOK3E
191 static void dump_tlb_book3e(void);
192 #endif
193
194 #ifdef CONFIG_PPC64
195 #define REG             "%.16lx"
196 #else
197 #define REG             "%.8lx"
198 #endif
199
200 #ifdef __LITTLE_ENDIAN__
201 #define GETWORD(v)      (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
202 #else
203 #define GETWORD(v)      (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
204 #endif
205
206 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
207
208 static char *help_string = "\
209 Commands:\n\
210   b     show breakpoints\n\
211   bd    set data breakpoint\n\
212   bi    set instruction breakpoint\n\
213   bc    clear breakpoint\n"
214 #ifdef CONFIG_SMP
215   "\
216   c     print cpus stopped in xmon\n\
217   c#    try to switch to cpu number h (in hex)\n"
218 #endif
219   "\
220   C     checksum\n\
221   d     dump bytes\n\
222   d1    dump 1 byte values\n\
223   d2    dump 2 byte values\n\
224   d4    dump 4 byte values\n\
225   d8    dump 8 byte values\n\
226   di    dump instructions\n\
227   df    dump float values\n\
228   dd    dump double values\n\
229   dl    dump the kernel log buffer\n"
230 #ifdef CONFIG_PPC_POWERNV
231   "\
232   do    dump the OPAL message log\n"
233 #endif
234 #ifdef CONFIG_PPC64
235   "\
236   dp[#] dump paca for current cpu, or cpu #\n\
237   dpa   dump paca for all possible cpus\n"
238 #endif
239   "\
240   dr    dump stream of raw bytes\n\
241   dv    dump virtual address translation \n\
242   dt    dump the tracing buffers (uses printk)\n\
243   dtc   dump the tracing buffers for current CPU (uses printk)\n\
244 "
245 #ifdef CONFIG_PPC_POWERNV
246 "  dx#   dump xive on CPU #\n\
247   dxi#  dump xive irq state #\n\
248   dxa   dump xive on all CPUs\n"
249 #endif
250 "  e    print exception information\n\
251   f     flush cache\n\
252   la    lookup symbol+offset of specified address\n\
253   ls    lookup address of specified symbol\n\
254   lp s [#]      lookup address of percpu symbol s for current cpu, or cpu #\n\
255   m     examine/change memory\n\
256   mm    move a block of memory\n\
257   ms    set a block of memory\n\
258   md    compare two blocks of memory\n\
259   ml    locate a block of memory\n\
260   mz    zero a block of memory\n\
261   mi    show information about memory allocation\n\
262   p     call a procedure\n\
263   P     list processes/tasks\n\
264   r     print registers\n\
265   s     single step\n"
266 #ifdef CONFIG_SPU_BASE
267 "  ss   stop execution on all spus\n\
268   sr    restore execution on stopped spus\n\
269   sf  # dump spu fields for spu # (in hex)\n\
270   sd  # dump spu local store for spu # (in hex)\n\
271   sdi # disassemble spu local store for spu # (in hex)\n"
272 #endif
273 "  S    print special registers\n\
274   Sa    print all SPRs\n\
275   Sr #  read SPR #\n\
276   Sw #v write v to SPR #\n\
277   t     print backtrace\n\
278   x     exit monitor and recover\n\
279   X     exit monitor and don't recover\n"
280 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
281 "  u    dump segment table or SLB\n"
282 #elif defined(CONFIG_PPC_BOOK3S_32)
283 "  u    dump segment registers\n"
284 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
285 "  u    dump TLB\n"
286 #endif
287 "  U    show uptime information\n"
288 "  ?    help\n"
289 "  # n  limit output to n lines per page (for dp, dpa, dl)\n"
290 "  zr   reboot\n\
291   zh    halt\n"
292 ;
293
294 static struct pt_regs *xmon_regs;
295
296 static inline void sync(void)
297 {
298         asm volatile("sync; isync");
299 }
300
301 static inline void store_inst(void *p)
302 {
303         asm volatile ("dcbst 0,%0; sync; icbi 0,%0; isync" : : "r" (p));
304 }
305
306 static inline void cflush(void *p)
307 {
308         asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
309 }
310
311 static inline void cinval(void *p)
312 {
313         asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
314 }
315
316 /**
317  * write_ciabr() - write the CIABR SPR
318  * @ciabr:      The value to write.
319  *
320  * This function writes a value to the CIARB register either directly
321  * through mtspr instruction if the kernel is in HV privilege mode or
322  * call a hypervisor function to achieve the same in case the kernel
323  * is in supervisor privilege mode.
324  */
325 static void write_ciabr(unsigned long ciabr)
326 {
327         if (!cpu_has_feature(CPU_FTR_ARCH_207S))
328                 return;
329
330         if (cpu_has_feature(CPU_FTR_HVMODE)) {
331                 mtspr(SPRN_CIABR, ciabr);
332                 return;
333         }
334         plpar_set_ciabr(ciabr);
335 }
336
337 /**
338  * set_ciabr() - set the CIABR
339  * @addr:       The value to set.
340  *
341  * This function sets the correct privilege value into the the HW
342  * breakpoint address before writing it up in the CIABR register.
343  */
344 static void set_ciabr(unsigned long addr)
345 {
346         addr &= ~CIABR_PRIV;
347
348         if (cpu_has_feature(CPU_FTR_HVMODE))
349                 addr |= CIABR_PRIV_HYPER;
350         else
351                 addr |= CIABR_PRIV_SUPER;
352         write_ciabr(addr);
353 }
354
355 /*
356  * Disable surveillance (the service processor watchdog function)
357  * while we are in xmon.
358  * XXX we should re-enable it when we leave. :)
359  */
360 #define SURVEILLANCE_TOKEN      9000
361
362 static inline void disable_surveillance(void)
363 {
364 #ifdef CONFIG_PPC_PSERIES
365         /* Since this can't be a module, args should end up below 4GB. */
366         static struct rtas_args args;
367
368         /*
369          * At this point we have got all the cpus we can into
370          * xmon, so there is hopefully no other cpu calling RTAS
371          * at the moment, even though we don't take rtas.lock.
372          * If we did try to take rtas.lock there would be a
373          * real possibility of deadlock.
374          */
375         if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
376                 return;
377
378         rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
379                            SURVEILLANCE_TOKEN, 0, 0);
380
381 #endif /* CONFIG_PPC_PSERIES */
382 }
383
384 #ifdef CONFIG_SMP
385 static int xmon_speaker;
386
387 static void get_output_lock(void)
388 {
389         int me = smp_processor_id() + 0x100;
390         int last_speaker = 0, prev;
391         long timeout;
392
393         if (xmon_speaker == me)
394                 return;
395
396         for (;;) {
397                 last_speaker = cmpxchg(&xmon_speaker, 0, me);
398                 if (last_speaker == 0)
399                         return;
400
401                 /*
402                  * Wait a full second for the lock, we might be on a slow
403                  * console, but check every 100us.
404                  */
405                 timeout = 10000;
406                 while (xmon_speaker == last_speaker) {
407                         if (--timeout > 0) {
408                                 udelay(100);
409                                 continue;
410                         }
411
412                         /* hostile takeover */
413                         prev = cmpxchg(&xmon_speaker, last_speaker, me);
414                         if (prev == last_speaker)
415                                 return;
416                         break;
417                 }
418         }
419 }
420
421 static void release_output_lock(void)
422 {
423         xmon_speaker = 0;
424 }
425
426 int cpus_are_in_xmon(void)
427 {
428         return !cpumask_empty(&cpus_in_xmon);
429 }
430
431 static bool wait_for_other_cpus(int ncpus)
432 {
433         unsigned long timeout;
434
435         /* We wait for 2s, which is a metric "little while" */
436         for (timeout = 20000; timeout != 0; --timeout) {
437                 if (cpumask_weight(&cpus_in_xmon) >= ncpus)
438                         return true;
439                 udelay(100);
440                 barrier();
441         }
442
443         return false;
444 }
445 #endif /* CONFIG_SMP */
446
447 static inline int unrecoverable_excp(struct pt_regs *regs)
448 {
449 #if defined(CONFIG_4xx) || defined(CONFIG_PPC_BOOK3E)
450         /* We have no MSR_RI bit on 4xx or Book3e, so we simply return false */
451         return 0;
452 #else
453         return ((regs->msr & MSR_RI) == 0);
454 #endif
455 }
456
457 static int xmon_core(struct pt_regs *regs, int fromipi)
458 {
459         int cmd = 0;
460         struct bpt *bp;
461         long recurse_jmp[JMP_BUF_LEN];
462         unsigned long offset;
463         unsigned long flags;
464 #ifdef CONFIG_SMP
465         int cpu;
466         int secondary;
467 #endif
468
469         local_irq_save(flags);
470         hard_irq_disable();
471
472         tracing_enabled = tracing_is_on();
473         tracing_off();
474
475         bp = in_breakpoint_table(regs->nip, &offset);
476         if (bp != NULL) {
477                 regs->nip = bp->address + offset;
478                 atomic_dec(&bp->ref_count);
479         }
480
481         remove_cpu_bpts();
482
483 #ifdef CONFIG_SMP
484         cpu = smp_processor_id();
485         if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
486                 /*
487                  * We catch SPR read/write faults here because the 0x700, 0xf60
488                  * etc. handlers don't call debugger_fault_handler().
489                  */
490                 if (catch_spr_faults)
491                         longjmp(bus_error_jmp, 1);
492                 get_output_lock();
493                 excprint(regs);
494                 printf("cpu 0x%x: Exception %lx %s in xmon, "
495                        "returning to main loop\n",
496                        cpu, regs->trap, getvecname(TRAP(regs)));
497                 release_output_lock();
498                 longjmp(xmon_fault_jmp[cpu], 1);
499         }
500
501         if (setjmp(recurse_jmp) != 0) {
502                 if (!in_xmon || !xmon_gate) {
503                         get_output_lock();
504                         printf("xmon: WARNING: bad recursive fault "
505                                "on cpu 0x%x\n", cpu);
506                         release_output_lock();
507                         goto waiting;
508                 }
509                 secondary = !(xmon_taken && cpu == xmon_owner);
510                 goto cmdloop;
511         }
512
513         xmon_fault_jmp[cpu] = recurse_jmp;
514
515         bp = NULL;
516         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
517                 bp = at_breakpoint(regs->nip);
518         if (bp || unrecoverable_excp(regs))
519                 fromipi = 0;
520
521         if (!fromipi) {
522                 get_output_lock();
523                 excprint(regs);
524                 if (bp) {
525                         printf("cpu 0x%x stopped at breakpoint 0x%tx (",
526                                cpu, BP_NUM(bp));
527                         xmon_print_symbol(regs->nip, " ", ")\n");
528                 }
529                 if (unrecoverable_excp(regs))
530                         printf("WARNING: exception is not recoverable, "
531                                "can't continue\n");
532                 release_output_lock();
533         }
534
535         cpumask_set_cpu(cpu, &cpus_in_xmon);
536
537  waiting:
538         secondary = 1;
539         spin_begin();
540         while (secondary && !xmon_gate) {
541                 if (in_xmon == 0) {
542                         if (fromipi) {
543                                 spin_end();
544                                 goto leave;
545                         }
546                         secondary = test_and_set_bit(0, &in_xmon);
547                 }
548                 spin_cpu_relax();
549                 touch_nmi_watchdog();
550         }
551         spin_end();
552
553         if (!secondary && !xmon_gate) {
554                 /* we are the first cpu to come in */
555                 /* interrupt other cpu(s) */
556                 int ncpus = num_online_cpus();
557
558                 xmon_owner = cpu;
559                 mb();
560                 if (ncpus > 1) {
561                         /*
562                          * A system reset (trap == 0x100) can be triggered on
563                          * all CPUs, so when we come in via 0x100 try waiting
564                          * for the other CPUs to come in before we send the
565                          * debugger break (IPI). This is similar to
566                          * crash_kexec_secondary().
567                          */
568                         if (TRAP(regs) != 0x100 || !wait_for_other_cpus(ncpus))
569                                 smp_send_debugger_break();
570
571                         wait_for_other_cpus(ncpus);
572                 }
573                 remove_bpts();
574                 disable_surveillance();
575                 /* for breakpoint or single step, print the current instr. */
576                 if (bp || TRAP(regs) == 0xd00)
577                         ppc_inst_dump(regs->nip, 1, 0);
578                 printf("enter ? for help\n");
579                 mb();
580                 xmon_gate = 1;
581                 barrier();
582                 touch_nmi_watchdog();
583         }
584
585  cmdloop:
586         while (in_xmon) {
587                 if (secondary) {
588                         spin_begin();
589                         if (cpu == xmon_owner) {
590                                 if (!test_and_set_bit(0, &xmon_taken)) {
591                                         secondary = 0;
592                                         spin_end();
593                                         continue;
594                                 }
595                                 /* missed it */
596                                 while (cpu == xmon_owner)
597                                         spin_cpu_relax();
598                         }
599                         spin_cpu_relax();
600                         touch_nmi_watchdog();
601                 } else {
602                         cmd = cmds(regs);
603                         if (cmd != 0) {
604                                 /* exiting xmon */
605                                 insert_bpts();
606                                 xmon_gate = 0;
607                                 wmb();
608                                 in_xmon = 0;
609                                 break;
610                         }
611                         /* have switched to some other cpu */
612                         secondary = 1;
613                 }
614         }
615  leave:
616         cpumask_clear_cpu(cpu, &cpus_in_xmon);
617         xmon_fault_jmp[cpu] = NULL;
618 #else
619         /* UP is simple... */
620         if (in_xmon) {
621                 printf("Exception %lx %s in xmon, returning to main loop\n",
622                        regs->trap, getvecname(TRAP(regs)));
623                 longjmp(xmon_fault_jmp[0], 1);
624         }
625         if (setjmp(recurse_jmp) == 0) {
626                 xmon_fault_jmp[0] = recurse_jmp;
627                 in_xmon = 1;
628
629                 excprint(regs);
630                 bp = at_breakpoint(regs->nip);
631                 if (bp) {
632                         printf("Stopped at breakpoint %tx (", BP_NUM(bp));
633                         xmon_print_symbol(regs->nip, " ", ")\n");
634                 }
635                 if (unrecoverable_excp(regs))
636                         printf("WARNING: exception is not recoverable, "
637                                "can't continue\n");
638                 remove_bpts();
639                 disable_surveillance();
640                 /* for breakpoint or single step, print the current instr. */
641                 if (bp || TRAP(regs) == 0xd00)
642                         ppc_inst_dump(regs->nip, 1, 0);
643                 printf("enter ? for help\n");
644         }
645
646         cmd = cmds(regs);
647
648         insert_bpts();
649         in_xmon = 0;
650 #endif
651
652 #ifdef CONFIG_BOOKE
653         if (regs->msr & MSR_DE) {
654                 bp = at_breakpoint(regs->nip);
655                 if (bp != NULL) {
656                         regs->nip = (unsigned long) &bp->instr[0];
657                         atomic_inc(&bp->ref_count);
658                 }
659         }
660 #else
661         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
662                 bp = at_breakpoint(regs->nip);
663                 if (bp != NULL) {
664                         int stepped = emulate_step(regs, bp->instr[0]);
665                         if (stepped == 0) {
666                                 regs->nip = (unsigned long) &bp->instr[0];
667                                 atomic_inc(&bp->ref_count);
668                         } else if (stepped < 0) {
669                                 printf("Couldn't single-step %s instruction\n",
670                                     (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));
671                         }
672                 }
673         }
674 #endif
675         insert_cpu_bpts();
676
677         touch_nmi_watchdog();
678         local_irq_restore(flags);
679
680         return cmd != 'X' && cmd != EOF;
681 }
682
683 int xmon(struct pt_regs *excp)
684 {
685         struct pt_regs regs;
686
687         if (excp == NULL) {
688                 ppc_save_regs(&regs);
689                 excp = &regs;
690         }
691
692         return xmon_core(excp, 0);
693 }
694 EXPORT_SYMBOL(xmon);
695
696 irqreturn_t xmon_irq(int irq, void *d)
697 {
698         unsigned long flags;
699         local_irq_save(flags);
700         printf("Keyboard interrupt\n");
701         xmon(get_irq_regs());
702         local_irq_restore(flags);
703         return IRQ_HANDLED;
704 }
705
706 static int xmon_bpt(struct pt_regs *regs)
707 {
708         struct bpt *bp;
709         unsigned long offset;
710
711         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
712                 return 0;
713
714         /* Are we at the trap at bp->instr[1] for some bp? */
715         bp = in_breakpoint_table(regs->nip, &offset);
716         if (bp != NULL && offset == 4) {
717                 regs->nip = bp->address + 4;
718                 atomic_dec(&bp->ref_count);
719                 return 1;
720         }
721
722         /* Are we at a breakpoint? */
723         bp = at_breakpoint(regs->nip);
724         if (!bp)
725                 return 0;
726
727         xmon_core(regs, 0);
728
729         return 1;
730 }
731
732 static int xmon_sstep(struct pt_regs *regs)
733 {
734         if (user_mode(regs))
735                 return 0;
736         xmon_core(regs, 0);
737         return 1;
738 }
739
740 static int xmon_break_match(struct pt_regs *regs)
741 {
742         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
743                 return 0;
744         if (dabr.enabled == 0)
745                 return 0;
746         xmon_core(regs, 0);
747         return 1;
748 }
749
750 static int xmon_iabr_match(struct pt_regs *regs)
751 {
752         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
753                 return 0;
754         if (iabr == NULL)
755                 return 0;
756         xmon_core(regs, 0);
757         return 1;
758 }
759
760 static int xmon_ipi(struct pt_regs *regs)
761 {
762 #ifdef CONFIG_SMP
763         if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
764                 xmon_core(regs, 1);
765 #endif
766         return 0;
767 }
768
769 static int xmon_fault_handler(struct pt_regs *regs)
770 {
771         struct bpt *bp;
772         unsigned long offset;
773
774         if (in_xmon && catch_memory_errors)
775                 handle_fault(regs);     /* doesn't return */
776
777         if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
778                 bp = in_breakpoint_table(regs->nip, &offset);
779                 if (bp != NULL) {
780                         regs->nip = bp->address + offset;
781                         atomic_dec(&bp->ref_count);
782                 }
783         }
784
785         return 0;
786 }
787
788 /* Force enable xmon if not already enabled */
789 static inline void force_enable_xmon(void)
790 {
791         /* Enable xmon hooks if needed */
792         if (!xmon_on) {
793                 printf("xmon: Enabling debugger hooks\n");
794                 xmon_on = 1;
795         }
796 }
797
798 static struct bpt *at_breakpoint(unsigned long pc)
799 {
800         int i;
801         struct bpt *bp;
802
803         bp = bpts;
804         for (i = 0; i < NBPTS; ++i, ++bp)
805                 if (bp->enabled && pc == bp->address)
806                         return bp;
807         return NULL;
808 }
809
810 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
811 {
812         unsigned long off;
813
814         off = nip - (unsigned long) bpts;
815         if (off >= sizeof(bpts))
816                 return NULL;
817         off %= sizeof(struct bpt);
818         if (off != offsetof(struct bpt, instr[0])
819             && off != offsetof(struct bpt, instr[1]))
820                 return NULL;
821         *offp = off - offsetof(struct bpt, instr[0]);
822         return (struct bpt *) (nip - off);
823 }
824
825 static struct bpt *new_breakpoint(unsigned long a)
826 {
827         struct bpt *bp;
828
829         a &= ~3UL;
830         bp = at_breakpoint(a);
831         if (bp)
832                 return bp;
833
834         for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
835                 if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
836                         bp->address = a;
837                         bp->instr[1] = bpinstr;
838                         store_inst(&bp->instr[1]);
839                         return bp;
840                 }
841         }
842
843         printf("Sorry, no free breakpoints.  Please clear one first.\n");
844         return NULL;
845 }
846
847 static void insert_bpts(void)
848 {
849         int i;
850         struct bpt *bp;
851
852         bp = bpts;
853         for (i = 0; i < NBPTS; ++i, ++bp) {
854                 if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
855                         continue;
856                 if (mread(bp->address, &bp->instr[0], 4) != 4) {
857                         printf("Couldn't read instruction at %lx, "
858                                "disabling breakpoint there\n", bp->address);
859                         bp->enabled = 0;
860                         continue;
861                 }
862                 if (IS_MTMSRD(bp->instr[0]) || IS_RFID(bp->instr[0])) {
863                         printf("Breakpoint at %lx is on an mtmsrd or rfid "
864                                "instruction, disabling it\n", bp->address);
865                         bp->enabled = 0;
866                         continue;
867                 }
868                 store_inst(&bp->instr[0]);
869                 if (bp->enabled & BP_CIABR)
870                         continue;
871                 if (patch_instruction((unsigned int *)bp->address,
872                                                         bpinstr) != 0) {
873                         printf("Couldn't write instruction at %lx, "
874                                "disabling breakpoint there\n", bp->address);
875                         bp->enabled &= ~BP_TRAP;
876                         continue;
877                 }
878                 store_inst((void *)bp->address);
879         }
880 }
881
882 static void insert_cpu_bpts(void)
883 {
884         struct arch_hw_breakpoint brk;
885
886         if (dabr.enabled) {
887                 brk.address = dabr.address;
888                 brk.type = (dabr.enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
889                 brk.len = 8;
890                 __set_breakpoint(&brk);
891         }
892
893         if (iabr)
894                 set_ciabr(iabr->address);
895 }
896
897 static void remove_bpts(void)
898 {
899         int i;
900         struct bpt *bp;
901         unsigned instr;
902
903         bp = bpts;
904         for (i = 0; i < NBPTS; ++i, ++bp) {
905                 if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
906                         continue;
907                 if (mread(bp->address, &instr, 4) == 4
908                     && instr == bpinstr
909                     && patch_instruction(
910                         (unsigned int *)bp->address, bp->instr[0]) != 0)
911                         printf("Couldn't remove breakpoint at %lx\n",
912                                bp->address);
913                 else
914                         store_inst((void *)bp->address);
915         }
916 }
917
918 static void remove_cpu_bpts(void)
919 {
920         hw_breakpoint_disable();
921         write_ciabr(0);
922 }
923
924 /* Based on uptime_proc_show(). */
925 static void
926 show_uptime(void)
927 {
928         struct timespec64 uptime;
929
930         if (setjmp(bus_error_jmp) == 0) {
931                 catch_memory_errors = 1;
932                 sync();
933
934                 ktime_get_coarse_boottime_ts64(&uptime);
935                 printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
936                         ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
937
938                 sync();
939                 __delay(200);                                           \
940         }
941         catch_memory_errors = 0;
942 }
943
944 static void set_lpp_cmd(void)
945 {
946         unsigned long lpp;
947
948         if (!scanhex(&lpp)) {
949                 printf("Invalid number.\n");
950                 lpp = 0;
951         }
952         xmon_set_pagination_lpp(lpp);
953 }
954 /* Command interpreting routine */
955 static char *last_cmd;
956
957 static int
958 cmds(struct pt_regs *excp)
959 {
960         int cmd = 0;
961
962         last_cmd = NULL;
963         xmon_regs = excp;
964
965         xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
966
967         for(;;) {
968 #ifdef CONFIG_SMP
969                 printf("%x:", smp_processor_id());
970 #endif /* CONFIG_SMP */
971                 printf("mon> ");
972                 flush_input();
973                 termch = 0;
974                 cmd = skipbl();
975                 if( cmd == '\n' ) {
976                         if (last_cmd == NULL)
977                                 continue;
978                         take_input(last_cmd);
979                         last_cmd = NULL;
980                         cmd = inchar();
981                 }
982                 switch (cmd) {
983                 case 'm':
984                         cmd = inchar();
985                         switch (cmd) {
986                         case 'm':
987                         case 's':
988                         case 'd':
989                                 memops(cmd);
990                                 break;
991                         case 'l':
992                                 memlocate();
993                                 break;
994                         case 'z':
995                                 if (xmon_is_ro) {
996                                         printf(xmon_ro_msg);
997                                         break;
998                                 }
999                                 memzcan();
1000                                 break;
1001                         case 'i':
1002                                 show_mem(0, NULL);
1003                                 break;
1004                         default:
1005                                 termch = cmd;
1006                                 memex();
1007                         }
1008                         break;
1009                 case 'd':
1010                         dump();
1011                         break;
1012                 case 'l':
1013                         symbol_lookup();
1014                         break;
1015                 case 'r':
1016                         prregs(excp);   /* print regs */
1017                         break;
1018                 case 'e':
1019                         excprint(excp);
1020                         break;
1021                 case 'S':
1022                         super_regs();
1023                         break;
1024                 case 't':
1025                         backtrace(excp);
1026                         break;
1027                 case 'f':
1028                         cacheflush();
1029                         break;
1030                 case 's':
1031                         if (do_spu_cmd() == 0)
1032                                 break;
1033                         if (do_step(excp))
1034                                 return cmd;
1035                         break;
1036                 case 'x':
1037                 case 'X':
1038                         if (tracing_enabled)
1039                                 tracing_on();
1040                         return cmd;
1041                 case EOF:
1042                         printf(" <no input ...>\n");
1043                         mdelay(2000);
1044                         return cmd;
1045                 case '?':
1046                         xmon_puts(help_string);
1047                         break;
1048                 case '#':
1049                         set_lpp_cmd();
1050                         break;
1051                 case 'b':
1052                         if (xmon_is_ro) {
1053                                 printf(xmon_ro_msg);
1054                                 break;
1055                         }
1056                         bpt_cmds();
1057                         break;
1058                 case 'C':
1059                         csum();
1060                         break;
1061                 case 'c':
1062                         if (cpu_cmd())
1063                                 return 0;
1064                         break;
1065                 case 'z':
1066                         bootcmds();
1067                         break;
1068                 case 'p':
1069                         if (xmon_is_ro) {
1070                                 printf(xmon_ro_msg);
1071                                 break;
1072                         }
1073                         proccall();
1074                         break;
1075                 case 'P':
1076                         show_tasks();
1077                         break;
1078 #ifdef CONFIG_PPC_BOOK3S
1079                 case 'u':
1080                         dump_segments();
1081                         break;
1082 #elif defined(CONFIG_44x)
1083                 case 'u':
1084                         dump_tlb_44x();
1085                         break;
1086 #elif defined(CONFIG_PPC_BOOK3E)
1087                 case 'u':
1088                         dump_tlb_book3e();
1089                         break;
1090 #endif
1091                 case 'U':
1092                         show_uptime();
1093                         break;
1094                 default:
1095                         printf("Unrecognized command: ");
1096                         do {
1097                                 if (' ' < cmd && cmd <= '~')
1098                                         putchar(cmd);
1099                                 else
1100                                         printf("\\x%x", cmd);
1101                                 cmd = inchar();
1102                         } while (cmd != '\n');
1103                         printf(" (type ? for help)\n");
1104                         break;
1105                 }
1106         }
1107 }
1108
1109 #ifdef CONFIG_BOOKE
1110 static int do_step(struct pt_regs *regs)
1111 {
1112         regs->msr |= MSR_DE;
1113         mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1114         return 1;
1115 }
1116 #else
1117 /*
1118  * Step a single instruction.
1119  * Some instructions we emulate, others we execute with MSR_SE set.
1120  */
1121 static int do_step(struct pt_regs *regs)
1122 {
1123         unsigned int instr;
1124         int stepped;
1125
1126         force_enable_xmon();
1127         /* check we are in 64-bit kernel mode, translation enabled */
1128         if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1129                 if (mread(regs->nip, &instr, 4) == 4) {
1130                         stepped = emulate_step(regs, instr);
1131                         if (stepped < 0) {
1132                                 printf("Couldn't single-step %s instruction\n",
1133                                        (IS_RFID(instr)? "rfid": "mtmsrd"));
1134                                 return 0;
1135                         }
1136                         if (stepped > 0) {
1137                                 regs->trap = 0xd00 | (regs->trap & 1);
1138                                 printf("stepped to ");
1139                                 xmon_print_symbol(regs->nip, " ", "\n");
1140                                 ppc_inst_dump(regs->nip, 1, 0);
1141                                 return 0;
1142                         }
1143                 }
1144         }
1145         regs->msr |= MSR_SE;
1146         return 1;
1147 }
1148 #endif
1149
1150 static void bootcmds(void)
1151 {
1152         int cmd;
1153
1154         cmd = inchar();
1155         if (cmd == 'r')
1156                 ppc_md.restart(NULL);
1157         else if (cmd == 'h')
1158                 ppc_md.halt();
1159         else if (cmd == 'p')
1160                 if (pm_power_off)
1161                         pm_power_off();
1162 }
1163
1164 static int cpu_cmd(void)
1165 {
1166 #ifdef CONFIG_SMP
1167         unsigned long cpu, first_cpu, last_cpu;
1168         int timeout;
1169
1170         if (!scanhex(&cpu)) {
1171                 /* print cpus waiting or in xmon */
1172                 printf("cpus stopped:");
1173                 last_cpu = first_cpu = NR_CPUS;
1174                 for_each_possible_cpu(cpu) {
1175                         if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1176                                 if (cpu == last_cpu + 1) {
1177                                         last_cpu = cpu;
1178                                 } else {
1179                                         if (last_cpu != first_cpu)
1180                                                 printf("-0x%lx", last_cpu);
1181                                         last_cpu = first_cpu = cpu;
1182                                         printf(" 0x%lx", cpu);
1183                                 }
1184                         }
1185                 }
1186                 if (last_cpu != first_cpu)
1187                         printf("-0x%lx", last_cpu);
1188                 printf("\n");
1189                 return 0;
1190         }
1191         /* try to switch to cpu specified */
1192         if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1193                 printf("cpu 0x%lx isn't in xmon\n", cpu);
1194 #ifdef CONFIG_PPC64
1195                 printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1196                 xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1197 #endif
1198                 return 0;
1199         }
1200         xmon_taken = 0;
1201         mb();
1202         xmon_owner = cpu;
1203         timeout = 10000000;
1204         while (!xmon_taken) {
1205                 if (--timeout == 0) {
1206                         if (test_and_set_bit(0, &xmon_taken))
1207                                 break;
1208                         /* take control back */
1209                         mb();
1210                         xmon_owner = smp_processor_id();
1211                         printf("cpu 0x%lx didn't take control\n", cpu);
1212                         return 0;
1213                 }
1214                 barrier();
1215         }
1216         return 1;
1217 #else
1218         return 0;
1219 #endif /* CONFIG_SMP */
1220 }
1221
1222 static unsigned short fcstab[256] = {
1223         0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1224         0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1225         0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1226         0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1227         0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1228         0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1229         0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1230         0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1231         0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1232         0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1233         0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1234         0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1235         0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1236         0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1237         0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1238         0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1239         0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1240         0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1241         0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1242         0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1243         0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1244         0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1245         0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1246         0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1247         0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1248         0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1249         0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1250         0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1251         0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1252         0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1253         0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1254         0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1255 };
1256
1257 #define FCS(fcs, c)     (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1258
1259 static void
1260 csum(void)
1261 {
1262         unsigned int i;
1263         unsigned short fcs;
1264         unsigned char v;
1265
1266         if (!scanhex(&adrs))
1267                 return;
1268         if (!scanhex(&ncsum))
1269                 return;
1270         fcs = 0xffff;
1271         for (i = 0; i < ncsum; ++i) {
1272                 if (mread(adrs+i, &v, 1) == 0) {
1273                         printf("csum stopped at "REG"\n", adrs+i);
1274                         break;
1275                 }
1276                 fcs = FCS(fcs, v);
1277         }
1278         printf("%x\n", fcs);
1279 }
1280
1281 /*
1282  * Check if this is a suitable place to put a breakpoint.
1283  */
1284 static long check_bp_loc(unsigned long addr)
1285 {
1286         unsigned int instr;
1287
1288         addr &= ~3;
1289         if (!is_kernel_addr(addr)) {
1290                 printf("Breakpoints may only be placed at kernel addresses\n");
1291                 return 0;
1292         }
1293         if (!mread(addr, &instr, sizeof(instr))) {
1294                 printf("Can't read instruction at address %lx\n", addr);
1295                 return 0;
1296         }
1297         if (IS_MTMSRD(instr) || IS_RFID(instr)) {
1298                 printf("Breakpoints may not be placed on mtmsrd or rfid "
1299                        "instructions\n");
1300                 return 0;
1301         }
1302         return 1;
1303 }
1304
1305 static char *breakpoint_help_string =
1306     "Breakpoint command usage:\n"
1307     "b                show breakpoints\n"
1308     "b <addr> [cnt]   set breakpoint at given instr addr\n"
1309     "bc               clear all breakpoints\n"
1310     "bc <n/addr>      clear breakpoint number n or at addr\n"
1311     "bi <addr> [cnt]  set hardware instr breakpoint (POWER8 only)\n"
1312     "bd <addr> [cnt]  set hardware data breakpoint\n"
1313     "";
1314
1315 static void
1316 bpt_cmds(void)
1317 {
1318         int cmd;
1319         unsigned long a;
1320         int i;
1321         struct bpt *bp;
1322
1323         cmd = inchar();
1324         switch (cmd) {
1325 #ifndef CONFIG_PPC_8xx
1326         static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1327         int mode;
1328         case 'd':       /* bd - hardware data breakpoint */
1329                 if (!ppc_breakpoint_available()) {
1330                         printf("Hardware data breakpoint not supported on this cpu\n");
1331                         break;
1332                 }
1333                 mode = 7;
1334                 cmd = inchar();
1335                 if (cmd == 'r')
1336                         mode = 5;
1337                 else if (cmd == 'w')
1338                         mode = 6;
1339                 else
1340                         termch = cmd;
1341                 dabr.address = 0;
1342                 dabr.enabled = 0;
1343                 if (scanhex(&dabr.address)) {
1344                         if (!is_kernel_addr(dabr.address)) {
1345                                 printf(badaddr);
1346                                 break;
1347                         }
1348                         dabr.address &= ~HW_BRK_TYPE_DABR;
1349                         dabr.enabled = mode | BP_DABR;
1350                 }
1351
1352                 force_enable_xmon();
1353                 break;
1354
1355         case 'i':       /* bi - hardware instr breakpoint */
1356                 if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1357                         printf("Hardware instruction breakpoint "
1358                                "not supported on this cpu\n");
1359                         break;
1360                 }
1361                 if (iabr) {
1362                         iabr->enabled &= ~BP_CIABR;
1363                         iabr = NULL;
1364                 }
1365                 if (!scanhex(&a))
1366                         break;
1367                 if (!check_bp_loc(a))
1368                         break;
1369                 bp = new_breakpoint(a);
1370                 if (bp != NULL) {
1371                         bp->enabled |= BP_CIABR;
1372                         iabr = bp;
1373                         force_enable_xmon();
1374                 }
1375                 break;
1376 #endif
1377
1378         case 'c':
1379                 if (!scanhex(&a)) {
1380                         /* clear all breakpoints */
1381                         for (i = 0; i < NBPTS; ++i)
1382                                 bpts[i].enabled = 0;
1383                         iabr = NULL;
1384                         dabr.enabled = 0;
1385                         printf("All breakpoints cleared\n");
1386                         break;
1387                 }
1388
1389                 if (a <= NBPTS && a >= 1) {
1390                         /* assume a breakpoint number */
1391                         bp = &bpts[a-1];        /* bp nums are 1 based */
1392                 } else {
1393                         /* assume a breakpoint address */
1394                         bp = at_breakpoint(a);
1395                         if (bp == NULL) {
1396                                 printf("No breakpoint at %lx\n", a);
1397                                 break;
1398                         }
1399                 }
1400
1401                 printf("Cleared breakpoint %tx (", BP_NUM(bp));
1402                 xmon_print_symbol(bp->address, " ", ")\n");
1403                 bp->enabled = 0;
1404                 break;
1405
1406         default:
1407                 termch = cmd;
1408                 cmd = skipbl();
1409                 if (cmd == '?') {
1410                         printf(breakpoint_help_string);
1411                         break;
1412                 }
1413                 termch = cmd;
1414                 if (!scanhex(&a)) {
1415                         /* print all breakpoints */
1416                         printf("   type            address\n");
1417                         if (dabr.enabled) {
1418                                 printf("   data   "REG"  [", dabr.address);
1419                                 if (dabr.enabled & 1)
1420                                         printf("r");
1421                                 if (dabr.enabled & 2)
1422                                         printf("w");
1423                                 printf("]\n");
1424                         }
1425                         for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1426                                 if (!bp->enabled)
1427                                         continue;
1428                                 printf("%tx %s   ", BP_NUM(bp),
1429                                     (bp->enabled & BP_CIABR) ? "inst": "trap");
1430                                 xmon_print_symbol(bp->address, "  ", "\n");
1431                         }
1432                         break;
1433                 }
1434
1435                 if (!check_bp_loc(a))
1436                         break;
1437                 bp = new_breakpoint(a);
1438                 if (bp != NULL) {
1439                         bp->enabled |= BP_TRAP;
1440                         force_enable_xmon();
1441                 }
1442                 break;
1443         }
1444 }
1445
1446 /* Very cheap human name for vector lookup. */
1447 static
1448 const char *getvecname(unsigned long vec)
1449 {
1450         char *ret;
1451
1452         switch (vec) {
1453         case 0x100:     ret = "(System Reset)"; break;
1454         case 0x200:     ret = "(Machine Check)"; break;
1455         case 0x300:     ret = "(Data Access)"; break;
1456         case 0x380:
1457                 if (radix_enabled())
1458                         ret = "(Data Access Out of Range)";
1459                 else
1460                         ret = "(Data SLB Access)";
1461                 break;
1462         case 0x400:     ret = "(Instruction Access)"; break;
1463         case 0x480:
1464                 if (radix_enabled())
1465                         ret = "(Instruction Access Out of Range)";
1466                 else
1467                         ret = "(Instruction SLB Access)";
1468                 break;
1469         case 0x500:     ret = "(Hardware Interrupt)"; break;
1470         case 0x600:     ret = "(Alignment)"; break;
1471         case 0x700:     ret = "(Program Check)"; break;
1472         case 0x800:     ret = "(FPU Unavailable)"; break;
1473         case 0x900:     ret = "(Decrementer)"; break;
1474         case 0x980:     ret = "(Hypervisor Decrementer)"; break;
1475         case 0xa00:     ret = "(Doorbell)"; break;
1476         case 0xc00:     ret = "(System Call)"; break;
1477         case 0xd00:     ret = "(Single Step)"; break;
1478         case 0xe40:     ret = "(Emulation Assist)"; break;
1479         case 0xe60:     ret = "(HMI)"; break;
1480         case 0xe80:     ret = "(Hypervisor Doorbell)"; break;
1481         case 0xf00:     ret = "(Performance Monitor)"; break;
1482         case 0xf20:     ret = "(Altivec Unavailable)"; break;
1483         case 0x1300:    ret = "(Instruction Breakpoint)"; break;
1484         case 0x1500:    ret = "(Denormalisation)"; break;
1485         case 0x1700:    ret = "(Altivec Assist)"; break;
1486         default: ret = "";
1487         }
1488         return ret;
1489 }
1490
1491 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1492                                 unsigned long *endp)
1493 {
1494         unsigned long size, offset;
1495         const char *name;
1496
1497         *startp = *endp = 0;
1498         if (pc == 0)
1499                 return;
1500         if (setjmp(bus_error_jmp) == 0) {
1501                 catch_memory_errors = 1;
1502                 sync();
1503                 name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1504                 if (name != NULL) {
1505                         *startp = pc - offset;
1506                         *endp = pc - offset + size;
1507                 }
1508                 sync();
1509         }
1510         catch_memory_errors = 0;
1511 }
1512
1513 #define LRSAVE_OFFSET           (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1514 #define MARKER_OFFSET           (STACK_FRAME_MARKER * sizeof(unsigned long))
1515
1516 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1517                             unsigned long pc)
1518 {
1519         int max_to_print = 64;
1520         unsigned long ip;
1521         unsigned long newsp;
1522         unsigned long marker;
1523         struct pt_regs regs;
1524
1525         while (max_to_print--) {
1526                 if (!is_kernel_addr(sp)) {
1527                         if (sp != 0)
1528                                 printf("SP (%lx) is in userspace\n", sp);
1529                         break;
1530                 }
1531
1532                 if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1533                     || !mread(sp, &newsp, sizeof(unsigned long))) {
1534                         printf("Couldn't read stack frame at %lx\n", sp);
1535                         break;
1536                 }
1537
1538                 /*
1539                  * For the first stack frame, try to work out if
1540                  * LR and/or the saved LR value in the bottommost
1541                  * stack frame are valid.
1542                  */
1543                 if ((pc | lr) != 0) {
1544                         unsigned long fnstart, fnend;
1545                         unsigned long nextip;
1546                         int printip = 1;
1547
1548                         get_function_bounds(pc, &fnstart, &fnend);
1549                         nextip = 0;
1550                         if (newsp > sp)
1551                                 mread(newsp + LRSAVE_OFFSET, &nextip,
1552                                       sizeof(unsigned long));
1553                         if (lr == ip) {
1554                                 if (!is_kernel_addr(lr)
1555                                     || (fnstart <= lr && lr < fnend))
1556                                         printip = 0;
1557                         } else if (lr == nextip) {
1558                                 printip = 0;
1559                         } else if (is_kernel_addr(lr)
1560                                    && !(fnstart <= lr && lr < fnend)) {
1561                                 printf("[link register   ] ");
1562                                 xmon_print_symbol(lr, " ", "\n");
1563                         }
1564                         if (printip) {
1565                                 printf("["REG"] ", sp);
1566                                 xmon_print_symbol(ip, " ", " (unreliable)\n");
1567                         }
1568                         pc = lr = 0;
1569
1570                 } else {
1571                         printf("["REG"] ", sp);
1572                         xmon_print_symbol(ip, " ", "\n");
1573                 }
1574
1575                 /* Look for "regshere" marker to see if this is
1576                    an exception frame. */
1577                 if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1578                     && marker == STACK_FRAME_REGS_MARKER) {
1579                         if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1580                             != sizeof(regs)) {
1581                                 printf("Couldn't read registers at %lx\n",
1582                                        sp + STACK_FRAME_OVERHEAD);
1583                                 break;
1584                         }
1585                         printf("--- Exception: %lx %s at ", regs.trap,
1586                                getvecname(TRAP(&regs)));
1587                         pc = regs.nip;
1588                         lr = regs.link;
1589                         xmon_print_symbol(pc, " ", "\n");
1590                 }
1591
1592                 if (newsp == 0)
1593                         break;
1594
1595                 sp = newsp;
1596         }
1597 }
1598
1599 static void backtrace(struct pt_regs *excp)
1600 {
1601         unsigned long sp;
1602
1603         if (scanhex(&sp))
1604                 xmon_show_stack(sp, 0, 0);
1605         else
1606                 xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1607         scannl();
1608 }
1609
1610 static void print_bug_trap(struct pt_regs *regs)
1611 {
1612 #ifdef CONFIG_BUG
1613         const struct bug_entry *bug;
1614         unsigned long addr;
1615
1616         if (regs->msr & MSR_PR)
1617                 return;         /* not in kernel */
1618         addr = regs->nip;       /* address of trap instruction */
1619         if (!is_kernel_addr(addr))
1620                 return;
1621         bug = find_bug(regs->nip);
1622         if (bug == NULL)
1623                 return;
1624         if (is_warning_bug(bug))
1625                 return;
1626
1627 #ifdef CONFIG_DEBUG_BUGVERBOSE
1628         printf("kernel BUG at %s:%u!\n",
1629                bug->file, bug->line);
1630 #else
1631         printf("kernel BUG at %px!\n", (void *)bug->bug_addr);
1632 #endif
1633 #endif /* CONFIG_BUG */
1634 }
1635
1636 static void excprint(struct pt_regs *fp)
1637 {
1638         unsigned long trap;
1639
1640 #ifdef CONFIG_SMP
1641         printf("cpu 0x%x: ", smp_processor_id());
1642 #endif /* CONFIG_SMP */
1643
1644         trap = TRAP(fp);
1645         printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1646         printf("    pc: ");
1647         xmon_print_symbol(fp->nip, ": ", "\n");
1648
1649         printf("    lr: ");
1650         xmon_print_symbol(fp->link, ": ", "\n");
1651
1652         printf("    sp: %lx\n", fp->gpr[1]);
1653         printf("   msr: %lx\n", fp->msr);
1654
1655         if (trap == 0x300 || trap == 0x380 || trap == 0x600 || trap == 0x200) {
1656                 printf("   dar: %lx\n", fp->dar);
1657                 if (trap != 0x380)
1658                         printf(" dsisr: %lx\n", fp->dsisr);
1659         }
1660
1661         printf("  current = 0x%px\n", current);
1662 #ifdef CONFIG_PPC64
1663         printf("  paca    = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1664                local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1665 #endif
1666         if (current) {
1667                 printf("    pid   = %d, comm = %s\n",
1668                        current->pid, current->comm);
1669         }
1670
1671         if (trap == 0x700)
1672                 print_bug_trap(fp);
1673
1674         printf(linux_banner);
1675 }
1676
1677 static void prregs(struct pt_regs *fp)
1678 {
1679         int n, trap;
1680         unsigned long base;
1681         struct pt_regs regs;
1682
1683         if (scanhex(&base)) {
1684                 if (setjmp(bus_error_jmp) == 0) {
1685                         catch_memory_errors = 1;
1686                         sync();
1687                         regs = *(struct pt_regs *)base;
1688                         sync();
1689                         __delay(200);
1690                 } else {
1691                         catch_memory_errors = 0;
1692                         printf("*** Error reading registers from "REG"\n",
1693                                base);
1694                         return;
1695                 }
1696                 catch_memory_errors = 0;
1697                 fp = &regs;
1698         }
1699
1700 #ifdef CONFIG_PPC64
1701         if (FULL_REGS(fp)) {
1702                 for (n = 0; n < 16; ++n)
1703                         printf("R%.2d = "REG"   R%.2d = "REG"\n",
1704                                n, fp->gpr[n], n+16, fp->gpr[n+16]);
1705         } else {
1706                 for (n = 0; n < 7; ++n)
1707                         printf("R%.2d = "REG"   R%.2d = "REG"\n",
1708                                n, fp->gpr[n], n+7, fp->gpr[n+7]);
1709         }
1710 #else
1711         for (n = 0; n < 32; ++n) {
1712                 printf("R%.2d = %.8lx%s", n, fp->gpr[n],
1713                        (n & 3) == 3? "\n": "   ");
1714                 if (n == 12 && !FULL_REGS(fp)) {
1715                         printf("\n");
1716                         break;
1717                 }
1718         }
1719 #endif
1720         printf("pc  = ");
1721         xmon_print_symbol(fp->nip, " ", "\n");
1722         if (TRAP(fp) != 0xc00 && cpu_has_feature(CPU_FTR_CFAR)) {
1723                 printf("cfar= ");
1724                 xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1725         }
1726         printf("lr  = ");
1727         xmon_print_symbol(fp->link, " ", "\n");
1728         printf("msr = "REG"   cr  = %.8lx\n", fp->msr, fp->ccr);
1729         printf("ctr = "REG"   xer = "REG"   trap = %4lx\n",
1730                fp->ctr, fp->xer, fp->trap);
1731         trap = TRAP(fp);
1732         if (trap == 0x300 || trap == 0x380 || trap == 0x600)
1733                 printf("dar = "REG"   dsisr = %.8lx\n", fp->dar, fp->dsisr);
1734 }
1735
1736 static void cacheflush(void)
1737 {
1738         int cmd;
1739         unsigned long nflush;
1740
1741         cmd = inchar();
1742         if (cmd != 'i')
1743                 termch = cmd;
1744         scanhex((void *)&adrs);
1745         if (termch != '\n')
1746                 termch = 0;
1747         nflush = 1;
1748         scanhex(&nflush);
1749         nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1750         if (setjmp(bus_error_jmp) == 0) {
1751                 catch_memory_errors = 1;
1752                 sync();
1753
1754                 if (cmd != 'i') {
1755                         for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1756                                 cflush((void *) adrs);
1757                 } else {
1758                         for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1759                                 cinval((void *) adrs);
1760                 }
1761                 sync();
1762                 /* wait a little while to see if we get a machine check */
1763                 __delay(200);
1764         }
1765         catch_memory_errors = 0;
1766 }
1767
1768 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1769 extern void xmon_mtspr(int spr, unsigned long value);
1770
1771 static int
1772 read_spr(int n, unsigned long *vp)
1773 {
1774         unsigned long ret = -1UL;
1775         int ok = 0;
1776
1777         if (setjmp(bus_error_jmp) == 0) {
1778                 catch_spr_faults = 1;
1779                 sync();
1780
1781                 ret = xmon_mfspr(n, *vp);
1782
1783                 sync();
1784                 *vp = ret;
1785                 ok = 1;
1786         }
1787         catch_spr_faults = 0;
1788
1789         return ok;
1790 }
1791
1792 static void
1793 write_spr(int n, unsigned long val)
1794 {
1795         if (xmon_is_ro) {
1796                 printf(xmon_ro_msg);
1797                 return;
1798         }
1799
1800         if (setjmp(bus_error_jmp) == 0) {
1801                 catch_spr_faults = 1;
1802                 sync();
1803
1804                 xmon_mtspr(n, val);
1805
1806                 sync();
1807         } else {
1808                 printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
1809         }
1810         catch_spr_faults = 0;
1811 }
1812
1813 static void dump_206_sprs(void)
1814 {
1815 #ifdef CONFIG_PPC64
1816         if (!cpu_has_feature(CPU_FTR_ARCH_206))
1817                 return;
1818
1819         /* Actually some of these pre-date 2.06, but whatevs */
1820
1821         printf("srr0   = %.16lx  srr1  = %.16lx dsisr  = %.8lx\n",
1822                 mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
1823         printf("dscr   = %.16lx  ppr   = %.16lx pir    = %.8lx\n",
1824                 mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
1825         printf("amr    = %.16lx  uamor = %.16lx\n",
1826                 mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
1827
1828         if (!(mfmsr() & MSR_HV))
1829                 return;
1830
1831         printf("sdr1   = %.16lx  hdar  = %.16lx hdsisr = %.8lx\n",
1832                 mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
1833         printf("hsrr0  = %.16lx hsrr1  = %.16lx hdec   = %.16lx\n",
1834                 mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
1835         printf("lpcr   = %.16lx  pcr   = %.16lx lpidr  = %.8lx\n",
1836                 mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
1837         printf("hsprg0 = %.16lx hsprg1 = %.16lx amor   = %.16lx\n",
1838                 mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
1839         printf("dabr   = %.16lx dabrx  = %.16lx\n",
1840                 mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
1841 #endif
1842 }
1843
1844 static void dump_207_sprs(void)
1845 {
1846 #ifdef CONFIG_PPC64
1847         unsigned long msr;
1848
1849         if (!cpu_has_feature(CPU_FTR_ARCH_207S))
1850                 return;
1851
1852         printf("dpdes  = %.16lx  tir   = %.16lx cir    = %.8lx\n",
1853                 mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
1854
1855         printf("fscr   = %.16lx  tar   = %.16lx pspb   = %.8lx\n",
1856                 mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
1857
1858         msr = mfmsr();
1859         if (msr & MSR_TM) {
1860                 /* Only if TM has been enabled in the kernel */
1861                 printf("tfhar  = %.16lx  tfiar = %.16lx texasr = %.16lx\n",
1862                         mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
1863                         mfspr(SPRN_TEXASR));
1864         }
1865
1866         printf("mmcr0  = %.16lx  mmcr1 = %.16lx mmcr2  = %.16lx\n",
1867                 mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
1868         printf("pmc1   = %.8lx pmc2 = %.8lx  pmc3 = %.8lx  pmc4   = %.8lx\n",
1869                 mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
1870                 mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
1871         printf("mmcra  = %.16lx   siar = %.16lx pmc5   = %.8lx\n",
1872                 mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
1873         printf("sdar   = %.16lx   sier = %.16lx pmc6   = %.8lx\n",
1874                 mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
1875         printf("ebbhr  = %.16lx  ebbrr = %.16lx bescr  = %.16lx\n",
1876                 mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
1877         printf("iamr   = %.16lx\n", mfspr(SPRN_IAMR));
1878
1879         if (!(msr & MSR_HV))
1880                 return;
1881
1882         printf("hfscr  = %.16lx  dhdes = %.16lx rpr    = %.16lx\n",
1883                 mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
1884         printf("dawr   = %.16lx  dawrx = %.16lx ciabr  = %.16lx\n",
1885                 mfspr(SPRN_DAWR), mfspr(SPRN_DAWRX), mfspr(SPRN_CIABR));
1886 #endif
1887 }
1888
1889 static void dump_300_sprs(void)
1890 {
1891 #ifdef CONFIG_PPC64
1892         bool hv = mfmsr() & MSR_HV;
1893
1894         if (!cpu_has_feature(CPU_FTR_ARCH_300))
1895                 return;
1896
1897         printf("pidr   = %.16lx  tidr  = %.16lx\n",
1898                 mfspr(SPRN_PID), mfspr(SPRN_TIDR));
1899         printf("asdr   = %.16lx  psscr = %.16lx\n",
1900                 mfspr(SPRN_ASDR), hv ? mfspr(SPRN_PSSCR)
1901                                         : mfspr(SPRN_PSSCR_PR));
1902
1903         if (!hv)
1904                 return;
1905
1906         printf("ptcr   = %.16lx\n",
1907                 mfspr(SPRN_PTCR));
1908 #endif
1909 }
1910
1911 static void dump_one_spr(int spr, bool show_unimplemented)
1912 {
1913         unsigned long val;
1914
1915         val = 0xdeadbeef;
1916         if (!read_spr(spr, &val)) {
1917                 printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1918                 return;
1919         }
1920
1921         if (val == 0xdeadbeef) {
1922                 /* Looks like read was a nop, confirm */
1923                 val = 0x0badcafe;
1924                 if (!read_spr(spr, &val)) {
1925                         printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
1926                         return;
1927                 }
1928
1929                 if (val == 0x0badcafe) {
1930                         if (show_unimplemented)
1931                                 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
1932                         return;
1933                 }
1934         }
1935
1936         printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
1937 }
1938
1939 static void super_regs(void)
1940 {
1941         static unsigned long regno;
1942         int cmd;
1943         int spr;
1944
1945         cmd = skipbl();
1946
1947         switch (cmd) {
1948         case '\n': {
1949                 unsigned long sp, toc;
1950                 asm("mr %0,1" : "=r" (sp) :);
1951                 asm("mr %0,2" : "=r" (toc) :);
1952
1953                 printf("msr    = "REG"  sprg0 = "REG"\n",
1954                        mfmsr(), mfspr(SPRN_SPRG0));
1955                 printf("pvr    = "REG"  sprg1 = "REG"\n",
1956                        mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
1957                 printf("dec    = "REG"  sprg2 = "REG"\n",
1958                        mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
1959                 printf("sp     = "REG"  sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
1960                 printf("toc    = "REG"  dar   = "REG"\n", toc, mfspr(SPRN_DAR));
1961
1962                 dump_206_sprs();
1963                 dump_207_sprs();
1964                 dump_300_sprs();
1965
1966                 return;
1967         }
1968         case 'w': {
1969                 unsigned long val;
1970                 scanhex(&regno);
1971                 val = 0;
1972                 read_spr(regno, &val);
1973                 scanhex(&val);
1974                 write_spr(regno, val);
1975                 dump_one_spr(regno, true);
1976                 break;
1977         }
1978         case 'r':
1979                 scanhex(&regno);
1980                 dump_one_spr(regno, true);
1981                 break;
1982         case 'a':
1983                 /* dump ALL SPRs */
1984                 for (spr = 1; spr < 1024; ++spr)
1985                         dump_one_spr(spr, false);
1986                 break;
1987         }
1988
1989         scannl();
1990 }
1991
1992 /*
1993  * Stuff for reading and writing memory safely
1994  */
1995 static int
1996 mread(unsigned long adrs, void *buf, int size)
1997 {
1998         volatile int n;
1999         char *p, *q;
2000
2001         n = 0;
2002         if (setjmp(bus_error_jmp) == 0) {
2003                 catch_memory_errors = 1;
2004                 sync();
2005                 p = (char *)adrs;
2006                 q = (char *)buf;
2007                 switch (size) {
2008                 case 2:
2009                         *(u16 *)q = *(u16 *)p;
2010                         break;
2011                 case 4:
2012                         *(u32 *)q = *(u32 *)p;
2013                         break;
2014                 case 8:
2015                         *(u64 *)q = *(u64 *)p;
2016                         break;
2017                 default:
2018                         for( ; n < size; ++n) {
2019                                 *q++ = *p++;
2020                                 sync();
2021                         }
2022                 }
2023                 sync();
2024                 /* wait a little while to see if we get a machine check */
2025                 __delay(200);
2026                 n = size;
2027         }
2028         catch_memory_errors = 0;
2029         return n;
2030 }
2031
2032 static int
2033 mwrite(unsigned long adrs, void *buf, int size)
2034 {
2035         volatile int n;
2036         char *p, *q;
2037
2038         n = 0;
2039
2040         if (xmon_is_ro) {
2041                 printf(xmon_ro_msg);
2042                 return n;
2043         }
2044
2045         if (setjmp(bus_error_jmp) == 0) {
2046                 catch_memory_errors = 1;
2047                 sync();
2048                 p = (char *) adrs;
2049                 q = (char *) buf;
2050                 switch (size) {
2051                 case 2:
2052                         *(u16 *)p = *(u16 *)q;
2053                         break;
2054                 case 4:
2055                         *(u32 *)p = *(u32 *)q;
2056                         break;
2057                 case 8:
2058                         *(u64 *)p = *(u64 *)q;
2059                         break;
2060                 default:
2061                         for ( ; n < size; ++n) {
2062                                 *p++ = *q++;
2063                                 sync();
2064                         }
2065                 }
2066                 sync();
2067                 /* wait a little while to see if we get a machine check */
2068                 __delay(200);
2069                 n = size;
2070         } else {
2071                 printf("*** Error writing address "REG"\n", adrs + n);
2072         }
2073         catch_memory_errors = 0;
2074         return n;
2075 }
2076
2077 static int fault_type;
2078 static int fault_except;
2079 static char *fault_chars[] = { "--", "**", "##" };
2080
2081 static int handle_fault(struct pt_regs *regs)
2082 {
2083         fault_except = TRAP(regs);
2084         switch (TRAP(regs)) {
2085         case 0x200:
2086                 fault_type = 0;
2087                 break;
2088         case 0x300:
2089         case 0x380:
2090                 fault_type = 1;
2091                 break;
2092         default:
2093                 fault_type = 2;
2094         }
2095
2096         longjmp(bus_error_jmp, 1);
2097
2098         return 0;
2099 }
2100
2101 #define SWAP(a, b, t)   ((t) = (a), (a) = (b), (b) = (t))
2102
2103 static void
2104 byterev(unsigned char *val, int size)
2105 {
2106         int t;
2107         
2108         switch (size) {
2109         case 2:
2110                 SWAP(val[0], val[1], t);
2111                 break;
2112         case 4:
2113                 SWAP(val[0], val[3], t);
2114                 SWAP(val[1], val[2], t);
2115                 break;
2116         case 8: /* is there really any use for this? */
2117                 SWAP(val[0], val[7], t);
2118                 SWAP(val[1], val[6], t);
2119                 SWAP(val[2], val[5], t);
2120                 SWAP(val[3], val[4], t);
2121                 break;
2122         }
2123 }
2124
2125 static int brev;
2126 static int mnoread;
2127
2128 static char *memex_help_string =
2129     "Memory examine command usage:\n"
2130     "m [addr] [flags] examine/change memory\n"
2131     "  addr is optional.  will start where left off.\n"
2132     "  flags may include chars from this set:\n"
2133     "    b   modify by bytes (default)\n"
2134     "    w   modify by words (2 byte)\n"
2135     "    l   modify by longs (4 byte)\n"
2136     "    d   modify by doubleword (8 byte)\n"
2137     "    r   toggle reverse byte order mode\n"
2138     "    n   do not read memory (for i/o spaces)\n"
2139     "    .   ok to read (default)\n"
2140     "NOTE: flags are saved as defaults\n"
2141     "";
2142
2143 static char *memex_subcmd_help_string =
2144     "Memory examine subcommands:\n"
2145     "  hexval   write this val to current location\n"
2146     "  'string' write chars from string to this location\n"
2147     "  '        increment address\n"
2148     "  ^        decrement address\n"
2149     "  /        increment addr by 0x10.  //=0x100, ///=0x1000, etc\n"
2150     "  \\        decrement addr by 0x10.  \\\\=0x100, \\\\\\=0x1000, etc\n"
2151     "  `        clear no-read flag\n"
2152     "  ;        stay at this addr\n"
2153     "  v        change to byte mode\n"
2154     "  w        change to word (2 byte) mode\n"
2155     "  l        change to long (4 byte) mode\n"
2156     "  u        change to doubleword (8 byte) mode\n"
2157     "  m addr   change current addr\n"
2158     "  n        toggle no-read flag\n"
2159     "  r        toggle byte reverse flag\n"
2160     "  < count  back up count bytes\n"
2161     "  > count  skip forward count bytes\n"
2162     "  x        exit this mode\n"
2163     "";
2164
2165 static void
2166 memex(void)
2167 {
2168         int cmd, inc, i, nslash;
2169         unsigned long n;
2170         unsigned char val[16];
2171
2172         scanhex((void *)&adrs);
2173         cmd = skipbl();
2174         if (cmd == '?') {
2175                 printf(memex_help_string);
2176                 return;
2177         } else {
2178                 termch = cmd;
2179         }
2180         last_cmd = "m\n";
2181         while ((cmd = skipbl()) != '\n') {
2182                 switch( cmd ){
2183                 case 'b':       size = 1;       break;
2184                 case 'w':       size = 2;       break;
2185                 case 'l':       size = 4;       break;
2186                 case 'd':       size = 8;       break;
2187                 case 'r':       brev = !brev;   break;
2188                 case 'n':       mnoread = 1;    break;
2189                 case '.':       mnoread = 0;    break;
2190                 }
2191         }
2192         if( size <= 0 )
2193                 size = 1;
2194         else if( size > 8 )
2195                 size = 8;
2196         for(;;){
2197                 if (!mnoread)
2198                         n = mread(adrs, val, size);
2199                 printf(REG"%c", adrs, brev? 'r': ' ');
2200                 if (!mnoread) {
2201                         if (brev)
2202                                 byterev(val, size);
2203                         putchar(' ');
2204                         for (i = 0; i < n; ++i)
2205                                 printf("%.2x", val[i]);
2206                         for (; i < size; ++i)
2207                                 printf("%s", fault_chars[fault_type]);
2208                 }
2209                 putchar(' ');
2210                 inc = size;
2211                 nslash = 0;
2212                 for(;;){
2213                         if( scanhex(&n) ){
2214                                 for (i = 0; i < size; ++i)
2215                                         val[i] = n >> (i * 8);
2216                                 if (!brev)
2217                                         byterev(val, size);
2218                                 mwrite(adrs, val, size);
2219                                 inc = size;
2220                         }
2221                         cmd = skipbl();
2222                         if (cmd == '\n')
2223                                 break;
2224                         inc = 0;
2225                         switch (cmd) {
2226                         case '\'':
2227                                 for(;;){
2228                                         n = inchar();
2229                                         if( n == '\\' )
2230                                                 n = bsesc();
2231                                         else if( n == '\'' )
2232                                                 break;
2233                                         for (i = 0; i < size; ++i)
2234                                                 val[i] = n >> (i * 8);
2235                                         if (!brev)
2236                                                 byterev(val, size);
2237                                         mwrite(adrs, val, size);
2238                                         adrs += size;
2239                                 }
2240                                 adrs -= size;
2241                                 inc = size;
2242                                 break;
2243                         case ',':
2244                                 adrs += size;
2245                                 break;
2246                         case '.':
2247                                 mnoread = 0;
2248                                 break;
2249                         case ';':
2250                                 break;
2251                         case 'x':
2252                         case EOF:
2253                                 scannl();
2254                                 return;
2255                         case 'b':
2256                         case 'v':
2257                                 size = 1;
2258                                 break;
2259                         case 'w':
2260                                 size = 2;
2261                                 break;
2262                         case 'l':
2263                                 size = 4;
2264                                 break;
2265                         case 'u':
2266                                 size = 8;
2267                                 break;
2268                         case '^':
2269                                 adrs -= size;
2270                                 break;
2271                         case '/':
2272                                 if (nslash > 0)
2273                                         adrs -= 1 << nslash;
2274                                 else
2275                                         nslash = 0;
2276                                 nslash += 4;
2277                                 adrs += 1 << nslash;
2278                                 break;
2279                         case '\\':
2280                                 if (nslash < 0)
2281                                         adrs += 1 << -nslash;
2282                                 else
2283                                         nslash = 0;
2284                                 nslash -= 4;
2285                                 adrs -= 1 << -nslash;
2286                                 break;
2287                         case 'm':
2288                                 scanhex((void *)&adrs);
2289                                 break;
2290                         case 'n':
2291                                 mnoread = 1;
2292                                 break;
2293                         case 'r':
2294                                 brev = !brev;
2295                                 break;
2296                         case '<':
2297                                 n = size;
2298                                 scanhex(&n);
2299                                 adrs -= n;
2300                                 break;
2301                         case '>':
2302                                 n = size;
2303                                 scanhex(&n);
2304                                 adrs += n;
2305                                 break;
2306                         case '?':
2307                                 printf(memex_subcmd_help_string);
2308                                 break;
2309                         }
2310                 }
2311                 adrs += inc;
2312         }
2313 }
2314
2315 static int
2316 bsesc(void)
2317 {
2318         int c;
2319
2320         c = inchar();
2321         switch( c ){
2322         case 'n':       c = '\n';       break;
2323         case 'r':       c = '\r';       break;
2324         case 'b':       c = '\b';       break;
2325         case 't':       c = '\t';       break;
2326         }
2327         return c;
2328 }
2329
2330 static void xmon_rawdump (unsigned long adrs, long ndump)
2331 {
2332         long n, m, r, nr;
2333         unsigned char temp[16];
2334
2335         for (n = ndump; n > 0;) {
2336                 r = n < 16? n: 16;
2337                 nr = mread(adrs, temp, r);
2338                 adrs += nr;
2339                 for (m = 0; m < r; ++m) {
2340                         if (m < nr)
2341                                 printf("%.2x", temp[m]);
2342                         else
2343                                 printf("%s", fault_chars[fault_type]);
2344                 }
2345                 n -= r;
2346                 if (nr < r)
2347                         break;
2348         }
2349         printf("\n");
2350 }
2351
2352 static void dump_tracing(void)
2353 {
2354         int c;
2355
2356         c = inchar();
2357         if (c == 'c')
2358                 ftrace_dump(DUMP_ORIG);
2359         else
2360                 ftrace_dump(DUMP_ALL);
2361 }
2362
2363 #ifdef CONFIG_PPC64
2364 static void dump_one_paca(int cpu)
2365 {
2366         struct paca_struct *p;
2367 #ifdef CONFIG_PPC_BOOK3S_64
2368         int i = 0;
2369 #endif
2370
2371         if (setjmp(bus_error_jmp) != 0) {
2372                 printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2373                 return;
2374         }
2375
2376         catch_memory_errors = 1;
2377         sync();
2378
2379         p = paca_ptrs[cpu];
2380
2381         printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2382
2383         printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2384         printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2385         printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2386
2387 #define DUMP(paca, name, format)                                \
2388         printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2389                 offsetof(struct paca_struct, name));
2390
2391         DUMP(p, lock_token, "%#-*x");
2392         DUMP(p, paca_index, "%#-*x");
2393         DUMP(p, kernel_toc, "%#-*llx");
2394         DUMP(p, kernelbase, "%#-*llx");
2395         DUMP(p, kernel_msr, "%#-*llx");
2396         DUMP(p, emergency_sp, "%-*px");
2397 #ifdef CONFIG_PPC_BOOK3S_64
2398         DUMP(p, nmi_emergency_sp, "%-*px");
2399         DUMP(p, mc_emergency_sp, "%-*px");
2400         DUMP(p, in_nmi, "%#-*x");
2401         DUMP(p, in_mce, "%#-*x");
2402         DUMP(p, hmi_event_available, "%#-*x");
2403 #endif
2404         DUMP(p, data_offset, "%#-*llx");
2405         DUMP(p, hw_cpu_id, "%#-*x");
2406         DUMP(p, cpu_start, "%#-*x");
2407         DUMP(p, kexec_state, "%#-*x");
2408 #ifdef CONFIG_PPC_BOOK3S_64
2409         if (!early_radix_enabled()) {
2410                 for (i = 0; i < SLB_NUM_BOLTED; i++) {
2411                         u64 esid, vsid;
2412
2413                         if (!p->slb_shadow_ptr)
2414                                 continue;
2415
2416                         esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2417                         vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2418
2419                         if (esid || vsid) {
2420                                 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2421                                        22, "slb_shadow", i, esid, vsid);
2422                         }
2423                 }
2424                 DUMP(p, vmalloc_sllp, "%#-*x");
2425                 DUMP(p, stab_rr, "%#-*x");
2426                 DUMP(p, slb_used_bitmap, "%#-*x");
2427                 DUMP(p, slb_kern_bitmap, "%#-*x");
2428
2429                 if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2430                         DUMP(p, slb_cache_ptr, "%#-*x");
2431                         for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2432                                 printf(" %-*s[%d] = 0x%016x\n",
2433                                        22, "slb_cache", i, p->slb_cache[i]);
2434                 }
2435         }
2436
2437         DUMP(p, rfi_flush_fallback_area, "%-*px");
2438 #endif
2439         DUMP(p, dscr_default, "%#-*llx");
2440 #ifdef CONFIG_PPC_BOOK3E
2441         DUMP(p, pgd, "%-*px");
2442         DUMP(p, kernel_pgd, "%-*px");
2443         DUMP(p, tcd_ptr, "%-*px");
2444         DUMP(p, mc_kstack, "%-*px");
2445         DUMP(p, crit_kstack, "%-*px");
2446         DUMP(p, dbg_kstack, "%-*px");
2447 #endif
2448         DUMP(p, __current, "%-*px");
2449         DUMP(p, kstack, "%#-*llx");
2450         printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2451 #ifdef CONFIG_STACKPROTECTOR
2452         DUMP(p, canary, "%#-*lx");
2453 #endif
2454         DUMP(p, saved_r1, "%#-*llx");
2455         DUMP(p, trap_save, "%#-*x");
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_huge(*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_huge(*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_huge(*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