]> xenbits.xensource.com Git - xen.git/commitdiff
vtd: don't assume addresses are aligned in sync_cache
authorRoger Pau Monné <roger.pau@citrix.com>
Tue, 7 Jul 2020 13:42:15 +0000 (15:42 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 7 Jul 2020 13:42:15 +0000 (15:42 +0200)
Current code in sync_cache assume that the address passed in is
aligned to a cache line size. Fix the code to support passing in
arbitrary addresses not necessarily aligned to a cache line size.

This is part of XSA-321.

Reported-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: b6d9398144f21718d25daaf8d72669a75592abc5
master date: 2020-07-07 14:39:05 +0200

xen/drivers/passthrough/vtd/iommu.c

index 6b9a1b6145e57d244b2a7ca07d1c67db777e2c67..2c6a69dfbe4e9cdfd7c357b32ffae096361eee9f 100644 (file)
@@ -161,8 +161,8 @@ static int iommus_incoherent;
 
 static void sync_cache(const void *addr, unsigned int size)
 {
-    int i;
-    static unsigned int clflush_size = 0;
+    static unsigned long clflush_size = 0;
+    const void *end = addr + size;
 
     if ( !iommus_incoherent )
         return;
@@ -170,8 +170,9 @@ static void sync_cache(const void *addr, unsigned int size)
     if ( clflush_size == 0 )
         clflush_size = get_cache_line_size();
 
-    for ( i = 0; i < size; i += clflush_size )
-        cacheline_flush((char *)addr + i);
+    addr -= (unsigned long)addr & (clflush_size - 1);
+    for ( ; addr < end; addr += clflush_size )
+        cacheline_flush((char *)addr);
 }
 
 /* Allocate page table, return its machine address */