x86: implement set_pte_vaddr
authorJeremy Fitzhardinge <jeremy@goop.org>
Tue, 17 Jun 2008 18:41:59 +0000 (11:41 -0700)
committerIngo Molnar <mingo@elte.hu>
Fri, 20 Jun 2008 13:09:54 +0000 (15:09 +0200)
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/mm/init_64.c
arch/x86/mm/pgtable.c
arch/x86/mm/pgtable_32.c
include/asm-x86/pgtable.h

index e5f5319498573c6033ef93e4bb0617489a4480ed..74fae833512800ac0c42edd6eb681871c36519e5 100644 (file)
@@ -135,15 +135,15 @@ static __init void *spp_getpage(void)
        return ptr;
 }
 
-static void
-set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
+void
+set_pte_vaddr(unsigned long vaddr, pte_t new_pte)
 {
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
-       pte_t *pte, new_pte;
+       pte_t *pte;
 
-       pr_debug("set_pte_phys %lx to %lx\n", vaddr, phys);
+       pr_debug("set_pte_vaddr %lx to %lx\n", vaddr, native_pte_val(new_pte));
 
        pgd = pgd_offset_k(vaddr);
        if (pgd_none(*pgd)) {
@@ -170,7 +170,6 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
                        return;
                }
        }
-       new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
 
        pte = pte_offset_kernel(pmd, vaddr);
        if (!pte_none(*pte) && pte_val(new_pte) &&
index 3ebebe480b539d5c67f3a97e6ceca27f3800482d..7498124e30fca22963ca8374fb477041b05f75f8 100644 (file)
@@ -285,6 +285,6 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
                BUG();
                return;
        }
-       set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
+       set_pte_vaddr(address, pfn_pte(phys >> PAGE_SHIFT, flags));
        fixmaps_set++;
 }
index 3f97c3c87288c3afee83609af3f80d8bd04f4e27..0662f345212f048b37b61b7cef478bb49a584733 100644 (file)
@@ -71,7 +71,7 @@ void show_mem(void)
  * Associate a virtual page frame with a given physical page frame 
  * and protection flags for that frame.
  */ 
-static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
+void set_pte_vaddr(unsigned long vaddr, pte_t pteval)
 {
        pgd_t *pgd;
        pud_t *pud;
@@ -94,8 +94,8 @@ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
                return;
        }
        pte = pte_offset_kernel(pmd, vaddr);
-       if (pgprot_val(flags))
-               set_pte_present(&init_mm, vaddr, pte, pfn_pte(pfn, flags));
+       if (pte_val(pteval))
+               set_pte_present(&init_mm, vaddr, pte, pteval);
        else
                pte_clear(&init_mm, vaddr, pte);
 
index 97c271b2910b3266b4aaafa53385dfd8148bf374..702f2699c6df315b24de2e4efd0db6b4a023518c 100644 (file)
@@ -318,6 +318,9 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
                               unsigned long size, pgprot_t *vma_prot);
 #endif
 
+/* Install a pte for a particular vaddr in kernel space. */
+void set_pte_vaddr(unsigned long vaddr, pte_t pte);
+
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
 #else  /* !CONFIG_PARAVIRT */