pageattr.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/mm.h>
  7. #include <linux/module.h>
  8. #include <linux/sched.h>
  9. #include <linux/vmalloc.h>
  10. #include <asm/cacheflush.h>
  11. #include <asm/set_memory.h>
  12. #include <asm/tlbflush.h>
  13. #include <asm/kfence.h>
  14. struct page_change_data {
  15. pgprot_t set_mask;
  16. pgprot_t clear_mask;
  17. };
  18. bool rodata_full __ro_after_init = IS_ENABLED(CONFIG_RODATA_FULL_DEFAULT_ENABLED);
  19. bool can_set_direct_map(void)
  20. {
  21. /*
  22. * rodata_full and DEBUG_PAGEALLOC require linear map to be
  23. * mapped at page granularity, so that it is possible to
  24. * protect/unprotect single pages.
  25. *
  26. * KFENCE pool requires page-granular mapping if initialized late.
  27. */
  28. return rodata_full || debug_pagealloc_enabled() ||
  29. arm64_kfence_can_set_direct_map();
  30. }
  31. static int change_page_range(pte_t *ptep, unsigned long addr, void *data)
  32. {
  33. struct page_change_data *cdata = data;
  34. pte_t pte = READ_ONCE(*ptep);
  35. pte = clear_pte_bit(pte, cdata->clear_mask);
  36. pte = set_pte_bit(pte, cdata->set_mask);
  37. set_pte(ptep, pte);
  38. return 0;
  39. }
  40. /*
  41. * This function assumes that the range is mapped with PAGE_SIZE pages.
  42. */
  43. static int __change_memory_common(unsigned long start, unsigned long size,
  44. pgprot_t set_mask, pgprot_t clear_mask)
  45. {
  46. struct page_change_data data;
  47. int ret;
  48. data.set_mask = set_mask;
  49. data.clear_mask = clear_mask;
  50. ret = apply_to_page_range(&init_mm, start, size, change_page_range,
  51. &data);
  52. flush_tlb_kernel_range(start, start + size);
  53. return ret;
  54. }
  55. static int change_memory_common(unsigned long addr, int numpages,
  56. pgprot_t set_mask, pgprot_t clear_mask)
  57. {
  58. unsigned long start = addr;
  59. unsigned long size = PAGE_SIZE * numpages;
  60. unsigned long end = start + size;
  61. struct vm_struct *area;
  62. int i;
  63. if (!PAGE_ALIGNED(addr)) {
  64. start &= PAGE_MASK;
  65. end = start + size;
  66. WARN_ON_ONCE(1);
  67. }
  68. /*
  69. * Kernel VA mappings are always live, and splitting live section
  70. * mappings into page mappings may cause TLB conflicts. This means
  71. * we have to ensure that changing the permission bits of the range
  72. * we are operating on does not result in such splitting.
  73. *
  74. * Let's restrict ourselves to mappings created by vmalloc (or vmap).
  75. * Those are guaranteed to consist entirely of page mappings, and
  76. * splitting is never needed.
  77. *
  78. * So check whether the [addr, addr + size) interval is entirely
  79. * covered by precisely one VM area that has the VM_ALLOC flag set.
  80. */
  81. area = find_vm_area((void *)addr);
  82. if (!area ||
  83. end > (unsigned long)kasan_reset_tag(area->addr) + area->size ||
  84. !(area->flags & VM_ALLOC))
  85. return -EINVAL;
  86. if (!numpages)
  87. return 0;
  88. /*
  89. * If we are manipulating read-only permissions, apply the same
  90. * change to the linear mapping of the pages that back this VM area.
  91. */
  92. if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY ||
  93. pgprot_val(clear_mask) == PTE_RDONLY)) {
  94. for (i = 0; i < area->nr_pages; i++) {
  95. __change_memory_common((u64)page_address(area->pages[i]),
  96. PAGE_SIZE, set_mask, clear_mask);
  97. }
  98. }
  99. /*
  100. * Get rid of potentially aliasing lazily unmapped vm areas that may
  101. * have permissions set that deviate from the ones we are setting here.
  102. */
  103. vm_unmap_aliases();
  104. return __change_memory_common(start, size, set_mask, clear_mask);
  105. }
  106. int set_memory_ro(unsigned long addr, int numpages)
  107. {
  108. return change_memory_common(addr, numpages,
  109. __pgprot(PTE_RDONLY),
  110. __pgprot(PTE_WRITE));
  111. }
  112. int set_memory_rw(unsigned long addr, int numpages)
  113. {
  114. return change_memory_common(addr, numpages,
  115. __pgprot(PTE_WRITE),
  116. __pgprot(PTE_RDONLY));
  117. }
  118. int set_memory_nx(unsigned long addr, int numpages)
  119. {
  120. return change_memory_common(addr, numpages,
  121. __pgprot(PTE_PXN),
  122. __pgprot(PTE_MAYBE_GP));
  123. }
  124. int set_memory_x(unsigned long addr, int numpages)
  125. {
  126. return change_memory_common(addr, numpages,
  127. __pgprot(PTE_MAYBE_GP),
  128. __pgprot(PTE_PXN));
  129. }
  130. int set_memory_valid(unsigned long addr, int numpages, int enable)
  131. {
  132. if (enable)
  133. return __change_memory_common(addr, PAGE_SIZE * numpages,
  134. __pgprot(PTE_VALID),
  135. __pgprot(0));
  136. else
  137. return __change_memory_common(addr, PAGE_SIZE * numpages,
  138. __pgprot(0),
  139. __pgprot(PTE_VALID));
  140. }
  141. /*
  142. * Only to be used with memory in the logical map (e.g. vmapped memory will
  143. * face coherency issues as we don't call vm_unmap_aliases()). Only to be used
  144. * whilst accesses are not ongoing to the region, as we do not follow the
  145. * make-before-break sequence in order to cut down the run time of this
  146. * function.
  147. */
  148. int arch_set_direct_map_range_uncached(unsigned long addr, unsigned long numpages)
  149. {
  150. if (!can_set_direct_map())
  151. return 0;
  152. return __change_memory_common(addr, PAGE_SIZE * numpages,
  153. __pgprot(PTE_ATTRINDX(MT_NORMAL_NC)),
  154. __pgprot(PTE_ATTRINDX_MASK));
  155. }
  156. int set_direct_map_invalid_noflush(struct page *page)
  157. {
  158. struct page_change_data data = {
  159. .set_mask = __pgprot(0),
  160. .clear_mask = __pgprot(PTE_VALID),
  161. };
  162. if (!can_set_direct_map())
  163. return 0;
  164. return apply_to_page_range(&init_mm,
  165. (unsigned long)page_address(page),
  166. PAGE_SIZE, change_page_range, &data);
  167. }
  168. int set_direct_map_default_noflush(struct page *page)
  169. {
  170. struct page_change_data data = {
  171. .set_mask = __pgprot(PTE_VALID | PTE_WRITE),
  172. .clear_mask = __pgprot(PTE_RDONLY),
  173. };
  174. if (!can_set_direct_map())
  175. return 0;
  176. return apply_to_page_range(&init_mm,
  177. (unsigned long)page_address(page),
  178. PAGE_SIZE, change_page_range, &data);
  179. }
  180. #ifdef CONFIG_DEBUG_PAGEALLOC
  181. void __kernel_map_pages(struct page *page, int numpages, int enable)
  182. {
  183. if (!can_set_direct_map())
  184. return;
  185. set_memory_valid((unsigned long)page_address(page), numpages, enable);
  186. }
  187. #endif /* CONFIG_DEBUG_PAGEALLOC */
  188. /*
  189. * This function is used to determine if a linear map page has been marked as
  190. * not-valid. Walk the page table and check the PTE_VALID bit. This is based
  191. * on kern_addr_valid(), which almost does what we need.
  192. *
  193. * Because this is only called on the kernel linear map, p?d_sect() implies
  194. * p?d_present(). When debug_pagealloc is enabled, sections mappings are
  195. * disabled.
  196. */
  197. bool kernel_page_present(struct page *page)
  198. {
  199. pgd_t *pgdp;
  200. p4d_t *p4dp;
  201. pud_t *pudp, pud;
  202. pmd_t *pmdp, pmd;
  203. pte_t *ptep;
  204. unsigned long addr = (unsigned long)page_address(page);
  205. if (!can_set_direct_map())
  206. return true;
  207. pgdp = pgd_offset_k(addr);
  208. if (pgd_none(READ_ONCE(*pgdp)))
  209. return false;
  210. p4dp = p4d_offset(pgdp, addr);
  211. if (p4d_none(READ_ONCE(*p4dp)))
  212. return false;
  213. pudp = pud_offset(p4dp, addr);
  214. pud = READ_ONCE(*pudp);
  215. if (pud_none(pud))
  216. return false;
  217. if (pud_sect(pud))
  218. return true;
  219. pmdp = pmd_offset(pudp, addr);
  220. pmd = READ_ONCE(*pmdp);
  221. if (pmd_none(pmd))
  222. return false;
  223. if (pmd_sect(pmd))
  224. return true;
  225. ptep = pte_offset_kernel(pmdp, addr);
  226. return pte_valid(READ_ONCE(*ptep));
  227. }