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

Re: [Xen-devel] [RFC PATCH 1/3] AMD IOMMU: p2m table changes



Tim,
On Monday 04 April 2011 12:59:40 Tim Deegan wrote:
> > AMD IOMMU hardware uses bit 9 - bit 11 to encode lower page levels.
> > Therefore, p2m type bits has to be shifted from bit 9 to bit 12 in p2m
> > flags.
>
> OK, but you need to add a comment explaining it, so the next person
> doesn't try to reuse those three bits.
>
> > Also, bit 52
> > to bit 60 cannot be non-zero for iommu pte. So, I have to swap the
> > definition of p2m_ram_rw with p2m_invalid.
>
> That _definitely_ needs a comment explianing why it's so.
OK, I will add that. Thanks for point this out.

> Also, what's the failure mode if the guest tries to access other types
> of memory via the IOMMU?  In the current code the entries will not be
> present in the IOMMU table; after this change they'll be present but
> malformed.  Is that equivalent?
AMD IOMMU hardware will generate IO page faults when guest try to access these 
pages with bit 52 - bit 58 in pte are non-zore. They are reserved bits for 
now. I could not clear present bits for the ptes since this might break other 
p2m functionalities but I should be no problem to clear read/write bits for 
those entries.
Thanks,
Wei
> Cheers,
>
> Tim.
>
> > This patch is tested OK with both SPT and NPT
> > guests.
> >
> > Signed-off-by: Wei Wang <wei.wang2@xxxxxxx>
> >
> > diff -r 12f7c7ac7f19 -r 6827fd35cf58 xen/arch/x86/mm/p2m.c
> > --- a/xen/arch/x86/mm/p2m.c Fri Mar 18 17:15:52 2011 +0000
> > +++ b/xen/arch/x86/mm/p2m.c Thu Mar 24 16:18:28 2011 +0100
> > @@ -79,7 +79,7 @@
> >  {
> >      unsigned long flags;
> >  #ifdef __x86_64__
> > -    flags = (unsigned long)(t & 0x3fff) << 9;
> > +    flags = (unsigned long)(t & 0x3fff) << 12;
> >  #else
> >      flags = (t & 0x7UL) << 9;
> >  #endif
> > @@ -1760,6 +1760,9 @@
> >              p2mt = p2m_flags_to_type(l1e_get_flags(l1e));
> >              ASSERT(l1e_get_pfn(l1e) != INVALID_MFN ||
> > !p2m_is_ram(p2mt));
> >
> > +            if ( l1e.l1 == 0 )
> > +                p2mt = p2m_invalid;
> > +
> >              if ( p2m_flags_to_type(l1e_get_flags(l1e))
> >                   == p2m_populate_on_demand )
> >              {
> > diff -r 12f7c7ac7f19 -r 6827fd35cf58 xen/include/asm-x86/p2m.h
> > --- a/xen/include/asm-x86/p2m.h     Fri Mar 18 17:15:52 2011 +0000
> > +++ b/xen/include/asm-x86/p2m.h     Thu Mar 24 16:18:28 2011 +0100
> > @@ -64,8 +64,8 @@
> >   * 64-bit Xen.
> >   */
> >  typedef enum {
> > -    p2m_invalid = 0,            /* Nothing mapped here */
> > -    p2m_ram_rw = 1,             /* Normal read/write guest RAM */
> > +    p2m_invalid = 1,            /* Nothing mapped here */
> > +    p2m_ram_rw = 0,             /* Normal read/write guest RAM */
> >      p2m_ram_logdirty = 2,       /* Temporarily read-only for log-dirty
> > */ p2m_ram_ro = 3,             /* Read-only; writes are silently dropped
> > */ p2m_mmio_dm = 4,            /* Reads and write go to the device model
> > */ @@ -312,7 +312,7 @@
> >  {
> >      /* Type is stored in the "available" bits */
> >  #ifdef __x86_64__
> > -    return (flags >> 9) & 0x3fff;
> > +    return (flags >> 12) & 0x3fff;
> >  #else
> >      return (flags >> 9) & 0x7;
> >  #endif
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@xxxxxxxxxxxxxxxxxxx
> > http://lists.xensource.com/xen-devel




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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