Commit dff681e9 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

powerpc/pseries/ras: fwnmi avoid modifying r3 in error case

If there is some error with the fwnmi save area, r3 has already been
modified which doesn't help with debugging.

Only update r3 when to restore the saved value.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200508043408.886394-8-npiggin@gmail.com
parent deb70f7a
...@@ -423,18 +423,19 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void) ...@@ -423,18 +423,19 @@ static inline struct rtas_error_log *fwnmi_get_errlog(void)
*/ */
static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs) static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
{ {
unsigned long savep_ra;
unsigned long *savep; unsigned long *savep;
struct rtas_error_log *h; struct rtas_error_log *h;
/* Mask top two bits */ /* Mask top two bits */
regs->gpr[3] &= ~(0x3UL << 62); savep_ra = regs->gpr[3] & ~(0x3UL << 62);
if (!VALID_FWNMI_BUFFER(regs->gpr[3])) { if (!VALID_FWNMI_BUFFER(savep_ra)) {
printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]); printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
return NULL; return NULL;
} }
savep = __va(regs->gpr[3]); savep = __va(savep_ra);
regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */ regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
h = (struct rtas_error_log *)&savep[1]; h = (struct rtas_error_log *)&savep[1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment