std     r10,0(r1)               /* make stack chain pointer     */
        std     r0,GPR0(r1)             /* save r0 in stackframe        */
        std     r10,GPR1(r1)            /* save r1 in stackframe        */
+       SANITIZE_GPR(0)
 
        /* Mark our [H]SRRs valid for return */
        li      r10,1
        std     r9,GPR11(r1)
        std     r10,GPR12(r1)
        std     r11,GPR13(r1)
+       .if !IMSR_R12
+       SANITIZE_GPRS(9, 12)
+       .else
+       SANITIZE_GPRS(9, 11)
+       .endif
 
        SAVE_NVGPRS(r1)
+       SANITIZE_NVGPRS()
 
        .if IDAR
        .if IISIDE
 END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
        ld      r10,IAREA+EX_CTR(r13)
        std     r10,_CTR(r1)
-       std     r2,GPR2(r1)             /* save r2 in stackframe        */
-       SAVE_GPRS(3, 8, r1)             /* save r3 - r8 in stackframe   */
+       SAVE_GPRS(2, 8, r1)             /* save r2 - r8 in stackframe   */
+       SANITIZE_GPRS(2, 8)
        mflr    r9                      /* Get LR, later save to stack  */
        LOAD_PACA_TOC()                 /* get kernel TOC into r2       */
        std     r9,_LINK(r1)
        mtlr    r9
        ld      r9,_CCR(r1)
        mtcr    r9
+       SANITIZE_RESTORE_NVGPRS()
        REST_GPRS(2, 13, r1)
        REST_GPR(0, r1)
        /* restore original r1. */
         * do_break() may have changed the NV GPRS while handling a breakpoint.
         * If so, we need to restore them with their updated values.
         */
-       REST_NVGPRS(r1)
+       HANDLER_RESTORE_NVGPRS()
        b       interrupt_return_srr
 
 
        GEN_COMMON alignment
        addi    r3,r1,STACK_INT_FRAME_REGS
        bl      alignment_exception
-       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
+       HANDLER_RESTORE_NVGPRS() /* instruction emulation may change GPRs */
        b       interrupt_return_srr
 
 
 .Ldo_program_check:
        addi    r3,r1,STACK_INT_FRAME_REGS
        bl      program_check_exception
-       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
+       HANDLER_RESTORE_NVGPRS() /* instruction emulation may change GPRs */
        b       interrupt_return_srr
 
 
        GEN_COMMON emulation_assist
        addi    r3,r1,STACK_INT_FRAME_REGS
        bl      emulation_assist_interrupt
-       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
+       HANDLER_RESTORE_NVGPRS() /* instruction emulation may change GPRs */
        b       interrupt_return_hsrr
 
 
        GEN_COMMON facility_unavailable
        addi    r3,r1,STACK_INT_FRAME_REGS
        bl      facility_unavailable_exception
-       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
+       HANDLER_RESTORE_NVGPRS() /* instruction emulation may change GPRs */
        b       interrupt_return_srr
 
 
        GEN_COMMON h_facility_unavailable
        addi    r3,r1,STACK_INT_FRAME_REGS
        bl      facility_unavailable_exception
-       REST_NVGPRS(r1) /* XXX Shouldn't be necessary in practice */
+       /* XXX Shouldn't be necessary in practice */
+       HANDLER_RESTORE_NVGPRS()
        b       interrupt_return_hsrr
 
 
        addi    r3,r1,STACK_INT_FRAME_REGS
 #ifdef CONFIG_ALTIVEC
        bl      altivec_assist_exception
-       REST_NVGPRS(r1) /* instruction emulation may change GPRs */
+       HANDLER_RESTORE_NVGPRS() /* instruction emulation may change GPRs */
 #else
        bl      unknown_exception
 #endif
 
         * but this is the best we can do.
         */
 
+       /*
+        * Zero user registers to prevent influencing speculative execution
+        * state of kernel code.
+        */
+       SANITIZE_SYSCALL_GPRS()
        bl      system_call_exception
 
 .Lsyscall_vectored_\name\()_exit:
        HMT_MEDIUM_LOW
 END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
 
+       SANITIZE_RESTORE_NVGPRS()
        cmpdi   r3,0
        bne     .Lsyscall_vectored_\name\()_restore_regs
 
        ld      r4,_LINK(r1)
        ld      r5,_XER(r1)
 
-       REST_NVGPRS(r1)
+       HANDLER_RESTORE_NVGPRS()
        REST_GPR(0, r1)
        mtcr    r2
        mtctr   r3
        wrteei  1
 #endif
 
+       /*
+        * Zero user registers to prevent influencing speculative execution
+        * state of kernel code.
+        */
+       SANITIZE_SYSCALL_GPRS()
        bl      system_call_exception
 
 .Lsyscall_exit:
        stdcx.  r0,0,r1                 /* to clear the reservation */
 END_FTR_SECTION_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
 
+       SANITIZE_RESTORE_NVGPRS()
        cmpdi   r3,0
        bne     .Lsyscall_restore_regs
        /* Zero volatile regs that may contain sensitive kernel data */
 .Lsyscall_restore_regs:
        ld      r3,_CTR(r1)
        ld      r4,_XER(r1)
-       REST_NVGPRS(r1)
+       HANDLER_RESTORE_NVGPRS()
        mtctr   r3
        mtspr   SPRN_XER,r4
        REST_GPR(0, r1)