• Rohan McLure's avatar
    powerpc/64s: Zeroise gprs on interrupt routine entry on Book3S · 1df45d78
    Rohan McLure authored
    Zeroise user state in gprs (assign to zero) to reduce the influence of user
    registers on speculation within kernel syscall handlers. Clears occur
    at the very beginning of the sc and scv 0 interrupt handlers, with
    restores occurring following the execution of the syscall handler.
    
    Zeroise GPRS r0, r2-r11, r14-r31, on entry into the kernel for all
    other interrupt sources. The remaining gprs are overwritten by
    entry macros to interrupt handlers, irrespective of whether or not a
    given handler consumes these register values. If an interrupt does not
    select the IMSR_R12 IOption, zeroise r12.
    
    Prior to this commit, r14-r31 are restored on a per-interrupt basis at
    exit, but now they are always restored on 64bit Book3S. Remove explicit
    REST_NVGPRS invocations on 64-bit Book3S. 32-bit systems do not clear
    user registers on interrupt, and continue to depend on the return value
    of interrupt_exit_user_prepare to determine whether or not to restore
    non-volatiles.
    
    The mmap_bench benchmark in selftests should rapidly invoke pagefaults.
    See ~0.8% performance regression with this mitigation, but this
    indicates the worst-case performance due to heavier-weight interrupt
    handlers. This mitigation is able to be enabled/disabled through
    CONFIG_INTERRUPT_SANITIZE_REGISTERS.
    Reviewed-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarRohan McLure <rmclure@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20221201071019.1953023-5-rmclure@linux.ibm.com
    1df45d78
exceptions-64s.S 88.4 KB