diff options
Diffstat (limited to 'arch/powerpc/kernel/crash.c')
| -rw-r--r-- | arch/powerpc/kernel/crash.c | 77 |
1 files changed, 5 insertions, 72 deletions
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c index 5f248e3fdf82..8c21d378f5d2 100644 --- a/arch/powerpc/kernel/crash.c +++ b/arch/powerpc/kernel/crash.c | |||
| @@ -84,7 +84,10 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu) | |||
| 84 | * squirrelled away. ELF notes happen to provide | 84 | * squirrelled away. ELF notes happen to provide |
| 85 | * all of that that no need to invent something new. | 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 | memset(&prstatus, 0, sizeof(prstatus)); | 91 | memset(&prstatus, 0, sizeof(prstatus)); |
| 89 | prstatus.pr_pid = current->pid; | 92 | prstatus.pr_pid = current->pid; |
| 90 | elf_core_copy_regs(&prstatus.pr_reg, regs); | 93 | elf_core_copy_regs(&prstatus.pr_reg, regs); |
| @@ -93,76 +96,6 @@ static void crash_save_this_cpu(struct pt_regs *regs, int cpu) | |||
| 93 | final_note(buf); | 96 | final_note(buf); |
| 94 | } | 97 | } |
| 95 | 98 | ||
| 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(®s, saved_regs, sizeof(regs)); | ||
| 161 | else | ||
| 162 | crash_get_current_regs(®s); | ||
| 163 | crash_save_this_cpu(®s, cpu); | ||
| 164 | } | ||
| 165 | |||
| 166 | #ifdef CONFIG_SMP | 99 | #ifdef CONFIG_SMP |
| 167 | static atomic_t waiting_for_crash_ipi; | 100 | static atomic_t waiting_for_crash_ipi; |
| 168 | 101 | ||
| @@ -260,5 +193,5 @@ void default_machine_crash_shutdown(struct pt_regs *regs) | |||
| 260 | */ | 193 | */ |
| 261 | crashing_cpu = smp_processor_id(); | 194 | crashing_cpu = smp_processor_id(); |
| 262 | crash_kexec_prepare_cpus(); | 195 | crash_kexec_prepare_cpus(); |
| 263 | crash_save_self(regs); | 196 | crash_save_this_cpu(regs, crashing_cpu); |
| 264 | } | 197 | } |
