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] KVM: SVM: Add GHCB definitions
    The following commit has been merged into the x86/seves branch of tip:

    Commit-ID: d07f46f9f51afc7fc9f021eae19eba3c2e7870ac
    Gitweb: https://git.kernel.org/tip/d07f46f9f51afc7fc9f021eae19eba3c2e7870ac
    Author: Tom Lendacky <thomas.lendacky@amd.com>
    AuthorDate: Mon, 07 Sep 2020 15:15:03 +02:00
    Committer: Borislav Petkov <bp@suse.de>
    CommitterDate: Mon, 07 Sep 2020 19:45:24 +02:00

    KVM: SVM: Add GHCB definitions

    Extend the vmcb_safe_area with SEV-ES fields and add a new
    'struct ghcb' which will be used for guest-hypervisor communication.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/20200907131613.12703-3-joro@8bytes.org
    ---
    arch/x86/include/asm/svm.h | 51 +++++++++++++++++++++++++++++++++++--
    arch/x86/kvm/svm/svm.c | 2 +-
    2 files changed, 51 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h
    index 8a1f538..acac55d 100644
    --- a/arch/x86/include/asm/svm.h
    +++ b/arch/x86/include/asm/svm.h
    @@ -200,13 +200,60 @@ struct __attribute__ ((__packed__)) vmcb_save_area {
    u64 br_to;
    u64 last_excp_from;
    u64 last_excp_to;
    +
    + /*
    + * The following part of the save area is valid only for
    + * SEV-ES guests when referenced through the GHCB.
    + */
    + u8 reserved_7[104];
    + u64 reserved_8; /* rax already available at 0x01f8 */
    + u64 rcx;
    + u64 rdx;
    + u64 rbx;
    + u64 reserved_9; /* rsp already available at 0x01d8 */
    + u64 rbp;
    + u64 rsi;
    + u64 rdi;
    + u64 r8;
    + u64 r9;
    + u64 r10;
    + u64 r11;
    + u64 r12;
    + u64 r13;
    + u64 r14;
    + u64 r15;
    + u8 reserved_10[16];
    + u64 sw_exit_code;
    + u64 sw_exit_info_1;
    + u64 sw_exit_info_2;
    + u64 sw_scratch;
    + u8 reserved_11[56];
    + u64 xcr0;
    + u8 valid_bitmap[16];
    + u64 x87_state_gpa;
    };

    +struct ghcb {
    + struct vmcb_save_area save;
    + u8 reserved_save[2048 - sizeof(struct vmcb_save_area)];
    +
    + u8 shared_buffer[2032];
    +
    + u8 reserved_1[10];
    + u16 protocol_version; /* negotiated SEV-ES/GHCB protocol version */
    + u32 ghcb_usage;
    +} __packed;
    +
    +
    +#define EXPECTED_VMCB_SAVE_AREA_SIZE 1032
    +#define EXPECTED_VMCB_CONTROL_AREA_SIZE 256
    +#define EXPECTED_GHCB_SIZE PAGE_SIZE

    static inline void __unused_size_checks(void)
    {
    - BUILD_BUG_ON(sizeof(struct vmcb_save_area) != 0x298);
    - BUILD_BUG_ON(sizeof(struct vmcb_control_area) != 256);
    + BUILD_BUG_ON(sizeof(struct vmcb_save_area) != EXPECTED_VMCB_SAVE_AREA_SIZE);
    + BUILD_BUG_ON(sizeof(struct vmcb_control_area) != EXPECTED_VMCB_CONTROL_AREA_SIZE);
    + BUILD_BUG_ON(sizeof(struct ghcb) != EXPECTED_GHCB_SIZE);
    }

    struct __attribute__ ((__packed__)) vmcb {
    diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
    index 0194336..1db4fdc 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -4164,6 +4164,8 @@ static struct kvm_x86_init_ops svm_init_ops __initdata = {

    static int __init svm_init(void)
    {
    + __unused_size_checks();
    +
    return kvm_init(&svm_init_ops, sizeof(struct vcpu_svm),
    __alignof__(struct vcpu_svm), THIS_MODULE);
    }
    \
     
     \ /
      Last update: 2020-09-10 11:32    [W:4.071 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site