KVM: SVM: Update the SEV-ES save area mapping
authorTom Lendacky <thomas.lendacky@amd.com>
Mon, 7 Mar 2022 21:33:14 +0000 (15:33 -0600)
committerBorislav Petkov <bp@suse.de>
Wed, 6 Apr 2022 10:19:51 +0000 (12:19 +0200)
This is the final step in defining the multiple save areas to keep them
separate and ensuring proper operation amongst the different types of
guests. Update the SEV-ES/SEV-SNP save area to match the APM. This save
area will be used for the upcoming SEV-SNP AP Creation NAE event support.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Venu Busireddy <venu.busireddy@oracle.com>
Link: https://lore.kernel.org/r/20220307213356.2797205-5-brijesh.singh@amd.com
arch/x86/include/asm/svm.h

index 0789ad83b2bd479e1f583092d94feb5dda629852..ec623e7da33d5d46ead369fdfc1a31381676cfb3 100644 (file)
@@ -334,7 +334,13 @@ struct sev_es_save_area {
        struct vmcb_seg ldtr;
        struct vmcb_seg idtr;
        struct vmcb_seg tr;
-       u8 reserved_1[43];
+       u64 vmpl0_ssp;
+       u64 vmpl1_ssp;
+       u64 vmpl2_ssp;
+       u64 vmpl3_ssp;
+       u64 u_cet;
+       u8 reserved_1[2];
+       u8 vmpl;
        u8 cpl;
        u8 reserved_2[4];
        u64 efer;
@@ -347,9 +353,19 @@ struct sev_es_save_area {
        u64 dr6;
        u64 rflags;
        u64 rip;
-       u8 reserved_4[88];
+       u64 dr0;
+       u64 dr1;
+       u64 dr2;
+       u64 dr3;
+       u64 dr0_addr_mask;
+       u64 dr1_addr_mask;
+       u64 dr2_addr_mask;
+       u64 dr3_addr_mask;
+       u8 reserved_4[24];
        u64 rsp;
-       u8 reserved_5[24];
+       u64 s_cet;
+       u64 ssp;
+       u64 isst_addr;
        u64 rax;
        u64 star;
        u64 lstar;
@@ -360,7 +376,7 @@ struct sev_es_save_area {
        u64 sysenter_esp;
        u64 sysenter_eip;
        u64 cr2;
-       u8 reserved_6[32];
+       u8 reserved_5[32];
        u64 g_pat;
        u64 dbgctl;
        u64 br_from;
@@ -369,12 +385,12 @@ struct sev_es_save_area {
        u64 last_excp_to;
        u8 reserved_7[80];
        u32 pkru;
-       u8 reserved_9[20];
-       u64 reserved_10;        /* rax already available at 0x01f8 */
+       u8 reserved_8[20];
+       u64 reserved_9;         /* rax already available at 0x01f8 */
        u64 rcx;
        u64 rdx;
        u64 rbx;
-       u64 reserved_11;        /* rsp already available at 0x01d8 */
+       u64 reserved_10;        /* rsp already available at 0x01d8 */
        u64 rbp;
        u64 rsi;
        u64 rdi;
@@ -386,16 +402,34 @@ struct sev_es_save_area {
        u64 r13;
        u64 r14;
        u64 r15;
-       u8 reserved_12[16];
-       u64 sw_exit_code;
-       u64 sw_exit_info_1;
-       u64 sw_exit_info_2;
-       u64 sw_scratch;
+       u8 reserved_11[16];
+       u64 guest_exit_info_1;
+       u64 guest_exit_info_2;
+       u64 guest_exit_int_info;
+       u64 guest_nrip;
        u64 sev_features;
-       u8 reserved_13[48];
+       u64 vintr_ctrl;
+       u64 guest_exit_code;
+       u64 virtual_tom;
+       u64 tlb_id;
+       u64 pcpu_id;
+       u64 event_inj;
        u64 xcr0;
-       u8 valid_bitmap[16];
-       u64 x87_state_gpa;
+       u8 reserved_12[16];
+
+       /* Floating point area */
+       u64 x87_dp;
+       u32 mxcsr;
+       u16 x87_ftw;
+       u16 x87_fsw;
+       u16 x87_fcw;
+       u16 x87_fop;
+       u16 x87_ds;
+       u16 x87_cs;
+       u64 x87_rip;
+       u8 fpreg_x87[80];
+       u8 fpreg_xmm[256];
+       u8 fpreg_ymm[256];
 } __packed;
 
 struct ghcb_save_area {
@@ -454,7 +488,7 @@ struct ghcb {
 
 #define EXPECTED_VMCB_SAVE_AREA_SIZE           740
 #define EXPECTED_GHCB_SAVE_AREA_SIZE           1032
-#define EXPECTED_SEV_ES_SAVE_AREA_SIZE         1032
+#define EXPECTED_SEV_ES_SAVE_AREA_SIZE         1648
 #define EXPECTED_VMCB_CONTROL_AREA_SIZE                1024
 #define EXPECTED_GHCB_SIZE                     PAGE_SIZE