lkml.org 
[lkml]   [2021]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v2 22/32] x86/boot: Avoid #VE during compressed boot for TDX platforms
    Date
    From: Sean Christopherson <sean.j.christopherson@intel.com>

    Avoid operations which will inject #VE during compressed
    boot, which is obviously fatal for TDX platforms.

    Details are,

    1. TDX module injects #VE if a TDX guest attempts to write
    EFER. So skip the WRMSR to set EFER.LME=1 if it's already
    set. TDX also forces EFER.LME=1, i.e. the branch will always
    be taken and thus the #VE avoided.

    2. TDX module also injects a #VE if the guest attempts to clear
    CR0.NE. Ensure CR0.NE is set when loading CR0 during compressed
    boot. The Setting CR0.NE should be a nop on all CPUs that
    support 64-bit mode.

    Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
    Reviewed-by: Andi Kleen <ak@linux.intel.com>
    Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    ---
    arch/x86/boot/compressed/head_64.S | 5 +++--
    arch/x86/boot/compressed/pgtable.h | 2 +-
    2 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
    index e94874f4bbc1..37c2f37d4a0d 100644
    --- a/arch/x86/boot/compressed/head_64.S
    +++ b/arch/x86/boot/compressed/head_64.S
    @@ -616,8 +616,9 @@ SYM_CODE_START(trampoline_32bit_src)
    movl $MSR_EFER, %ecx
    rdmsr
    btsl $_EFER_LME, %eax
    + jc 1f
    wrmsr
    - popl %edx
    +1: popl %edx
    popl %ecx

    /* Enable PAE and LA57 (if required) paging modes */
    @@ -636,7 +637,7 @@ SYM_CODE_START(trampoline_32bit_src)
    pushl %eax

    /* Enable paging again */
    - movl $(X86_CR0_PG | X86_CR0_PE), %eax
    + movl $(X86_CR0_PG | X86_CR0_NE | X86_CR0_PE), %eax
    movl %eax, %cr0

    lret
    diff --git a/arch/x86/boot/compressed/pgtable.h b/arch/x86/boot/compressed/pgtable.h
    index 6ff7e81b5628..cc9b2529a086 100644
    --- a/arch/x86/boot/compressed/pgtable.h
    +++ b/arch/x86/boot/compressed/pgtable.h
    @@ -6,7 +6,7 @@
    #define TRAMPOLINE_32BIT_PGTABLE_OFFSET 0

    #define TRAMPOLINE_32BIT_CODE_OFFSET PAGE_SIZE
    -#define TRAMPOLINE_32BIT_CODE_SIZE 0x70
    +#define TRAMPOLINE_32BIT_CODE_SIZE 0x80

    #define TRAMPOLINE_32BIT_STACK_END TRAMPOLINE_32BIT_SIZE

    --
    2.25.1
    \
     
     \ /
      Last update: 2021-04-26 20:05    [W:2.282 / U:0.288 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site