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

Re: [Xen-devel] [PATCH 7/8] docs: Document start_info changes in Xen 4.2.



On Wed, 2013-01-30 at 17:23 +0000, Konrad Rzeszutek Wilk wrote:
> On Tue, Jan 29, 2013 at 09:37:00AM +0000, Ian Campbell wrote:
> > On Mon, 2013-01-28 at 18:32 +0000, Konrad Rzeszutek Wilk wrote:
> > > The git commit 7a9d7646307b7c872b8dbd7546579acd3b54223d "x86/32-on-64:
> > > adjust Dom0 initial page table layout" fixes a bug in the reported
> > > value of pt_base versus what is stored in the %cr3 register. This
> > > documents this in the start of the world header note.
> > > 
> > > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> > > ---
> > >  xen/include/public/xen.h | 7 +++++++
> > >  1 file changed, 7 insertions(+)
> > > 
> > > diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
> > > index c50bbfc..1685317 100644
> > > --- a/xen/include/public/xen.h
> > > +++ b/xen/include/public/xen.h
> > > @@ -705,6 +705,13 @@ typedef struct shared_info shared_info_t;
> > >   *  8. There is guaranteed to be at least 512kB padding after the final
> > >   *     bootstrap element. If necessary, the bootstrap virtual region is
> > >   *     extended by an extra 4MB to ensure this.
> > > + *
> > > + * Note: Prior to 7a9d7646307b7c872b8dbd7546579acd3b54223d 
> > > ("x86/32-on-64:
> > > + * adjust Dom0 initial page table layout") the 3.e) contained two 
> > > different
> > > + * values with a 64-bit hypervisor and a 32-bit initial domain kernel. 
> > > The
> > > + * pt_base pointed to the L4 (setup by the hypervisor and not used by
> > > + * the guest) and the %cr3 pointed to the L3. This meant an difference of
> > > + * one page.
> > >   */
> > 
> > 7a9d7646307b7c872b8dbd7546579acd3b54223d is not a Xen revision. I think
> > you meant 25833:bb85bbccb1c9. I assume this was a bug fix, in which case
> > I would say "Prior to Xen commit xxx:yyyy ("x86/32-on...") a bug caused
> > the pt_base (3.e above) to contain ..."
> > 
> > It would be useful to explain clearly the after case too, which I
> > suppose is that on 32-on-64 the pt_base now points to what the guest
> > kernel should consider to be the base? Would it be relevant to explain
> > how to detect this situation and what to do about it?
> > 
> > The difference of one page was just an implementation artefact, rather
> > than a meaningful semantic difference? Unless it is relevant to
> > detecting the situation I would be inclined not to do it.
> 
> It can be construed either way. If you look at:
> 
>  *      e. bootstrap page tables         [pt_base, CR3 (x86)]                 
>   
> 
> It mentions _both_ sources of information - the register and the
> contents of pt_base. It could imply that both of them have the same
> value (if you read that as an enumeration of where this value is
> contained).

This comment is written from the context of a 32-bit hypervisor, where
this would be true. I think it's just become inaccurate on 32-on-64 due
to the trick we play with grafting the guest 3-level tables into a
4-level table.

>  But if you read the ',' as an 'or', then it is not a
> semantic diference as they both could contain drastically diferent
> values.
> 
> Implementation wise, we get is that the value that CR3 is different than what:
>     unsigned long pt_base;      /* VIRTUAL address of page directory.  */   
> 
> has. In other words, the pt_base is suspect and should be carefully
> compared to the %cr3. If they are different, then the user should _NOT_
> touch the pages in between pt_base and %cr3 and mark them as unusable.
> 
> > 
> > It should also be made clearer that this affected only 32-on-64 dom0
> > kernels and not 32-on-64 domU or 64-bit kernels of any colour.
> 
> Right. How about this:
> 
> commit 489682893ffc8bbbbb12ee820defac17cce762d0
> Author: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> Date:   Mon Jan 28 13:20:29 2013 -0500
> 
>     docs: Document start_info changes in Xen 4.2.
>     
>     The  25833:bb85bbccb1c9. "x86/32-on-64: adjust Dom0 initial page table 
> layout"
>     fixes a bug in the reported value of pt_base versus what is stored in
>     the %cr3 register. This documents this in the start of the world header 
> note.
>     
>     Also make it crystal clear that pt_base == %cr3.
>     
>     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> 
> diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
> index c50bbfc..3f51cd6 100644
> --- a/xen/include/public/xen.h
> +++ b/xen/include/public/xen.h
> @@ -693,7 +693,7 @@ typedef struct shared_info shared_info_t;
>   *      c. list of allocated page frames [mfn_list, nr_pages]
>   *         (unless relocated due to XEN_ELFNOTE_INIT_P2M)
>   *      d. start_info_t structure        [register ESI (x86)]
> - *      e. bootstrap page tables         [pt_base, CR3 (x86)]
> + *      e. bootstrap page tables         [pt_base and CR3 (x86)]
>   *      f. bootstrap stack               [register ESP (x86)]
>   *  4. Bootstrap elements are packed together, but each is 4kB-aligned.
>   *  5. The initial ram disk may be omitted.
> @@ -705,6 +705,15 @@ typedef struct shared_info shared_info_t;
>   *  8. There is guaranteed to be at least 512kB padding after the final
>   *     bootstrap element. If necessary, the bootstrap virtual region is
>   *     extended by an extra 4MB to ensure this.
> + *
> + * Note: Prior to 25833:bb85bbccb1c9. ("x86/32-on-64 adjust Dom0 initial page
> + * table layout") a bug caused the pt_base (3.e above) to contain a different
> + * value than the CR3 register.

I don't think this is right, the bug was that the L4 table was in guest
space at all and that pt_base pointed to it, wasn't it? The fix was to
remove the L4 from guest space altogether,

Remember that this is a 32-on-64 guest so the 64-bit hypervisor should
be providing the illusion of running on the 32-bit hypervisor, at least
so far as it is able (and perhaps the guest reading %cr3 direct is one
of those places where it can't)

Perhaps Jan can correct our misconceptions on this one.

>  This only manifested itself on 32-on-64 dom0
> + * kernels and not 32-on-64 domU or 64-bit kernels of any colour. The
> + * pt_base pointed to the L4 (setup by the hypervisor and not used by
> + * the guest) and the %cr3 pointed to the L3.

That sounds backwards, if actual %cr3 pointed to L3 things wouldn't work
-- the processor is in long mode (on a compat segment) and so needs 4
level pages.

>  This meant an difference of
> + * one page. The guest should _NOT_ use the pages from pt_base to %cr3
> + * for anything and mark them as reserved/unused.
>   */
>  
>  #define MAX_GUEST_CMDLINE 1024



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