Magellan Linux

Annotation 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 - (hide 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 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