Skip to contentSkip to conversation

x86: implement set_pte_vaddr

PATCH In review Jeremy Fitzhardinge 1 participant 1 message Jun 17, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 3/4 x86: implement set_pte_vaddr

Re-name set_pte_pfn() to set_pte_vaddr(), taking a pte_t rather than pfn/flags, and expose it. This allows the pte to constructed in arbitrary ways, rather than just via __pte(), which may be necessary in a virtual environment.

---

arch/x86/mm/init_64.c     |    9 ++++-----
arch/x86/mm/pgtable.c     |    2 +-
arch/x86/mm/pgtable_32.c  |    6 +++---
include/asm-x86/pgtable.h |    3 +++
4 files changed, 11 insertions(+), 9 deletions(-)

===================================================================

arch/x86/mm/init_64.c +0 -0
@@ -136,15 +136,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)) {
@@ -171,7 +171,6 @@ set_pte_phys(unsigned long vaddr, unsign
			return;
		}
	}

- new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);

	pte = pte_offset_kernel(pmd, vaddr);
	if (!pte_none(*pte) && pte_val(new_pte) &&
arch/x86/mm/pgtable.c +0 -0

===================================================================

arch/x86/mm/pgtable.c +0 -0
@@ -285,6 +285,6 @@ void __set_fixmap (enum fixed_addresses 
		BUG();
		return;
	}
-	set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
+	set_pte_vaddr(address, pfn_pte(phys >> PAGE_SHIFT, flags));
	fixmaps_set++;
}
arch/x86/mm/pgtable_32.c +0 -0

===================================================================

arch/x86/mm/pgtable_32.c +1 -1
@@ -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 va
		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);
include/asm-x86/pgtable.h +0 -0

===================================================================

include/asm-x86/pgtable.h +0 -0
@@ -313,6 +313,9 @@ int phys_mem_access_prot_allowed(struct 
                              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 */