From: Keir Fraser Date: Mon, 18 Feb 2008 21:26:57 +0000 (+0000) Subject: hvm: Better gating of hvm_get_segment_register() in __hvm_copy(). X-Git-Tag: 3.3.0-rc1~329^2 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=26586938401efcfe09fd231ed00656b80489623a;p=xen.git hvm: Better gating of hvm_get_segment_register() in __hvm_copy(). Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 92a63bf325..d77fb6a402 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1393,20 +1393,18 @@ static enum hvm_copy_result __hvm_copy( int count, todo; uint32_t pfec = PFEC_page_present; - if ( virt ) + /* + * We cannot use hvm_get_segment_register() while executing in + * vmx_realmode() as segment register state is cached. Furthermore, + * VMREADs on every data access hurts emulation performance. + * Hence we do not gather extra PFEC flags if CR0.PG == 0. + */ + if ( virt && (curr->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG) ) { - /* - * We cannot use hvm_get_segment_register() while executing in - * vmx_realmode() as segment register state is cached. Furthermore, - * VMREADs on every data access hurts emulation performance. - */ - if ( !curr->arch.hvm_vmx.vmxemul ) - { - struct segment_register sreg; - hvm_get_segment_register(curr, x86_seg_ss, &sreg); - if ( sreg.attr.fields.dpl == 3 ) - pfec |= PFEC_user_mode; - } + struct segment_register sreg; + hvm_get_segment_register(curr, x86_seg_ss, &sreg); + if ( sreg.attr.fields.dpl == 3 ) + pfec |= PFEC_user_mode; if ( dir ) pfec |= PFEC_write_access;