[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 09/18] PVH xen: Support privileged op emulation for PVH



>>> On 27.06.13 at 00:41, Mukesh Rathor <mukesh.rathor@xxxxxxxxxx> wrote:
> On Tue, 25 Jun 2013 10:36:41 +0100
> "Jan Beulich" <JBeulich@xxxxxxxx> wrote:
> 
>> >>> On 25.06.13 at 02:01, Mukesh Rathor <mukesh.rathor@xxxxxxxxxx>
>> >>> wrote:
>> > @@ -1524,6 +1528,49 @@ static int read_descriptor(unsigned int sel,
>> > --- a/xen/include/asm-x86/system.h
>> > +++ b/xen/include/asm-x86/system.h
>> > @@ -4,10 +4,20 @@
>> >  #include <xen/lib.h>
>> >  #include <xen/bitops.h>
>> >  
>> > -#define read_segment_register(vcpu, regs, name)                 \
>> > -({  u16 __sel;                                                  \
>> > -    asm volatile ( "movw %%" STR(name) ",%0" : "=r" (__sel) );  \
>> > -    __sel;                                                      \
>> > +/*
>> > + * We need vcpu because during context switch, going from PVH to
>> > PV,
>> > + * in save_segments(), current has been updated to next, and no
>> > longer pointing
>> > + * to the PVH.
>> > + */
>> 
>> This is bogus - you shouldn't need any of the {save,load}_segment()
>> machinery for PVH, and hence this is not a valid reason for adding a
>> vcpu parameter here.
> 
> Ok, lets revisit this again since it's been few months already: 
> 
> read_segment_register() is called from few places for PVH, and for PVH
> it needs to read the value from regs. So it needs to be modified to check
> for PVH. Originally, I had started with checking for is_pvh_vcpu(current), 
> but that failed quickly because of the context switch call chain:
> 
> __context_switch -> ctxt_switch_from --> save_segments -> 
> read_segment_register
> 
> In this path, going from PV to PVH, the intention is to save segments for
> PV, and since current has already been updated to point to PVH, the check
> for current is not correct. Hence, the need for vcpu parameter. I will
> enhance my comments in the macro prolog in the next patch version.

No. I already said that {save,load}_segments() ought to be
skipped for PVH, as what it does is already done by VMRESUME/
#VMEXIT. And the function is being passed a vCPU pointer, so
simply making the single call to save_segments() conditional on
is_pv_vcpu(), and converting the !is_hvm_vcpu() around the
call to load_LDT() and load_segments() to is_pv_vcpu() (provided
the LDT handling isn't needed on the same basis) should eliminate
that need.

Furthermore - the reading from struct cpu_user_regs continues
to be bogus (read: at least a latent bug) as long as you don't
always save the selector registers, which you now validly don't
do anymore. You should be consulting the VMCS instead, i.e. go
through hvm_get_segment_register().

Whether a more lightweight variant reading just the selector is
on order I can't immediately tell.

Jan


_______________________________________________
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®.