1#ifndef _ASM_X86_CACHEFLUSH_H
2#define _ASM_X86_CACHEFLUSH_H
3
4
5#include <linux/mm.h>
6
7
8static inline void flush_cache_all(void) { }
9static inline void flush_cache_mm(struct mm_struct *mm) { }
10static inline void flush_cache_dup_mm(struct mm_struct *mm) { }
11static inline void flush_cache_range(struct vm_area_struct *vma,
12 unsigned long start, unsigned long end) { }
13static inline void flush_cache_page(struct vm_area_struct *vma,
14 unsigned long vmaddr, unsigned long pfn) { }
15static inline void flush_dcache_page(struct page *page) { }
16static inline void flush_dcache_mmap_lock(struct address_space *mapping) { }
17static inline void flush_dcache_mmap_unlock(struct address_space *mapping) { }
18static inline void flush_icache_range(unsigned long start,
19 unsigned long end) { }
20static inline void flush_icache_page(struct vm_area_struct *vma,
21 struct page *page) { }
22static inline void flush_icache_user_range(struct vm_area_struct *vma,
23 struct page *page,
24 unsigned long addr,
25 unsigned long len) { }
26static inline void flush_cache_vmap(unsigned long start, unsigned long end) { }
27static inline void flush_cache_vunmap(unsigned long start,
28 unsigned long end) { }
29
30static inline void copy_to_user_page(struct vm_area_struct *vma,
31 struct page *page, unsigned long vaddr,
32 void *dst, const void *src,
33 unsigned long len)
34{
35 memcpy(dst, src, len);
36}
37
38static inline void copy_from_user_page(struct vm_area_struct *vma,
39 struct page *page, unsigned long vaddr,
40 void *dst, const void *src,
41 unsigned long len)
42{
43 memcpy(dst, src, len);
44}
45
46#define PG_WC PG_arch_1
47PAGEFLAG(WC, WC)
48
49#ifdef CONFIG_X86_PAT
50
51
52
53
54
55
56
57
58
59
60static inline unsigned long get_page_memtype(struct page *pg)
61{
62 if (!PageUncached(pg) && !PageWC(pg))
63 return -1;
64 else if (!PageUncached(pg) && PageWC(pg))
65 return _PAGE_CACHE_WC;
66 else if (PageUncached(pg) && !PageWC(pg))
67 return _PAGE_CACHE_UC_MINUS;
68 else
69 return _PAGE_CACHE_WB;
70}
71
72static inline void set_page_memtype(struct page *pg, unsigned long memtype)
73{
74 switch (memtype) {
75 case _PAGE_CACHE_WC:
76 ClearPageUncached(pg);
77 SetPageWC(pg);
78 break;
79 case _PAGE_CACHE_UC_MINUS:
80 SetPageUncached(pg);
81 ClearPageWC(pg);
82 break;
83 case _PAGE_CACHE_WB:
84 SetPageUncached(pg);
85 SetPageWC(pg);
86 break;
87 default:
88 case -1:
89 ClearPageUncached(pg);
90 ClearPageWC(pg);
91 break;
92 }
93}
94#else
95static inline unsigned long get_page_memtype(struct page *pg) { return -1; }
96static inline void set_page_memtype(struct page *pg, unsigned long memtype) { }
97#endif
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127int _set_memory_uc(unsigned long addr, int numpages);
128int _set_memory_wc(unsigned long addr, int numpages);
129int _set_memory_wb(unsigned long addr, int numpages);
130int set_memory_uc(unsigned long addr, int numpages);
131int set_memory_wc(unsigned long addr, int numpages);
132int set_memory_wb(unsigned long addr, int numpages);
133int set_memory_x(unsigned long addr, int numpages);
134int set_memory_nx(unsigned long addr, int numpages);
135int set_memory_ro(unsigned long addr, int numpages);
136int set_memory_rw(unsigned long addr, int numpages);
137int set_memory_np(unsigned long addr, int numpages);
138int set_memory_4k(unsigned long addr, int numpages);
139
140int set_memory_array_uc(unsigned long *addr, int addrinarray);
141int set_memory_array_wb(unsigned long *addr, int addrinarray);
142
143int set_pages_array_uc(struct page **pages, int addrinarray);
144int set_pages_array_wb(struct page **pages, int addrinarray);
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166int set_pages_uc(struct page *page, int numpages);
167int set_pages_wb(struct page *page, int numpages);
168int set_pages_x(struct page *page, int numpages);
169int set_pages_nx(struct page *page, int numpages);
170int set_pages_ro(struct page *page, int numpages);
171int set_pages_rw(struct page *page, int numpages);
172
173
174void clflush_cache_range(void *addr, unsigned int size);
175
176#ifdef CONFIG_DEBUG_RODATA
177void mark_rodata_ro(void);
178extern const int rodata_test_data;
179void set_kernel_text_rw(void);
180void set_kernel_text_ro(void);
181#else
182static inline void set_kernel_text_rw(void) { }
183static inline void set_kernel_text_ro(void) { }
184#endif
185
186#ifdef CONFIG_DEBUG_RODATA_TEST
187int rodata_test(void);
188#else
189static inline int rodata_test(void)
190{
191 return 0;
192}
193#endif
194
195#endif
196