mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
vtd: don't assume addresses are aligned in sync_cache
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: b6d9398144
master date: 2020-07-07 14:39:05 +0200
This commit is contained in:
1 parent
f1055a202d
commit
8b9be8f415
1 file changed
+5
-4
@@ -143,8 +143,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;
|
||||
@@ -152,8 +152,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 */
|
||||
|
||||