[PATCH] powerpc: Fix kdump copy regs and dynamic allocate per-cpu crash notes

- This contains the arch specific changes for the following the
kdump generic fixes which were already accepted in the upstream.
. Capturing CPU registers (for the case of 'panic' and invoking
the dump using 'sysrq-trigger') from a function (stack frame) which will
be not be available during the kdump boot. Hence, might result in
invalid stack trace.
. Dynamically allocating per cpu ELF notes section instead of
statically for NR_CPUS.

- Fix the compiler warning in prom_init.c.

Signed-off-by: Haren Myneni <haren@us.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by Haren Myneni and committed by Paul Mackerras 8385a6a3 9216ad8c

+80 -85
+5 -72
arch/powerpc/kernel/crash.c
··· 84 84 * squirrelled away. ELF notes happen to provide 85 85 * all of that that no need to invent something new. 86 86 */ 87 - buf = &crash_notes[cpu][0]; 87 + buf = (u32*)per_cpu_ptr(crash_notes, cpu); 88 + if (!buf) 89 + return; 90 + 88 91 memset(&prstatus, 0, sizeof(prstatus)); 89 92 prstatus.pr_pid = current->pid; 90 93 elf_core_copy_regs(&prstatus.pr_reg, regs); 91 94 buf = append_elf_note(buf, "CORE", NT_PRSTATUS, &prstatus, 92 95 sizeof(prstatus)); 93 96 final_note(buf); 94 - } 95 - 96 - /* FIXME Merge this with xmon_save_regs ?? */ 97 - static inline void crash_get_current_regs(struct pt_regs *regs) 98 - { 99 - unsigned long tmp1, tmp2; 100 - 101 - __asm__ __volatile__ ( 102 - "std 0,0(%2)\n" 103 - "std 1,8(%2)\n" 104 - "std 2,16(%2)\n" 105 - "std 3,24(%2)\n" 106 - "std 4,32(%2)\n" 107 - "std 5,40(%2)\n" 108 - "std 6,48(%2)\n" 109 - "std 7,56(%2)\n" 110 - "std 8,64(%2)\n" 111 - "std 9,72(%2)\n" 112 - "std 10,80(%2)\n" 113 - "std 11,88(%2)\n" 114 - "std 12,96(%2)\n" 115 - "std 13,104(%2)\n" 116 - "std 14,112(%2)\n" 117 - "std 15,120(%2)\n" 118 - "std 16,128(%2)\n" 119 - "std 17,136(%2)\n" 120 - "std 18,144(%2)\n" 121 - "std 19,152(%2)\n" 122 - "std 20,160(%2)\n" 123 - "std 21,168(%2)\n" 124 - "std 22,176(%2)\n" 125 - "std 23,184(%2)\n" 126 - "std 24,192(%2)\n" 127 - "std 25,200(%2)\n" 128 - "std 26,208(%2)\n" 129 - "std 27,216(%2)\n" 130 - "std 28,224(%2)\n" 131 - "std 29,232(%2)\n" 132 - "std 30,240(%2)\n" 133 - "std 31,248(%2)\n" 134 - "mfmsr %0\n" 135 - "std %0, 264(%2)\n" 136 - "mfctr %0\n" 137 - "std %0, 280(%2)\n" 138 - "mflr %0\n" 139 - "std %0, 288(%2)\n" 140 - "bl 1f\n" 141 - "1: mflr %1\n" 142 - "std %1, 256(%2)\n" 143 - "mtlr %0\n" 144 - "mfxer %0\n" 145 - "std %0, 296(%2)\n" 146 - : "=&r" (tmp1), "=&r" (tmp2) 147 - : "b" (regs)); 148 - } 149 - 150 - /* We may have saved_regs from where the error came from 151 - * or it is NULL if via a direct panic(). 152 - */ 153 - static void crash_save_self(struct pt_regs *saved_regs) 154 - { 155 - struct pt_regs regs; 156 - int cpu; 157 - 158 - cpu = smp_processor_id(); 159 - if (saved_regs) 160 - memcpy(&regs, saved_regs, sizeof(regs)); 161 - else 162 - crash_get_current_regs(&regs); 163 - crash_save_this_cpu(&regs, cpu); 164 97 } 165 98 166 99 #ifdef CONFIG_SMP ··· 193 260 */ 194 261 crashing_cpu = smp_processor_id(); 195 262 crash_kexec_prepare_cpus(); 196 - crash_save_self(regs); 263 + crash_save_this_cpu(regs, crashing_cpu); 197 264 }
+2 -1
arch/powerpc/kernel/prom_init.c
··· 605 605 opt = strstr(RELOC(prom_cmd_line), RELOC("crashkernel=")); 606 606 if (opt) { 607 607 opt += 12; 608 - RELOC(prom_crashk_size) = prom_memparse(opt, &opt); 608 + RELOC(prom_crashk_size) = 609 + prom_memparse(opt, (const char **)&opt); 609 610 610 611 if (ALIGN(RELOC(prom_crashk_size), 0x1000000) != 611 612 RELOC(prom_crashk_size)) {
+73 -12
include/asm-powerpc/kexec.h
··· 31 31 #define KEXEC_ARCH KEXEC_ARCH_PPC 32 32 #endif 33 33 34 - #define HAVE_ARCH_COPY_OLDMEM_PAGE 35 - 36 - #ifndef __ASSEMBLY__ 37 - 38 34 #ifdef CONFIG_KEXEC 39 35 36 + #ifdef __powerpc64__ 37 + /* 38 + * This function is responsible for capturing register states if coming 39 + * via panic or invoking dump using sysrq-trigger. 40 + */ 41 + static inline void crash_setup_regs(struct pt_regs *newregs, 42 + struct pt_regs *oldregs) 43 + { 44 + if (oldregs) 45 + memcpy(newregs, oldregs, sizeof(*newregs)); 46 + else { 47 + /* FIXME Merge this with xmon_save_regs ?? */ 48 + unsigned long tmp1, tmp2; 49 + __asm__ __volatile__ ( 50 + "std 0,0(%2)\n" 51 + "std 1,8(%2)\n" 52 + "std 2,16(%2)\n" 53 + "std 3,24(%2)\n" 54 + "std 4,32(%2)\n" 55 + "std 5,40(%2)\n" 56 + "std 6,48(%2)\n" 57 + "std 7,56(%2)\n" 58 + "std 8,64(%2)\n" 59 + "std 9,72(%2)\n" 60 + "std 10,80(%2)\n" 61 + "std 11,88(%2)\n" 62 + "std 12,96(%2)\n" 63 + "std 13,104(%2)\n" 64 + "std 14,112(%2)\n" 65 + "std 15,120(%2)\n" 66 + "std 16,128(%2)\n" 67 + "std 17,136(%2)\n" 68 + "std 18,144(%2)\n" 69 + "std 19,152(%2)\n" 70 + "std 20,160(%2)\n" 71 + "std 21,168(%2)\n" 72 + "std 22,176(%2)\n" 73 + "std 23,184(%2)\n" 74 + "std 24,192(%2)\n" 75 + "std 25,200(%2)\n" 76 + "std 26,208(%2)\n" 77 + "std 27,216(%2)\n" 78 + "std 28,224(%2)\n" 79 + "std 29,232(%2)\n" 80 + "std 30,240(%2)\n" 81 + "std 31,248(%2)\n" 82 + "mfmsr %0\n" 83 + "std %0, 264(%2)\n" 84 + "mfctr %0\n" 85 + "std %0, 280(%2)\n" 86 + "mflr %0\n" 87 + "std %0, 288(%2)\n" 88 + "bl 1f\n" 89 + "1: mflr %1\n" 90 + "std %1, 256(%2)\n" 91 + "mtlr %0\n" 92 + "mfxer %0\n" 93 + "std %0, 296(%2)\n" 94 + : "=&r" (tmp1), "=&r" (tmp2) 95 + : "b" (newregs)); 96 + } 97 + } 98 + #else 99 + /* 100 + * Provide a dummy definition to avoid build failures. Will remain 101 + * empty till crash dump support is enabled. 102 + */ 103 + static inline void crash_setup_regs(struct pt_regs *newregs, 104 + struct pt_regs *oldregs) { } 105 + #endif /* !__powerpc64 __ */ 106 + 107 + #ifndef __ASSEMBLY__ 40 108 #define MAX_NOTE_BYTES 1024 41 109 42 110 #ifdef __powerpc64__ ··· 121 53 extern int default_machine_kexec_prepare(struct kimage *image); 122 54 extern void default_machine_crash_shutdown(struct pt_regs *regs); 123 55 124 - #endif /* !CONFIG_KEXEC */ 125 - 126 - /* 127 - * Provide a dummy definition to avoid build failures. Will remain 128 - * empty till crash dump support is enabled. 129 - */ 130 - static inline void crash_setup_regs(struct pt_regs *newregs, 131 - struct pt_regs *oldregs) { } 132 56 #endif /* ! __ASSEMBLY__ */ 57 + #endif /* CONFIG_KEXEC */ 133 58 #endif /* __KERNEL__ */ 134 59 #endif /* _ASM_POWERPC_KEXEC_H */