lkml.org 
[lkml]   [2018]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 098/101] arm64: KVM: Add ARCH_WORKAROUND_2 discovery through ARCH_FEATURES_FUNC_ID
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Marc Zyngier <marc.zyngier@arm.com>

    commit 5d81f7dc9bca4f4963092433e27b508cbe524a32 upstream.

    Now that all our infrastructure is in place, let's expose the
    availability of ARCH_WORKAROUND_2 to guests. We take this opportunity
    to tidy up a couple of SMCCC constants.

    Acked-by: Christoffer Dall <christoffer.dall@arm.com>
    Reviewed-by: Mark Rutland <mark.rutland@arm.com>
    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/arm/include/asm/kvm_host.h | 12 ++++++++++++
    arch/arm64/include/asm/kvm_host.h | 23 +++++++++++++++++++++++
    arch/arm64/kvm/reset.c | 4 ++++
    virt/kvm/arm/psci.c | 18 ++++++++++++++++--
    4 files changed, 55 insertions(+), 2 deletions(-)

    --- a/arch/arm/include/asm/kvm_host.h
    +++ b/arch/arm/include/asm/kvm_host.h
    @@ -315,6 +315,18 @@ static inline bool kvm_arm_harden_branch
    return false;
    }

    +#define KVM_SSBD_UNKNOWN -1
    +#define KVM_SSBD_FORCE_DISABLE 0
    +#define KVM_SSBD_KERNEL 1
    +#define KVM_SSBD_FORCE_ENABLE 2
    +#define KVM_SSBD_MITIGATED 3
    +
    +static inline int kvm_arm_have_ssbd(void)
    +{
    + /* No way to detect it yet, pretend it is not there. */
    + return KVM_SSBD_UNKNOWN;
    +}
    +
    static inline void kvm_vcpu_load_sysregs(struct kvm_vcpu *vcpu) {}
    static inline void kvm_vcpu_put_sysregs(struct kvm_vcpu *vcpu) {}

    --- a/arch/arm64/include/asm/kvm_host.h
    +++ b/arch/arm64/include/asm/kvm_host.h
    @@ -455,6 +455,29 @@ static inline bool kvm_arm_harden_branch
    return cpus_have_const_cap(ARM64_HARDEN_BRANCH_PREDICTOR);
    }

    +#define KVM_SSBD_UNKNOWN -1
    +#define KVM_SSBD_FORCE_DISABLE 0
    +#define KVM_SSBD_KERNEL 1
    +#define KVM_SSBD_FORCE_ENABLE 2
    +#define KVM_SSBD_MITIGATED 3
    +
    +static inline int kvm_arm_have_ssbd(void)
    +{
    + switch (arm64_get_ssbd_state()) {
    + case ARM64_SSBD_FORCE_DISABLE:
    + return KVM_SSBD_FORCE_DISABLE;
    + case ARM64_SSBD_KERNEL:
    + return KVM_SSBD_KERNEL;
    + case ARM64_SSBD_FORCE_ENABLE:
    + return KVM_SSBD_FORCE_ENABLE;
    + case ARM64_SSBD_MITIGATED:
    + return KVM_SSBD_MITIGATED;
    + case ARM64_SSBD_UNKNOWN:
    + default:
    + return KVM_SSBD_UNKNOWN;
    + }
    +}
    +
    void kvm_vcpu_load_sysregs(struct kvm_vcpu *vcpu);
    void kvm_vcpu_put_sysregs(struct kvm_vcpu *vcpu);

    --- a/arch/arm64/kvm/reset.c
    +++ b/arch/arm64/kvm/reset.c
    @@ -122,6 +122,10 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu
    /* Reset PMU */
    kvm_pmu_vcpu_reset(vcpu);

    + /* Default workaround setup is enabled (if supported) */
    + if (kvm_arm_have_ssbd() == KVM_SSBD_KERNEL)
    + vcpu->arch.workaround_flags |= VCPU_WORKAROUND_2_FLAG;
    +
    /* Reset timer */
    return kvm_timer_vcpu_reset(vcpu);
    }
    --- a/virt/kvm/arm/psci.c
    +++ b/virt/kvm/arm/psci.c
    @@ -405,7 +405,7 @@ static int kvm_psci_call(struct kvm_vcpu
    int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
    {
    u32 func_id = smccc_get_function(vcpu);
    - u32 val = PSCI_RET_NOT_SUPPORTED;
    + u32 val = SMCCC_RET_NOT_SUPPORTED;
    u32 feature;

    switch (func_id) {
    @@ -417,7 +417,21 @@ int kvm_hvc_call_handler(struct kvm_vcpu
    switch(feature) {
    case ARM_SMCCC_ARCH_WORKAROUND_1:
    if (kvm_arm_harden_branch_predictor())
    - val = 0;
    + val = SMCCC_RET_SUCCESS;
    + break;
    + case ARM_SMCCC_ARCH_WORKAROUND_2:
    + switch (kvm_arm_have_ssbd()) {
    + case KVM_SSBD_FORCE_DISABLE:
    + case KVM_SSBD_UNKNOWN:
    + break;
    + case KVM_SSBD_KERNEL:
    + val = SMCCC_RET_SUCCESS;
    + break;
    + case KVM_SSBD_FORCE_ENABLE:
    + case KVM_SSBD_MITIGATED:
    + val = SMCCC_RET_NOT_REQUIRED;
    + break;
    + }
    break;
    }
    break;

    \
     
     \ /
      Last update: 2018-07-20 14:45    [W:2.605 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site