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