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: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/platforms/pseries/ras.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/ras.c 
b/arch/powerpc/platforms/pseries/ras.c
index ed43c2e4d4ee..2c60e2be1bc5 100644
--- a/arch/powerpc/platforms/pseries/ras.c
+++ b/arch/powerpc/platforms/pseries/ras.c
@@ -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)
 {
+       unsigned long savep_ra;
        unsigned long *savep;
        struct rtas_error_log *h;
 
        /* 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]);
                return NULL;
        }
 
-       savep = __va(regs->gpr[3]);
+       savep = __va(savep_ra);
        regs->gpr[3] = be64_to_cpu(savep[0]);   /* restore original r3 */
 
        h = (struct rtas_error_log *)&savep[1];
-- 
2.23.0

Reply via email to