lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 02/75] KVM: SVM: Add GHCB Accessor functions
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Building a correct GHCB for the hypervisor requires setting valid bits
    in the GHCB. Simplify that process by providing accessor functions to
    set values and to update the valid bitmap.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/include/asm/svm.h | 61 ++++++++++++++++++++++++++++++++++++++
    1 file changed, 61 insertions(+)

    diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h
    index f36288c659b5..e4e9f6bacfaa 100644
    --- a/arch/x86/include/asm/svm.h
    +++ b/arch/x86/include/asm/svm.h
    @@ -333,4 +333,65 @@ struct __attribute__ ((__packed__)) vmcb {

    #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP)

    +/* GHCB Accessor functions */
    +
    +#define DEFINE_GHCB_INDICES(field) \
    + u16 idx = offsetof(struct vmcb_save_area, field) / 8; \
    + u16 byte_idx = idx / 8; \
    + u16 bit_idx = idx % 8; \
    + BUILD_BUG_ON(byte_idx > ARRAY_SIZE(ghcb->save.valid_bitmap));
    +
    +#define GHCB_SET_VALID(ghcb, field) \
    + { \
    + DEFINE_GHCB_INDICES(field) \
    + (ghcb)->save.valid_bitmap[byte_idx] |= BIT(bit_idx); \
    + }
    +
    +#define DEFINE_GHCB_SETTER(field) \
    + static inline void \
    + ghcb_set_##field(struct ghcb *ghcb, u64 value) \
    + { \
    + GHCB_SET_VALID(ghcb, field) \
    + (ghcb)->save.field = value; \
    + }
    +
    +#define DEFINE_GHCB_ACCESSORS(field) \
    + static inline bool ghcb_is_valid_##field(const struct ghcb *ghcb) \
    + { \
    + DEFINE_GHCB_INDICES(field) \
    + return !!((ghcb)->save.valid_bitmap[byte_idx] \
    + & BIT(bit_idx)); \
    + } \
    + \
    + static inline void \
    + ghcb_set_##field(struct ghcb *ghcb, u64 value) \
    + { \
    + GHCB_SET_VALID(ghcb, field) \
    + (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
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-04-28 17:40    [W:4.053 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site