From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH] KVM: nVMX: Add support for activity state HLT Date: Thu, 05 Dec 2013 10:52:08 +0100 Message-ID: <52A04CC8.3090007@redhat.com> References: <529EE0BE.4050501@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Gleb Natapov , kvm To: Jan Kiszka Return-path: Received: from mail-ea0-f174.google.com ([209.85.215.174]:49361 "EHLO mail-ea0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751926Ab3LEJwL (ORCPT ); Thu, 5 Dec 2013 04:52:11 -0500 Received: by mail-ea0-f174.google.com with SMTP id b10so11038124eae.5 for ; Thu, 05 Dec 2013 01:52:10 -0800 (PST) In-Reply-To: <529EE0BE.4050501@siemens.com> Sender: kvm-owner@vger.kernel.org List-ID: Il 04/12/2013 08:58, Jan Kiszka ha scritto: > We can easily emulate the HLT activity state for L1: If it decides that > L2 shall be halted on entry, just invoke the normal emulation of halt > after switching to L2. We do not depend on specific host features to > provide this, so we can expose the capability unconditionally. > > Signed-off-by: Jan Kiszka > --- > > Jailhouse would like to use this. Experimental code works fine so far, > both on patched KVM and real HW. Nice. :) Do you have a testcase for kvm-unit-tests? Paolo > arch/x86/include/asm/vmx.h | 1 + > arch/x86/kvm/vmx.c | 7 ++++++- > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h > index 966502d..2067264 100644 > --- a/arch/x86/include/asm/vmx.h > +++ b/arch/x86/include/asm/vmx.h > @@ -100,6 +100,7 @@ > > #define VMX_MISC_PREEMPTION_TIMER_RATE_MASK 0x0000001f > #define VMX_MISC_SAVE_EFER_LMA 0x00000020 > +#define VMX_MISC_ACTIVITY_HLT 0x00000040 > > /* VMCS Encodings */ > enum vmcs_field { > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index b2fe1c2..00faf1f 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -2279,6 +2279,7 @@ static __init void nested_vmx_setup_ctls_msrs(void) > rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); > nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK | > VMX_MISC_SAVE_EFER_LMA; > + nested_vmx_misc_low |= VMX_MISC_ACTIVITY_HLT; > nested_vmx_misc_high = 0; > } > > @@ -7882,7 +7883,8 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) > return 1; > } > > - if (vmcs12->guest_activity_state != GUEST_ACTIVITY_ACTIVE) { > + if (vmcs12->guest_activity_state != GUEST_ACTIVITY_ACTIVE && > + vmcs12->guest_activity_state != GUEST_ACTIVITY_HLT) { > nested_vmx_failValid(vcpu, VMXERR_ENTRY_INVALID_CONTROL_FIELD); > return 1; > } > @@ -8011,6 +8013,9 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) > > prepare_vmcs02(vcpu, vmcs12); > > + if (vmcs12->guest_activity_state == GUEST_ACTIVITY_HLT) > + return kvm_emulate_halt(vcpu); > + > /* > * Note no nested_vmx_succeed or nested_vmx_fail here. At this point > * we are no longer running L1, and VMLAUNCH/VMRESUME has not yet >