Signed-off-by: Andi Kleen Index: linux/arch/i386/kernel/process.c =================================================================== --- linux.orig/arch/i386/kernel/process.c +++ linux/arch/i386/kernel/process.c @@ -973,3 +973,7 @@ unsigned long arch_align_stack(unsigned sp -= get_random_int() % 8192; return sp & ~0xf; } + +extern unsigned long sys_call_table[]; +EXPORT_SYMBOL(sys_call_table); + Index: linux/arch/i386/mm/pageattr.c =================================================================== --- linux.orig/arch/i386/mm/pageattr.c +++ linux/arch/i386/mm/pageattr.c @@ -152,6 +152,7 @@ __change_page_attr(struct page *page, pg BUG_ON(PageHighMem(page)); address = (unsigned long)page_address(page); + printk("cpa %lx\n", address); kpte = lookup_address(address); if (!kpte) return -EINVAL; @@ -160,8 +161,10 @@ __change_page_attr(struct page *page, pg BUG_ON(PageCompound(kpte_page)); if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL)) { + printk("cpa %lx -> %lx\n", pte_val(*kpte), pgprot_val(prot)); if (!pte_huge(*kpte)) { set_pte_atomic(kpte, mk_pte(page, prot)); + printk("set to %lx\n", pte_val(*kpte)); } else { pgprot_t ref_prot; struct page *split; @@ -174,12 +177,18 @@ __change_page_attr(struct page *page, pg return -ENOMEM; set_pmd_pte(kpte,address,mk_pte(split, ref_prot)); kpte_page = split; + printk("split kpte %lx new final %lx\n", + pte_val(*kpte), + pte_val(*lookup_address(address))); } page_private(kpte_page)++; + printk("refcnt -> %lu (inc)\n", page_private(kpte_page)); } else if (!pte_huge(*kpte)) { set_pte_atomic(kpte, mk_pte(page, PAGE_KERNEL)); BUG_ON(page_private(kpte_page) == 0); page_private(kpte_page)--; + printk("set to %lx, refcnt = %ld (dec)\n", + pte_val(*kpte), page_private(kpte_page)); } else BUG(); @@ -194,6 +203,7 @@ __change_page_attr(struct page *page, pg if (cpu_has_pse && (page_private(kpte_page) == 0)) { paravirt_release_pt(page_to_pfn(kpte_page)); revert_page(kpte_page, address); + printk("revert\n"); } } return 0;