From 38f761fca639ce462f3184daecebb18b063316e7 Mon Sep 17 00:00:00 2001 From: Eduardo Habkost Date: Wed, 28 Nov 2007 17:53:17 -0200 Subject: [PATCH] xen: Make xen_pte_val() generic Care is taken to make sure that all attribute bits are left untouched by the address translation, especially NX since it is a higher bit than all the others. Signed-off-by: Eduardo Habkost --- arch/x86/xen/mmu.c | 36 ++++++++++++++---------------------- 1 files changed, 14 insertions(+), 22 deletions(-) diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index b974434..4ec41ce 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -143,6 +143,20 @@ void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, xen_set_pte(ptep, pteval); } +pteval_t xen_pte_val(pte_t pte) +{ + pteval_t ret = pte_val_ma(pte); + + if (ret & _PAGE_PRESENT) { + /* preserve all other pte bits */ + unsigned long m = machine_to_phys(XMADDR(ret & PHYSICAL_PAGE_MASK)).paddr; + ret &= ~PHYSICAL_PAGE_MASK; + ret |= m; + } + + return ret; +} + #ifdef CONFIG_X86_PAE void xen_set_pud(pud_t *ptr, pud_t val) { @@ -186,18 +200,6 @@ void xen_pmd_clear(pmd_t *pmdp) xen_set_pmd(pmdp, __pmd(0)); } -pteval_t xen_pte_val(pte_t pte) -{ - unsigned long long ret = 0; - - if (pte.pte_low) { - ret = ((unsigned long long)pte.pte_high << 32) | pte.pte_low; - ret = machine_to_phys(XMADDR(ret)).paddr | 1; - } - - return ret; -} - pmdval_t xen_pmd_val(pmd_t pmd) { unsigned long long ret = pmd.pmd; @@ -245,16 +247,6 @@ void xen_set_pte(pte_t *ptep, pte_t pte) *ptep = pte; } -pteval_t xen_pte_val(pte_t pte) -{ - unsigned long ret = pte.pte_low; - - if (ret & _PAGE_PRESENT) - ret = machine_to_phys(XMADDR(ret)).paddr; - - return ret; -} - pgdval_t xen_pgd_val(pgd_t pgd) { unsigned long ret = pgd.pgd; -- 1.5.4.1