/[pkg-src]/trunk/kernel26-xen/patches-2.6.25-r1/1069-2.6.25-xen-Try-to-make-pagetables-read-only.patch |
Annotation of /trunk/kernel26-xen/patches-2.6.25-r1/1069-2.6.25-xen-Try-to-make-pagetables-read-only.patch
Parent Directory | Revision Log
Revision 606 -
(hide annotations)
(download)
Thu May 22 23:13:13 2008 UTC (16 years ago) by niro
File size: 3534 byte(s)
Thu May 22 23:13:13 2008 UTC (16 years ago) by niro
File size: 3534 byte(s)
-ver bump to 2.6.25-magellan-r1: - linux-2.6.25.4 - fbcondecor-0.9.4 - squashfs-3.3 - unionfs-2.3.3 - tuxonice-3.0-rc7 - linux-phc-0.3.0 - acpi-dstd-0.9a - reiser4 - xen-3.2.0 . ipw3945-1.2.2
1 | niro | 606 | From 856b9dd6237a7f7dacd949c8f0f50ec21fbf7368 Mon Sep 17 00:00:00 2001 |
2 | From: Eduardo Habkost <ehabkost@redhat.com> | ||
3 | Date: Tue, 18 Dec 2007 10:21:45 -0200 | ||
4 | Subject: [PATCH] Try to make pagetables read-only | ||
5 | |||
6 | Not working yet. :( | ||
7 | |||
8 | Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> | ||
9 | --- | ||
10 | arch/x86/mm/init_64.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ | ||
11 | 1 files changed, 81 insertions(+), 0 deletions(-) | ||
12 | |||
13 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c | ||
14 | index a6f2051..cf1453b 100644 | ||
15 | --- a/arch/x86/mm/init_64.c | ||
16 | +++ b/arch/x86/mm/init_64.c | ||
17 | @@ -70,6 +70,85 @@ static unsigned long dma_reserve __initdata; | ||
18 | |||
19 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | ||
20 | |||
21 | +#ifdef CONFIG_XEN | ||
22 | + | ||
23 | +static void __make_page_readonly(void *va) | ||
24 | +{ | ||
25 | + pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; | ||
26 | + unsigned long addr = (unsigned long) va; | ||
27 | + | ||
28 | + xprintk("%s(%p)\n", __func__, va); | ||
29 | + | ||
30 | + pgd = pgd_offset_k(addr); | ||
31 | + pud = pud_offset(pgd, addr); | ||
32 | + pmd = pmd_offset(pud, addr); | ||
33 | + ptep = pte_offset_kernel(pmd, addr); | ||
34 | + | ||
35 | + pte.pte = ptep->pte & ~_PAGE_RW; | ||
36 | + xprintk("update_va_mapping: %lx, %lx\n", addr, pte); | ||
37 | + | ||
38 | + if (HYPERVISOR_update_va_mapping(addr, pte, 0)) | ||
39 | + BUG(); //xen_l1_entry_update(ptep, pte); /* fallback */ | ||
40 | + | ||
41 | + if ((addr >= VMALLOC_START) && (addr < VMALLOC_END)) | ||
42 | + __make_page_readonly(__va(pte_pfn(pte) << PAGE_SHIFT)); | ||
43 | +} | ||
44 | + | ||
45 | +static void __make_page_writable(void *va) | ||
46 | +{ | ||
47 | + pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep; | ||
48 | + unsigned long addr = (unsigned long) va; | ||
49 | + | ||
50 | + pgd = pgd_offset_k(addr); | ||
51 | + pud = pud_offset(pgd, addr); | ||
52 | + pmd = pmd_offset(pud, addr); | ||
53 | + ptep = pte_offset_kernel(pmd, addr); | ||
54 | + | ||
55 | + pte.pte = ptep->pte | _PAGE_RW; | ||
56 | + if (HYPERVISOR_update_va_mapping(addr, pte, 0)) | ||
57 | + BUG();//xen_l1_entry_update(ptep, pte); /* fallback */ | ||
58 | + | ||
59 | + if ((addr >= VMALLOC_START) && (addr < VMALLOC_END)) | ||
60 | + __make_page_writable(__va(pte_pfn(pte) << PAGE_SHIFT)); | ||
61 | +} | ||
62 | + | ||
63 | +void make_page_readonly(void *va, unsigned int feature) | ||
64 | +{ | ||
65 | + if (!xen_feature(feature)) | ||
66 | + __make_page_readonly(va); | ||
67 | +} | ||
68 | + | ||
69 | +void make_page_writable(void *va, unsigned int feature) | ||
70 | +{ | ||
71 | + if (!xen_feature(feature)) | ||
72 | + __make_page_writable(va); | ||
73 | +} | ||
74 | + | ||
75 | +void make_pages_readonly(void *va, unsigned nr, unsigned int feature) | ||
76 | +{ | ||
77 | + if (xen_feature(feature)) | ||
78 | + return; | ||
79 | + | ||
80 | + while (nr-- != 0) { | ||
81 | + __make_page_readonly(va); | ||
82 | + va = (void*)((unsigned long)va + PAGE_SIZE); | ||
83 | + } | ||
84 | +} | ||
85 | + | ||
86 | +void make_pages_writable(void *va, unsigned nr, unsigned int feature) | ||
87 | +{ | ||
88 | + if (xen_feature(feature)) | ||
89 | + return; | ||
90 | + | ||
91 | + while (nr-- != 0) { | ||
92 | + __make_page_writable(va); | ||
93 | + va = (void*)((unsigned long)va + PAGE_SIZE); | ||
94 | + } | ||
95 | +} | ||
96 | + | ||
97 | + | ||
98 | +#endif | ||
99 | + | ||
100 | /* | ||
101 | * NOTE: pagetable_init alloc all the fixmap pagetables contiguous on the | ||
102 | * physical space so we can cache the place of the first one and move | ||
103 | @@ -150,6 +229,7 @@ set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t pteval) | ||
104 | pud = pud_page + pud_index(vaddr); | ||
105 | if (pud_none(*pud)) { | ||
106 | pmd = (pmd_t *) spp_getpage(); | ||
107 | + make_page_readonly(pmd, XENFEAT_writable_page_tables); | ||
108 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER)); | ||
109 | if (pmd != pmd_offset(pud, 0)) { | ||
110 | printk(KERN_ERR "PAGETABLE BUG #01! %p <-> %p\n", | ||
111 | @@ -160,6 +240,7 @@ set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t pteval) | ||
112 | pmd = pmd_offset(pud, vaddr); | ||
113 | if (pmd_none(*pmd)) { | ||
114 | pte = (pte_t *) spp_getpage(); | ||
115 | + make_page_readonly(pte, XENFEAT_writable_page_tables); | ||
116 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER)); | ||
117 | if (pte != pte_offset_kernel(pmd, 0)) { | ||
118 | printk(KERN_ERR "PAGETABLE BUG #02!\n"); | ||
119 | -- | ||
120 | 1.5.4.1 | ||
121 |