RUNLATCH_ON
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      do_IRQ
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM hardware_interrupt
 
        GEN_COMMON alignment
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      alignment_exception
+       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
        b       interrupt_return
 
        GEN_KVM alignment
 3:
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      program_check_exception
+       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
        b       interrupt_return
 
        GEN_KVM program_check
        RUNLATCH_ON
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      timer_interrupt
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM decrementer
 
 #else
        bl      unknown_exception
 #endif
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM doorbell_super
 
        GEN_COMMON emulation_assist
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      emulation_assist_interrupt
+       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
        b       interrupt_return
 
        GEN_KVM emulation_assist
 #else
        bl      unknown_exception
 #endif
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM h_doorbell
 
        RUNLATCH_ON
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      do_IRQ
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM h_virt_irq
 
        RUNLATCH_ON
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      performance_monitor_exception
-       b       interrupt_return_lite
+       b       interrupt_return
 
        GEN_KVM performance_monitor
 
        addi    r3,r1,STACK_FRAME_OVERHEAD
 #ifdef CONFIG_ALTIVEC
        bl      altivec_assist_exception
+       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
 #else
        bl      unknown_exception
 #endif
         cmpdi  r3,0                    /* see if __hash_page succeeded */
 
        /* Success */
-       beq     interrupt_return_lite   /* Return from exception on success */
+       beq     interrupt_return        /* Return from exception on success */
 
        /* Error */
        blt-    13f
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      do_page_fault
        cmpdi   r3,0
-       beq+    interrupt_return_lite
+       beq+    interrupt_return
        mr      r5,r3
        addi    r3,r1,STACK_FRAME_OVERHEAD
        ld      r4,_DAR(r1)
        bl      do_break
        /*
         * do_break() may have changed the NV GPRS while handling a breakpoint.
-        * If so, we need to restore them with their updated values. Don't use
-        * interrupt_return_lite here.
+        * If so, we need to restore them with their updated values.
         */
+       REST_NVGPRS(r1)
        b       interrupt_return