Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Routines providing a simple monitor for use on the PowerMac.
0004  *
0005  * Copyright (C) 1996-2005 Paul Mackerras.
0006  * Copyright (C) 2001 PPC64 Team, IBM Corp
0007  * Copyrignt (C) 2006 Michael Ellerman, IBM Corp
0008  */
0009 
0010 #include <linux/kernel.h>
0011 #include <linux/errno.h>
0012 #include <linux/sched/signal.h>
0013 #include <linux/smp.h>
0014 #include <linux/mm.h>
0015 #include <linux/reboot.h>
0016 #include <linux/delay.h>
0017 #include <linux/kallsyms.h>
0018 #include <linux/kmsg_dump.h>
0019 #include <linux/cpumask.h>
0020 #include <linux/export.h>
0021 #include <linux/sysrq.h>
0022 #include <linux/interrupt.h>
0023 #include <linux/irq.h>
0024 #include <linux/bug.h>
0025 #include <linux/nmi.h>
0026 #include <linux/ctype.h>
0027 #include <linux/highmem.h>
0028 #include <linux/security.h>
0029 #include <linux/debugfs.h>
0030 
0031 #include <asm/ptrace.h>
0032 #include <asm/smp.h>
0033 #include <asm/string.h>
0034 #include <asm/machdep.h>
0035 #include <asm/xmon.h>
0036 #include <asm/processor.h>
0037 #include <asm/mmu.h>
0038 #include <asm/mmu_context.h>
0039 #include <asm/plpar_wrappers.h>
0040 #include <asm/cputable.h>
0041 #include <asm/rtas.h>
0042 #include <asm/sstep.h>
0043 #include <asm/irq_regs.h>
0044 #include <asm/spu.h>
0045 #include <asm/spu_priv1.h>
0046 #include <asm/setjmp.h>
0047 #include <asm/reg.h>
0048 #include <asm/debug.h>
0049 #include <asm/hw_breakpoint.h>
0050 #include <asm/xive.h>
0051 #include <asm/opal.h>
0052 #include <asm/firmware.h>
0053 #include <asm/code-patching.h>
0054 #include <asm/sections.h>
0055 #include <asm/inst.h>
0056 #include <asm/interrupt.h>
0057 
0058 #ifdef CONFIG_PPC64
0059 #include <asm/hvcall.h>
0060 #include <asm/paca.h>
0061 #endif
0062 
0063 #include "nonstdio.h"
0064 #include "dis-asm.h"
0065 #include "xmon_bpts.h"
0066 
0067 #ifdef CONFIG_SMP
0068 static cpumask_t cpus_in_xmon = CPU_MASK_NONE;
0069 static unsigned long xmon_taken = 1;
0070 static int xmon_owner;
0071 static int xmon_gate;
0072 static int xmon_batch;
0073 static unsigned long xmon_batch_start_cpu;
0074 static cpumask_t xmon_batch_cpus = CPU_MASK_NONE;
0075 #else
0076 #define xmon_owner 0
0077 #endif /* CONFIG_SMP */
0078 
0079 #ifdef CONFIG_PPC_PSERIES
0080 static int set_indicator_token = RTAS_UNKNOWN_SERVICE;
0081 #endif
0082 static unsigned long in_xmon __read_mostly = 0;
0083 static int xmon_on = IS_ENABLED(CONFIG_XMON_DEFAULT);
0084 static bool xmon_is_ro = IS_ENABLED(CONFIG_XMON_DEFAULT_RO_MODE);
0085 
0086 static unsigned long adrs;
0087 static int size = 1;
0088 #define MAX_DUMP (64 * 1024)
0089 static unsigned long ndump = 64;
0090 #define MAX_IDUMP (MAX_DUMP >> 2)
0091 static unsigned long nidump = 16;
0092 static unsigned long ncsum = 4096;
0093 static int termch;
0094 static char tmpstr[128];
0095 static int tracing_enabled;
0096 
0097 static long bus_error_jmp[JMP_BUF_LEN];
0098 static int catch_memory_errors;
0099 static int catch_spr_faults;
0100 static long *xmon_fault_jmp[NR_CPUS];
0101 
0102 /* Breakpoint stuff */
0103 struct bpt {
0104     unsigned long   address;
0105     u32     *instr;
0106     atomic_t    ref_count;
0107     int     enabled;
0108     unsigned long   pad;
0109 };
0110 
0111 /* Bits in bpt.enabled */
0112 #define BP_CIABR    1
0113 #define BP_TRAP     2
0114 #define BP_DABR     4
0115 
0116 static struct bpt bpts[NBPTS];
0117 static struct bpt dabr[HBP_NUM_MAX];
0118 static struct bpt *iabr;
0119 static unsigned int bpinstr = PPC_RAW_TRAP();
0120 
0121 #define BP_NUM(bp)  ((bp) - bpts + 1)
0122 
0123 /* Prototypes */
0124 static int cmds(struct pt_regs *);
0125 static int mread(unsigned long, void *, int);
0126 static int mwrite(unsigned long, void *, int);
0127 static int mread_instr(unsigned long, ppc_inst_t *);
0128 static int handle_fault(struct pt_regs *);
0129 static void byterev(unsigned char *, int);
0130 static void memex(void);
0131 static int bsesc(void);
0132 static void dump(void);
0133 static void show_pte(unsigned long);
0134 static void prdump(unsigned long, long);
0135 static int ppc_inst_dump(unsigned long, long, int);
0136 static void dump_log_buf(void);
0137 
0138 #ifdef CONFIG_SMP
0139 static int xmon_switch_cpu(unsigned long);
0140 static int xmon_batch_next_cpu(void);
0141 static int batch_cmds(struct pt_regs *);
0142 #endif
0143 
0144 #ifdef CONFIG_PPC_POWERNV
0145 static void dump_opal_msglog(void);
0146 #else
0147 static inline void dump_opal_msglog(void)
0148 {
0149     printf("Machine is not running OPAL firmware.\n");
0150 }
0151 #endif
0152 
0153 static void backtrace(struct pt_regs *);
0154 static void excprint(struct pt_regs *);
0155 static void prregs(struct pt_regs *);
0156 static void memops(int);
0157 static void memlocate(void);
0158 static void memzcan(void);
0159 static void memdiffs(unsigned char *, unsigned char *, unsigned, unsigned);
0160 int skipbl(void);
0161 int scanhex(unsigned long *valp);
0162 static void scannl(void);
0163 static int hexdigit(int);
0164 void getstring(char *, int);
0165 static void flush_input(void);
0166 static int inchar(void);
0167 static void take_input(char *);
0168 static int  read_spr(int, unsigned long *);
0169 static void write_spr(int, unsigned long);
0170 static void super_regs(void);
0171 static void remove_bpts(void);
0172 static void insert_bpts(void);
0173 static void remove_cpu_bpts(void);
0174 static void insert_cpu_bpts(void);
0175 static struct bpt *at_breakpoint(unsigned long pc);
0176 static struct bpt *in_breakpoint_table(unsigned long pc, unsigned long *offp);
0177 static int  do_step(struct pt_regs *);
0178 static void bpt_cmds(void);
0179 static void cacheflush(void);
0180 static int  cpu_cmd(void);
0181 static void csum(void);
0182 static void bootcmds(void);
0183 static void proccall(void);
0184 static void show_tasks(void);
0185 void dump_segments(void);
0186 static void symbol_lookup(void);
0187 static void xmon_show_stack(unsigned long sp, unsigned long lr,
0188                 unsigned long pc);
0189 static void xmon_print_symbol(unsigned long address, const char *mid,
0190                   const char *after);
0191 static const char *getvecname(unsigned long vec);
0192 
0193 static int do_spu_cmd(void);
0194 
0195 #ifdef CONFIG_44x
0196 static void dump_tlb_44x(void);
0197 #endif
0198 #ifdef CONFIG_PPC_BOOK3E
0199 static void dump_tlb_book3e(void);
0200 #endif
0201 
0202 static void clear_all_bpt(void);
0203 
0204 #ifdef CONFIG_PPC64
0205 #define REG     "%.16lx"
0206 #else
0207 #define REG     "%.8lx"
0208 #endif
0209 
0210 #ifdef __LITTLE_ENDIAN__
0211 #define GETWORD(v)  (((v)[3] << 24) + ((v)[2] << 16) + ((v)[1] << 8) + (v)[0])
0212 #else
0213 #define GETWORD(v)  (((v)[0] << 24) + ((v)[1] << 16) + ((v)[2] << 8) + (v)[3])
0214 #endif
0215 
0216 static const char *xmon_ro_msg = "Operation disabled: xmon in read-only mode\n";
0217 
0218 static char *help_string = "\
0219 Commands:\n\
0220   b show breakpoints\n\
0221   bd    set data breakpoint\n\
0222   bi    set instruction breakpoint\n\
0223   bc    clear breakpoint\n"
0224 #ifdef CONFIG_SMP
0225   "\
0226   c print cpus stopped in xmon\n\
0227   c#    try to switch to cpu number h (in hex)\n\
0228   c# $  run command '$' (one of 'r','S' or 't') on all cpus in xmon\n"
0229 #endif
0230   "\
0231   C checksum\n\
0232   d dump bytes\n\
0233   d1    dump 1 byte values\n\
0234   d2    dump 2 byte values\n\
0235   d4    dump 4 byte values\n\
0236   d8    dump 8 byte values\n\
0237   di    dump instructions\n\
0238   df    dump float values\n\
0239   dd    dump double values\n\
0240   dl    dump the kernel log buffer\n"
0241 #ifdef CONFIG_PPC_POWERNV
0242   "\
0243   do    dump the OPAL message log\n"
0244 #endif
0245 #ifdef CONFIG_PPC64
0246   "\
0247   dp[#] dump paca for current cpu, or cpu #\n\
0248   dpa   dump paca for all possible cpus\n"
0249 #endif
0250   "\
0251   dr    dump stream of raw bytes\n\
0252   dv    dump virtual address translation \n\
0253   dt    dump the tracing buffers (uses printk)\n\
0254   dtc   dump the tracing buffers for current CPU (uses printk)\n\
0255 "
0256 #ifdef CONFIG_PPC_POWERNV
0257 "  dx#   dump xive on CPU #\n\
0258   dxi#  dump xive irq state #\n\
0259   dxa   dump xive on all CPUs\n"
0260 #endif
0261 "  e    print exception information\n\
0262   f flush cache\n\
0263   la    lookup symbol+offset of specified address\n\
0264   ls    lookup address of specified symbol\n\
0265   lp s [#]  lookup address of percpu symbol s for current cpu, or cpu #\n\
0266   m examine/change memory\n\
0267   mm    move a block of memory\n\
0268   ms    set a block of memory\n\
0269   md    compare two blocks of memory\n\
0270   ml    locate a block of memory\n\
0271   mz    zero a block of memory\n\
0272   mi    show information about memory allocation\n\
0273   p     call a procedure\n\
0274   P     list processes/tasks\n\
0275   r print registers\n\
0276   s single step\n"
0277 #ifdef CONFIG_SPU_BASE
0278 "  ss   stop execution on all spus\n\
0279   sr    restore execution on stopped spus\n\
0280   sf  # dump spu fields for spu # (in hex)\n\
0281   sd  # dump spu local store for spu # (in hex)\n\
0282   sdi # disassemble spu local store for spu # (in hex)\n"
0283 #endif
0284 "  S    print special registers\n\
0285   Sa    print all SPRs\n\
0286   Sr #  read SPR #\n\
0287   Sw #v write v to SPR #\n\
0288   t print backtrace\n\
0289   x exit monitor and recover\n\
0290   X exit monitor and don't recover\n"
0291 #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_BOOK3E)
0292 "  u    dump segment table or SLB\n"
0293 #elif defined(CONFIG_PPC_BOOK3S_32)
0294 "  u    dump segment registers\n"
0295 #elif defined(CONFIG_44x) || defined(CONFIG_PPC_BOOK3E)
0296 "  u    dump TLB\n"
0297 #endif
0298 "  U    show uptime information\n"
0299 "  ?    help\n"
0300 "  # n  limit output to n lines per page (for dp, dpa, dl)\n"
0301 "  zr   reboot\n"
0302 "  zh   halt\n"
0303 ;
0304 
0305 #ifdef CONFIG_SECURITY
0306 static bool xmon_is_locked_down(void)
0307 {
0308     static bool lockdown;
0309 
0310     if (!lockdown) {
0311         lockdown = !!security_locked_down(LOCKDOWN_XMON_RW);
0312         if (lockdown) {
0313             printf("xmon: Disabled due to kernel lockdown\n");
0314             xmon_is_ro = true;
0315         }
0316     }
0317 
0318     if (!xmon_is_ro) {
0319         xmon_is_ro = !!security_locked_down(LOCKDOWN_XMON_WR);
0320         if (xmon_is_ro)
0321             printf("xmon: Read-only due to kernel lockdown\n");
0322     }
0323 
0324     return lockdown;
0325 }
0326 #else /* CONFIG_SECURITY */
0327 static inline bool xmon_is_locked_down(void)
0328 {
0329     return false;
0330 }
0331 #endif
0332 
0333 static struct pt_regs *xmon_regs;
0334 
0335 static inline void sync(void)
0336 {
0337     asm volatile("sync; isync");
0338 }
0339 
0340 static inline void cflush(void *p)
0341 {
0342     asm volatile ("dcbf 0,%0; icbi 0,%0" : : "r" (p));
0343 }
0344 
0345 static inline void cinval(void *p)
0346 {
0347     asm volatile ("dcbi 0,%0; icbi 0,%0" : : "r" (p));
0348 }
0349 
0350 /**
0351  * write_ciabr() - write the CIABR SPR
0352  * @ciabr:  The value to write.
0353  *
0354  * This function writes a value to the CIARB register either directly
0355  * through mtspr instruction if the kernel is in HV privilege mode or
0356  * call a hypervisor function to achieve the same in case the kernel
0357  * is in supervisor privilege mode.
0358  */
0359 static void write_ciabr(unsigned long ciabr)
0360 {
0361     if (!cpu_has_feature(CPU_FTR_ARCH_207S))
0362         return;
0363 
0364     if (cpu_has_feature(CPU_FTR_HVMODE)) {
0365         mtspr(SPRN_CIABR, ciabr);
0366         return;
0367     }
0368     plpar_set_ciabr(ciabr);
0369 }
0370 
0371 /**
0372  * set_ciabr() - set the CIABR
0373  * @addr:   The value to set.
0374  *
0375  * This function sets the correct privilege value into the HW
0376  * breakpoint address before writing it up in the CIABR register.
0377  */
0378 static void set_ciabr(unsigned long addr)
0379 {
0380     addr &= ~CIABR_PRIV;
0381 
0382     if (cpu_has_feature(CPU_FTR_HVMODE))
0383         addr |= CIABR_PRIV_HYPER;
0384     else
0385         addr |= CIABR_PRIV_SUPER;
0386     write_ciabr(addr);
0387 }
0388 
0389 /*
0390  * Disable surveillance (the service processor watchdog function)
0391  * while we are in xmon.
0392  * XXX we should re-enable it when we leave. :)
0393  */
0394 #define SURVEILLANCE_TOKEN  9000
0395 
0396 static inline void disable_surveillance(void)
0397 {
0398 #ifdef CONFIG_PPC_PSERIES
0399     /* Since this can't be a module, args should end up below 4GB. */
0400     static struct rtas_args args;
0401 
0402     /*
0403      * At this point we have got all the cpus we can into
0404      * xmon, so there is hopefully no other cpu calling RTAS
0405      * at the moment, even though we don't take rtas.lock.
0406      * If we did try to take rtas.lock there would be a
0407      * real possibility of deadlock.
0408      */
0409     if (set_indicator_token == RTAS_UNKNOWN_SERVICE)
0410         return;
0411 
0412     rtas_call_unlocked(&args, set_indicator_token, 3, 1, NULL,
0413                SURVEILLANCE_TOKEN, 0, 0);
0414 
0415 #endif /* CONFIG_PPC_PSERIES */
0416 }
0417 
0418 #ifdef CONFIG_SMP
0419 static int xmon_speaker;
0420 
0421 static void get_output_lock(void)
0422 {
0423     int me = smp_processor_id() + 0x100;
0424     int last_speaker = 0, prev;
0425     long timeout;
0426 
0427     if (xmon_speaker == me)
0428         return;
0429 
0430     for (;;) {
0431         last_speaker = cmpxchg(&xmon_speaker, 0, me);
0432         if (last_speaker == 0)
0433             return;
0434 
0435         /*
0436          * Wait a full second for the lock, we might be on a slow
0437          * console, but check every 100us.
0438          */
0439         timeout = 10000;
0440         while (xmon_speaker == last_speaker) {
0441             if (--timeout > 0) {
0442                 udelay(100);
0443                 continue;
0444             }
0445 
0446             /* hostile takeover */
0447             prev = cmpxchg(&xmon_speaker, last_speaker, me);
0448             if (prev == last_speaker)
0449                 return;
0450             break;
0451         }
0452     }
0453 }
0454 
0455 static void release_output_lock(void)
0456 {
0457     xmon_speaker = 0;
0458 }
0459 
0460 int cpus_are_in_xmon(void)
0461 {
0462     return !cpumask_empty(&cpus_in_xmon);
0463 }
0464 
0465 static bool wait_for_other_cpus(int ncpus)
0466 {
0467     unsigned long timeout;
0468 
0469     /* We wait for 2s, which is a metric "little while" */
0470     for (timeout = 20000; timeout != 0; --timeout) {
0471         if (cpumask_weight(&cpus_in_xmon) >= ncpus)
0472             return true;
0473         udelay(100);
0474         barrier();
0475     }
0476 
0477     return false;
0478 }
0479 #else /* CONFIG_SMP */
0480 static inline void get_output_lock(void) {}
0481 static inline void release_output_lock(void) {}
0482 #endif
0483 
0484 static void xmon_touch_watchdogs(void)
0485 {
0486     touch_softlockup_watchdog_sync();
0487     rcu_cpu_stall_reset();
0488     touch_nmi_watchdog();
0489 }
0490 
0491 static int xmon_core(struct pt_regs *regs, volatile int fromipi)
0492 {
0493     volatile int cmd = 0;
0494     struct bpt *volatile bp;
0495     long recurse_jmp[JMP_BUF_LEN];
0496     bool locked_down;
0497     unsigned long offset;
0498     unsigned long flags;
0499 #ifdef CONFIG_SMP
0500     int cpu;
0501     int secondary;
0502 #endif
0503 
0504     local_irq_save(flags);
0505     hard_irq_disable();
0506 
0507     locked_down = xmon_is_locked_down();
0508 
0509     if (!fromipi) {
0510         tracing_enabled = tracing_is_on();
0511         tracing_off();
0512     }
0513 
0514     bp = in_breakpoint_table(regs->nip, &offset);
0515     if (bp != NULL) {
0516         regs_set_return_ip(regs, bp->address + offset);
0517         atomic_dec(&bp->ref_count);
0518     }
0519 
0520     remove_cpu_bpts();
0521 
0522 #ifdef CONFIG_SMP
0523     cpu = smp_processor_id();
0524     if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
0525         /*
0526          * We catch SPR read/write faults here because the 0x700, 0xf60
0527          * etc. handlers don't call debugger_fault_handler().
0528          */
0529         if (catch_spr_faults)
0530             longjmp(bus_error_jmp, 1);
0531         get_output_lock();
0532         excprint(regs);
0533         printf("cpu 0x%x: Exception %lx %s in xmon, "
0534                "returning to main loop\n",
0535                cpu, regs->trap, getvecname(TRAP(regs)));
0536         release_output_lock();
0537         longjmp(xmon_fault_jmp[cpu], 1);
0538     }
0539 
0540     if (setjmp(recurse_jmp) != 0) {
0541         if (!in_xmon || !xmon_gate) {
0542             get_output_lock();
0543             printf("xmon: WARNING: bad recursive fault "
0544                    "on cpu 0x%x\n", cpu);
0545             release_output_lock();
0546             goto waiting;
0547         }
0548         secondary = !(xmon_taken && cpu == xmon_owner);
0549         goto cmdloop;
0550     }
0551 
0552     xmon_fault_jmp[cpu] = recurse_jmp;
0553 
0554     bp = NULL;
0555     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT))
0556         bp = at_breakpoint(regs->nip);
0557     if (bp || regs_is_unrecoverable(regs))
0558         fromipi = 0;
0559 
0560     if (!fromipi) {
0561         get_output_lock();
0562         if (!locked_down)
0563             excprint(regs);
0564         if (bp) {
0565             printf("cpu 0x%x stopped at breakpoint 0x%tx (",
0566                    cpu, BP_NUM(bp));
0567             xmon_print_symbol(regs->nip, " ", ")\n");
0568         }
0569         if (regs_is_unrecoverable(regs))
0570             printf("WARNING: exception is not recoverable, "
0571                    "can't continue\n");
0572         release_output_lock();
0573     }
0574 
0575     cpumask_set_cpu(cpu, &cpus_in_xmon);
0576 
0577  waiting:
0578     secondary = 1;
0579     spin_begin();
0580     while (secondary && !xmon_gate) {
0581         if (in_xmon == 0) {
0582             if (fromipi) {
0583                 spin_end();
0584                 goto leave;
0585             }
0586             secondary = test_and_set_bit(0, &in_xmon);
0587         }
0588         spin_cpu_relax();
0589         touch_nmi_watchdog();
0590     }
0591     spin_end();
0592 
0593     if (!secondary && !xmon_gate) {
0594         /* we are the first cpu to come in */
0595         /* interrupt other cpu(s) */
0596         int ncpus = num_online_cpus();
0597 
0598         xmon_owner = cpu;
0599         mb();
0600         if (ncpus > 1) {
0601             /*
0602              * A system reset (trap == 0x100) can be triggered on
0603              * all CPUs, so when we come in via 0x100 try waiting
0604              * for the other CPUs to come in before we send the
0605              * debugger break (IPI). This is similar to
0606              * crash_kexec_secondary().
0607              */
0608             if (TRAP(regs) !=  INTERRUPT_SYSTEM_RESET || !wait_for_other_cpus(ncpus))
0609                 smp_send_debugger_break();
0610 
0611             wait_for_other_cpus(ncpus);
0612         }
0613         remove_bpts();
0614         disable_surveillance();
0615 
0616         if (!locked_down) {
0617             /* for breakpoint or single step, print curr insn */
0618             if (bp || TRAP(regs) == INTERRUPT_TRACE)
0619                 ppc_inst_dump(regs->nip, 1, 0);
0620             printf("enter ? for help\n");
0621         }
0622 
0623         mb();
0624         xmon_gate = 1;
0625         barrier();
0626         touch_nmi_watchdog();
0627     }
0628 
0629  cmdloop:
0630     while (in_xmon) {
0631         if (secondary) {
0632             spin_begin();
0633             if (cpu == xmon_owner) {
0634                 if (!test_and_set_bit(0, &xmon_taken)) {
0635                     secondary = 0;
0636                     spin_end();
0637                     continue;
0638                 }
0639                 /* missed it */
0640                 while (cpu == xmon_owner)
0641                     spin_cpu_relax();
0642             }
0643             spin_cpu_relax();
0644             touch_nmi_watchdog();
0645         } else {
0646             cmd = 1;
0647 #ifdef CONFIG_SMP
0648             if (xmon_batch)
0649                 cmd = batch_cmds(regs);
0650 #endif
0651             if (!locked_down && cmd)
0652                 cmd = cmds(regs);
0653             if (locked_down || cmd != 0) {
0654                 /* exiting xmon */
0655                 insert_bpts();
0656                 xmon_gate = 0;
0657                 wmb();
0658                 in_xmon = 0;
0659                 break;
0660             }
0661             /* have switched to some other cpu */
0662             secondary = 1;
0663         }
0664     }
0665  leave:
0666     cpumask_clear_cpu(cpu, &cpus_in_xmon);
0667     xmon_fault_jmp[cpu] = NULL;
0668 #else
0669     /* UP is simple... */
0670     if (in_xmon) {
0671         printf("Exception %lx %s in xmon, returning to main loop\n",
0672                regs->trap, getvecname(TRAP(regs)));
0673         longjmp(xmon_fault_jmp[0], 1);
0674     }
0675     if (setjmp(recurse_jmp) == 0) {
0676         xmon_fault_jmp[0] = recurse_jmp;
0677         in_xmon = 1;
0678 
0679         excprint(regs);
0680         bp = at_breakpoint(regs->nip);
0681         if (bp) {
0682             printf("Stopped at breakpoint %tx (", BP_NUM(bp));
0683             xmon_print_symbol(regs->nip, " ", ")\n");
0684         }
0685         if (regs_is_unrecoverable(regs))
0686             printf("WARNING: exception is not recoverable, "
0687                    "can't continue\n");
0688         remove_bpts();
0689         disable_surveillance();
0690         if (!locked_down) {
0691             /* for breakpoint or single step, print current insn */
0692             if (bp || TRAP(regs) == INTERRUPT_TRACE)
0693                 ppc_inst_dump(regs->nip, 1, 0);
0694             printf("enter ? for help\n");
0695         }
0696     }
0697 
0698     if (!locked_down)
0699         cmd = cmds(regs);
0700 
0701     insert_bpts();
0702     in_xmon = 0;
0703 #endif
0704 
0705 #ifdef CONFIG_BOOKE
0706     if (regs->msr & MSR_DE) {
0707         bp = at_breakpoint(regs->nip);
0708         if (bp != NULL) {
0709             regs_set_return_ip(regs, (unsigned long) &bp->instr[0]);
0710             atomic_inc(&bp->ref_count);
0711         }
0712     }
0713 #else
0714     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
0715         bp = at_breakpoint(regs->nip);
0716         if (bp != NULL) {
0717             int stepped = emulate_step(regs, ppc_inst_read(bp->instr));
0718             if (stepped == 0) {
0719                 regs_set_return_ip(regs, (unsigned long) &bp->instr[0]);
0720                 atomic_inc(&bp->ref_count);
0721             } else if (stepped < 0) {
0722                 printf("Couldn't single-step %s instruction\n",
0723                     IS_RFID(ppc_inst_read(bp->instr))? "rfid": "mtmsrd");
0724             }
0725         }
0726     }
0727 #endif
0728     if (locked_down)
0729         clear_all_bpt();
0730     else
0731         insert_cpu_bpts();
0732 
0733     xmon_touch_watchdogs();
0734     local_irq_restore(flags);
0735 
0736     return cmd != 'X' && cmd != EOF;
0737 }
0738 
0739 int xmon(struct pt_regs *excp)
0740 {
0741     struct pt_regs regs;
0742 
0743     if (excp == NULL) {
0744         ppc_save_regs(&regs);
0745         excp = &regs;
0746     }
0747 
0748     return xmon_core(excp, 0);
0749 }
0750 EXPORT_SYMBOL(xmon);
0751 
0752 irqreturn_t xmon_irq(int irq, void *d)
0753 {
0754     unsigned long flags;
0755     local_irq_save(flags);
0756     printf("Keyboard interrupt\n");
0757     xmon(get_irq_regs());
0758     local_irq_restore(flags);
0759     return IRQ_HANDLED;
0760 }
0761 
0762 static int xmon_bpt(struct pt_regs *regs)
0763 {
0764     struct bpt *bp;
0765     unsigned long offset;
0766 
0767     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
0768         return 0;
0769 
0770     /* Are we at the trap at bp->instr[1] for some bp? */
0771     bp = in_breakpoint_table(regs->nip, &offset);
0772     if (bp != NULL && (offset == 4 || offset == 8)) {
0773         regs_set_return_ip(regs, bp->address + offset);
0774         atomic_dec(&bp->ref_count);
0775         return 1;
0776     }
0777 
0778     /* Are we at a breakpoint? */
0779     bp = at_breakpoint(regs->nip);
0780     if (!bp)
0781         return 0;
0782 
0783     xmon_core(regs, 0);
0784 
0785     return 1;
0786 }
0787 
0788 static int xmon_sstep(struct pt_regs *regs)
0789 {
0790     if (user_mode(regs))
0791         return 0;
0792     xmon_core(regs, 0);
0793     return 1;
0794 }
0795 
0796 static int xmon_break_match(struct pt_regs *regs)
0797 {
0798     int i;
0799 
0800     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
0801         return 0;
0802     for (i = 0; i < nr_wp_slots(); i++) {
0803         if (dabr[i].enabled)
0804             goto found;
0805     }
0806     return 0;
0807 
0808 found:
0809     xmon_core(regs, 0);
0810     return 1;
0811 }
0812 
0813 static int xmon_iabr_match(struct pt_regs *regs)
0814 {
0815     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) != (MSR_IR|MSR_64BIT))
0816         return 0;
0817     if (iabr == NULL)
0818         return 0;
0819     xmon_core(regs, 0);
0820     return 1;
0821 }
0822 
0823 static int xmon_ipi(struct pt_regs *regs)
0824 {
0825 #ifdef CONFIG_SMP
0826     if (in_xmon && !cpumask_test_cpu(smp_processor_id(), &cpus_in_xmon))
0827         xmon_core(regs, 1);
0828 #endif
0829     return 0;
0830 }
0831 
0832 static int xmon_fault_handler(struct pt_regs *regs)
0833 {
0834     struct bpt *bp;
0835     unsigned long offset;
0836 
0837     if (in_xmon && catch_memory_errors)
0838         handle_fault(regs); /* doesn't return */
0839 
0840     if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) {
0841         bp = in_breakpoint_table(regs->nip, &offset);
0842         if (bp != NULL) {
0843             regs_set_return_ip(regs, bp->address + offset);
0844             atomic_dec(&bp->ref_count);
0845         }
0846     }
0847 
0848     return 0;
0849 }
0850 
0851 /* Force enable xmon if not already enabled */
0852 static inline void force_enable_xmon(void)
0853 {
0854     /* Enable xmon hooks if needed */
0855     if (!xmon_on) {
0856         printf("xmon: Enabling debugger hooks\n");
0857         xmon_on = 1;
0858     }
0859 }
0860 
0861 static struct bpt *at_breakpoint(unsigned long pc)
0862 {
0863     int i;
0864     struct bpt *volatile bp;
0865 
0866     bp = bpts;
0867     for (i = 0; i < NBPTS; ++i, ++bp)
0868         if (bp->enabled && pc == bp->address)
0869             return bp;
0870     return NULL;
0871 }
0872 
0873 static struct bpt *in_breakpoint_table(unsigned long nip, unsigned long *offp)
0874 {
0875     unsigned long off;
0876 
0877     off = nip - (unsigned long)bpt_table;
0878     if (off >= sizeof(bpt_table))
0879         return NULL;
0880     *offp = off & (BPT_SIZE - 1);
0881     if (off & 3)
0882         return NULL;
0883     return bpts + (off / BPT_SIZE);
0884 }
0885 
0886 static struct bpt *new_breakpoint(unsigned long a)
0887 {
0888     struct bpt *bp;
0889 
0890     a &= ~3UL;
0891     bp = at_breakpoint(a);
0892     if (bp)
0893         return bp;
0894 
0895     for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
0896         if (!bp->enabled && atomic_read(&bp->ref_count) == 0) {
0897             bp->address = a;
0898             bp->instr = (void *)(bpt_table + ((bp - bpts) * BPT_WORDS));
0899             return bp;
0900         }
0901     }
0902 
0903     printf("Sorry, no free breakpoints.  Please clear one first.\n");
0904     return NULL;
0905 }
0906 
0907 static void insert_bpts(void)
0908 {
0909     int i;
0910     ppc_inst_t instr, instr2;
0911     struct bpt *bp, *bp2;
0912 
0913     bp = bpts;
0914     for (i = 0; i < NBPTS; ++i, ++bp) {
0915         if ((bp->enabled & (BP_TRAP|BP_CIABR)) == 0)
0916             continue;
0917         if (!mread_instr(bp->address, &instr)) {
0918             printf("Couldn't read instruction at %lx, "
0919                    "disabling breakpoint there\n", bp->address);
0920             bp->enabled = 0;
0921             continue;
0922         }
0923         if (!can_single_step(ppc_inst_val(instr))) {
0924             printf("Breakpoint at %lx is on an instruction that can't be single stepped, disabling it\n",
0925                     bp->address);
0926             bp->enabled = 0;
0927             continue;
0928         }
0929         /*
0930          * Check the address is not a suffix by looking for a prefix in
0931          * front of it.
0932          */
0933         if (mread_instr(bp->address - 4, &instr2) == 8) {
0934             printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
0935                    bp->address);
0936             bp->enabled = 0;
0937             continue;
0938         }
0939         /*
0940          * We might still be a suffix - if the prefix has already been
0941          * replaced by a breakpoint we won't catch it with the above
0942          * test.
0943          */
0944         bp2 = at_breakpoint(bp->address - 4);
0945         if (bp2 && ppc_inst_prefixed(ppc_inst_read(bp2->instr))) {
0946             printf("Breakpoint at %lx is on the second word of a prefixed instruction, disabling it\n",
0947                    bp->address);
0948             bp->enabled = 0;
0949             continue;
0950         }
0951 
0952         patch_instruction(bp->instr, instr);
0953         patch_instruction(ppc_inst_next(bp->instr, bp->instr),
0954                   ppc_inst(bpinstr));
0955         if (bp->enabled & BP_CIABR)
0956             continue;
0957         if (patch_instruction((u32 *)bp->address,
0958                       ppc_inst(bpinstr)) != 0) {
0959             printf("Couldn't write instruction at %lx, "
0960                    "disabling breakpoint there\n", bp->address);
0961             bp->enabled &= ~BP_TRAP;
0962             continue;
0963         }
0964     }
0965 }
0966 
0967 static void insert_cpu_bpts(void)
0968 {
0969     int i;
0970     struct arch_hw_breakpoint brk;
0971 
0972     for (i = 0; i < nr_wp_slots(); i++) {
0973         if (dabr[i].enabled) {
0974             brk.address = dabr[i].address;
0975             brk.type = (dabr[i].enabled & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
0976             brk.len = 8;
0977             brk.hw_len = 8;
0978             __set_breakpoint(i, &brk);
0979         }
0980     }
0981 
0982     if (iabr)
0983         set_ciabr(iabr->address);
0984 }
0985 
0986 static void remove_bpts(void)
0987 {
0988     int i;
0989     struct bpt *bp;
0990     ppc_inst_t instr;
0991 
0992     bp = bpts;
0993     for (i = 0; i < NBPTS; ++i, ++bp) {
0994         if ((bp->enabled & (BP_TRAP|BP_CIABR)) != BP_TRAP)
0995             continue;
0996         if (mread_instr(bp->address, &instr)
0997             && ppc_inst_equal(instr, ppc_inst(bpinstr))
0998             && patch_instruction(
0999             (u32 *)bp->address, ppc_inst_read(bp->instr)) != 0)
1000             printf("Couldn't remove breakpoint at %lx\n",
1001                    bp->address);
1002     }
1003 }
1004 
1005 static void remove_cpu_bpts(void)
1006 {
1007     hw_breakpoint_disable();
1008     write_ciabr(0);
1009 }
1010 
1011 /* Based on uptime_proc_show(). */
1012 static void
1013 show_uptime(void)
1014 {
1015     struct timespec64 uptime;
1016 
1017     if (setjmp(bus_error_jmp) == 0) {
1018         catch_memory_errors = 1;
1019         sync();
1020 
1021         ktime_get_coarse_boottime_ts64(&uptime);
1022         printf("Uptime: %lu.%.2lu seconds\n", (unsigned long)uptime.tv_sec,
1023             ((unsigned long)uptime.tv_nsec / (NSEC_PER_SEC/100)));
1024 
1025         sync();
1026         __delay(200);                       \
1027     }
1028     catch_memory_errors = 0;
1029 }
1030 
1031 static void set_lpp_cmd(void)
1032 {
1033     unsigned long lpp;
1034 
1035     if (!scanhex(&lpp)) {
1036         printf("Invalid number.\n");
1037         lpp = 0;
1038     }
1039     xmon_set_pagination_lpp(lpp);
1040 }
1041 /* Command interpreting routine */
1042 static char *last_cmd;
1043 
1044 static int
1045 cmds(struct pt_regs *excp)
1046 {
1047     int cmd = 0;
1048 
1049     last_cmd = NULL;
1050     xmon_regs = excp;
1051 
1052     xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1053 
1054     for(;;) {
1055 #ifdef CONFIG_SMP
1056         printf("%x:", smp_processor_id());
1057 #endif /* CONFIG_SMP */
1058         printf("mon> ");
1059         flush_input();
1060         termch = 0;
1061         cmd = skipbl();
1062         if( cmd == '\n' ) {
1063             if (last_cmd == NULL)
1064                 continue;
1065             take_input(last_cmd);
1066             last_cmd = NULL;
1067             cmd = inchar();
1068         }
1069         switch (cmd) {
1070         case 'm':
1071             cmd = inchar();
1072             switch (cmd) {
1073             case 'm':
1074             case 's':
1075             case 'd':
1076                 memops(cmd);
1077                 break;
1078             case 'l':
1079                 memlocate();
1080                 break;
1081             case 'z':
1082                 if (xmon_is_ro) {
1083                     printf(xmon_ro_msg);
1084                     break;
1085                 }
1086                 memzcan();
1087                 break;
1088             case 'i':
1089                 show_mem(0, NULL);
1090                 break;
1091             default:
1092                 termch = cmd;
1093                 memex();
1094             }
1095             break;
1096         case 'd':
1097             dump();
1098             break;
1099         case 'l':
1100             symbol_lookup();
1101             break;
1102         case 'r':
1103             prregs(excp);   /* print regs */
1104             break;
1105         case 'e':
1106             excprint(excp);
1107             break;
1108         case 'S':
1109             super_regs();
1110             break;
1111         case 't':
1112             backtrace(excp);
1113             break;
1114         case 'f':
1115             cacheflush();
1116             break;
1117         case 's':
1118             if (do_spu_cmd() == 0)
1119                 break;
1120             if (do_step(excp))
1121                 return cmd;
1122             break;
1123         case 'x':
1124         case 'X':
1125             if (tracing_enabled)
1126                 tracing_on();
1127             return cmd;
1128         case EOF:
1129             printf(" <no input ...>\n");
1130             mdelay(2000);
1131             return cmd;
1132         case '?':
1133             xmon_puts(help_string);
1134             break;
1135         case '#':
1136             set_lpp_cmd();
1137             break;
1138         case 'b':
1139             bpt_cmds();
1140             break;
1141         case 'C':
1142             csum();
1143             break;
1144         case 'c':
1145             if (cpu_cmd())
1146                 return 0;
1147             break;
1148         case 'z':
1149             bootcmds();
1150             break;
1151         case 'p':
1152             if (xmon_is_ro) {
1153                 printf(xmon_ro_msg);
1154                 break;
1155             }
1156             proccall();
1157             break;
1158         case 'P':
1159             show_tasks();
1160             break;
1161 #if defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_PPC_64S_HASH_MMU)
1162         case 'u':
1163             dump_segments();
1164             break;
1165 #elif defined(CONFIG_44x)
1166         case 'u':
1167             dump_tlb_44x();
1168             break;
1169 #elif defined(CONFIG_PPC_BOOK3E)
1170         case 'u':
1171             dump_tlb_book3e();
1172             break;
1173 #endif
1174         case 'U':
1175             show_uptime();
1176             break;
1177         default:
1178             printf("Unrecognized command: ");
1179             do {
1180                 if (' ' < cmd && cmd <= '~')
1181                     putchar(cmd);
1182                 else
1183                     printf("\\x%x", cmd);
1184                 cmd = inchar();
1185             } while (cmd != '\n');
1186             printf(" (type ? for help)\n");
1187             break;
1188         }
1189     }
1190 }
1191 
1192 #ifdef CONFIG_BOOKE
1193 static int do_step(struct pt_regs *regs)
1194 {
1195     regs_set_return_msr(regs, regs->msr | MSR_DE);
1196     mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
1197     return 1;
1198 }
1199 #else
1200 /*
1201  * Step a single instruction.
1202  * Some instructions we emulate, others we execute with MSR_SE set.
1203  */
1204 static int do_step(struct pt_regs *regs)
1205 {
1206     ppc_inst_t instr;
1207     int stepped;
1208 
1209     force_enable_xmon();
1210     /* check we are in 64-bit kernel mode, translation enabled */
1211     if ((regs->msr & (MSR_64BIT|MSR_PR|MSR_IR)) == (MSR_64BIT|MSR_IR)) {
1212         if (mread_instr(regs->nip, &instr)) {
1213             stepped = emulate_step(regs, instr);
1214             if (stepped < 0) {
1215                 printf("Couldn't single-step %s instruction\n",
1216                        (IS_RFID(instr)? "rfid": "mtmsrd"));
1217                 return 0;
1218             }
1219             if (stepped > 0) {
1220                 set_trap(regs, 0xd00);
1221                 printf("stepped to ");
1222                 xmon_print_symbol(regs->nip, " ", "\n");
1223                 ppc_inst_dump(regs->nip, 1, 0);
1224                 return 0;
1225             }
1226         }
1227     }
1228     regs_set_return_msr(regs, regs->msr | MSR_SE);
1229     return 1;
1230 }
1231 #endif
1232 
1233 static void bootcmds(void)
1234 {
1235     char tmp[64];
1236     int cmd;
1237 
1238     cmd = inchar();
1239     if (cmd == 'r') {
1240         getstring(tmp, 64);
1241         ppc_md.restart(tmp);
1242     } else if (cmd == 'h') {
1243         ppc_md.halt();
1244     } else if (cmd == 'p') {
1245         do_kernel_power_off();
1246     }
1247 }
1248 
1249 #ifdef CONFIG_SMP
1250 static int xmon_switch_cpu(unsigned long cpu)
1251 {
1252     int timeout;
1253 
1254     xmon_taken = 0;
1255     mb();
1256     xmon_owner = cpu;
1257     timeout = 10000000;
1258     while (!xmon_taken) {
1259         if (--timeout == 0) {
1260             if (test_and_set_bit(0, &xmon_taken))
1261                 break;
1262             /* take control back */
1263             mb();
1264             xmon_owner = smp_processor_id();
1265             printf("cpu 0x%lx didn't take control\n", cpu);
1266             return 0;
1267         }
1268         barrier();
1269     }
1270     return 1;
1271 }
1272 
1273 static int xmon_batch_next_cpu(void)
1274 {
1275     unsigned long cpu;
1276 
1277     while (!cpumask_empty(&xmon_batch_cpus)) {
1278         cpu = cpumask_next_wrap(smp_processor_id(), &xmon_batch_cpus,
1279                     xmon_batch_start_cpu, true);
1280         if (cpu == nr_cpumask_bits)
1281             break;
1282         if (xmon_batch_start_cpu == -1)
1283             xmon_batch_start_cpu = cpu;
1284         if (xmon_switch_cpu(cpu))
1285             return 0;
1286         cpumask_clear_cpu(cpu, &xmon_batch_cpus);
1287     }
1288 
1289     xmon_batch = 0;
1290     printf("%x:mon> \n", smp_processor_id());
1291     return 1;
1292 }
1293 
1294 static int batch_cmds(struct pt_regs *excp)
1295 {
1296     int cmd;
1297 
1298     /* simulate command entry */
1299     cmd = xmon_batch;
1300     termch = '\n';
1301 
1302     last_cmd = NULL;
1303     xmon_regs = excp;
1304 
1305     printf("%x:", smp_processor_id());
1306     printf("mon> ");
1307     printf("%c\n", (char)cmd);
1308 
1309     switch (cmd) {
1310     case 'r':
1311         prregs(excp);   /* print regs */
1312         break;
1313     case 'S':
1314         super_regs();
1315         break;
1316     case 't':
1317         backtrace(excp);
1318         break;
1319     }
1320 
1321     cpumask_clear_cpu(smp_processor_id(), &xmon_batch_cpus);
1322 
1323     return xmon_batch_next_cpu();
1324 }
1325 
1326 static int cpu_cmd(void)
1327 {
1328     unsigned long cpu, first_cpu, last_cpu;
1329 
1330     cpu = skipbl();
1331     if (cpu == '#') {
1332         xmon_batch = skipbl();
1333         if (xmon_batch) {
1334             switch (xmon_batch) {
1335             case 'r':
1336             case 'S':
1337             case 't':
1338                 cpumask_copy(&xmon_batch_cpus, &cpus_in_xmon);
1339                 if (cpumask_weight(&xmon_batch_cpus) <= 1) {
1340                     printf("There are no other cpus in xmon\n");
1341                     break;
1342                 }
1343                 xmon_batch_start_cpu = -1;
1344                 if (!xmon_batch_next_cpu())
1345                     return 1;
1346                 break;
1347             default:
1348                 printf("c# only supports 'r', 'S' and 't' commands\n");
1349             }
1350             xmon_batch = 0;
1351             return 0;
1352         }
1353     }
1354     termch = cpu;
1355 
1356     if (!scanhex(&cpu)) {
1357         /* print cpus waiting or in xmon */
1358         printf("cpus stopped:");
1359         last_cpu = first_cpu = NR_CPUS;
1360         for_each_possible_cpu(cpu) {
1361             if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1362                 if (cpu == last_cpu + 1) {
1363                     last_cpu = cpu;
1364                 } else {
1365                     if (last_cpu != first_cpu)
1366                         printf("-0x%lx", last_cpu);
1367                     last_cpu = first_cpu = cpu;
1368                     printf(" 0x%lx", cpu);
1369                 }
1370             }
1371         }
1372         if (last_cpu != first_cpu)
1373             printf("-0x%lx", last_cpu);
1374         printf("\n");
1375         return 0;
1376     }
1377     /* try to switch to cpu specified */
1378     if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
1379         printf("cpu 0x%lx isn't in xmon\n", cpu);
1380 #ifdef CONFIG_PPC64
1381         printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
1382         xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
1383 #endif
1384         return 0;
1385     }
1386 
1387     return xmon_switch_cpu(cpu);
1388 }
1389 #else
1390 static int cpu_cmd(void)
1391 {
1392     return 0;
1393 }
1394 #endif /* CONFIG_SMP */
1395 
1396 static unsigned short fcstab[256] = {
1397     0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1398     0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1399     0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1400     0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1401     0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1402     0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1403     0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1404     0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1405     0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1406     0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1407     0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1408     0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1409     0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1410     0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1411     0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1412     0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1413     0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1414     0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1415     0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1416     0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1417     0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1418     0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1419     0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1420     0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1421     0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1422     0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1423     0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1424     0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1425     0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1426     0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1427     0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1428     0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1429 };
1430 
1431 #define FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
1432 
1433 static void
1434 csum(void)
1435 {
1436     unsigned int i;
1437     unsigned short fcs;
1438     unsigned char v;
1439 
1440     if (!scanhex(&adrs))
1441         return;
1442     if (!scanhex(&ncsum))
1443         return;
1444     fcs = 0xffff;
1445     for (i = 0; i < ncsum; ++i) {
1446         if (mread(adrs+i, &v, 1) == 0) {
1447             printf("csum stopped at "REG"\n", adrs+i);
1448             break;
1449         }
1450         fcs = FCS(fcs, v);
1451     }
1452     printf("%x\n", fcs);
1453 }
1454 
1455 /*
1456  * Check if this is a suitable place to put a breakpoint.
1457  */
1458 static long check_bp_loc(unsigned long addr)
1459 {
1460     ppc_inst_t instr;
1461 
1462     addr &= ~3;
1463     if (!is_kernel_addr(addr)) {
1464         printf("Breakpoints may only be placed at kernel addresses\n");
1465         return 0;
1466     }
1467     if (!mread_instr(addr, &instr)) {
1468         printf("Can't read instruction at address %lx\n", addr);
1469         return 0;
1470     }
1471     if (!can_single_step(ppc_inst_val(instr))) {
1472         printf("Breakpoints may not be placed on instructions that can't be single stepped\n");
1473         return 0;
1474     }
1475     return 1;
1476 }
1477 
1478 static int find_free_data_bpt(void)
1479 {
1480     int i;
1481 
1482     for (i = 0; i < nr_wp_slots(); i++) {
1483         if (!dabr[i].enabled)
1484             return i;
1485     }
1486     printf("Couldn't find free breakpoint register\n");
1487     return -1;
1488 }
1489 
1490 static void print_data_bpts(void)
1491 {
1492     int i;
1493 
1494     for (i = 0; i < nr_wp_slots(); i++) {
1495         if (!dabr[i].enabled)
1496             continue;
1497 
1498         printf("   data   "REG"  [", dabr[i].address);
1499         if (dabr[i].enabled & 1)
1500             printf("r");
1501         if (dabr[i].enabled & 2)
1502             printf("w");
1503         printf("]\n");
1504     }
1505 }
1506 
1507 static char *breakpoint_help_string =
1508     "Breakpoint command usage:\n"
1509     "b                show breakpoints\n"
1510     "b <addr> [cnt]   set breakpoint at given instr addr\n"
1511     "bc               clear all breakpoints\n"
1512     "bc <n/addr>      clear breakpoint number n or at addr\n"
1513     "bi <addr> [cnt]  set hardware instr breakpoint (POWER8 only)\n"
1514     "bd <addr> [cnt]  set hardware data breakpoint\n"
1515     "";
1516 
1517 static void
1518 bpt_cmds(void)
1519 {
1520     int cmd;
1521     unsigned long a;
1522     int i;
1523     struct bpt *bp;
1524 
1525     cmd = inchar();
1526 
1527     switch (cmd) {
1528     static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
1529     int mode;
1530     case 'd':   /* bd - hardware data breakpoint */
1531         if (xmon_is_ro) {
1532             printf(xmon_ro_msg);
1533             break;
1534         }
1535         if (!ppc_breakpoint_available()) {
1536             printf("Hardware data breakpoint not supported on this cpu\n");
1537             break;
1538         }
1539         i = find_free_data_bpt();
1540         if (i < 0)
1541             break;
1542         mode = 7;
1543         cmd = inchar();
1544         if (cmd == 'r')
1545             mode = 5;
1546         else if (cmd == 'w')
1547             mode = 6;
1548         else
1549             termch = cmd;
1550         dabr[i].address = 0;
1551         dabr[i].enabled = 0;
1552         if (scanhex(&dabr[i].address)) {
1553             if (!is_kernel_addr(dabr[i].address)) {
1554                 printf(badaddr);
1555                 break;
1556             }
1557             dabr[i].address &= ~HW_BRK_TYPE_DABR;
1558             dabr[i].enabled = mode | BP_DABR;
1559         }
1560 
1561         force_enable_xmon();
1562         break;
1563 
1564     case 'i':   /* bi - hardware instr breakpoint */
1565         if (xmon_is_ro) {
1566             printf(xmon_ro_msg);
1567             break;
1568         }
1569         if (!cpu_has_feature(CPU_FTR_ARCH_207S)) {
1570             printf("Hardware instruction breakpoint "
1571                    "not supported on this cpu\n");
1572             break;
1573         }
1574         if (iabr) {
1575             iabr->enabled &= ~BP_CIABR;
1576             iabr = NULL;
1577         }
1578         if (!scanhex(&a))
1579             break;
1580         if (!check_bp_loc(a))
1581             break;
1582         bp = new_breakpoint(a);
1583         if (bp != NULL) {
1584             bp->enabled |= BP_CIABR;
1585             iabr = bp;
1586             force_enable_xmon();
1587         }
1588         break;
1589 
1590     case 'c':
1591         if (!scanhex(&a)) {
1592             /* clear all breakpoints */
1593             for (i = 0; i < NBPTS; ++i)
1594                 bpts[i].enabled = 0;
1595             iabr = NULL;
1596             for (i = 0; i < nr_wp_slots(); i++)
1597                 dabr[i].enabled = 0;
1598 
1599             printf("All breakpoints cleared\n");
1600             break;
1601         }
1602 
1603         if (a <= NBPTS && a >= 1) {
1604             /* assume a breakpoint number */
1605             bp = &bpts[a-1];    /* bp nums are 1 based */
1606         } else {
1607             /* assume a breakpoint address */
1608             bp = at_breakpoint(a);
1609             if (bp == NULL) {
1610                 printf("No breakpoint at %lx\n", a);
1611                 break;
1612             }
1613         }
1614 
1615         printf("Cleared breakpoint %tx (", BP_NUM(bp));
1616         xmon_print_symbol(bp->address, " ", ")\n");
1617         bp->enabled = 0;
1618         break;
1619 
1620     default:
1621         termch = cmd;
1622         cmd = skipbl();
1623         if (cmd == '?') {
1624             printf(breakpoint_help_string);
1625             break;
1626         }
1627         termch = cmd;
1628 
1629         if (xmon_is_ro || !scanhex(&a)) {
1630             /* print all breakpoints */
1631             printf("   type            address\n");
1632             print_data_bpts();
1633             for (bp = bpts; bp < &bpts[NBPTS]; ++bp) {
1634                 if (!bp->enabled)
1635                     continue;
1636                 printf("%tx %s   ", BP_NUM(bp),
1637                     (bp->enabled & BP_CIABR) ? "inst": "trap");
1638                 xmon_print_symbol(bp->address, "  ", "\n");
1639             }
1640             break;
1641         }
1642 
1643         if (!check_bp_loc(a))
1644             break;
1645         bp = new_breakpoint(a);
1646         if (bp != NULL) {
1647             bp->enabled |= BP_TRAP;
1648             force_enable_xmon();
1649         }
1650         break;
1651     }
1652 }
1653 
1654 /* Very cheap human name for vector lookup. */
1655 static
1656 const char *getvecname(unsigned long vec)
1657 {
1658     char *ret;
1659 
1660     switch (vec) {
1661     case 0x100: ret = "(System Reset)"; break;
1662     case 0x200: ret = "(Machine Check)"; break;
1663     case 0x300: ret = "(Data Access)"; break;
1664     case 0x380:
1665         if (radix_enabled())
1666             ret = "(Data Access Out of Range)";
1667         else
1668             ret = "(Data SLB Access)";
1669         break;
1670     case 0x400: ret = "(Instruction Access)"; break;
1671     case 0x480:
1672         if (radix_enabled())
1673             ret = "(Instruction Access Out of Range)";
1674         else
1675             ret = "(Instruction SLB Access)";
1676         break;
1677     case 0x500: ret = "(Hardware Interrupt)"; break;
1678     case 0x600: ret = "(Alignment)"; break;
1679     case 0x700: ret = "(Program Check)"; break;
1680     case 0x800: ret = "(FPU Unavailable)"; break;
1681     case 0x900: ret = "(Decrementer)"; break;
1682     case 0x980: ret = "(Hypervisor Decrementer)"; break;
1683     case 0xa00: ret = "(Doorbell)"; break;
1684     case 0xc00: ret = "(System Call)"; break;
1685     case 0xd00: ret = "(Single Step)"; break;
1686     case 0xe40: ret = "(Emulation Assist)"; break;
1687     case 0xe60: ret = "(HMI)"; break;
1688     case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1689     case 0xf00: ret = "(Performance Monitor)"; break;
1690     case 0xf20: ret = "(Altivec Unavailable)"; break;
1691     case 0x1300:    ret = "(Instruction Breakpoint)"; break;
1692     case 0x1500:    ret = "(Denormalisation)"; break;
1693     case 0x1700:    ret = "(Altivec Assist)"; break;
1694     case 0x3000:    ret = "(System Call Vectored)"; break;
1695     default: ret = "";
1696     }
1697     return ret;
1698 }
1699 
1700 static void get_function_bounds(unsigned long pc, unsigned long *startp,
1701                 unsigned long *endp)
1702 {
1703     unsigned long size, offset;
1704     const char *name;
1705 
1706     *startp = *endp = 0;
1707     if (pc == 0)
1708         return;
1709     if (setjmp(bus_error_jmp) == 0) {
1710         catch_memory_errors = 1;
1711         sync();
1712         name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
1713         if (name != NULL) {
1714             *startp = pc - offset;
1715             *endp = pc - offset + size;
1716         }
1717         sync();
1718     }
1719     catch_memory_errors = 0;
1720 }
1721 
1722 #define LRSAVE_OFFSET       (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
1723 #define MARKER_OFFSET       (STACK_FRAME_MARKER * sizeof(unsigned long))
1724 
1725 static void xmon_show_stack(unsigned long sp, unsigned long lr,
1726                 unsigned long pc)
1727 {
1728     int max_to_print = 64;
1729     unsigned long ip;
1730     unsigned long newsp;
1731     unsigned long marker;
1732     struct pt_regs regs;
1733 
1734     while (max_to_print--) {
1735         if (!is_kernel_addr(sp)) {
1736             if (sp != 0)
1737                 printf("SP (%lx) is in userspace\n", sp);
1738             break;
1739         }
1740 
1741         if (!mread(sp + LRSAVE_OFFSET, &ip, sizeof(unsigned long))
1742             || !mread(sp, &newsp, sizeof(unsigned long))) {
1743             printf("Couldn't read stack frame at %lx\n", sp);
1744             break;
1745         }
1746 
1747         /*
1748          * For the first stack frame, try to work out if
1749          * LR and/or the saved LR value in the bottommost
1750          * stack frame are valid.
1751          */
1752         if ((pc | lr) != 0) {
1753             unsigned long fnstart, fnend;
1754             unsigned long nextip;
1755             int printip = 1;
1756 
1757             get_function_bounds(pc, &fnstart, &fnend);
1758             nextip = 0;
1759             if (newsp > sp)
1760                 mread(newsp + LRSAVE_OFFSET, &nextip,
1761                       sizeof(unsigned long));
1762             if (lr == ip) {
1763                 if (!is_kernel_addr(lr)
1764                     || (fnstart <= lr && lr < fnend))
1765                     printip = 0;
1766             } else if (lr == nextip) {
1767                 printip = 0;
1768             } else if (is_kernel_addr(lr)
1769                    && !(fnstart <= lr && lr < fnend)) {
1770                 printf("[link register   ] ");
1771                 xmon_print_symbol(lr, " ", "\n");
1772             }
1773             if (printip) {
1774                 printf("["REG"] ", sp);
1775                 xmon_print_symbol(ip, " ", " (unreliable)\n");
1776             }
1777             pc = lr = 0;
1778 
1779         } else {
1780             printf("["REG"] ", sp);
1781             xmon_print_symbol(ip, " ", "\n");
1782         }
1783 
1784         /* Look for "regshere" marker to see if this is
1785            an exception frame. */
1786         if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
1787             && marker == STACK_FRAME_REGS_MARKER) {
1788             if (mread(sp + STACK_FRAME_OVERHEAD, &regs, sizeof(regs))
1789                 != sizeof(regs)) {
1790                 printf("Couldn't read registers at %lx\n",
1791                        sp + STACK_FRAME_OVERHEAD);
1792                 break;
1793             }
1794             printf("--- Exception: %lx %s at ", regs.trap,
1795                    getvecname(TRAP(&regs)));
1796             pc = regs.nip;
1797             lr = regs.link;
1798             xmon_print_symbol(pc, " ", "\n");
1799         }
1800 
1801         if (newsp == 0)
1802             break;
1803 
1804         sp = newsp;
1805     }
1806 }
1807 
1808 static void backtrace(struct pt_regs *excp)
1809 {
1810     unsigned long sp;
1811 
1812     if (scanhex(&sp))
1813         xmon_show_stack(sp, 0, 0);
1814     else
1815         xmon_show_stack(excp->gpr[1], excp->link, excp->nip);
1816     scannl();
1817 }
1818 
1819 static void print_bug_trap(struct pt_regs *regs)
1820 {
1821 #ifdef CONFIG_BUG
1822     const struct bug_entry *bug;
1823     unsigned long addr;
1824 
1825     if (regs->msr & MSR_PR)
1826         return;     /* not in kernel */
1827     addr = regs->nip;   /* address of trap instruction */
1828     if (!is_kernel_addr(addr))
1829         return;
1830     bug = find_bug(regs->nip);
1831     if (bug == NULL)
1832         return;
1833     if (is_warning_bug(bug))
1834         return;
1835 
1836 #ifdef CONFIG_DEBUG_BUGVERBOSE
1837     printf("kernel BUG at %s:%u!\n",
1838            (char *)bug + bug->file_disp, bug->line);
1839 #else
1840     printf("kernel BUG at %px!\n", (void *)bug + bug->bug_addr_disp);
1841 #endif
1842 #endif /* CONFIG_BUG */
1843 }
1844 
1845 static void excprint(struct pt_regs *fp)
1846 {
1847     unsigned long trap;
1848 
1849 #ifdef CONFIG_SMP
1850     printf("cpu 0x%x: ", smp_processor_id());
1851 #endif /* CONFIG_SMP */
1852 
1853     trap = TRAP(fp);
1854     printf("Vector: %lx %s at [%px]\n", fp->trap, getvecname(trap), fp);
1855     printf("    pc: ");
1856     xmon_print_symbol(fp->nip, ": ", "\n");
1857 
1858     printf("    lr: ");
1859     xmon_print_symbol(fp->link, ": ", "\n");
1860 
1861     printf("    sp: %lx\n", fp->gpr[1]);
1862     printf("   msr: %lx\n", fp->msr);
1863 
1864     if (trap == INTERRUPT_DATA_STORAGE ||
1865         trap == INTERRUPT_DATA_SEGMENT ||
1866         trap == INTERRUPT_ALIGNMENT ||
1867         trap == INTERRUPT_MACHINE_CHECK) {
1868         printf("   dar: %lx\n", fp->dar);
1869         if (trap != INTERRUPT_DATA_SEGMENT)
1870             printf(" dsisr: %lx\n", fp->dsisr);
1871     }
1872 
1873     printf("  current = 0x%px\n", current);
1874 #ifdef CONFIG_PPC64
1875     printf("  paca    = 0x%px\t irqmask: 0x%02x\t irq_happened: 0x%02x\n",
1876            local_paca, local_paca->irq_soft_mask, local_paca->irq_happened);
1877 #endif
1878     if (current) {
1879         printf("    pid   = %d, comm = %s\n",
1880                current->pid, current->comm);
1881     }
1882 
1883     if (trap == INTERRUPT_PROGRAM)
1884         print_bug_trap(fp);
1885 
1886     printf(linux_banner);
1887 }
1888 
1889 static void prregs(struct pt_regs *fp)
1890 {
1891     int n, trap;
1892     unsigned long base;
1893     struct pt_regs regs;
1894 
1895     if (scanhex(&base)) {
1896         if (setjmp(bus_error_jmp) == 0) {
1897             catch_memory_errors = 1;
1898             sync();
1899             regs = *(struct pt_regs *)base;
1900             sync();
1901             __delay(200);
1902         } else {
1903             catch_memory_errors = 0;
1904             printf("*** Error reading registers from "REG"\n",
1905                    base);
1906             return;
1907         }
1908         catch_memory_errors = 0;
1909         fp = &regs;
1910     }
1911 
1912 #ifdef CONFIG_PPC64
1913 #define R_PER_LINE 2
1914 #else
1915 #define R_PER_LINE 4
1916 #endif
1917 
1918     for (n = 0; n < 32; ++n) {
1919         printf("R%.2d = "REG"%s", n, fp->gpr[n],
1920             (n % R_PER_LINE) == R_PER_LINE - 1 ? "\n" : "   ");
1921     }
1922 
1923     printf("pc  = ");
1924     xmon_print_symbol(fp->nip, " ", "\n");
1925     if (!trap_is_syscall(fp) && cpu_has_feature(CPU_FTR_CFAR)) {
1926         printf("cfar= ");
1927         xmon_print_symbol(fp->orig_gpr3, " ", "\n");
1928     }
1929     printf("lr  = ");
1930     xmon_print_symbol(fp->link, " ", "\n");
1931     printf("msr = "REG"   cr  = %.8lx\n", fp->msr, fp->ccr);
1932     printf("ctr = "REG"   xer = "REG"   trap = %4lx\n",
1933            fp->ctr, fp->xer, fp->trap);
1934     trap = TRAP(fp);
1935     if (trap == INTERRUPT_DATA_STORAGE ||
1936         trap == INTERRUPT_DATA_SEGMENT ||
1937         trap == INTERRUPT_ALIGNMENT)
1938         printf("dar = "REG"   dsisr = %.8lx\n", fp->dar, fp->dsisr);
1939 }
1940 
1941 static void cacheflush(void)
1942 {
1943     int cmd;
1944     unsigned long nflush;
1945 
1946     cmd = inchar();
1947     if (cmd != 'i')
1948         termch = cmd;
1949     scanhex((void *)&adrs);
1950     if (termch != '\n')
1951         termch = 0;
1952     nflush = 1;
1953     scanhex(&nflush);
1954     nflush = (nflush + L1_CACHE_BYTES - 1) / L1_CACHE_BYTES;
1955     if (setjmp(bus_error_jmp) == 0) {
1956         catch_memory_errors = 1;
1957         sync();
1958 
1959         if (cmd != 'i' || IS_ENABLED(CONFIG_PPC_BOOK3S_64)) {
1960             for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1961                 cflush((void *) adrs);
1962         } else {
1963             for (; nflush > 0; --nflush, adrs += L1_CACHE_BYTES)
1964                 cinval((void *) adrs);
1965         }
1966         sync();
1967         /* wait a little while to see if we get a machine check */
1968         __delay(200);
1969     }
1970     catch_memory_errors = 0;
1971 }
1972 
1973 extern unsigned long xmon_mfspr(int spr, unsigned long default_value);
1974 extern void xmon_mtspr(int spr, unsigned long value);
1975 
1976 static int
1977 read_spr(int n, unsigned long *vp)
1978 {
1979     unsigned long ret = -1UL;
1980     int ok = 0;
1981 
1982     if (setjmp(bus_error_jmp) == 0) {
1983         catch_spr_faults = 1;
1984         sync();
1985 
1986         ret = xmon_mfspr(n, *vp);
1987 
1988         sync();
1989         *vp = ret;
1990         ok = 1;
1991     }
1992     catch_spr_faults = 0;
1993 
1994     return ok;
1995 }
1996 
1997 static void
1998 write_spr(int n, unsigned long val)
1999 {
2000     if (xmon_is_ro) {
2001         printf(xmon_ro_msg);
2002         return;
2003     }
2004 
2005     if (setjmp(bus_error_jmp) == 0) {
2006         catch_spr_faults = 1;
2007         sync();
2008 
2009         xmon_mtspr(n, val);
2010 
2011         sync();
2012     } else {
2013         printf("SPR 0x%03x (%4d) Faulted during write\n", n, n);
2014     }
2015     catch_spr_faults = 0;
2016 }
2017 
2018 static void dump_206_sprs(void)
2019 {
2020 #ifdef CONFIG_PPC64
2021     if (!cpu_has_feature(CPU_FTR_ARCH_206))
2022         return;
2023 
2024     /* Actually some of these pre-date 2.06, but whatever */
2025 
2026     printf("srr0   = %.16lx  srr1  = %.16lx dsisr  = %.8lx\n",
2027         mfspr(SPRN_SRR0), mfspr(SPRN_SRR1), mfspr(SPRN_DSISR));
2028     printf("dscr   = %.16lx  ppr   = %.16lx pir    = %.8lx\n",
2029         mfspr(SPRN_DSCR), mfspr(SPRN_PPR), mfspr(SPRN_PIR));
2030     printf("amr    = %.16lx  uamor = %.16lx\n",
2031         mfspr(SPRN_AMR), mfspr(SPRN_UAMOR));
2032 
2033     if (!(mfmsr() & MSR_HV))
2034         return;
2035 
2036     printf("sdr1   = %.16lx  hdar  = %.16lx hdsisr = %.8lx\n",
2037         mfspr(SPRN_SDR1), mfspr(SPRN_HDAR), mfspr(SPRN_HDSISR));
2038     printf("hsrr0  = %.16lx hsrr1  = %.16lx hdec   = %.16lx\n",
2039         mfspr(SPRN_HSRR0), mfspr(SPRN_HSRR1), mfspr(SPRN_HDEC));
2040     printf("lpcr   = %.16lx  pcr   = %.16lx lpidr  = %.8lx\n",
2041         mfspr(SPRN_LPCR), mfspr(SPRN_PCR), mfspr(SPRN_LPID));
2042     printf("hsprg0 = %.16lx hsprg1 = %.16lx amor   = %.16lx\n",
2043         mfspr(SPRN_HSPRG0), mfspr(SPRN_HSPRG1), mfspr(SPRN_AMOR));
2044     printf("dabr   = %.16lx dabrx  = %.16lx\n",
2045         mfspr(SPRN_DABR), mfspr(SPRN_DABRX));
2046 #endif
2047 }
2048 
2049 static void dump_207_sprs(void)
2050 {
2051 #ifdef CONFIG_PPC64
2052     unsigned long msr;
2053 
2054     if (!cpu_has_feature(CPU_FTR_ARCH_207S))
2055         return;
2056 
2057     printf("dpdes  = %.16lx  tir   = %.16lx cir    = %.8lx\n",
2058         mfspr(SPRN_DPDES), mfspr(SPRN_TIR), mfspr(SPRN_CIR));
2059 
2060     printf("fscr   = %.16lx  tar   = %.16lx pspb   = %.8lx\n",
2061         mfspr(SPRN_FSCR), mfspr(SPRN_TAR), mfspr(SPRN_PSPB));
2062 
2063     msr = mfmsr();
2064     if (msr & MSR_TM) {
2065         /* Only if TM has been enabled in the kernel */
2066         printf("tfhar  = %.16lx  tfiar = %.16lx texasr = %.16lx\n",
2067             mfspr(SPRN_TFHAR), mfspr(SPRN_TFIAR),
2068             mfspr(SPRN_TEXASR));
2069     }
2070 
2071     printf("mmcr0  = %.16lx  mmcr1 = %.16lx mmcr2  = %.16lx\n",
2072         mfspr(SPRN_MMCR0), mfspr(SPRN_MMCR1), mfspr(SPRN_MMCR2));
2073     printf("pmc1   = %.8lx pmc2 = %.8lx  pmc3 = %.8lx  pmc4   = %.8lx\n",
2074         mfspr(SPRN_PMC1), mfspr(SPRN_PMC2),
2075         mfspr(SPRN_PMC3), mfspr(SPRN_PMC4));
2076     printf("mmcra  = %.16lx   siar = %.16lx pmc5   = %.8lx\n",
2077         mfspr(SPRN_MMCRA), mfspr(SPRN_SIAR), mfspr(SPRN_PMC5));
2078     printf("sdar   = %.16lx   sier = %.16lx pmc6   = %.8lx\n",
2079         mfspr(SPRN_SDAR), mfspr(SPRN_SIER), mfspr(SPRN_PMC6));
2080     printf("ebbhr  = %.16lx  ebbrr = %.16lx bescr  = %.16lx\n",
2081         mfspr(SPRN_EBBHR), mfspr(SPRN_EBBRR), mfspr(SPRN_BESCR));
2082     printf("iamr   = %.16lx\n", mfspr(SPRN_IAMR));
2083 
2084     if (!(msr & MSR_HV))
2085         return;
2086 
2087     printf("hfscr  = %.16lx  dhdes = %.16lx rpr    = %.16lx\n",
2088         mfspr(SPRN_HFSCR), mfspr(SPRN_DHDES), mfspr(SPRN_RPR));
2089     printf("dawr0  = %.16lx dawrx0 = %.16lx\n",
2090            mfspr(SPRN_DAWR0), mfspr(SPRN_DAWRX0));
2091     if (nr_wp_slots() > 1) {
2092         printf("dawr1  = %.16lx dawrx1 = %.16lx\n",
2093                mfspr(SPRN_DAWR1), mfspr(SPRN_DAWRX1));
2094     }
2095     printf("ciabr  = %.16lx\n", mfspr(SPRN_CIABR));
2096 #endif
2097 }
2098 
2099 static void dump_300_sprs(void)
2100 {
2101 #ifdef CONFIG_PPC64
2102     bool hv = mfmsr() & MSR_HV;
2103 
2104     if (!cpu_has_feature(CPU_FTR_ARCH_300))
2105         return;
2106 
2107     if (cpu_has_feature(CPU_FTR_P9_TIDR)) {
2108         printf("pidr   = %.16lx  tidr  = %.16lx\n",
2109             mfspr(SPRN_PID), mfspr(SPRN_TIDR));
2110     } else {
2111         printf("pidr   = %.16lx\n",
2112             mfspr(SPRN_PID));
2113     }
2114 
2115     printf("psscr  = %.16lx\n",
2116         hv ? mfspr(SPRN_PSSCR) : mfspr(SPRN_PSSCR_PR));
2117 
2118     if (!hv)
2119         return;
2120 
2121     printf("ptcr   = %.16lx  asdr  = %.16lx\n",
2122         mfspr(SPRN_PTCR), mfspr(SPRN_ASDR));
2123 #endif
2124 }
2125 
2126 static void dump_310_sprs(void)
2127 {
2128 #ifdef CONFIG_PPC64
2129     if (!cpu_has_feature(CPU_FTR_ARCH_31))
2130         return;
2131 
2132     printf("mmcr3  = %.16lx, sier2  = %.16lx, sier3  = %.16lx\n",
2133         mfspr(SPRN_MMCR3), mfspr(SPRN_SIER2), mfspr(SPRN_SIER3));
2134 
2135 #endif
2136 }
2137 
2138 static void dump_one_spr(int spr, bool show_unimplemented)
2139 {
2140     unsigned long val;
2141 
2142     val = 0xdeadbeef;
2143     if (!read_spr(spr, &val)) {
2144         printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2145         return;
2146     }
2147 
2148     if (val == 0xdeadbeef) {
2149         /* Looks like read was a nop, confirm */
2150         val = 0x0badcafe;
2151         if (!read_spr(spr, &val)) {
2152             printf("SPR 0x%03x (%4d) Faulted during read\n", spr, spr);
2153             return;
2154         }
2155 
2156         if (val == 0x0badcafe) {
2157             if (show_unimplemented)
2158                 printf("SPR 0x%03x (%4d) Unimplemented\n", spr, spr);
2159             return;
2160         }
2161     }
2162 
2163     printf("SPR 0x%03x (%4d) = 0x%lx\n", spr, spr, val);
2164 }
2165 
2166 static void super_regs(void)
2167 {
2168     static unsigned long regno;
2169     int cmd;
2170     int spr;
2171 
2172     cmd = skipbl();
2173 
2174     switch (cmd) {
2175     case '\n': {
2176         unsigned long sp, toc;
2177         asm("mr %0,1" : "=r" (sp) :);
2178         asm("mr %0,2" : "=r" (toc) :);
2179 
2180         printf("msr    = "REG"  sprg0 = "REG"\n",
2181                mfmsr(), mfspr(SPRN_SPRG0));
2182         printf("pvr    = "REG"  sprg1 = "REG"\n",
2183                mfspr(SPRN_PVR), mfspr(SPRN_SPRG1));
2184         printf("dec    = "REG"  sprg2 = "REG"\n",
2185                mfspr(SPRN_DEC), mfspr(SPRN_SPRG2));
2186         printf("sp     = "REG"  sprg3 = "REG"\n", sp, mfspr(SPRN_SPRG3));
2187         printf("toc    = "REG"  dar   = "REG"\n", toc, mfspr(SPRN_DAR));
2188 
2189         dump_206_sprs();
2190         dump_207_sprs();
2191         dump_300_sprs();
2192         dump_310_sprs();
2193 
2194         return;
2195     }
2196     case 'w': {
2197         unsigned long val;
2198         scanhex(&regno);
2199         val = 0;
2200         read_spr(regno, &val);
2201         scanhex(&val);
2202         write_spr(regno, val);
2203         dump_one_spr(regno, true);
2204         break;
2205     }
2206     case 'r':
2207         scanhex(&regno);
2208         dump_one_spr(regno, true);
2209         break;
2210     case 'a':
2211         /* dump ALL SPRs */
2212         for (spr = 1; spr < 1024; ++spr)
2213             dump_one_spr(spr, false);
2214         break;
2215     }
2216 
2217     scannl();
2218 }
2219 
2220 /*
2221  * Stuff for reading and writing memory safely
2222  */
2223 static int
2224 mread(unsigned long adrs, void *buf, int size)
2225 {
2226     volatile int n;
2227     char *p, *q;
2228 
2229     n = 0;
2230     if (setjmp(bus_error_jmp) == 0) {
2231         catch_memory_errors = 1;
2232         sync();
2233         p = (char *)adrs;
2234         q = (char *)buf;
2235         switch (size) {
2236         case 2:
2237             *(u16 *)q = *(u16 *)p;
2238             break;
2239         case 4:
2240             *(u32 *)q = *(u32 *)p;
2241             break;
2242         case 8:
2243             *(u64 *)q = *(u64 *)p;
2244             break;
2245         default:
2246             for( ; n < size; ++n) {
2247                 *q++ = *p++;
2248                 sync();
2249             }
2250         }
2251         sync();
2252         /* wait a little while to see if we get a machine check */
2253         __delay(200);
2254         n = size;
2255     }
2256     catch_memory_errors = 0;
2257     return n;
2258 }
2259 
2260 static int
2261 mwrite(unsigned long adrs, void *buf, int size)
2262 {
2263     volatile int n;
2264     char *p, *q;
2265 
2266     n = 0;
2267 
2268     if (xmon_is_ro) {
2269         printf(xmon_ro_msg);
2270         return n;
2271     }
2272 
2273     if (setjmp(bus_error_jmp) == 0) {
2274         catch_memory_errors = 1;
2275         sync();
2276         p = (char *) adrs;
2277         q = (char *) buf;
2278         switch (size) {
2279         case 2:
2280             *(u16 *)p = *(u16 *)q;
2281             break;
2282         case 4:
2283             *(u32 *)p = *(u32 *)q;
2284             break;
2285         case 8:
2286             *(u64 *)p = *(u64 *)q;
2287             break;
2288         default:
2289             for ( ; n < size; ++n) {
2290                 *p++ = *q++;
2291                 sync();
2292             }
2293         }
2294         sync();
2295         /* wait a little while to see if we get a machine check */
2296         __delay(200);
2297         n = size;
2298     } else {
2299         printf("*** Error writing address "REG"\n", adrs + n);
2300     }
2301     catch_memory_errors = 0;
2302     return n;
2303 }
2304 
2305 static int
2306 mread_instr(unsigned long adrs, ppc_inst_t *instr)
2307 {
2308     volatile int n;
2309 
2310     n = 0;
2311     if (setjmp(bus_error_jmp) == 0) {
2312         catch_memory_errors = 1;
2313         sync();
2314         *instr = ppc_inst_read((u32 *)adrs);
2315         sync();
2316         /* wait a little while to see if we get a machine check */
2317         __delay(200);
2318         n = ppc_inst_len(*instr);
2319     }
2320     catch_memory_errors = 0;
2321     return n;
2322 }
2323 
2324 static int fault_type;
2325 static int fault_except;
2326 static char *fault_chars[] = { "--", "**", "##" };
2327 
2328 static int handle_fault(struct pt_regs *regs)
2329 {
2330     fault_except = TRAP(regs);
2331     switch (TRAP(regs)) {
2332     case 0x200:
2333         fault_type = 0;
2334         break;
2335     case 0x300:
2336     case 0x380:
2337         fault_type = 1;
2338         break;
2339     default:
2340         fault_type = 2;
2341     }
2342 
2343     longjmp(bus_error_jmp, 1);
2344 
2345     return 0;
2346 }
2347 
2348 #define SWAP(a, b, t)   ((t) = (a), (a) = (b), (b) = (t))
2349 
2350 static void
2351 byterev(unsigned char *val, int size)
2352 {
2353     int t;
2354     
2355     switch (size) {
2356     case 2:
2357         SWAP(val[0], val[1], t);
2358         break;
2359     case 4:
2360         SWAP(val[0], val[3], t);
2361         SWAP(val[1], val[2], t);
2362         break;
2363     case 8: /* is there really any use for this? */
2364         SWAP(val[0], val[7], t);
2365         SWAP(val[1], val[6], t);
2366         SWAP(val[2], val[5], t);
2367         SWAP(val[3], val[4], t);
2368         break;
2369     }
2370 }
2371 
2372 static int brev;
2373 static int mnoread;
2374 
2375 static char *memex_help_string =
2376     "Memory examine command usage:\n"
2377     "m [addr] [flags] examine/change memory\n"
2378     "  addr is optional.  will start where left off.\n"
2379     "  flags may include chars from this set:\n"
2380     "    b   modify by bytes (default)\n"
2381     "    w   modify by words (2 byte)\n"
2382     "    l   modify by longs (4 byte)\n"
2383     "    d   modify by doubleword (8 byte)\n"
2384     "    r   toggle reverse byte order mode\n"
2385     "    n   do not read memory (for i/o spaces)\n"
2386     "    .   ok to read (default)\n"
2387     "NOTE: flags are saved as defaults\n"
2388     "";
2389 
2390 static char *memex_subcmd_help_string =
2391     "Memory examine subcommands:\n"
2392     "  hexval   write this val to current location\n"
2393     "  'string' write chars from string to this location\n"
2394     "  '        increment address\n"
2395     "  ^        decrement address\n"
2396     "  /        increment addr by 0x10.  //=0x100, ///=0x1000, etc\n"
2397     "  \\        decrement addr by 0x10.  \\\\=0x100, \\\\\\=0x1000, etc\n"
2398     "  `        clear no-read flag\n"
2399     "  ;        stay at this addr\n"
2400     "  v        change to byte mode\n"
2401     "  w        change to word (2 byte) mode\n"
2402     "  l        change to long (4 byte) mode\n"
2403     "  u        change to doubleword (8 byte) mode\n"
2404     "  m addr   change current addr\n"
2405     "  n        toggle no-read flag\n"
2406     "  r        toggle byte reverse flag\n"
2407     "  < count  back up count bytes\n"
2408     "  > count  skip forward count bytes\n"
2409     "  x        exit this mode\n"
2410     "";
2411 
2412 static void
2413 memex(void)
2414 {
2415     int cmd, inc, i, nslash;
2416     unsigned long n;
2417     unsigned char val[16];
2418 
2419     scanhex((void *)&adrs);
2420     cmd = skipbl();
2421     if (cmd == '?') {
2422         printf(memex_help_string);
2423         return;
2424     } else {
2425         termch = cmd;
2426     }
2427     last_cmd = "m\n";
2428     while ((cmd = skipbl()) != '\n') {
2429         switch( cmd ){
2430         case 'b':   size = 1;   break;
2431         case 'w':   size = 2;   break;
2432         case 'l':   size = 4;   break;
2433         case 'd':   size = 8;   break;
2434         case 'r':   brev = !brev;   break;
2435         case 'n':   mnoread = 1;    break;
2436         case '.':   mnoread = 0;    break;
2437         }
2438     }
2439     if( size <= 0 )
2440         size = 1;
2441     else if( size > 8 )
2442         size = 8;
2443     for(;;){
2444         if (!mnoread)
2445             n = mread(adrs, val, size);
2446         printf(REG"%c", adrs, brev? 'r': ' ');
2447         if (!mnoread) {
2448             if (brev)
2449                 byterev(val, size);
2450             putchar(' ');
2451             for (i = 0; i < n; ++i)
2452                 printf("%.2x", val[i]);
2453             for (; i < size; ++i)
2454                 printf("%s", fault_chars[fault_type]);
2455         }
2456         putchar(' ');
2457         inc = size;
2458         nslash = 0;
2459         for(;;){
2460             if( scanhex(&n) ){
2461                 for (i = 0; i < size; ++i)
2462                     val[i] = n >> (i * 8);
2463                 if (!brev)
2464                     byterev(val, size);
2465                 mwrite(adrs, val, size);
2466                 inc = size;
2467             }
2468             cmd = skipbl();
2469             if (cmd == '\n')
2470                 break;
2471             inc = 0;
2472             switch (cmd) {
2473             case '\'':
2474                 for(;;){
2475                     n = inchar();
2476                     if( n == '\\' )
2477                         n = bsesc();
2478                     else if( n == '\'' )
2479                         break;
2480                     for (i = 0; i < size; ++i)
2481                         val[i] = n >> (i * 8);
2482                     if (!brev)
2483                         byterev(val, size);
2484                     mwrite(adrs, val, size);
2485                     adrs += size;
2486                 }
2487                 adrs -= size;
2488                 inc = size;
2489                 break;
2490             case ',':
2491                 adrs += size;
2492                 break;
2493             case '.':
2494                 mnoread = 0;
2495                 break;
2496             case ';':
2497                 break;
2498             case 'x':
2499             case EOF:
2500                 scannl();
2501                 return;
2502             case 'b':
2503             case 'v':
2504                 size = 1;
2505                 break;
2506             case 'w':
2507                 size = 2;
2508                 break;
2509             case 'l':
2510                 size = 4;
2511                 break;
2512             case 'u':
2513                 size = 8;
2514                 break;
2515             case '^':
2516                 adrs -= size;
2517                 break;
2518             case '/':
2519                 if (nslash > 0)
2520                     adrs -= 1 << nslash;
2521                 else
2522                     nslash = 0;
2523                 nslash += 4;
2524                 adrs += 1 << nslash;
2525                 break;
2526             case '\\':
2527                 if (nslash < 0)
2528                     adrs += 1 << -nslash;
2529                 else
2530                     nslash = 0;
2531                 nslash -= 4;
2532                 adrs -= 1 << -nslash;
2533                 break;
2534             case 'm':
2535                 scanhex((void *)&adrs);
2536                 break;
2537             case 'n':
2538                 mnoread = 1;
2539                 break;
2540             case 'r':
2541                 brev = !brev;
2542                 break;
2543             case '<':
2544                 n = size;
2545                 scanhex(&n);
2546                 adrs -= n;
2547                 break;
2548             case '>':
2549                 n = size;
2550                 scanhex(&n);
2551                 adrs += n;
2552                 break;
2553             case '?':
2554                 printf(memex_subcmd_help_string);
2555                 break;
2556             }
2557         }
2558         adrs += inc;
2559     }
2560 }
2561 
2562 static int
2563 bsesc(void)
2564 {
2565     int c;
2566 
2567     c = inchar();
2568     switch( c ){
2569     case 'n':   c = '\n';   break;
2570     case 'r':   c = '\r';   break;
2571     case 'b':   c = '\b';   break;
2572     case 't':   c = '\t';   break;
2573     }
2574     return c;
2575 }
2576 
2577 static void xmon_rawdump (unsigned long adrs, long ndump)
2578 {
2579     long n, m, r, nr;
2580     unsigned char temp[16];
2581 
2582     for (n = ndump; n > 0;) {
2583         r = n < 16? n: 16;
2584         nr = mread(adrs, temp, r);
2585         adrs += nr;
2586         for (m = 0; m < r; ++m) {
2587             if (m < nr)
2588                 printf("%.2x", temp[m]);
2589             else
2590                 printf("%s", fault_chars[fault_type]);
2591         }
2592         n -= r;
2593         if (nr < r)
2594             break;
2595     }
2596     printf("\n");
2597 }
2598 
2599 static void dump_tracing(void)
2600 {
2601     int c;
2602 
2603     c = inchar();
2604     if (c == 'c')
2605         ftrace_dump(DUMP_ORIG);
2606     else
2607         ftrace_dump(DUMP_ALL);
2608 }
2609 
2610 #ifdef CONFIG_PPC64
2611 static void dump_one_paca(int cpu)
2612 {
2613     struct paca_struct *p;
2614 #ifdef CONFIG_PPC_64S_HASH_MMU
2615     int i = 0;
2616 #endif
2617 
2618     if (setjmp(bus_error_jmp) != 0) {
2619         printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
2620         return;
2621     }
2622 
2623     catch_memory_errors = 1;
2624     sync();
2625 
2626     p = paca_ptrs[cpu];
2627 
2628     printf("paca for cpu 0x%x @ %px:\n", cpu, p);
2629 
2630     printf(" %-*s = %s\n", 25, "possible", cpu_possible(cpu) ? "yes" : "no");
2631     printf(" %-*s = %s\n", 25, "present", cpu_present(cpu) ? "yes" : "no");
2632     printf(" %-*s = %s\n", 25, "online", cpu_online(cpu) ? "yes" : "no");
2633 
2634 #define DUMP(paca, name, format)                \
2635     printf(" %-*s = "format"\t(0x%lx)\n", 25, #name, 18, paca->name, \
2636         offsetof(struct paca_struct, name));
2637 
2638     DUMP(p, lock_token, "%#-*x");
2639     DUMP(p, paca_index, "%#-*x");
2640     DUMP(p, kernel_toc, "%#-*llx");
2641     DUMP(p, kernelbase, "%#-*llx");
2642     DUMP(p, kernel_msr, "%#-*llx");
2643     DUMP(p, emergency_sp, "%-*px");
2644 #ifdef CONFIG_PPC_BOOK3S_64
2645     DUMP(p, nmi_emergency_sp, "%-*px");
2646     DUMP(p, mc_emergency_sp, "%-*px");
2647     DUMP(p, in_nmi, "%#-*x");
2648     DUMP(p, in_mce, "%#-*x");
2649     DUMP(p, hmi_event_available, "%#-*x");
2650 #endif
2651     DUMP(p, data_offset, "%#-*llx");
2652     DUMP(p, hw_cpu_id, "%#-*x");
2653     DUMP(p, cpu_start, "%#-*x");
2654     DUMP(p, kexec_state, "%#-*x");
2655 #ifdef CONFIG_PPC_BOOK3S_64
2656 #ifdef CONFIG_PPC_64S_HASH_MMU
2657     if (!early_radix_enabled()) {
2658         for (i = 0; i < SLB_NUM_BOLTED; i++) {
2659             u64 esid, vsid;
2660 
2661             if (!p->slb_shadow_ptr)
2662                 continue;
2663 
2664             esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
2665             vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
2666 
2667             if (esid || vsid) {
2668                 printf(" %-*s[%d] = 0x%016llx 0x%016llx\n",
2669                        22, "slb_shadow", i, esid, vsid);
2670             }
2671         }
2672         DUMP(p, vmalloc_sllp, "%#-*x");
2673         DUMP(p, stab_rr, "%#-*x");
2674         DUMP(p, slb_used_bitmap, "%#-*x");
2675         DUMP(p, slb_kern_bitmap, "%#-*x");
2676 
2677         if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2678             DUMP(p, slb_cache_ptr, "%#-*x");
2679             for (i = 0; i < SLB_CACHE_ENTRIES; i++)
2680                 printf(" %-*s[%d] = 0x%016x\n",
2681                        22, "slb_cache", i, p->slb_cache[i]);
2682         }
2683     }
2684 #endif
2685 
2686     DUMP(p, rfi_flush_fallback_area, "%-*px");
2687 #endif
2688     DUMP(p, dscr_default, "%#-*llx");
2689 #ifdef CONFIG_PPC_BOOK3E
2690     DUMP(p, pgd, "%-*px");
2691     DUMP(p, kernel_pgd, "%-*px");
2692     DUMP(p, tcd_ptr, "%-*px");
2693     DUMP(p, mc_kstack, "%-*px");
2694     DUMP(p, crit_kstack, "%-*px");
2695     DUMP(p, dbg_kstack, "%-*px");
2696 #endif
2697     DUMP(p, __current, "%-*px");
2698     DUMP(p, kstack, "%#-*llx");
2699     printf(" %-*s = 0x%016llx\n", 25, "kstack_base", p->kstack & ~(THREAD_SIZE - 1));
2700 #ifdef CONFIG_STACKPROTECTOR
2701     DUMP(p, canary, "%#-*lx");
2702 #endif
2703     DUMP(p, saved_r1, "%#-*llx");
2704 #ifdef CONFIG_PPC_BOOK3E
2705     DUMP(p, trap_save, "%#-*x");
2706 #endif
2707     DUMP(p, irq_soft_mask, "%#-*x");
2708     DUMP(p, irq_happened, "%#-*x");
2709 #ifdef CONFIG_MMIOWB
2710     DUMP(p, mmiowb_state.nesting_count, "%#-*x");
2711     DUMP(p, mmiowb_state.mmiowb_pending, "%#-*x");
2712 #endif
2713     DUMP(p, irq_work_pending, "%#-*x");
2714     DUMP(p, sprg_vdso, "%#-*llx");
2715 
2716 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
2717     DUMP(p, tm_scratch, "%#-*llx");
2718 #endif
2719 
2720 #ifdef CONFIG_PPC_POWERNV
2721     DUMP(p, idle_state, "%#-*lx");
2722     if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) {
2723         DUMP(p, thread_idle_state, "%#-*x");
2724         DUMP(p, subcore_sibling_mask, "%#-*x");
2725     } else {
2726 #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
2727         DUMP(p, requested_psscr, "%#-*llx");
2728         DUMP(p, dont_stop.counter, "%#-*x");
2729 #endif
2730     }
2731 #endif
2732 
2733     DUMP(p, accounting.utime, "%#-*lx");
2734     DUMP(p, accounting.stime, "%#-*lx");
2735 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2736     DUMP(p, accounting.utime_scaled, "%#-*lx");
2737 #endif
2738     DUMP(p, accounting.starttime, "%#-*lx");
2739     DUMP(p, accounting.starttime_user, "%#-*lx");
2740 #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME
2741     DUMP(p, accounting.startspurr, "%#-*lx");
2742     DUMP(p, accounting.utime_sspurr, "%#-*lx");
2743 #endif
2744     DUMP(p, accounting.steal_time, "%#-*lx");
2745 #undef DUMP
2746 
2747     catch_memory_errors = 0;
2748     sync();
2749 }
2750 
2751 static void dump_all_pacas(void)
2752 {
2753     int cpu;
2754 
2755     if (num_possible_cpus() == 0) {
2756         printf("No possible cpus, use 'dp #' to dump individual cpus\n");
2757         return;
2758     }
2759 
2760     for_each_possible_cpu(cpu)
2761         dump_one_paca(cpu);
2762 }
2763 
2764 static void dump_pacas(void)
2765 {
2766     unsigned long num;
2767     int c;
2768 
2769     c = inchar();
2770     if (c == 'a') {
2771         dump_all_pacas();
2772         return;
2773     }
2774 
2775     termch = c; /* Put c back, it wasn't 'a' */
2776 
2777     if (scanhex(&num))
2778         dump_one_paca(num);
2779     else
2780         dump_one_paca(xmon_owner);
2781 }
2782 #endif
2783 
2784 #ifdef CONFIG_PPC_POWERNV
2785 static void dump_one_xive(int cpu)
2786 {
2787     unsigned int hwid = get_hard_smp_processor_id(cpu);
2788     bool hv = cpu_has_feature(CPU_FTR_HVMODE);
2789 
2790     if (hv) {
2791         opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
2792         opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
2793         opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
2794         opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
2795         opal_xive_dump(XIVE_DUMP_VP, hwid);
2796         opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
2797     }
2798 
2799     if (setjmp(bus_error_jmp) != 0) {
2800         catch_memory_errors = 0;
2801         printf("*** Error dumping xive on cpu %d\n", cpu);
2802         return;
2803     }
2804 
2805     catch_memory_errors = 1;
2806     sync();
2807     xmon_xive_do_dump(cpu);
2808     sync();
2809     __delay(200);
2810     catch_memory_errors = 0;
2811 }
2812 
2813 static void dump_all_xives(void)
2814 {
2815     int cpu;
2816 
2817     if (num_online_cpus() == 0) {
2818         printf("No possible cpus, use 'dx #' to dump individual cpus\n");
2819         return;
2820     }
2821 
2822     for_each_online_cpu(cpu)
2823         dump_one_xive(cpu);
2824 }
2825 
2826 static void dump_xives(void)
2827 {
2828     unsigned long num;
2829     int c;
2830 
2831     if (!xive_enabled()) {
2832         printf("Xive disabled on this system\n");
2833         return;
2834     }
2835 
2836     c = inchar();
2837     if (c == 'a') {
2838         dump_all_xives();
2839         return;
2840     } else if (c == 'i') {
2841         if (scanhex(&num))
2842             xmon_xive_get_irq_config(num, NULL);
2843         else
2844             xmon_xive_get_irq_all();
2845         return;
2846     }
2847 
2848     termch = c; /* Put c back, it wasn't 'a' */
2849 
2850     if (scanhex(&num))
2851         dump_one_xive(num);
2852     else
2853         dump_one_xive(xmon_owner);
2854 }
2855 #endif /* CONFIG_PPC_POWERNV */
2856 
2857 static void dump_by_size(unsigned long addr, long count, int size)
2858 {
2859     unsigned char temp[16];
2860     int i, j;
2861     u64 val;
2862 
2863     count = ALIGN(count, 16);
2864 
2865     for (i = 0; i < count; i += 16, addr += 16) {
2866         printf(REG, addr);
2867 
2868         if (mread(addr, temp, 16) != 16) {
2869             printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr);
2870             return;
2871         }
2872 
2873         for (j = 0; j < 16; j += size) {
2874             putchar(' ');
2875             switch (size) {
2876             case 1: val = temp[j]; break;
2877             case 2: val = *(u16 *)&temp[j]; break;
2878             case 4: val = *(u32 *)&temp[j]; break;
2879             case 8: val = *(u64 *)&temp[j]; break;
2880             default: val = 0;
2881             }
2882 
2883             printf("%0*llx", size * 2, val);
2884         }
2885         printf("  |");
2886         for (j = 0; j < 16; ++j) {
2887             val = temp[j];
2888             putchar(' ' <= val && val <= '~' ? val : '.');
2889         }
2890         printf("|\n");
2891     }
2892 }
2893 
2894 static void
2895 dump(void)
2896 {
2897     static char last[] = { "d?\n" };
2898     int c;
2899 
2900     c = inchar();
2901 
2902 #ifdef CONFIG_PPC64
2903     if (c == 'p') {
2904         xmon_start_pagination();
2905         dump_pacas();
2906         xmon_end_pagination();
2907         return;
2908     }
2909 #endif
2910 #ifdef CONFIG_PPC_POWERNV
2911     if (c == 'x') {
2912         xmon_start_pagination();
2913         dump_xives();
2914         xmon_end_pagination();
2915         return;
2916     }
2917 #endif
2918 
2919     if (c == 't') {
2920         dump_tracing();
2921         return;
2922     }
2923 
2924     if (c == '\n')
2925         termch = c;
2926 
2927     scanhex((void *)&adrs);
2928     if (termch != '\n')
2929         termch = 0;
2930     if (c == 'i') {
2931         scanhex(&nidump);
2932         if (nidump == 0)
2933             nidump = 16;
2934         else if (nidump > MAX_IDUMP)
2935             nidump = MAX_IDUMP;
2936         adrs += ppc_inst_dump(adrs, nidump, 1);
2937         last_cmd = "di\n";
2938     } else if (c == 'l') {
2939         dump_log_buf();
2940     } else if (c == 'o') {
2941         dump_opal_msglog();
2942     } else if (c == 'v') {
2943         /* dump virtual to physical translation */
2944         show_pte(adrs);
2945     } else if (c == 'r') {
2946         scanhex(&ndump);
2947         if (ndump == 0)
2948             ndump = 64;
2949         xmon_rawdump(adrs, ndump);
2950         adrs += ndump;
2951         last_cmd = "dr\n";
2952     } else {
2953         scanhex(&ndump);
2954         if (ndump == 0)
2955             ndump = 64;
2956         else if (ndump > MAX_DUMP)
2957             ndump = MAX_DUMP;
2958 
2959         switch (c) {
2960         case '8':
2961         case '4':
2962         case '2':
2963         case '1':
2964             ndump = ALIGN(ndump, 16);
2965             dump_by_size(adrs, ndump, c - '0');
2966             last[1] = c;
2967             last_cmd = last;
2968             break;
2969         default:
2970             prdump(adrs, ndump);
2971             last_cmd = "d\n";
2972         }
2973 
2974         adrs += ndump;
2975     }
2976 }
2977 
2978 static void
2979 prdump(unsigned long adrs, long ndump)
2980 {
2981     long n, m, c, r, nr;
2982     unsigned char temp[16];
2983 
2984     for (n = ndump; n > 0;) {
2985         printf(REG, adrs);
2986         putchar(' ');
2987         r = n < 16? n: 16;
2988         nr = mread(adrs, temp, r);
2989         adrs += nr;
2990         for (m = 0; m < r; ++m) {
2991             if ((m & (sizeof(long) - 1)) == 0 && m > 0)
2992                 putchar(' ');
2993             if (m < nr)
2994                 printf("%.2x", temp[m]);
2995             else
2996                 printf("%s", fault_chars[fault_type]);
2997         }
2998         for (; m < 16; ++m) {
2999             if ((m & (sizeof(long) - 1)) == 0)
3000                 putchar(' ');
3001             printf("  ");
3002         }
3003         printf("  |");
3004         for (m = 0; m < r; ++m) {
3005             if (m < nr) {
3006                 c = temp[m];
3007                 putchar(' ' <= c && c <= '~'? c: '.');
3008             } else
3009                 putchar(' ');
3010         }
3011         n -= r;
3012         for (; m < 16; ++m)
3013             putchar(' ');
3014         printf("|\n");
3015         if (nr < r)
3016             break;
3017     }
3018 }
3019 
3020 typedef int (*instruction_dump_func)(unsigned long inst, unsigned long addr);
3021 
3022 static int
3023 generic_inst_dump(unsigned long adr, long count, int praddr,
3024             instruction_dump_func dump_func)
3025 {
3026     int nr, dotted;
3027     unsigned long first_adr;
3028     ppc_inst_t inst, last_inst = ppc_inst(0);
3029 
3030     dotted = 0;
3031     for (first_adr = adr; count > 0; --count, adr += ppc_inst_len(inst)) {
3032         nr = mread_instr(adr, &inst);
3033         if (nr == 0) {
3034             if (praddr) {
3035                 const char *x = fault_chars[fault_type];
3036                 printf(REG"  %s%s%s%s\n", adr, x, x, x, x);
3037             }
3038             break;
3039         }
3040         if (adr > first_adr && ppc_inst_equal(inst, last_inst)) {
3041             if (!dotted) {
3042                 printf(" ...\n");
3043                 dotted = 1;
3044             }
3045             continue;
3046         }
3047         dotted = 0;
3048         last_inst = inst;
3049         if (praddr)
3050             printf(REG"  %08lx", adr, ppc_inst_as_ulong(inst));
3051         printf("\t");
3052         if (!ppc_inst_prefixed(inst))
3053             dump_func(ppc_inst_val(inst), adr);
3054         else
3055             dump_func(ppc_inst_as_ulong(inst), adr);
3056         printf("\n");
3057     }
3058     return adr - first_adr;
3059 }
3060 
3061 static int
3062 ppc_inst_dump(unsigned long adr, long count, int praddr)
3063 {
3064     return generic_inst_dump(adr, count, praddr, print_insn_powerpc);
3065 }
3066 
3067 void
3068 print_address(unsigned long addr)
3069 {
3070     xmon_print_symbol(addr, "\t# ", "");
3071 }
3072 
3073 static void
3074 dump_log_buf(void)
3075 {
3076     struct kmsg_dump_iter iter;
3077     static unsigned char buf[1024];
3078     size_t len;
3079 
3080     if (setjmp(bus_error_jmp) != 0) {
3081         printf("Error dumping printk buffer!\n");
3082         return;
3083     }
3084 
3085     catch_memory_errors = 1;
3086     sync();
3087 
3088     kmsg_dump_rewind(&iter);
3089     xmon_start_pagination();
3090     while (kmsg_dump_get_line(&iter, false, buf, sizeof(buf), &len)) {
3091         buf[len] = '\0';
3092         printf("%s", buf);
3093     }
3094     xmon_end_pagination();
3095 
3096     sync();
3097     /* wait a little while to see if we get a machine check */
3098     __delay(200);
3099     catch_memory_errors = 0;
3100 }
3101 
3102 #ifdef CONFIG_PPC_POWERNV
3103 static void dump_opal_msglog(void)
3104 {
3105     unsigned char buf[128];
3106     ssize_t res;
3107     volatile loff_t pos = 0;
3108 
3109     if (!firmware_has_feature(FW_FEATURE_OPAL)) {
3110         printf("Machine is not running OPAL firmware.\n");
3111         return;
3112     }
3113 
3114     if (setjmp(bus_error_jmp) != 0) {
3115         printf("Error dumping OPAL msglog!\n");
3116         return;
3117     }
3118 
3119     catch_memory_errors = 1;
3120     sync();
3121 
3122     xmon_start_pagination();
3123     while ((res = opal_msglog_copy(buf, pos, sizeof(buf) - 1))) {
3124         if (res < 0) {
3125             printf("Error dumping OPAL msglog! Error: %zd\n", res);
3126             break;
3127         }
3128         buf[res] = '\0';
3129         printf("%s", buf);
3130         pos += res;
3131     }
3132     xmon_end_pagination();
3133 
3134     sync();
3135     /* wait a little while to see if we get a machine check */
3136     __delay(200);
3137     catch_memory_errors = 0;
3138 }
3139 #endif
3140 
3141 /*
3142  * Memory operations - move, set, print differences
3143  */
3144 static unsigned long mdest;     /* destination address */
3145 static unsigned long msrc;      /* source address */
3146 static unsigned long mval;      /* byte value to set memory to */
3147 static unsigned long mcount;        /* # bytes to affect */
3148 static unsigned long mdiffs;        /* max # differences to print */
3149 
3150 static void
3151 memops(int cmd)
3152 {
3153     scanhex((void *)&mdest);
3154     if( termch != '\n' )
3155         termch = 0;
3156     scanhex((void *)(cmd == 's'? &mval: &msrc));
3157     if( termch != '\n' )
3158         termch = 0;
3159     scanhex((void *)&mcount);
3160     switch( cmd ){
3161     case 'm':
3162         if (xmon_is_ro) {
3163             printf(xmon_ro_msg);
3164             break;
3165         }
3166         memmove((void *)mdest, (void *)msrc, mcount);
3167         break;
3168     case 's':
3169         if (xmon_is_ro) {
3170             printf(xmon_ro_msg);
3171             break;
3172         }
3173         memset((void *)mdest, mval, mcount);
3174         break;
3175     case 'd':
3176         if( termch != '\n' )
3177             termch = 0;
3178         scanhex((void *)&mdiffs);
3179         memdiffs((unsigned char *)mdest, (unsigned char *)msrc, mcount, mdiffs);
3180         break;
3181     }
3182 }
3183 
3184 static void
3185 memdiffs(unsigned char *p1, unsigned char *p2, unsigned nb, unsigned maxpr)
3186 {
3187     unsigned n, prt;
3188 
3189     prt = 0;
3190     for( n = nb; n > 0; --n )
3191         if( *p1++ != *p2++ )
3192             if( ++prt <= maxpr )
3193                 printf("%px %.2x # %px %.2x\n", p1 - 1,
3194                     p1[-1], p2 - 1, p2[-1]);
3195     if( prt > maxpr )
3196         printf("Total of %d differences\n", prt);
3197 }
3198 
3199 static unsigned mend;
3200 static unsigned mask;
3201 
3202 static void
3203 memlocate(void)
3204 {
3205     unsigned a, n;
3206     unsigned char val[4];
3207 
3208     last_cmd = "ml";
3209     scanhex((void *)&mdest);
3210     if (termch != '\n') {
3211         termch = 0;
3212         scanhex((void *)&mend);
3213         if (termch != '\n') {
3214             termch = 0;
3215             scanhex((void *)&mval);
3216             mask = ~0;
3217             if (termch != '\n') termch = 0;
3218             scanhex((void *)&mask);
3219         }
3220     }
3221     n = 0;
3222     for (a = mdest; a < mend; a += 4) {
3223         if (mread(a, val, 4) == 4
3224             && ((GETWORD(val) ^ mval) & mask) == 0) {
3225             printf("%.16x:  %.16x\n", a, GETWORD(val));
3226             if (++n >= 10)
3227                 break;
3228         }
3229     }
3230 }
3231 
3232 static unsigned long mskip = 0x1000;
3233 static unsigned long mlim = 0xffffffff;
3234 
3235 static void
3236 memzcan(void)
3237 {
3238     unsigned char v;
3239     unsigned a;
3240     int ok, ook;
3241 
3242     scanhex(&mdest);
3243     if (termch != '\n') termch = 0;
3244     scanhex(&mskip);
3245     if (termch != '\n') termch = 0;
3246     scanhex(&mlim);
3247     ook = 0;
3248     for (a = mdest; a < mlim; a += mskip) {
3249         ok = mread(a, &v, 1);
3250         if (ok && !ook) {
3251             printf("%.8x .. ", a);
3252         } else if (!ok && ook)
3253             printf("%.8lx\n", a - mskip);
3254         ook = ok;
3255         if (a + mskip < a)
3256             break;
3257     }
3258     if (ook)
3259         printf("%.8lx\n", a - mskip);
3260 }
3261 
3262 static void show_task(struct task_struct *volatile tsk)
3263 {
3264     unsigned int p_state = READ_ONCE(tsk->__state);
3265     char state;
3266 
3267     /*
3268      * Cloned from kdb_task_state_char(), which is not entirely
3269      * appropriate for calling from xmon. This could be moved
3270      * to a common, generic, routine used by both.
3271      */
3272     state = (p_state == TASK_RUNNING) ? 'R' :
3273         (p_state & TASK_UNINTERRUPTIBLE) ? 'D' :
3274         (p_state & TASK_STOPPED) ? 'T' :
3275         (p_state & TASK_TRACED) ? 'C' :
3276         (tsk->exit_state & EXIT_ZOMBIE) ? 'Z' :
3277         (tsk->exit_state & EXIT_DEAD) ? 'E' :
3278         (p_state & TASK_INTERRUPTIBLE) ? 'S' : '?';
3279 
3280     printf("%16px %16lx %16px %6d %6d %c %2d %s\n", tsk,
3281         tsk->thread.ksp, tsk->thread.regs,
3282         tsk->pid, rcu_dereference(tsk->parent)->pid,
3283         state, task_cpu(tsk),
3284         tsk->comm);
3285 }
3286 
3287 #ifdef CONFIG_PPC_BOOK3S_64
3288 static void format_pte(void *ptep, unsigned long pte)
3289 {
3290     pte_t entry = __pte(pte);
3291 
3292     printf("ptep @ 0x%016lx = 0x%016lx\n", (unsigned long)ptep, pte);
3293     printf("Maps physical address = 0x%016lx\n", pte & PTE_RPN_MASK);
3294 
3295     printf("Flags = %s%s%s%s%s\n",
3296            pte_young(entry) ? "Accessed " : "",
3297            pte_dirty(entry) ? "Dirty " : "",
3298            pte_read(entry)  ? "Read " : "",
3299            pte_write(entry) ? "Write " : "",
3300            pte_exec(entry)  ? "Exec " : "");
3301 }
3302 
3303 static void show_pte(unsigned long addr)
3304 {
3305     unsigned long tskv = 0;
3306     struct task_struct *volatile tsk = NULL;
3307     struct mm_struct *mm;
3308     pgd_t *pgdp;
3309     p4d_t *p4dp;
3310     pud_t *pudp;
3311     pmd_t *pmdp;
3312     pte_t *ptep;
3313 
3314     if (!scanhex(&tskv))
3315         mm = &init_mm;
3316     else
3317         tsk = (struct task_struct *)tskv;
3318 
3319     if (tsk == NULL)
3320         mm = &init_mm;
3321     else
3322         mm = tsk->active_mm;
3323 
3324     if (setjmp(bus_error_jmp) != 0) {
3325         catch_memory_errors = 0;
3326         printf("*** Error dumping pte for task %px\n", tsk);
3327         return;
3328     }
3329 
3330     catch_memory_errors = 1;
3331     sync();
3332 
3333     if (mm == &init_mm)
3334         pgdp = pgd_offset_k(addr);
3335     else
3336         pgdp = pgd_offset(mm, addr);
3337 
3338     p4dp = p4d_offset(pgdp, addr);
3339 
3340     if (p4d_none(*p4dp)) {
3341         printf("No valid P4D\n");
3342         return;
3343     }
3344 
3345     if (p4d_is_leaf(*p4dp)) {
3346         format_pte(p4dp, p4d_val(*p4dp));
3347         return;
3348     }
3349 
3350     printf("p4dp @ 0x%px = 0x%016lx\n", p4dp, p4d_val(*p4dp));
3351 
3352     pudp = pud_offset(p4dp, addr);
3353 
3354     if (pud_none(*pudp)) {
3355         printf("No valid PUD\n");
3356         return;
3357     }
3358 
3359     if (pud_is_leaf(*pudp)) {
3360         format_pte(pudp, pud_val(*pudp));
3361         return;
3362     }
3363 
3364     printf("pudp @ 0x%px = 0x%016lx\n", pudp, pud_val(*pudp));
3365 
3366     pmdp = pmd_offset(pudp, addr);
3367 
3368     if (pmd_none(*pmdp)) {
3369         printf("No valid PMD\n");
3370         return;
3371     }
3372 
3373     if (pmd_is_leaf(*pmdp)) {
3374         format_pte(pmdp, pmd_val(*pmdp));
3375         return;
3376     }
3377     printf("pmdp @ 0x%px = 0x%016lx\n", pmdp, pmd_val(*pmdp));
3378 
3379     ptep = pte_offset_map(pmdp, addr);
3380     if (pte_none(*ptep)) {
3381         printf("no valid PTE\n");
3382         return;
3383     }
3384 
3385     format_pte(ptep, pte_val(*ptep));
3386 
3387     sync();
3388     __delay(200);
3389     catch_memory_errors = 0;
3390 }
3391 #else
3392 static void show_pte(unsigned long addr)
3393 {
3394     printf("show_pte not yet implemented\n");
3395 }
3396 #endif /* CONFIG_PPC_BOOK3S_64 */
3397 
3398 static void show_tasks(void)
3399 {
3400     unsigned long tskv;
3401     struct task_struct *volatile tsk = NULL;
3402 
3403     printf("     task_struct     ->thread.ksp    ->thread.regs    PID   PPID S  P CMD\n");
3404 
3405     if (scanhex(&tskv))
3406         tsk = (struct task_struct *)tskv;
3407 
3408     if (setjmp(bus_error_jmp) != 0) {
3409         catch_memory_errors = 0;
3410         printf("*** Error dumping task %px\n", tsk);
3411         return;
3412     }
3413 
3414     catch_memory_errors = 1;
3415     sync();
3416 
3417     if (tsk)
3418         show_task(tsk);
3419     else
3420         for_each_process(tsk)
3421             show_task(tsk);
3422 
3423     sync();
3424     __delay(200);
3425     catch_memory_errors = 0;
3426 }
3427 
3428 static void proccall(void)
3429 {
3430     unsigned long args[8];
3431     unsigned long ret;
3432     int i;
3433     typedef unsigned long (*callfunc_t)(unsigned long, unsigned long,
3434             unsigned long, unsigned long, unsigned long,
3435             unsigned long, unsigned long, unsigned long);
3436     callfunc_t func;
3437 
3438     if (!scanhex(&adrs))
3439         return;
3440     if (termch != '\n')
3441         termch = 0;
3442     for (i = 0; i < 8; ++i)
3443         args[i] = 0;
3444     for (i = 0; i < 8; ++i) {
3445         if (!scanhex(&args[i]) || termch == '\n')
3446             break;
3447         termch = 0;
3448     }
3449     func = (callfunc_t) adrs;
3450     ret = 0;
3451     if (setjmp(bus_error_jmp) == 0) {
3452         catch_memory_errors = 1;
3453         sync();
3454         ret = func(args[0], args[1], args[2], args[3],
3455                args[4], args[5], args[6], args[7]);
3456         sync();
3457         printf("return value is 0x%lx\n", ret);
3458     } else {
3459         printf("*** %x exception occurred\n", fault_except);
3460     }
3461     catch_memory_errors = 0;
3462 }
3463 
3464 /* Input scanning routines */
3465 int
3466 skipbl(void)
3467 {
3468     int c;
3469 
3470     if( termch != 0 ){
3471         c = termch;
3472         termch = 0;
3473     } else
3474         c = inchar();
3475     while( c == ' ' || c == '\t' )
3476         c = inchar();
3477     return c;
3478 }
3479 
3480 #define N_PTREGS    44
3481 static const char *regnames[N_PTREGS] = {
3482     "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
3483     "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
3484     "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
3485     "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
3486     "pc", "msr", "or3", "ctr", "lr", "xer", "ccr",
3487 #ifdef CONFIG_PPC64
3488     "softe",
3489 #else
3490     "mq",
3491 #endif
3492     "trap", "dar", "dsisr", "res"
3493 };
3494 
3495 int
3496 scanhex(unsigned long *vp)
3497 {
3498     int c, d;
3499     unsigned long v;
3500 
3501     c = skipbl();
3502     if (c == '%') {
3503         /* parse register name */
3504         char regname[8];
3505         int i;
3506 
3507         for (i = 0; i < sizeof(regname) - 1; ++i) {
3508             c = inchar();
3509             if (!isalnum(c)) {
3510                 termch = c;
3511                 break;
3512             }
3513             regname[i] = c;
3514         }
3515         regname[i] = 0;
3516         i = match_string(regnames, N_PTREGS, regname);
3517         if (i < 0) {
3518             printf("invalid register name '%%%s'\n", regname);
3519             return 0;
3520         }
3521         if (xmon_regs == NULL) {
3522             printf("regs not available\n");
3523             return 0;
3524         }
3525         *vp = ((unsigned long *)xmon_regs)[i];
3526         return 1;
3527     }
3528 
3529     /* skip leading "0x" if any */
3530 
3531     if (c == '0') {
3532         c = inchar();
3533         if (c == 'x') {
3534             c = inchar();
3535         } else {
3536             d = hexdigit(c);
3537             if (d == EOF) {
3538                 termch = c;
3539                 *vp = 0;
3540                 return 1;
3541             }
3542         }
3543     } else if (c == '$') {
3544         int i;
3545         for (i=0; i<63; i++) {
3546             c = inchar();
3547             if (isspace(c) || c == '\0') {
3548                 termch = c;
3549                 break;
3550             }
3551             tmpstr[i] = c;
3552         }
3553         tmpstr[i++] = 0;
3554         *vp = 0;
3555         if (setjmp(bus_error_jmp) == 0) {
3556             catch_memory_errors = 1;
3557             sync();
3558             *vp = kallsyms_lookup_name(tmpstr);
3559             sync();
3560         }
3561         catch_memory_errors = 0;
3562         if (!(*vp)) {
3563             printf("unknown symbol '%s'\n", tmpstr);
3564             return 0;
3565         }
3566         return 1;
3567     }
3568 
3569     d = hexdigit(c);
3570     if (d == EOF) {
3571         termch = c;
3572         return 0;
3573     }
3574     v = 0;
3575     do {
3576         v = (v << 4) + d;
3577         c = inchar();
3578         d = hexdigit(c);
3579     } while (d != EOF);
3580     termch = c;
3581     *vp = v;
3582     return 1;
3583 }
3584 
3585 static void
3586 scannl(void)
3587 {
3588     int c;
3589 
3590     c = termch;
3591     termch = 0;
3592     while( c != '\n' )
3593         c = inchar();
3594 }
3595 
3596 static int hexdigit(int c)
3597 {
3598     if( '0' <= c && c <= '9' )
3599         return c - '0';
3600     if( 'A' <= c && c <= 'F' )
3601         return c - ('A' - 10);
3602     if( 'a' <= c && c <= 'f' )
3603         return c - ('a' - 10);
3604     return EOF;
3605 }
3606 
3607 void
3608 getstring(char *s, int size)
3609 {
3610     int c;
3611 
3612     c = skipbl();
3613     if (c == '\n') {
3614         *s = 0;
3615         return;
3616     }
3617 
3618     do {
3619         if( size > 1 ){
3620             *s++ = c;
3621             --size;
3622         }
3623         c = inchar();
3624     } while( c != ' ' && c != '\t' && c != '\n' );
3625     termch = c;
3626     *s = 0;
3627 }
3628 
3629 static char line[256];
3630 static char *lineptr;
3631 
3632 static void
3633 flush_input(void)
3634 {
3635     lineptr = NULL;
3636 }
3637 
3638 static int
3639 inchar(void)
3640 {
3641     if (lineptr == NULL || *lineptr == 0) {
3642         if (xmon_gets(line, sizeof(line)) == NULL) {
3643             lineptr = NULL;
3644             return EOF;
3645         }
3646         lineptr = line;
3647     }
3648     return *lineptr++;
3649 }
3650 
3651 static void
3652 take_input(char *str)
3653 {
3654     lineptr = str;
3655 }
3656 
3657 
3658 static void
3659 symbol_lookup(void)
3660 {
3661     int type = inchar();
3662     unsigned long addr, cpu;
3663     void __percpu *ptr = NULL;
3664     static char tmp[64];
3665 
3666     switch (type) {
3667     case 'a':
3668         if (scanhex(&addr))
3669             xmon_print_symbol(addr, ": ", "\n");
3670         termch = 0;
3671         break;
3672     case 's':
3673         getstring(tmp, 64);
3674         if (setjmp(bus_error_jmp) == 0) {
3675             catch_memory_errors = 1;
3676             sync();
3677             addr = kallsyms_lookup_name(tmp);
3678             if (addr)
3679                 printf("%s: %lx\n", tmp, addr);
3680             else
3681                 printf("Symbol '%s' not found.\n", tmp);
3682             sync();
3683         }
3684         catch_memory_errors = 0;
3685         termch = 0;
3686         break;
3687     case 'p':
3688         getstring(tmp, 64);
3689         if (setjmp(bus_error_jmp) == 0) {
3690             catch_memory_errors = 1;
3691             sync();
3692             ptr = (void __percpu *)kallsyms_lookup_name(tmp);
3693             sync();
3694         }
3695 
3696         if (ptr &&
3697             ptr >= (void __percpu *)__per_cpu_start &&
3698             ptr < (void __percpu *)__per_cpu_end)
3699         {
3700             if (scanhex(&cpu) && cpu < num_possible_cpus()) {
3701                 addr = (unsigned long)per_cpu_ptr(ptr, cpu);
3702             } else {
3703                 cpu = raw_smp_processor_id();
3704                 addr = (unsigned long)this_cpu_ptr(ptr);
3705             }
3706 
3707             printf("%s for cpu 0x%lx: %lx\n", tmp, cpu, addr);
3708         } else {
3709             printf("Percpu symbol '%s' not found.\n", tmp);
3710         }
3711 
3712         catch_memory_errors = 0;
3713         termch = 0;
3714         break;
3715     }
3716 }
3717 
3718 
3719 /* Print an address in numeric and symbolic form (if possible) */
3720 static void xmon_print_symbol(unsigned long address, const char *mid,
3721                   const char *after)
3722 {
3723     char *modname;
3724     const char *volatile name = NULL;
3725     unsigned long offset, size;
3726 
3727     printf(REG, address);
3728     if (setjmp(bus_error_jmp) == 0) {
3729         catch_memory_errors = 1;
3730         sync();
3731         name = kallsyms_lookup(address, &size, &offset, &modname,
3732                        tmpstr);
3733         sync();
3734         /* wait a little while to see if we get a machine check */
3735         __delay(200);
3736     }
3737 
3738     catch_memory_errors = 0;
3739 
3740     if (name) {
3741         printf("%s%s+%#lx/%#lx", mid, name, offset, size);
3742         if (modname)
3743             printf(" [%s]", modname);
3744     }
3745     printf("%s", after);
3746 }
3747 
3748 #ifdef CONFIG_PPC_64S_HASH_MMU
3749 void dump_segments(void)
3750 {
3751     int i;
3752     unsigned long esid,vsid;
3753     unsigned long llp;
3754 
3755     printf("SLB contents of cpu 0x%x\n", smp_processor_id());
3756 
3757     for (i = 0; i < mmu_slb_size; i++) {
3758         asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
3759         asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
3760 
3761         if (!esid && !vsid)
3762             continue;
3763 
3764         printf("%02d %016lx %016lx", i, esid, vsid);
3765 
3766         if (!(esid & SLB_ESID_V)) {
3767             printf("\n");
3768             continue;
3769         }
3770 
3771         llp = vsid & SLB_VSID_LLP;
3772         if (vsid & SLB_VSID_B_1T) {
3773             printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",
3774                 GET_ESID_1T(esid),
3775                 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
3776                 llp);
3777         } else {
3778             printf(" 256M ESID=%9lx  VSID=%13lx LLP:%3lx \n",
3779                 GET_ESID(esid),
3780                 (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
3781                 llp);
3782         }
3783     }
3784 }
3785 #endif
3786 
3787 #ifdef CONFIG_PPC_BOOK3S_32
3788 void dump_segments(void)
3789 {
3790     int i;
3791 
3792     printf("sr0-15 =");
3793     for (i = 0; i < 16; ++i)
3794         printf(" %x", mfsr(i << 28));
3795     printf("\n");
3796 }
3797 #endif
3798 
3799 #ifdef CONFIG_44x
3800 static void dump_tlb_44x(void)
3801 {
3802     int i;
3803 
3804     for (i = 0; i < PPC44x_TLB_SIZE; i++) {
3805         unsigned long w0,w1,w2;
3806         asm volatile("tlbre  %0,%1,0" : "=r" (w0) : "r" (i));
3807         asm volatile("tlbre  %0,%1,1" : "=r" (w1) : "r" (i));
3808         asm volatile("tlbre  %0,%1,2" : "=r" (w2) : "r" (i));
3809         printf("[%02x] %08lx %08lx %08lx ", i, w0, w1, w2);
3810         if (w0 & PPC44x_TLB_VALID) {
3811             printf("V %08lx -> %01lx%08lx %c%c%c%c%c",
3812                    w0 & PPC44x_TLB_EPN_MASK,
3813                    w1 & PPC44x_TLB_ERPN_MASK,
3814                    w1 & PPC44x_TLB_RPN_MASK,
3815                    (w2 & PPC44x_TLB_W) ? 'W' : 'w',
3816                    (w2 & PPC44x_TLB_I) ? 'I' : 'i',
3817                    (w2 & PPC44x_TLB_M) ? 'M' : 'm',
3818                    (w2 & PPC44x_TLB_G) ? 'G' : 'g',
3819                    (w2 & PPC44x_TLB_E) ? 'E' : 'e');
3820         }
3821         printf("\n");
3822     }
3823 }
3824 #endif /* CONFIG_44x */
3825 
3826 #ifdef CONFIG_PPC_BOOK3E
3827 static void dump_tlb_book3e(void)
3828 {
3829     u32 mmucfg, pidmask, lpidmask;
3830     u64 ramask;
3831     int i, tlb, ntlbs, pidsz, lpidsz, rasz, lrat = 0;
3832     int mmu_version;
3833     static const char *pgsz_names[] = {
3834         "  1K",
3835         "  2K",
3836         "  4K",
3837         "  8K",
3838         " 16K",
3839         " 32K",
3840         " 64K",
3841         "128K",
3842         "256K",
3843         "512K",
3844         "  1M",
3845         "  2M",
3846         "  4M",
3847         "  8M",
3848         " 16M",
3849         " 32M",
3850         " 64M",
3851         "128M",
3852         "256M",
3853         "512M",
3854         "  1G",
3855         "  2G",
3856         "  4G",
3857         "  8G",
3858         " 16G",
3859         " 32G",
3860         " 64G",
3861         "128G",
3862         "256G",
3863         "512G",
3864         "  1T",
3865         "  2T",
3866     };
3867 
3868     /* Gather some infos about the MMU */
3869     mmucfg = mfspr(SPRN_MMUCFG);
3870     mmu_version = (mmucfg & 3) + 1;
3871     ntlbs = ((mmucfg >> 2) & 3) + 1;
3872     pidsz = ((mmucfg >> 6) & 0x1f) + 1;
3873     lpidsz = (mmucfg >> 24) & 0xf;
3874     rasz = (mmucfg >> 16) & 0x7f;
3875     if ((mmu_version > 1) && (mmucfg & 0x10000))
3876         lrat = 1;
3877     printf("Book3E MMU MAV=%d.0,%d TLBs,%d-bit PID,%d-bit LPID,%d-bit RA\n",
3878            mmu_version, ntlbs, pidsz, lpidsz, rasz);
3879     pidmask = (1ul << pidsz) - 1;
3880     lpidmask = (1ul << lpidsz) - 1;
3881     ramask = (1ull << rasz) - 1;
3882 
3883     for (tlb = 0; tlb < ntlbs; tlb++) {
3884         u32 tlbcfg;
3885         int nent, assoc, new_cc = 1;
3886         printf("TLB %d:\n------\n", tlb);
3887         switch(tlb) {
3888         case 0:
3889             tlbcfg = mfspr(SPRN_TLB0CFG);
3890             break;
3891         case 1:
3892             tlbcfg = mfspr(SPRN_TLB1CFG);
3893             break;
3894         case 2:
3895             tlbcfg = mfspr(SPRN_TLB2CFG);
3896             break;
3897         case 3:
3898             tlbcfg = mfspr(SPRN_TLB3CFG);
3899             break;
3900         default:
3901             printf("Unsupported TLB number !\n");
3902             continue;
3903         }
3904         nent = tlbcfg & 0xfff;
3905         assoc = (tlbcfg >> 24) & 0xff;
3906         for (i = 0; i < nent; i++) {
3907             u32 mas0 = MAS0_TLBSEL(tlb);
3908             u32 mas1 = MAS1_TSIZE(BOOK3E_PAGESZ_4K);
3909             u64 mas2 = 0;
3910             u64 mas7_mas3;
3911             int esel = i, cc = i;
3912 
3913             if (assoc != 0) {
3914                 cc = i / assoc;
3915                 esel = i % assoc;
3916                 mas2 = cc * 0x1000;
3917             }
3918 
3919             mas0 |= MAS0_ESEL(esel);
3920             mtspr(SPRN_MAS0, mas0);
3921             mtspr(SPRN_MAS1, mas1);
3922             mtspr(SPRN_MAS2, mas2);
3923             asm volatile("tlbre  0,0,0" : : : "memory");
3924             mas1 = mfspr(SPRN_MAS1);
3925             mas2 = mfspr(SPRN_MAS2);
3926             mas7_mas3 = mfspr(SPRN_MAS7_MAS3);
3927             if (assoc && (i % assoc) == 0)
3928                 new_cc = 1;
3929             if (!(mas1 & MAS1_VALID))
3930                 continue;
3931             if (assoc == 0)
3932                 printf("%04x- ", i);
3933             else if (new_cc)
3934                 printf("%04x-%c", cc, 'A' + esel);
3935             else
3936                 printf("    |%c", 'A' + esel);
3937             new_cc = 0;
3938             printf(" %016llx %04x %s %c%c AS%c",
3939                    mas2 & ~0x3ffull,
3940                    (mas1 >> 16) & 0x3fff,
3941                    pgsz_names[(mas1 >> 7) & 0x1f],
3942                    mas1 & MAS1_IND ? 'I' : ' ',
3943                    mas1 & MAS1_IPROT ? 'P' : ' ',
3944                    mas1 & MAS1_TS ? '1' : '0');
3945             printf(" %c%c%c%c%c%c%c",
3946                    mas2 & MAS2_X0 ? 'a' : ' ',
3947                    mas2 & MAS2_X1 ? 'v' : ' ',
3948                    mas2 & MAS2_W  ? 'w' : ' ',
3949                    mas2 & MAS2_I  ? 'i' : ' ',
3950                    mas2 & MAS2_M  ? 'm' : ' ',
3951                    mas2 & MAS2_G  ? 'g' : ' ',
3952                    mas2 & MAS2_E  ? 'e' : ' ');
3953             printf(" %016llx", mas7_mas3 & ramask & ~0x7ffull);
3954             if (mas1 & MAS1_IND)
3955                 printf(" %s\n",
3956                        pgsz_names[(mas7_mas3 >> 1) & 0x1f]);
3957             else
3958                 printf(" U%c%c%c S%c%c%c\n",
3959                        mas7_mas3 & MAS3_UX ? 'x' : ' ',
3960                        mas7_mas3 & MAS3_UW ? 'w' : ' ',
3961                        mas7_mas3 & MAS3_UR ? 'r' : ' ',
3962                        mas7_mas3 & MAS3_SX ? 'x' : ' ',
3963                        mas7_mas3 & MAS3_SW ? 'w' : ' ',
3964                        mas7_mas3 & MAS3_SR ? 'r' : ' ');
3965         }
3966     }
3967 }
3968 #endif /* CONFIG_PPC_BOOK3E */
3969 
3970 static void xmon_init(int enable)
3971 {
3972     if (enable) {
3973         __debugger = xmon;
3974         __debugger_ipi = xmon_ipi;
3975         __debugger_bpt = xmon_bpt;
3976         __debugger_sstep = xmon_sstep;
3977         __debugger_iabr_match = xmon_iabr_match;
3978         __debugger_break_match = xmon_break_match;
3979         __debugger_fault_handler = xmon_fault_handler;
3980 
3981 #ifdef CONFIG_PPC_PSERIES
3982         /*
3983          * Get the token here to avoid trying to get a lock
3984          * during the crash, causing a deadlock.
3985          */
3986         set_indicator_token = rtas_token("set-indicator");
3987 #endif
3988     } else {
3989         __debugger = NULL;
3990         __debugger_ipi = NULL;
3991         __debugger_bpt = NULL;
3992         __debugger_sstep = NULL;
3993         __debugger_iabr_match = NULL;
3994         __debugger_break_match = NULL;
3995         __debugger_fault_handler = NULL;
3996     }
3997 }
3998 
3999 #ifdef CONFIG_MAGIC_SYSRQ
4000 static void sysrq_handle_xmon(int key)
4001 {
4002     if (xmon_is_locked_down()) {
4003         clear_all_bpt();
4004         xmon_init(0);
4005         return;
4006     }
4007     /* ensure xmon is enabled */
4008     xmon_init(1);
4009     debugger(get_irq_regs());
4010     if (!xmon_on)
4011         xmon_init(0);
4012 }
4013 
4014 static const struct sysrq_key_op sysrq_xmon_op = {
4015     .handler =  sysrq_handle_xmon,
4016     .help_msg = "xmon(x)",
4017     .action_msg =   "Entering xmon",
4018 };
4019 
4020 static int __init setup_xmon_sysrq(void)
4021 {
4022     register_sysrq_key('x', &sysrq_xmon_op);
4023     return 0;
4024 }
4025 device_initcall(setup_xmon_sysrq);
4026 #endif /* CONFIG_MAGIC_SYSRQ */
4027 
4028 static void clear_all_bpt(void)
4029 {
4030     int i;
4031 
4032     /* clear/unpatch all breakpoints */
4033     remove_bpts();
4034     remove_cpu_bpts();
4035 
4036     /* Disable all breakpoints */
4037     for (i = 0; i < NBPTS; ++i)
4038         bpts[i].enabled = 0;
4039 
4040     /* Clear any data or iabr breakpoints */
4041     iabr = NULL;
4042     for (i = 0; i < nr_wp_slots(); i++)
4043         dabr[i].enabled = 0;
4044 }
4045 
4046 #ifdef CONFIG_DEBUG_FS
4047 static int xmon_dbgfs_set(void *data, u64 val)
4048 {
4049     xmon_on = !!val;
4050     xmon_init(xmon_on);
4051 
4052     /* make sure all breakpoints removed when disabling */
4053     if (!xmon_on) {
4054         clear_all_bpt();
4055         get_output_lock();
4056         printf("xmon: All breakpoints cleared\n");
4057         release_output_lock();
4058     }
4059 
4060     return 0;
4061 }
4062 
4063 static int xmon_dbgfs_get(void *data, u64 *val)
4064 {
4065     *val = xmon_on;
4066     return 0;
4067 }
4068 
4069 DEFINE_SIMPLE_ATTRIBUTE(xmon_dbgfs_ops, xmon_dbgfs_get,
4070             xmon_dbgfs_set, "%llu\n");
4071 
4072 static int __init setup_xmon_dbgfs(void)
4073 {
4074     debugfs_create_file("xmon", 0600, arch_debugfs_dir, NULL,
4075                 &xmon_dbgfs_ops);
4076     return 0;
4077 }
4078 device_initcall(setup_xmon_dbgfs);
4079 #endif /* CONFIG_DEBUG_FS */
4080 
4081 static int xmon_early __initdata;
4082 
4083 static int __init early_parse_xmon(char *p)
4084 {
4085     if (xmon_is_locked_down()) {
4086         xmon_init(0);
4087         xmon_early = 0;
4088         xmon_on = 0;
4089     } else if (!p || strncmp(p, "early", 5) == 0) {
4090         /* just "xmon" is equivalent to "xmon=early" */
4091         xmon_init(1);
4092         xmon_early = 1;
4093         xmon_on = 1;
4094     } else if (strncmp(p, "on", 2) == 0) {
4095         xmon_init(1);
4096         xmon_on = 1;
4097     } else if (strncmp(p, "rw", 2) == 0) {
4098         xmon_init(1);
4099         xmon_on = 1;
4100         xmon_is_ro = false;
4101     } else if (strncmp(p, "ro", 2) == 0) {
4102         xmon_init(1);
4103         xmon_on = 1;
4104         xmon_is_ro = true;
4105     } else if (strncmp(p, "off", 3) == 0)
4106         xmon_on = 0;
4107     else
4108         return 1;
4109 
4110     return 0;
4111 }
4112 early_param("xmon", early_parse_xmon);
4113 
4114 void __init xmon_setup(void)
4115 {
4116     if (xmon_on)
4117         xmon_init(1);
4118     if (xmon_early)
4119         debugger(NULL);
4120 }
4121 
4122 #ifdef CONFIG_SPU_BASE
4123 
4124 struct spu_info {
4125     struct spu *spu;
4126     u64 saved_mfc_sr1_RW;
4127     u32 saved_spu_runcntl_RW;
4128     unsigned long dump_addr;
4129     u8 stopped_ok;
4130 };
4131 
4132 #define XMON_NUM_SPUS   16  /* Enough for current hardware */
4133 
4134 static struct spu_info spu_info[XMON_NUM_SPUS];
4135 
4136 void __init xmon_register_spus(struct list_head *list)
4137 {
4138     struct spu *spu;
4139 
4140     list_for_each_entry(spu, list, full_list) {
4141         if (spu->number >= XMON_NUM_SPUS) {
4142             WARN_ON(1);
4143             continue;
4144         }
4145 
4146         spu_info[spu->number].spu = spu;
4147         spu_info[spu->number].stopped_ok = 0;
4148         spu_info[spu->number].dump_addr = (unsigned long)
4149                 spu_info[spu->number].spu->local_store;
4150     }
4151 }
4152 
4153 static void stop_spus(void)
4154 {
4155     struct spu *spu;
4156     volatile int i;
4157     u64 tmp;
4158 
4159     for (i = 0; i < XMON_NUM_SPUS; i++) {
4160         if (!spu_info[i].spu)
4161             continue;
4162 
4163         if (setjmp(bus_error_jmp) == 0) {
4164             catch_memory_errors = 1;
4165             sync();
4166 
4167             spu = spu_info[i].spu;
4168 
4169             spu_info[i].saved_spu_runcntl_RW =
4170                 in_be32(&spu->problem->spu_runcntl_RW);
4171 
4172             tmp = spu_mfc_sr1_get(spu);
4173             spu_info[i].saved_mfc_sr1_RW = tmp;
4174 
4175             tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK;
4176             spu_mfc_sr1_set(spu, tmp);
4177 
4178             sync();
4179             __delay(200);
4180 
4181             spu_info[i].stopped_ok = 1;
4182 
4183             printf("Stopped spu %.2d (was %s)\n", i,
4184                     spu_info[i].saved_spu_runcntl_RW ?
4185                     "running" : "stopped");
4186         } else {
4187             catch_memory_errors = 0;
4188             printf("*** Error stopping spu %.2d\n", i);
4189         }
4190         catch_memory_errors = 0;
4191     }
4192 }
4193 
4194 static void restart_spus(void)
4195 {
4196     struct spu *spu;
4197     volatile int i;
4198 
4199     for (i = 0; i < XMON_NUM_SPUS; i++) {
4200         if (!spu_info[i].spu)
4201             continue;
4202 
4203         if (!spu_info[i].stopped_ok) {
4204             printf("*** Error, spu %d was not successfully stopped"
4205                     ", not restarting\n", i);
4206             continue;
4207         }
4208 
4209         if (setjmp(bus_error_jmp) == 0) {
4210             catch_memory_errors = 1;
4211             sync();
4212 
4213             spu = spu_info[i].spu;
4214             spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW);
4215             out_be32(&spu->problem->spu_runcntl_RW,
4216                     spu_info[i].saved_spu_runcntl_RW);
4217 
4218             sync();
4219             __delay(200);
4220 
4221             printf("Restarted spu %.2d\n", i);
4222         } else {
4223             catch_memory_errors = 0;
4224             printf("*** Error restarting spu %.2d\n", i);
4225         }
4226         catch_memory_errors = 0;
4227     }
4228 }
4229 
4230 #define DUMP_WIDTH  23
4231 #define DUMP_VALUE(format, field, value)                \
4232 do {                                    \
4233     if (setjmp(bus_error_jmp) == 0) {               \
4234         catch_memory_errors = 1;                \
4235         sync();                         \
4236         printf("  %-*s = "format"\n", DUMP_WIDTH,       \
4237                 #field, value);             \
4238         sync();                         \
4239         __delay(200);                       \
4240     } else {                            \
4241         catch_memory_errors = 0;                \
4242         printf("  %-*s = *** Error reading field.\n",       \
4243                     DUMP_WIDTH, #field);        \
4244     }                               \
4245     catch_memory_errors = 0;                    \
4246 } while (0)
4247 
4248 #define DUMP_FIELD(obj, format, field)  \
4249     DUMP_VALUE(format, field, obj->field)
4250 
4251 static void dump_spu_fields(struct spu *spu)
4252 {
4253     printf("Dumping spu fields at address %p:\n", spu);
4254 
4255     DUMP_FIELD(spu, "0x%x", number);
4256     DUMP_FIELD(spu, "%s", name);
4257     DUMP_FIELD(spu, "0x%lx", local_store_phys);
4258     DUMP_FIELD(spu, "0x%p", local_store);
4259     DUMP_FIELD(spu, "0x%lx", ls_size);
4260     DUMP_FIELD(spu, "0x%x", node);
4261     DUMP_FIELD(spu, "0x%lx", flags);
4262     DUMP_FIELD(spu, "%llu", class_0_pending);
4263     DUMP_FIELD(spu, "0x%llx", class_0_dar);
4264     DUMP_FIELD(spu, "0x%llx", class_1_dar);
4265     DUMP_FIELD(spu, "0x%llx", class_1_dsisr);
4266     DUMP_FIELD(spu, "0x%x", irqs[0]);
4267     DUMP_FIELD(spu, "0x%x", irqs[1]);
4268     DUMP_FIELD(spu, "0x%x", irqs[2]);
4269     DUMP_FIELD(spu, "0x%x", slb_replace);
4270     DUMP_FIELD(spu, "%d", pid);
4271     DUMP_FIELD(spu, "0x%p", mm);
4272     DUMP_FIELD(spu, "0x%p", ctx);
4273     DUMP_FIELD(spu, "0x%p", rq);
4274     DUMP_FIELD(spu, "0x%llx", timestamp);
4275     DUMP_FIELD(spu, "0x%lx", problem_phys);
4276     DUMP_FIELD(spu, "0x%p", problem);
4277     DUMP_VALUE("0x%x", problem->spu_runcntl_RW,
4278             in_be32(&spu->problem->spu_runcntl_RW));
4279     DUMP_VALUE("0x%x", problem->spu_status_R,
4280             in_be32(&spu->problem->spu_status_R));
4281     DUMP_VALUE("0x%x", problem->spu_npc_RW,
4282             in_be32(&spu->problem->spu_npc_RW));
4283     DUMP_FIELD(spu, "0x%p", priv2);
4284     DUMP_FIELD(spu, "0x%p", pdata);
4285 }
4286 
4287 static int spu_inst_dump(unsigned long adr, long count, int praddr)
4288 {
4289     return generic_inst_dump(adr, count, praddr, print_insn_spu);
4290 }
4291 
4292 static void dump_spu_ls(unsigned long num, int subcmd)
4293 {
4294     unsigned long offset, addr, ls_addr;
4295 
4296     if (setjmp(bus_error_jmp) == 0) {
4297         catch_memory_errors = 1;
4298         sync();
4299         ls_addr = (unsigned long)spu_info[num].spu->local_store;
4300         sync();
4301         __delay(200);
4302     } else {
4303         catch_memory_errors = 0;
4304         printf("*** Error: accessing spu info for spu %ld\n", num);
4305         return;
4306     }
4307     catch_memory_errors = 0;
4308 
4309     if (scanhex(&offset))
4310         addr = ls_addr + offset;
4311     else
4312         addr = spu_info[num].dump_addr;
4313 
4314     if (addr >= ls_addr + LS_SIZE) {
4315         printf("*** Error: address outside of local store\n");
4316         return;
4317     }
4318 
4319     switch (subcmd) {
4320     case 'i':
4321         addr += spu_inst_dump(addr, 16, 1);
4322         last_cmd = "sdi\n";
4323         break;
4324     default:
4325         prdump(addr, 64);
4326         addr += 64;
4327         last_cmd = "sd\n";
4328         break;
4329     }
4330 
4331     spu_info[num].dump_addr = addr;
4332 }
4333 
4334 static int do_spu_cmd(void)
4335 {
4336     static unsigned long num = 0;
4337     int cmd, subcmd = 0;
4338 
4339     cmd = inchar();
4340     switch (cmd) {
4341     case 's':
4342         stop_spus();
4343         break;
4344     case 'r':
4345         restart_spus();
4346         break;
4347     case 'd':
4348         subcmd = inchar();
4349         if (isxdigit(subcmd) || subcmd == '\n')
4350             termch = subcmd;
4351         fallthrough;
4352     case 'f':
4353         scanhex(&num);
4354         if (num >= XMON_NUM_SPUS || !spu_info[num].spu) {
4355             printf("*** Error: invalid spu number\n");
4356             return 0;
4357         }
4358 
4359         switch (cmd) {
4360         case 'f':
4361             dump_spu_fields(spu_info[num].spu);
4362             break;
4363         default:
4364             dump_spu_ls(num, subcmd);
4365             break;
4366         }
4367 
4368         break;
4369     default:
4370         return -1;
4371     }
4372 
4373     return 0;
4374 }
4375 #else /* ! CONFIG_SPU_BASE */
4376 static int do_spu_cmd(void)
4377 {
4378     return -1;
4379 }
4380 #endif