KVM: SVM: Create a separate mapping for the SEV-ES save area
[linux-2.6-microblaze.git] / arch / x86 / include / asm / svm.h
index f2d01f3..788a43f 100644 (file)
@@ -271,6 +271,7 @@ struct vmcb_seg {
        u64 base;
 } __packed;
 
+/* Save area definition for legacy and SEV-MEM guests */
 struct vmcb_save_area {
        struct vmcb_seg es;
        struct vmcb_seg cs;
@@ -287,8 +288,58 @@ struct vmcb_save_area {
        u8 cpl;
        u8 reserved_2[4];
        u64 efer;
+       u8 reserved_3[112];
+       u64 cr4;
+       u64 cr3;
+       u64 cr0;
+       u64 dr7;
+       u64 dr6;
+       u64 rflags;
+       u64 rip;
+       u8 reserved_4[88];
+       u64 rsp;
+       u64 s_cet;
+       u64 ssp;
+       u64 isst_addr;
+       u64 rax;
+       u64 star;
+       u64 lstar;
+       u64 cstar;
+       u64 sfmask;
+       u64 kernel_gs_base;
+       u64 sysenter_cs;
+       u64 sysenter_esp;
+       u64 sysenter_eip;
+       u64 cr2;
+       u8 reserved_5[32];
+       u64 g_pat;
+       u64 dbgctl;
+       u64 br_from;
+       u64 br_to;
+       u64 last_excp_from;
+       u64 last_excp_to;
+       u8 reserved_6[72];
+       u32 spec_ctrl;          /* Guest version of SPEC_CTRL at 0x2E0 */
+} __packed;
+
+/* Save area definition for SEV-ES and SEV-SNP guests */
+struct sev_es_save_area {
+       struct vmcb_seg es;
+       struct vmcb_seg cs;
+       struct vmcb_seg ss;
+       struct vmcb_seg ds;
+       struct vmcb_seg fs;
+       struct vmcb_seg gs;
+       struct vmcb_seg gdtr;
+       struct vmcb_seg ldtr;
+       struct vmcb_seg idtr;
+       struct vmcb_seg tr;
+       u8 reserved_1[43];
+       u8 cpl;
+       u8 reserved_2[4];
+       u64 efer;
        u8 reserved_3[104];
-       u64 xss;                /* Valid for SEV-ES only */
+       u64 xss;
        u64 cr4;
        u64 cr3;
        u64 cr0;
@@ -316,22 +367,14 @@ struct 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 or for
-        * saving to the host save area.
-        */
-       u8 reserved_7[72];
-       u32 spec_ctrl;          /* Guest version of SPEC_CTRL at 0x2E0 */
-       u8 reserved_7b[4];
+       u8 reserved_7[80];
        u32 pkru;
-       u8 reserved_7a[20];
-       u64 reserved_8;         /* rax already available at 0x01f8 */
+       u8 reserved_9[20];
+       u64 reserved_10;        /* rax already available at 0x01f8 */
        u64 rcx;
        u64 rdx;
        u64 rbx;
-       u64 reserved_9;         /* rsp already available at 0x01d8 */
+       u64 reserved_11;        /* rsp already available at 0x01d8 */
        u64 rbp;
        u64 rsi;
        u64 rdi;
@@ -343,23 +386,25 @@ struct vmcb_save_area {
        u64 r13;
        u64 r14;
        u64 r15;
-       u8 reserved_10[16];
+       u8 reserved_12[16];
        u64 sw_exit_code;
        u64 sw_exit_info_1;
        u64 sw_exit_info_2;
        u64 sw_scratch;
        u64 sev_features;
-       u8 reserved_11[48];
+       u8 reserved_13[48];
        u64 xcr0;
        u8 valid_bitmap[16];
        u64 x87_state_gpa;
 } __packed;
 
+#define GHCB_SHARED_BUF_SIZE   2032
+
 struct ghcb {
-       struct vmcb_save_area save;
-       u8 reserved_save[2048 - sizeof(struct vmcb_save_area)];
+       struct sev_es_save_area save;
+       u8 reserved_save[2048 - sizeof(struct sev_es_save_area)];
 
-       u8 shared_buffer[2032];
+       u8 shared_buffer[GHCB_SHARED_BUF_SIZE];
 
        u8 reserved_1[10];
        u16 protocol_version;   /* negotiated SEV-ES/GHCB protocol version */
@@ -367,13 +412,15 @@ struct ghcb {
 } __packed;
 
 
-#define EXPECTED_VMCB_SAVE_AREA_SIZE           1032
+#define EXPECTED_VMCB_SAVE_AREA_SIZE           740
+#define EXPECTED_SEV_ES_SAVE_AREA_SIZE         1032
 #define EXPECTED_VMCB_CONTROL_AREA_SIZE                1024
 #define EXPECTED_GHCB_SIZE                     PAGE_SIZE
 
 static inline void __unused_size_checks(void)
 {
        BUILD_BUG_ON(sizeof(struct vmcb_save_area)      != EXPECTED_VMCB_SAVE_AREA_SIZE);
+       BUILD_BUG_ON(sizeof(struct sev_es_save_area)    != EXPECTED_SEV_ES_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);
 }
@@ -443,7 +490,7 @@ struct vmcb {
 /* GHCB Accessor functions */
 
 #define GHCB_BITMAP_IDX(field)                                                 \
-       (offsetof(struct vmcb_save_area, field) / sizeof(u64))
+       (offsetof(struct sev_es_save_area, field) / sizeof(u64))
 
 #define DEFINE_GHCB_ACCESSORS(field)                                           \
        static inline bool ghcb_##field##_is_valid(const struct ghcb *ghcb)     \