diff mbox series

x86/mm: correctly initialize M2P entries on boot

Message ID 1566906485-13731-1-git-send-email-igor.druzhinin@citrix.com (mailing list archive)
State New, archived
Headers show
Series x86/mm: correctly initialize M2P entries on boot | expand

Commit Message

Igor Druzhinin Aug. 27, 2019, 11:48 a.m. UTC
Since guest resource management work it's now possible to have a page
assigned to a domain without a valid M2P entry. Some pathes in the code
rely on the fact a GFN returned from mfn_to_gfn() for such a page
is not valid as well, i.e. see arch_iommu_populate_page_table().

For systems without 512GB contiguous RAM M2P entries were already
correctly initialized on boot with INVALID_M2P_ENTRY (~0UL) but
on systems where M2P could be covered by a single 1GB page directory
0x77 poison was used instead. That eventually resulted in a crash
during IOMMU construction on systems without shared PTs enabled.

While here fixup compat M2P entries as well.

Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
---
 xen/arch/x86/x86_64/mm.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Andrew Cooper Aug. 27, 2019, 12:19 p.m. UTC | #1
On 27/08/2019 12:48, Igor Druzhinin wrote:
> Since guest resource management work it's now possible to have a page
> assigned to a domain without a valid M2P entry. Some pathes in the code

paths

> rely on the fact a GFN returned from mfn_to_gfn() for such a page
> is not valid as well, i.e. see arch_iommu_populate_page_table().
>
> For systems without 512GB contiguous RAM M2P entries were already
> correctly initialized on boot with INVALID_M2P_ENTRY (~0UL) but
> on systems where M2P could be covered by a single 1GB page directory
> 0x77 poison was used instead. That eventually resulted in a crash
> during IOMMU construction on systems without shared PTs enabled.
>
> While here fixup compat M2P entries as well.
>
> Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
diff mbox series

Patch

diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index 1919cae..a741d4e 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -574,8 +574,9 @@  void __init paging_init(void)
                     page_to_mfn(l1_pg),
                     1UL << (2 * PAGETABLE_ORDER),
                     PAGE_HYPERVISOR);
+                /* Fill with INVALID_M2P_ENTRY. */
                 memset((void *)(RDWR_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT)),
-                       0x77, 1UL << L3_PAGETABLE_SHIFT);
+                       0xFF, 1UL << L3_PAGETABLE_SHIFT);
 
                 ASSERT(!l2_table_offset(va));
                 /* NB. Cannot be GLOBAL: guest user mode should not see it. */
@@ -666,9 +667,10 @@  void __init paging_init(void)
             page_to_mfn(l1_pg),
             1UL << PAGETABLE_ORDER,
             PAGE_HYPERVISOR);
+        /* Fill with INVALID_M2P_ENTRY. */
         memset((void *)(RDWR_COMPAT_MPT_VIRT_START +
                         (i << L2_PAGETABLE_SHIFT)),
-               0x55,
+               0xFF,
                1UL << L2_PAGETABLE_SHIFT);
         /* NB. Cannot be GLOBAL as the ptes get copied into per-VM space. */
         l2e_write(l2_ro_mpt, l2e_from_page(l1_pg, _PAGE_PSE|_PAGE_PRESENT));