pageattr.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright IBM Corp. 2011
  3. * Author(s): Jan Glauber <jang@linux.vnet.ibm.com>
  4. */
  5. #include <linux/module.h>
  6. #include <linux/mm.h>
  7. #include <linux/hugetlb.h>
  8. #include <asm/cacheflush.h>
  9. #include <asm/pgtable.h>
  10. static void change_page_attr(unsigned long addr, int numpages,
  11. pte_t (*set) (pte_t))
  12. {
  13. pte_t *ptep, pte;
  14. pmd_t *pmdp;
  15. pud_t *pudp;
  16. pgd_t *pgdp;
  17. int i;
  18. for (i = 0; i < numpages; i++) {
  19. pgdp = pgd_offset(&init_mm, addr);
  20. pudp = pud_offset(pgdp, addr);
  21. pmdp = pmd_offset(pudp, addr);
  22. if (pmd_huge(*pmdp)) {
  23. WARN_ON_ONCE(1);
  24. continue;
  25. }
  26. ptep = pte_offset_kernel(pmdp, addr);
  27. pte = *ptep;
  28. pte = set(pte);
  29. __ptep_ipte(addr, ptep);
  30. *ptep = pte;
  31. addr += PAGE_SIZE;
  32. }
  33. }
  34. int set_memory_ro(unsigned long addr, int numpages)
  35. {
  36. change_page_attr(addr, numpages, pte_wrprotect);
  37. return 0;
  38. }
  39. EXPORT_SYMBOL_GPL(set_memory_ro);
  40. int set_memory_rw(unsigned long addr, int numpages)
  41. {
  42. change_page_attr(addr, numpages, pte_mkwrite);
  43. return 0;
  44. }
  45. EXPORT_SYMBOL_GPL(set_memory_rw);
  46. /* not possible */
  47. int set_memory_nx(unsigned long addr, int numpages)
  48. {
  49. return 0;
  50. }
  51. EXPORT_SYMBOL_GPL(set_memory_nx);
  52. int set_memory_x(unsigned long addr, int numpages)
  53. {
  54. return 0;
  55. }