lkml.org 
[lkml]   [2020]   [Sep]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/seves] x86/head/64: Don't call verify_cpu() on starting APs
    The following commit has been merged into the x86/seves branch of tip:

    Commit-ID: 3ecacdbd23956a549d93023f86adc87b4a9d6520
    Gitweb: https://git.kernel.org/tip/3ecacdbd23956a549d93023f86adc87b4a9d6520
    Author: Joerg Roedel <jroedel@suse.de>
    AuthorDate: Mon, 07 Sep 2020 15:16:09 +02:00
    Committer: Borislav Petkov <bp@suse.de>
    CommitterDate: Wed, 09 Sep 2020 11:33:20 +02:00

    x86/head/64: Don't call verify_cpu() on starting APs

    The APs are not ready to handle exceptions when verify_cpu() is called
    in secondary_startup_64().

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Link: https://lkml.kernel.org/r/20200907131613.12703-69-joro@8bytes.org
    ---
    arch/x86/include/asm/realmode.h | 1 +
    arch/x86/kernel/head_64.S | 12 ++++++++++++
    arch/x86/realmode/init.c | 6 ++++++
    3 files changed, 19 insertions(+)

    diff --git a/arch/x86/include/asm/realmode.h b/arch/x86/include/asm/realmode.h
    index 4d4d853..5db5d08 100644
    --- a/arch/x86/include/asm/realmode.h
    +++ b/arch/x86/include/asm/realmode.h
    @@ -72,6 +72,7 @@ extern unsigned char startup_32_smp[];
    extern unsigned char boot_gdt[];
    #else
    extern unsigned char secondary_startup_64[];
    +extern unsigned char secondary_startup_64_no_verify[];
    #endif

    static inline size_t real_mode_size_needed(void)
    diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
    index 1a71d0d..7eb2a1c 100644
    --- a/arch/x86/kernel/head_64.S
    +++ b/arch/x86/kernel/head_64.S
    @@ -126,6 +126,18 @@ SYM_CODE_START(secondary_startup_64)
    call verify_cpu

    /*
    + * The secondary_startup_64_no_verify entry point is only used by
    + * SEV-ES guests. In those guests the call to verify_cpu() would cause
    + * #VC exceptions which can not be handled at this stage of secondary
    + * CPU bringup.
    + *
    + * All non SEV-ES systems, especially Intel systems, need to execute
    + * verify_cpu() above to make sure NX is enabled.
    + */
    +SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
    + UNWIND_HINT_EMPTY
    +
    + /*
    * Retrieve the modifier (SME encryption mask if SME is active) to be
    * added to the initial pgdir entry that will be programmed into CR3.
    */
    diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c
    index 3fb9b60..22fda7d 100644
    --- a/arch/x86/realmode/init.c
    +++ b/arch/x86/realmode/init.c
    @@ -46,6 +46,12 @@ static void sme_sev_setup_real_mode(struct trampoline_header *th)
    th->flags |= TH_FLAGS_SME_ACTIVE;

    if (sev_es_active()) {
    + /*
    + * Skip the call to verify_cpu() in secondary_startup_64 as it
    + * will cause #VC exceptions when the AP can't handle them yet.
    + */
    + th->start = (u64) secondary_startup_64_no_verify;
    +
    if (sev_es_setup_ap_jump_table(real_mode_header))
    panic("Failed to get/update SEV-ES AP Jump Table");
    }
    \
     
     \ /
      Last update: 2020-09-10 11:22    [W:4.448 / U:0.612 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site