851216d61a
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
40 lines
1.4 KiB
Diff
40 lines
1.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: dann frazier <dann.frazier@canonical.com>
|
|
Date: Thu, 25 Aug 2022 17:08:09 -0600
|
|
Subject: [PATCH] linuxefi: Invalidate i-cache before starting the kernel
|
|
|
|
We need to flush the memory range of the code we are about to execute
|
|
from the instruction cache before we can safely execute it. Not doing
|
|
so appears to be the source of rare synchronous exceptions a user
|
|
is seeing on a Cortex-A72-based platform while executing the Linux EFI
|
|
stub. Notably they seem to correlate with an instruction on a cache
|
|
line boundary.
|
|
|
|
Signed-off-by: dann frazier <dann.frazier@canonical.com>
|
|
---
|
|
grub-core/loader/efi/linux.c | 4 ++++
|
|
1 file changed, 4 insertions(+)
|
|
|
|
diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c
|
|
index 277f352e0c..e413bdcc23 100644
|
|
--- a/grub-core/loader/efi/linux.c
|
|
+++ b/grub-core/loader/efi/linux.c
|
|
@@ -16,6 +16,7 @@
|
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
+#include <grub/cache.h>
|
|
#include <grub/err.h>
|
|
#include <grub/mm.h>
|
|
#include <grub/types.h>
|
|
@@ -210,6 +211,9 @@ grub_efi_linux_boot (grub_addr_t kernel_addr, grub_size_t kernel_size,
|
|
asm volatile ("cli");
|
|
#endif
|
|
|
|
+ /* Invalidate the instruction cache */
|
|
+ grub_arch_sync_caches((void *)kernel_addr, kernel_size);
|
|
+
|
|
hf = (handover_func)((char *)kernel_addr + handover_offset + offset);
|
|
hf (grub_efi_image_handle, grub_efi_system_table, kernel_params);
|
|
|