Magellan Linux

Contents of /trunk/kernel26-xen/patches-2.6.25-r1/1069-2.6.25-xen-Try-to-make-pagetables-read-only.patch

Parent Directory Parent Directory | Revision Log 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)
-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