KVM: SVM: Add GHCB definitions
authorTom Lendacky <thomas.lendacky@amd.com>
Mon, 7 Sep 2020 13:15:03 +0000 (15:15 +0200)
committerBorislav Petkov <bp@suse.de>
Mon, 7 Sep 2020 17:45:24 +0000 (19:45 +0200)
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
arch/x86/kvm/svm/svm.c

index 8a1f538..acac55d 100644 (file)
@@ -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 {
index 0194336..1db4fdc 100644 (file)
@@ -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);
 }