Commit d494a961 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar
Browse files

x86: implement set_pte_vaddr

parent 7c7e6e07
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -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) &&
+1 −1
Original line number Diff line number Diff line
@@ -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++;
}
+3 −3
Original line number Diff line number Diff line
@@ -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);

+3 −0
Original line number Diff line number Diff line
@@ -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 */