These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / powerpc / xmon / xmon.c
index e599259..786bf01 100644 (file)
@@ -242,6 +242,7 @@ Commands:\n\
 "  u   dump TLB\n"
 #endif
 "  ?   help\n"
+"  # n limit output to n lines per page (for dp, dpa, dl)\n"
 "  zr  reboot\n\
   zh   halt\n"
 ;
@@ -833,6 +834,16 @@ static void remove_cpu_bpts(void)
        write_ciabr(0);
 }
 
+static void set_lpp_cmd(void)
+{
+       unsigned long lpp;
+
+       if (!scanhex(&lpp)) {
+               printf("Invalid number.\n");
+               lpp = 0;
+       }
+       xmon_set_pagination_lpp(lpp);
+}
 /* Command interpreting routine */
 static char *last_cmd;
 
@@ -924,6 +935,9 @@ cmds(struct pt_regs *excp)
                case '?':
                        xmon_puts(help_string);
                        break;
+               case '#':
+                       set_lpp_cmd();
+                       break;
                case 'b':
                        bpt_cmds();
                        break;
@@ -1987,7 +2001,6 @@ memex(void)
                        case '^':
                                adrs -= size;
                                break;
-                               break;
                        case '/':
                                if (nslash > 0)
                                        adrs -= 1 << nslash;
@@ -2073,6 +2086,9 @@ static void xmon_rawdump (unsigned long adrs, long ndump)
 static void dump_one_paca(int cpu)
 {
        struct paca_struct *p;
+#ifdef CONFIG_PPC_STD_MMU_64
+       int i = 0;
+#endif
 
        if (setjmp(bus_error_jmp) != 0) {
                printf("*** Error dumping paca for cpu 0x%x!\n", cpu);
@@ -2086,12 +2102,12 @@ static void dump_one_paca(int cpu)
 
        printf("paca for cpu 0x%x @ %p:\n", cpu, p);
 
-       printf(" %-*s = %s\n", 16, "possible", cpu_possible(cpu) ? "yes" : "no");
-       printf(" %-*s = %s\n", 16, "present", cpu_present(cpu) ? "yes" : "no");
-       printf(" %-*s = %s\n", 16, "online", cpu_online(cpu) ? "yes" : "no");
+       printf(" %-*s = %s\n", 20, "possible", cpu_possible(cpu) ? "yes" : "no");
+       printf(" %-*s = %s\n", 20, "present", cpu_present(cpu) ? "yes" : "no");
+       printf(" %-*s = %s\n", 20, "online", cpu_online(cpu) ? "yes" : "no");
 
 #define DUMP(paca, name, format) \
-       printf(" %-*s = %#-*"format"\t(0x%lx)\n", 16, #name, 18, paca->name, \
+       printf(" %-*s = %#-*"format"\t(0x%lx)\n", 20, #name, 18, paca->name, \
                offsetof(struct paca_struct, name));
 
        DUMP(p, lock_token, "x");
@@ -2103,11 +2119,41 @@ static void dump_one_paca(int cpu)
 #ifdef CONFIG_PPC_BOOK3S_64
        DUMP(p, mc_emergency_sp, "p");
        DUMP(p, in_mce, "x");
+       DUMP(p, hmi_event_available, "x");
 #endif
        DUMP(p, data_offset, "lx");
        DUMP(p, hw_cpu_id, "x");
        DUMP(p, cpu_start, "x");
        DUMP(p, kexec_state, "x");
+#ifdef CONFIG_PPC_STD_MMU_64
+       for (i = 0; i < SLB_NUM_BOLTED; i++) {
+               u64 esid, vsid;
+
+               if (!p->slb_shadow_ptr)
+                       continue;
+
+               esid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].esid);
+               vsid = be64_to_cpu(p->slb_shadow_ptr->save_area[i].vsid);
+
+               if (esid || vsid) {
+                       printf(" slb_shadow[%d]:       = 0x%016lx 0x%016lx\n",
+                               i, esid, vsid);
+               }
+       }
+       DUMP(p, vmalloc_sllp, "x");
+       DUMP(p, slb_cache_ptr, "x");
+       for (i = 0; i < SLB_CACHE_ENTRIES; i++)
+               printf(" slb_cache[%d]:        = 0x%016lx\n", i, p->slb_cache[i]);
+#endif
+       DUMP(p, dscr_default, "llx");
+#ifdef CONFIG_PPC_BOOK3E
+       DUMP(p, pgd, "p");
+       DUMP(p, kernel_pgd, "p");
+       DUMP(p, tcd_ptr, "p");
+       DUMP(p, mc_kstack, "p");
+       DUMP(p, crit_kstack, "p");
+       DUMP(p, dbg_kstack, "p");
+#endif
        DUMP(p, __current, "p");
        DUMP(p, kstack, "lx");
        DUMP(p, stab_rr, "lx");
@@ -2118,7 +2164,27 @@ static void dump_one_paca(int cpu)
        DUMP(p, io_sync, "x");
        DUMP(p, irq_work_pending, "x");
        DUMP(p, nap_state_lost, "x");
+       DUMP(p, sprg_vdso, "llx");
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+       DUMP(p, tm_scratch, "llx");
+#endif
+
+#ifdef CONFIG_PPC_POWERNV
+       DUMP(p, core_idle_state_ptr, "p");
+       DUMP(p, thread_idle_state, "x");
+       DUMP(p, thread_mask, "x");
+       DUMP(p, subcore_sibling_mask, "x");
+#endif
 
+       DUMP(p, user_time, "llx");
+       DUMP(p, system_time, "llx");
+       DUMP(p, user_time_scaled, "llx");
+       DUMP(p, starttime, "llx");
+       DUMP(p, starttime_user, "llx");
+       DUMP(p, startspurr, "llx");
+       DUMP(p, utime_sspurr, "llx");
+       DUMP(p, stolen_time, "llx");
 #undef DUMP
 
        catch_memory_errors = 0;
@@ -2167,7 +2233,9 @@ dump(void)
 
 #ifdef CONFIG_PPC64
        if (c == 'p') {
+               xmon_start_pagination();
                dump_pacas();
+               xmon_end_pagination();
                return;
        }
 #endif
@@ -2316,10 +2384,12 @@ dump_log_buf(void)
        sync();
 
        kmsg_dump_rewind_nolock(&dumper);
+       xmon_start_pagination();
        while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
                buf[len] = '\0';
                printf("%s", buf);
        }
+       xmon_end_pagination();
 
        sync();
        /* wait a little while to see if we get a machine check */
@@ -2731,7 +2801,7 @@ static void xmon_print_symbol(unsigned long address, const char *mid,
 void dump_segments(void)
 {
        int i;
-       unsigned long esid,vsid,valid;
+       unsigned long esid,vsid;
        unsigned long llp;
 
        printf("SLB contents of cpu 0x%x\n", smp_processor_id());
@@ -2739,10 +2809,9 @@ void dump_segments(void)
        for (i = 0; i < mmu_slb_size; i++) {
                asm volatile("slbmfee  %0,%1" : "=r" (esid) : "r" (i));
                asm volatile("slbmfev  %0,%1" : "=r" (vsid) : "r" (i));
-               valid = (esid & SLB_ESID_V);
-               if (valid | esid | vsid) {
+               if (esid || vsid) {
                        printf("%02d %016lx %016lx", i, esid, vsid);
-                       if (valid) {
+                       if (esid & SLB_ESID_V) {
                                llp = vsid & SLB_VSID_LLP;
                                if (vsid & SLB_VSID_B_1T) {
                                        printf("  1T  ESID=%9lx  VSID=%13lx LLP:%3lx \n",