return (struct rtas_error_log *)local_paca->mce_data_buf;
 }
 
+static __be64 *fwnmi_get_savep(struct pt_regs *regs)
+{
+       unsigned long savep_ra;
+
+       /* Mask top two bits */
+       savep_ra = regs->gpr[3] & ~(0x3UL << 62);
+       if (!VALID_FWNMI_BUFFER(savep_ra)) {
+               printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
+               return NULL;
+       }
+
+       return __va(savep_ra);
+}
+
 /*
  * Get the error information for errors coming through the
  * FWNMI vectors.  The pt_regs' r3 will be updated to reflect
  */
 static struct rtas_error_log *fwnmi_get_errinfo(struct pt_regs *regs)
 {
-       unsigned long savep_ra;
-       unsigned long *savep;
        struct rtas_error_log *h;
+       __be64 *savep;
 
-       /* Mask top two bits */
-       savep_ra = regs->gpr[3] & ~(0x3UL << 62);
-
-       if (!VALID_FWNMI_BUFFER(savep_ra)) {
-               printk(KERN_ERR "FWNMI: corrupt r3 0x%016lx\n", regs->gpr[3]);
+       savep = fwnmi_get_savep(regs);
+       if (!savep)
                return NULL;
-       }
 
-       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];
        /* Use the per cpu buffer from paca to store rtas error log */
 #endif
 
        if (fwnmi_active) {
-               struct rtas_error_log *errhdr = fwnmi_get_errinfo(regs);
-               if (errhdr) {
-                       /* XXX Should look at FWNMI information */
-               }
-               fwnmi_release_errinfo();
+               __be64 *savep;
+
+               /*
+                * Firmware (PowerVM and KVM) saves r3 to a save area like
+                * machine check, which is not exactly what PAPR (2.9)
+                * suggests but there is no way to detect otherwise, so this
+                * is the interface now.
+                *
+                * System resets do not save any error log or require an
+                * "ibm,nmi-interlock" rtas call to release.
+                */
+
+               savep = fwnmi_get_savep(regs);
+               if (savep)
+                       regs->gpr[3] = be64_to_cpu(savep[0]); /* restore original r3 */
        }
 
        if (smp_handle_nmi_ipi(regs))