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 |
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 --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));
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(-)