Version:  2.0.40 2.2.26 2.4.37 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1

Linux/arch/x86/include/asm/cacheflush.h

  1 #ifndef _ASM_X86_CACHEFLUSH_H
  2 #define _ASM_X86_CACHEFLUSH_H
  3 
  4 /* Caches aren't brain-dead on the intel. */
  5 #include <asm-generic/cacheflush.h>
  6 #include <asm/special_insns.h>
  7 
  8 /*
  9  * The set_memory_* API can be used to change various attributes of a virtual
 10  * address range. The attributes include:
 11  * Cachability   : UnCached, WriteCombining, WriteBack
 12  * Executability : eXeutable, NoteXecutable
 13  * Read/Write    : ReadOnly, ReadWrite
 14  * Presence      : NotPresent
 15  *
 16  * Within a category, the attributes are mutually exclusive.
 17  *
 18  * The implementation of this API will take care of various aspects that
 19  * are associated with changing such attributes, such as:
 20  * - Flushing TLBs
 21  * - Flushing CPU caches
 22  * - Making sure aliases of the memory behind the mapping don't violate
 23  *   coherency rules as defined by the CPU in the system.
 24  *
 25  * What this API does not do:
 26  * - Provide exclusion between various callers - including callers that
 27  *   operation on other mappings of the same physical page
 28  * - Restore default attributes when a page is freed
 29  * - Guarantee that mappings other than the requested one are
 30  *   in any state, other than that these do not violate rules for
 31  *   the CPU you have. Do not depend on any effects on other mappings,
 32  *   CPUs other than the one you have may have more relaxed rules.
 33  * The caller is required to take care of these.
 34  */
 35 
 36 int _set_memory_uc(unsigned long addr, int numpages);
 37 int _set_memory_wc(unsigned long addr, int numpages);
 38 int _set_memory_wb(unsigned long addr, int numpages);
 39 int set_memory_uc(unsigned long addr, int numpages);
 40 int set_memory_wc(unsigned long addr, int numpages);
 41 int set_memory_wb(unsigned long addr, int numpages);
 42 int set_memory_x(unsigned long addr, int numpages);
 43 int set_memory_nx(unsigned long addr, int numpages);
 44 int set_memory_ro(unsigned long addr, int numpages);
 45 int set_memory_rw(unsigned long addr, int numpages);
 46 int set_memory_np(unsigned long addr, int numpages);
 47 int set_memory_4k(unsigned long addr, int numpages);
 48 
 49 int set_memory_array_uc(unsigned long *addr, int addrinarray);
 50 int set_memory_array_wc(unsigned long *addr, int addrinarray);
 51 int set_memory_array_wb(unsigned long *addr, int addrinarray);
 52 
 53 int set_pages_array_uc(struct page **pages, int addrinarray);
 54 int set_pages_array_wc(struct page **pages, int addrinarray);
 55 int set_pages_array_wb(struct page **pages, int addrinarray);
 56 
 57 /*
 58  * For legacy compatibility with the old APIs, a few functions
 59  * are provided that work on a "struct page".
 60  * These functions operate ONLY on the 1:1 kernel mapping of the
 61  * memory that the struct page represents, and internally just
 62  * call the set_memory_* function. See the description of the
 63  * set_memory_* function for more details on conventions.
 64  *
 65  * These APIs should be considered *deprecated* and are likely going to
 66  * be removed in the future.
 67  * The reason for this is the implicit operation on the 1:1 mapping only,
 68  * making this not a generally useful API.
 69  *
 70  * Specifically, many users of the old APIs had a virtual address,
 71  * called virt_to_page() or vmalloc_to_page() on that address to
 72  * get a struct page* that the old API required.
 73  * To convert these cases, use set_memory_*() on the original
 74  * virtual address, do not use these functions.
 75  */
 76 
 77 int set_pages_uc(struct page *page, int numpages);
 78 int set_pages_wb(struct page *page, int numpages);
 79 int set_pages_x(struct page *page, int numpages);
 80 int set_pages_nx(struct page *page, int numpages);
 81 int set_pages_ro(struct page *page, int numpages);
 82 int set_pages_rw(struct page *page, int numpages);
 83 
 84 
 85 void clflush_cache_range(void *addr, unsigned int size);
 86 
 87 #ifdef CONFIG_DEBUG_RODATA
 88 void mark_rodata_ro(void);
 89 extern const int rodata_test_data;
 90 extern int kernel_set_to_readonly;
 91 void set_kernel_text_rw(void);
 92 void set_kernel_text_ro(void);
 93 #else
 94 static inline void set_kernel_text_rw(void) { }
 95 static inline void set_kernel_text_ro(void) { }
 96 #endif
 97 
 98 #ifdef CONFIG_DEBUG_RODATA_TEST
 99 int rodata_test(void);
100 #else
101 static inline int rodata_test(void)
102 {
103         return 0;
104 }
105 #endif
106 
107 #endif /* _ASM_X86_CACHEFLUSH_H */
108 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us