From 8abb345e6b5c11b79d1a032533130ea6c5519435 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roger=20Pau=20Monn=C3=A9?= Date: Wed, 26 Jan 2022 12:18:07 +0100 Subject: [PATCH] x86/pvh: fix population of the low 1MB for dom0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit RMRRs are setup ahead of populating the p2m and hence the ASSERT when populating the low 1MB needs to be relaxed when it finds an existing entry: it's either RAM or a RMRR resulting from the IOMMU setup. Rework the logic a bit and introduce a local mfn variable in order to assert that if the gfn is populated and not RAM it is an identity map. Fixes: 6b4f6a31ac ('x86/PVH: de-duplicate mappings for first Mb of Dom0 memory') Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich master commit: 2d5fc9120d556ec3c4b1acf0ab5660a6d3f7ebeb master date: 2022-01-25 10:52:24 +0000 --- xen/arch/x86/hvm/dom0_build.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c index 43e1bf1248..8048987286 100644 --- a/xen/arch/x86/hvm/dom0_build.c +++ b/xen/arch/x86/hvm/dom0_build.c @@ -465,11 +465,16 @@ static int __init pvh_populate_p2m(struct domain *d) for ( i = rc = 0; i < MB1_PAGES; ++i ) { p2m_type_t p2mt; + mfn_t mfn = get_gfn_query(d, i, &p2mt); - if ( mfn_eq(get_gfn_query(d, i, &p2mt), INVALID_MFN) ) + if ( mfn_eq(mfn, INVALID_MFN) ) rc = set_mmio_p2m_entry(d, _gfn(i), _mfn(i), PAGE_ORDER_4K); else - ASSERT(p2mt == p2m_ram_rw); + /* + * If the p2m entry is already set it must belong to a RMRR and + * already be identity mapped, or be a RAM region. + */ + ASSERT(p2mt == p2m_ram_rw || mfn_eq(mfn, _mfn(i))); put_gfn(d, i); if ( rc ) { -- 2.30.2