/[pkg-src]/trunk/kernel26-xen/patches-2.6.25-r1/1069-2.6.25-xen-Try-to-make-pagetables-read-only.patch |
Contents 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 -
(show 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 | 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 |