]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
domain: fix misaligned unmap address in {,un}map_guest_area()
authorRoger Pau Monné <roger.pau@citrix.com>
Fri, 6 Oct 2023 13:00:58 +0000 (15:00 +0200)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 6 Oct 2023 17:16:31 +0000 (18:16 +0100)
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é <roger.pau@citrix.com>
Release-acked-by: Henry Wang <Henry.Wang@arm.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
xen/common/domain.c

index b8281d7cff9dcdbc8ac433b964df7d0b78abc26a..1468638ade8b87ce029ee6e5ef7bf9784fd3e395 100644 (file)
@@ -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);
     }
 }