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