~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/parisc/include/asm/cacheflush.h

Version: ~ [ linux-5.8-rc3 ] ~ [ linux-5.7.5 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.48 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.129 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.185 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.228 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.228 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.85 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _PARISC_CACHEFLUSH_H
  2 #define _PARISC_CACHEFLUSH_H
  3 
  4 #include <linux/mm.h>
  5 #include <linux/uaccess.h>
  6 #include <asm/tlbflush.h>
  7 
  8 /* The usual comment is "Caches aren't brain-dead on the <architecture>".
  9  * Unfortunately, that doesn't apply to PA-RISC. */
 10 
 11 /* Internal implementation */
 12 void flush_data_cache_local(void *);  /* flushes local data-cache only */
 13 void flush_instruction_cache_local(void *); /* flushes local code-cache only */
 14 #ifdef CONFIG_SMP
 15 void flush_data_cache(void); /* flushes data-cache only (all processors) */
 16 void flush_instruction_cache(void); /* flushes i-cache only (all processors) */
 17 #else
 18 #define flush_data_cache() flush_data_cache_local(NULL)
 19 #define flush_instruction_cache() flush_instruction_cache_local(NULL)
 20 #endif
 21 
 22 #define flush_cache_dup_mm(mm) flush_cache_mm(mm)
 23 
 24 void flush_user_icache_range_asm(unsigned long, unsigned long);
 25 void flush_kernel_icache_range_asm(unsigned long, unsigned long);
 26 void flush_user_dcache_range_asm(unsigned long, unsigned long);
 27 void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
 28 void flush_kernel_dcache_page_asm(void *);
 29 void flush_kernel_icache_page(void *);
 30 void flush_user_dcache_range(unsigned long, unsigned long);
 31 void flush_user_icache_range(unsigned long, unsigned long);
 32 
 33 /* Cache flush operations */
 34 
 35 void flush_cache_all_local(void);
 36 void flush_cache_all(void);
 37 void flush_cache_mm(struct mm_struct *mm);
 38 
 39 #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
 40 void flush_kernel_dcache_page_addr(void *addr);
 41 static inline void flush_kernel_dcache_page(struct page *page)
 42 {
 43         flush_kernel_dcache_page_addr(page_address(page));
 44 }
 45 
 46 #define flush_kernel_dcache_range(start,size) \
 47         flush_kernel_dcache_range_asm((start), (start)+(size));
 48 /* vmap range flushes and invalidates.  Architecturally, we don't need
 49  * the invalidate, because the CPU should refuse to speculate once an
 50  * area has been flushed, so invalidate is left empty */
 51 static inline void flush_kernel_vmap_range(void *vaddr, int size)
 52 {
 53         unsigned long start = (unsigned long)vaddr;
 54 
 55         flush_kernel_dcache_range_asm(start, start + size);
 56 }
 57 static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
 58 {
 59         unsigned long start = (unsigned long)vaddr;
 60         void *cursor = vaddr;
 61 
 62         for ( ; cursor < vaddr + size; cursor += PAGE_SIZE) {
 63                 struct page *page = vmalloc_to_page(cursor);
 64 
 65                 if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
 66                         flush_kernel_dcache_page(page);
 67         }
 68         flush_kernel_dcache_range_asm(start, start + size);
 69 }
 70 
 71 #define flush_cache_vmap(start, end)            flush_cache_all()
 72 #define flush_cache_vunmap(start, end)          flush_cache_all()
 73 
 74 #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
 75 extern void flush_dcache_page(struct page *page);
 76 
 77 #define flush_dcache_mmap_lock(mapping) \
 78         spin_lock_irq(&(mapping)->tree_lock)
 79 #define flush_dcache_mmap_unlock(mapping) \
 80         spin_unlock_irq(&(mapping)->tree_lock)
 81 
 82 #define flush_icache_page(vma,page)     do {            \
 83         flush_kernel_dcache_page(page);                 \
 84         flush_kernel_icache_page(page_address(page));   \
 85 } while (0)
 86 
 87 #define flush_icache_range(s,e)         do {            \
 88         flush_kernel_dcache_range_asm(s,e);             \
 89         flush_kernel_icache_range_asm(s,e);             \
 90 } while (0)
 91 
 92 #define copy_to_user_page(vma, page, vaddr, dst, src, len) \
 93 do { \
 94         flush_cache_page(vma, vaddr, page_to_pfn(page)); \
 95         memcpy(dst, src, len); \
 96         flush_kernel_dcache_range_asm((unsigned long)dst, (unsigned long)dst + len); \
 97 } while (0)
 98 
 99 #define copy_from_user_page(vma, page, vaddr, dst, src, len) \
100 do { \
101         flush_cache_page(vma, vaddr, page_to_pfn(page)); \
102         memcpy(dst, src, len); \
103 } while (0)
104 
105 void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn);
106 void flush_cache_range(struct vm_area_struct *vma,
107                 unsigned long start, unsigned long end);
108 
109 /* defined in pacache.S exported in cache.c used by flush_anon_page */
110 void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
111 
112 #define ARCH_HAS_FLUSH_ANON_PAGE
113 static inline void
114 flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
115 {
116         if (PageAnon(page)) {
117                 flush_tlb_page(vma, vmaddr);
118                 preempt_disable();
119                 flush_dcache_page_asm(page_to_phys(page), vmaddr);
120                 preempt_enable();
121         }
122 }
123 
124 #ifdef CONFIG_DEBUG_RODATA
125 void mark_rodata_ro(void);
126 #endif
127 
128 #include <asm/kmap_types.h>
129 
130 #define ARCH_HAS_KMAP
131 
132 static inline void *kmap(struct page *page)
133 {
134         might_sleep();
135         return page_address(page);
136 }
137 
138 static inline void kunmap(struct page *page)
139 {
140         flush_kernel_dcache_page_addr(page_address(page));
141 }
142 
143 static inline void *kmap_atomic(struct page *page)
144 {
145         pagefault_disable();
146         return page_address(page);
147 }
148 
149 static inline void __kunmap_atomic(void *addr)
150 {
151         flush_kernel_dcache_page_addr(addr);
152         pagefault_enable();
153 }
154 
155 #define kmap_atomic_prot(page, prot)    kmap_atomic(page)
156 #define kmap_atomic_pfn(pfn)    kmap_atomic(pfn_to_page(pfn))
157 #define kmap_atomic_to_page(ptr)        virt_to_page(ptr)
158 
159 #endif /* _PARISC_CACHEFLUSH_H */
160 
161 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp