blob: f05edcc3beff42c53cae96eb1850001915ff5bbc [file] [log] [blame]
Jan Glauber305b1522011-03-15 17:08:22 +01001/*
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/pgtable.h>
9
10static 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
19 for (i = 0; i < numpages; i++) {
20 pgdp = pgd_offset(&init_mm, addr);
21 pudp = pud_offset(pgdp, addr);
22 pmdp = pmd_offset(pudp, addr);
23 if (pmd_huge(*pmdp)) {
24 WARN_ON_ONCE(1);
25 continue;
26 }
Jan Glaubere4c031b2011-04-20 10:15:32 +020027 ptep = pte_offset_kernel(pmdp, addr);
Jan Glauber305b1522011-03-15 17:08:22 +010028
29 pte = *ptep;
30 pte = set(pte);
Jan Glaubere4c031b2011-04-20 10:15:32 +020031 ptep_invalidate(&init_mm, addr, ptep);
Jan Glauber305b1522011-03-15 17:08:22 +010032 *ptep = pte;
Jan Glaubere4c031b2011-04-20 10:15:32 +020033 addr += PAGE_SIZE;
Jan Glauber305b1522011-03-15 17:08:22 +010034 }
35}
36
37int set_memory_ro(unsigned long addr, int numpages)
38{
39 change_page_attr(addr, numpages, pte_wrprotect);
40 return 0;
41}
42EXPORT_SYMBOL_GPL(set_memory_ro);
43
44int set_memory_rw(unsigned long addr, int numpages)
45{
46 change_page_attr(addr, numpages, pte_mkwrite);
47 return 0;
48}
49EXPORT_SYMBOL_GPL(set_memory_rw);
50
51/* not possible */
52int set_memory_nx(unsigned long addr, int numpages)
53{
54 return 0;
55}
56EXPORT_SYMBOL_GPL(set_memory_nx);
Jan Glauber448694a2011-05-19 16:55:26 -060057
58int set_memory_x(unsigned long addr, int numpages)
59{
60 return 0;
61}