[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.