lkml.org 
[lkml]   [2023]   [Aug]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][PATCH 07/17] x86/cpu/kvm: Provide UNTRAIN_RET_VM
    With the difference being that UNTRAIN_RET_VM uses
    X86_FEATURE_IBPB_ON_VMEXIT instead of X86_FEATURE_ENTRY_IBPB.

    This cures VMEXIT doing potentially unret+IBPB or double IBPB.

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/include/asm/nospec-branch.h | 11 +++++++++++
    arch/x86/kernel/cpu/bugs.c | 17 ++++++++++++++++-
    arch/x86/kvm/svm/vmenter.S | 7 ++-----
    3 files changed, 29 insertions(+), 6 deletions(-)

    --- a/arch/x86/include/asm/nospec-branch.h
    +++ b/arch/x86/include/asm/nospec-branch.h
    @@ -299,6 +299,17 @@
    #endif
    .endm

    +.macro UNTRAIN_RET_VM
    +#if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_IBPB_ENTRY) || \
    + defined(CONFIG_CALL_DEPTH_TRACKING) || defined(CONFIG_CPU_SRSO)
    + VALIDATE_UNRET_END
    + ALTERNATIVE_3 "", \
    + CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \
    + "call entry_ibpb", X86_FEATURE_IBPB_ON_VMEXIT, \
    + __stringify(RESET_CALL_DEPTH), X86_FEATURE_CALL_DEPTH
    +#endif
    +.endm
    +
    .macro UNTRAIN_RET_FROM_CALL
    #if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_IBPB_ENTRY) || \
    defined(CONFIG_CALL_DEPTH_TRACKING)
    --- a/arch/x86/kvm/svm/vmenter.S
    +++ b/arch/x86/kvm/svm/vmenter.S
    @@ -222,10 +222,7 @@ SYM_FUNC_START(__svm_vcpu_run)
    * because interrupt handlers won't sanitize 'ret' if the return is
    * from the kernel.
    */
    - UNTRAIN_RET
    -
    - /* SRSO */
    - ALTERNATIVE "", "call entry_ibpb", X86_FEATURE_IBPB_ON_VMEXIT
    + UNTRAIN_RET_VM

    /*
    * Clear all general purpose registers except RSP and RAX to prevent
    @@ -362,7 +359,7 @@ SYM_FUNC_START(__svm_sev_es_vcpu_run)
    * because interrupt handlers won't sanitize RET if the return is
    * from the kernel.
    */
    - UNTRAIN_RET
    + UNTRAIN_RET_VM

    /* "Pop" @spec_ctrl_intercepted. */
    pop %_ASM_BX

    \
     
     \ /
      Last update: 2023-08-09 09:28    [W:4.090 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site