xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Dump IOMMU p2m table
@ 2012-08-14 19:55 Santosh Jodh
  2012-08-15  8:54 ` Jan Beulich
  0 siblings, 1 reply; 13+ messages in thread
From: Santosh Jodh @ 2012-08-14 19:55 UTC (permalink / raw)
  To: xen-devel; +Cc: wei.wang2, tim, xiantao.zhang

New key handler 'o' to dump the IOMMU p2m table for each domain.
Skips dumping table for domain0.
Intel and AMD specific iommu_ops handler for dumping p2m table.

Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>

diff -r dc56a9defa30 -r 5357dccf4ba3 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Tue Aug 14 12:54:55 2012 -0700
@@ -22,6 +22,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/paging.h>
+#include <xen/softirq.h>
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
@@ -512,6 +513,72 @@ static int amd_iommu_group_id(u16 seg, u
 
 #include <asm/io_apic.h>
 
+static void amd_dump_p2m_table_level(struct page_info* pg, int level, 
+                                     paddr_t gpa, int indent)
+{
+    paddr_t address;
+    void *table_vaddr, *pde;
+    paddr_t next_table_maddr;
+    int index, next_level, present;
+    u32 *entry;
+
+    if ( level < 1 )
+        return;
+
+    table_vaddr = __map_domain_page(pg);
+    if ( table_vaddr == NULL )
+    {
+        printk("Failed to map IOMMU domain page %"PRIpaddr"\n", 
+                page_to_maddr(pg));
+        return;
+    }
+
+    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
+    {
+        if ( !(index % 2) )
+            process_pending_softirqs();
+
+        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
+        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
+        entry = (u32*)pde;
+
+        present = get_field_from_reg_u32(entry[0],
+                                         IOMMU_PDE_PRESENT_MASK,
+                                         IOMMU_PDE_PRESENT_SHIFT);
+
+        if ( !present )
+            continue;
+
+        next_level = get_field_from_reg_u32(entry[0],
+                                            IOMMU_PDE_NEXT_LEVEL_MASK,
+                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
+
+        address = gpa + amd_offset_level_address(index, level);
+        if ( next_level >= 1 )
+            amd_dump_p2m_table_level(
+                maddr_to_page(next_table_maddr), level - 1,
+                address, indent + 1);
+        else
+            printk("%*s" "gfn: %08lx  mfn: %08lx\n",
+                   indent, " ",
+                   (unsigned long)PFN_DOWN(address),
+                   (unsigned long)PFN_DOWN(next_table_maddr));
+    }
+
+    unmap_domain_page(table_vaddr);
+}
+
+static void amd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd  = domain_hvm_iommu(d);
+
+    if ( !hd->root_table ) 
+        return;
+
+    printk("p2m table has %d levels\n", hd->paging_mode);
+    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
+}
+
 const struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .dom0_init = amd_iommu_dom0_init,
@@ -531,4 +598,5 @@ const struct iommu_ops amd_iommu_ops = {
     .resume = amd_iommu_resume,
     .share_p2m = amd_iommu_share_p2m,
     .crash_shutdown = amd_iommu_suspend,
+    .dump_p2m_table = amd_dump_p2m_table,
 };
diff -r dc56a9defa30 -r 5357dccf4ba3 xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/drivers/passthrough/iommu.c	Tue Aug 14 12:54:55 2012 -0700
@@ -19,10 +19,12 @@
 #include <xen/paging.h>
 #include <xen/guest_access.h>
 #include <xen/softirq.h>
+#include <xen/keyhandler.h>
 #include <xsm/xsm.h>
 
 static void parse_iommu_param(char *s);
 static int iommu_populate_page_table(struct domain *d);
+static void iommu_dump_p2m_table(unsigned char key);
 
 /*
  * The 'iommu' parameter enables the IOMMU.  Optional comma separated
@@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
 
 DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
 
+static struct keyhandler iommu_p2m_table = {
+    .diagnostic = 0,
+    .u.fn = iommu_dump_p2m_table,
+    .desc = "dump iommu p2m table"
+};
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
     if ( !iommu_enabled )
         return;
 
+    register_keyhandler('o', &iommu_p2m_table);
     d->need_iommu = !!iommu_dom0_strict;
     if ( need_iommu(d) )
     {
@@ -654,6 +663,34 @@ int iommu_do_domctl(
     return ret;
 }
 
+static void iommu_dump_p2m_table(unsigned char key)
+{
+    struct domain *d;
+    const struct iommu_ops *ops;
+
+    if ( !iommu_enabled )
+    {
+        printk("IOMMU not enabled!\n");
+        return;
+    }
+
+    ops = iommu_get_ops();
+    for_each_domain(d)
+    {
+        if ( !d->domain_id )
+            continue;
+
+        if ( iommu_use_hap_pt(d) )
+        {
+            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
+            continue;
+        }
+
+        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
+        ops->dump_p2m_table(d);
+    }
+}
+
 /*
  * Local variables:
  * mode: C
diff -r dc56a9defa30 -r 5357dccf4ba3 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/drivers/passthrough/vtd/iommu.c	Tue Aug 14 12:54:55 2012 -0700
@@ -31,6 +31,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/keyhandler.h>
+#include <xen/softirq.h>
 #include <asm/msi.h>
 #include <asm/irq.h>
 #if defined(__i386__) || defined(__x86_64__)
@@ -2365,6 +2366,63 @@ static void vtd_resume(void)
     }
 }
 
+static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa, 
+                                     int indent)
+{
+    paddr_t address;
+    int i;
+    struct dma_pte *pt_vaddr, *pte;
+    int next_level;
+
+    if ( level < 1 )
+        return;
+
+    pt_vaddr = map_vtd_domain_page(pt_maddr);
+    if ( pt_vaddr == NULL )
+    {
+        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
+        return;
+    }
+
+    next_level = level - 1;
+    for ( i = 0; i < PTE_NUM; i++ )
+    {
+        if ( !(i % 2) )
+            process_pending_softirqs();
+
+        pte = &pt_vaddr[i];
+        if ( !dma_pte_present(*pte) )
+            continue;
+
+        address = gpa + offset_level_address(i, level);
+        if ( next_level >= 1 ) 
+            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level, 
+                                     address, indent + 1);
+        else
+            printk("%*s" "gfn: %08lx mfn: %08lx super=%d rd=%d wr=%d\n",
+                   indent, " ",
+                   (unsigned long)(address >> PAGE_SHIFT_4K),
+                   (unsigned long)(pte->val >> PAGE_SHIFT_4K),
+                   dma_pte_superpage(*pte)? 1 : 0,
+                   dma_pte_read(*pte)? 1 : 0,
+                   dma_pte_write(*pte)? 1 : 0);
+    }
+
+    unmap_vtd_domain_page(pt_vaddr);
+}
+
+static void vtd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd;
+
+    if ( list_empty(&acpi_drhd_units) )
+        return;
+
+    hd = domain_hvm_iommu(d);
+    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
+    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
+}
+
 const struct iommu_ops intel_iommu_ops = {
     .init = intel_iommu_domain_init,
     .dom0_init = intel_iommu_dom0_init,
@@ -2387,6 +2445,7 @@ const struct iommu_ops intel_iommu_ops =
     .crash_shutdown = vtd_crash_shutdown,
     .iotlb_flush = intel_iommu_iotlb_flush,
     .iotlb_flush_all = intel_iommu_iotlb_flush_all,
+    .dump_p2m_table = vtd_dump_p2m_table,
 };
 
 /*
diff -r dc56a9defa30 -r 5357dccf4ba3 xen/drivers/passthrough/vtd/iommu.h
--- a/xen/drivers/passthrough/vtd/iommu.h	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/drivers/passthrough/vtd/iommu.h	Tue Aug 14 12:54:55 2012 -0700
@@ -248,6 +248,8 @@ struct context_entry {
 #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
 #define address_level_offset(addr, level) \
             ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
+#define offset_level_address(offset, level) \
+            ((u64)(offset) << level_to_offset_bits(level))
 #define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
 #define level_size(l) (1 << level_to_offset_bits(l))
 #define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
@@ -277,6 +279,9 @@ struct dma_pte {
 #define dma_set_pte_addr(p, addr) do {\
             (p).val |= ((addr) & PAGE_MASK_4K); } while (0)
 #define dma_pte_present(p) (((p).val & 3) != 0)
+#define dma_pte_superpage(p) (((p).val & (1<<7)) != 0)
+#define dma_pte_read(p) (((p).val & DMA_PTE_READ) != 0)
+#define dma_pte_write(p) (((p).val & DMA_PTE_WRITE) != 0)
 
 /* interrupt remap entry */
 struct iremap_entry {
diff -r dc56a9defa30 -r 5357dccf4ba3 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Tue Aug 14 12:54:55 2012 -0700
@@ -38,6 +38,10 @@
 #define PTE_PER_TABLE_ALLOC(entries)	\
 	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT)
 
+#define amd_offset_level_address(offset, level) \
+      	((u64)(offset) << (12 + (PTE_PER_TABLE_SHIFT * \
+                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
+
 #define PCI_MIN_CAP_OFFSET	0x40
 #define PCI_MAX_CAP_BLOCKS	48
 #define PCI_CAP_PTR_MASK	0xFC
diff -r dc56a9defa30 -r 5357dccf4ba3 xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h	Tue Aug 14 10:28:14 2012 +0200
+++ b/xen/include/xen/iommu.h	Tue Aug 14 12:54:55 2012 -0700
@@ -141,6 +141,7 @@ struct iommu_ops {
     void (*crash_shutdown)(void);
     void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
     void (*iotlb_flush_all)(struct domain *d);
+    void (*dump_p2m_table)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-14 19:55 Santosh Jodh
@ 2012-08-15  8:54 ` Jan Beulich
  2012-08-15 10:39   ` Wei Wang
  2012-08-16 16:27   ` Santosh Jodh
  0 siblings, 2 replies; 13+ messages in thread
From: Jan Beulich @ 2012-08-15  8:54 UTC (permalink / raw)
  To: Santosh Jodh; +Cc: wei.wang2, tim, xiantao.zhang, xen-devel

>>> On 14.08.12 at 21:55, Santosh Jodh <santosh.jodh@citrix.com> wrote:

Sorry to be picky; after this many rounds I would have
expected that no further comments would be needed.

> +static void amd_dump_p2m_table_level(struct page_info* pg, int level, 
> +                                     paddr_t gpa, int indent)
> +{
> +    paddr_t address;
> +    void *table_vaddr, *pde;
> +    paddr_t next_table_maddr;
> +    int index, next_level, present;
> +    u32 *entry;
> +
> +    if ( level < 1 )
> +        return;
> +
> +    table_vaddr = __map_domain_page(pg);
> +    if ( table_vaddr == NULL )
> +    {
> +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n", 
> +                page_to_maddr(pg));
> +        return;
> +    }
> +
> +    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
> +    {
> +        if ( !(index % 2) )
> +            process_pending_softirqs();
> +
> +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> +        entry = (u32*)pde;
> +
> +        present = get_field_from_reg_u32(entry[0],
> +                                         IOMMU_PDE_PRESENT_MASK,
> +                                         IOMMU_PDE_PRESENT_SHIFT);
> +
> +        if ( !present )
> +            continue;
> +
> +        next_level = get_field_from_reg_u32(entry[0],
> +                                            IOMMU_PDE_NEXT_LEVEL_MASK,
> +                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
> +
> +        address = gpa + amd_offset_level_address(index, level);
> +        if ( next_level >= 1 )
> +            amd_dump_p2m_table_level(
> +                maddr_to_page(next_table_maddr), level - 1,

Did you see Wei's cleanup patches to the code you cloned from?
You should follow that route (replacing the ASSERT() with
printing of the inconsistency and _not_ recursing or doing the
normal printing), and using either "level" or "next_level"
consistently here.

> +                address, indent + 1);
> +        else
> +            printk("%*s" "gfn: %08lx  mfn: %08lx\n",
> +                   indent, " ",

            printk("%*sgfn: %08lx  mfn: %08lx\n",
                   indent, "",

I can vaguely see the point in splitting the two strings in the
first argument, but the extra space in the third argument is
definitely wrong - it'll make level 1 and level 2 indistinguishable.

I also don't see how you addressed Wei's reporting of this still
not printing correctly. I may be overlooking something, but
without you making clear in the description what you changed
over the previous version that's also relatively easy to happen.

> +static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa, 
> +                                     int indent)
> +{
> +    paddr_t address;
> +    int i;
> +    struct dma_pte *pt_vaddr, *pte;
> +    int next_level;
> +
> +    if ( level < 1 )
> +        return;
> +
> +    pt_vaddr = map_vtd_domain_page(pt_maddr);
> +    if ( pt_vaddr == NULL )
> +    {
> +        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
> +        return;
> +    }
> +
> +    next_level = level - 1;
> +    for ( i = 0; i < PTE_NUM; i++ )
> +    {
> +        if ( !(i % 2) )
> +            process_pending_softirqs();
> +
> +        pte = &pt_vaddr[i];
> +        if ( !dma_pte_present(*pte) )
> +            continue;
> +
> +        address = gpa + offset_level_address(i, level);
> +        if ( next_level >= 1 ) 
> +            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level, 
> +                                     address, indent + 1);
> +        else
> +            printk("%*s" "gfn: %08lx mfn: %08lx super=%d rd=%d wr=%d\n",
> +                   indent, " ",

Same comment as above.

> +                   (unsigned long)(address >> PAGE_SHIFT_4K),
> +                   (unsigned long)(pte->val >> PAGE_SHIFT_4K),
> +                   dma_pte_superpage(*pte)? 1 : 0,
> +                   dma_pte_read(*pte)? 1 : 0,
> +                   dma_pte_write(*pte)? 1 : 0);

Missing spaces. Even worse - given your definitions of these
macros there's no point in using the conditional operators here
at all.

And, despite your claim in another response, this still isn't similar
to AMD's variant (which still doesn't print any of these three
attributes).

The printing of the superpage status is pretty pointless anyway,
given that there's no single use of dma_set_pte_superpage()
throughout the tree - validly so since superpages can be in use
currently only when the tables are shared with EPT, in which
case you don't print anything. Plus you'd need to detect the flag
_above_ level 1 (at leaf level the bit is ignored and hence just
confusing if printed) and print the entry instead of recursing. And
if you decide to indeed properly implement this (rather than just
dropping superpage support here), _I_ would expect you to
properly implement level skipping in the corresponding AMD code
too (which similarly isn't being used currently).

Jan

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-15  8:54 ` Jan Beulich
@ 2012-08-15 10:39   ` Wei Wang
  2012-08-16 16:27   ` Santosh Jodh
  1 sibling, 0 replies; 13+ messages in thread
From: Wei Wang @ 2012-08-15 10:39 UTC (permalink / raw)
  To: Jan Beulich; +Cc: tim, xiantao.zhang, Santosh Jodh, xen-devel

[-- Attachment #1: Type: text/plain, Size: 6240 bytes --]

On 08/15/2012 10:54 AM, Jan Beulich wrote:
>>>> On 14.08.12 at 21:55, Santosh Jodh<santosh.jodh@citrix.com>  wrote:
>
> Sorry to be picky; after this many rounds I would have
> expected that no further comments would be needed.
>
>> +static void amd_dump_p2m_table_level(struct page_info* pg, int level,
>> +                                     paddr_t gpa, int indent)
>> +{
>> +    paddr_t address;
>> +    void *table_vaddr, *pde;
>> +    paddr_t next_table_maddr;
>> +    int index, next_level, present;
>> +    u32 *entry;
>> +
>> +    if ( level<  1 )
>> +        return;
>> +
>> +    table_vaddr = __map_domain_page(pg);
>> +    if ( table_vaddr == NULL )
>> +    {
>> +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
>> +                page_to_maddr(pg));
>> +        return;
>> +    }
>> +
>> +    for ( index = 0; index<  PTE_PER_TABLE_SIZE; index++ )
>> +    {
>> +        if ( !(index % 2) )
>> +            process_pending_softirqs();
>> +
>> +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
>> +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
>> +        entry = (u32*)pde;
>> +
>> +        present = get_field_from_reg_u32(entry[0],
>> +                                         IOMMU_PDE_PRESENT_MASK,
>> +                                         IOMMU_PDE_PRESENT_SHIFT);
>> +
>> +        if ( !present )
>> +            continue;
>> +
>> +        next_level = get_field_from_reg_u32(entry[0],
>> +                                            IOMMU_PDE_NEXT_LEVEL_MASK,
>> +                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
>> +
>> +        address = gpa + amd_offset_level_address(index, level);
>> +        if ( next_level>= 1 )
>> +            amd_dump_p2m_table_level(
>> +                maddr_to_page(next_table_maddr), level - 1,
>
> Did you see Wei's cleanup patches to the code you cloned from?
> You should follow that route (replacing the ASSERT() with
> printing of the inconsistency and _not_ recursing or doing the
> normal printing), and using either "level" or "next_level"
> consistently here.

Hi, I tested the patch and the output looks much better now,please see 
attachment. One thing I notice: there is a 1GB mapping in the guest, but 
the format of it looks like other 2MB mappings:

(XEN)  gfn: 0003fa00  mfn: 0023b000
(XEN)  gfn: 0003fc00  mfn: 00136200
(XEN)  gfn: 0003fe00  mfn: 0023ae00
(XEN)  gfn: 00040000  mfn: 00040000 << 1GB here
(XEN)  gfn: 00080000  mfn: 0023ac00
(XEN)  gfn: 00080200  mfn: 00136000
(XEN)  gfn: 00080400  mfn: 0023aa00
(XEN)  gfn: 00080600  mfn: 00135e00
(XEN)  gfn: 00080800  mfn: 0023a800
(XEN)  gfn: 00080a00  mfn: 00135c00
(XEN)  gfn: 00080c00  mfn: 0023a600
(XEN)  gfn: 00080e00  mfn: 00135a00
(XEN)  gfn: 00081000  mfn: 0023a400
(XEN)  gfn: 00081200  mfn: 00135800
(XEN)  gfn: 00081400  mfn: 0023a200
(XEN)  gfn: 00081600  mfn: 00135600

Thanks,
Wei

>> +                address, indent + 1);
>> +        else
>> +            printk("%*s" "gfn: %08lx  mfn: %08lx\n",
>> +                   indent, " ",
>
>              printk("%*sgfn: %08lx  mfn: %08lx\n",
>                     indent, "",
>
> I can vaguely see the point in splitting the two strings in the
> first argument, but the extra space in the third argument is
> definitely wrong - it'll make level 1 and level 2 indistinguishable.
>
> I also don't see how you addressed Wei's reporting of this still
> not printing correctly. I may be overlooking something, but
> without you making clear in the description what you changed
> over the previous version that's also relatively easy to happen.
>
>> +static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa,
>> +                                     int indent)
>> +{
>> +    paddr_t address;
>> +    int i;
>> +    struct dma_pte *pt_vaddr, *pte;
>> +    int next_level;
>> +
>> +    if ( level<  1 )
>> +        return;
>> +
>> +    pt_vaddr = map_vtd_domain_page(pt_maddr);
>> +    if ( pt_vaddr == NULL )
>> +    {
>> +        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
>> +        return;
>> +    }
>> +
>> +    next_level = level - 1;
>> +    for ( i = 0; i<  PTE_NUM; i++ )
>> +    {
>> +        if ( !(i % 2) )
>> +            process_pending_softirqs();
>> +
>> +        pte =&pt_vaddr[i];
>> +        if ( !dma_pte_present(*pte) )
>> +            continue;
>> +
>> +        address = gpa + offset_level_address(i, level);
>> +        if ( next_level>= 1 )
>> +            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level,
>> +                                     address, indent + 1);
>> +        else
>> +            printk("%*s" "gfn: %08lx mfn: %08lx super=%d rd=%d wr=%d\n",
>> +                   indent, " ",
>
> Same comment as above.
>
>> +                   (unsigned long)(address>>  PAGE_SHIFT_4K),
>> +                   (unsigned long)(pte->val>>  PAGE_SHIFT_4K),
>> +                   dma_pte_superpage(*pte)? 1 : 0,
>> +                   dma_pte_read(*pte)? 1 : 0,
>> +                   dma_pte_write(*pte)? 1 : 0);
>
> Missing spaces. Even worse - given your definitions of these
> macros there's no point in using the conditional operators here
> at all.
>
> And, despite your claim in another response, this still isn't similar
> to AMD's variant (which still doesn't print any of these three
> attributes).
>
> The printing of the superpage status is pretty pointless anyway,
> given that there's no single use of dma_set_pte_superpage()
> throughout the tree - validly so since superpages can be in use
> currently only when the tables are shared with EPT, in which
> case you don't print anything. Plus you'd need to detect the flag
> _above_ level 1 (at leaf level the bit is ignored and hence just
> confusing if printed) and print the entry instead of recursing. And
> if you decide to indeed properly implement this (rather than just
> dropping superpage support here), _I_ would expect you to
> properly implement level skipping in the corresponding AMD code
> too (which similarly isn't being used currently).
>
> Jan
>


[-- Attachment #2: io_pt.dump --]
[-- Type: text/plain, Size: 109711 bytes --]


(XEN) HVM2: int13_harddisk: function 41, unmapped device for ELDL=81
(XEN) HVM2: int13_harddisk: function 08, unmapped device for ELDL=81
(XEN) HVM2: *** int 15h function AX=00c0, BX=0000 not yet supported!
(XEN) 
(XEN) domain2 IOMMU p2m table: 
(XEN) p2m table has 3 levels
(XEN)   gfn: 00000000  mfn: 00218f00
(XEN)   gfn: 00000001  mfn: 001019e1
(XEN)   gfn: 00000002  mfn: 00218eff
(XEN)   gfn: 00000003  mfn: 00102e66
(XEN)   gfn: 00000004  mfn: 00218efe
(XEN)   gfn: 00000005  mfn: 00102bea
(XEN)   gfn: 00000006  mfn: 00218efd
(XEN)   gfn: 00000007  mfn: 00101352
(XEN)   gfn: 00000008  mfn: 00218efc
(XEN)   gfn: 00000009  mfn: 00101c8f
(XEN)   gfn: 0000000a  mfn: 00218efb
(XEN)   gfn: 0000000b  mfn: 00101a5f
(XEN)   gfn: 0000000c  mfn: 00218efa
(XEN)   gfn: 0000000d  mfn: 001018f9
(XEN)   gfn: 0000000e  mfn: 00218ef9
(XEN)   gfn: 0000000f  mfn: 001004c9
(XEN)   gfn: 00000010  mfn: 00218ef8
(XEN)   gfn: 00000011  mfn: 00102708
(XEN)   gfn: 00000012  mfn: 00218ef7
(XEN)   gfn: 00000013  mfn: 00101900
(XEN)   gfn: 00000014  mfn: 00218ef6
(XEN)   gfn: 00000015  mfn: 00102510
(XEN)   gfn: 00000016  mfn: 00218ef5
(XEN)   gfn: 00000017  mfn: 00101dd1
(XEN)   gfn: 00000018  mfn: 00218ef4
(XEN)   gfn: 00000019  mfn: 00102726
(XEN)   gfn: 0000001a  mfn: 00218ef3
(XEN)   gfn: 0000001b  mfn: 0010198a
(XEN)   gfn: 0000001c  mfn: 00218ef2
(XEN)   gfn: 0000001d  mfn: 001026e9
(XEN)   gfn: 0000001e  mfn: 00218ef1
(XEN)   gfn: 0000001f  mfn: 0010297f
(XEN)   gfn: 00000020  mfn: 00218ef0
(XEN)   gfn: 00000021  mfn: 00102eb3
(XEN)   gfn: 00000022  mfn: 00218eef
(XEN)   gfn: 00000023  mfn: 0010051f
(XEN)   gfn: 00000024  mfn: 00218eee
(XEN)   gfn: 00000025  mfn: 00102931
(XEN)   gfn: 00000026  mfn: 00218eed
(XEN)   gfn: 00000027  mfn: 00101891
(XEN)   gfn: 00000028  mfn: 00218eec
(XEN)   gfn: 00000029  mfn: 001013ff
(XEN)   gfn: 0000002a  mfn: 00218eeb
(XEN)   gfn: 0000002b  mfn: 001014b1
(XEN)   gfn: 0000002c  mfn: 00218eea
(XEN)   gfn: 0000002d  mfn: 00101a74
(XEN)   gfn: 0000002e  mfn: 00218ee9
(XEN)   gfn: 0000002f  mfn: 0010273e
(XEN)   gfn: 00000030  mfn: 00218ee8
(XEN)   gfn: 00000031  mfn: 0010284b
(XEN)   gfn: 00000032  mfn: 00218ee7
(XEN)   gfn: 00000033  mfn: 001014fd
(XEN)   gfn: 00000034  mfn: 00218ee6
(XEN)   gfn: 00000035  mfn: 0010055e
(XEN)   gfn: 00000036  mfn: 00218ee5
(XEN)   gfn: 00000037  mfn: 0010134e
(XEN)   gfn: 00000038  mfn: 00218ee4
(XEN)   gfn: 00000039  mfn: 00101488
(XEN)   gfn: 0000003a  mfn: 00218ee3
(XEN)   gfn: 0000003b  mfn: 00101310
(XEN)   gfn: 0000003c  mfn: 00218ee2
(XEN)   gfn: 0000003d  mfn: 0010188e
(XEN)   gfn: 0000003e  mfn: 00218ee1
(XEN)   gfn: 0000003f  mfn: 0010286e
(XEN)   gfn: 00000040  mfn: 00218ee0
(XEN)   gfn: 00000041  mfn: 0010187e
(XEN)   gfn: 00000042  mfn: 00218edf
(XEN)   gfn: 00000043  mfn: 0010030e
(XEN)   gfn: 00000044  mfn: 00218ede
(XEN)   gfn: 00000045  mfn: 00100498
(XEN)   gfn: 00000046  mfn: 00218edd
(XEN)   gfn: 00000047  mfn: 00102dd0
(XEN)   gfn: 00000048  mfn: 00218edc
(XEN)   gfn: 00000049  mfn: 00102dda
(XEN)   gfn: 0000004a  mfn: 00218edb
(XEN)   gfn: 0000004b  mfn: 00101770
(XEN)   gfn: 0000004c  mfn: 00218eda
(XEN)   gfn: 0000004d  mfn: 00102cb5
(XEN)   gfn: 0000004e  mfn: 00218ed9
(XEN)   gfn: 0000004f  mfn: 00102e9a
(XEN)   gfn: 00000050  mfn: 00218ed8
(XEN)   gfn: 00000051  mfn: 00101829
(XEN)   gfn: 00000052  mfn: 00218ed7
(XEN)   gfn: 00000053  mfn: 00102991
(XEN)   gfn: 00000054  mfn: 00218ed6
(XEN)   gfn: 00000055  mfn: 0010157c
(XEN)   gfn: 00000056  mfn: 00218ed5
(XEN)   gfn: 00000057  mfn: 001017c3
(XEN)   gfn: 00000058  mfn: 00218ed4
(XEN)   gfn: 00000059  mfn: 00102a42
(XEN)   gfn: 0000005a  mfn: 00218ed3
(XEN)   gfn: 0000005b  mfn: 00101a8f
(XEN)   gfn: 0000005c  mfn: 00218ed2
(XEN)   gfn: 0000005d  mfn: 00102a69
(XEN)   gfn: 0000005e  mfn: 00218ed1
(XEN)   gfn: 0000005f  mfn: 0010181d
(XEN)   gfn: 00000060  mfn: 00218ed0
(XEN)   gfn: 00000061  mfn: 00101ac7
(XEN)   gfn: 00000062  mfn: 00218ecf
(XEN)   gfn: 00000063  mfn: 001014da
(XEN)   gfn: 00000064  mfn: 00218ece
(XEN)   gfn: 00000065  mfn: 00101a0c
(XEN)   gfn: 00000066  mfn: 00218ecd
(XEN)   gfn: 00000067  mfn: 001028c6
(XEN)   gfn: 00000068  mfn: 00218ecc
(XEN)   gfn: 00000069  mfn: 00102a1a
(XEN)   gfn: 0000006a  mfn: 00218ecb
(XEN)   gfn: 0000006b  mfn: 00102446
(XEN)   gfn: 0000006c  mfn: 00218eca
(XEN)   gfn: 0000006d  mfn: 00101383
(XEN)   gfn: 0000006e  mfn: 00218ec9
(XEN)   gfn: 0000006f  mfn: 00102cc2
(XEN)   gfn: 00000070  mfn: 00218ec8
(XEN)   gfn: 00000071  mfn: 00101deb
(XEN)   gfn: 00000072  mfn: 00218ec7
(XEN)   gfn: 00000073  mfn: 001021a8
(XEN)   gfn: 00000074  mfn: 00218ec6
(XEN)   gfn: 00000075  mfn: 001002fb
(XEN)   gfn: 00000076  mfn: 00218ec5
(XEN)   gfn: 00000077  mfn: 001014cc
(XEN)   gfn: 00000078  mfn: 00218ec4
(XEN)   gfn: 00000079  mfn: 00101544
(XEN)   gfn: 0000007a  mfn: 00218ec3
(XEN)   gfn: 0000007b  mfn: 00101d9f
(XEN)   gfn: 0000007c  mfn: 00218ec2
(XEN)   gfn: 0000007d  mfn: 00101a88
(XEN)   gfn: 0000007e  mfn: 00218ec1
(XEN)   gfn: 0000007f  mfn: 00101a60
(XEN)   gfn: 00000080  mfn: 00218ec0
(XEN)   gfn: 00000081  mfn: 00102915
(XEN)   gfn: 00000082  mfn: 00218ebf
(XEN)   gfn: 00000083  mfn: 00101301
(XEN)   gfn: 00000084  mfn: 00218ebe
(XEN)   gfn: 00000085  mfn: 001015d8
(XEN)   gfn: 00000086  mfn: 00218ebd
(XEN)   gfn: 00000087  mfn: 001018ad
(XEN)   gfn: 00000088  mfn: 00218ebc
(XEN)   gfn: 00000089  mfn: 00101533
(XEN)   gfn: 0000008a  mfn: 00218ebb
(XEN)   gfn: 0000008b  mfn: 00101ed4
(XEN)   gfn: 0000008c  mfn: 00218eba
(XEN)   gfn: 0000008d  mfn: 00101a01
(XEN)   gfn: 0000008e  mfn: 00218eb9
(XEN)   gfn: 0000008f  mfn: 0010159e
(XEN)   gfn: 00000090  mfn: 00218eb8
(XEN)   gfn: 00000091  mfn: 00102571
(XEN)   gfn: 00000092  mfn: 00218eb7
(XEN)   gfn: 00000093  mfn: 00102cfe
(XEN)   gfn: 00000094  mfn: 00218eb6
(XEN)   gfn: 00000095  mfn: 0010055d
(XEN)   gfn: 00000096  mfn: 00218eb5
(XEN)   gfn: 00000097  mfn: 00102d27
(XEN)   gfn: 00000098  mfn: 00218eb4
(XEN)   gfn: 00000099  mfn: 001027c6
(XEN)   gfn: 0000009a  mfn: 00218eb3
(XEN)   gfn: 0000009b  mfn: 001014af
(XEN)   gfn: 0000009c  mfn: 00218eb2
(XEN)   gfn: 0000009d  mfn: 00102e76
(XEN)   gfn: 0000009e  mfn: 00218eb1
(XEN)   gfn: 0000009f  mfn: 0010235e
(XEN)   gfn: 00000100  mfn: 00218e90
(XEN)   gfn: 00000101  mfn: 0010171e
(XEN)   gfn: 00000102  mfn: 00218e8f
(XEN)   gfn: 00000103  mfn: 00102eb1
(XEN)   gfn: 00000104  mfn: 00218e8e
(XEN)   gfn: 00000105  mfn: 001019d2
(XEN)   gfn: 00000106  mfn: 00218e8d
(XEN)   gfn: 00000107  mfn: 00100310
(XEN)   gfn: 00000108  mfn: 00218e8c
(XEN)   gfn: 00000109  mfn: 00101817
(XEN)   gfn: 0000010a  mfn: 00218e8b
(XEN)   gfn: 0000010b  mfn: 0010187b
(XEN)   gfn: 0000010c  mfn: 00218e8a
(XEN)   gfn: 0000010d  mfn: 00101a53
(XEN)   gfn: 0000010e  mfn: 00218e89
(XEN)   gfn: 0000010f  mfn: 00102997
(XEN)   gfn: 00000110  mfn: 00218e88
(XEN)   gfn: 00000111  mfn: 00101504
(XEN)   gfn: 00000112  mfn: 00218e87
(XEN)   gfn: 00000113  mfn: 00101a98
(XEN)   gfn: 00000114  mfn: 00218e86
(XEN)   gfn: 00000115  mfn: 00102832
(XEN)   gfn: 00000116  mfn: 00218e85
(XEN)   gfn: 00000117  mfn: 00101ec3
(XEN)   gfn: 00000118  mfn: 00218e84
(XEN)   gfn: 00000119  mfn: 00102e1f
(XEN)   gfn: 0000011a  mfn: 00218e83
(XEN)   gfn: 0000011b  mfn: 001003a8
(XEN)   gfn: 0000011c  mfn: 00218e82
(XEN)   gfn: 0000011d  mfn: 00101e73
(XEN)   gfn: 0000011e  mfn: 00218e81
(XEN)   gfn: 0000011f  mfn: 001026ed
(XEN)   gfn: 00000120  mfn: 00218e80
(XEN)   gfn: 00000121  mfn: 00100567
(XEN)   gfn: 00000122  mfn: 00218e7f
(XEN)   gfn: 00000123  mfn: 001014f2
(XEN)   gfn: 00000124  mfn: 00218e7e
(XEN)   gfn: 00000125  mfn: 001002ed
(XEN)   gfn: 00000126  mfn: 00218e7d
(XEN)   gfn: 00000127  mfn: 001018ba
(XEN)   gfn: 00000128  mfn: 00218e7c
(XEN)   gfn: 00000129  mfn: 00101375
(XEN)   gfn: 0000012a  mfn: 00218e7b
(XEN)   gfn: 0000012b  mfn: 001013ea
(XEN)   gfn: 0000012c  mfn: 00218e7a
(XEN)   gfn: 0000012d  mfn: 001018de
(XEN)   gfn: 0000012e  mfn: 00218e79
(XEN)   gfn: 0000012f  mfn: 00100570
(XEN)   gfn: 00000130  mfn: 00218e78
(XEN)   gfn: 00000131  mfn: 0010143e
(XEN)   gfn: 00000132  mfn: 00218e77
(XEN)   gfn: 00000133  mfn: 0010136a
(XEN)   gfn: 00000134  mfn: 00218e76
(XEN)   gfn: 00000135  mfn: 001013a5
(XEN)   gfn: 00000136  mfn: 00218e75
(XEN)   gfn: 00000137  mfn: 001027f5
(XEN)   gfn: 00000138  mfn: 00218e74
(XEN)   gfn: 00000139  mfn: 00102a49
(XEN)   gfn: 0000013a  mfn: 00218e73
(XEN)   gfn: 0000013b  mfn: 00101dc7
(XEN)   gfn: 0000013c  mfn: 00218e72
(XEN)   gfn: 0000013d  mfn: 00102d60
(XEN)   gfn: 0000013e  mfn: 00218e71
(XEN)   gfn: 0000013f  mfn: 001015a2
(XEN)   gfn: 00000140  mfn: 00218e70
(XEN)   gfn: 00000141  mfn: 0010277b
(XEN)   gfn: 00000142  mfn: 00218e6f
(XEN)   gfn: 00000143  mfn: 001028af
(XEN)   gfn: 00000144  mfn: 00218e6e
(XEN)   gfn: 00000145  mfn: 0010194f
(XEN)   gfn: 00000146  mfn: 00218e6d
(XEN)   gfn: 00000147  mfn: 00101a63
(XEN)   gfn: 00000148  mfn: 00218e6c
(XEN)   gfn: 00000149  mfn: 00101541
(XEN)   gfn: 0000014a  mfn: 00218e6b
(XEN)   gfn: 0000014b  mfn: 00102dcc
(XEN)   gfn: 0000014c  mfn: 00218e6a
(XEN)   gfn: 0000014d  mfn: 0010281c
(XEN)   gfn: 0000014e  mfn: 00218e69
(XEN)   gfn: 0000014f  mfn: 00102e32
(XEN)   gfn: 00000150  mfn: 00218e68
(XEN)   gfn: 00000151  mfn: 001004c4
(XEN)   gfn: 00000152  mfn: 00218e67
(XEN)   gfn: 00000153  mfn: 00102c18
(XEN)   gfn: 00000154  mfn: 00218e66
(XEN)   gfn: 00000155  mfn: 00102c17
(XEN)   gfn: 00000156  mfn: 00218e65
(XEN)   gfn: 00000157  mfn: 00101dd8
(XEN)   gfn: 00000158  mfn: 00218e64
(XEN)   gfn: 00000159  mfn: 00101dd7
(XEN)   gfn: 0000015a  mfn: 00218e63
(XEN)   gfn: 0000015b  mfn: 001027bf
(XEN)   gfn: 0000015c  mfn: 00218e62
(XEN)   gfn: 0000015d  mfn: 00100534
(XEN)   gfn: 0000015e  mfn: 00218e61
(XEN)   gfn: 0000015f  mfn: 00102e96
(XEN)   gfn: 00000160  mfn: 00218e60
(XEN)   gfn: 00000161  mfn: 001014ca
(XEN)   gfn: 00000162  mfn: 00218e5f
(XEN)   gfn: 00000163  mfn: 001014c9
(XEN)   gfn: 00000164  mfn: 00218e5e
(XEN)   gfn: 00000165  mfn: 00102e2a
(XEN)   gfn: 00000166  mfn: 00218e5d
(XEN)   gfn: 00000167  mfn: 00102e29
(XEN)   gfn: 00000168  mfn: 00218e5c
(XEN)   gfn: 00000169  mfn: 00102465
(XEN)   gfn: 0000016a  mfn: 00218e5b
(XEN)   gfn: 0000016b  mfn: 00102e84
(XEN)   gfn: 0000016c  mfn: 00218e5a
(XEN)   gfn: 0000016d  mfn: 00102e83
(XEN)   gfn: 0000016e  mfn: 00218e59
(XEN)   gfn: 0000016f  mfn: 00102757
(XEN)   gfn: 00000170  mfn: 00218e58
(XEN)   gfn: 00000171  mfn: 00101492
(XEN)   gfn: 00000172  mfn: 00218e57
(XEN)   gfn: 00000173  mfn: 00102a10
(XEN)   gfn: 00000174  mfn: 00218e56
(XEN)   gfn: 00000175  mfn: 00102a0f
(XEN)   gfn: 00000176  mfn: 00218e55
(XEN)   gfn: 00000177  mfn: 00102ec4
(XEN)   gfn: 00000178  mfn: 00218e54
(XEN)   gfn: 00000179  mfn: 00102ec3
(XEN)   gfn: 0000017a  mfn: 00218e53
(XEN)   gfn: 0000017b  mfn: 00102a5a
(XEN)   gfn: 0000017c  mfn: 00218e52
(XEN)   gfn: 0000017d  mfn: 00102a59
(XEN)   gfn: 0000017e  mfn: 00218e51
(XEN)   gfn: 0000017f  mfn: 0010130e
(XEN)   gfn: 00000180  mfn: 00218e50
(XEN)   gfn: 00000181  mfn: 001018b4
(XEN)   gfn: 00000182  mfn: 00218e4f
(XEN)   gfn: 00000183  mfn: 001018b3
(XEN)   gfn: 00000184  mfn: 00218e4e
(XEN)   gfn: 00000185  mfn: 0010247e
(XEN)   gfn: 00000186  mfn: 00218e4d
(XEN)   gfn: 00000187  mfn: 00101394
(XEN)   gfn: 00000188  mfn: 00218e4c
(XEN)   gfn: 00000189  mfn: 00101393
(XEN)   gfn: 0000018a  mfn: 00218e4b
(XEN)   gfn: 0000018b  mfn: 00102dd6
(XEN)   gfn: 0000018c  m+fn: 00218e4a
(XEN)   gfn: 0000018d  mfn: 00102dd5
(XEN)   gfn: 0000018e  mfn: 00218e49
(XEN)   gfn: 0000018f  mfn: 00102994
(XEN)   gfn: 00000190  mfn: 00218e48
(XEN)   gfn: 00000191  mfn: 00102993
(XEN)   gfn: 00000192  mfn: 00218e47
(XEN)   gfn: 00000193  mfn: 00102de2
(XEN)   gfn: 00000194  mfn: 00218e46
(XEN)   gfn: 00000195  mfn: 00102de1
(XEN)   gfn: 00000196  mfn: 00218e45
(XEN)   gfn: 00000197  mfn: 00101713
(XEN)   gfn: 00000198  mfn: 00218e44
(XEN)   gfn: 00000199  mfn: 0010139a
(XEN)   gfn: 0000019a  mfn: 00218e43
(XEN)   gfn: 0000019b  mfn: 00102c26
(XEN)   gfn: 0000019c  mfn: 00218e42
(XEN)   gfn: 0000019d  mfn: 00102c25
(XEN)   gfn: 0000019e  mfn: 00218e41
(XEN)   gfn: 0000019f  mfn: 00101448
(XEN)   gfn: 000001a0  mfn: 00218e40
(XEN)   gfn: 000001a1  mfn: 00101447
(XEN)   gfn: 000001a2  mfn: 00218e3f
(XEN)   gfn: 000001a3  mfn: 00101e84
(XEN)   gfn: 000001a4  mfn: 00218e3e
(XEN)   gfn: 000001a5  mfn: 001013a7
(XEN)   gfn: 000001a6  mfn: 00218e3d
(XEN)   gfn: 000001a7  mfn: 00102def
(XEN)   gfn: 000001a8  mfn: 00218e3c
(XEN)   gfn: 000001a9  mfn: 001012db
(XEN)   gfn: 000001aa  mfn: 00218e3b
(XEN)   gfn: 000001ab  mfn: 00100524
(XEN)   gfn: 000001ac  mfn: 00218e3a
(XEN)   gfn: 000001ad  mfn: 00100523
(XEN)   gfn: 000001ae  mfn: 00218e39
(XEN)   gfn: 000001af  mfn: 00102e08
(XEN)   gfn: 000001b0  mfn: 00218e38
(XEN)   gfn: 000001b1  mfn: 00102e07
(XEN)   gfn: 000001b2  mfn: 00218e37
(XEN)   gfn: 000001b3  mfn: 00102881
(XEN)   gfn: 000001b4  mfn: 00218e36
(XEN)   gfn: 000001b5  mfn: 00102946
(XEN)   gfn: 000001b6  mfn: 00218e35
(XEN)   gfn: 000001b7  mfn: 00100357
(XEN)   gfn: 000001b8  mfn: 00218e34
(XEN)   gfn: 000001b9  mfn: 00101876
(XEN)   gfn: 000001ba  mfn: 00218e33
(XEN)   gfn: 000001bb  mfn: 00101875
(XEN)   gfn: 000001bc  mfn: 00218e32
(XEN)   gfn: 000001bd  mfn: 0010148c
(XEN)   gfn: 000001be  mfn: 00218e31
(XEN)   gfn: 000001bf  mfn: 0010148b
(XEN)   gfn: 000001c0  mfn: 00218e30
(XEN)   gfn: 000001c1  mfn: 0010189a
(XEN)   gfn: 000001c2  mfn: 00218e2f
(XEN)   gfn: 000001c3  mfn: 00101899
(XEN)   gfn: 000001c4  mfn: 00218e2e
(XEN)   gfn: 000001c5  mfn: 00101858
(XEN)   gfn: 000001c6  mfn: 00218e2d
(XEN)   gfn: 000001c7  mfn: 00101857
(XEN)   gfn: 000001c8  mfn: 00218e2c
(XEN)   gfn: 000001c9  mfn: 00102de6
(XEN)   gfn: 000001ca  mfn: 00218e2b
(XEN)   gfn: 000001cb  mfn: 00102de5
(XEN)   gfn: 000001cc  mfn: 00218e2a
(XEN)   gfn: 000001cd  mfn: 0010175d
(XEN)   gfn: 000001ce  mfn: 00218e29
(XEN)   gfn: 000001cf  mfn: 0010175c
(XEN)   gfn: 000001d0  mfn: 00218e28
(XEN)   gfn: 000001d1  mfn: 00102c53
(XEN)   gfn: 000001d2  mfn: 00218e27
(XEN)   gfn: 000001d3  mfn: 00102c52
(XEN)   gfn: 000001d4  mfn: 00218e26
(XEN)   gfn: 000001d5  mfn: 00101741
(XEN)   gfn: 000001d6  mfn: 00218e25
(XEN)   gfn: 000001d7  mfn: 00101740
(XEN)   gfn: 000001d8  mfn: 00218e24
(XEN)   gfn: 000001d9  mfn: 0010286b
(XEN)   gfn: 000001da  mfn: 00218e23
(XEN)   gfn: 000001db  mfn: 0010286a
(XEN)   gfn: 000001dc  mfn: 00218e22
(XEN)   gfn: 000001dd  mfn: 00101805
(XEN)   gfn: 000001de  mfn: 00218e21
(XEN)   gfn: 000001df  mfn: 00101804
(XEN)   gfn: 000001e0  mfn: 00218e20
(XEN)   gfn: 000001e1  mfn: 00101803
(XEN)   gfn: 000001e2  mfn: 00218e1f
(XEN)   gfn: 000001e3  mfn: 00101802
(XEN)   gfn: 000001e4  mfn: 00218e1e
(XEN)   gfn: 000001e5  mfn: 0010287b
(XEN)   gfn: 000001e6  mfn: 00218e1d
(XEN)   gfn: 000001e7  mfn: 0010287a
(XEN)   gfn: 000001e8  mfn: 00218e1c
(XEN)   gfn: 000001e9  mfn: 001027bb
(XEN)   gfn: 000001ea  mfn: 00218e1b
(XEN)   gfn: 000001eb  mfn: 001027ba
(XEN)   gfn: 000001ec  mfn: 00218e1a
(XEN)   gfn: 000001ed  mfn: 00102cfb
(XEN)   gfn: 000001ee  mfn: 00218e19
(XEN)   gfn: 000001ef  mfn: 00102cfa
(XEN)   gfn: 000001f0  mfn: 00218e18
(XEN)   gfn: 000001f1  mfn: 00101e37
(XEN)   gfn: 000001f2  mfn: 00218e17
(XEN)   gfn: 000001f3  mfn: 00101e36
(XEN)   gfn: 000001f4  mfn: 00218e16
(XEN)   gfn: 000001f5  mfn: 00101aaf
(XEN)   gfn: 000001f6  mfn: 00218e15
(XEN)   gfn: 000001f7  mfn: 00101aae
(XEN)   gfn: 000001f8  mfn: 00218e14
(XEN)   gfn: 000001f9  mfn: 00101a6f
(XEN)   gfn: 000001fa  mfn: 00218e13
(XEN)   gfn: 000001fb  mfn: 00101a6e
(XEN)   gfn: 000001fc  mfn: 00218e12
(XEN)   gfn: 000001fd  mfn: 00101a43
(XEN)   gfn: 000001fe  mfn: 00218e11
(XEN)   gfn: 000001ff  mfn: 00101a42
(XEN)  gfn: 00000200  mfn: 00218c00
(XEN)  gfn: 00000400  mfn: 0010be00
(XEN)  gfn: 00000600  mfn: 00218a00
(XEN)  gfn: 00000800  mfn: 0010bc00
(XEN)  gfn: 00000a00  mfn: 00218800
(XEN)  gfn: 00000c00  mfn: 0010ba00
(XEN)  gfn: 00000e00  mfn: 00218600
(XEN)  gfn: 00001000  mfn: 0010b800
(XEN)  gfn: 00001200  mfn: 00218400
(XEN)  gfn: 00001400  mfn: 0010b600
(XEN)  gfn: 00001600  mfn: 00218200
(XEN)  gfn: 00001800  mfn: 0010b400
(XEN)  gfn: 00001a00  mfn: 00218000
(XEN)  gfn: 00001c00  mfn: 0010b200
(XEN)  gfn: 00001e00  mfn: 0021fe00
(XEN)  gfn: 00002000  mfn: 0010b000
(XEN)  gfn: 00002200  mfn: 0021fc00
(XEN)  gfn: 00002400  mfn: 0010ae00
(XEN)  gfn: 00002600  mfn: 0021fa00
(XEN)  gfn: 00002800  mfn: 0010ac00
(XEN)  gfn: 00002a00  mfn: 0021f800
(XEN)  gfn: 00002c00  mfn: 0010aa00
(XEN)  gfn: 00002e00  mfn: 0021f600
(XEN)  gfn: 00003000  mfn: 0010a800
(XEN)  gfn: 00003200  mfn: 0021f400
(XEN)  gfn: 00003400  mfn: 0010a600
(XEN)  gfn: 00003600  mfn: 0021f200
(XEN)  gfn: 00003800  mfn: 0010a400
(XEN)  gfn: 00003a00  mfn: 0021f000
(XEN)  gfn: 00003c00  mfn: 0010a200
(XEN)  gfn: 00003e00  mfn: 0021ee00
(XEN)  gfn: 00004000  mfn: 0010a000
(XEN)  gfn: 00004200  mfn: 0021ec00
(XEN)  gfn: 00004400  mfn: 0010fe00
(XEN)  gfn: 00004600  mfn: 0021ea00
(XEN)  gfn: 00004800  mfn: 0010fc00
(XEN)  gfn: 00004a00  mfn: 0021e800
(XEN)  gfn: 00004c00  mfn: 0010fa00
(XEN)  gfn: 00004e00  mfn: 0021e600
(XEN)  gfn: 00005000  mfn: 0010f800
(XEN)  gfn: 00005200  mfn: 0021e400
(XEN)  gfn: 00005400  mfn: 0010f600
(XEN)  gfn: 00005600  mfn: 0021e200
(XEN)  gfn: 00005800  mfn: 0010f400
(XEN)  gfn: 00005a00  mfn: 0021e000
(XEN)  gfn: 00005c00  mfn: 0010f200
(XEN)  gfn: 00005e00  mfn: 00217e00
(XEN)  gfn: 00006000  mfn: 0010f000
(XEN)  gfn: 00006200  mfn: 00217c00
(XEN)  gfn: 00006400  mfn: 0010ee00
(XEN)  gfn: 00006600  mfn: 00217a00
(XEN)  gfn: 00006800  mfn: 0010ec00
(XEN)  gfn: 00006a00  mfn: 00217800
(XEN)  gfn: 00006c00  mfn: 0010ea00
(XEN)  gfn: 00006e00  mfn: 00217600
(XEN)  gfn: 00007000  mfn: 0010e800
(XEN)  gfn: 00007200  mfn: 00217400
(XEN)  gfn: 00007400  mfn: 0010e600
(XEN)  gfn: 00007600  mfn: 00217200
(XEN)  gfn: 00007800  mfn: 0010e400
(XEN)  gfn: 00007a00  mfn: 00217000
(XEN)  gfn: 00007c00  mfn: 0010e200
(XEN)  gfn: 00007e00  mfn: 00216e00
(XEN)  gfn: 00008000  mfn: 0010e000
(XEN)  gfn: 00008200  mfn: 00216c00
(XEN)  gfn: 00008400  mfn: 0010de00
(XEN)  gfn: 00008600  mfn: 00216a00
(XEN)  gfn: 00008800  mfn: 0010dc00
(XEN)  gfn: 00008a00  mfn: 00216800
(XEN)  gfn: 00008c00  mfn: 0010da00
(XEN)  gfn: 00008e00  mfn: 00216600
(XEN)  gfn: 00009000  mfn: 0010d800
(XEN)  gfn: 00009200  mfn: 00216400
(XEN)  gfn: 00009400  mfn: 0010d600
(XEN)  gfn: 00009600  mfn: 00216200
(XEN)  gfn: 00009800  mfn: 0010d400
(XEN)  gfn: 00009a00  mfn: 00216000
(XEN)  gfn: 00009c00  mfn: 0010d200
(XEN)  gfn: 00009e00  mfn: 00215e00
(XEN)  gfn: 0000a000  mfn: 0010d000
(XEN)  gfn: 0000a200  mfn: 00215c00
(XEN)  gfn: 0000a400  mfn: 0010ce00
(XEN)  gfn: 0000a600  mfn: 00215a00
(XEN)  gfn: 0000a800  mfn: 0010cc00
(XEN)  gfn: 0000aa00  mfn: 00215800
(XEN)  gfn: 0000ac00  mfn: 0010ca00
(XEN)  gfn: 0000ae00  mfn: 00215600
(XEN)  gfn: 0000b000  mfn: 0010c800
(XEN)  gfn: 0000b200  mfn: 00215400
(XEN)  gfn: 0000b400  mfn: 0010c600
(XEN)  gfn: 0000b600  mfn: 00215200
(XEN)  gfn: 0000b800  mfn: 0010c400
(XEN)  gfn: 0000ba00  mfn: 00215000
(XEN)  gfn: 0000bc00  mfn: 0010c200
(XEN)  gfn: 0000be00  mfn: 00214e00
(XEN)  gfn: 0000c000  mfn: 0010c000
(XEN)  gfn: 0000c200  mfn: 00214c00
(XEN)  gfn: 0000c400  mfn: 0011fe00
(XEN)  gfn: 0000c600  mfn: 00214a00
(XEN)  gfn: 0000c800  mfn: 0011fc00
(XEN)  gfn: 0000ca00  mfn: 00214800
(XEN)  gfn: 0000cc00  mfn: 0011fa00
(XEN)  gfn: 0000ce00  mfn: 00214600
(XEN)  gfn: 0000d000  mfn: 0011f800
(XEN)  gfn: 0000d200  mfn: 00214400
(XEN)  gfn: 0000d400  mfn: 0011f600
(XEN)  gfn: 0000d600  mfn: 00214200
(XEN)  gfn: 0000d800  mfn: 0011f400
(XEN)  gfn: 0000da00  mfn: 00214000
(XEN)  gfn: 0000dc00  mfn: 0011f200
(XEN)  gfn: 0000de00  mfn: 00213e00
(XEN)  gfn: 0000e000  mfn: 0011f000
(XEN)  gfn: 0000e200  mfn: 00213c00
(XEN)  gfn: 0000e400  mfn: 0011ee00
(XEN)  gfn: 0000e600  mfn: 00213a00
(XEN)  gfn: 0000e800  mfn: 0011ec00
(XEN)  gfn: 0000ea00  mfn: 00213800
(XEN)  gfn: 0000ec00  mfn: 0011ea00
(XEN)  gfn: 0000ee00  mfn: 00213600
(XEN)  gfn: 0000f000  mfn: 0011e800
(XEN)  gfn: 0000f200  mfn: 00213400
(XEN)  gfn: 0000f400  mfn: 0011e600
(XEN)  gfn: 0000f600  mfn: 00213200
(XEN)  gfn: 0000f800  mfn: 0011e400
(XEN)  gfn: 0000fa00  mfn: 00213000
(XEN)  gfn: 0000fc00  mfn: 0011e200
(XEN)  gfn: 0000fe00  mfn: 00212e00
(XEN)  gfn: 00010000  mfn: 0011e000
(XEN)  gfn: 00010200  mfn: 00212c00
(XEN)  gfn: 00010400  mfn: 0011de00
(XEN)  gfn: 00010600  mfn: 00212a00
(XEN)  gfn: 00010800  mfn: 0011dc00
(XEN)  gfn: 00010a00  mfn: 00212800
(XEN)  gfn: 00010c00  mfn: 0011da00
(XEN)  gfn: 00010e00  mfn: 00212600
(XEN)  gfn: 00011000  mfn: 0011d800
(XEN)  gfn: 00011200  mfn: 00212400
(XEN)  gfn: 00011400  mfn: 0011d600
(XEN)  gfn: 00011600  mfn: 00212200
(XEN)  gfn: 00011800  mfn: 0011d400
(XEN)  gfn: 00011a00  mfn: 00212000
(XEN)  gfn: 00011c00  mfn: 0011d200
(XEN)  gfn: 00011e00  mfn: 00211e00
(XEN)  gfn: 00012000  mfn: 0011d000
(XEN)  gfn: 00012200  mfn: 00211c00
(XEN)  gfn: 00012400  mfn: 0011ce00
(XEN)  gfn: 00012600  mfn: 00211a00
(XEN)  gfn: 00012800  mfn: 0011cc00
(XEN)  gfn: 00012a00  mfn: 00211800
(XEN)  gfn: 00012c00  mfn: 0011ca00
(XEN)  gfn: 00012e00  mfn: 00211600
(XEN)  gfn: 00013000  mfn: 0011c800
(XEN)  gfn: 00013200  mfn: 00211400
(XEN)  gfn: 00013400  mfn: 0011c600
(XEN)  gfn: 00013600  mfn: 00211200
(XEN)  gfn: 00013800  mfn: 0011c400
(XEN)  gfn: 00013a00  mfn: 00211000
(XEN)  gfn: 00013c00  mfn: 0011c200
(XEN)  gfn: 00013e00  mfn: 00210e00
(XEN)  gfn: 00014000  mfn: 0011c000
(XEN)  gfn: 00014200  mfn: 00210c00
(XEN)  gfn: 00014400  mfn: 0011be00
(XEN)  gfn: 00014600  mfn: 00210a00
(XEN)  gfn: 00014800  mfn: 0011bc00
(XEN)  gfn: 00014a00  mfn: 00210800
(XEN)  gfn: 00014c00  mfn: 0011ba00
(XEN)  gfn: 00014e00  mfn: 00210600
(XEN)  gfn: 00015000  mfn: 0011b800
(XEN)  gfn: 00015200  mfn: 00210400
(XEN)  gfn: 00015400  mfn: 0011b600
(XEN)  gfn: 00015600  mfn: 00210200
(XEN)  gfn: 00015800  mfn: 0011b400
(XEN)  gfn: 00015a00  mfn: 00210000
(XEN)  gfn: 00015c00  mfn: 0011b200
(XEN)  gfn: 00015e00  mfn: 0020fe00
(XEN)  gfn: 00016000  mfn: 0011b000
(XEN)  gfn: 00016200  mfn: 0020fc00
(XEN)  gfn: 00016400  mfn: 0011ae00
(XEN)  gfn: 00016600  mfn: 0020fa00
(XEN)  gfn: 00016800  mfn: 0011ac00
(XEN)  gfn: 00016a00  mfn: 0020f800
(XEN)  gfn: 00016c00  mfn: 0011aa00
(XEN)  gfn: 00016e00  mfn: 0020f600
(XEN)  gfn: 00017000  mfn: 0011a800
(XEN)  gfn: 00017200  mfn: 0020f400
(XEN)  gfn: 00017400  mfn: 0011a600
(XEN)  gfn: 00017600  mfn: 0020f200
(XEN)  gfn: 00017800  mfn: 0011a400
(XEN)  gfn: 00017a00  mfn: 0020f000
(XEN)  gfn: 00017c00  mfn: 0011a200
(XEN)  gfn: 00017e00  mfn: 0020ee00
(XEN)  gfn: 00018000  mfn: 0011a000
(XEN)  gfn: 00018200  mfn: 0020ec00
(XEN)  gfn: 00018400  mfn: 00119e00
(XEN)  gfn: 00018600  mfn: 0020ea00
(XEN)  gfn: 00018800  mfn: 00119c00
(XEN)  gfn: 00018a00  mfn: 0020e800
(XEN)  gfn: 00018c00  mfn: 00119a00
(XEN)  gfn: 00018e00  mfn: 0020e600
(XEN)  gfn: 00019000  mfn: 00119800
(XEN)  gfn: 00019200  mfn: 0020e400
(XEN)  gfn: 00019400  mfn: 00119600
(XEN)  gfn: 00019600  mfn: 0020e200
(XEN)  gfn: 00019800  mfn: 00119400
(XEN)  gfn: 00019a00  mfn: 0020e000
(XEN)  gfn: 00019c00  mfn: 00119200
(XEN)  gfn: 00019e00  mfn: 0020de00
(XEN)  gfn: 0001a000  mfn: 00119000
(XEN)  gfn: 0001a200  mfn: 0020dc00
(XEN)  gfn: 0001a400  mfn: 00118e00
(XEN)  gfn: 0001a600  mfn: 0020da00
(XEN)  gfn: 0001a800  mfn: 00118c00
(XEN)  gfn: 0001aa00  mfn: 0020d800
(XEN)  gfn: 0001ac00  mfn: 00118a00
(XEN)  gfn: 0001ae00  mfn: 0020d600
(XEN)  gfn: 0001b000  mfn: 00118800
(XEN)  gfn: 0001b200  mfn: 0020d400
(XEN)  gfn: 0001b400  mfn: 00118600
(XEN)  gfn: 0001b600  mfn: 0020d200
(XEN)  gfn: 0001b800  mfn: 00118400
(XEN)  gfn: 0001ba00  mfn: 0020d000
(XEN)  gfn: 0001bc00  mfn: 00118200
(XEN)  gfn: 0001be00  mfn: 0020ce00
(XEN)  gfn: 0001c000  mfn: 00118000
(XEN)  gfn: 0001c200  mfn: 0020cc00
(XEN)  gfn: 0001c400  mfn: 00117e00
(XEN)  gfn: 0001c600  mfn: 0020ca00
(XEN)  gfn: 0001c800  mfn: 00117c00
(XEN)  gfn: 0001ca00  mfn: 0020c800
(XEN)  gfn: 0001cc00  mfn: 00117a00
(XEN)  gfn: 0001ce00  mfn: 0020c600
(XEN)  gfn: 0001d000  mfn: 00117800
(XEN)  gfn: 0001d200  mfn: 0020c400
(XEN)  gfn: 0001d400  mfn: 00117600
(XEN)  gfn: 0001d600  mfn: 0020c200
(XEN)  gfn: 0001d800  mfn: 00117400
(XEN)  gfn: 0001da00  mfn: 0020c000
(XEN)  gfn: 0001dc00  mfn: 00117200
(XEN)  gfn: 0001de00  mfn: 0020be00
(XEN)  gfn: 0001e000  mfn: 00117000
(XEN)  gfn: 0001e200  mfn: 0020bc00
(XEN)  gfn: 0001e400  mfn: 00116e00
(XEN)  gfn: 0001e600  mfn: 0020ba00
(XEN)  gfn: 0001e800  mfn: 00116c00
(XEN)  gfn: 0001ea00  mfn: 0020b800
(XEN)  gfn: 0001ec00  mfn: 00116a00
(XEN)  gfn: 0001ee00  mfn: 0020b600
(XEN)  gfn: 0001f000  mfn: 00116800
(XEN)  gfn: 0001f200  mfn: 0020b400
(XEN)  gfn: 0001f400  mfn: 00116600
(XEN)  gfn: 0001f600  mfn: 0020b200
(XEN)  gfn: 0001f800  mfn: 00116400
(XEN)  gfn: 0001fa00  mfn: 0020b000
(XEN)  gfn: 0001fc00  mfn: 00116200
(XEN)  gfn: 0001fe00  mfn: 0020ae00
(XEN)  gfn: 00020000  mfn: 00116000
(XEN)  gfn: 00020200  mfn: 0020ac00
(XEN)  gfn: 00020400  mfn: 00115e00
(XEN)  gfn: 00020600  mfn: 0020aa00
(XEN)  gfn: 00020800  mfn: 00115c00
(XEN)  gfn: 00020a00  mfn: 0020a800
(XEN)  gfn: 00020c00  mfn: 00115a00
(XEN)  gfn: 00020e00  mfn: 0020a600
(XEN)  gfn: 00021000  mfn: 00115800
(XEN)  gfn: 00021200  mfn: 0020a400
(XEN)  gfn: 00021400  mfn: 00115600
(XEN)  gfn: 00021600  mfn: 0020a200
(XEN)  gfn: 00021800  mfn: 00115400
(XEN)  gfn: 00021a00  mfn: 0020a000
(XEN)  gfn: 00021c00  mfn: 00115200
(XEN)  gfn: 00021e00  mfn: 00209e00
(XEN)  gfn: 00022000  mfn: 00115000
(XEN)  gfn: 00022200  mfn: 00209c00
(XEN)  gfn: 00022400  mfn: 00114e00
(XEN)  gfn: 00022600  mfn: 00209a00
(XEN)  gfn: 00022800  mfn: 00114c00
(XEN)  gfn: 00022a00  mfn: 00209800
(XEN)  gfn: 00022c00  mfn: 00114a00
(XEN)  gfn: 00022e00  mfn: 00209600
(XEN)  gfn: 00023000  mfn: 00114800
(XEN)  gfn: 00023200  mfn: 00209400
(XEN)  gfn: 00023400  mfn: 00114600
(XEN)  gfn: 00023600  mfn: 00209200
(XEN)  gfn: 00023800  mfn: 00114400
(XEN)  gfn: 00023a00  mfn: 00209000
(XEN)  gfn: 00023c00  mfn: 00114200
(XEN)  gfn: 00023e00  mfn: 00208e00
(XEN)  gfn: 00024000  mfn: 00114000
(XEN)  gfn: 00024200  mfn: 00208c00
(XEN)  gfn: 00024400  mfn: 00113e00
(XEN)  gfn: 00024600  mfn: 00208a00
(XEN)  gfn: 00024800  mfn: 00113c00
(XEN)  gfn: 00024a00  mfn: 00208800
(XEN)  gfn: 00024c00  mfn: 00113a00
(XEN)  gfn: 00024e00  mfn: 00208600
(XEN)  gfn: 00025000  mfn: 00113800
(XEN)  gfn: 00025200  mfn: 00208400
(XEN)  gfn: 00025400  mfn: 00113600
(XEN)  gfn: 00025600  mfn: 00208200
(XEN)  gfn: 00025800  mfn: 00113400
(XEN)  gfn: 00025a00  mfn: 00208000
(XEN)  gfn: 00025c00  mfn: 00113200
(XEN)  gfn: 00025e00  mfn: 00207e00
(XEN)  gfn: 00026000  mfn: 00113000
(XEN)  gfn: 00026200  mfn: 00207c00
(XEN)  gfn: 00026400  mfn: 00112e00
(XEN)  gfn: 00026600  mfn: 00207a00
(XEN)  gfn: 00026800  mfn: 00112c00
(XEN)  gfn: 00026a00  mfn: 00207800
(XEN)  gfn: 00026c00  mfn: 00112a00
(XEN)  gfn: 00026e00  mfn: 00207600
(XEN)  gfn: 00027000  mfn: 00112800
(XEN)  gfn: 00027200  mfn: 00207400
(XEN)  gfn: 00027400  mfn: 00112600
(XEN)  gfn: 00027600  mfn: 00207200
(XEN)  gfn: 00027800  mfn: 00112400
(XEN)  gfn: 00027a00  mfn: 00207000
(XEN)  gfn: 00027c00  mfn: 00112200
(XEN)  gfn: 00027e00  mfn: 00206e00
(XEN)  gfn: 00028000  mfn: 00112000
(XEN)  gfn: 00028200  mfn: 00206c00
(XEN)  gfn: 00028400  mfn: 00111e00
(XEN)  gfn: 00028600  mfn: 00206a00
(XEN)  gfn: 00028800  mfn: 00111c00
(XEN)  gfn: 00028a00  mfn: 00206800
(XEN)  gfn: 00028c00  mfn: 00111a00
(XEN)  gfn: 00028e00  mfn: 00206600
(XEN)  gfn: 00029000  mfn: 00111800
(XEN)  gfn: 00029200  mfn: 00206400
(XEN)  gfn: 00029400  mfn: 00111600
(XEN)  gfn: 00029600  mfn: 00206200
(XEN)  gfn: 00029800  mfn: 00111400
(XEN)  gfn: 00029a00  mfn: 00206000
(XEN)  gfn: 00029c00  mfn: 00111200
(XEN)  gfn: 00029e00  mfn: 00205e00
(XEN)  gfn: 0002a000  mfn: 00111000
(XEN)  gfn: 0002a200+  mfn: 00205c00
(XEN)  gfn: 0002a400  mfn: 00110e00
(XEN)  gfn: 0002a600  mfn: 00205a00
(XEN)  gfn: 0002a800  mfn: 00110c00
(XEN)  gfn: 0002aa00  mfn: 00205800
(XEN)  gfn: 0002ac00  mfn: 00110a00
(XEN)  gfn: 0002ae00  mfn: 00205600
(XEN)  gfn: 0002b000  mfn: 00110800
(XEN)  gfn: 0002b200  mfn: 00205400
(XEN)  gfn: 0002b400  mfn: 00110600
(XEN)  gfn: 0002b600  mfn: 00205200
(XEN)  gfn: 0002b800  mfn: 00110400
(XEN)  gfn: 0002ba00  mfn: 00205000
(XEN)  gfn: 0002bc00  mfn: 00110200
(XEN)  gfn: 0002be00  mfn: 00204e00
(XEN)  gfn: 0002c000  mfn: 00110000
(XEN)  gfn: 0002c200  mfn: 00204c00
(XEN)  gfn: 0002c400  mfn: 0013fe00
(XEN)  gfn: 0002c600  mfn: 00204a00
(XEN)  gfn: 0002c800  mfn: 0013fc00
(XEN)  gfn: 0002ca00  mfn: 00204800
(XEN)  gfn: 0002cc00  mfn: 0013fa00
(XEN)  gfn: 0002ce00  mfn: 00204600
(XEN)  gfn: 0002d000  mfn: 0013f800
(XEN)  gfn: 0002d200  mfn: 00204400
(XEN)  gfn: 0002d400  mfn: 0013f600
(XEN)  gfn: 0002d600  mfn: 00204200
(XEN)  gfn: 0002d800  mfn: 0013f400
(XEN)  gfn: 0002da00  mfn: 00204000
(XEN)  gfn: 0002dc00  mfn: 0013f200
(XEN)  gfn: 0002de00  mfn: 00203e00
(XEN)  gfn: 0002e000  mfn: 0013f000
(XEN)  gfn: 0002e200  mfn: 00203c00
(XEN)  gfn: 0002e400  mfn: 0013ee00
(XEN)  gfn: 0002e600  mfn: 00203a00
(XEN)  gfn: 0002e800  mfn: 0013ec00
(XEN)  gfn: 0002ea00  mfn: 00203800
(XEN)  gfn: 0002ec00  mfn: 0013ea00
(XEN)  gfn: 0002ee00  mfn: 00203600
(XEN)  gfn: 0002f000  mfn: 0013e800
(XEN)  gfn: 0002f200  mfn: 00203400
(XEN)  gfn: 0002f400  mfn: 0013e600
(XEN)  gfn: 0002f600  mfn: 00203200
(XEN)  gfn: 0002f800  mfn: 0013e400
(XEN)  gfn: 0002fa00  mfn: 00203000
(XEN)  gfn: 0002fc00  mfn: 0013e200
(XEN)  gfn: 0002fe00  mfn: 00202e00
(XEN)  gfn: 00030000  mfn: 0013e000
(XEN)  gfn: 00030200  mfn: 00202c00
(XEN)  gfn: 00030400  mfn: 0013de00
(XEN)  gfn: 00030600  mfn: 00202a00
(XEN)  gfn: 00030800  mfn: 0013dc00
(XEN)  gfn: 00030a00  mfn: 00202800
(XEN)  gfn: 00030c00  mfn: 0013da00
(XEN)  gfn: 00030e00  mfn: 00202600
(XEN)  gfn: 00031000  mfn: 0013d800
(XEN)  gfn: 00031200  mfn: 00202400
(XEN)  gfn: 00031400  mfn: 0013d600
(XEN)  gfn: 00031600  mfn: 00202200
(XEN)  gfn: 00031800  mfn: 0013d400
(XEN)  gfn: 00031a00  mfn: 00202000
(XEN)  gfn: 00031c00  mfn: 0013d200
(XEN)  gfn: 00031e00  mfn: 00201e00
(XEN)  gfn: 00032000  mfn: 0013d000
(XEN)  gfn: 00032200  mfn: 00201c00
(XEN)  gfn: 00032400  mfn: 0013ce00
(XEN)  gfn: 00032600  mfn: 00201a00
(XEN)  gfn: 00032800  mfn: 0013cc00
(XEN)  gfn: 00032a00  mfn: 00201800
(XEN)  gfn: 00032c00  mfn: 0013ca00
(XEN)  gfn: 00032e00  mfn: 00201600
(XEN)  gfn: 00033000  mfn: 0013c800
(XEN)  gfn: 00033200  mfn: 00201400
(XEN)  gfn: 00033400  mfn: 0013c600
(XEN)  gfn: 00033600  mfn: 00201200
(XEN)  gfn: 00033800  mfn: 0013c400
(XEN)  gfn: 00033a00  mfn: 00201000
(XEN)  gfn: 00033c00  mfn: 0013c200
(XEN)  gfn: 00033e00  mfn: 00200e00
(XEN)  gfn: 00034000  mfn: 0013c000
(XEN)  gfn: 00034200  mfn: 00200c00
(XEN)  gfn: 00034400  mfn: 0013be00
(XEN)  gfn: 00034600  mfn: 00200a00
(XEN)  gfn: 00034800  mfn: 0013bc00
(XEN)  gfn: 00034a00  mfn: 00200800
(XEN)  gfn: 00034c00  mfn: 0013ba00
(XEN)  gfn: 00034e00  mfn: 00200600
(XEN)  gfn: 00035000  mfn: 0013b800
(XEN)  gfn: 00035200  mfn: 00200400
(XEN)  gfn: 00035400  mfn: 0013b600
(XEN)  gfn: 00035600  mfn: 00200200
(XEN)  gfn: 00035800  mfn: 0013b400
(XEN)  gfn: 00035a00  mfn: 00200000
(XEN)  gfn: 00035c00  mfn: 0013b200
(XEN)  gfn: 00035e00  mfn: 0023fe00
(XEN)  gfn: 00036000  mfn: 0013b000
(XEN)  gfn: 00036200  mfn: 0023fc00
(XEN)  gfn: 00036400  mfn: 0013ae00
(XEN)  gfn: 00036600  mfn: 0023fa00
(XEN)  gfn: 00036800  mfn: 0013ac00
(XEN)  gfn: 00036a00  mfn: 0023f800
(XEN)  gfn: 00036c00  mfn: 0013aa00
(XEN)  gfn: 00036e00  mfn: 0023f600
(XEN)  gfn: 00037000  mfn: 0013a800
(XEN)  gfn: 00037200  mfn: 0023f400
(XEN)  gfn: 00037400  mfn: 0013a600
(XEN)  gfn: 00037600  mfn: 0023f200
(XEN)  gfn: 00037800  mfn: 0013a400
(XEN)  gfn: 00037a00  mfn: 0023f000
(XEN)  gfn: 00037c00  mfn: 0013a200
(XEN)  gfn: 00037e00  mfn: 0023ee00
(XEN)  gfn: 00038000  mfn: 0013a000
(XEN)  gfn: 00038200  mfn: 0023ec00
(XEN)  gfn: 00038400  mfn: 00139e00
(XEN)  gfn: 00038600  mfn: 0023ea00
(XEN)  gfn: 00038800  mfn: 00139c00
(XEN)  gfn: 00038a00  mfn: 0023e800
(XEN)  gfn: 00038c00  mfn: 00139a00
(XEN)  gfn: 00038e00  mfn: 0023e600
(XEN)  gfn: 00039000  mfn: 00139800
(XEN)  gfn: 00039200  mfn: 0023e400
(XEN)  gfn: 00039400  mfn: 00139600
(XEN)  gfn: 00039600  mfn: 0023e200
(XEN)  gfn: 00039800  mfn: 00139400
(XEN)  gfn: 00039a00  mfn: 0023e000
(XEN)  gfn: 00039c00  mfn: 00139200
(XEN)  gfn: 00039e00  mfn: 0023de00
(XEN)  gfn: 0003a000  mfn: 00139000
(XEN)  gfn: 0003a200  mfn: 0023dc00
(XEN)  gfn: 0003a400  mfn: 00138e00
(XEN)  gfn: 0003a600  mfn: 0023da00
(XEN)  gfn: 0003a800  mfn: 00138c00
(XEN)  gfn: 0003aa00  mfn: 0023d800
(XEN)  gfn: 0003ac00  mfn: 00138a00
(XEN)  gfn: 0003ae00  mfn: 0023d600
(XEN)  gfn: 0003b000  mfn: 00138800
(XEN)  gfn: 0003b200  mfn: 0023d400
(XEN)  gfn: 0003b400  mfn: 00138600
(XEN)  gfn: 0003b600  mfn: 0023d200
(XEN)  gfn: 0003b800  mfn: 00138400
(XEN)  gfn: 0003ba00  mfn: 0023d000
(XEN)  gfn: 0003bc00  mfn: 00138200
(XEN)  gfn: 0003be00  mfn: 0023ce00
(XEN)  gfn: 0003c000  mfn: 00138000
(XEN)  gfn: 0003c200  mfn: 0023cc00
(XEN)  gfn: 0003c400  mfn: 00137e00
(XEN)  gfn: 0003c600  mfn: 0023ca00
(XEN)  gfn: 0003c800  mfn: 00137c00
(XEN)  gfn: 0003ca00  mfn: 0023c800
(XEN)  gfn: 0003cc00  mfn: 00137a00
(XEN)  gfn: 0003ce00  mfn: 0023c600
(XEN)  gfn: 0003d000  mfn: 00137800
(XEN)  gfn: 0003d200  mfn: 0023c400
(XEN)  gfn: 0003d400  mfn: 00137600
(XEN)  gfn: 0003d600  mfn: 0023c200
(XEN)  gfn: 0003d800  mfn: 00137400
(XEN)  gfn: 0003da00  mfn: 0023c000
(XEN)  gfn: 0003dc00  mfn: 00137200
(XEN)  gfn: 0003de00  mfn: 0023be00
(XEN)  gfn: 0003e000  mfn: 00137000
(XEN)  gfn: 0003e200  mfn: 0023bc00
(XEN)  gfn: 0003e400  mfn: 00136e00
(XEN)  gfn: 0003e600  mfn: 0023ba00
(XEN)  gfn: 0003e800  mfn: 00136c00
(XEN)  gfn: 0003ea00  mfn: 0023b800
(XEN)  gfn: 0003ec00  mfn: 00136a00
(XEN)  gfn: 0003ee00  mfn: 0023b600
(XEN)  gfn: 0003f000  mfn: 00136800
(XEN)  gfn: 0003f200  mfn: 0023b400
(XEN)  gfn: 0003f400  mfn: 00136600
(XEN)  gfn: 0003f600  mfn: 0023b200
(XEN)  gfn: 0003f800  mfn: 00136400
(XEN)  gfn: 0003fa00  mfn: 0023b000
(XEN)  gfn: 0003fc00  mfn: 00136200
(XEN)  gfn: 0003fe00  mfn: 0023ae00
(XEN)  gfn: 00040000  mfn: 00040000
(XEN)  gfn: 00080000  mfn: 0023ac00
(XEN)  gfn: 00080200  mfn: 00136000
(XEN)  gfn: 00080400  mfn: 0023aa00
(XEN)  gfn: 00080600  mfn: 00135e00
(XEN)  gfn: 00080800  mfn: 0023a800
(XEN)  gfn: 00080a00  mfn: 00135c00
(XEN)  gfn: 00080c00  mfn: 0023a600
(XEN)  gfn: 00080e00  mfn: 00135a00
(XEN)  gfn: 00081000  mfn: 0023a400
(XEN)  gfn: 00081200  mfn: 00135800
(XEN)  gfn: 00081400  mfn: 0023a200
(XEN)  gfn: 00081600  mfn: 00135600
(XEN)  gfn: 00081800  mfn: 0023a000
(XEN)  gfn: 00081a00  mfn: 00135400
(XEN)  gfn: 00081c00  mfn: 00239e00
(XEN)  gfn: 00081e00  mfn: 00135200
(XEN)  gfn: 00082000  mfn: 00239c00
(XEN)  gfn: 00082200  mfn: 00135000
(XEN)  gfn: 00082400  mfn: 00239a00
(XEN)  gfn: 00082600  mfn: 00134e00
(XEN)  gfn: 00082800  mfn: 00239800
(XEN)  gfn: 00082a00  mfn: 00134c00
(XEN)  gfn: 00082c00  mfn: 00239600
(XEN)  gfn: 00082e00  mfn: 00134a00
(XEN)  gfn: 00083000  mfn: 00239400
(XEN)  gfn: 00083200  mfn: 00134800
(XEN)  gfn: 00083400  mfn: 00239200
(XEN)  gfn: 00083600  mfn: 00134600
(XEN)  gfn: 00083800  mfn: 00239000
(XEN)  gfn: 00083a00  mfn: 00134400
(XEN)  gfn: 00083c00  mfn: 00238e00
(XEN)  gfn: 00083e00  mfn: 00134200
(XEN)  gfn: 00084000  mfn: 00238c00
(XEN)  gfn: 00084200  mfn: 00134000
(XEN)  gfn: 00084400  mfn: 00238a00
(XEN)  gfn: 00084600  mfn: 00133e00
(XEN)  gfn: 00084800  mfn: 00238800
(XEN)  gfn: 00084a00  mfn: 00133c00
(XEN)  gfn: 00084c00  mfn: 00238600
(XEN)  gfn: 00084e00  mfn: 00133a00
(XEN)  gfn: 00085000  mfn: 00238400
(XEN)  gfn: 00085200  mfn: 00133800
(XEN)  gfn: 00085400  mfn: 00238200
(XEN)  gfn: 00085600  mfn: 00133600
(XEN)  gfn: 00085800  mfn: 00238000
(XEN)  gfn: 00085a00  mfn: 00133400
(XEN)  gfn: 00085c00  mfn: 00237e00
(XEN)  gfn: 00085e00  mfn: 00133200
(XEN)  gfn: 00086000  mfn: 00237c00
(XEN)  gfn: 00086200  mfn: 00133000
(XEN)  gfn: 00086400  mfn: 00237a00
(XEN)  gfn: 00086600  mfn: 00132e00
(XEN)  gfn: 00086800  mfn: 00237800
(XEN)  gfn: 00086a00  mfn: 00132c00
(XEN)  gfn: 00086c00  mfn: 00237600
(XEN)  gfn: 00086e00  mfn: 00132a00
(XEN)  gfn: 00087000  mfn: 00237400
(XEN)  gfn: 00087200  mfn: 00132800
(XEN)  gfn: 00087400  mfn: 00237200
(XEN)  gfn: 00087600  mfn: 00132600
(XEN)  gfn: 00087800  mfn: 00237000
(XEN)  gfn: 00087a00  mfn: 00132400
(XEN)  gfn: 00087c00  mfn: 00236e00
(XEN)  gfn: 00087e00  mfn: 00132200
(XEN)  gfn: 00088000  mfn: 00236c00
(XEN)  gfn: 00088200  mfn: 00132000
(XEN)  gfn: 00088400  mfn: 00236a00
(XEN)  gfn: 00088600  mfn: 00131e00
(XEN)  gfn: 00088800  mfn: 00236800
(XEN)  gfn: 00088a00  mfn: 00131c00
(XEN)  gfn: 00088c00  mfn: 00236600
(XEN)  gfn: 00088e00  mfn: 00131a00
(XEN)  gfn: 00089000  mfn: 00236400
(XEN)  gfn: 00089200  mfn: 00131800
(XEN)  gfn: 00089400  mfn: 00236200
(XEN)  gfn: 00089600  mfn: 00131600
(XEN)  gfn: 00089800  mfn: 00236000
(XEN)  gfn: 00089a00  mfn: 00131400
(XEN)  gfn: 00089c00  mfn: 00235e00
(XEN)  gfn: 00089e00  mfn: 00131200
(XEN)  gfn: 0008a000  mfn: 00235c00
(XEN)  gfn: 0008a200  mfn: 00131000
(XEN)  gfn: 0008a400  mfn: 00235a00
(XEN)  gfn: 0008a600  mfn: 00130e00
(XEN)  gfn: 0008a800  mfn: 00235800
(XEN)  gfn: 0008aa00  mfn: 00130c00
(XEN)  gfn: 0008ac00  mfn: 00235600
(XEN)  gfn: 0008ae00  mfn: 00130a00
(XEN)  gfn: 0008b000  mfn: 00235400
(XEN)  gfn: 0008b200  mfn: 00130800
(XEN)  gfn: 0008b400  mfn: 00235200
(XEN)  gfn: 0008b600  mfn: 00130600
(XEN)  gfn: 0008b800  mfn: 00235000
(XEN)  gfn: 0008ba00  mfn: 00130400
(XEN)  gfn: 0008bc00  mfn: 00234e00
(XEN)  gfn: 0008be00  mfn: 00130200
(XEN)  gfn: 0008c000  mfn: 00234c00
(XEN)  gfn: 0008c200  mfn: 00130000
(XEN)  gfn: 0008c400  mfn: 00234a00
(XEN)  gfn: 0008c600  mfn: 0012fe00
(XEN)  gfn: 0008c800  mfn: 00234800
(XEN)  gfn: 0008ca00  mfn: 0012fc00
(XEN)  gfn: 0008cc00  mfn: 00234600
(XEN)  gfn: 0008ce00  mfn: 0012fa00
(XEN)  gfn: 0008d000  mfn: 00234400
(XEN)  gfn: 0008d200  mfn: 0012f800
(XEN)  gfn: 0008d400  mfn: 00234200
(XEN)  gfn: 0008d600  mfn: 0012f600
(XEN)  gfn: 0008d800  mfn: 00234000
(XEN)  gfn: 0008da00  mfn: 0012f400
(XEN)  gfn: 0008dc00  mfn: 00233e00
(XEN)  gfn: 0008de00  mfn: 0012f200
(XEN)  gfn: 0008e000  mfn: 00233c00
(XEN)  gfn: 0008e200  mfn: 0012f000
(XEN)  gfn: 0008e400  mfn: 00233a00
(XEN)  gfn: 0008e600  mfn: 0012ee00
(XEN)  gfn: 0008e800  mfn: 00233800
(XEN)  gfn: 0008ea00  mfn: 0012ec00
(XEN)  gfn: 0008ec00  mfn: 00233600
(XEN)  gfn: 0008ee00  mfn: 0012ea00
(XEN)  gfn: 0008f000  mfn: 00233400
(XEN)  gfn: 0008f200  mfn: 0012e800
(XEN)  gfn: 0008f400  mfn: 00233200
(XEN)  gfn: 0008f600  mfn: 0012e600
(XEN)  gfn: 0008f800  mfn: 00233000
(XEN)  gfn: 0008fa00  mfn: 0012e400
(XEN)  gfn: 0008fc00  mfn: 00232e00
(XEN)  gfn: 0008fe00  mfn: 0012e200
(XEN)  gfn: 00090000  mfn: 00232c00
(XEN)  gfn: 00090200  mfn: 0012e000
(XEN)  gfn: 00090400  mfn: 00232a00
(XEN)  gfn: 00090600  mfn: 0012de00
(XEN)  gfn: 00090800  mfn: 00232800
(XEN)  gfn: 00090a00  mfn: 0012dc00
(XEN)  gfn: 00090c00  mfn: 00232600
(XEN)  gfn: 00090e00  mfn: 0012da00
(XEN)  gfn: 00091000  mfn: 00232400
(XEN)  gfn: 00091200  mfn: 0012d800
(XEN)  gfn: 00091400  mfn: 00232200
(XEN)  gfn: 00091600  mfn: 0012d600
(XEN)  gfn: 00091800  mfn: 00232000
(XEN)  gfn: 00091a00  mfn: 0012d400
(XEN)  gfn: 00091c00  mfn: 00231e00
(XEN)  gfn: 00091e00  mfn: 0012d200
(XEN)  gfn: 00092000  mfn: 00231c00
(XEN)  gfn: 00092200  mfn: 0012d000
(XEN)  gfn: 00092400  mfn: 00231a00
(XEN)  gfn: 00092600  mfn: 0012ce00
(XEN)  gfn: 00092800  mfn: 00231800
(XEN)  gfn: 00092a00  mfn: 0012cc00
(XEN)  gfn: 00092c00  mfn: 00231600
(XEN)  gfn: 00092e00  mfn: 0012ca00
(XEN)  gfn: 00093000  mfn: 00231400
(XEN)  gfn: 00093200  mfn: 0012c800
(XEN)  gfn: 00093400  mfn: 00231200
(XEN)  gfn: 00093600  mfn: 0012c600
(XEN)  gfn: 00093800  mfn: 00231000
(XEN)  gfn: 00093a00  mfn: 0012c400
(XEN)  gfn: 00093c00  mfn: 00230e00
(XEN)  gfn: 00093e00  mfn: 0012c200
(XEN)  gfn: 00094000  mfn: 00230c00
(XEN)  gfn: 00094200  mfn: 0012c000
(XEN)  gfn: 00094400  mfn: 00230a00
(XEN)  gfn: 00094600  mfn: 0012be00
(XEN)  gfn: 00094800  mfn: 00230800
(XEN)  gfn: 00094a00  mfn: 0012bc00
(XEN)  gfn: 00094c00  mfn: 00230600
(XEN)  gfn: 00094e00  mfn: 0012ba00
(XEN)  gfn: 00095000  mfn: 00230400
(XEN)  gfn: 00095200  mfn: 0012b800
(XEN)  gfn: 00095400  mfn: 00230200
(XEN)  gfn: 00095600  mfn: 0012b600
(XEN)  gfn: 00095800  mfn: 00230000
(XEN)  gfn: 00095a00  mfn: 0012b400
(XEN)  gfn: 00095c00  mfn: 0022fe00
(XEN)  gfn: 00095e00  mfn: 0012b200
(XEN)  gfn: 00096000  mfn: 0022fc00
(XEN)  gfn: 00096200  mfn: 0012b000
(XEN)  gfn: 00096400  mfn: 0022fa00
(XEN)  gfn: 00096600  mfn: 0012ae00
(XEN)  gfn: 00096800  mfn: 0022f800
(XEN)  gfn: 00096a00  mfn: 0012ac00
(XEN)  gfn: 00096c00  mfn: 0022f600
(XEN)  gfn: 00096e00  mfn: 0012aa00
(XEN)  gfn: 00097000  mfn: 0022f400
(XEN)  gfn: 00097200  mfn: 0012a800
(XEN)  gfn: 00097400  mfn: 0022f200
(XEN)  gfn: 00097600  mfn: 0012a600
(XEN)  gfn: 00097800  mfn: 0022f000
(XEN)  gfn: 00097a00  mfn: 0012a400
(XEN)  gfn: 00097c00  mfn: 0022ee00
(XEN)  gfn: 00097e00  mfn: 0012a200
(XEN)  gfn: 00098000  mfn: 0022ec00
(XEN)  gfn: 00098200  mfn: 0012a000
(XEN)  gfn: 00098400  mfn: 0022ea00
(XEN)  gfn: 00098600  mfn: 00129e00
(XEN)  gfn: 00098800  mfn: 0022e800
(XEN)  gfn: 00098a00  mfn: 00129c00
(XEN)  gfn: 00098c00  mfn: 0022e600
(XEN)  gfn: 00098e00  mfn: 00129a00
(XEN)  gfn: 00099000  mfn: 0022e400
(XEN)  gfn: 00099200  mfn: 00129800
(XEN)  gfn: 00099400  mfn: 0022e200
(XEN)  gfn: 00099600  mfn: 00129600
(XEN)  gfn: 00099800  mfn: 0022e000
(XEN)  gfn: 00099a00  mfn: 00129400
(XEN)  gfn: 00099c00  mfn: 0022de00
(XEN)  gfn: 00099e00  mfn: 00129200
(XEN)  gfn: 0009a000  mfn: 0022dc00
(XEN)  gfn: 0009a200  mfn: 00129000
(XEN)  gfn: 0009a400  mfn: 0022da00
(XEN)  gfn: 0009a600  mfn: 00128e00
(XEN)  gfn: 0009a800  mfn: 0022d800
(XEN)  gfn: 0009aa00  mfn: 00128c00
(XEN)  gfn: 0009ac00  mfn: 0022d600
(XEN)  gfn: 0009ae00  mfn: 00128a00
(XEN)  gfn: 0009b000  mfn: 0022d400
(XEN)  gfn: 0009b200  mfn: 00128800
(XEN)  gfn: 0009b400  mfn: 0022d200
(XEN)  gfn: 0009b600  mfn: 00128600
(XEN)  gfn: 0009b800  mfn: 0022d000
(XEN)  gfn: 0009ba00  mfn: 00128400
(XEN)  gfn: 0009bc00  mfn: 0022ce00
(XEN)  gfn: 0009be00  mfn: 00128200
(XEN)  gfn: 0009c000  mfn: 0022cc00
(XEN)  gfn: 0009c200  mfn: 00128000
(XEN)  gfn: 0009c400  mfn: 0022ca00
(XEN)  gfn: 0009c600  mfn: 00127e00
(XEN)  gfn: 0009c800  mfn: 0022c800
(XEN)  gfn: 0009ca00  mfn: 00127c00
(XEN)  gfn: 0009cc00  mfn: 0022c600
(XEN)  gfn: 0009ce00  mfn: 00127a00
(XEN)  gfn: 0009d000  mfn: 0022c400
(XEN)  gfn: 0009d200  mfn: 00127800
(XEN)  gfn: 0009d400  mfn: 0022c200
(XEN)  gfn: 0009d600  mfn: 00127600
(XEN)  gfn: 0009d800  mfn: 0022c000
(XEN)  gfn: 0009da00  mfn: 00127400
(XEN)  gfn: 0009dc00  mfn: 0022be00
(XEN)  gfn: 0009de00  mfn: 00127200
(XEN)  gfn: 0009e000  mfn: 0022bc00
(XEN)  gfn: 0009e200  mfn: 00127000
(XEN)  gfn: 0009e400  mfn: 0022ba00
(XEN)  gfn: 0009e600  mfn: 00126e00
(XEN)  gfn: 0009e800  mfn: 0022b800
(XEN)  gfn: 0009ea00  mfn: 00126c00
(XEN)  gfn: 0009ec00  mfn: 0022b600
(XEN)  gfn: 0009ee00  mfn: 00126a00
(XEN)  gfn: 0009f000  mfn: 0022b400
(XEN)  gfn: 0009f200  mfn: 00126800
(XEN)  gfn: 0009f400  mfn: 0022b200
(XEN)  gfn: 0009f600  mfn: 00126600
(XEN)  gfn: 0009f800  mfn: 0022b000
(XEN)  gfn: 0009fa00  mfn: 00126400
(XEN)  gfn: 0009fc00  mfn: 0022ae00
(XEN)  gfn: 0009fe00  mfn: 00126200
(XEN)  gfn: 000a0000  mfn: 0022ac00
(XEN)  gfn: 000a0200  mfn: 00126000
(XEN)  gfn: 000a0400  mfn: 0022aa00
(XEN)  gfn: 000a0600  mfn: 00125e00
(XEN)  gfn: 000a0800  mfn: 0022a800
(XEN)  gfn: 000a0a00  mfn: 00125c00
(XEN)  gfn: 000a0c00  mfn: 0022a600
(XEN)  gfn: 000a0e00  mfn: 00125a00
(XEN)  gfn: 000a1000  mfn: 0022a400
(XEN)  gfn: 000a1200  mfn: 00125800
(XEN)  gfn: 000a1400  mfn: 0022a200
(XEN)  gfn: 000a1600  mfn: 00125600
(XEN)  gfn: 000a1800  mfn: 0022a000
(XEN)  gfn: 000a1a00  mfn: 00125400
(XEN)  gfn: 000a1c00  mfn: 00229e00
(XEN)  gfn: 000a1e00  mfn: 00125200
(XEN)  gfn: 000a2000  mfn: 00229c00
(XEN)  gfn: 000a2200  mfn: 00125000
(XEN)  gfn: 000a2400  mfn: 00229a00
(XEN)  gfn: 000a2600  mfn: 00124e00
(XEN)  gfn: 000a2800  mfn: 00229800
(XEN)  gfn: 000a2a00  mfn: 00124c00
(XEN)  gfn: 000a2c00  mfn: 00229600
(XEN)  gfn: 000a2e00  mf+n: 00124a00
(XEN)  gfn: 000a3000  mfn: 00229400
(XEN)  gfn: 000a3200  mfn: 00124800
(XEN)  gfn: 000a3400  mfn: 00229200
(XEN)  gfn: 000a3600  mfn: 00124600
(XEN)  gfn: 000a3800  mfn: 00229000
(XEN)  gfn: 000a3a00  mfn: 00124400
(XEN)  gfn: 000a3c00  mfn: 00228e00
(XEN)  gfn: 000a3e00  mfn: 00124200
(XEN)  gfn: 000a4000  mfn: 00228c00
(XEN)  gfn: 000a4200  mfn: 00124000
(XEN)  gfn: 000a4400  mfn: 00228a00
(XEN)  gfn: 000a4600  mfn: 00123e00
(XEN)  gfn: 000a4800  mfn: 00228800
(XEN)  gfn: 000a4a00  mfn: 00123c00
(XEN)  gfn: 000a4c00  mfn: 00228600
(XEN)  gfn: 000a4e00  mfn: 00123a00
(XEN)  gfn: 000a5000  mfn: 00228400
(XEN)  gfn: 000a5200  mfn: 00123800
(XEN)  gfn: 000a5400  mfn: 00228200
(XEN)  gfn: 000a5600  mfn: 00123600
(XEN)  gfn: 000a5800  mfn: 00228000
(XEN)  gfn: 000a5a00  mfn: 00123400
(XEN)  gfn: 000a5c00  mfn: 00227e00
(XEN)  gfn: 000a5e00  mfn: 00123200
(XEN)  gfn: 000a6000  mfn: 00227c00
(XEN)  gfn: 000a6200  mfn: 00123000
(XEN)  gfn: 000a6400  mfn: 00227a00
(XEN)  gfn: 000a6600  mfn: 00122e00
(XEN)  gfn: 000a6800  mfn: 00227800
(XEN)  gfn: 000a6a00  mfn: 00122c00
(XEN)  gfn: 000a6c00  mfn: 00227600
(XEN)  gfn: 000a6e00  mfn: 00122a00
(XEN)  gfn: 000a7000  mfn: 00227400
(XEN)  gfn: 000a7200  mfn: 00122800
(XEN)  gfn: 000a7400  mfn: 00227200
(XEN)  gfn: 000a7600  mfn: 00122600
(XEN)  gfn: 000a7800  mfn: 00227000
(XEN)  gfn: 000a7a00  mfn: 00122400
(XEN)  gfn: 000a7c00  mfn: 00226e00
(XEN)  gfn: 000a7e00  mfn: 00122200
(XEN)  gfn: 000a8000  mfn: 00226c00
(XEN)  gfn: 000a8200  mfn: 00122000
(XEN)  gfn: 000a8400  mfn: 00226a00
(XEN)  gfn: 000a8600  mfn: 00121e00
(XEN)  gfn: 000a8800  mfn: 00226800
(XEN)  gfn: 000a8a00  mfn: 00121c00
(XEN)  gfn: 000a8c00  mfn: 00226600
(XEN)  gfn: 000a8e00  mfn: 00121a00
(XEN)  gfn: 000a9000  mfn: 00226400
(XEN)  gfn: 000a9200  mfn: 00121800
(XEN)  gfn: 000a9400  mfn: 00226200
(XEN)  gfn: 000a9600  mfn: 00121600
(XEN)  gfn: 000a9800  mfn: 00226000
(XEN)  gfn: 000a9a00  mfn: 00121400
(XEN)  gfn: 000a9c00  mfn: 00225e00
(XEN)  gfn: 000a9e00  mfn: 00121200
(XEN)  gfn: 000aa000  mfn: 00225c00
(XEN)  gfn: 000aa200  mfn: 00121000
(XEN)  gfn: 000aa400  mfn: 00225a00
(XEN)  gfn: 000aa600  mfn: 00120e00
(XEN)  gfn: 000aa800  mfn: 00225800
(XEN)  gfn: 000aaa00  mfn: 00120c00
(XEN)  gfn: 000aac00  mfn: 00225600
(XEN)  gfn: 000aae00  mfn: 00120a00
(XEN)  gfn: 000ab000  mfn: 00225400
(XEN)  gfn: 000ab200  mfn: 00120800
(XEN)  gfn: 000ab400  mfn: 00225200
(XEN)  gfn: 000ab600  mfn: 00120600
(XEN)  gfn: 000ab800  mfn: 00225000
(XEN)  gfn: 000aba00  mfn: 00120400
(XEN)  gfn: 000abc00  mfn: 00224e00
(XEN)  gfn: 000abe00  mfn: 00120200
(XEN)  gfn: 000ac000  mfn: 00224c00
(XEN)  gfn: 000ac200  mfn: 00120000
(XEN)  gfn: 000ac400  mfn: 00224a00
(XEN)  gfn: 000ac600  mfn: 00080800
(XEN)  gfn: 000ac800  mfn: 00224800
(XEN)  gfn: 000aca00  mfn: 00081000
(XEN)  gfn: 000acc00  mfn: 00224600
(XEN)  gfn: 000ace00  mfn: 00081600
(XEN)  gfn: 000ad000  mfn: 00224400
(XEN)  gfn: 000ad200  mfn: 00081400
(XEN)  gfn: 000ad400  mfn: 00224200
(XEN)  gfn: 000ad600  mfn: 00080600
(XEN)  gfn: 000ad800  mfn: 00224000
(XEN)  gfn: 000ada00  mfn: 00080400
(XEN)  gfn: 000adc00  mfn: 00223e00
(XEN)  gfn: 000ade00  mfn: 00080200
(XEN)  gfn: 000ae000  mfn: 00223c00
(XEN)  gfn: 000ae200  mfn: 00080000
(XEN)  gfn: 000ae400  mfn: 00223a00
(XEN)  gfn: 000ae600  mfn: 00081e00
(XEN)  gfn: 000ae800  mfn: 00223800
(XEN)  gfn: 000aea00  mfn: 00081c00
(XEN)  gfn: 000aec00  mfn: 00223600
(XEN)  gfn: 000aee00  mfn: 00081a00
(XEN)  gfn: 000af000  mfn: 00223400
(XEN)  gfn: 000af200  mfn: 00081800
(XEN)  gfn: 000af400  mfn: 00223200
(XEN)  gfn: 000af600  mfn: 00083e00
(XEN)  gfn: 000af800  mfn: 00223000
(XEN)  gfn: 000afa00  mfn: 00083c00
(XEN)  gfn: 000afc00  mfn: 00222e00
(XEN)  gfn: 000afe00  mfn: 00083a00
(XEN)  gfn: 000b0000  mfn: 00222c00
(XEN)  gfn: 000b0200  mfn: 00083800
(XEN)  gfn: 000b0400  mfn: 00222a00
(XEN)  gfn: 000b0600  mfn: 00083600
(XEN)  gfn: 000b0800  mfn: 00222800
(XEN)  gfn: 000b0a00  mfn: 00083400
(XEN)  gfn: 000b0c00  mfn: 00222600
(XEN)  gfn: 000b0e00  mfn: 00083200
(XEN)  gfn: 000b1000  mfn: 00222400
(XEN)  gfn: 000b1200  mfn: 00083000
(XEN)  gfn: 000b1400  mfn: 00222200
(XEN)  gfn: 000b1600  mfn: 00082e00
(XEN)  gfn: 000b1800  mfn: 00222000
(XEN)  gfn: 000b1a00  mfn: 00082c00
(XEN)  gfn: 000b1c00  mfn: 00221e00
(XEN)  gfn: 000b1e00  mfn: 00082a00
(XEN)  gfn: 000b2000  mfn: 00221c00
(XEN)  gfn: 000b2200  mfn: 00082800
(XEN)  gfn: 000b2400  mfn: 00221a00
(XEN)  gfn: 000b2600  mfn: 00082600
(XEN)  gfn: 000b2800  mfn: 00221800
(XEN)  gfn: 000b2a00  mfn: 00082400
(XEN)  gfn: 000b2c00  mfn: 00221600
(XEN)  gfn: 000b2e00  mfn: 00082200
(XEN)  gfn: 000b3000  mfn: 00221400
(XEN)  gfn: 000b3200  mfn: 00082000
(XEN)  gfn: 000b3400  mfn: 00221200
(XEN)  gfn: 000b3600  mfn: 00087e00
(XEN)  gfn: 000b3800  mfn: 00221000
(XEN)  gfn: 000b3a00  mfn: 00087c00
(XEN)  gfn: 000b3c00  mfn: 00220e00
(XEN)  gfn: 000b3e00  mfn: 00087a00
(XEN)  gfn: 000b4000  mfn: 00220c00
(XEN)  gfn: 000b4200  mfn: 00087800
(XEN)  gfn: 000b4400  mfn: 00220a00
(XEN)  gfn: 000b4600  mfn: 00087600
(XEN)  gfn: 000b4800  mfn: 00220800
(XEN)  gfn: 000b4a00  mfn: 00087400
(XEN)  gfn: 000b4c00  mfn: 00220600
(XEN)  gfn: 000b4e00  mfn: 00087200
(XEN)  gfn: 000b5000  mfn: 00220400
(XEN)  gfn: 000b5200  mfn: 00087000
(XEN)  gfn: 000b5400  mfn: 00220200
(XEN)  gfn: 000b5600  mfn: 00086e00
(XEN)  gfn: 000b5800  mfn: 00220000
(XEN)  gfn: 000b5a00  mfn: 00086c00
(XEN)  gfn: 000b5c00  mfn: 001c0800
(XEN)  gfn: 000b5e00  mfn: 00086a00
(XEN)  gfn: 000b6000  mfn: 001b0400
(XEN)  gfn: 000b6200  mfn: 00086800
(XEN)  gfn: 000b6400  mfn: 00162c00
(XEN)  gfn: 000b6600  mfn: 00086600
(XEN)  gfn: 000b6800  mfn: 001d0e00
(XEN)  gfn: 000b6a00  mfn: 00086400
(XEN)  gfn: 000b6c00  mfn: 001d0c00
(XEN)  gfn: 000b6e00  mfn: 00086200
(XEN)  gfn: 000b7000  mfn: 001b1a00
(XEN)  gfn: 000b7200  mfn: 00086000
(XEN)  gfn: 000b7400  mfn: 001b1800
(XEN)  gfn: 000b7600  mfn: 00085e00
(XEN)  gfn: 000b7800  mfn: 001b0e00
(XEN)  gfn: 000b7a00  mfn: 00085c00
(XEN)  gfn: 000b7c00  mfn: 001b0c00
(XEN)  gfn: 000b7e00  mfn: 00085a00
(XEN)  gfn: 000b8000  mfn: 001b0200
(XEN)  gfn: 000b8200  mfn: 00085800
(XEN)  gfn: 000b8400  mfn: 001b0000
(XEN)  gfn: 000b8600  mfn: 00085600
(XEN)  gfn: 000b8800  mfn: 00162a00
(XEN)  gfn: 000b8a00  mfn: 00085400
(XEN)  gfn: 000b8c00  mfn: 00162800
(XEN)  gfn: 000b8e00  mfn: 00085200
(XEN)  gfn: 000b9000  mfn: 001c0600
(XEN)  gfn: 000b9200  mfn: 00085000
(XEN)  gfn: 000b9400  mfn: 001c0400
(XEN)  gfn: 000b9600  mfn: 00084e00
(XEN)  gfn: 000b9800  mfn: 001c0200
(XEN)  gfn: 000b9a00  mfn: 00084c00
(XEN)  gfn: 000b9c00  mfn: 001c0000
(XEN)  gfn: 000b9e00  mfn: 00084a00
(XEN)  gfn: 000ba000  mfn: 001b1600
(XEN)  gfn: 000ba200  mfn: 00084800
(XEN)  gfn: 000ba400  mfn: 001b1400
(XEN)  gfn: 000ba600  mfn: 00084600
(XEN)  gfn: 000ba800  mfn: 001b1200
(XEN)  gfn: 000baa00  mfn: 00084400
(XEN)  gfn: 000bac00  mfn: 001b1000
(XEN)  gfn: 000bae00  mfn: 00084200
(XEN)  gfn: 000bb000  mfn: 00162600
(XEN)  gfn: 000bb200  mfn: 00084000
(XEN)  gfn: 000bb400  mfn: 00162400
(XEN)  gfn: 000bb600  mfn: 0008fe00
(XEN)  gfn: 000bb800  mfn: 00162200
(XEN)  gfn: 000bba00  mfn: 0008fc00
(XEN)  gfn: 000bbc00  mfn: 00162000
(XEN)  gfn: 000bbe00  mfn: 0008fa00
(XEN)  gfn: 000bc000  mfn: 001d1e00
(XEN)  gfn: 000bc200  mfn: 0008f800
(XEN)  gfn: 000bc400  mfn: 001d1c00
(XEN)  gfn: 000bc600  mfn: 0008f600
(XEN)  gfn: 000bc800  mfn: 001d1a00
(XEN)  gfn: 000bca00  mfn: 0008f400
(XEN)  gfn: 000bcc00  mfn: 001d1800
(XEN)  gfn: 000bce00  mfn: 0008f200
(XEN)  gfn: 000bd000  mfn: 001d1600
(XEN)  gfn: 000bd200  mfn: 0008f000
(XEN)  gfn: 000bd400  mfn: 001d1400
(XEN)  gfn: 000bd600  mfn: 0008ee00
(XEN)  gfn: 000bd800  mfn: 001d1200
(XEN)  gfn: 000bda00  mfn: 0008ec00
(XEN)  gfn: 000bdc00  mfn: 001d1000
(XEN)  gfn: 000bde00  mfn: 0008ea00
(XEN)  gfn: 000be000  mfn: 001d3e00
(XEN)  gfn: 000be200  mfn: 0008e800
(XEN)  gfn: 000be400  mfn: 001d3c00
(XEN)  gfn: 000be600  mfn: 0008e600
(XEN)  gfn: 000be800  mfn: 001d3a00
(XEN)  gfn: 000bea00  mfn: 0008e400
(XEN)  gfn: 000bec00  mfn: 001d3800
(XEN)  gfn: 000bee00  mfn: 0008e200
(XEN)  gfn: 000bf000  mfn: 001d3600
(XEN)  gfn: 000bf200  mfn: 0008e000
(XEN)  gfn: 000bf400  mfn: 001d3400
(XEN)  gfn: 000bf600  mfn: 0008de00
(XEN)  gfn: 000bf800  mfn: 001d3200
(XEN)  gfn: 000bfa00  mfn: 0008dc00
(XEN)  gfn: 000bfc00  mfn: 001d3000
(XEN)  gfn: 000bfe00  mfn: 0008da00
(XEN)  gfn: 000c0000  mfn: 001d2e00
(XEN)  gfn: 000c0200  mfn: 0008d800
(XEN)  gfn: 000c0400  mfn: 001d2c00
(XEN)  gfn: 000c0600  mfn: 0008d600
(XEN)  gfn: 000c0800  mfn: 001d2a00
(XEN)  gfn: 000c0a00  mfn: 0008d400
(XEN)  gfn: 000c0c00  mfn: 001d2800
(XEN)  gfn: 000c0e00  mfn: 0008d200
(XEN)  gfn: 000c1000  mfn: 001d2600
(XEN)  gfn: 000c1200  mfn: 0008d000
(XEN)  gfn: 000c1400  mfn: 001d2400
(XEN)  gfn: 000c1600  mfn: 0008ce00
(XEN)  gfn: 000c1800  mfn: 001d2200
(XEN)  gfn: 000c1a00  mfn: 0008cc00
(XEN)  gfn: 000c1c00  mfn: 001d2000
(XEN)  gfn: 000c1e00  mfn: 0008ca00
(XEN)  gfn: 000c2000  mfn: 001b3e00
(XEN)  gfn: 000c2200  mfn: 0008c800
(XEN)  gfn: 000c2400  mfn: 001b3c00
(XEN)  gfn: 000c2600  mfn: 0008c600
(XEN)  gfn: 000c2800  mfn: 001b3a00
(XEN)  gfn: 000c2a00  mfn: 0008c400
(XEN)  gfn: 000c2c00  mfn: 001b3800
(XEN)  gfn: 000c2e00  mfn: 0008c200
(XEN)  gfn: 000c3000  mfn: 001b3600
(XEN)  gfn: 000c3200  mfn: 0008c000
(XEN)  gfn: 000c3400  mfn: 001b3400
(XEN)  gfn: 000c3600  mfn: 0008be00
(XEN)  gfn: 000c3800  mfn: 001b3200
(XEN)  gfn: 000c3a00  mfn: 0008bc00
(XEN)  gfn: 000c3c00  mfn: 001b3000
(XEN)  gfn: 000c3e00  mfn: 0008ba00
(XEN)  gfn: 000c4000  mfn: 001b2e00
(XEN)  gfn: 000c4200  mfn: 0008b800
(XEN)  gfn: 000c4400  mfn: 001b2c00
(XEN)  gfn: 000c4600  mfn: 0008b600
(XEN)  gfn: 000c4800  mfn: 001b2a00
(XEN)  gfn: 000c4a00  mfn: 0008b400
(XEN)  gfn: 000c4c00  mfn: 001b2800
(XEN)  gfn: 000c4e00  mfn: 0008b200
(XEN)  gfn: 000c5000  mfn: 001b2600
(XEN)  gfn: 000c5200  mfn: 0008b000
(XEN)  gfn: 000c5400  mfn: 001b2400
(XEN)  gfn: 000c5600  mfn: 0008ae00
(XEN)  gfn: 000c5800  mfn: 001b2200
(XEN)  gfn: 000c5a00  mfn: 0008ac00
(XEN)  gfn: 000c5c00  mfn: 001b2000
(XEN)  gfn: 000c5e00  mfn: 0008aa00
(XEN)  gfn: 000c6000  mfn: 00161e00
(XEN)  gfn: 000c6200  mfn: 0008a800
(XEN)  gfn: 000c6400  mfn: 00161c00
(XEN)  gfn: 000c6600  mfn: 0008a600
(XEN)  gfn: 000c6800  mfn: 00161a00
(XEN)  gfn: 000c6a00  mfn: 0008a400
(XEN)  gfn: 000c6c00  mfn: 00161800
(XEN)  gfn: 000c6e00  mfn: 0008a200
(XEN)  gfn: 000c7000  mfn: 00161600
(XEN)  gfn: 000c7200  mfn: 0008a000
(XEN)  gfn: 000c7400  mfn: 00161400
(XEN)  gfn: 000c7600  mfn: 00089e00
(XEN)  gfn: 000c7800  mfn: 00161200
(XEN)  gfn: 000c7a00  mfn: 00089c00
(XEN)  gfn: 000c7c00  mfn: 00161000
(XEN)  gfn: 000c7e00  mfn: 00089a00
(XEN)  gfn: 000c8000  mfn: 00160e00
(XEN)  gfn: 000c8200  mfn: 00089800
(XEN)  gfn: 000c8400  mfn: 00160c00
(XEN)  gfn: 000c8600  mfn: 00089600
(XEN)  gfn: 000c8800  mfn: 00160a00
(XEN)  gfn: 000c8a00  mfn: 00089400
(XEN)  gfn: 000c8c00  mfn: 00160800
(XEN)  gfn: 000c8e00  mfn: 00089200
(XEN)  gfn: 000c9000  mfn: 00160600
(XEN)  gfn: 000c9200  mfn: 00089000
(XEN)  gfn: 000c9400  mfn: 00160400
(XEN)  gfn: 000c9600  mfn: 00088e00
(XEN)  gfn: 000c9800  mfn: 00160200
(XEN)  gfn: 000c9a00  mfn: 00088c00
(XEN)  gfn: 000c9c00  mfn: 00160000
(XEN)  gfn: 000c9e00  mfn: 00088a00
(XEN)  gfn: 000ca000  mfn: 001d7e00
(XEN)  gfn: 000ca200  mfn: 00088800
(XEN)  gfn: 000ca400  mfn: 001d7c00
(XEN)  gfn: 000ca600  mfn: 00088600
(XEN)  gfn: 000ca800  mfn: 001d7a00
(XEN)  gfn: 000caa00  mfn: 00088400
(XEN)  gfn: 000cac00  mfn: 001d7800
(XEN)  gfn: 000cae00  mfn: 00088200
(XEN)  gfn: 000cb000  mfn: 001d7600
(XEN)  gfn: 000cb200  mfn: 00088000
(XEN)  gfn: 000cb400  mfn: 001d7400
(XEN)  gfn: 000cb600  mfn: 0009fe00
(XEN)  gfn: 000cb800  mfn: 001d7200
(XEN)  gfn: 000cba00  mfn: 0009fc00
(XEN)  gfn: 000cbc00  mfn: 001d7000
(XEN)  gfn: 000cbe00  mfn: 0009fa00
(XEN)  gfn: 000cc000  mfn: 001d6e00
(XEN)  gfn: 000cc200  mfn: 0009f800
(XEN)  gfn: 000cc400  mfn: 001d6c00
(XEN)  gfn: 000cc600  mfn: 0009f600
(XEN)  gfn: 000cc800  mfn: 001d6a00
(XEN)  gfn: 000cca00  mfn: 0009f400
(XEN)  gfn: 000ccc00  mfn: 001d6800
(XEN)  gfn: 000cce00  mfn: 0009f200
(XEN)  gfn: 000cd000  mfn: 001d6600
(XEN)  gfn: 000cd200  mfn: 0009f000
(XEN)  gfn: 000cd400  mfn: 001d6400
(XEN)  gfn: 000cd600  mfn: 0009ee00
(XEN)  gfn: 000cd800  mfn: 001d6200
(XEN)  gfn: 000cda00  mfn: 0009ec00
(XEN)  gfn: 000cdc00  mfn: 001d6000
(XEN)  gfn: 000cde00  mfn: 0009ea00
(XEN)  gfn: 000ce000  mfn: 001d5e00
(XEN)  gfn: 000ce200  mfn: 0009e800
(XEN)  gfn: 000ce400  mfn: 001d5c00
(XEN)  gfn: 000ce600  mfn: 0009e600
(XEN)  gfn: 000ce800  mfn: 001d5a00
(XEN)  gfn: 000cea00  mfn: 0009e400
(XEN)  gfn: 000cec00  mfn: 001d5800
(XEN)  gfn: 000cee00  mfn: 0009e200
(XEN)  gfn: 000cf000  mfn: 001d5600
(XEN)  gfn: 000cf200  mfn: 0009e000
(XEN)  gfn: 000cf400  mfn: 001d5400
(XEN)  gfn: 000cf600  mfn: 0009de00
(XEN)  gfn: 000cf800  mfn: 001d5200
(XEN)  gfn: 000cfa00  mfn: 0009dc00
(XEN)  gfn: 000cfc00  mfn: 001d5000
(XEN)  gfn: 000cfe00  mfn: 0009da00
(XEN)  gfn: 000d0000  mfn: 001d4e00
(XEN)  gfn: 000d0200  mfn: 0009d800
(XEN)  gfn: 000d0400  mfn: 001d4c00
(XEN)  gfn: 000d0600  mfn: 0009d600
(XEN)  gfn: 000d0800  mfn: 001d4a00
(XEN)  gfn: 000d0a00  mfn: 0009d400
(XEN)  gfn: 000d0c00  mfn: 001d4800
(XEN)  gfn: 000d0e00  mfn: 0009d200
(XEN)  gfn: 000d1000  mfn: 001d4600
(XEN)  gfn: 000d1200  mfn: 0009d000
(XEN)  gfn: 000d1400  mfn: 001d4400
(XEN)  gfn: 000d1600  mfn: 0009ce00
(XEN)  gfn: 000d1800  mfn: 001d4200
(XEN)  gfn: 000d1a00  mfn: 0009cc00
(XEN)  gfn: 000d1c00  mfn: 001d4000
(XEN)  gfn: 000d1e00  mfn: 0009ca00
(XEN)  gfn: 000d2000  mfn: 001b7e00
(XEN)  gfn: 000d2200  mfn: 0009c800
(XEN)  gfn: 000d2400  mfn: 001b7c00
(XEN)  gfn: 000d2600  mfn: 0009c600
(XEN)  gfn: 000d2800  mfn: 001b7a00
(XEN)  gfn: 000d2a00  mfn: 0009c400
(XEN)  gfn: 000d2c00  mfn: 001b7800
(XEN)  gfn: 000d2e00  mfn: 0009c200
(XEN)  gfn: 000d3000  mfn: 001b7600
(XEN)  gfn: 000d3200  mfn: 0009c000
(XEN)  gfn: 000d3400  mfn: 001b7400
(XEN)  gfn: 000d3600  mfn: 0009be00
(XEN)  gfn: 000d3800  mfn: 001b7200
(XEN)  gfn: 000d3a00  mfn: 0009bc00
(XEN)  gfn: 000d3c00  mfn: 001b7000
(XEN)  gfn: 000d3e00  mfn: 0009ba00
(XEN)  gfn: 000d4000  mfn: 001b6e00
(XEN)  gfn: 000d4200  mfn: 0009b800
(XEN)  gfn: 000d4400  mfn: 001b6c00
(XEN)  gfn: 000d4600  mfn: 0009b600
(XEN)  gfn: 000d4800  mfn: 001b6a00
(XEN)  gfn: 000d4a00  mfn: 0009b400
(XEN)  gfn: 000d4c00  mfn: 001b6800
(XEN)  gfn: 000d4e00  mfn: 0009b200
(XEN)  gfn: 000d5000  mfn: 001b6600
(XEN)  gfn: 000d5200  mfn: 0009b000
(XEN)  gfn: 000d5400  mfn: 001b6400
(XEN)  gfn: 000d5600  mfn: 0009ae00
(XEN)  gfn: 000d5800  mfn: 001b6200
(XEN)  gfn: 000d5a00  mfn: 0009ac00
(XEN)  gfn: 000d5c00  mfn: 001b6000
(XEN)  gfn: 000d5e00  mfn: 0009aa00
(XEN)  gfn: 000d6000  mfn: 001b5e00
(XEN)  gfn: 000d6200  mfn: 0009a800
(XEN)  gfn: 000d6400  mfn: 001b5c00
(XEN)  gfn: 000d6600  mfn: 0009a600
(XEN)  gfn: 000d6800  mfn: 001b5a00
(XEN)  gfn: 000d6a00  mfn: 0009a400
(XEN)  gfn: 000d6c00  mfn: 001b5800
(XEN)  gfn: 000d6e00  mfn: 0009a200
(XEN)  gfn: 000d7000  mfn: 001b5600
(XEN)  gfn: 000d7200  mfn: 0009a000
(XEN)  gfn: 000d7400  mfn: 001b5400
(XEN)  gfn: 000d7600  mfn: 00099e00
(XEN)  gfn: 000d7800  mfn: 001b5200
(XEN)  gfn: 000d7a00  mfn: 00099c00
(XEN)  gfn: 000d7c00  mfn: 001b5000
(XEN)  gfn: 000d7e00  mfn: 00099a00
(XEN)  gfn: 000d8000  mfn: 001b4e00
(XEN)  gfn: 000d8200  mfn: 00099800
(XEN)  gfn: 000d8400  mfn: 001b4c00
(XEN)  gfn: 000d8600  mfn: 00099600
(XEN)  gfn: 000d8800  mfn: 001b4a00
(XEN)  gfn: 000d8a00  mfn: 00099400
(XEN)  gfn: 000d8c00  mfn: 001b4800
(XEN)  gfn: 000d8e00  mfn: 00099200
(XEN)  gfn: 000d9000  mfn: 001b4600
(XEN)  gfn: 000d9200  mfn: 00099000
(XEN)  gfn: 000d9400  mfn: 001b4400
(XEN)  gfn: 000d9600  mfn: 00098e00
(XEN)  gfn: 000d9800  mfn: 001b4200
(XEN)  gfn: 000d9a00  mfn: 00098c00
(XEN)  gfn: 000d9c00  mfn: 001b4000
(XEN)  gfn: 000d9e00  mfn: 00098a00
(XEN)  gfn: 000da000  mfn: 001dfe00
(XEN)  gfn: 000da200  mfn: 00098800
(XEN)  gfn: 000da400  mfn: 001dfc00
(XEN)  gfn: 000da600  mfn: 00098600
(XEN)  gfn: 000da800  mfn: 001dfa00
(XEN)  gfn: 000daa00  mfn: 00098400
(XEN)  gfn: 000dac00  mfn: 001df800
(XEN)  gfn: 000dae00  mfn: 00098200
(XEN)  gfn: 000db000  mfn: 001df600
(XEN)  gfn: 000db200  mfn: 00098000
(XEN)  gfn: 000db400  mfn: 001df400
(XEN)  gfn: 000db600  mfn: 00097e00
(XEN)  gfn: 000db800  mfn: 001df200
(XEN)  gfn: 000dba00  mfn: 00097c00
(XEN)  gfn: 000dbc00  mfn: 0+01df000
(XEN)  gfn: 000dbe00  mfn: 00097a00
(XEN)  gfn: 000dc000  mfn: 001dee00
(XEN)  gfn: 000dc200  mfn: 00097800
(XEN) stdvga.c:151:d2 leaving stdvga
(XEN)  gfn: 000dc400  mfn: 001dec00
(XEN)  gfn: 000dc600  mfn: 00097600
(XEN)  gfn: 000dc800  mfn: 001dea00
(XEN)  gfn: 000dca00  mfn: 00097400
(XEN)  gfn: 000dcc00  mfn: 001de800
(XEN)  gfn: 000dce00  mfn: 00097200
(XEN)  gfn: 000dd000  mfn: 001de600
(XEN)  gfn: 000dd200  mfn: 00097000
(XEN)  gfn: 000dd400  mfn: 001de400
(XEN)  gfn: 000dd600  mfn: 00096e00
(XEN)  gfn: 000dd800  mfn: 001de200
(XEN)  gfn: 000dda00  mfn: 00096c00
(XEN)  gfn: 000ddc00  mfn: 001de000
(XEN)  gfn: 000dde00  mfn: 00096a00
(XEN)  gfn: 000de000  mfn: 001dde00
(XEN)  gfn: 000de200  mfn: 00096800
(XEN)  gfn: 000de400  mfn: 001ddc00
(XEN)  gfn: 000de600  mfn: 00096600
(XEN)  gfn: 000de800  mfn: 001dda00
(XEN)  gfn: 000dea00  mfn: 00096400
(XEN)  gfn: 000dec00  mfn: 001dd800
(XEN)  gfn: 000dee00  mfn: 00096200
(XEN)  gfn: 000df000  mfn: 001dd600
(XEN)  gfn: 000df200  mfn: 00096000
(XEN)  gfn: 000df400  mfn: 001dd400
(XEN)  gfn: 000df600  mfn: 00095e00
(XEN)  gfn: 000df800  mfn: 001dd200
(XEN)  gfn: 000dfa00  mfn: 00095c00
(XEN)  gfn: 000dfc00  mfn: 001dd000
(XEN)  gfn: 000dfe00  mfn: 00095a00
(XEN)  gfn: 000e0000  mfn: 001dce00
(XEN)  gfn: 000e0200  mfn: 00095800
(XEN)  gfn: 000e0400  mfn: 001dcc00
(XEN)  gfn: 000e0600  mfn: 00095600
(XEN)  gfn: 000e0800  mfn: 001dca00
(XEN)  gfn: 000e0a00  mfn: 00095400
(XEN)  gfn: 000e0c00  mfn: 001dc800
(XEN)  gfn: 000e0e00  mfn: 00095200
(XEN)  gfn: 000e1000  mfn: 001dc600
(XEN)  gfn: 000e1200  mfn: 00095000
(XEN)  gfn: 000e1400  mfn: 001dc400
(XEN)  gfn: 000e1600  mfn: 00094e00
(XEN)  gfn: 000e1800  mfn: 001dc200
(XEN)  gfn: 000e1a00  mfn: 00094c00
(XEN)  gfn: 000e1c00  mfn: 001dc000
(XEN)  gfn: 000e1e00  mfn: 00094a00
(XEN)  gfn: 000e2000  mfn: 001dbe00
(XEN)  gfn: 000e2200  mfn: 00094800
(XEN)  gfn: 000e2400  mfn: 001dbc00
(XEN)  gfn: 000e2600  mfn: 00094600
(XEN)  gfn: 000e2800  mfn: 001dba00
(XEN)  gfn: 000e2a00  mfn: 00094400
(XEN)  gfn: 000e2c00  mfn: 001db800
(XEN)  gfn: 000e2e00  mfn: 00094200
(XEN)  gfn: 000e3000  mfn: 001db600
(XEN)  gfn: 000e3200  mfn: 00094000
(XEN)  gfn: 000e3400  mfn: 001db400
(XEN)  gfn: 000e3600  mfn: 00093e00
(XEN)  gfn: 000e3800  mfn: 001db200
(XEN)  gfn: 000e3a00  mfn: 00093c00
(XEN)  gfn: 000e3c00  mfn: 001db000
(XEN)  gfn: 000e3e00  mfn: 00093a00
(XEN)  gfn: 000e4000  mfn: 001dae00
(XEN)  gfn: 000e4200  mfn: 00093800
(XEN)  gfn: 000e4400  mfn: 001dac00
(XEN)  gfn: 000e4600  mfn: 00093600
(XEN)  gfn: 000e4800  mfn: 001daa00
(XEN)  gfn: 000e4a00  mfn: 00093400
(XEN)  gfn: 000e4c00  mfn: 001da800
(XEN)  gfn: 000e4e00  mfn: 00093200
(XEN)  gfn: 000e5000  mfn: 001da600
(XEN)  gfn: 000e5200  mfn: 00093000
(XEN)  gfn: 000e5400  mfn: 001da400
(XEN)  gfn: 000e5600  mfn: 00092e00
(XEN)  gfn: 000e5800  mfn: 001da200
(XEN)  gfn: 000e5a00  mfn: 00092c00
(XEN)  gfn: 000e5c00  mfn: 001da000
(XEN)  gfn: 000e5e00  mfn: 00092a00
(XEN)  gfn: 000e6000  mfn: 001d9e00
(XEN)  gfn: 000e6200  mfn: 00092800
(XEN)  gfn: 000e6400  mfn: 001d9c00
(XEN)  gfn: 000e6600  mfn: 00092600
(XEN)  gfn: 000e6800  mfn: 001d9a00
(XEN)  gfn: 000e6a00  mfn: 00092400
(XEN)  gfn: 000e6c00  mfn: 001d9800
(XEN)  gfn: 000e6e00  mfn: 00092200
(XEN)  gfn: 000e7000  mfn: 001d9600
(XEN)  gfn: 000e7200  mfn: 00092000
(XEN)  gfn: 000e7400  mfn: 001d9400
(XEN)  gfn: 000e7600  mfn: 00091e00
(XEN)  gfn: 000e7800  mfn: 001d9200
(XEN)  gfn: 000e7a00  mfn: 00091c00
(XEN)  gfn: 000e7c00  mfn: 001d9000
(XEN)  gfn: 000e7e00  mfn: 00091a00
(XEN)  gfn: 000e8000  mfn: 001d8e00
(XEN)  gfn: 000e8200  mfn: 00091800
(XEN)  gfn: 000e8400  mfn: 001d8c00
(XEN)  gfn: 000e8600  mfn: 00091600
(XEN)  gfn: 000e8800  mfn: 001d8a00
(XEN)  gfn: 000e8a00  mfn: 00091400
(XEN)  gfn: 000e8c00  mfn: 001d8800
(XEN)  gfn: 000e8e00  mfn: 00091200
(XEN)  gfn: 000e9000  mfn: 001d8600
(XEN)  gfn: 000e9200  mfn: 00091000
(XEN)  gfn: 000e9400  mfn: 001d8400
(XEN)  gfn: 000e9600  mfn: 00090e00
(XEN)  gfn: 000e9800  mfn: 001d8200
(XEN)  gfn: 000e9a00  mfn: 00090c00
(XEN)  gfn: 000e9c00  mfn: 001d8000
(XEN)  gfn: 000e9e00  mfn: 00090a00
(XEN)  gfn: 000ea000  mfn: 001bfe00
(XEN)  gfn: 000ea200  mfn: 00090800
(XEN)  gfn: 000ea400  mfn: 001bfc00
(XEN)  gfn: 000ea600  mfn: 00090600
(XEN)  gfn: 000ea800  mfn: 001bfa00
(XEN)  gfn: 000eaa00  mfn: 00090400
(XEN)  gfn: 000eac00  mfn: 001bf800
(XEN)  gfn: 000eae00  mfn: 00090200
(XEN)  gfn: 000eb000  mfn: 001bf600
(XEN)  gfn: 000eb200  mfn: 00090000
(XEN)  gfn: 000eb400  mfn: 001bf400
(XEN)  gfn: 000eb600  mfn: 001bf200
(XEN)  gfn: 000eb800  mfn: 001bf000
(XEN)  gfn: 000eba00  mfn: 001bee00
(XEN)  gfn: 000ebc00  mfn: 001bec00
(XEN)  gfn: 000ebe00  mfn: 001bea00
(XEN)  gfn: 000ec000  mfn: 001be800
(XEN)  gfn: 000ec200  mfn: 001be600
(XEN)  gfn: 000ec400  mfn: 001be400
(XEN)  gfn: 000ec600  mfn: 001be200
(XEN)  gfn: 000ec800  mfn: 001be000
(XEN)  gfn: 000eca00  mfn: 001bde00
(XEN)  gfn: 000ecc00  mfn: 001bdc00
(XEN)  gfn: 000ece00  mfn: 001bda00
(XEN)  gfn: 000ed000  mfn: 001bd800
(XEN)  gfn: 000ed200  mfn: 001bd600
(XEN)  gfn: 000ed400  mfn: 001bd400
(XEN)  gfn: 000ed600  mfn: 001bd200
(XEN)  gfn: 000ed800  mfn: 001bd000
(XEN)  gfn: 000eda00  mfn: 001bce00
(XEN)  gfn: 000edc00  mfn: 001bcc00
(XEN)  gfn: 000ede00  mfn: 001bca00
(XEN)  gfn: 000ee000  mfn: 001bc800
(XEN)  gfn: 000ee200  mfn: 001bc600
(XEN)  gfn: 000ee400  mfn: 001bc400
(XEN)  gfn: 000ee600  mfn: 001bc200
(XEN)  gfn: 000ee800  mfn: 001bc000
(XEN)  gfn: 000eea00  mfn: 001bbe00
(XEN)  gfn: 000eec00  mfn: 001bbc00
(XEN)  gfn: 000eee00  mfn: 001bba00
(XEN)  gfn: 000ef000  mfn: 001bb800
(XEN)  gfn: 000ef200  mfn: 001bb600
(XEN)  gfn: 000ef400  mfn: 001bb400
(XEN)  gfn: 000ef600  mfn: 001bb200
(XEN)  gfn: 000ef800  mfn: 001bb000
(XEN)  gfn: 000efa00  mfn: 001bae00
(XEN)  gfn: 000efc00  mfn: 001bac00
(XEN)  gfn: 000efe00  mfn: 001baa00
(XEN)   gfn: 000f0000  mfn: 00218e0e
(XEN)   gfn: 000f0001  mfn: 00101e2a
(XEN)   gfn: 000f0002  mfn: 00218e0d
(XEN)   gfn: 000f0003  mfn: 0010288f
(XEN)   gfn: 000f0004  mfn: 00218e0c
(XEN)   gfn: 000f0005  mfn: 0010288e
(XEN)   gfn: 000f0006  mfn: 00218e0b
(XEN)   gfn: 000f0007  mfn: 0010153b
(XEN)   gfn: 000f0008  mfn: 00218e0a
(XEN)   gfn: 000f0009  mfn: 0010153a
(XEN)   gfn: 000f000a  mfn: 00218e09
(XEN)   gfn: 000f000b  mfn: 00102857
(XEN)   gfn: 000f000c  mfn: 00218e08
(XEN)   gfn: 000f000d  mfn: 00102856
(XEN)   gfn: 000f000e  mfn: 00218e07
(XEN)   gfn: 000f000f  mfn: 001015b7
(XEN)   gfn: 000f0010  mfn: 00218e06
(XEN)   gfn: 000f0011  mfn: 001015b6
(XEN)   gfn: 000f0012  mfn: 00218e05
(XEN)   gfn: 000f0013  mfn: 00102827
(XEN)   gfn: 000f0014  mfn: 00218e04
(XEN)   gfn: 000f0015  mfn: 00102826
(XEN)   gfn: 000f0016  mfn: 00218e03
(XEN)   gfn: 000f0017  mfn: 0010052b
(XEN)   gfn: 000f0018  mfn: 00218e02
(XEN)   gfn: 000f0019  mfn: 0010052a
(XEN)   gfn: 000f001a  mfn: 00218e01
(XEN)   gfn: 000f001b  mfn: 00102817
(XEN)   gfn: 000f001c  mfn: 00218e00
(XEN)   gfn: 000f001d  mfn: 00102816
(XEN)   gfn: 000f001e  mfn: 001b1c4a
(XEN)   gfn: 000f001f  mfn: 00102c3b
(XEN)   gfn: 000f0020  mfn: 001b1f9a
(XEN)   gfn: 000f0021  mfn: 00102c3a
(XEN)   gfn: 000f0022  mfn: 001d0b12
(XEN)   gfn: 000f0023  mfn: 00102c8b
(XEN)   gfn: 000f0024  mfn: 001d0b0b
(XEN)   gfn: 000f0025  mfn: 00102c8a
(XEN)   gfn: 000f0026  mfn: 001d0b8d
(XEN)   gfn: 000f0027  mfn: 0010270f
(XEN)   gfn: 000f0028  mfn: 001b1fc3
(XEN)   gfn: 000f0029  mfn: 0010270e
(XEN)   gfn: 000f002a  mfn: 001b1c23
(XEN)   gfn: 000f002b  mfn: 00101ebb
(XEN)   gfn: 000f002c  mfn: 001d0bb8
(XEN)   gfn: 000f002d  mfn: 00101eba
(XEN)   gfn: 000f002e  mfn: 001d0bbc
(XEN)   gfn: 000f002f  mfn: 00102e6b
(XEN)   gfn: 000f0030  mfn: 001d0b9c
(XEN)   gfn: 000f0031  mfn: 00102e6a
(XEN)   gfn: 000f0032  mfn: 001d0bc6
(XEN)   gfn: 000f0033  mfn: 00102c5f
(XEN)   gfn: 000f0034  mfn: 001d0b46
(XEN)   gfn: 000f0035  mfn: 00102c5e
(XEN)   gfn: 000f0036  mfn: 001d0b44
(XEN)   gfn: 000f0037  mfn: 00102e93
(XEN)   gfn: 000f0038  mfn: 001d0bad
(XEN)   gfn: 000f0039  mfn: 00102e92
(XEN)   gfn: 000f003a  mfn: 001d0bae
(XEN)   gfn: 000f003b  mfn: 0010289b
(XEN)   gfn: 000f003c  mfn: 001d0b41
(XEN)   gfn: 000f003d  mfn: 0010289a
(XEN)   gfn: 000f003e  mfn: 001b1fea
(XEN)   gfn: 000f003f  mfn: 00102cc7
(XEN)   gfn: 000f0040  mfn: 001d0bc1
(XEN)   gfn: 000f0041  mfn: 00102cc6
(XEN)   gfn: 000f0042  mfn: 001b1fdf
(XEN)   gfn: 000f0043  mfn: 00102963
(XEN)   gfn: 000f0044  mfn: 001d0b37
(XEN)   gfn: 000f0045  mfn: 00102962
(XEN)   gfn: 000f0046  mfn: 001d0b9e
(XEN)   gfn: 000f0047  mfn: 00102887
(XEN)   gfn: 000f0048  mfn: 001b06d8
(XEN)   gfn: 000f0049  mfn: 00102886
(XEN)   gfn: 000f004a  mfn: 00162ed8
(XEN)   gfn: 000f004b  mfn: 001019c5
(XEN)   gfn: 000f004c  mfn: 001632d8
(XEN)   gfn: 000f004d  mfn: 001019c4
(XEN)   gfn: 000f004e  mfn: 001c0a61
(XEN)   gfn: 000f004f  mfn: 001019c3
(XEN)   gfn: 000f0050  mfn: 001c0a60
(XEN)   gfn: 000f0051  mfn: 001019c2
(XEN)   gfn: 000f0052  mfn: 001b1c49
(XEN)   gfn: 000f0053  mfn: 0010150f
(XEN)   gfn: 000f0054  mfn: 001b1c48
(XEN)   gfn: 000f0055  mfn: 0010150e
(XEN)   gfn: 000f0056  mfn: 001b1f99
(XEN)   gfn: 000f0057  mfn: 00101aa9
(XEN)   gfn: 000f0058  mfn: 001b1f98
(XEN)   gfn: 000f0059  mfn: 00101aa8
(XEN)   gfn: 000f005a  mfn: 001d0b65
(XEN)   gfn: 000f005b  mfn: 00101aa7
(XEN)   gfn: 000f005c  mfn: 001d0b64
(XEN)   gfn: 000f005d  mfn: 00101aa6
(XEN)   gfn: 000f005e  mfn: 001d0b11
(XEN)   gfn: 000f005f  mfn: 00101985
(XEN)   gfn: 000f0060  mfn: 001d0b10
(XEN)   gfn: 000f0061  mfn: 00101984
(XEN)   gfn: 000f0062  mfn: 001d0bc5
(XEN)   gfn: 000f0063  mfn: 00101983
(XEN)   gfn: 000f0064  mfn: 001d0bc4
(XEN)   gfn: 000f0065  mfn: 00101982
(XEN)   gfn: 000f0066  mfn: 001d0b43
(XEN)   gfn: 000f0067  mfn: 00101e6b
(XEN)   gfn: 000f0068  mfn: 001d0b42
(XEN)   gfn: 000f0069  mfn: 00101e6a
(XEN)   gfn: 000f006a  mfn: 001b1fe9
(XEN)   gfn: 000f006b  mfn: 00102763
(XEN)   gfn: 000f006c  mfn: 001b1fe8
(XEN)   gfn: 000f006d  mfn: 00102762
(XEN)   gfn: 000f006e  mfn: 001d0bc3
(XEN)   gfn: 000f006f  mfn: 00102d3f
(XEN)   gfn: 000f0070  mfn: 001d0bc2
(XEN)   gfn: 000f0071  mfn: 00102d3e
(XEN)   gfn: 000f0072  mfn: 001d0bff
(XEN)   gfn: 000f0073  mfn: 0010046b
(XEN)   gfn: 000f0074  mfn: 001d0bfe
(XEN)   gfn: 000f0075  mfn: 0010046a
(XEN)   gfn: 000f0076  mfn: 001d0bfd
(XEN)   gfn: 000f0077  mfn: 001003d7
(XEN)   gfn: 000f0078  mfn: 001d0bfc
(XEN)   gfn: 000f0079  mfn: 001003d6
(XEN)   gfn: 000f007a  mfn: 001d0bcf
(XEN)   gfn: 000f007b  mfn: 0010031b
(XEN)   gfn: 000f007c  mfn: 001d0bce
(XEN)   gfn: 000f007d  mfn: 0010031a
(XEN)   gfn: 000f007e  mfn: 001d0bcd
(XEN)   gfn: 000f007f  mfn: 00102dc7
(XEN)   gfn: 000f0080  mfn: 001d0bcc
(XEN)   gfn: 000f0081  mfn: 00102dc6
(XEN)   gfn: 000f0082  mfn: 001d0b0f
(XEN)   gfn: 000f0083  mfn: 00101d97
(XEN)   gfn: 000f0084  mfn: 001d0b0e
(XEN)   gfn: 000f0085  mfn: 00101d96
(XEN)   gfn: 000f0086  mfn: 001d0b0d
(XEN)   gfn: 000f0087  mfn: 0010276b
(XEN)   gfn: 000f0088  mfn: 001d0b0c
(XEN)   gfn: 000f0089  mfn: 0010276a
(XEN)   gfn: 000f008a  mfn: 001630bf
(XEN)   gfn: 000f008b  mfn: 00101a33
(XEN)   gfn: 000f008c  mfn: 001630be
(XEN)   gfn: 000f008d  mfn: 00101a32
(XEN)   gfn: 000f008e  mfn: 001630bd
(XEN)   gfn: 000f008f  mfn: 0010253d
(XEN)   gfn: 000f0090  mfn: 001630bc
(XEN)   gfn: 000f0091  mfn: 0010253c
(XEN)   gfn: 000f0092  mfn: 001b1c47
(XEN)   gfn: 000f0093  mfn: 00102369
(XEN)   gfn: 000f0094  mfn: 001b1c46
(XEN)   gfn: 000f0095  mfn: 00102368
(XEN)   gfn: 000f0096  mfn: 001b1c45
(XEN)   gfn: 000f0097  mfn: 0010283f
(XEN)   gfn: 000f0098  mfn: 001b1c44
(XEN)   gfn: 000f0099  mfn: 0010283e
(XEN)   gfn: 000f009a  mfn: 001b1c43
(XEN)   gfn: 000f009b  mfn: 00101583
(XEN)   gfn: 000f009c  mfn: 001b1c42
(XEN)   gfn: 000f009d  mfn: 00101582
(XEN)   gfn: 000f009e  mfn: 001b1c41
(XEN)   gfn: 000f009f  mfn: 0010180b
(XEN)   gfn: 000f00a0  mfn: 001b1c40
(XEN)   gfn: 000f00a1  mfn: 0010180a
(XEN)   gfn: 000f00a2  mfn: 001b1f97
(XEN)   gfn: 000f00a3  mfn: 0010294f
(XEN)   gfn: 000f00a4  mfn: 001b1f96
(XEN)   gfn: 000f00a5  mfn: 0010294e
(XEN)   gfn: 000f00a6  mfn: 001b1f95
(XEN)   gfn: 000f00a7  mfn: 00102d1f
(XEN)   gfn: 000f00a8  mfn: 001b1f94
(XEN)   gfn: 000f00a9  mfn: 00102d1e
(XEN)   gfn: 000f00aa  mfn: 001b1f93
(XEN)   gfn: 000f00ab  mfn: 00102379
(XEN)   gfn: 000f00ac  mfn: 001b1f92
(XEN)   gfn: 000f00ad  mfn: 00102378
(XEN)   gfn: 000f00ae  mfn: 001b1f91
(XEN)   gfn: 000f00af  mfn: 00102ca3
(XEN)   gfn: 000f00b0  mfn: 001b1f90
(XEN)   gfn: 000f00b1  mfn: 00102ca2
(XEN)   gfn: 000f00b2  mfn: 001b06d7
(XEN)   gfn: 000f00b3  mfn: 0010282f
(XEN)   gfn: 000f00b4  mfn: 001b06d6
(XEN)   gfn: 000f00b5  mfn: 0010282e
(XEN)   gfn: 000f00b6  mfn: 001b06d5
(XEN)   gfn: 000f00b7  mfn: 00102e5f
(XEN)   gfn: 000f00b8  mfn: 001b06d4
(XEN)   gfn: 000f00b9  mfn: 00102e5e
(XEN)   gfn: 000f00ba  mfn: 001b06d3
(XEN)   gfn: 000f00bb  mfn: 00102777
(XEN)   gfn: 000f00bc  mfn: 001b06d2
(XEN)   gfn: 000f00bd  mfn: 00102776
(XEN)   gfn: 000f00be  mfn: 001b06d1
(XEN)   gfn: 000f00bf  mfn: 001019f7
(XEN)   gfn: 000f00c0  mfn: 001b06d0
(XEN)   gfn: 000f00c1  mfn: 001019f6
(XEN)   gfn: 000f00c2  mfn: 00162ed7
(XEN)   gfn: 000f00c3  mfn: 00101a93
(XEN)   gfn: 000f00c4  mfn: 00162ed6
(XEN)   gfn: 000f00c5  mfn: 00101a92
(XEN)   gfn: 000f00c6  mfn: 00162ed5
(XEN)   gfn: 000f00c7  mfn: 0010141f
(XEN)   gfn: 000f00c8  mfn: 00162ed4
(XEN)   gfn: 000f00c9  mfn: 0010141e
(XEN)   gfn: 000f00ca  mfn: 00162ed3
(XEN)   gfn: 000f00cb  mfn: 0010140b
(XEN)   gfn: 000f00cc  mfn: 00162ed2
(XEN)   gfn: 000f00cd  mfn: 0010140a
(XEN)   gfn: 000f00ce  mfn: 00162ed1
(XEN)   gfn: 000f00cf  mfn: 00102c67
(XEN)   gfn: 000f00d0  mfn: 00162ed0
(XEN)   gfn: 000f00d1  mfn: 00102c66
(XEN)   gfn: 000f00d2  mfn: 001632d7
(XEN)   gfn: 000f00d3  mfn: 00102517
(XEN)   gfn: 000f00d4  mfn: 001632d6
(XEN)   gfn: 000f00d5  mfn: 00102516
(XEN)   gfn: 000f00d6  mfn: 001632d5
(XEN)   gfn: 000f00d7  mfn: 0010274f
(XEN)   gfn: 000f00d8  mfn: 001632d4
(XEN)   gfn: 000f00d9  mfn: 0010274e
(XEN)   gfn: 000f00da  mfn: 001632d3
(XEN)   gfn: 000f00db  mfn: 00102a27
(XEN)   gfn: 000f00dc  mfn: 001632d2
(XEN)   gfn: 000f00dd  mfn: 00102a26
(XEN)   gfn: 000f00de  mfn: 001632d1
(XEN)   gfn: 000f00df  mfn: 00102eb7
(XEN)   gfn: 000f00e0  mfn: 001632d0
(XEN)   gfn: 000f00e1  mfn: 00102eb6
(XEN)   gfn: 000f00e2  mfn: 001d0bdf
(XEN)   gfn: 000f00e3  mfn: 00102943
(XEN)   gfn: 000f00e4  mfn: 001d0bde
(XEN)   gfn: 000f00e5  mfn: 00102942
(XEN)   gfn: 000f00e6  mfn: 001d0bdd
(XEN)   gfn: 000f00e7  mfn: 0010271f
(XEN)   gfn: 000f00e8  mfn: 001d0bdc
(XEN)   gfn: 000f00e9  mfn: 0010271e
(XEN)   gfn: 000f00ea  mfn: 001d0bdb
(XEN)   gfn: 000f00eb  mfn: 00102837
(XEN)   gfn: 000f00ec  mfn: 001d0bda
(XEN)   gfn: 000f00ed  mfn: 00102836
(XEN)   gfn: 000f00ee  mfn: 001d0bd9
(XEN)   gfn: 000f00ef  mfn: 00102da3
(XEN)   gfn: 000f00f0  mfn: 001d0bd8
(XEN)   gfn: 000f00f1  mfn: 00102da2
(XEN)   gfn: 000f00f2  mfn: 001d0bd7
(XEN)   gfn: 000f00f3  mfn: 00101927
(XEN)   gfn: 000f00f4  mfn: 001d0bd6
(XEN)   gfn: 000f00f5  mfn: 00101926
(XEN)   gfn: 000f00f6  mfn: 001d0bd5
(XEN)   gfn: 000f00f7  mfn: 00102dab
(XEN)   gfn: 000f00f8  mfn: 001d0bd4
(XEN)   gfn: 000f00f9  mfn: 00102daa
(XEN)   gfn: 000f00fa  mfn: 001d0bd3
(XEN)   gfn: 000f00fb  mfn: 00102e1b
(XEN)   gfn: 000f00fc  mfn: 001d0bd2
(XEN)   gfn: 000f00fd  mfn: 00102e1a
(XEN)   gfn: 000f00fe  mfn: 001d0bd1
(XEN)   gfn: 000f00ff  mfn: 00101943
(XEN)   gfn: 000f0100  mfn: 001d0bd0
(XEN)   gfn: 000f0101  mfn: 00101942
(XEN)   gfn: 000f0102  mfn: 001b1f8f
(XEN)   gfn: 000f0103  mfn: 00102bef
(XEN)   gfn: 000f0104  mfn: 001b1f8e
(XEN)   gfn: 000f0105  mfn: 00102bee
(XEN)   gfn: 000f0106  mfn: 001b1f8d
(XEN)   gfn: 000f0107  mfn: 00101def
(XEN)   gfn: 000f0108  mfn: 001b1f8c
(XEN)   gfn: 000f0109  mfn: 00101dee
(XEN)   gfn: 000f010a  mfn: 001b1f8b
(XEN)   gfn: 000f010b  mfn: 00102973
(XEN)   gfn: 000f010c  mfn: 001b1f8a
(XEN)   gfn: 000f010d  mfn: 00102972
(XEN)   gfn: 000f010e  mfn: 001b1f89
(XEN)   gfn: 000f010f  mfn: 0010298b
(XEN)   gfn: 000f0110  mfn: 001b1f88
(XEN)   gfn: 000f0111  mfn: 0010298a
(XEN)   gfn: 000f0112  mfn: 001b1f87
(XEN)   gfn: 000f0113  mfn: 00100301
(XEN)   gfn: 000f0114  mfn: 001b1f86
(XEN)   gfn: 000f0115  mfn: 00100300
(XEN)   gfn: 000f0116  mfn: 001b1f85
(XEN)   gfn: 000f0117  mfn: 001002ff
(XEN)   gfn: 000f0118  mfn: 001b1f84
(XEN)   gfn: 000f0119  mfn: 001002fe
(XEN)   gfn: 000f011a  mfn: 001b1f83
(XEN)   gfn: 000f011b  mfn: 00102803
(XEN)   gfn: 000f011c  mfn: 001b1f8+2
(XEN)   gfn: 000f011d  mfn: 00102802
(XEN)   gfn: 000f011e  mfn: 001b1f81
(XEN)   gfn: 000f011f  mfn: 0010038f
(XEN)   gfn: 000f0120  mfn: 001b1f80
(XEN)   gfn: 000f0121  mfn: 0010038e
(XEN)   gfn: 000f0122  mfn: 001b06cf
(XEN)   gfn: 000f0123  mfn: 00102e23
(XEN)   gfn: 000f0124  mfn: 001b06ce
(XEN)   gfn: 000f0125  mfn: 00102e22
(XEN)   gfn: 000f0126  mfn: 001b06cd
(XEN)   gfn: 000f0127  mfn: 0010279b
(XEN)   gfn: 000f0128  mfn: 001b06cc
(XEN)   gfn: 000f0129  mfn: 0010279a
(XEN)   gfn: 000f012a  mfn: 001b06cb
(XEN)   gfn: 000f012b  mfn: 00102c33
(XEN)   gfn: 000f012c  mfn: 001b06ca
(XEN)   gfn: 000f012d  mfn: 00102c32
(XEN)   gfn: 000f012e  mfn: 001b06c9
(XEN)   gfn: 000f012f  mfn: 001028d7
(XEN)   gfn: 000f0130  mfn: 001b06c8
(XEN)   gfn: 000f0131  mfn: 001028d6
(XEN)   gfn: 000f0132  mfn: 001b06c7
(XEN)   gfn: 000f0133  mfn: 00102c6f
(XEN)   gfn: 000f0134  mfn: 001b06c6
(XEN)   gfn: 000f0135  mfn: 00102c6e
(XEN)   gfn: 000f0136  mfn: 001b06c5
(XEN)   gfn: 000f0137  mfn: 00102d8f
(XEN)   gfn: 000f0138  mfn: 001b06c4
(XEN)   gfn: 000f0139  mfn: 00102d8e
(XEN)   gfn: 000f013a  mfn: 001b06c3
(XEN)   gfn: 000f013b  mfn: 001018bf
(XEN)   gfn: 000f013c  mfn: 001b06c2
(XEN)   gfn: 000f013d  mfn: 001018be
(XEN)   gfn: 000f013e  mfn: 001b06c1
(XEN)   gfn: 000f013f  mfn: 00102371
(XEN)   gfn: 000f0140  mfn: 001b06c0
(XEN)   gfn: 000f0141  mfn: 00102370
(XEN)   gfn: 000f0142  mfn: 00162ecf
(XEN)   gfn: 000f0143  mfn: 00102ecf
(XEN)   gfn: 000f0144  mfn: 00162ece
(XEN)   gfn: 000f0145  mfn: 00102ece
(XEN)   gfn: 000f0146  mfn: 00162ecd
(XEN)   gfn: 000f0147  mfn: 001027a3
(XEN)   gfn: 000f0148  mfn: 00162ecc
(XEN)   gfn: 000f0149  mfn: 001027a2
(XEN)   gfn: 000f014a  mfn: 00162ecb
(XEN)   gfn: 000f014b  mfn: 0010184f
(XEN)   gfn: 000f014c  mfn: 00162eca
(XEN)   gfn: 000f014d  mfn: 0010184e
(XEN)   gfn: 000f014e  mfn: 00162ec9
(XEN)   gfn: 000f014f  mfn: 0010156b
(XEN)   gfn: 000f0150  mfn: 00162ec8
(XEN)   gfn: 000f0151  mfn: 0010156a
(XEN)   gfn: 000f0152  mfn: 00162ec7
(XEN)   gfn: 000f0153  mfn: 00101783
(XEN)   gfn: 000f0154  mfn: 00162ec6
(XEN)   gfn: 000f0155  mfn: 00101782
(XEN)   gfn: 000f0156  mfn: 00162ec5
(XEN)   gfn: 000f0157  mfn: 00101365
(XEN)   gfn: 000f0158  mfn: 00162ec4
(XEN)   gfn: 000f0159  mfn: 00101364
(XEN)   gfn: 000f015a  mfn: 00162ec3
(XEN)   gfn: 000f015b  mfn: 00101363
(XEN)   gfn: 000f015c  mfn: 00162ec2
(XEN)   gfn: 000f015d  mfn: 00101362
(XEN)   gfn: 000f015e  mfn: 00162ec1
(XEN)   gfn: 000f015f  mfn: 00101357
(XEN)   gfn: 000f0160  mfn: 00162ec0
(XEN)   gfn: 000f0161  mfn: 00101356
(XEN)   gfn: 000f0162  mfn: 001632cf
(XEN)   gfn: 000f0163  mfn: 00102bd9
(XEN)   gfn: 000f0164  mfn: 001632ce
(XEN)   gfn: 000f0165  mfn: 00102bd8
(XEN)   gfn: 000f0166  mfn: 001632cd
(XEN)   gfn: 000f0167  mfn: 001002df
(XEN)   gfn: 000f0168  mfn: 001632cc
(XEN)   gfn: 000f0169  mfn: 001002de
(XEN)   gfn: 000f016a  mfn: 001632cb
(XEN)   gfn: 000f016b  mfn: 00102bcb
(XEN)   gfn: 000f016c  mfn: 001632ca
(XEN)   gfn: 000f016d  mfn: 00102bca
(XEN)   gfn: 000f016e  mfn: 001632c9
(XEN)   gfn: 000f016f  mfn: 00102e53
(XEN)   gfn: 000f0170  mfn: 001632c8
(XEN)   gfn: 000f0171  mfn: 00102e52
(XEN)   gfn: 000f0172  mfn: 001632c7
(XEN)   gfn: 000f0173  mfn: 0010253b
(XEN)   gfn: 000f0174  mfn: 001632c6
(XEN)   gfn: 000f0175  mfn: 0010253a
(XEN)   gfn: 000f0176  mfn: 001632c5
(XEN)   gfn: 000f0177  mfn: 0010257d
(XEN)   gfn: 000f0178  mfn: 001632c4
(XEN)   gfn: 000f0179  mfn: 0010257c
(XEN)   gfn: 000f017a  mfn: 001632c3
(XEN)   gfn: 000f017b  mfn: 00102579
(XEN)   gfn: 000f017c  mfn: 001632c2
(XEN)   gfn: 000f017d  mfn: 00102578
(XEN)   gfn: 000f017e  mfn: 001632c1
(XEN)   gfn: 000f017f  mfn: 001096db
(XEN)   gfn: 000f0180  mfn: 001632c0
(XEN)   gfn: 000f0181  mfn: 001096da
(XEN)   gfn: 000f0182  mfn: 001b06bf
(XEN)   gfn: 000f0183  mfn: 00109edb
(XEN)   gfn: 000f0184  mfn: 001b06be
(XEN)   gfn: 000f0185  mfn: 00109eda
(XEN)   gfn: 000f0186  mfn: 001b06bd
(XEN)   gfn: 000f0187  mfn: 00102c9b
(XEN)   gfn: 000f0188  mfn: 001b06bc
(XEN)   gfn: 000f0189  mfn: 00102c9a
(XEN)   gfn: 000f018a  mfn: 001b06bb
(XEN)   gfn: 000f018b  mfn: 00102d07
(XEN)   gfn: 000f018c  mfn: 001b06ba
(XEN)   gfn: 000f018d  mfn: 00102d06
(XEN)   gfn: 000f018e  mfn: 001b06b9
(XEN)   gfn: 000f018f  mfn: 00102d1b
(XEN)   gfn: 000f0190  mfn: 001b06b8
(XEN)   gfn: 000f0191  mfn: 00102d1a
(XEN)   gfn: 000f0192  mfn: 001b06b7
(XEN)   gfn: 000f0193  mfn: 00102e2f
(XEN)   gfn: 000f0194  mfn: 001b06b6
(XEN)   gfn: 000f0195  mfn: 00102e2e
(XEN)   gfn: 000f0196  mfn: 001b06b5
(XEN)   gfn: 000f0197  mfn: 00101329
(XEN)   gfn: 000f0198  mfn: 001b06b4
(XEN)   gfn: 000f0199  mfn: 00101328
(XEN)   gfn: 000f019a  mfn: 001b06b3
(XEN)   gfn: 000f019b  mfn: 00102d7b
(XEN)   gfn: 000f019c  mfn: 001b06b2
(XEN)   gfn: 000f019d  mfn: 00102d7a
(XEN)   gfn: 000f019e  mfn: 001b06b1
(XEN)   gfn: 000f019f  mfn: 0010296b
(XEN)   gfn: 000f01a0  mfn: 001b06b0
(XEN)   gfn: 000f01a1  mfn: 0010296a
(XEN)   gfn: 000f01a2  mfn: 001b06af
(XEN)   gfn: 000f01a3  mfn: 00102893
(XEN)   gfn: 000f01a4  mfn: 001b06ae
(XEN)   gfn: 000f01a5  mfn: 00102892
(XEN)   gfn: 000f01a6  mfn: 001b06ad
(XEN)   gfn: 000f01a7  mfn: 00101897
(XEN)   gfn: 000f01a8  mfn: 001b06ac
(XEN)   gfn: 000f01a9  mfn: 00101896
(XEN)   gfn: 000f01aa  mfn: 001b06ab
(XEN)   gfn: 000f01ab  mfn: 0010246f
(XEN)   gfn: 000f01ac  mfn: 001b06aa
(XEN)   gfn: 000f01ad  mfn: 0010246e
(XEN)   gfn: 000f01ae  mfn: 001b06a9
(XEN)   gfn: 000f01af  mfn: 00102929
(XEN)   gfn: 000f01b0  mfn: 001b06a8
(XEN)   gfn: 000f01b1  mfn: 00102928
(XEN)   gfn: 000f01b2  mfn: 001b06a7
(XEN)   gfn: 000f01b3  mfn: 00102be1
(XEN)   gfn: 000f01b4  mfn: 001b06a6
(XEN)   gfn: 000f01b5  mfn: 00102be0
(XEN)   gfn: 000f01b6  mfn: 001b06a5
(XEN)   gfn: 000f01b7  mfn: 00101869
(XEN)   gfn: 000f01b8  mfn: 001b06a4
(XEN)   gfn: 000f01b9  mfn: 00101868
(XEN)   gfn: 000f01ba  mfn: 001b06a3
(XEN)   gfn: 000f01bb  mfn: 0010195f
(XEN)   gfn: 000f01bc  mfn: 001b06a2
(XEN)   gfn: 000f01bd  mfn: 0010195e
(XEN)   gfn: 000f01be  mfn: 001b06a1
(XEN)   gfn: 000f01bf  mfn: 00102751
(XEN)   gfn: 000f01c0  mfn: 001b06a0
(XEN)   gfn: 000f01c1  mfn: 00102750
(XEN)   gfn: 000f01c2  mfn: 001b069f
(XEN)   gfn: 000f01c3  mfn: 0010147f
(XEN)   gfn: 000f01c4  mfn: 001b069e
(XEN)   gfn: 000f01c5  mfn: 0010147e
(XEN)   gfn: 000f01c6  mfn: 001b069d
(XEN)   gfn: 000f01c7  mfn: 00101453
(XEN)   gfn: 000f01c8  mfn: 001b069c
(XEN)   gfn: 000f01c9  mfn: 00101452
(XEN)   gfn: 000f01ca  mfn: 001b069b
(XEN)   gfn: 000f01cb  mfn: 0010176d
(XEN)   gfn: 000f01cc  mfn: 001b069a
(XEN)   gfn: 000f01cd  mfn: 0010176c
(XEN)   gfn: 000f01ce  mfn: 001b0699
(XEN)   gfn: 000f01cf  mfn: 00101511
(XEN)   gfn: 000f01d0  mfn: 001b0698
(XEN)   gfn: 000f01d1  mfn: 00101510
(XEN)   gfn: 000f01d2  mfn: 001b0697
(XEN)   gfn: 000f01d3  mfn: 001028b5
(XEN)   gfn: 000f01d4  mfn: 001b0696
(XEN)   gfn: 000f01d5  mfn: 001028b4
(XEN)   gfn: 000f01d6  mfn: 001b0695
(XEN)   gfn: 000f01d7  mfn: 00101411
(XEN)   gfn: 000f01d8  mfn: 001b0694
(XEN)   gfn: 000f01d9  mfn: 00101410
(XEN)   gfn: 000f01da  mfn: 001b0693
(XEN)   gfn: 000f01db  mfn: 001015a7
(XEN)   gfn: 000f01dc  mfn: 001b0692
(XEN)   gfn: 000f01dd  mfn: 001015a6
(XEN)   gfn: 000f01de  mfn: 001b0691
(XEN)   gfn: 000f01df  mfn: 00102cf5
(XEN)   gfn: 000f01e0  mfn: 001b0690
(XEN)   gfn: 000f01e1  mfn: 00102cf4
(XEN)   gfn: 000f01e2  mfn: 001b068f
(XEN)   gfn: 000f01e3  mfn: 001027c1
(XEN)   gfn: 000f01e4  mfn: 001b068e
(XEN)   gfn: 000f01e5  mfn: 001027c0
(XEN)   gfn: 000f01e6  mfn: 001b068d
(XEN)   gfn: 000f01e7  mfn: 00100533
(XEN)   gfn: 000f01e8  mfn: 001b068c
(XEN)   gfn: 000f01e9  mfn: 00100532
(XEN)   gfn: 000f01ea  mfn: 001b068b
(XEN)   gfn: 000f01eb  mfn: 00102e95
(XEN)   gfn: 000f01ec  mfn: 001b068a
(XEN)   gfn: 000f01ed  mfn: 00102e94
(XEN)   gfn: 000f01ee  mfn: 001b0689
(XEN)   gfn: 000f01ef  mfn: 00101491
(XEN)   gfn: 000f01f0  mfn: 001b0688
(XEN)   gfn: 000f01f1  mfn: 00101490
(XEN)   gfn: 000f01f2  mfn: 001b0687
(XEN)   gfn: 000f01f3  mfn: 0010130d
(XEN)   gfn: 000f01f4  mfn: 001b0686
(XEN)   gfn: 000f01f5  mfn: 0010130c
(XEN)   gfn: 000f01f6  mfn: 001b0685
(XEN)   gfn: 000f01f7  mfn: 00101715
(XEN)   gfn: 000f01f8  mfn: 001b0684
(XEN)   gfn: 000f01f9  mfn: 00101714
(XEN)   gfn: 000f01fa  mfn: 001b0683
(XEN)   gfn: 000f01fb  mfn: 00101399
(XEN)   gfn: 000f01fc  mfn: 001b0682
(XEN)   gfn: 000f01fd  mfn: 00101398
(XEN)   gfn: 000f01fe  mfn: 001b0681
(XEN)   gfn: 000f01ff  mfn: 00101e83
(XEN)   gfn: 000f0200  mfn: 001b0680
(XEN)   gfn: 000f0201  mfn: 00101e82
(XEN)   gfn: 000f0202  mfn: 00162ebf
(XEN)   gfn: 000f0203  mfn: 001013a9
(XEN)   gfn: 000f0204  mfn: 00162ebe
(XEN)   gfn: 000f0205  mfn: 001013a8
(XEN)   gfn: 000f0206  mfn: 00162ebd
(XEN)   gfn: 000f0207  mfn: 00102883
(XEN)   gfn: 000f0208  mfn: 00162ebc
(XEN)   gfn: 000f0209  mfn: 00102882
(XEN)   gfn: 000f020a  mfn: 00162ebb
(XEN)   gfn: 000f020b  mfn: 00102945
(XEN)   gfn: 000f020c  mfn: 00162eba
(XEN)   gfn: 000f020d  mfn: 00102944
(XEN)   gfn: 000f020e  mfn: 00162eb9
(XEN)   gfn: 000f020f  mfn: 00101ac3
(XEN)   gfn: 000f0210  mfn: 00162eb8
(XEN)   gfn: 000f0211  mfn: 00101ac2
(XEN)   gfn: 000f0212  mfn: 00162eb7
(XEN)   gfn: 000f0213  mfn: 00101ac1
(XEN)   gfn: 000f0214  mfn: 00162eb6
(XEN)   gfn: 000f0215  mfn: 00101ac0
(XEN)   gfn: 000f0216  mfn: 00162eb5
(XEN)   gfn: 000f0217  mfn: 00101747
(XEN)   gfn: 000f0218  mfn: 00162eb4
(XEN)   gfn: 000f0219  mfn: 00101746
(XEN)   gfn: 000f021a  mfn: 00162eb3
(XEN)   gfn: 000f021b  mfn: 00101745
(XEN)   gfn: 000f021c  mfn: 00162eb2
(XEN)   gfn: 000f021d  mfn: 00101744
(XEN)   gfn: 000f021e  mfn: 00162eb1
(XEN)   gfn: 000f021f  mfn: 001029f7
(XEN)   gfn: 000f0220  mfn: 00162eb0
(XEN)   gfn: 000f0221  mfn: 001029f6
(XEN)   gfn: 000f0222  mfn: 00162eaf
(XEN)   gfn: 000f0223  mfn: 001029f5
(XEN)   gfn: 000f0224  mfn: 00162eae
(XEN)   gfn: 000f0225  mfn: 001029f4
(XEN)   gfn: 000f0226  mfn: 00162ead
(XEN)   gfn: 000f0227  mfn: 00102d37
(XEN)   gfn: 000f0228  mfn: 00162eac
(XEN)   gfn: 000f0229  mfn: 00102d36
(XEN)   gfn: 000f022a  mfn: 00162eab
(XEN)   gfn: 000f022b  mfn: 00102d35
(XEN)   gfn: 000f022c  mfn: 00162eaa
(XEN)   gfn: 000f022d  mfn: 00102d34
(XEN)   gfn: 000f022e  mfn: 00162ea9
(XEN)   gfn: 000f022f  mfn: 00102737
(XEN)   gfn: 000f0230  mfn: 00162ea8
(XEN)   gfn: 000f0231  mfn: 00102736
(XEN)   gfn: 000f0232  mfn: 00162ea7
(XEN)   gfn: 000f0233  mfn: 00102735
(XEN)   gfn: 000f0234  mfn: 00162ea6
(XEN)   gfn: 000f0235  mfn: 00102734
(XEN)   gfn: 000f0236  mfn: 00162ea5
(XEN)   gfn: 000f0237  mfn: 001019db
(XEN)   gfn: 000f0238  mfn: 00162ea4
(XEN)   gfn: 000f0239  mfn: 001019da
(XEN)   gfn: 000f023a  mfn: 00162ea3
(XEN)   gfn: 000f023b  mfn: 001019d9
(XEN)   gfn: 000f023c  mfn: 00162ea2
(XEN)   gfn: 000f023d  mfn: 001019d8
(XEN)   gfn: 000f023e  mfn: 00162ea1
(XEN)   gfn: 000f023f  mfn: 00101d9b
(XEN)   gfn: 000f0240  mfn: 00162ea0
(XEN)   gfn: 000f0241  mfn: 00101d9a
(XEN)   gfn: 000f0242  mfn: 00162e9f
(XEN)   gfn: 000f0243  mfn: 00101d99
(XEN)   gfn: 000f0244  mfn: 00162e9e
(XEN)   gfn: 000f0245  mfn: 00101d98
(XEN)   gfn: 000f0246  mfn: 00162e9d
(XEN)   gfn: 000f0247  mfn: 00101777
(XEN)   gfn: 000f0248  mfn: 00162e9c
(XEN)   gfn: 000f0249  mfn: 00101776
(XEN)   gfn: 000f024a  mfn: 00162e9b
(XEN)   gfn: 000f024b  mfn: 00101775
(XEN)   gfn: 000f024c  mfn: 00162e9a
(XEN)   gfn: 000f024d  mfn: 00101774
(XEN)   gfn: 000f024e  mfn: 00162e99
(XEN)   gfn: 000f024f  mfn: 00102927
(XEN)   gfn: 000f0250  mfn: 00162e98
(XEN)   gfn: 000f0251  mfn: 00102926
(XEN)   gfn: 000f0252  mfn: 00162e97
(XEN)   gfn: 000f0253  mfn: 00102925
(XEN)   gfn: 000f0254  mfn: 00162e96
(XEN)   gfn: 000f0255  mfn: 00102924
(XEN)   gfn: 000f0256  mfn: 00162e95
(XEN)   gfn: 000f0257  mfn: 00101563
(XEN)   gfn: 000f0258  mfn: 00162e94
(XEN)   gfn: 000f0259  mfn: 00101562
(XEN)   gfn: 000f025a  mfn: 00162e93
(XEN)   gfn: 000f025b  mfn: 00101561
(XEN)   gfn: 000f025c  mfn: 00162e92
(XEN)   gfn: 000f025d  mfn: 00101560
(XEN)   gfn: 000f025e  mfn: 00162e91
(XEN)   gfn: 000f025f  mfn: 00102d83
(XEN)   gfn: 000f0260  mfn: 00162e90
(XEN)   gfn: 000f0261  mfn: 00102d82
(XEN)   gfn: 000f0262  mfn: 00162e8f
(XEN)   gfn: 000f0263  mfn: 00102d81
(XEN)   gfn: 000f0264  mfn: 00162e8e
(XEN)   gfn: 000f0265  mfn: 00102d80
(XEN)   gfn: 000f0266  mfn: 00162e8d
(XEN)   gfn: 000f0267  mfn: 00102d7f
(XEN)   gfn: 000f0268  mfn: 00162e8c
(XEN)   gfn: 000f0269  mfn: 00102d7e
(XEN)   gfn: 000f026a  mfn: 00162e8b
(XEN)   gfn: 000f026b  mfn: 00102d7d
(XEN)   gfn: 000f026c  mfn: 00162e8a
(XEN)   gfn: 000f026d  mfn: 00102d7c
(XEN)   gfn: 000f026e  mfn: 00162e89
(XEN)   gfn: 000f026f  mfn: 00102ccf
(XEN)   gfn: 000f0270  mfn: 00162e88
(XEN)   gfn: 000f0271  mfn: 00102cce
(XEN)   gfn: 000f0272  mfn: 00162e87
(XEN)   gfn: 000f0273  mfn: 00102ccd
(XEN)   gfn: 000f0274  mfn: 00162e86
(XEN)   gfn: 000f0275  mfn: 00102ccc
(XEN)   gfn: 000f0276  mfn: 00162e85
(XEN)   gfn: 000f0277  mfn: 001029fb
(XEN)   gfn: 000f0278  mfn: 00162e84
(XEN)   gfn: 000f0279  mfn: 001029fa
(XEN)   gfn: 000f027a  mfn: 00162e83
(XEN)   gfn: 000f027b  mfn: 001029f9
(XEN)   gfn: 000f027c  mfn: 00162e82
(XEN)   gfn: 000f027d  mfn: 001029f8
(XEN)   gfn: 000f027e  mfn: 00162e81
(XEN)   gfn: 000f027f  mfn: 001004b7
(XEN)   gfn: 000f0280  mfn: 00162e80
(XEN)   gfn: 000f0281  mfn: 001004b6
(XEN)   gfn: 000f0282  mfn: 001632bf
(XEN)   gfn: 000f0283  mfn: 001004b5
(XEN)   gfn: 000f0284  mfn: 001632be
(XEN)   gfn: 000f0285  mfn: 001004b4
(XEN)   gfn: 000f0286  mfn: 001632bd
(XEN)   gfn: 000f0287  mfn: 00101307
(XEN)   gfn: 000f0288  mfn: 001632bc
(XEN)   gfn: 000f0289  mfn: 00101306
(XEN)   gfn: 000f028a  mfn: 001632bb
(XEN)   gfn: 000f028b  mfn: 00101305
(XEN)   gfn: 000f028c  mfn: 001632ba
(XEN)   gfn: 000f028d  mfn: 00101304
(XEN)   gfn: 000f028e  mfn: 001632b9
(XEN)   gfn: 000f028f  mfn: 0010130b
(XEN)   gfn: 000f0290  mfn: 001632b8
(XEN)   gfn: 000f0291  mfn: 0010130a
(XEN)   gfn: 000f0292  mfn: 001632b7
(XEN)   gfn: 000f0293  mfn: 00101309
(XEN)   gfn: 000f0294  mfn: 001632b6
(XEN)   gfn: 000f0295  mfn: 00101308
(XEN)   gfn: 000f0296  mfn: 001632b5
(XEN)   gfn: 000f0297  mfn: 00102e57
(XEN)   gfn: 000f0298  mfn: 001632b4
(XEN)   gfn: 000f0299  mfn: 00102e56
(XEN)   gfn: 000f029a  mfn: 001632b3
(XEN)   gfn: 000f029b  mfn: 00102e55
(XEN)   gfn: 000f029c  mfn: 001632b2
(XEN)   gfn: 000f029d  mfn: 00102e54
(XEN)   gfn: 000f029e  mfn: 001632b1
(XEN)   gfn: 000f029f  mfn: 0010266f
(XEN)   gfn: 000f02a0  mfn: 001632b0
(XEN)   gfn: 000f02a1  mfn: 0010266e
(XEN)   gfn: 000f02a2  mfn: 001632af
(XEN)   gfn: 000f02a3  mfn: 0010266d
(XEN)   gfn: 000f02a4  mfn: 001632ae
(XEN)   gfn: 000f02a5  mfn: 0010266c
(XEN)   gfn: 000f02a6  mfn: 001632ad
(XEN)   gfn: 000f02a7  mfn: 001017a7
(XEN)   gfn: 000f02a8  mfn: 001632ac
(XEN)   gfn: 000f02a9  mfn: 001017a6
(XEN)   gfn: 000f02aa  mfn: 001632ab
(XEN)   gfn: 000f02ab  mfn: 001017a5
(XEN)   gfn: 000f02ac  mfn: 001632aa
(XEN)   gfn: 000f02ad  mfn: 001017a4
(XEN)   gfn: 000f02ae  mfn: 001632a9
(XEN)   gfn: 000f02af  mfn: 001096df
(XEN)   gfn: 000f02b0  mfn: 001632a8
(XEN)   gfn: 000f02b1  mfn: 001096de
(XEN)   gfn: 000f02b2  mfn: 001632a7
(XEN)   gfn: 000f02b3  mfn: 001096dd
(XEN)   gfn: 000f02b4  mfn: 001632a6
(XEN)   gfn: 000f02b5  mfn: 001096dc
(XEN)   gfn: 000f02b6  mfn: 001632a5
(XEN)   gfn: 000f02b7  mfn: 00109edf
(XEN)   gfn: 000f02b8  mfn: 001632a4
(XEN)   gfn: 000f02b9  mfn: 00109ede
(XEN)   gfn: 000f02ba  mfn: 001632a3
(XEN)   gfn: 000f02bb  mfn: 00109edd
(XEN)   gfn: 000f02bc  mfn: 001632a2
(XEN)   gfn: 000f02bd  mfn: 00109edc
(XEN)   gfn: 000f02be  mfn: 001632a1
(XEN)   gfn: 000f02bf  mfn: 001025ef
(XEN)   gfn: 000f02c0  mfn: 001632a0
(XEN)   gfn: 000f02c1  mfn: 001025ee
(XEN)   gfn: 000f02c2  mfn: 0016329f
(XEN)   gfn: 000f02c3  mfn: 001025ed
(XEN)   gfn: 000f02c4  mfn: 0016329e
(XEN)   gfn: 000f02c5  mfn: 001025ec
(XEN)   gfn: 000f02c6  mfn: 0016329d
(XEN)   gfn: 000f02c7  mfn: 00102bd7
(XEN)   gfn: 000f02c8  mfn: 0016329c
(XEN)   gfn: 000f02c9  mfn: 00102bd6
(XEN)   gfn: 000f02ca  mfn: 0016329b
(XEN)   gfn: 000f02cb  mfn: 00102bd5
(XEN)   gfn: 000f02cc  mfn: 0016329a
(XEN)   gfn: 000f02cd  mfn: 00102bd4
(XEN)   gfn: 000f02ce  mfn: 00163299
(XEN)   gfn: 000f02cf  mfn: 00101e97
(XEN)   gfn: 000f02d0  mfn: 00163298
(XEN)   gfn: 000f02d1  mfn: 00101e96
(XEN)   gfn: 000f02d2  mfn: 00163297
(XEN)   gfn: 000f02d3  mfn: 00101e95
(XEN)   gfn: 000f02d4  mfn: 00163296
(XEN)   gfn: 000f02d5  mfn: 00101e94
(XEN)   gfn: 000f02d6  mfn: 00163295
(XEN)   gfn: 000f02d7  mfn: +00101e4f
(XEN)   gfn: 000f02d8  mfn: 00163294
(XEN)   gfn: 000f02d9  mfn: 00101e4e
(XEN)   gfn: 000f02da  mfn: 00163293
(XEN)   gfn: 000f02db  mfn: 00101e4d
(XEN)   gfn: 000f02dc  mfn: 00163292
(XEN)   gfn: 000f02dd  mfn: 00101e4c
(XEN)   gfn: 000f02de  mfn: 00163291
(XEN)   gfn: 000f02df  mfn: 00101abf
(XEN)   gfn: 000f02e0  mfn: 00163290
(XEN)   gfn: 000f02e1  mfn: 00101abe
(XEN)   gfn: 000f02e2  mfn: 0016328f
(XEN)   gfn: 000f02e3  mfn: 00101abd
(XEN)   gfn: 000f02e4  mfn: 0016328e
(XEN)   gfn: 000f02e5  mfn: 00101abc
(XEN)   gfn: 000f02e6  mfn: 0016328d
(XEN)   gfn: 000f02e7  mfn: 00102bcf
(XEN)   gfn: 000f02e8  mfn: 0016328c
(XEN)   gfn: 000f02e9  mfn: 00102bce
(XEN)   gfn: 000f02ea  mfn: 0016328b
(XEN)   gfn: 000f02eb  mfn: 00102bcd
(XEN)   gfn: 000f02ec  mfn: 0016328a
(XEN)   gfn: 000f02ed  mfn: 00102bcc
(XEN)   gfn: 000f02ee  mfn: 00163289
(XEN)   gfn: 000f02ef  mfn: 00102e7f
(XEN)   gfn: 000f02f0  mfn: 00163288
(XEN)   gfn: 000f02f1  mfn: 00102e7e
(XEN)   gfn: 000f02f2  mfn: 00163287
(XEN)   gfn: 000f02f3  mfn: 00102e7d
(XEN)   gfn: 000f02f4  mfn: 00163286
(XEN)   gfn: 000f02f5  mfn: 00102e7c
(XEN)   gfn: 000f02f6  mfn: 00163285
(XEN)   gfn: 000f02f7  mfn: 0010134b
(XEN)   gfn: 000f02f8  mfn: 00163284
(XEN)   gfn: 000f02f9  mfn: 0010134a
(XEN)   gfn: 000f02fa  mfn: 00163283
(XEN)   gfn: 000f02fb  mfn: 00101349
(XEN)   gfn: 000f02fc  mfn: 00163282
(XEN)   gfn: 000f02fd  mfn: 00101348
(XEN)   gfn: 000f02fe  mfn: 00163281
(XEN)   gfn: 000f02ff  mfn: 0010275b
(XEN)   gfn: 000f0300  mfn: 00163280
(XEN)   gfn: 000f0301  mfn: 0010275a
(XEN)   gfn: 000f0302  mfn: 001630ff
(XEN)   gfn: 000f0303  mfn: 00102759
(XEN)   gfn: 000f0304  mfn: 001630fe
(XEN)   gfn: 000f0305  mfn: 00102758
(XEN)   gfn: 000f0306  mfn: 001630fd
(XEN)   gfn: 000f0307  mfn: 00102df3
(XEN)   gfn: 000f0308  mfn: 001630fc
(XEN)   gfn: 000f0309  mfn: 00102df2
(XEN)   gfn: 000f030a  mfn: 001630fb
(XEN)   gfn: 000f030b  mfn: 00102df1
(XEN)   gfn: 000f030c  mfn: 001630fa
(XEN)   gfn: 000f030d  mfn: 00102df0
(XEN)   gfn: 000f030e  mfn: 001630f9
(XEN)   gfn: 000f030f  mfn: 001012df
(XEN)   gfn: 000f0310  mfn: 001630f8
(XEN)   gfn: 000f0311  mfn: 001012de
(XEN)   gfn: 000f0312  mfn: 001630f7
(XEN)   gfn: 000f0313  mfn: 001012dd
(XEN)   gfn: 000f0314  mfn: 001630f6
(XEN)   gfn: 000f0315  mfn: 001012dc
(XEN)   gfn: 000f0316  mfn: 001630f5
(XEN)   gfn: 000f0317  mfn: 0010035b
(XEN)   gfn: 000f0318  mfn: 001630f4
(XEN)   gfn: 000f0319  mfn: 0010035a
(XEN)   gfn: 000f031a  mfn: 001630f3
(XEN)   gfn: 000f031b  mfn: 00100359
(XEN)   gfn: 000f031c  mfn: 001630f2
(XEN)   gfn: 000f031d  mfn: 00100358
(XEN)   gfn: 000f031e  mfn: 001630f1
(XEN)   gfn: 000f031f  mfn: 001025e7
(XEN)   gfn: 000f0320  mfn: 001630f0
(XEN)   gfn: 000f0321  mfn: 001025e6
(XEN)   gfn: 000f0322  mfn: 001630ef
(XEN)   gfn: 000f0323  mfn: 001025e5
(XEN)   gfn: 000f0324  mfn: 001630ee
(XEN)   gfn: 000f0325  mfn: 001025e4
(XEN)   gfn: 000f0326  mfn: 001630ed
(XEN)   gfn: 000f0327  mfn: 001025e3
(XEN)   gfn: 000f0328  mfn: 001630ec
(XEN)   gfn: 000f0329  mfn: 001025e2
(XEN)   gfn: 000f032a  mfn: 001630eb
(XEN)   gfn: 000f032b  mfn: 001025e1
(XEN)   gfn: 000f032c  mfn: 001630ea
(XEN)   gfn: 000f032d  mfn: 001025e0
(XEN)   gfn: 000f032e  mfn: 001630e9
(XEN)   gfn: 000f032f  mfn: 00102677
(XEN)   gfn: 000f0330  mfn: 001630e8
(XEN)   gfn: 000f0331  mfn: 00102676
(XEN)   gfn: 000f0332  mfn: 001630e7
(XEN)   gfn: 000f0333  mfn: 00102675
(XEN)   gfn: 000f0334  mfn: 001630e6
(XEN)   gfn: 000f0335  mfn: 00102674
(XEN)   gfn: 000f0336  mfn: 001630e5
(XEN)   gfn: 000f0337  mfn: 00102673
(XEN)   gfn: 000f0338  mfn: 001630e4
(XEN)   gfn: 000f0339  mfn: 00102672
(XEN)   gfn: 000f033a  mfn: 001630e3
(XEN)   gfn: 000f033b  mfn: 00102671
(XEN)   gfn: 000f033c  mfn: 001630e2
(XEN)   gfn: 000f033d  mfn: 00102670
(XEN)   gfn: 000f033e  mfn: 001630e1
(XEN)   gfn: 000f033f  mfn: 00102347
(XEN)   gfn: 000f0340  mfn: 001630e0
(XEN)   gfn: 000f0341  mfn: 00102346
(XEN)   gfn: 000f0342  mfn: 001630df
(XEN)   gfn: 000f0343  mfn: 00102345
(XEN)   gfn: 000f0344  mfn: 001630de
(XEN)   gfn: 000f0345  mfn: 00102344
(XEN)   gfn: 000f0346  mfn: 001630dd
(XEN)   gfn: 000f0347  mfn: 00102343
(XEN)   gfn: 000f0348  mfn: 001630dc
(XEN)   gfn: 000f0349  mfn: 00102342
(XEN)   gfn: 000f034a  mfn: 001630db
(XEN)   gfn: 000f034b  mfn: 00102341
(XEN)   gfn: 000f034c  mfn: 001630da
(XEN)   gfn: 000f034d  mfn: 00102340
(XEN)   gfn: 000f034e  mfn: 001630d9
(XEN)   gfn: 000f034f  mfn: 00109817
(XEN)   gfn: 000f0350  mfn: 001630d8
(XEN)   gfn: 000f0351  mfn: 00109816
(XEN)   gfn: 000f0352  mfn: 001630d7
(XEN)   gfn: 000f0353  mfn: 00109815
(XEN)   gfn: 000f0354  mfn: 001630d6
(XEN)   gfn: 000f0355  mfn: 00109814
(XEN)   gfn: 000f0356  mfn: 001630d5
(XEN)   gfn: 000f0357  mfn: 00109813
(XEN)   gfn: 000f0358  mfn: 001630d4
(XEN)   gfn: 000f0359  mfn: 00109812
(XEN)   gfn: 000f035a  mfn: 001630d3
(XEN)   gfn: 000f035b  mfn: 00109811
(XEN)   gfn: 000f035c  mfn: 001630d2
(XEN)   gfn: 000f035d  mfn: 00109810
(XEN)   gfn: 000f035e  mfn: 001630d1
(XEN)   gfn: 000f035f  mfn: 0010224f
(XEN)   gfn: 000f0360  mfn: 001630d0
(XEN)   gfn: 000f0361  mfn: 0010224e
(XEN)   gfn: 000f0362  mfn: 001630cf
(XEN)   gfn: 000f0363  mfn: 0010224d
(XEN)   gfn: 000f0364  mfn: 001630ce
(XEN)   gfn: 000f0365  mfn: 0010224c
(XEN)   gfn: 000f0366  mfn: 001630cd
(XEN)   gfn: 000f0367  mfn: 0010224b
(XEN)   gfn: 000f0368  mfn: 001630cc
(XEN)   gfn: 000f0369  mfn: 0010224a
(XEN)   gfn: 000f036a  mfn: 001630cb
(XEN)   gfn: 000f036b  mfn: 00102249
(XEN)   gfn: 000f036c  mfn: 001630ca
(XEN)   gfn: 000f036d  mfn: 00102248
(XEN)   gfn: 000f036e  mfn: 001630c9
(XEN)   gfn: 000f036f  mfn: 00102247
(XEN)   gfn: 000f0370  mfn: 001630c8
(XEN)   gfn: 000f0371  mfn: 00102246
(XEN)   gfn: 000f0372  mfn: 001630c7
(XEN)   gfn: 000f0373  mfn: 00102245
(XEN)   gfn: 000f0374  mfn: 001630c6
(XEN)   gfn: 000f0375  mfn: 00102244
(XEN)   gfn: 000f0376  mfn: 001630c5
(XEN)   gfn: 000f0377  mfn: 00102243
(XEN)   gfn: 000f0378  mfn: 001630c4
(XEN)   gfn: 000f0379  mfn: 00102242
(XEN)   gfn: 000f037a  mfn: 001630c3
(XEN)   gfn: 000f037b  mfn: 00102241
(XEN)   gfn: 000f037c  mfn: 001630c2
(XEN)   gfn: 000f037d  mfn: 00102240
(XEN)   gfn: 000f037e  mfn: 001630c1
(XEN)   gfn: 000f037f  mfn: 0010980f
(XEN)   gfn: 000f0380  mfn: 001630c0
(XEN)   gfn: 000f0381  mfn: 0010980e
(XEN)   gfn: 000f0382  mfn: 001b067f
(XEN)   gfn: 000f0383  mfn: 0010980d
(XEN)   gfn: 000f0384  mfn: 001b067e
(XEN)   gfn: 000f0385  mfn: 0010980c
(XEN)   gfn: 000f0386  mfn: 001b067d
(XEN)   gfn: 000f0387  mfn: 0010980b
(XEN)   gfn: 000f0388  mfn: 001b067c
(XEN)   gfn: 000f0389  mfn: 0010980a
(XEN)   gfn: 000f038a  mfn: 001b067b
(XEN)   gfn: 000f038b  mfn: 00109809
(XEN)   gfn: 000f038c  mfn: 001b067a
(XEN)   gfn: 000f038d  mfn: 00109808
(XEN)   gfn: 000f038e  mfn: 001b0679
(XEN)   gfn: 000f038f  mfn: 00109807
(XEN)   gfn: 000f0390  mfn: 001b0678
(XEN)   gfn: 000f0391  mfn: 00109806
(XEN)   gfn: 000f0392  mfn: 001b0677
(XEN)   gfn: 000f0393  mfn: 00109805
(XEN)   gfn: 000f0394  mfn: 001b0676
(XEN)   gfn: 000f0395  mfn: 00109804
(XEN)   gfn: 000f0396  mfn: 001b0675
(XEN)   gfn: 000f0397  mfn: 00109803
(XEN)   gfn: 000f0398  mfn: 001b0674
(XEN)   gfn: 000f0399  mfn: 00109802
(XEN)   gfn: 000f039a  mfn: 001b0673
(XEN)   gfn: 000f039b  mfn: 00109801
(XEN)   gfn: 000f039c  mfn: 001b0672
(XEN)   gfn: 000f039d  mfn: 00109800
(XEN)   gfn: 000f039e  mfn: 001b0671
(XEN)   gfn: 000f039f  mfn: 001025ff
(XEN)   gfn: 000f03a0  mfn: 001b0670
(XEN)   gfn: 000f03a1  mfn: 001025fe
(XEN)   gfn: 000f03a2  mfn: 001b066f
(XEN)   gfn: 000f03a3  mfn: 001025fd
(XEN)   gfn: 000f03a4  mfn: 001b066e
(XEN)   gfn: 000f03a5  mfn: 001025fc
(XEN)   gfn: 000f03a6  mfn: 001b066d
(XEN)   gfn: 000f03a7  mfn: 001025fb
(XEN)   gfn: 000f03a8  mfn: 001b066c
(XEN)   gfn: 000f03a9  mfn: 001025fa
(XEN)   gfn: 000f03aa  mfn: 001b066b
(XEN)   gfn: 000f03ab  mfn: 001025f9
(XEN)   gfn: 000f03ac  mfn: 001b066a
(XEN)   gfn: 000f03ad  mfn: 001025f8
(XEN)   gfn: 000f03ae  mfn: 001b0669
(XEN)   gfn: 000f03af  mfn: 001025f7
(XEN)   gfn: 000f03b0  mfn: 001b0668
(XEN)   gfn: 000f03b1  mfn: 001025f6
(XEN)   gfn: 000f03b2  mfn: 001b0667
(XEN)   gfn: 000f03b3  mfn: 001025f5
(XEN)   gfn: 000f03b4  mfn: 001b0666
(XEN)   gfn: 000f03b5  mfn: 001025f4
(XEN)   gfn: 000f03b6  mfn: 001b0665
(XEN)   gfn: 000f03b7  mfn: 001025f3
(XEN)   gfn: 000f03b8  mfn: 001b0664
(XEN)   gfn: 000f03b9  mfn: 001025f2
(XEN)   gfn: 000f03ba  mfn: 001b0663
(XEN)   gfn: 000f03bb  mfn: 001025f1
(XEN)   gfn: 000f03bc  mfn: 001b0662
(XEN)   gfn: 000f03bd  mfn: 001025f0
(XEN)   gfn: 000f03be  mfn: 001b0661
(XEN)   gfn: 000f03bf  mfn: 001025df
(XEN)   gfn: 000f03c0  mfn: 001b0660
(XEN)   gfn: 000f03c1  mfn: 001025de
(XEN)   gfn: 000f03c2  mfn: 001b065f
(XEN)   gfn: 000f03c3  mfn: 001025dd
(XEN)   gfn: 000f03c4  mfn: 001b065e
(XEN)   gfn: 000f03c5  mfn: 001025dc
(XEN)   gfn: 000f03c6  mfn: 001b065d
(XEN)   gfn: 000f03c7  mfn: 001025db
(XEN)   gfn: 000f03c8  mfn: 001b065c
(XEN)   gfn: 000f03c9  mfn: 001025da
(XEN)   gfn: 000f03ca  mfn: 001b065b
(XEN)   gfn: 000f03cb  mfn: 001025d9
(XEN)   gfn: 000f03cc  mfn: 001b065a
(XEN)   gfn: 000f03cd  mfn: 001025d8
(XEN)   gfn: 000f03ce  mfn: 001b0659
(XEN)   gfn: 000f03cf  mfn: 001025d7
(XEN)   gfn: 000f03d0  mfn: 001b0658
(XEN)   gfn: 000f03d1  mfn: 001025d6
(XEN)   gfn: 000f03d2  mfn: 001b0657
(XEN)   gfn: 000f03d3  mfn: 001025d5
(XEN)   gfn: 000f03d4  mfn: 001b0656
(XEN)   gfn: 000f03d5  mfn: 001025d4
(XEN)   gfn: 000f03d6  mfn: 001b0655
(XEN)   gfn: 000f03d7  mfn: 001025d3
(XEN)   gfn: 000f03d8  mfn: 001b0654
(XEN)   gfn: 000f03d9  mfn: 001025d2
(XEN)   gfn: 000f03da  mfn: 001b0653
(XEN)   gfn: 000f03db  mfn: 001025d1
(XEN)   gfn: 000f03dc  mfn: 001b0652
(XEN)   gfn: 000f03dd  mfn: 001025d0
(XEN)   gfn: 000f03de  mfn: 001b0651
(XEN)   gfn: 000f03df  mfn: 001025cf
(XEN)   gfn: 000f03e0  mfn: 001b0650
(XEN)   gfn: 000f03e1  mfn: 001025ce
(XEN)   gfn: 000f03e2  mfn: 001b064f
(XEN)   gfn: 000f03e3  mfn: 001025cd
(XEN)   gfn: 000f03e4  mfn: 001b064e
(XEN)   gfn: 000f03e5  mfn: 001025cc
(XEN)   gfn: 000f03e6  mfn: 001b064d
(XEN)   gfn: 000f03e7  mfn: 001025cb
(XEN)   gfn: 000f03e8  mfn: 001b064c
(XEN)   gfn: 000f03e9  mfn: 001025ca
(XEN)   gfn: 000f03ea  mfn: 001b064b
(XEN)   gfn: 000f03eb  mfn: 001025c9
(XEN)   gfn: 000f03ec  mfn: 001b064a
(XEN)   gfn: 000f03ed  mfn: 001025c8
(XEN)   gfn: 000f03ee  mfn: 001b0649
(XEN)   gfn: 000f03ef  mfn: 001025c7
(XEN)   gfn: 000f03f0  mfn: 001b0648
(XEN)   gfn: 000f03f1  mfn: 001025c6
(XEN)   gfn: 000f03f2  mfn: 001b0647
(XEN)   gfn: 000f03f3  mfn: 001025c5
(XEN)   gfn: 000f03f4  mfn: 001b0646
(XEN)   gfn: 000f03f5  mfn: 001025c4
(XEN)   gfn: 000f03f6  mfn: 001b0645
(XEN)   gfn: 000f03f7  mfn: 001025c3
(XEN)   gfn: 000f03f8  mfn: 001b0644
(XEN)   gfn: 000f03f9  mfn: 001025c2
(XEN)   gfn: 000f03fa  mfn: 001b0643
(XEN)   gfn: 000f03fb  mfn: 001025c1
(XEN)   gfn: 000f03fc  mfn: 001b0642
(XEN)   gfn: 000f03fd  mfn: 001025c0
(XEN)   gfn: 000f03fe  mfn: 001b0641
(XEN)   gfn: 000f03ff  mfn: 001022ff
(XEN)   gfn: 000fc000  mfn: 001b063d
(XEN)   gfn: 000fc001  mfn: 001b0640
(XEN)   gfn: 000fc002  mfn: 001096f5
(XEN)   gfn: 000fc003  mfn: 001b063e
(XEN)   gfn: 000fc004  mfn: 001096f4
(XEN)   gfn: 000fc005  mfn: 001096f3
(XEN)   gfn: 000fc006  mfn: 001b063c
(XEN)   gfn: 000fc007  mfn: 001096f2
(XEN)   gfn: 000fc008  mfn: 001b063b
(XEN)   gfn: 000fc009  mfn: 001096f1
(XEN)   gfn: 000fc00a  mfn: 001b063a
(XEN)   gfn: 000fc00b  mfn: 001096f0
(XEN)   gfn: 000fc00c  mfn: 001b0639
(XEN)   gfn: 000fc00d  mfn: 001096ef
(XEN)   gfn: 000fc00e  mfn: 001b0638
(XEN)   gfn: 000fc00f  mfn: 001096ee
(XEN)   gfn: 000fc010  mfn: 001b0637
(XEN)   gfn: 000feffa  mfn: 000812b9
(XEN)   gfn: 000feffb  mfn: 0010275d
(XEN)   gfn: 000feffc  mfn: 00218e10
(XEN)   gfn: 000feffd  mfn: 0010275c
(XEN)   gfn: 000feffe  mfn: 00218e0f
(XEN)   gfn: 000fefff  mfn: 0010049f
(XEN)  gfn: 00100000  mfn: 001ba800
(XEN)  gfn: 00100200  mfn: 001ba600
(XEN)  gfn: 00100400  mfn: 001ba400
(XEN)  gfn: 00100600  mfn: 001ba200
(XEN)  gfn: 00100800  mfn: 001ba000
(XEN)  gfn: 00100a00  mfn: 001b9e00
(XEN)  gfn: 00100c00  mfn: 001b9c00
(XEN)  gfn: 00100e00  mfn: 001b9a00
(XEN)  gfn: 00101000  mfn: 001b9800
(XEN)  gfn: 00101200  mfn: 001b9600
(XEN)  gfn: 00101400  mfn: 001b9400
(XEN)  gfn: 00101600  mfn: 001b9200
(XEN)  gfn: 00101800  mfn: 001b9000
(XEN)  gfn: 00101a00  mfn: 001b8e00
(XEN)  gfn: 00101c00  mfn: 001b8c00
(XEN)  gfn: 00101e00  mfn: 001b8a00
(XEN)  gfn: 00102000  mfn: 001b8800
(XEN)  gfn: 00102200  mfn: 001b8600
(XEN)  gfn: 00102400  mfn: 001b8400
(XEN)  gfn: 00102600  mfn: 001b8200
(XEN)  gfn: 00102800  mfn: 001b8000
(XEN)  gfn: 00102a00  mfn: 001afe00
(XEN)  gfn: 00102c00  mfn: 001afc00
(XEN)  gfn: 00102e00  mfn: 001afa00
(XEN)  gfn: 00103000  mfn: 001af800
(XEN)  gfn: 00103200  mfn: 001af600
(XEN)  gfn: 00103400  mfn: 001af400
(XEN)  gfn: 00103600  mfn: 001af200
(XEN)  gfn: 00103800  mfn: 001af000
(XEN)  gfn: 00103a00  mfn: 001aee00
(XEN)  gfn: 00103c00  mfn: 001aec00
(XEN)  gfn: 00103e00  mfn: 001aea00
(XEN)  gfn: 00104000  mfn: 001ae800
(XEN)  gfn: 00104200  mfn: 001ae600
(XEN)  gfn: 00104400  mfn: 001ae400
(XEN)  gfn: 00104600  mfn: 001ae200
(XEN)  gfn: 00104800  mfn: 001ae000
(XEN)  gfn: 00104a00  mfn: 001ade00
(XEN)  gfn: 00104c00  mfn: 001adc00
(XEN)  gfn: 00104e00  mfn: 001ada00
(XEN)  gfn: 00105000  mfn: 001ad800
(XEN)  gfn: 00105200  mfn: 001ad600
(XEN)  gfn: 00105400  mfn: 001ad400
(XEN)  gfn: 00105600  mfn: 001ad200
(XEN)  gfn: 00105800  mfn: 001ad000
(XEN)  gfn: 00105a00  mfn: 001ace00
(XEN)  gfn: 00105c00  mfn: 001acc00
(XEN)  gfn: 00105e00  mfn: 001aca00
(XEN)  gfn: 00106000  mfn: 001ac800
(XEN)  gfn: 00106200  mfn: 001ac600
(XEN)  gfn: 00106400  mfn: 001ac400
(XEN)  gfn: 00106600  mfn: 001ac200
(XEN)  gfn: 00106800  mfn: 001ac000
(XEN)  gfn: 00106a00  mfn: 001abe00
(XEN)  gfn: 00106c00  mfn: 001abc00
(XEN)  gfn: 00106e00  mfn: 001aba00
(XEN)  gfn: 00107000  mfn: 001ab800
(XEN)  gfn: 00107200  mfn: 001ab600
(XEN)  gfn: 00107400  mfn: 001ab400
(XEN)  gfn: 00107600  mfn: 001ab200
(XEN)  gfn: 00107800  mfn: 001ab000
(XEN)  gfn: 00107a00  mfn: 001aae00
(XEN)  gfn: 00107c00  mfn: 001aac00
(XEN)  gfn: 00107e00  mfn: 001aaa00
(XEN)  gfn: 00108000  mfn: 001aa800
(XEN)  gfn: 00108200  mfn: 001aa600
(XEN)  gfn: 00108400  mfn: 001aa400
(XEN)  gfn: 00108600  mfn: 001aa200
(XEN)  gfn: 00108800  mfn: 001aa000
(XEN)  gfn: 00108a00  mfn: 001a9e00
(XEN)  gfn: 00108c00  mfn: 001a9c00
(XEN)  gfn: 00108e00  mfn: 001a9a00
(XEN)  gfn: 00109000  mfn: 001a9800
(XEN)  gfn: 00109200  mfn: 001a9600
(XEN)  gfn: 00109400  mfn: 001a9400
(XEN)  gfn: 00109600  mfn: 001a9200
(XEN)  gfn: 00109800  mfn: 001a9000
(XEN)  gfn: 00109a00  mfn: 001a8e00
(XEN)  gfn: 00109c00  mfn: 001a8c00
(XEN)  gfn: 00109e00  mfn: 001a8a00
(XEN)  gfn: 0010a000  mfn: 001a8800
(XEN)  gfn: 0010a200  mfn: 001a8600
(XEN)  gfn: 0010a400  mfn: 001a8400
(XEN)  gfn: 0010a600  mfn: 001a8200
(XEN)  gfn: 0010a800  mfn: 001a8000
(XEN)  gfn: 0010aa00  mfn: 001a7e00
(XEN)  gfn: 0010ac00  mfn: 001a7c00
(XEN)  gfn: 0010ae00  mfn: 001a7a00
(XEN)  gfn: 0010b000  mfn: 001a7800
(XEN)  gfn: 0010b200  mfn: 001a7600
(XEN)  gfn: 0010b400  mfn: 001a7400
(XEN)  gfn: 0010b600  mfn: 001a7200
(XEN)  gfn: 0010b800  mfn: 001a7000
(XEN)  gfn: 0010ba00  mfn: 001a6e00
(XEN)  gfn: 0010bc00  mfn: 001a6c00
(XEN)  gfn: 0010be00  mfn: 001a6a00
(XEN)  gfn: 0010c000  mfn: 001a6800
(XEN)  gfn: 0010c200  mfn: 001a6600
(XEN)  gfn: 0010c400  mfn: 001a6400
(XEN)  gfn: 0010c600  mfn: 001a6200
(XEN)  gfn: 0010c800  mfn: 001a6000
(XEN)  gfn: 0010ca00  mfn: 001a5e00
(XEN)  gfn: 0010cc00  mfn: 001a5c00
(XEN)  gfn: 0010ce00  mfn: 001a5a00
(XEN)  gfn: 0010d000  mfn: 001a5800
(XEN)  gfn: 0010d200  mfn: 001a5600
(XEN)  gfn: 0010d400  mfn: 001a5400
(XEN)  gfn: 0010d600  mfn: 001a5200
(XEN)  gfn: 0010d800  mfn: 001a5000
(XEN)  gfn: 0010da00  mfn: 001a4e00
(XEN)  gfn: 0010dc00  mfn: 001a4c00
(XEN)  gfn: 0010de00  mfn: 001a4a00
(XEN)  gfn: 0010e000  mfn: 001a4800
(XEN)  gfn: 0010e200  mfn: 001a4600
(XEN)  gfn: 0010e400  mfn: 001a4400
(XEN)  gfn: 0010e600  mfn: 001a4200
(XEN)  gfn: 0010e800  mfn: 001a4000
(XEN)  gfn: 0010ea00  mfn: 001a3e00
(XEN)  gfn: 0010ec00  mfn: 001a3c00
(XEN)  gfn: 0010ee00  mfn: 001a3a00
(XEN)  gfn: 0010f000  mfn: 001a3800
(XEN)  gfn: 0010f200  mfn: 001a3600
(XEN)  gfn: 0010f400  mfn: 001a3400
(XEN)  gfn: 0010f600  mfn: 001a3200
(XEN) 'A' pressed -> using alternative key handling
(XEN) stdvga.c:147:d2 entering stdvga and caching modes
+

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-15  8:54 ` Jan Beulich
  2012-08-15 10:39   ` Wei Wang
@ 2012-08-16 16:27   ` Santosh Jodh
  2012-08-17  9:21     ` Jan Beulich
  1 sibling, 1 reply; 13+ messages in thread
From: Santosh Jodh @ 2012-08-16 16:27 UTC (permalink / raw)
  To: Jan Beulich
  Cc: wei.wang2@amd.com, Tim (Xen.org), xiantao.zhang@intel.com,
	xen-devel


> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Wednesday, August 15, 2012 1:54 AM
> To: Santosh Jodh
> Cc: wei.wang2@amd.com; xiantao.zhang@intel.com; xen-devel; Tim
> (Xen.org)
> Subject: Re: [Xen-devel] [PATCH] Dump IOMMU p2m table
> 
> >>> On 14.08.12 at 21:55, Santosh Jodh <santosh.jodh@citrix.com> wrote:
> 
> Sorry to be picky; after this many rounds I would have expected that no
> further comments would be needed.

I started off trying to code to existing structure and style in individual files I was modifying. I also created IOMMU p2m dump - similar to MMU p2m dump. Over the last few days, this has evolved into cleaning up existing AMD code, indenting for more clarity etc. All good points btw.

> 
> > +static void amd_dump_p2m_table_level(struct page_info* pg, int
> level,
> > +                                     paddr_t gpa, int indent) {
> > +    paddr_t address;
> > +    void *table_vaddr, *pde;
> > +    paddr_t next_table_maddr;
> > +    int index, next_level, present;
> > +    u32 *entry;
> > +
> > +    if ( level < 1 )
> > +        return;
> > +
> > +    table_vaddr = __map_domain_page(pg);
> > +    if ( table_vaddr == NULL )
> > +    {
> > +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
> > +                page_to_maddr(pg));
> > +        return;
> > +    }
> > +
> > +    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
> > +    {
> > +        if ( !(index % 2) )
> > +            process_pending_softirqs();
> > +
> > +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> > +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> > +        entry = (u32*)pde;
> > +
> > +        present = get_field_from_reg_u32(entry[0],
> > +                                         IOMMU_PDE_PRESENT_MASK,
> > +                                         IOMMU_PDE_PRESENT_SHIFT);
> > +
> > +        if ( !present )
> > +            continue;
> > +
> > +        next_level = get_field_from_reg_u32(entry[0],
> > +
> IOMMU_PDE_NEXT_LEVEL_MASK,
> > +
> > + IOMMU_PDE_NEXT_LEVEL_SHIFT);
> > +
> > +        address = gpa + amd_offset_level_address(index, level);
> > +        if ( next_level >= 1 )
> > +            amd_dump_p2m_table_level(
> > +                maddr_to_page(next_table_maddr), level - 1,
> 
> Did you see Wei's cleanup patches to the code you cloned from?
> You should follow that route (replacing the ASSERT() with printing of
> the inconsistency and _not_ recursing or doing the normal printing),
> and using either "level" or "next_level"
> consistently here.

Ok - will do.

> 
> > +                address, indent + 1);
> > +        else
> > +            printk("%*s" "gfn: %08lx  mfn: %08lx\n",
> > +                   indent, " ",
> 
>             printk("%*sgfn: %08lx  mfn: %08lx\n",
>                    indent, "",
> 
> I can vaguely see the point in splitting the two strings in the first
> argument, but the extra space in the third argument is definitely wrong
> - it'll make level 1 and level 2 indistinguishable.

I misunderstood how "%*s" works. That probably explains the output Wei saw.

> 
> I also don't see how you addressed Wei's reporting of this still not
> printing correctly. I may be overlooking something, but without you
> making clear in the description what you changed over the previous
> version that's also relatively easy to happen.


Will add more history.

> 
> > +static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level,
> paddr_t gpa,
> > +                                     int indent) {
> > +    paddr_t address;
> > +    int i;
> > +    struct dma_pte *pt_vaddr, *pte;
> > +    int next_level;
> > +
> > +    if ( level < 1 )
> > +        return;
> > +
> > +    pt_vaddr = map_vtd_domain_page(pt_maddr);
> > +    if ( pt_vaddr == NULL )
> > +    {
> > +        printk("Failed to map VT-D domain page %"PRIpaddr"\n",
> pt_maddr);
> > +        return;
> > +    }
> > +
> > +    next_level = level - 1;
> > +    for ( i = 0; i < PTE_NUM; i++ )
> > +    {
> > +        if ( !(i % 2) )
> > +            process_pending_softirqs();
> > +
> > +        pte = &pt_vaddr[i];
> > +        if ( !dma_pte_present(*pte) )
> > +            continue;
> > +
> > +        address = gpa + offset_level_address(i, level);
> > +        if ( next_level >= 1 )
> > +            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level,
> > +                                     address, indent + 1);
> > +        else
> > +            printk("%*s" "gfn: %08lx mfn: %08lx super=%d rd=%d
> wr=%d\n",
> > +                   indent, " ",
> 
> Same comment as above.

Yep - got it.

> 
> > +                   (unsigned long)(address >> PAGE_SHIFT_4K),
> > +                   (unsigned long)(pte->val >> PAGE_SHIFT_4K),
> > +                   dma_pte_superpage(*pte)? 1 : 0,
> > +                   dma_pte_read(*pte)? 1 : 0,
> > +                   dma_pte_write(*pte)? 1 : 0);
> 
> Missing spaces. Even worse - given your definitions of these macros
> there's no point in using the conditional operators here at all.
> 
> And, despite your claim in another response, this still isn't similar
> to AMD's variant (which still doesn't print any of these three
> attributes).

I meant structure in terms of recursion logic, level checks etc. I will just remove the extra prints to make it more similar. My original goal was to print it similar to the existing MMU p2m table.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] Dump IOMMU p2m table
@ 2012-08-16 16:36 Santosh Jodh
  2012-08-17  9:50 ` Jan Beulich
  2012-08-17 11:14 ` Wei Wang
  0 siblings, 2 replies; 13+ messages in thread
From: Santosh Jodh @ 2012-08-16 16:36 UTC (permalink / raw)
  To: xen-devel; +Cc: wei.wang2, tim, JBeulich, xiantao.zhang

New key handler 'o' to dump the IOMMU p2m table for each domain.
Skips dumping table for domain0.
Intel and AMD specific iommu_ops handler for dumping p2m table.

Incorporated feedback from Jan Beulich and Wei Wang.
Fixed indent printing with %*s.
Removed superflous superpage and other attribute prints.
Make next_level use consistent for AMD IOMMU dumps. Warn if found inconsistent.

Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>

diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Aug 16 09:28:24 2012 -0700
@@ -22,6 +22,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/paging.h>
+#include <xen/softirq.h>
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
@@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
 
 #include <asm/io_apic.h>
 
+static void amd_dump_p2m_table_level(struct page_info* pg, int level, 
+                                     paddr_t gpa, int indent)
+{
+    paddr_t address;
+    void *table_vaddr, *pde;
+    paddr_t next_table_maddr;
+    int index, next_level, present;
+    u32 *entry;
+
+    if ( level < 1 )
+        return;
+
+    table_vaddr = __map_domain_page(pg);
+    if ( table_vaddr == NULL )
+    {
+        printk("Failed to map IOMMU domain page %"PRIpaddr"\n", 
+                page_to_maddr(pg));
+        return;
+    }
+
+    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
+    {
+        if ( !(index % 2) )
+            process_pending_softirqs();
+
+        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
+        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
+        entry = (u32*)pde;
+
+        present = get_field_from_reg_u32(entry[0],
+                                         IOMMU_PDE_PRESENT_MASK,
+                                         IOMMU_PDE_PRESENT_SHIFT);
+
+        if ( !present )
+            continue;
+
+        next_level = get_field_from_reg_u32(entry[0],
+                                            IOMMU_PDE_NEXT_LEVEL_MASK,
+                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
+
+        if ( next_level != (level - 1) )
+        {
+            printk("IOMMU p2m table error. next_level = %d, expected %d\n",
+                   next_level, level - 1);
+
+            continue;
+        }
+
+        address = gpa + amd_offset_level_address(index, level);
+        if ( next_level >= 1 )
+            amd_dump_p2m_table_level(
+                maddr_to_page(next_table_maddr), next_level,
+                address, indent + 1);
+        else
+            printk("%*sgfn: %08lx  mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)PFN_DOWN(address),
+                   (unsigned long)PFN_DOWN(next_table_maddr));
+    }
+
+    unmap_domain_page(table_vaddr);
+}
+
+static void amd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd  = domain_hvm_iommu(d);
+
+    if ( !hd->root_table ) 
+        return;
+
+    printk("p2m table has %d levels\n", hd->paging_mode);
+    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
+}
+
 const struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .dom0_init = amd_iommu_dom0_init,
@@ -531,4 +606,5 @@ const struct iommu_ops amd_iommu_ops = {
     .resume = amd_iommu_resume,
     .share_p2m = amd_iommu_share_p2m,
     .crash_shutdown = amd_iommu_suspend,
+    .dump_p2m_table = amd_dump_p2m_table,
 };
diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/iommu.c	Thu Aug 16 09:28:24 2012 -0700
@@ -19,10 +19,12 @@
 #include <xen/paging.h>
 #include <xen/guest_access.h>
 #include <xen/softirq.h>
+#include <xen/keyhandler.h>
 #include <xsm/xsm.h>
 
 static void parse_iommu_param(char *s);
 static int iommu_populate_page_table(struct domain *d);
+static void iommu_dump_p2m_table(unsigned char key);
 
 /*
  * The 'iommu' parameter enables the IOMMU.  Optional comma separated
@@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
 
 DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
 
+static struct keyhandler iommu_p2m_table = {
+    .diagnostic = 0,
+    .u.fn = iommu_dump_p2m_table,
+    .desc = "dump iommu p2m table"
+};
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
     if ( !iommu_enabled )
         return;
 
+    register_keyhandler('o', &iommu_p2m_table);
     d->need_iommu = !!iommu_dom0_strict;
     if ( need_iommu(d) )
     {
@@ -654,6 +663,34 @@ int iommu_do_domctl(
     return ret;
 }
 
+static void iommu_dump_p2m_table(unsigned char key)
+{
+    struct domain *d;
+    const struct iommu_ops *ops;
+
+    if ( !iommu_enabled )
+    {
+        printk("IOMMU not enabled!\n");
+        return;
+    }
+
+    ops = iommu_get_ops();
+    for_each_domain(d)
+    {
+        if ( !d->domain_id )
+            continue;
+
+        if ( iommu_use_hap_pt(d) )
+        {
+            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
+            continue;
+        }
+
+        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
+        ops->dump_p2m_table(d);
+    }
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Aug 16 09:28:24 2012 -0700
@@ -31,6 +31,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/keyhandler.h>
+#include <xen/softirq.h>
 #include <asm/msi.h>
 #include <asm/irq.h>
 #if defined(__i386__) || defined(__x86_64__)
@@ -2365,6 +2366,60 @@ static void vtd_resume(void)
     }
 }
 
+static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa, 
+                                     int indent)
+{
+    paddr_t address;
+    int i;
+    struct dma_pte *pt_vaddr, *pte;
+    int next_level;
+
+    if ( level < 1 )
+        return;
+
+    pt_vaddr = map_vtd_domain_page(pt_maddr);
+    if ( pt_vaddr == NULL )
+    {
+        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
+        return;
+    }
+
+    next_level = level - 1;
+    for ( i = 0; i < PTE_NUM; i++ )
+    {
+        if ( !(i % 2) )
+            process_pending_softirqs();
+
+        pte = &pt_vaddr[i];
+        if ( !dma_pte_present(*pte) )
+            continue;
+
+        address = gpa + offset_level_address(i, level);
+        if ( next_level >= 1 ) 
+            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level, 
+                                     address, indent + 1);
+        else
+            printk("%*sgfn: %08lx mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)(address >> PAGE_SHIFT_4K),
+                   (unsigned long)(pte->val >> PAGE_SHIFT_4K));
+    }
+
+    unmap_vtd_domain_page(pt_vaddr);
+}
+
+static void vtd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd;
+
+    if ( list_empty(&acpi_drhd_units) )
+        return;
+
+    hd = domain_hvm_iommu(d);
+    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
+    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
+}
+
 const struct iommu_ops intel_iommu_ops = {
     .init = intel_iommu_domain_init,
     .dom0_init = intel_iommu_dom0_init,
@@ -2387,6 +2442,7 @@ const struct iommu_ops intel_iommu_ops =
     .crash_shutdown = vtd_crash_shutdown,
     .iotlb_flush = intel_iommu_iotlb_flush,
     .iotlb_flush_all = intel_iommu_iotlb_flush_all,
+    .dump_p2m_table = vtd_dump_p2m_table,
 };
 
 /*
diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/vtd/iommu.h
--- a/xen/drivers/passthrough/vtd/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.h	Thu Aug 16 09:28:24 2012 -0700
@@ -248,6 +248,8 @@ struct context_entry {
 #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
 #define address_level_offset(addr, level) \
             ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
+#define offset_level_address(offset, level) \
+            ((u64)(offset) << level_to_offset_bits(level))
 #define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
 #define level_size(l) (1 << level_to_offset_bits(l))
 #define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Aug 16 09:28:24 2012 -0700
@@ -38,6 +38,10 @@
 #define PTE_PER_TABLE_ALLOC(entries)	\
 	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT)
 
+#define amd_offset_level_address(offset, level) \
+      	((u64)(offset) << (12 + (PTE_PER_TABLE_SHIFT * \
+                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
+
 #define PCI_MIN_CAP_OFFSET	0x40
 #define PCI_MAX_CAP_BLOCKS	48
 #define PCI_CAP_PTR_MASK	0xFC
diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/xen/iommu.h	Thu Aug 16 09:28:24 2012 -0700
@@ -141,6 +141,7 @@ struct iommu_ops {
     void (*crash_shutdown)(void);
     void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
     void (*iotlb_flush_all)(struct domain *d);
+    void (*dump_p2m_table)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-16 16:27   ` Santosh Jodh
@ 2012-08-17  9:21     ` Jan Beulich
  0 siblings, 0 replies; 13+ messages in thread
From: Jan Beulich @ 2012-08-17  9:21 UTC (permalink / raw)
  To: Santosh Jodh
  Cc: wei.wang2@amd.com, Tim(Xen.org), xiantao.zhang@intel.com,
	xen-devel

>>> On 16.08.12 at 18:27, Santosh Jodh <Santosh.Jodh@citrix.com> wrote:
>> From: Jan Beulich [mailto:JBeulich@suse.com]
>> >>> On 14.08.12 at 21:55, Santosh Jodh <santosh.jodh@citrix.com> wrote:
>> > +                   (unsigned long)(address >> PAGE_SHIFT_4K),
>> > +                   (unsigned long)(pte->val >> PAGE_SHIFT_4K),
>> > +                   dma_pte_superpage(*pte)? 1 : 0,
>> > +                   dma_pte_read(*pte)? 1 : 0,
>> > +                   dma_pte_write(*pte)? 1 : 0);
>> 
>> Missing spaces. Even worse - given your definitions of these macros
>> there's no point in using the conditional operators here at all.
>> 
>> And, despite your claim in another response, this still isn't similar
>> to AMD's variant (which still doesn't print any of these three
>> attributes).
> 
> I meant structure in terms of recursion logic, level checks etc. I will just 
> remove the extra prints to make it more similar. My original goal was to 
> print it similar to the existing MMU p2m table.

Actually, retaining the read/write information here (and adding it
to AMD's) would be quite useful imo. The superpage part, as said
earlier, needs to be done differently anyway.

Jan

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-16 16:36 [PATCH] Dump IOMMU p2m table Santosh Jodh
@ 2012-08-17  9:50 ` Jan Beulich
  2012-08-17 11:14 ` Wei Wang
  1 sibling, 0 replies; 13+ messages in thread
From: Jan Beulich @ 2012-08-17  9:50 UTC (permalink / raw)
  To: wei.wang2, Santosh Jodh, xiantao.zhang; +Cc: tim, xen-devel

>>> On 16.08.12 at 18:36, Santosh Jodh <santosh.jodh@citrix.com> wrote:
> New key handler 'o' to dump the IOMMU p2m table for each domain.
> Skips dumping table for domain0.
> Intel and AMD specific iommu_ops handler for dumping p2m table.
> 
> Incorporated feedback from Jan Beulich and Wei Wang.
> Fixed indent printing with %*s.
> Removed superflous superpage and other attribute prints.
> Make next_level use consistent for AMD IOMMU dumps. Warn if found 
> inconsistent.
> 
> Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>

Looks okay too me now. Wei, Zhang - can we get an ack (or
more) from both of you?

Thanks, Jan

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-16 16:36 [PATCH] Dump IOMMU p2m table Santosh Jodh
  2012-08-17  9:50 ` Jan Beulich
@ 2012-08-17 11:14 ` Wei Wang
  2012-08-17 14:31   ` Santosh Jodh
  1 sibling, 1 reply; 13+ messages in thread
From: Wei Wang @ 2012-08-17 11:14 UTC (permalink / raw)
  To: Santosh Jodh; +Cc: xen-devel, tim, JBeulich, xiantao.zhang

On 08/16/2012 06:36 PM, Santosh Jodh wrote:
> New key handler 'o' to dump the IOMMU p2m table for each domain.
> Skips dumping table for domain0.
> Intel and AMD specific iommu_ops handler for dumping p2m table.
>
> Incorporated feedback from Jan Beulich and Wei Wang.
> Fixed indent printing with %*s.
> Removed superflous superpage and other attribute prints.
> Make next_level use consistent for AMD IOMMU dumps. Warn if found inconsistent.
>
> Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>
>
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/amd/pci_amd_iommu.c
> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Aug 16 09:28:24 2012 -0700
> @@ -22,6 +22,7 @@
>   #include<xen/pci.h>
>   #include<xen/pci_regs.h>
>   #include<xen/paging.h>
> +#include<xen/softirq.h>
>   #include<asm/hvm/iommu.h>
>   #include<asm/amd-iommu.h>
>   #include<asm/hvm/svm/amd-iommu-proto.h>
> @@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
>
>   #include<asm/io_apic.h>
>
> +static void amd_dump_p2m_table_level(struct page_info* pg, int level,
> +                                     paddr_t gpa, int indent)
> +{
> +    paddr_t address;
> +    void *table_vaddr, *pde;
> +    paddr_t next_table_maddr;
> +    int index, next_level, present;
> +    u32 *entry;
> +
> +    if ( level<  1 )
> +        return;
> +
> +    table_vaddr = __map_domain_page(pg);
> +    if ( table_vaddr == NULL )
> +    {
> +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
> +                page_to_maddr(pg));
> +        return;
> +    }
> +
> +    for ( index = 0; index<  PTE_PER_TABLE_SIZE; index++ )
> +    {
> +        if ( !(index % 2) )
> +            process_pending_softirqs();
> +
> +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> +        entry = (u32*)pde;
> +
> +        present = get_field_from_reg_u32(entry[0],
> +                                         IOMMU_PDE_PRESENT_MASK,
> +                                         IOMMU_PDE_PRESENT_SHIFT);
> +
> +        if ( !present )
> +            continue;
> +
> +        next_level = get_field_from_reg_u32(entry[0],
> +                                            IOMMU_PDE_NEXT_LEVEL_MASK,
> +                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
> +
> +        if ( next_level != (level - 1) )
> +        {
> +            printk("IOMMU p2m table error. next_level = %d, expected %d\n",
> +                   next_level, level - 1);
> +
> +            continue;
> +       }

HI,

This check is not proper for 2MB and 1GB pages. For example, if a guest 
4 level page tables, for a 2MB entry, the next_level field will be 3 
->(l4)->2(l3)->0(l2), because l2 entries becomes PTEs and PTE entries 
have next_level = 0. I saw following output for those pages:

(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1
(XEN) IOMMU p2m table error. next_level = 0, expected 1

Thanks,
Wei


> +
> +        address = gpa + amd_offset_level_address(index, level);
> +        if ( next_level>= 1 )
> +            amd_dump_p2m_table_level(
> +                maddr_to_page(next_table_maddr), next_level,
> +                address, indent + 1);
> +        else
> +            printk("%*sgfn: %08lx  mfn: %08lx\n",
> +                   indent, "",
> +                   (unsigned long)PFN_DOWN(address),
> +                   (unsigned long)PFN_DOWN(next_table_maddr));
> +    }
> +
> +    unmap_domain_page(table_vaddr);
> +}
> +
> +static void amd_dump_p2m_table(struct domain *d)
> +{
> +    struct hvm_iommu *hd  = domain_hvm_iommu(d);
> +
> +    if ( !hd->root_table )
> +        return;
> +
> +    printk("p2m table has %d levels\n", hd->paging_mode);
> +    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
> +}
> +
>   const struct iommu_ops amd_iommu_ops = {
>       .init = amd_iommu_domain_init,
>       .dom0_init = amd_iommu_dom0_init,
> @@ -531,4 +606,5 @@ const struct iommu_ops amd_iommu_ops = {
>       .resume = amd_iommu_resume,
>       .share_p2m = amd_iommu_share_p2m,
>       .crash_shutdown = amd_iommu_suspend,
> +    .dump_p2m_table = amd_dump_p2m_table,
>   };
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/iommu.c
> --- a/xen/drivers/passthrough/iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/iommu.c	Thu Aug 16 09:28:24 2012 -0700
> @@ -19,10 +19,12 @@
>   #include<xen/paging.h>
>   #include<xen/guest_access.h>
>   #include<xen/softirq.h>
> +#include<xen/keyhandler.h>
>   #include<xsm/xsm.h>
>
>   static void parse_iommu_param(char *s);
>   static int iommu_populate_page_table(struct domain *d);
> +static void iommu_dump_p2m_table(unsigned char key);
>
>   /*
>    * The 'iommu' parameter enables the IOMMU.  Optional comma separated
> @@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
>
>   DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
>
> +static struct keyhandler iommu_p2m_table = {
> +    .diagnostic = 0,
> +    .u.fn = iommu_dump_p2m_table,
> +    .desc = "dump iommu p2m table"
> +};
> +
>   static void __init parse_iommu_param(char *s)
>   {
>       char *ss;
> @@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
>       if ( !iommu_enabled )
>           return;
>
> +    register_keyhandler('o',&iommu_p2m_table);
>       d->need_iommu = !!iommu_dom0_strict;
>       if ( need_iommu(d) )
>       {
> @@ -654,6 +663,34 @@ int iommu_do_domctl(
>       return ret;
>   }
>
> +static void iommu_dump_p2m_table(unsigned char key)
> +{
> +    struct domain *d;
> +    const struct iommu_ops *ops;
> +
> +    if ( !iommu_enabled )
> +    {
> +        printk("IOMMU not enabled!\n");
> +        return;
> +    }
> +
> +    ops = iommu_get_ops();
> +    for_each_domain(d)
> +    {
> +        if ( !d->domain_id )
> +            continue;
> +
> +        if ( iommu_use_hap_pt(d) )
> +        {
> +            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
> +            continue;
> +        }
> +
> +        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
> +        ops->dump_p2m_table(d);
> +    }
> +}
> +
>   /*
>    * Local variables:
>    * mode: C
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/vtd/iommu.c	Thu Aug 16 09:28:24 2012 -0700
> @@ -31,6 +31,7 @@
>   #include<xen/pci.h>
>   #include<xen/pci_regs.h>
>   #include<xen/keyhandler.h>
> +#include<xen/softirq.h>
>   #include<asm/msi.h>
>   #include<asm/irq.h>
>   #if defined(__i386__) || defined(__x86_64__)
> @@ -2365,6 +2366,60 @@ static void vtd_resume(void)
>       }
>   }
>
> +static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa,
> +                                     int indent)
> +{
> +    paddr_t address;
> +    int i;
> +    struct dma_pte *pt_vaddr, *pte;
> +    int next_level;
> +
> +    if ( level<  1 )
> +        return;
> +
> +    pt_vaddr = map_vtd_domain_page(pt_maddr);
> +    if ( pt_vaddr == NULL )
> +    {
> +        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
> +        return;
> +    }
> +
> +    next_level = level - 1;
> +    for ( i = 0; i<  PTE_NUM; i++ )
> +    {
> +        if ( !(i % 2) )
> +            process_pending_softirqs();
> +
> +        pte =&pt_vaddr[i];
> +        if ( !dma_pte_present(*pte) )
> +            continue;
> +
> +        address = gpa + offset_level_address(i, level);
> +        if ( next_level>= 1 )
> +            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level,
> +                                     address, indent + 1);
> +        else
> +            printk("%*sgfn: %08lx mfn: %08lx\n",
> +                   indent, "",
> +                   (unsigned long)(address>>  PAGE_SHIFT_4K),
> +                   (unsigned long)(pte->val>>  PAGE_SHIFT_4K));
> +    }
> +
> +    unmap_vtd_domain_page(pt_vaddr);
> +}
> +
> +static void vtd_dump_p2m_table(struct domain *d)
> +{
> +    struct hvm_iommu *hd;
> +
> +    if ( list_empty(&acpi_drhd_units) )
> +        return;
> +
> +    hd = domain_hvm_iommu(d);
> +    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
> +    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
> +}
> +
>   const struct iommu_ops intel_iommu_ops = {
>       .init = intel_iommu_domain_init,
>       .dom0_init = intel_iommu_dom0_init,
> @@ -2387,6 +2442,7 @@ const struct iommu_ops intel_iommu_ops =
>       .crash_shutdown = vtd_crash_shutdown,
>       .iotlb_flush = intel_iommu_iotlb_flush,
>       .iotlb_flush_all = intel_iommu_iotlb_flush_all,
> +    .dump_p2m_table = vtd_dump_p2m_table,
>   };
>
>   /*
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/drivers/passthrough/vtd/iommu.h
> --- a/xen/drivers/passthrough/vtd/iommu.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/vtd/iommu.h	Thu Aug 16 09:28:24 2012 -0700
> @@ -248,6 +248,8 @@ struct context_entry {
>   #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
>   #define address_level_offset(addr, level) \
>               ((addr>>  level_to_offset_bits(level))&  LEVEL_MASK)
> +#define offset_level_address(offset, level) \
> +            ((u64)(offset)<<  level_to_offset_bits(level))
>   #define level_mask(l) (((u64)(-1))<<  level_to_offset_bits(l))
>   #define level_size(l) (1<<  level_to_offset_bits(l))
>   #define align_to_level(addr, l) ((addr + level_size(l) - 1)&  level_mask(l))
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Thu Aug 16 09:28:24 2012 -0700
> @@ -38,6 +38,10 @@
>   #define PTE_PER_TABLE_ALLOC(entries)	\
>   	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries)>>  PTE_PER_TABLE_SHIFT)
>
> +#define amd_offset_level_address(offset, level) \
> +      	((u64)(offset)<<  (12 + (PTE_PER_TABLE_SHIFT * \
> +                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
> +
>   #define PCI_MIN_CAP_OFFSET	0x40
>   #define PCI_MAX_CAP_BLOCKS	48
>   #define PCI_CAP_PTR_MASK	0xFC
> diff -r 6d56e31fe1e1 -r 575a53faf4e1 xen/include/xen/iommu.h
> --- a/xen/include/xen/iommu.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/include/xen/iommu.h	Thu Aug 16 09:28:24 2012 -0700
> @@ -141,6 +141,7 @@ struct iommu_ops {
>       void (*crash_shutdown)(void);
>       void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
>       void (*iotlb_flush_all)(struct domain *d);
> +    void (*dump_p2m_table)(struct domain *d);
>   };
>
>   void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-17 11:14 ` Wei Wang
@ 2012-08-17 14:31   ` Santosh Jodh
  2012-08-17 14:43     ` Wei Wang
  0 siblings, 1 reply; 13+ messages in thread
From: Santosh Jodh @ 2012-08-17 14:31 UTC (permalink / raw)
  To: Wei Wang
  Cc: xen-devel@lists.xensource.com, Tim (Xen.org), JBeulich@suse.com,
	xiantao.zhang@intel.com



> -----Original Message-----
> From: Wei Wang [mailto:wei.wang2@amd.com]
> Sent: Friday, August 17, 2012 4:15 AM
> To: Santosh Jodh
> Cc: xen-devel@lists.xensource.com; xiantao.zhang@intel.com; Tim
> (Xen.org); JBeulich@suse.com
> Subject: Re: [PATCH] Dump IOMMU p2m table
> 
> On 08/16/2012 06:36 PM, Santosh Jodh wrote:
> > New key handler 'o' to dump the IOMMU p2m table for each domain.
> > Skips dumping table for domain0.
> > Intel and AMD specific iommu_ops handler for dumping p2m table.
> >
> > Incorporated feedback from Jan Beulich and Wei Wang.
> > Fixed indent printing with %*s.
> > Removed superflous superpage and other attribute prints.
> > Make next_level use consistent for AMD IOMMU dumps. Warn if found
> inconsistent.
> >
> > Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>
> >
> > diff -r 6d56e31fe1e1 -r 575a53faf4e1
> xen/drivers/passthrough/amd/pci_amd_iommu.c
> > --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15
> 09:41:21 2012 +0100
> > +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Aug 16
> 09:28:24 2012 -0700
> > @@ -22,6 +22,7 @@
> >   #include<xen/pci.h>
> >   #include<xen/pci_regs.h>
> >   #include<xen/paging.h>
> > +#include<xen/softirq.h>
> >   #include<asm/hvm/iommu.h>
> >   #include<asm/amd-iommu.h>
> >   #include<asm/hvm/svm/amd-iommu-proto.h>
> > @@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
> >
> >   #include<asm/io_apic.h>
> >
> > +static void amd_dump_p2m_table_level(struct page_info* pg, int
> level,
> > +                                     paddr_t gpa, int indent) {
> > +    paddr_t address;
> > +    void *table_vaddr, *pde;
> > +    paddr_t next_table_maddr;
> > +    int index, next_level, present;
> > +    u32 *entry;
> > +
> > +    if ( level<  1 )
> > +        return;
> > +
> > +    table_vaddr = __map_domain_page(pg);
> > +    if ( table_vaddr == NULL )
> > +    {
> > +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
> > +                page_to_maddr(pg));
> > +        return;
> > +    }
> > +
> > +    for ( index = 0; index<  PTE_PER_TABLE_SIZE; index++ )
> > +    {
> > +        if ( !(index % 2) )
> > +            process_pending_softirqs();
> > +
> > +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> > +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> > +        entry = (u32*)pde;
> > +
> > +        present = get_field_from_reg_u32(entry[0],
> > +                                         IOMMU_PDE_PRESENT_MASK,
> > +                                         IOMMU_PDE_PRESENT_SHIFT);
> > +
> > +        if ( !present )
> > +            continue;
> > +
> > +        next_level = get_field_from_reg_u32(entry[0],
> > +
> IOMMU_PDE_NEXT_LEVEL_MASK,
> > +
> > + IOMMU_PDE_NEXT_LEVEL_SHIFT);
> > +
> > +        if ( next_level != (level - 1) )
> > +        {
> > +            printk("IOMMU p2m table error. next_level = %d, expected
> %d\n",
> > +                   next_level, level - 1);
> > +
> > +            continue;
> > +       }
> 
> HI,
> 
> This check is not proper for 2MB and 1GB pages. For example, if a guest
> 4 level page tables, for a 2MB entry, the next_level field will be 3
> ->(l4)->2(l3)->0(l2), because l2 entries becomes PTEs and PTE entries
> have next_level = 0. I saw following output for those pages:
> 
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> (XEN) IOMMU p2m table error. next_level = 0, expected 1
> 
> Thanks,
> Wei

How about changing the check to:
        if ( next_level && (next_level != (level - 1)) )
 
Thanks,
Santosh

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-17 14:31   ` Santosh Jodh
@ 2012-08-17 14:43     ` Wei Wang
  0 siblings, 0 replies; 13+ messages in thread
From: Wei Wang @ 2012-08-17 14:43 UTC (permalink / raw)
  To: Santosh Jodh
  Cc: xen-devel@lists.xensource.com, Tim (Xen.org), JBeulich@suse.com,
	xiantao.zhang@intel.com

On 08/17/2012 04:31 PM, Santosh Jodh wrote:
>
>
>> -----Original Message-----
>> From: Wei Wang [mailto:wei.wang2@amd.com]
>> Sent: Friday, August 17, 2012 4:15 AM
>> To: Santosh Jodh
>> Cc: xen-devel@lists.xensource.com; xiantao.zhang@intel.com; Tim
>> (Xen.org); JBeulich@suse.com
>> Subject: Re: [PATCH] Dump IOMMU p2m table
>>
>> On 08/16/2012 06:36 PM, Santosh Jodh wrote:
>>> New key handler 'o' to dump the IOMMU p2m table for each domain.
>>> Skips dumping table for domain0.
>>> Intel and AMD specific iommu_ops handler for dumping p2m table.
>>>
>>> Incorporated feedback from Jan Beulich and Wei Wang.
>>> Fixed indent printing with %*s.
>>> Removed superflous superpage and other attribute prints.
>>> Make next_level use consistent for AMD IOMMU dumps. Warn if found
>> inconsistent.
>>>
>>> Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>
>>>
>>> diff -r 6d56e31fe1e1 -r 575a53faf4e1
>> xen/drivers/passthrough/amd/pci_amd_iommu.c
>>> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15
>> 09:41:21 2012 +0100
>>> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Thu Aug 16
>> 09:28:24 2012 -0700
>>> @@ -22,6 +22,7 @@
>>>    #include<xen/pci.h>
>>>    #include<xen/pci_regs.h>
>>>    #include<xen/paging.h>
>>> +#include<xen/softirq.h>
>>>    #include<asm/hvm/iommu.h>
>>>    #include<asm/amd-iommu.h>
>>>    #include<asm/hvm/svm/amd-iommu-proto.h>
>>> @@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
>>>
>>>    #include<asm/io_apic.h>
>>>
>>> +static void amd_dump_p2m_table_level(struct page_info* pg, int
>> level,
>>> +                                     paddr_t gpa, int indent) {
>>> +    paddr_t address;
>>> +    void *table_vaddr, *pde;
>>> +    paddr_t next_table_maddr;
>>> +    int index, next_level, present;
>>> +    u32 *entry;
>>> +
>>> +    if ( level<   1 )
>>> +        return;
>>> +
>>> +    table_vaddr = __map_domain_page(pg);
>>> +    if ( table_vaddr == NULL )
>>> +    {
>>> +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
>>> +                page_to_maddr(pg));
>>> +        return;
>>> +    }
>>> +
>>> +    for ( index = 0; index<   PTE_PER_TABLE_SIZE; index++ )
>>> +    {
>>> +        if ( !(index % 2) )
>>> +            process_pending_softirqs();
>>> +
>>> +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
>>> +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
>>> +        entry = (u32*)pde;
>>> +
>>> +        present = get_field_from_reg_u32(entry[0],
>>> +                                         IOMMU_PDE_PRESENT_MASK,
>>> +                                         IOMMU_PDE_PRESENT_SHIFT);
>>> +
>>> +        if ( !present )
>>> +            continue;
>>> +
>>> +        next_level = get_field_from_reg_u32(entry[0],
>>> +
>> IOMMU_PDE_NEXT_LEVEL_MASK,
>>> +
>>> + IOMMU_PDE_NEXT_LEVEL_SHIFT);
>>> +
>>> +        if ( next_level != (level - 1) )
>>> +        {
>>> +            printk("IOMMU p2m table error. next_level = %d, expected
>> %d\n",
>>> +                   next_level, level - 1);
>>> +
>>> +            continue;
>>> +       }
>>
>> HI,
>>
>> This check is not proper for 2MB and 1GB pages. For example, if a guest
>> 4 level page tables, for a 2MB entry, the next_level field will be 3
>> ->(l4)->2(l3)->0(l2), because l2 entries becomes PTEs and PTE entries
>> have next_level = 0. I saw following output for those pages:
>>
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>> (XEN) IOMMU p2m table error. next_level = 0, expected 1
>>
>> Thanks,
>> Wei
>
> How about changing the check to:
>          if ( next_level&&  (next_level != (level - 1)) )

That should be good, since we don't have skip levels.
Thanks,
Wei

>
> Thanks,
> Santosh
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] Dump IOMMU p2m table
@ 2012-08-17 14:53 Santosh Jodh
  0 siblings, 0 replies; 13+ messages in thread
From: Santosh Jodh @ 2012-08-17 14:53 UTC (permalink / raw)
  To: xen-devel; +Cc: wei.wang2, tim, JBeulich, xiantao.zhang

New key handler 'o' to dump the IOMMU p2m table for each domain.
Skips dumping table for domain0.
Intel and AMD specific iommu_ops handler for dumping p2m table.

Incorporated feedback from Jan Beulich and Wei Wang.
Fixed indent printing with %*s.
Removed superflous superpage and other attribute prints.
Make next_level use consistent for AMD IOMMU dumps. Warn if found inconsistent.
AMD IOMMU does skip levels. Handle 2mb and 1gb IOMMU page size for AMD.

Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>

diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Aug 17 07:53:38 2012 -0700
@@ -22,6 +22,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/paging.h>
+#include <xen/softirq.h>
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
@@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
 
 #include <asm/io_apic.h>
 
+static void amd_dump_p2m_table_level(struct page_info* pg, int level, 
+                                     paddr_t gpa, int indent)
+{
+    paddr_t address;
+    void *table_vaddr, *pde;
+    paddr_t next_table_maddr;
+    int index, next_level, present;
+    u32 *entry;
+
+    if ( level < 1 )
+        return;
+
+    table_vaddr = __map_domain_page(pg);
+    if ( table_vaddr == NULL )
+    {
+        printk("Failed to map IOMMU domain page %"PRIpaddr"\n", 
+                page_to_maddr(pg));
+        return;
+    }
+
+    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
+    {
+        if ( !(index % 2) )
+            process_pending_softirqs();
+
+        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
+        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
+        entry = (u32*)pde;
+
+        present = get_field_from_reg_u32(entry[0],
+                                         IOMMU_PDE_PRESENT_MASK,
+                                         IOMMU_PDE_PRESENT_SHIFT);
+
+        if ( !present )
+            continue;
+
+        next_level = get_field_from_reg_u32(entry[0],
+                                            IOMMU_PDE_NEXT_LEVEL_MASK,
+                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
+
+        if ( next_level && (next_level != (level - 1)) )
+        {
+            printk("IOMMU p2m table error. next_level = %d, expected %d\n",
+                   next_level, level - 1);
+
+            continue;
+        }
+
+        address = gpa + amd_offset_level_address(index, level);
+        if ( next_level >= 1 )
+            amd_dump_p2m_table_level(
+                maddr_to_page(next_table_maddr), next_level,
+                address, indent + 1);
+        else
+            printk("%*sgfn: %08lx  mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)PFN_DOWN(address),
+                   (unsigned long)PFN_DOWN(next_table_maddr));
+    }
+
+    unmap_domain_page(table_vaddr);
+}
+
+static void amd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd  = domain_hvm_iommu(d);
+
+    if ( !hd->root_table ) 
+        return;
+
+    printk("p2m table has %d levels\n", hd->paging_mode);
+    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
+}
+
 const struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .dom0_init = amd_iommu_dom0_init,
@@ -531,4 +606,5 @@ const struct iommu_ops amd_iommu_ops = {
     .resume = amd_iommu_resume,
     .share_p2m = amd_iommu_share_p2m,
     .crash_shutdown = amd_iommu_suspend,
+    .dump_p2m_table = amd_dump_p2m_table,
 };
diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/iommu.c	Fri Aug 17 07:53:38 2012 -0700
@@ -19,10 +19,12 @@
 #include <xen/paging.h>
 #include <xen/guest_access.h>
 #include <xen/softirq.h>
+#include <xen/keyhandler.h>
 #include <xsm/xsm.h>
 
 static void parse_iommu_param(char *s);
 static int iommu_populate_page_table(struct domain *d);
+static void iommu_dump_p2m_table(unsigned char key);
 
 /*
  * The 'iommu' parameter enables the IOMMU.  Optional comma separated
@@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
 
 DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
 
+static struct keyhandler iommu_p2m_table = {
+    .diagnostic = 0,
+    .u.fn = iommu_dump_p2m_table,
+    .desc = "dump iommu p2m table"
+};
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
     if ( !iommu_enabled )
         return;
 
+    register_keyhandler('o', &iommu_p2m_table);
     d->need_iommu = !!iommu_dom0_strict;
     if ( need_iommu(d) )
     {
@@ -654,6 +663,34 @@ int iommu_do_domctl(
     return ret;
 }
 
+static void iommu_dump_p2m_table(unsigned char key)
+{
+    struct domain *d;
+    const struct iommu_ops *ops;
+
+    if ( !iommu_enabled )
+    {
+        printk("IOMMU not enabled!\n");
+        return;
+    }
+
+    ops = iommu_get_ops();
+    for_each_domain(d)
+    {
+        if ( !d->domain_id )
+            continue;
+
+        if ( iommu_use_hap_pt(d) )
+        {
+            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
+            continue;
+        }
+
+        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
+        ops->dump_p2m_table(d);
+    }
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Fri Aug 17 07:53:38 2012 -0700
@@ -31,6 +31,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/keyhandler.h>
+#include <xen/softirq.h>
 #include <asm/msi.h>
 #include <asm/irq.h>
 #if defined(__i386__) || defined(__x86_64__)
@@ -2365,6 +2366,60 @@ static void vtd_resume(void)
     }
 }
 
+static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa, 
+                                     int indent)
+{
+    paddr_t address;
+    int i;
+    struct dma_pte *pt_vaddr, *pte;
+    int next_level;
+
+    if ( level < 1 )
+        return;
+
+    pt_vaddr = map_vtd_domain_page(pt_maddr);
+    if ( pt_vaddr == NULL )
+    {
+        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
+        return;
+    }
+
+    next_level = level - 1;
+    for ( i = 0; i < PTE_NUM; i++ )
+    {
+        if ( !(i % 2) )
+            process_pending_softirqs();
+
+        pte = &pt_vaddr[i];
+        if ( !dma_pte_present(*pte) )
+            continue;
+
+        address = gpa + offset_level_address(i, level);
+        if ( next_level >= 1 ) 
+            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level, 
+                                     address, indent + 1);
+        else
+            printk("%*sgfn: %08lx mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)(address >> PAGE_SHIFT_4K),
+                   (unsigned long)(pte->val >> PAGE_SHIFT_4K));
+    }
+
+    unmap_vtd_domain_page(pt_vaddr);
+}
+
+static void vtd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd;
+
+    if ( list_empty(&acpi_drhd_units) )
+        return;
+
+    hd = domain_hvm_iommu(d);
+    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
+    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
+}
+
 const struct iommu_ops intel_iommu_ops = {
     .init = intel_iommu_domain_init,
     .dom0_init = intel_iommu_dom0_init,
@@ -2387,6 +2442,7 @@ const struct iommu_ops intel_iommu_ops =
     .crash_shutdown = vtd_crash_shutdown,
     .iotlb_flush = intel_iommu_iotlb_flush,
     .iotlb_flush_all = intel_iommu_iotlb_flush_all,
+    .dump_p2m_table = vtd_dump_p2m_table,
 };
 
 /*
diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/drivers/passthrough/vtd/iommu.h
--- a/xen/drivers/passthrough/vtd/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.h	Fri Aug 17 07:53:38 2012 -0700
@@ -248,6 +248,8 @@ struct context_entry {
 #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
 #define address_level_offset(addr, level) \
             ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
+#define offset_level_address(offset, level) \
+            ((u64)(offset) << level_to_offset_bits(level))
 #define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
 #define level_size(l) (1 << level_to_offset_bits(l))
 #define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Aug 17 07:53:38 2012 -0700
@@ -38,6 +38,10 @@
 #define PTE_PER_TABLE_ALLOC(entries)	\
 	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT)
 
+#define amd_offset_level_address(offset, level) \
+      	((u64)(offset) << (12 + (PTE_PER_TABLE_SHIFT * \
+                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
+
 #define PCI_MIN_CAP_OFFSET	0x40
 #define PCI_MAX_CAP_BLOCKS	48
 #define PCI_CAP_PTR_MASK	0xFC
diff -r 6d56e31fe1e1 -r e26e2d1e5642 xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/xen/iommu.h	Fri Aug 17 07:53:38 2012 -0700
@@ -141,6 +141,7 @@ struct iommu_ops {
     void (*crash_shutdown)(void);
     void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
     void (*iotlb_flush_all)(struct domain *d);
+    void (*dump_p2m_table)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] Dump IOMMU p2m table
@ 2012-08-17 14:57 Santosh Jodh
  2012-08-21 10:04 ` Wei Wang
  0 siblings, 1 reply; 13+ messages in thread
From: Santosh Jodh @ 2012-08-17 14:57 UTC (permalink / raw)
  To: xen-devel; +Cc: wei.wang2, tim, JBeulich, xiantao.zhang

New key handler 'o' to dump the IOMMU p2m table for each domain.
Skips dumping table for domain0.
Intel and AMD specific iommu_ops handler for dumping p2m table.

Incorporated feedback from Jan Beulich and Wei Wang.
Fixed indent printing with %*s.
Removed superflous superpage and other attribute prints.
Make next_level use consistent for AMD IOMMU dumps. Warn if found inconsistent.
AMD IOMMU does not skip levels. Handle 2mb and 1gb IOMMU page size for AMD.

Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>

diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Aug 17 07:56:55 2012 -0700
@@ -22,6 +22,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/paging.h>
+#include <xen/softirq.h>
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
@@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
 
 #include <asm/io_apic.h>
 
+static void amd_dump_p2m_table_level(struct page_info* pg, int level, 
+                                     paddr_t gpa, int indent)
+{
+    paddr_t address;
+    void *table_vaddr, *pde;
+    paddr_t next_table_maddr;
+    int index, next_level, present;
+    u32 *entry;
+
+    if ( level < 1 )
+        return;
+
+    table_vaddr = __map_domain_page(pg);
+    if ( table_vaddr == NULL )
+    {
+        printk("Failed to map IOMMU domain page %"PRIpaddr"\n", 
+                page_to_maddr(pg));
+        return;
+    }
+
+    for ( index = 0; index < PTE_PER_TABLE_SIZE; index++ )
+    {
+        if ( !(index % 2) )
+            process_pending_softirqs();
+
+        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
+        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
+        entry = (u32*)pde;
+
+        present = get_field_from_reg_u32(entry[0],
+                                         IOMMU_PDE_PRESENT_MASK,
+                                         IOMMU_PDE_PRESENT_SHIFT);
+
+        if ( !present )
+            continue;
+
+        next_level = get_field_from_reg_u32(entry[0],
+                                            IOMMU_PDE_NEXT_LEVEL_MASK,
+                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
+
+        if ( next_level && (next_level != (level - 1)) )
+        {
+            printk("IOMMU p2m table error. next_level = %d, expected %d\n",
+                   next_level, level - 1);
+
+            continue;
+        }
+
+        address = gpa + amd_offset_level_address(index, level);
+        if ( next_level >= 1 )
+            amd_dump_p2m_table_level(
+                maddr_to_page(next_table_maddr), next_level,
+                address, indent + 1);
+        else
+            printk("%*sgfn: %08lx  mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)PFN_DOWN(address),
+                   (unsigned long)PFN_DOWN(next_table_maddr));
+    }
+
+    unmap_domain_page(table_vaddr);
+}
+
+static void amd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd  = domain_hvm_iommu(d);
+
+    if ( !hd->root_table ) 
+        return;
+
+    printk("p2m table has %d levels\n", hd->paging_mode);
+    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
+}
+
 const struct iommu_ops amd_iommu_ops = {
     .init = amd_iommu_domain_init,
     .dom0_init = amd_iommu_dom0_init,
@@ -531,4 +606,5 @@ const struct iommu_ops amd_iommu_ops = {
     .resume = amd_iommu_resume,
     .share_p2m = amd_iommu_share_p2m,
     .crash_shutdown = amd_iommu_suspend,
+    .dump_p2m_table = amd_dump_p2m_table,
 };
diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/iommu.c	Fri Aug 17 07:56:55 2012 -0700
@@ -19,10 +19,12 @@
 #include <xen/paging.h>
 #include <xen/guest_access.h>
 #include <xen/softirq.h>
+#include <xen/keyhandler.h>
 #include <xsm/xsm.h>
 
 static void parse_iommu_param(char *s);
 static int iommu_populate_page_table(struct domain *d);
+static void iommu_dump_p2m_table(unsigned char key);
 
 /*
  * The 'iommu' parameter enables the IOMMU.  Optional comma separated
@@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
 
 DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
 
+static struct keyhandler iommu_p2m_table = {
+    .diagnostic = 0,
+    .u.fn = iommu_dump_p2m_table,
+    .desc = "dump iommu p2m table"
+};
+
 static void __init parse_iommu_param(char *s)
 {
     char *ss;
@@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
     if ( !iommu_enabled )
         return;
 
+    register_keyhandler('o', &iommu_p2m_table);
     d->need_iommu = !!iommu_dom0_strict;
     if ( need_iommu(d) )
     {
@@ -654,6 +663,34 @@ int iommu_do_domctl(
     return ret;
 }
 
+static void iommu_dump_p2m_table(unsigned char key)
+{
+    struct domain *d;
+    const struct iommu_ops *ops;
+
+    if ( !iommu_enabled )
+    {
+        printk("IOMMU not enabled!\n");
+        return;
+    }
+
+    ops = iommu_get_ops();
+    for_each_domain(d)
+    {
+        if ( !d->domain_id )
+            continue;
+
+        if ( iommu_use_hap_pt(d) )
+        {
+            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
+            continue;
+        }
+
+        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
+        ops->dump_p2m_table(d);
+    }
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/vtd/iommu.c
--- a/xen/drivers/passthrough/vtd/iommu.c	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.c	Fri Aug 17 07:56:55 2012 -0700
@@ -31,6 +31,7 @@
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/keyhandler.h>
+#include <xen/softirq.h>
 #include <asm/msi.h>
 #include <asm/irq.h>
 #if defined(__i386__) || defined(__x86_64__)
@@ -2365,6 +2366,60 @@ static void vtd_resume(void)
     }
 }
 
+static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa, 
+                                     int indent)
+{
+    paddr_t address;
+    int i;
+    struct dma_pte *pt_vaddr, *pte;
+    int next_level;
+
+    if ( level < 1 )
+        return;
+
+    pt_vaddr = map_vtd_domain_page(pt_maddr);
+    if ( pt_vaddr == NULL )
+    {
+        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
+        return;
+    }
+
+    next_level = level - 1;
+    for ( i = 0; i < PTE_NUM; i++ )
+    {
+        if ( !(i % 2) )
+            process_pending_softirqs();
+
+        pte = &pt_vaddr[i];
+        if ( !dma_pte_present(*pte) )
+            continue;
+
+        address = gpa + offset_level_address(i, level);
+        if ( next_level >= 1 ) 
+            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level, 
+                                     address, indent + 1);
+        else
+            printk("%*sgfn: %08lx mfn: %08lx\n",
+                   indent, "",
+                   (unsigned long)(address >> PAGE_SHIFT_4K),
+                   (unsigned long)(pte->val >> PAGE_SHIFT_4K));
+    }
+
+    unmap_vtd_domain_page(pt_vaddr);
+}
+
+static void vtd_dump_p2m_table(struct domain *d)
+{
+    struct hvm_iommu *hd;
+
+    if ( list_empty(&acpi_drhd_units) )
+        return;
+
+    hd = domain_hvm_iommu(d);
+    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
+    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
+}
+
 const struct iommu_ops intel_iommu_ops = {
     .init = intel_iommu_domain_init,
     .dom0_init = intel_iommu_dom0_init,
@@ -2387,6 +2442,7 @@ const struct iommu_ops intel_iommu_ops =
     .crash_shutdown = vtd_crash_shutdown,
     .iotlb_flush = intel_iommu_iotlb_flush,
     .iotlb_flush_all = intel_iommu_iotlb_flush_all,
+    .dump_p2m_table = vtd_dump_p2m_table,
 };
 
 /*
diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/vtd/iommu.h
--- a/xen/drivers/passthrough/vtd/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/drivers/passthrough/vtd/iommu.h	Fri Aug 17 07:56:55 2012 -0700
@@ -248,6 +248,8 @@ struct context_entry {
 #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
 #define address_level_offset(addr, level) \
             ((addr >> level_to_offset_bits(level)) & LEVEL_MASK)
+#define offset_level_address(offset, level) \
+            ((u64)(offset) << level_to_offset_bits(level))
 #define level_mask(l) (((u64)(-1)) << level_to_offset_bits(l))
 #define level_size(l) (1 << level_to_offset_bits(l))
 #define align_to_level(addr, l) ((addr + level_size(l) - 1) & level_mask(l))
diff -r 6d56e31fe1e1 -r 995803806158 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Aug 17 07:56:55 2012 -0700
@@ -38,6 +38,10 @@
 #define PTE_PER_TABLE_ALLOC(entries)	\
 	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries) >> PTE_PER_TABLE_SHIFT)
 
+#define amd_offset_level_address(offset, level) \
+      	((u64)(offset) << (12 + (PTE_PER_TABLE_SHIFT * \
+                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
+
 #define PCI_MIN_CAP_OFFSET	0x40
 #define PCI_MAX_CAP_BLOCKS	48
 #define PCI_CAP_PTR_MASK	0xFC
diff -r 6d56e31fe1e1 -r 995803806158 xen/include/xen/iommu.h
--- a/xen/include/xen/iommu.h	Wed Aug 15 09:41:21 2012 +0100
+++ b/xen/include/xen/iommu.h	Fri Aug 17 07:56:55 2012 -0700
@@ -141,6 +141,7 @@ struct iommu_ops {
     void (*crash_shutdown)(void);
     void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
     void (*iotlb_flush_all)(struct domain *d);
+    void (*dump_p2m_table)(struct domain *d);
 };
 
 void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] Dump IOMMU p2m table
  2012-08-17 14:57 Santosh Jodh
@ 2012-08-21 10:04 ` Wei Wang
  0 siblings, 0 replies; 13+ messages in thread
From: Wei Wang @ 2012-08-21 10:04 UTC (permalink / raw)
  To: Santosh Jodh; +Cc: xen-devel, tim, JBeulich, xiantao.zhang

Tested and Acked.
Thanks,
Wei

On 08/17/2012 04:57 PM, Santosh Jodh wrote:
> New key handler 'o' to dump the IOMMU p2m table for each domain.
> Skips dumping table for domain0.
> Intel and AMD specific iommu_ops handler for dumping p2m table.
>
> Incorporated feedback from Jan Beulich and Wei Wang.
> Fixed indent printing with %*s.
> Removed superflous superpage and other attribute prints.
> Make next_level use consistent for AMD IOMMU dumps. Warn if found inconsistent.
> AMD IOMMU does not skip levels. Handle 2mb and 1gb IOMMU page size for AMD.
>
> Signed-off-by: Santosh Jodh<santosh.jodh@citrix.com>
>
> diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/amd/pci_amd_iommu.c
> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Aug 17 07:56:55 2012 -0700
> @@ -22,6 +22,7 @@
>   #include<xen/pci.h>
>   #include<xen/pci_regs.h>
>   #include<xen/paging.h>
> +#include<xen/softirq.h>
>   #include<asm/hvm/iommu.h>
>   #include<asm/amd-iommu.h>
>   #include<asm/hvm/svm/amd-iommu-proto.h>
> @@ -512,6 +513,80 @@ static int amd_iommu_group_id(u16 seg, u
>
>   #include<asm/io_apic.h>
>
> +static void amd_dump_p2m_table_level(struct page_info* pg, int level,
> +                                     paddr_t gpa, int indent)
> +{
> +    paddr_t address;
> +    void *table_vaddr, *pde;
> +    paddr_t next_table_maddr;
> +    int index, next_level, present;
> +    u32 *entry;
> +
> +    if ( level<  1 )
> +        return;
> +
> +    table_vaddr = __map_domain_page(pg);
> +    if ( table_vaddr == NULL )
> +    {
> +        printk("Failed to map IOMMU domain page %"PRIpaddr"\n",
> +                page_to_maddr(pg));
> +        return;
> +    }
> +
> +    for ( index = 0; index<  PTE_PER_TABLE_SIZE; index++ )
> +    {
> +        if ( !(index % 2) )
> +            process_pending_softirqs();
> +
> +        pde = table_vaddr + (index * IOMMU_PAGE_TABLE_ENTRY_SIZE);
> +        next_table_maddr = amd_iommu_get_next_table_from_pte(pde);
> +        entry = (u32*)pde;
> +
> +        present = get_field_from_reg_u32(entry[0],
> +                                         IOMMU_PDE_PRESENT_MASK,
> +                                         IOMMU_PDE_PRESENT_SHIFT);
> +
> +        if ( !present )
> +            continue;
> +
> +        next_level = get_field_from_reg_u32(entry[0],
> +                                            IOMMU_PDE_NEXT_LEVEL_MASK,
> +                                            IOMMU_PDE_NEXT_LEVEL_SHIFT);
> +
> +        if ( next_level&&  (next_level != (level - 1)) )
> +        {
> +            printk("IOMMU p2m table error. next_level = %d, expected %d\n",
> +                   next_level, level - 1);
> +
> +            continue;
> +        }
> +
> +        address = gpa + amd_offset_level_address(index, level);
> +        if ( next_level>= 1 )
> +            amd_dump_p2m_table_level(
> +                maddr_to_page(next_table_maddr), next_level,
> +                address, indent + 1);
> +        else
> +            printk("%*sgfn: %08lx  mfn: %08lx\n",
> +                   indent, "",
> +                   (unsigned long)PFN_DOWN(address),
> +                   (unsigned long)PFN_DOWN(next_table_maddr));
> +    }
> +
> +    unmap_domain_page(table_vaddr);
> +}
> +
> +static void amd_dump_p2m_table(struct domain *d)
> +{
> +    struct hvm_iommu *hd  = domain_hvm_iommu(d);
> +
> +    if ( !hd->root_table )
> +        return;
> +
> +    printk("p2m table has %d levels\n", hd->paging_mode);
> +    amd_dump_p2m_table_level(hd->root_table, hd->paging_mode, 0, 0);
> +}
> +
>   const struct iommu_ops amd_iommu_ops = {
>       .init = amd_iommu_domain_init,
>       .dom0_init = amd_iommu_dom0_init,
> @@ -531,4 +606,5 @@ const struct iommu_ops amd_iommu_ops = {
>       .resume = amd_iommu_resume,
>       .share_p2m = amd_iommu_share_p2m,
>       .crash_shutdown = amd_iommu_suspend,
> +    .dump_p2m_table = amd_dump_p2m_table,
>   };
> diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/iommu.c
> --- a/xen/drivers/passthrough/iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/iommu.c	Fri Aug 17 07:56:55 2012 -0700
> @@ -19,10 +19,12 @@
>   #include<xen/paging.h>
>   #include<xen/guest_access.h>
>   #include<xen/softirq.h>
> +#include<xen/keyhandler.h>
>   #include<xsm/xsm.h>
>
>   static void parse_iommu_param(char *s);
>   static int iommu_populate_page_table(struct domain *d);
> +static void iommu_dump_p2m_table(unsigned char key);
>
>   /*
>    * The 'iommu' parameter enables the IOMMU.  Optional comma separated
> @@ -54,6 +56,12 @@ bool_t __read_mostly amd_iommu_perdev_in
>
>   DEFINE_PER_CPU(bool_t, iommu_dont_flush_iotlb);
>
> +static struct keyhandler iommu_p2m_table = {
> +    .diagnostic = 0,
> +    .u.fn = iommu_dump_p2m_table,
> +    .desc = "dump iommu p2m table"
> +};
> +
>   static void __init parse_iommu_param(char *s)
>   {
>       char *ss;
> @@ -119,6 +127,7 @@ void __init iommu_dom0_init(struct domai
>       if ( !iommu_enabled )
>           return;
>
> +    register_keyhandler('o',&iommu_p2m_table);
>       d->need_iommu = !!iommu_dom0_strict;
>       if ( need_iommu(d) )
>       {
> @@ -654,6 +663,34 @@ int iommu_do_domctl(
>       return ret;
>   }
>
> +static void iommu_dump_p2m_table(unsigned char key)
> +{
> +    struct domain *d;
> +    const struct iommu_ops *ops;
> +
> +    if ( !iommu_enabled )
> +    {
> +        printk("IOMMU not enabled!\n");
> +        return;
> +    }
> +
> +    ops = iommu_get_ops();
> +    for_each_domain(d)
> +    {
> +        if ( !d->domain_id )
> +            continue;
> +
> +        if ( iommu_use_hap_pt(d) )
> +        {
> +            printk("\ndomain%d IOMMU p2m table shared with MMU: \n", d->domain_id);
> +            continue;
> +        }
> +
> +        printk("\ndomain%d IOMMU p2m table: \n", d->domain_id);
> +        ops->dump_p2m_table(d);
> +    }
> +}
> +
>   /*
>    * Local variables:
>    * mode: C
> diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/vtd/iommu.c
> --- a/xen/drivers/passthrough/vtd/iommu.c	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/vtd/iommu.c	Fri Aug 17 07:56:55 2012 -0700
> @@ -31,6 +31,7 @@
>   #include<xen/pci.h>
>   #include<xen/pci_regs.h>
>   #include<xen/keyhandler.h>
> +#include<xen/softirq.h>
>   #include<asm/msi.h>
>   #include<asm/irq.h>
>   #if defined(__i386__) || defined(__x86_64__)
> @@ -2365,6 +2366,60 @@ static void vtd_resume(void)
>       }
>   }
>
> +static void vtd_dump_p2m_table_level(paddr_t pt_maddr, int level, paddr_t gpa,
> +                                     int indent)
> +{
> +    paddr_t address;
> +    int i;
> +    struct dma_pte *pt_vaddr, *pte;
> +    int next_level;
> +
> +    if ( level<  1 )
> +        return;
> +
> +    pt_vaddr = map_vtd_domain_page(pt_maddr);
> +    if ( pt_vaddr == NULL )
> +    {
> +        printk("Failed to map VT-D domain page %"PRIpaddr"\n", pt_maddr);
> +        return;
> +    }
> +
> +    next_level = level - 1;
> +    for ( i = 0; i<  PTE_NUM; i++ )
> +    {
> +        if ( !(i % 2) )
> +            process_pending_softirqs();
> +
> +        pte =&pt_vaddr[i];
> +        if ( !dma_pte_present(*pte) )
> +            continue;
> +
> +        address = gpa + offset_level_address(i, level);
> +        if ( next_level>= 1 )
> +            vtd_dump_p2m_table_level(dma_pte_addr(*pte), next_level,
> +                                     address, indent + 1);
> +        else
> +            printk("%*sgfn: %08lx mfn: %08lx\n",
> +                   indent, "",
> +                   (unsigned long)(address>>  PAGE_SHIFT_4K),
> +                   (unsigned long)(pte->val>>  PAGE_SHIFT_4K));
> +    }
> +
> +    unmap_vtd_domain_page(pt_vaddr);
> +}
> +
> +static void vtd_dump_p2m_table(struct domain *d)
> +{
> +    struct hvm_iommu *hd;
> +
> +    if ( list_empty(&acpi_drhd_units) )
> +        return;
> +
> +    hd = domain_hvm_iommu(d);
> +    printk("p2m table has %d levels\n", agaw_to_level(hd->agaw));
> +    vtd_dump_p2m_table_level(hd->pgd_maddr, agaw_to_level(hd->agaw), 0, 0);
> +}
> +
>   const struct iommu_ops intel_iommu_ops = {
>       .init = intel_iommu_domain_init,
>       .dom0_init = intel_iommu_dom0_init,
> @@ -2387,6 +2442,7 @@ const struct iommu_ops intel_iommu_ops =
>       .crash_shutdown = vtd_crash_shutdown,
>       .iotlb_flush = intel_iommu_iotlb_flush,
>       .iotlb_flush_all = intel_iommu_iotlb_flush_all,
> +    .dump_p2m_table = vtd_dump_p2m_table,
>   };
>
>   /*
> diff -r 6d56e31fe1e1 -r 995803806158 xen/drivers/passthrough/vtd/iommu.h
> --- a/xen/drivers/passthrough/vtd/iommu.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/drivers/passthrough/vtd/iommu.h	Fri Aug 17 07:56:55 2012 -0700
> @@ -248,6 +248,8 @@ struct context_entry {
>   #define level_to_offset_bits(l) (12 + (l - 1) * LEVEL_STRIDE)
>   #define address_level_offset(addr, level) \
>               ((addr>>  level_to_offset_bits(level))&  LEVEL_MASK)
> +#define offset_level_address(offset, level) \
> +            ((u64)(offset)<<  level_to_offset_bits(level))
>   #define level_mask(l) (((u64)(-1))<<  level_to_offset_bits(l))
>   #define level_size(l) (1<<  level_to_offset_bits(l))
>   #define align_to_level(addr, l) ((addr + level_size(l) - 1)&  level_mask(l))
> diff -r 6d56e31fe1e1 -r 995803806158 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Aug 17 07:56:55 2012 -0700
> @@ -38,6 +38,10 @@
>   #define PTE_PER_TABLE_ALLOC(entries)	\
>   	PAGE_SIZE * (PTE_PER_TABLE_ALIGN(entries)>>  PTE_PER_TABLE_SHIFT)
>
> +#define amd_offset_level_address(offset, level) \
> +      	((u64)(offset)<<  (12 + (PTE_PER_TABLE_SHIFT * \
> +                                (level - IOMMU_PAGING_MODE_LEVEL_1))))
> +
>   #define PCI_MIN_CAP_OFFSET	0x40
>   #define PCI_MAX_CAP_BLOCKS	48
>   #define PCI_CAP_PTR_MASK	0xFC
> diff -r 6d56e31fe1e1 -r 995803806158 xen/include/xen/iommu.h
> --- a/xen/include/xen/iommu.h	Wed Aug 15 09:41:21 2012 +0100
> +++ b/xen/include/xen/iommu.h	Fri Aug 17 07:56:55 2012 -0700
> @@ -141,6 +141,7 @@ struct iommu_ops {
>       void (*crash_shutdown)(void);
>       void (*iotlb_flush)(struct domain *d, unsigned long gfn, unsigned int page_count);
>       void (*iotlb_flush_all)(struct domain *d);
> +    void (*dump_p2m_table)(struct domain *d);
>   };
>
>   void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value);
>

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2012-08-21 10:04 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-16 16:36 [PATCH] Dump IOMMU p2m table Santosh Jodh
2012-08-17  9:50 ` Jan Beulich
2012-08-17 11:14 ` Wei Wang
2012-08-17 14:31   ` Santosh Jodh
2012-08-17 14:43     ` Wei Wang
  -- strict thread matches above, loose matches on Subject: below --
2012-08-17 14:57 Santosh Jodh
2012-08-21 10:04 ` Wei Wang
2012-08-17 14:53 Santosh Jodh
2012-08-14 19:55 Santosh Jodh
2012-08-15  8:54 ` Jan Beulich
2012-08-15 10:39   ` Wei Wang
2012-08-16 16:27   ` Santosh Jodh
2012-08-17  9:21     ` Jan Beulich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).