__hard_irq_disable();                                           \
        flags = irq_soft_mask_set_return(IRQS_ALL_DISABLED);            \
        local_paca->irq_happened |= PACA_IRQ_HARD_DIS;                  \
-       if (!arch_irqs_disabled_flags(flags))                           \
+       if (!arch_irqs_disabled_flags(flags)) {                         \
+               asm ("stdx %%r1, 0, %1 ;"                               \
+                    : "=m" (local_paca->saved_r1)                      \
+                    : "b" (&local_paca->saved_r1));                    \
                trace_hardirqs_off();                                   \
+       }                                                               \
 } while(0)
 
 static inline bool lazy_irq_pending(void)
 
        struct task_struct *__current;  /* Pointer to current */
        u64 kstack;                     /* Saved Kernel stack addr */
        u64 stab_rr;                    /* stab/slb round-robin counter */
-       u64 saved_r1;                   /* r1 save for RTAS calls or PM */
+       u64 saved_r1;                   /* r1 save for RTAS calls or PM or EE=0 */
        u64 saved_msr;                  /* MSR saved here by enter_rtas */
        u16 trap_save;                  /* Used when bad stack is encountered */
        u8 irq_soft_mask;               /* mask for irq soft masking */
 
        xori    r10,r10,MSR_EE; /* clear MSR_EE */      \
        mtspr   SPRN_##_H##SRR1,r10;                    \
 2:     mtcrf   0x80,r9;                                \
+       std     r1,PACAR1(r13);                         \
        ld      r9,PACA_EXGEN+EX_R9(r13);               \
        ld      r10,PACA_EXGEN+EX_R10(r13);             \
        ld      r11,PACA_EXGEN+EX_R11(r13);             \
 
        /* try to switch to cpu specified */
        if (!cpumask_test_cpu(cpu, &cpus_in_xmon)) {
                printf("cpu 0x%lx isn't in xmon\n", cpu);
+#ifdef CONFIG_PPC64
+               printf("backtrace of paca[0x%lx].saved_r1 (possibly stale):\n", cpu);
+               xmon_show_stack(paca_ptrs[cpu]->saved_r1, 0, 0);
+#endif
                return 0;
        }
        xmon_taken = 0;