unmap_domain_page_global() expects the provided address to be page aligned, or
else some of the called functions will trigger assertions, like
modify_xen_mappings() on x86 or destroy_xen_mappings() on Arm.
The following assert has been reported by osstest arm 32bit tests:
(XEN) Assertion 'IS_ALIGNED(s, PAGE_SIZE)' failed at arch/arm/mm.c:1243
(XEN) ----[ Xen-4.18-rc arm32 debug=y Not tainted ]----
(XEN) CPU: 0
(XEN) PC: 00271a38 destroy_xen_mappings+0x50/0x5c
[...]
(XEN) Xen call trace:
(XEN) [<00271a38>] destroy_xen_mappings+0x50/0x5c (PC)
(XEN) [<00235aa8>] vunmap+0x30/0x1a0 (LR)
(XEN) [<0026ad88>] unmap_domain_page_global+0x10/0x20
(XEN) [<00208e38>] unmap_guest_area+0x90/0xec
(XEN) [<00208f98>] domain_kill+0x104/0x180
(XEN) [<00239e3c>] do_domctl+0x8ac/0x14fc
(XEN) [<0027ae34>] do_trap_guest_sync+0x570/0x66c
(XEN) [<002019f0>] arch/arm/arm32/entry.o#return_from_trap+0/0x4
Fixes: eadc288cbb0d ('domain: map/unmap GADDR based shared guest areas')
Signed-off-by: Roger Pau Monné <[email protected]>
---
Changes since v1:
- Also page-align the address in map_guest_area().
---
xen/common/domain.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/xen/common/domain.c b/xen/common/domain.c
index b8281d7cff9d..1468638ade8b 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1601,7 +1601,7 @@ int map_guest_area(struct vcpu *v, paddr_t gaddr,
unsigned int size,
unmap:
if ( pg )
{
- unmap_domain_page_global(map);
+ unmap_domain_page_global((void *)((unsigned long)map & PAGE_MASK));
put_page_and_type(pg);
}
@@ -1634,7 +1634,7 @@ void unmap_guest_area(struct vcpu *v, struct guest_area
*area)
if ( pg )
{
- unmap_domain_page_global(map);
+ unmap_domain_page_global((void *)((unsigned long)map & PAGE_MASK));
put_page_and_type(pg);
}
}
--
2.42.0