diff options
-rw-r--r-- | arch/parisc/include/asm/cacheflush.h | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/arch/parisc/include/asm/cacheflush.h b/arch/parisc/include/asm/cacheflush.h index f388a85bba11..7344e1d304af 100644 --- a/arch/parisc/include/asm/cacheflush.h +++ b/arch/parisc/include/asm/cacheflush.h | |||
@@ -37,6 +37,13 @@ void flush_cache_all_local(void); | |||
37 | void flush_cache_all(void); | 37 | void flush_cache_all(void); |
38 | void flush_cache_mm(struct mm_struct *mm); | 38 | void flush_cache_mm(struct mm_struct *mm); |
39 | 39 | ||
40 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | ||
41 | void flush_kernel_dcache_page_addr(void *addr); | ||
42 | static inline void flush_kernel_dcache_page(struct page *page) | ||
43 | { | ||
44 | flush_kernel_dcache_page_addr(page_address(page)); | ||
45 | } | ||
46 | |||
40 | #define flush_kernel_dcache_range(start,size) \ | 47 | #define flush_kernel_dcache_range(start,size) \ |
41 | flush_kernel_dcache_range_asm((start), (start)+(size)); | 48 | flush_kernel_dcache_range_asm((start), (start)+(size)); |
42 | /* vmap range flushes and invalidates. Architecturally, we don't need | 49 | /* vmap range flushes and invalidates. Architecturally, we don't need |
@@ -50,6 +57,16 @@ static inline void flush_kernel_vmap_range(void *vaddr, int size) | |||
50 | } | 57 | } |
51 | static inline void invalidate_kernel_vmap_range(void *vaddr, int size) | 58 | static inline void invalidate_kernel_vmap_range(void *vaddr, int size) |
52 | { | 59 | { |
60 | unsigned long start = (unsigned long)vaddr; | ||
61 | void *cursor = vaddr; | ||
62 | |||
63 | for ( ; cursor < vaddr + size; cursor += PAGE_SIZE) { | ||
64 | struct page *page = vmalloc_to_page(cursor); | ||
65 | |||
66 | if (test_and_clear_bit(PG_dcache_dirty, &page->flags)) | ||
67 | flush_kernel_dcache_page(page); | ||
68 | } | ||
69 | flush_kernel_dcache_range_asm(start, start + size); | ||
53 | } | 70 | } |
54 | 71 | ||
55 | #define flush_cache_vmap(start, end) flush_cache_all() | 72 | #define flush_cache_vmap(start, end) flush_cache_all() |
@@ -98,13 +115,6 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma | |||
98 | flush_user_dcache_page(vmaddr); | 115 | flush_user_dcache_page(vmaddr); |
99 | } | 116 | } |
100 | 117 | ||
101 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | ||
102 | void flush_kernel_dcache_page_addr(void *addr); | ||
103 | static inline void flush_kernel_dcache_page(struct page *page) | ||
104 | { | ||
105 | flush_kernel_dcache_page_addr(page_address(page)); | ||
106 | } | ||
107 | |||
108 | #ifdef CONFIG_DEBUG_RODATA | 118 | #ifdef CONFIG_DEBUG_RODATA |
109 | void mark_rodata_ro(void); | 119 | void mark_rodata_ro(void); |
110 | #endif | 120 | #endif |