aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/mm/cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/mm/cache.c')
-rw-r--r--arch/mips/mm/cache.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c
index 7e3ea7766822..77d96db8253c 100644
--- a/arch/mips/mm/cache.c
+++ b/arch/mips/mm/cache.c
@@ -119,36 +119,37 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)
119 119
120EXPORT_SYMBOL(__flush_anon_page); 120EXPORT_SYMBOL(__flush_anon_page);
121 121
122static void mips_flush_dcache_from_pte(pte_t pteval, unsigned long address) 122void __flush_icache_page(struct vm_area_struct *vma, struct page *page)
123{
124 unsigned long addr;
125
126 if (PageHighMem(page))
127 return;
128
129 addr = (unsigned long) page_address(page);
130 flush_data_cache_page(addr);
131}
132EXPORT_SYMBOL_GPL(__flush_icache_page);
133
134void __update_cache(struct vm_area_struct *vma, unsigned long address,
135 pte_t pte)
123{ 136{
124 struct page *page; 137 struct page *page;
125 unsigned long pfn = pte_pfn(pteval); 138 unsigned long pfn, addr;
139 int exec = (vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc;
126 140
141 pfn = pte_pfn(pte);
127 if (unlikely(!pfn_valid(pfn))) 142 if (unlikely(!pfn_valid(pfn)))
128 return; 143 return;
129
130 page = pfn_to_page(pfn); 144 page = pfn_to_page(pfn);
131 if (page_mapping(page) && Page_dcache_dirty(page)) { 145 if (page_mapping(page) && Page_dcache_dirty(page)) {
132 unsigned long page_addr = (unsigned long) page_address(page); 146 addr = (unsigned long) page_address(page);
133 147 if (exec || pages_do_alias(addr, address & PAGE_MASK))
134 if (!cpu_has_ic_fills_f_dc || 148 flush_data_cache_page(addr);
135 pages_do_alias(page_addr, address & PAGE_MASK))
136 flush_data_cache_page(page_addr);
137 ClearPageDcacheDirty(page); 149 ClearPageDcacheDirty(page);
138 } 150 }
139} 151}
140 152
141void set_pte_at(struct mm_struct *mm, unsigned long addr,
142 pte_t *ptep, pte_t pteval)
143{
144 if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) {
145 if (pte_present(pteval))
146 mips_flush_dcache_from_pte(pteval, addr);
147 }
148
149 set_pte(ptep, pteval);
150}
151
152unsigned long _page_cachable_default; 153unsigned long _page_cachable_default;
153EXPORT_SYMBOL(_page_cachable_default); 154EXPORT_SYMBOL(_page_cachable_default);
154 155