lkml.org 
[lkml]   [2020]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 19/75] x86/boot/compressed/64: Call set_sev_encryption_mask earlier
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Call set_sev_encryption_mask() while still on the stage 1 #VC-handler,
    because the stage 2 handler needs our own page-tables to be set up, to
    which calling set_sev_encryption_mask() is a prerequisite.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/boot/compressed/head_64.S | 8 +++++++-
    arch/x86/boot/compressed/ident_map_64.c | 3 ---
    2 files changed, 7 insertions(+), 4 deletions(-)

    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index 36f18d5592f4..963bf2ce11cf 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -543,9 +543,15 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
    rep stosq

    /*
    - * Load stage2 IDT and switch to our own page-table
    + * If running as an SEV guest, the encryption mask is required in the
    + * page-table setup code below. When the guest also has SEV-ES enabled
    + * set_sev_encryption_mask() will cause #VC exceptions, but the stage2
    + * handler can't map its GHCB because the page-table is not set up yet.
    + * So set up the encryption mask here while still on the stage1 #VC
    + * handler. Then load stage2 IDT and switch to our own page-table.
    */
    pushq %rsi
    + call set_sev_encryption_mask
    call load_stage2_idt
    call initialize_identity_maps
    popq %rsi
    diff --git a/arch/x86/boot/compressed/ident_map_64.c b/arch/x86/boot/compressed/ident_map_64.c
    index 62e42c11a336..b4f2a5f503cd 100644
    --- a/arch/x86/boot/compressed/ident_map_64.c
    +++ b/arch/x86/boot/compressed/ident_map_64.c
    @@ -105,9 +105,6 @@ static void add_identity_map(unsigned long start, unsigned long end)
    /* Locates and clears a region for a new top level page table. */
    void initialize_identity_maps(void)
    {
    - /* If running as an SEV guest, the encryption mask is required. */
    - set_sev_encryption_mask();
    -
    /* Exclude the encryption mask from __PHYSICAL_MASK */
    physical_mask &= ~sme_me_mask;

    --
    2.27.0
    \
     
     \ /
      Last update: 2020-07-14 14:17    [W:4.003 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site