efi_loader: Always flush in cache line size granularity
authorAlexander Graf <agraf@suse.de>
Mon, 11 Apr 2016 21:20:39 +0000 (23:20 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 18 Apr 2016 21:11:39 +0000 (17:11 -0400)
The cache line flush helpers only work properly when they get aligned
start and end addresses. Round our flush range to cache line size. It's
safe because we're guaranteed to flush within a single page which has the
same cache attributes.

Reported-by: Marek Vasut <marex@denx.de>
Signed-off-by: Alexander Graf <agraf@suse.de>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Tested-by: Andreas Färber <afaerber@suse.de>
lib/efi_loader/efi_runtime.c

index 22bcd089f9c0d01ef197e89a8de29f1a5df8e71c..3ee27ca9cc624ec8031ccddc428338d89fe44e4d 100644 (file)
@@ -20,6 +20,13 @@ static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_unimplemented(void);
 static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_device_error(void);
 static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_invalid_parameter(void);
 
+#ifdef CONFIG_SYS_CACHELINE_SIZE
+#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE
+#else
+/* Just use the greatest cache flush alignment requirement I'm aware of */
+#define EFI_CACHELINE_SIZE 128
+#endif
+
 #if defined(CONFIG_ARM64)
 #define R_RELATIVE     1027
 #define R_MASK         0xffffffffULL
@@ -194,7 +201,8 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
 #endif
 
                *p = newaddr;
-               flush_dcache_range((ulong)p, (ulong)&p[1]);
+               flush_dcache_range((ulong)p & ~(EFI_CACHELINE_SIZE - 1),
+                       ALIGN((ulong)&p[1], EFI_CACHELINE_SIZE));
        }
 
 #ifndef IS_RELA