lkml.org 
[lkml]   [2015]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/12] KVM: x86: advertise KVM_CAP_X86_SMM
    Date
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    --
    RFC->v1: depend on support for real mode CS base above 1M
    ---
    arch/x86/include/asm/kvm_host.h | 1 +
    arch/x86/kvm/svm.c | 6 ++++++
    arch/x86/kvm/vmx.c | 6 ++++++
    arch/x86/kvm/x86.c | 15 +++++++++++++++
    4 files changed, 28 insertions(+)

    diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
    index 3caefa4be90b..1c3e68a571c7 100644
    --- a/arch/x86/include/asm/kvm_host.h
    +++ b/arch/x86/include/asm/kvm_host.h
    @@ -700,6 +700,7 @@ struct kvm_x86_ops {
    int (*hardware_setup)(void); /* __init */
    void (*hardware_unsetup)(void); /* __exit */
    bool (*cpu_has_accelerated_tpr)(void);
    + bool (*cpu_has_high_real_mode_segbase)(void);
    void (*cpuid_update)(struct kvm_vcpu *vcpu);

    /* Create, but do not attach this VCPU */
    diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
    index 1422dd945b85..c8c4430222c3 100644
    --- a/arch/x86/kvm/svm.c
    +++ b/arch/x86/kvm/svm.c
    @@ -4080,6 +4080,11 @@ static bool svm_cpu_has_accelerated_tpr(void)
    return false;
    }

    +static bool svm_has_high_real_mode_segbase(void)
    +{
    + return true;
    +}
    +
    static u64 svm_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
    {
    return 0;
    @@ -4353,6 +4358,7 @@ static struct kvm_x86_ops svm_x86_ops = {
    .hardware_enable = svm_hardware_enable,
    .hardware_disable = svm_hardware_disable,
    .cpu_has_accelerated_tpr = svm_cpu_has_accelerated_tpr,
    + .cpu_has_high_real_mode_segbase = svm_has_high_real_mode_segbase,

    .vcpu_create = svm_create_vcpu,
    .vcpu_free = svm_free_vcpu,
    diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
    index d29f751ea10d..c547b20e7438 100644
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -8142,6 +8142,11 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
    local_irq_enable();
    }

    +static bool vmx_has_high_real_mode_segbase(void)
    +{
    + return enable_unrestricted_guest || emulate_invalid_guest_state;
    +}
    +
    static bool vmx_mpx_supported(void)
    {
    return (vmcs_config.vmexit_ctrl & VM_EXIT_CLEAR_BNDCFGS) &&
    @@ -10299,6 +10304,7 @@ static struct kvm_x86_ops vmx_x86_ops = {
    .hardware_enable = hardware_enable,
    .hardware_disable = hardware_disable,
    .cpu_has_accelerated_tpr = report_flexpriority,
    + .cpu_has_high_real_mode_segbase = vmx_has_high_real_mode_segbase,

    .vcpu_create = vmx_create_vcpu,
    .vcpu_free = vmx_free_vcpu,
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index ce36aca2276d..c4dd64377c19 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -2836,6 +2836,17 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
    #endif
    r = 1;
    break;
    + case KVM_CAP_X86_SMM:
    + /* SMBASE is usually relocated above 1M on modern chipsets,
    + * and SMM handlers might indeed rely on 4G segment limits,
    + * so do not report SMM to be available if real mode is
    + * emulated via vm86 mode. Still, do not go to great lengths
    + * to avoid userspace's usage of the feature, because it is a
    + * fringe case that is not enabled except via specific settings
    + * of the module parameters.
    + */
    + r = kvm_x86_ops->cpu_has_high_real_mode_segbase();
    + break;
    case KVM_CAP_COALESCED_MMIO:
    r = KVM_COALESCED_MMIO_PAGE_OFFSET;
    break;
    @@ -4229,6 +4240,10 @@ static void kvm_init_msr_list(void)

    for (i = j = 0; i < ARRAY_SIZE(emulated_msrs); i++) {
    switch (emulated_msrs[i]) {
    + case MSR_IA32_SMBASE:
    + if (!kvm_x86_ops->cpu_has_high_real_mode_segbase())
    + continue;
    + break;
    default:
    break;
    }
    --
    1.8.3.1


    \
     
     \ /
      Last update: 2015-05-08 13:41    [W:2.355 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site