From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: Re: xl/xm save -c fails - set_vcpucontext EOPNOTSUPP (was Re: xl save -c issues with Windows 7 Ultimate) Date: Mon, 16 May 2011 13:02:42 +0100 Message-ID: <4DD12E8202000078000417CD@vpn.id2.novell.com> References: <1305016915.26692.261.camel@zakaz.uk.xensource.com> <4DC96FA50200007800040C69@vpn.id2.novell.com> <4DC97E000200007800040CFF@vpn.id2.novell.com> <4DCA5B3A0200007800040EC4@vpn.id2.novell.com> <4DCD1D4702000078000413D0@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: 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: rshriram@cs.ubc.ca Cc: "xen-devel@lists.xensource.com" , Keir Fraser , Ian Campbell List-Id: xen-devel@lists.xenproject.org >>> On 15.05.11 at 00:15, Shriram Rajagopalan wrote: > This one works only for 64-bit domUs. 32bit domU (on 64bit dom0) fails = with > usual EOPNOTSUPP. Next (hopefully final) try below. Jan --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -856,6 +856,15 @@ int arch_set_info_guest( goto out; } =20 + init_int80_direct_trap(v); + + /* IOPL privileges are virtualised. */ + v->arch.pv_vcpu.iopl =3D (v->arch.user_regs.eflags >> 12) & 3; + v->arch.user_regs.eflags &=3D ~X86_EFLAGS_IOPL; + + /* Ensure real hardware interrupts are enabled. */ + v->arch.user_regs.eflags |=3D X86_EFLAGS_IF; + if ( !v->is_initialised ) { v->arch.pv_vcpu.ldt_base =3D c(ldt_base); @@ -863,11 +872,27 @@ int arch_set_info_guest( } else { - bool_t fail =3D v->arch.pv_vcpu.ctrlreg[3] !=3D c(ctrlreg[3]); + unsigned long pfn =3D pagetable_get_pfn(v->arch.guest_table); + bool_t fail; =20 + if ( !compat ) + { + fail =3D xen_pfn_to_cr3(pfn) !=3D c.nat->ctrlreg[3]; #ifdef CONFIG_X86_64 - fail |=3D v->arch.pv_vcpu.ctrlreg[1] !=3D c(ctrlreg[1]); + if ( pagetable_is_null(v->arch.guest_table_user) ) + fail |=3D c.nat->ctrlreg[1] || !(flags & VGCF_in_kernel); + else + { + pfn =3D pagetable_get_pfn(v->arch.guest_table_user); + fail |=3D xen_pfn_to_cr3(pfn) !=3D c.nat->ctrlreg[1]; + } + } else { + l4_pgentry_t *l4tab =3D __va(pfn_to_paddr(pfn)); + + pfn =3D l4e_get_pfn(*l4tab); + fail =3D compat_pfn_to_cr3(pfn) !=3D c.cmp->ctrlreg[3]; #endif + } =20 for ( i =3D 0; i < ARRAY_SIZE(v->arch.pv_vcpu.gdt_frames); ++i ) fail |=3D v->arch.pv_vcpu.gdt_frames[i] !=3D c(gdt_frames[i]);= @@ -907,15 +932,6 @@ int arch_set_info_guest( v->arch.pv_vcpu.ctrlreg[0] &=3D X86_CR0_TS; v->arch.pv_vcpu.ctrlreg[0] |=3D read_cr0() & ~X86_CR0_TS; =20 - init_int80_direct_trap(v); - - /* IOPL privileges are virtualised. */ - v->arch.pv_vcpu.iopl =3D (v->arch.user_regs.eflags >> 12) & 3; - v->arch.user_regs.eflags &=3D ~X86_EFLAGS_IOPL; - - /* Ensure real hardware interrupts are enabled. */ - v->arch.user_regs.eflags |=3D X86_EFLAGS_IF; - cr4 =3D v->arch.pv_vcpu.ctrlreg[4]; v->arch.pv_vcpu.ctrlreg[4] =3D cr4 ? pv_guest_cr4_fixup(v, cr4) : real_cr4_to_pv_guest_cr4(mmu_cr4_features);