From: Peter Gonda <pgo...@google.com>

Move the GHCB definitions from svm.h to the tools/ copy. This allows the
SEV-ES selftest to use GHCBs which are required for non-trival VMs to
paravirtualize NonAutomaticExits (NAEs) when SEV-ES is enabled. GHCB
getters/setters have a warning with address-of-packed-member, so removed
this using the CFLAGS.

Cc: Vishal Annapurve <vannapu...@google.com>
Cc: Ackerley Tng <ackerley...@google.com>
Cc: Paolo Bonzini <pbonz...@redhat.com>
Cc: Claudio Imbrenda <imbre...@linux.ibm.com>
Cc: Sean Christopherson <sea...@google.com>
Cc: Carlos Bilbao <carlos.bil...@amd.com>
Cc: Tom Lendacky <thomas.lenda...@amd.com>
Cc: Michael Roth <michael.r...@amd.com>
Cc: k...@vger.kernel.org
Cc: linux-kselft...@vger.kernel.org
Signed-off-by: Peter Gonda <pgo...@google.com>
Signed-off-by: Neeraj Upadhyay <neeraj.upadh...@amd.com>
---
 tools/testing/selftests/kvm/Makefile.kvm      |   2 +-
 tools/testing/selftests/kvm/include/x86/svm.h | 106 ++++++++++++++++++
 2 files changed, 107 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/Makefile.kvm 
b/tools/testing/selftests/kvm/Makefile.kvm
index 4277b983cace..b4894cb56861 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -226,7 +226,7 @@ LINUX_TOOL_ARCH_INCLUDE = 
$(top_srcdir)/tools/arch/$(ARCH)/include
 CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \
        -Wno-gnu-variable-sized-type-not-at-end -MD -MP -DCONFIG_64BIT \
        -fno-builtin-memcmp -fno-builtin-memcpy \
-       -fno-builtin-memset -fno-builtin-strnlen \
+       -fno-builtin-memset -fno-builtin-strnlen -Wno-address-of-packed-member \
        -fno-stack-protector -fno-PIE -fno-strict-aliasing \
        -I$(LINUX_TOOL_INCLUDE) -I$(LINUX_TOOL_ARCH_INCLUDE) \
        -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -Iinclude/$(ARCH) \
diff --git a/tools/testing/selftests/kvm/include/x86/svm.h 
b/tools/testing/selftests/kvm/include/x86/svm.h
index 29cffd0a9181..66dd4eaf23b9 100644
--- a/tools/testing/selftests/kvm/include/x86/svm.h
+++ b/tools/testing/selftests/kvm/include/x86/svm.h
@@ -317,4 +317,110 @@ struct __attribute__ ((__packed__)) vmcb {
 
 #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP)
 
+struct ghcb_save_area {
+       u8 reserved_0x0[203];
+       u8 cpl;
+       u8 reserved_0xcc[116];
+       u64 xss;
+       u8 reserved_0x148[24];
+       u64 dr7;
+       u8 reserved_0x168[16];
+       u64 rip;
+       u8 reserved_0x180[88];
+       u64 rsp;
+       u8 reserved_0x1e0[24];
+       u64 rax;
+       u8 reserved_0x200[264];
+       u64 rcx;
+       u64 rdx;
+       u64 rbx;
+       u8 reserved_0x320[8];
+       u64 rbp;
+       u64 rsi;
+       u64 rdi;
+       u64 r8;
+       u64 r9;
+       u64 r10;
+       u64 r11;
+       u64 r12;
+       u64 r13;
+       u64 r14;
+       u64 r15;
+       u8 reserved_0x380[16];
+       u64 sw_exit_code;
+       u64 sw_exit_info_1;
+       u64 sw_exit_info_2;
+       u64 sw_scratch;
+       u8 reserved_0x3b0[56];
+       u64 xcr0;
+       u8 valid_bitmap[16];
+       u64 x87_state_gpa;
+} __packed;
+
+#define GHCB_SHARED_BUF_SIZE   2032
+
+struct ghcb {
+       struct ghcb_save_area save;
+       u8 reserved_save[2048 - sizeof(struct ghcb_save_area)];
+
+       u8 shared_buffer[GHCB_SHARED_BUF_SIZE];
+
+       u8 reserved_0xff0[10];
+       u16 protocol_version;   /* negotiated SEV-ES/GHCB protocol version */
+       u32 ghcb_usage;
+} __packed;
+
+/* GHCB Accessor functions */
+
+#define GHCB_BITMAP_IDX(field)                                                 
\
+       (offsetof(struct ghcb_save_area, field) / sizeof(u64))
+
+#define DEFINE_GHCB_ACCESSORS(field)                                           
\
+       static __always_inline bool ghcb_##field##_is_valid(const struct ghcb 
*ghcb) \
+       {                                                                       
\
+               return test_bit(GHCB_BITMAP_IDX(field),                         
\
+                               (unsigned long *)&ghcb->save.valid_bitmap);     
\
+       }                                                                       
\
+                                                                               
\
+       static __always_inline u64 ghcb_get_##field(struct ghcb *ghcb)          
\
+       {                                                                       
\
+               return ghcb->save.field;                                        
\
+       }                                                                       
\
+                                                                               
\
+       static __always_inline u64 ghcb_get_##field##_if_valid(struct ghcb 
*ghcb) \
+       {                                                                       
\
+               return ghcb_##field##_is_valid(ghcb) ? ghcb->save.field : 0;    
\
+       }                                                                       
\
+                                                                               
\
+       static __always_inline void ghcb_set_##field(struct ghcb *ghcb, u64 
value) \
+       {                                                                       
\
+               __set_bit(GHCB_BITMAP_IDX(field),                               
\
+                         (unsigned long *)&ghcb->save.valid_bitmap);           
\
+               ghcb->save.field = value;                                       
\
+       }
+
+DEFINE_GHCB_ACCESSORS(cpl)
+DEFINE_GHCB_ACCESSORS(rip)
+DEFINE_GHCB_ACCESSORS(rsp)
+DEFINE_GHCB_ACCESSORS(rax)
+DEFINE_GHCB_ACCESSORS(rcx)
+DEFINE_GHCB_ACCESSORS(rdx)
+DEFINE_GHCB_ACCESSORS(rbx)
+DEFINE_GHCB_ACCESSORS(rbp)
+DEFINE_GHCB_ACCESSORS(rsi)
+DEFINE_GHCB_ACCESSORS(rdi)
+DEFINE_GHCB_ACCESSORS(r8)
+DEFINE_GHCB_ACCESSORS(r9)
+DEFINE_GHCB_ACCESSORS(r10)
+DEFINE_GHCB_ACCESSORS(r11)
+DEFINE_GHCB_ACCESSORS(r12)
+DEFINE_GHCB_ACCESSORS(r13)
+DEFINE_GHCB_ACCESSORS(r14)
+DEFINE_GHCB_ACCESSORS(r15)
+DEFINE_GHCB_ACCESSORS(sw_exit_code)
+DEFINE_GHCB_ACCESSORS(sw_exit_info_1)
+DEFINE_GHCB_ACCESSORS(sw_exit_info_2)
+DEFINE_GHCB_ACCESSORS(sw_scratch)
+DEFINE_GHCB_ACCESSORS(xcr0)
+
 #endif /* SELFTEST_KVM_SVM_H */
-- 
2.34.1


Reply via email to