diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2008-06-13 05:28:36 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-07-03 11:39:57 -0400 |
commit | 826cbdaff29764bb6928c715c6a025e49469dda9 (patch) | |
tree | 0fa040b3be05d88291eb5dca05f77202ad56ab45 /include/asm-arm | |
parent | 43df5220e455d426ec7462d0bf906e686c65ebb5 (diff) |
[ARM] 5092/1: Fix the I-cache invalidation on ARMv6 and later CPUs
This patch adds the I-cache invalidation in update_mmu_cache if the
corresponding vma is marked as executable. It also invalidates the
I-cache if a thread migrates to a CPU it never ran on.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'include/asm-arm')
-rw-r--r-- | include/asm-arm/cacheflush.h | 7 | ||||
-rw-r--r-- | include/asm-arm/mmu_context.h | 5 |
2 files changed, 12 insertions, 0 deletions
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index 759a97b56eed..559fb4af1f62 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h | |||
@@ -410,6 +410,13 @@ extern void flush_dcache_page(struct page *); | |||
410 | 410 | ||
411 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); | 411 | extern void __flush_dcache_page(struct address_space *mapping, struct page *page); |
412 | 412 | ||
413 | static inline void __flush_icache_all(void) | ||
414 | { | ||
415 | asm("mcr p15, 0, %0, c7, c5, 0 @ invalidate I-cache\n" | ||
416 | : | ||
417 | : "r" (0)); | ||
418 | } | ||
419 | |||
413 | #define ARCH_HAS_FLUSH_ANON_PAGE | 420 | #define ARCH_HAS_FLUSH_ANON_PAGE |
414 | static inline void flush_anon_page(struct vm_area_struct *vma, | 421 | static inline void flush_anon_page(struct vm_area_struct *vma, |
415 | struct page *page, unsigned long vmaddr) | 422 | struct page *page, unsigned long vmaddr) |
diff --git a/include/asm-arm/mmu_context.h b/include/asm-arm/mmu_context.h index 6913d02ca5d6..91b9dfdfed52 100644 --- a/include/asm-arm/mmu_context.h +++ b/include/asm-arm/mmu_context.h | |||
@@ -97,6 +97,11 @@ switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
97 | #ifdef CONFIG_MMU | 97 | #ifdef CONFIG_MMU |
98 | unsigned int cpu = smp_processor_id(); | 98 | unsigned int cpu = smp_processor_id(); |
99 | 99 | ||
100 | #ifdef CONFIG_SMP | ||
101 | /* check for possible thread migration */ | ||
102 | if (!cpus_empty(next->cpu_vm_mask) && !cpu_isset(cpu, next->cpu_vm_mask)) | ||
103 | __flush_icache_all(); | ||
104 | #endif | ||
100 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask) || prev != next) { | 105 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask) || prev != next) { |
101 | check_context(next); | 106 | check_context(next); |
102 | cpu_switch_mm(next->pgd, next); | 107 | cpu_switch_mm(next->pgd, next); |