|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |