[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: xl/xm save -c fails - set_vcpucontext EOPNOTSUPP (was Re: [Xen-devel] xl save -c issues with Windows 7 Ultimate)
On Tue, 2011-05-10 at 16:50 +0100, Shriram Rajagopalan wrote: > On Tue, May 10, 2011 at 10:02 AM, Jan Beulich <JBeulich@xxxxxxxxxx> > wrote: > >>> On 10.05.11 at 16:52, Shriram Rajagopalan > <rshriram@xxxxxxxxx> wrote: > > On Tue, May 10, 2011 at 3:41 AM, Ian Campbell > <Ian.Campbell@xxxxxxxxxx>wrote: > > > >> The most plausible looking EOPNOTSUPP from that code is in > >> xen/arch/x86/domain.c:arch_set_info_guest() but that is on > a PV only > >> path. > >> > >> And that rings with the pv guests I am using. It makes > perfect sense, > > looking > > at that function and especially at the code that returns > EOPNOTSUPP (the > > only > > place in the entire file). > > else > > { > > bool_t fail = v->arch.pv_vcpu.ctrlreg[3] != > c(ctrlreg[3]); > > > > #ifdef CONFIG_X86_64 > > fail |= v->arch.pv_vcpu.ctrlreg[1] != c(ctrlreg[1]); > > #endif > > > > for ( i = 0; i < > ARRAY_SIZE(v->arch.pv_vcpu.gdt_frames); ++i ) > > fail |= v->arch.pv_vcpu.gdt_frames[i] != > c(gdt_frames[i]); > > fail |= v->arch.pv_vcpu.gdt_ents != c(gdt_ents); > > > > fail |= v->arch.pv_vcpu.ldt_base != c(ldt_base); > > fail |= v->arch.pv_vcpu.ldt_ents != c(ldt_ents); > > > > if ( fail ) > > return -EOPNOTSUPP; > > } > > > > This change was introduced by c/s > > changeset: 23142:f5e8d152a565 > > user: Jan Beulich <jbeulich@xxxxxxxxxx> > > date: Tue Apr 05 13:01:25 2011 +0100 > > x86: split struct vcpu > > > > I think I am missing something really obvious in this piece > of code. The > > xc_domain_resume code tries to modify the return value of > shutdown hypercall > > (i.e eax register is set to 1) and this code doesnt seem to > check those > > registers. > > > Correct - the code here checks only for values where the logic > needed to support changing the on an already initialized vCPU > isn't > implemented. Previously, actual vCPU state and what was > tracked > in struct vcpu could get out of sync in this case, potentially > confusing things further down (including possible security > issues). > > You'll want to figure out which part(s) actually differ, and > why. > Only then we'll be able to tell whether mentioned c/s > introduced > false positives. > > Bit confused. If I understand correctly, this piece of code checks new > values > of certain registers against old ones, for an already initialized > VCPU. And AFAIT, > it is checking the gdts, ldts & control registers. The > xc_domain_resume code just > changes one general purpose register eax. basically, > > get_vcpucontext() > set_field(eax, 1) //to indicate SUSPEND_CANCEL > set_vcpucontext() > > I dont understand what you mean by "which parts actually differ & > why". Either get_vcpucontext is returning something "odd" or set_vcpucontext is being overzealous in what it checks (the "false positives" Jan refers too) > And just a trivial question: > is the hypervisor binary always compiled to a 32-bit elf? somehow, the > symbols file xen-syms-* is getting compiled to 64 bit ELF binary while > the xen binary is getting compiled to 32-bit binary. The hypervisor binary (32 or 64 bit) is always wrapped up as a 32 bit ELF, see the use of xen/arch/x86/boot/mkelf32.c. Something to do with keeping a bootloader happy, I think... Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |