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