[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 24/29] xen/x86: allow HVM guests to use hypercalls to bring up vCPUs
El 29/09/15 a les 18.20, Jan Beulich ha escrit: >>>> On 29.09.15 at 18:01, <roger.pau@xxxxxxxxxx> wrote: >> El 29/09/15 a les 17.29, Jan Beulich ha escrit: >>>>>> On 29.09.15 at 16:01, <roger.pau@xxxxxxxxxx> wrote: >>>> Ok thanks, so we seem to have a consensus. Before posting a new >>>> revision, does the following vcpu_hvm_context look fine to both of you: >>>> >>>> struct vcpu_hvm_x86_32 { >>>> uint32_t eax; >>>> uint32_t ecx; >>>> uint32_t edx; >>>> uint32_t ebx; >>>> uint32_t esp; >>>> uint32_t ebp; >>>> uint32_t esi; >>>> uint32_t edi; >>>> uint32_t eip; >>>> uint32_t eflags; >>>> >>>> uint32_t cr0; >>>> uint32_t cr3; >>>> uint32_t cr4; >>>> >>>> /* >>>> * EFER should only be used to set the NXE bit (if required) >>>> * when starting a vCPU in 32bit mode with paging enabled. >>>> */ >>>> uint64_t efer; >>>> >>>> uint32_t cs_base; >>>> uint32_t ds_base; >>>> uint32_t ss_base; >>>> uint32_t es_base; >>>> uint32_t tr_base; >>>> uint32_t cs_limit; >>>> uint32_t ds_limit; >>>> uint32_t ss_limit; >>>> uint32_t es_limit; >>>> uint32_t tr_limit; >>>> uint16_t cs_ar; >>>> uint16_t ds_ar; >>>> uint16_t ss_ar; >>>> uint16_t es_ar; >>>> uint16_t tr_ar; >>>> }; >>>> >>>> struct vcpu_hvm_x86_64 { >>>> uint64_t rax; >>>> uint64_t rcx; >>>> uint64_t rdx; >>>> uint64_t rbx; >>>> uint64_t rsp; >>>> uint64_t rbp; >>>> uint64_t rsi; >>>> uint64_t rdi; >>>> uint64_t rip; >>>> uint64_t rflags; >>>> >>>> uint64_t cr0; >>>> uint64_t cr3; >>>> uint64_t cr4; >>>> uint64_t efer; >>>> >>>> /* >>>> * Setting the CS attributes field is allowed in order to >>>> * start in compatibility mode. >>>> */ >>> >>> Hmm, as said before it would seem to me that this would better >>> (or also) be allowed to work by specifying a suitable 32-bit register >>> state. Remember that in compatibility mode base and limit matter >>> again, and I think you also can't start with a nul SS. >> >> Yes, I should add back all the registers here, so it looks like: >> >> uint32_t cs_base; >> uint32_t ds_base; >> uint32_t ss_base; >> uint32_t es_base; >> uint32_t cs_limit; >> uint32_t ds_limit; >> uint32_t ss_limit; >> uint32_t es_limit; >> uint16_t cs_ar; >> uint16_t ds_ar; >> uint16_t ss_ar; >> uint16_t es_ar; > > Or specify that compat mode entry is via using 32-bit register state. Yes, that should also work. If that's the preference then I guess we can remove all the selectors stuff from the 64bit structure. >>>> uint16_t cs_ar; >>>> }; >>> >>> No tr_* here? >> >> Is it necessary? for long or compatibility mode tr is always going to be: >> >> tr_base = 0; >> tr_limit = 0x67; >> tr_ar = 0x8b; >> >> The attributes field is always going to be 0x8b for compat or long mode, >> the base and the limit might be different, but the guest should change >> that by itself. > > Please explain why you have it in the 32-bit register state, but not > in the 64-bit one. Because the 32bit register state can be used to start a CPU in real mode, and the TS type in real mode is different from the ones in protected mode and long mode. > I said before that we should aim at being as > consistent as possible. (And btw I do not think that tr_base being > zero makes any sense.) We don't actually have a TSS anywhere, does it really matter if base is set to 0? In fact allowing the user to set tr_base and tr_limit is kind of pointless, it's impossible to load a TSS from this interface. So AFAICT what really matters is tr_ar only. >>> Also, what are the selector values going to be? Do you intend to >>> pass zero there? >> >> Do you mean the visible part of the selectors? With the current >> implementation the value of the "sel" field in the segment_register >> struct is left uninitialized, so it's undefined. I could set them to 0, >> but what's the point in doing it? > > We should never leave things uninitialized; leaving things > unspecified may be okay, but I don't see why we shouldn't > spell out what we intend to do, unless we foresee it to change > later on. Ack, I don't see a problem in setting them to 0, but anyway there's no GDT loaded, so the selector value itself is pointless (the cached part is what really matters). Roger. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |