diff options
-rw-r--r-- | arch/arm/mm/idmap.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/arm/mm/idmap.c b/arch/arm/mm/idmap.c index ab88ed4f8e08..99db769307ec 100644 --- a/arch/arm/mm/idmap.c +++ b/arch/arm/mm/idmap.c | |||
@@ -92,6 +92,9 @@ static int __init init_static_idmap(void) | |||
92 | (long long)idmap_start, (long long)idmap_end); | 92 | (long long)idmap_start, (long long)idmap_end); |
93 | identity_mapping_add(idmap_pgd, idmap_start, idmap_end); | 93 | identity_mapping_add(idmap_pgd, idmap_start, idmap_end); |
94 | 94 | ||
95 | /* Flush L1 for the hardware to see this page table content */ | ||
96 | flush_cache_louis(); | ||
97 | |||
95 | return 0; | 98 | return 0; |
96 | } | 99 | } |
97 | early_initcall(init_static_idmap); | 100 | early_initcall(init_static_idmap); |
@@ -103,12 +106,15 @@ early_initcall(init_static_idmap); | |||
103 | */ | 106 | */ |
104 | void setup_mm_for_reboot(void) | 107 | void setup_mm_for_reboot(void) |
105 | { | 108 | { |
106 | /* Clean and invalidate L1. */ | ||
107 | flush_cache_all(); | ||
108 | |||
109 | /* Switch to the identity mapping. */ | 109 | /* Switch to the identity mapping. */ |
110 | cpu_switch_mm(idmap_pgd, &init_mm); | 110 | cpu_switch_mm(idmap_pgd, &init_mm); |
111 | 111 | ||
112 | /* Flush the TLB. */ | 112 | #ifdef CONFIG_CPU_HAS_ASID |
113 | /* | ||
114 | * We don't have a clean ASID for the identity mapping, which | ||
115 | * may clash with virtual addresses of the previous page tables | ||
116 | * and therefore potentially in the TLB. | ||
117 | */ | ||
113 | local_flush_tlb_all(); | 118 | local_flush_tlb_all(); |
119 | #endif | ||
114 | } | 120 | } |