|
@@ -92,6 +92,9 @@ static int __init init_static_idmap(void)
|
|
|
(long long)idmap_start, (long long)idmap_end);
|
|
|
identity_mapping_add(idmap_pgd, idmap_start, idmap_end);
|
|
|
|
|
|
+ /* Flush L1 for the hardware to see this page table content */
|
|
|
+ flush_cache_louis();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
early_initcall(init_static_idmap);
|
|
@@ -103,12 +106,15 @@ early_initcall(init_static_idmap);
|
|
|
*/
|
|
|
void setup_mm_for_reboot(void)
|
|
|
{
|
|
|
- /* Clean and invalidate L1. */
|
|
|
- flush_cache_all();
|
|
|
-
|
|
|
/* Switch to the identity mapping. */
|
|
|
cpu_switch_mm(idmap_pgd, &init_mm);
|
|
|
|
|
|
- /* Flush the TLB. */
|
|
|
+#ifdef CONFIG_CPU_HAS_ASID
|
|
|
+ /*
|
|
|
+ * We don't have a clean ASID for the identity mapping, which
|
|
|
+ * may clash with virtual addresses of the previous page tables
|
|
|
+ * and therefore potentially in the TLB.
|
|
|
+ */
|
|
|
local_flush_tlb_all();
|
|
|
+#endif
|
|
|
}
|