[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/3] x86/vmx: Don't self-recurse in vmx_update_guest_cr()
An update to CR4 following a CR0 update can be done easily by falling through into the CR4 case. This avoids unnecessary passes through vmx_vmcs_{enter,exit}() and unnecessary stack usage (as the compiler cannot optimise this use to a tailcall). Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Jun Nakajima <jun.nakajima@xxxxxxxxx> CC: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmx.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 61047e0..5b943d4 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1627,29 +1627,8 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) v->arch.hvm_vcpu.hw_cr[0] = v->arch.hvm_vcpu.guest_cr[0] | hw_cr0_mask; __vmwrite(GUEST_CR0, v->arch.hvm_vcpu.hw_cr[0]); - - /* Changing CR0 can change some bits in real CR4. */ - vmx_update_guest_cr(v, 4); - break; } - - case 2: - /* CR2 is updated in exit stub. */ - break; - - case 3: - if ( paging_mode_hap(v->domain) ) - { - if ( !hvm_paging_enabled(v) && !vmx_unrestricted_guest(v) ) - v->arch.hvm_vcpu.hw_cr[3] = - v->domain->arch.hvm_domain.params[HVM_PARAM_IDENT_PT]; - vmx_load_pdptrs(v); - } - - __vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr[3]); - hvm_asid_flush_vcpu(v); - break; - + /* Fallthrough: Changing CR0 can change some bits in real CR4. */ case 4: v->arch.hvm_vcpu.hw_cr[4] = HVM_CR4_HOST_MASK; if ( paging_mode_hap(v->domain) ) @@ -1681,6 +1660,23 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr) __vmwrite(GUEST_CR4, v->arch.hvm_vcpu.hw_cr[4]); break; + case 2: + /* CR2 is updated in exit stub. */ + break; + + case 3: + if ( paging_mode_hap(v->domain) ) + { + if ( !hvm_paging_enabled(v) && !vmx_unrestricted_guest(v) ) + v->arch.hvm_vcpu.hw_cr[3] = + v->domain->arch.hvm_domain.params[HVM_PARAM_IDENT_PT]; + vmx_load_pdptrs(v); + } + + __vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr[3]); + hvm_asid_flush_vcpu(v); + break; + default: BUG(); } -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |