From mboxrd@z Thu Jan 1 00:00:00 1970 From: Qing He Subject: [PATCH 09/16] vmx: nest: shadow controls Date: Wed, 8 Sep 2010 23:22:17 +0800 Message-ID: <1283959344-3837-10-git-send-email-qing.he@intel.com> References: <1283959344-3837-1-git-send-email-qing.he@intel.com> Return-path: In-Reply-To: <1283959344-3837-1-git-send-email-qing.he@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: Qing He List-Id: xen-devel@lists.xenproject.org automatically compute controls according to current mode Signed-off-by: Qing He Signed-off-by: Eddie Dong --- diff -r 625f74a9bb36 xen/arch/x86/hvm/vmx/nest.c --- a/xen/arch/x86/hvm/vmx/nest.c Wed Sep 08 22:04:16 2010 +0800 +++ b/xen/arch/x86/hvm/vmx/nest.c Wed Sep 08 22:07:15 2010 +0800 @@ -663,3 +663,35 @@ { return vmx_nest_handle_vmresume(regs); } + +static void set_shadow_control(struct vmx_nest_struct *nest, + unsigned int field, + u32 host_value) +{ + u32 value; + + value = (u32) __get_vvmcs(nest->vvmcs, field) | host_value; + __vmwrite(field, value); +} + +void vmx_nest_update_exec_control(struct vcpu *v, unsigned long value) +{ + struct vmx_nest_struct *nest = &v->arch.hvm_vmx.nest; + + set_shadow_control(nest, CPU_BASED_VM_EXEC_CONTROL, value); +} + +void vmx_nest_update_secondary_exec_control(struct vcpu *v, + unsigned long value) +{ + struct vmx_nest_struct *nest = &v->arch.hvm_vmx.nest; + + set_shadow_control(nest, SECONDARY_VM_EXEC_CONTROL, value); +} + +void vmx_nest_update_exception_bitmap(struct vcpu *v, unsigned long value) +{ + struct vmx_nest_struct *nest = &v->arch.hvm_vmx.nest; + + set_shadow_control(nest, EXCEPTION_BITMAP, value); +} diff -r 625f74a9bb36 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Wed Sep 08 22:04:16 2010 +0800 +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed Sep 08 22:07:15 2010 +0800 @@ -387,18 +387,28 @@ void vmx_update_cpu_exec_control(struct vcpu *v) { - __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control); + if ( v->arch.hvm_vcpu.in_nesting ) + vmx_nest_update_exec_control(v, v->arch.hvm_vmx.exec_control); + else + __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control); } void vmx_update_secondary_exec_control(struct vcpu *v) { - __vmwrite(SECONDARY_VM_EXEC_CONTROL, - v->arch.hvm_vmx.secondary_exec_control); + if ( v->arch.hvm_vcpu.in_nesting ) + vmx_nest_update_secondary_exec_control(v, + v->arch.hvm_vmx.secondary_exec_control); + else + __vmwrite(SECONDARY_VM_EXEC_CONTROL, + v->arch.hvm_vmx.secondary_exec_control); } void vmx_update_exception_bitmap(struct vcpu *v) { - __vmwrite(EXCEPTION_BITMAP, v->arch.hvm_vmx.exception_bitmap); + if ( v->arch.hvm_vcpu.in_nesting ) + vmx_nest_update_exception_bitmap(v, v->arch.hvm_vmx.exception_bitmap); + else + __vmwrite(EXCEPTION_BITMAP, v->arch.hvm_vmx.exception_bitmap); } static int vmx_guest_x86_mode(struct vcpu *v) diff -r 625f74a9bb36 xen/include/asm-x86/hvm/vmx/nest.h --- a/xen/include/asm-x86/hvm/vmx/nest.h Wed Sep 08 22:04:16 2010 +0800 +++ b/xen/include/asm-x86/hvm/vmx/nest.h Wed Sep 08 22:07:15 2010 +0800 @@ -69,4 +69,9 @@ int vmx_nest_handle_vmresume(struct cpu_user_regs *regs); int vmx_nest_handle_vmlaunch(struct cpu_user_regs *regs); +void vmx_nest_update_exec_control(struct vcpu *v, unsigned long value); +void vmx_nest_update_secondary_exec_control(struct vcpu *v, + unsigned long value); +void vmx_nest_update_exception_bitmap(struct vcpu *v, unsigned long value); + #endif /* __ASM_X86_HVM_NEST_H__ */