lkml.org 
[lkml]   [2024]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 057/130] KVM: x86/mmu: Add a new is_private member for union kvm_mmu_page_role
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    Because TDX support introduces private mapping, add a new member in union
    kvm_mmu_page_role with access functions to check the member.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    v19:
    - Fix is_private_sptep() when NULL case.
    - drop CONFIG_KVM_MMU_PRIVATE
    ---
    arch/x86/include/asm/kvm_host.h | 13 ++++++++++++-
    arch/x86/kvm/mmu/mmu_internal.h | 5 +++++
    arch/x86/kvm/mmu/spte.h | 7 +++++++
    3 files changed, 24 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index 6c10d8d1017f..dcc6f7c38a83 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -349,7 +349,8 @@ union kvm_mmu_page_role {
    unsigned ad_disabled:1;
    unsigned guest_mode:1;
    unsigned passthrough:1;
    - unsigned :5;
    + unsigned is_private:1;
    + unsigned :4;

    /*
    * This is left at the top of the word so that
    @@ -361,6 +362,16 @@ union kvm_mmu_page_role {
    };
    };

    +static inline bool kvm_mmu_page_role_is_private(union kvm_mmu_page_role role)
    +{
    + return !!role.is_private;
    +}
    +
    +static inline void kvm_mmu_page_role_set_private(union kvm_mmu_page_role *role)
    +{
    + role->is_private = 1;
    +}
    +
    /*
    * kvm_mmu_extended_role complements kvm_mmu_page_role, tracking properties
    * relevant to the current MMU configuration. When loading CR0, CR4, or EFER,
    diff --git a/arch/x86/kvm/mmu/mmu_internal.h b/arch/x86/kvm/mmu/mmu_internal.h
    index 0443bfcf5d9c..e3f54701f98d 100644
    --- a/arch/x86/kvm/mmu/mmu_internal.h
    +++ b/arch/x86/kvm/mmu/mmu_internal.h
    @@ -145,6 +145,11 @@ static inline int kvm_mmu_page_as_id(struct kvm_mmu_page *sp)
    return kvm_mmu_role_as_id(sp->role);
    }

    +static inline bool is_private_sp(const struct kvm_mmu_page *sp)
    +{
    + return kvm_mmu_page_role_is_private(sp->role);
    +}
    +
    static inline bool kvm_mmu_page_ad_need_write_protect(struct kvm_mmu_page *sp)
    {
    /*
    diff --git a/arch/x86/kvm/mmu/spte.h b/arch/x86/kvm/mmu/spte.h
    index 1a163aee9ec6..3ef8ea18321b 100644
    --- a/arch/x86/kvm/mmu/spte.h
    +++ b/arch/x86/kvm/mmu/spte.h
    @@ -264,6 +264,13 @@ static inline struct kvm_mmu_page *root_to_sp(hpa_t root)
    return spte_to_child_sp(root);
    }

    +static inline bool is_private_sptep(u64 *sptep)
    +{
    + if (WARN_ON_ONCE(!sptep))
    + return false;
    + return is_private_sp(sptep_to_sp(sptep));
    +}
    +
    static inline bool is_mmio_spte(struct kvm *kvm, u64 spte)
    {
    return (spte & shadow_mmio_mask) == kvm->arch.shadow_mmio_value &&
    --
    2.25.1

    \
     
     \ /
      Last update: 2024-05-27 15:21    [W:5.184 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site