From: "Jan Beulich" Subject: [PATCH] remove CSTAR save/restore on VMX Date: Mon, 14 May 2007 17:43:30 +0200 Message-ID: <46489FC2.76E4.0078.0@novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline 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 List-Id: xen-devel@lists.xenproject.org CSTAR is an unused MSR in 64-bit mode on Intel's EM64T, hence there's no = need to save/restore this MSR during context switches. Mimic real hardware by retaining the value written for eventual guest OS reads. (Patch won't apply without the EFER adjustment patch.) Signed-off-by: Jan Beulich Index: 2007-05-14/xen/arch/x86/hvm/vmx/vmx.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2007-05-14.orig/xen/arch/x86/hvm/vmx/vmx.c 2007-05-14 14:28:19.0000000= 00 +0200 +++ 2007-05-14/xen/arch/x86/hvm/vmx/vmx.c 2007-05-14 14:33:24.0000000= 00 +0200 @@ -88,8 +88,7 @@ static DEFINE_PER_CPU(struct vmx_msr_sta =20 static u32 msr_index[VMX_MSR_COUNT] =3D { - MSR_LSTAR, MSR_STAR, MSR_CSTAR, - MSR_SYSCALL_MASK + MSR_LSTAR, MSR_STAR, MSR_SYSCALL_MASK }; =20 static void vmx_save_host_msrs(void) @@ -147,7 +146,7 @@ static inline int long_mode_do_msr_read( break; =20 case MSR_CSTAR: - msr_content =3D guest_msr_state->msrs[VMX_INDEX_MSR_CSTAR]; + msr_content =3D v->arch.hvm_vmx.cstar; break; =20 case MSR_SYSCALL_MASK: @@ -250,7 +249,8 @@ static inline int long_mode_do_msr_write case MSR_CSTAR: if ( !is_canonical_address(msr_content) ) goto uncanonical_address; - WRITE_MSR(CSTAR); + v->arch.hvm_vmx.cstar =3D msr_content; + break; =20 case MSR_SYSCALL_MASK: WRITE_MSR(SYSCALL_MASK); @@ -730,12 +730,12 @@ static void vmx_save_cpu_state(struct vc unsigned long guest_flags =3D guest_state->flags; =20 data->shadow_gs =3D v->arch.hvm_vmx.shadow_gs; + data->msr_cstar =3D v->arch.hvm_vmx.cstar; =20 /* save msrs */ data->msr_flags =3D guest_flags; data->msr_lstar =3D guest_state->msrs[VMX_INDEX_MSR_LSTAR]; data->msr_star =3D guest_state->msrs[VMX_INDEX_MSR_STAR]; - data->msr_cstar =3D guest_state->msrs[VMX_INDEX_MSR_CSTAR]; data->msr_syscall_mask =3D guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MAS= K]; #endif =20 @@ -755,9 +755,9 @@ static void vmx_load_cpu_state(struct vc guest_state->flags =3D data->msr_flags; guest_state->msrs[VMX_INDEX_MSR_LSTAR] =3D data->msr_lstar; guest_state->msrs[VMX_INDEX_MSR_STAR] =3D data->msr_star; - guest_state->msrs[VMX_INDEX_MSR_CSTAR] =3D data->msr_cstar; guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] =3D data->msr_syscall_ma= sk; =20 + v->arch.hvm_vmx.cstar =3D data->msr_cstar; v->arch.hvm_vmx.shadow_gs =3D data->shadow_gs; #endif =20 Index: 2007-05-14/xen/include/asm-x86/hvm/vmx/vmcs.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2007-05-14.orig/xen/include/asm-x86/hvm/vmx/vmcs.h 2007-05-14 = 14:28:19.000000000 +0200 +++ 2007-05-14/xen/include/asm-x86/hvm/vmx/vmcs.h 2007-05-14 = 14:33:24.000000000 +0200 @@ -37,7 +37,6 @@ struct vmcs_struct { enum { VMX_INDEX_MSR_LSTAR =3D 0, VMX_INDEX_MSR_STAR, - VMX_INDEX_MSR_CSTAR, VMX_INDEX_MSR_SYSCALL_MASK, =20 VMX_MSR_COUNT @@ -77,6 +76,7 @@ struct arch_vmx_struct { #ifdef __x86_64__ struct vmx_msr_state msr_state; unsigned long shadow_gs; + unsigned long cstar; #endif unsigned long efer; unsigned long vmxassist_enabled:1;