Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a15af1c9 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Thomas Gleixner
Browse files

x86/paravirt: add pte_flags to just get pte flags



Add pte_flags() to extract the flags from a pte.  This is a special
case of pte_val() which is only guaranteed to return the pte's flags
correctly; the page number may be corrupted or missing.

The intent is to allow paravirt implementations to return pte flags
without having to do any translation of the page number (most notably,
Xen).

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 239d1fc0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -403,6 +403,7 @@ struct pv_mmu_ops pv_mmu_ops = {
#endif /* PAGETABLE_LEVELS >= 3 */

	.pte_val = native_pte_val,
	.pte_flags = native_pte_val,
	.pgd_val = native_pgd_val,

	.make_pte = native_make_pte,
+1 −0
Original line number Diff line number Diff line
@@ -1101,6 +1101,7 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = {
	.set_pmd = xen_set_pmd,

	.pte_val = xen_pte_val,
	.pte_flags = native_pte_val,
	.pgd_val = xen_pgd_val,

	.make_pte = xen_make_pte,
+0 −1
Original line number Diff line number Diff line
@@ -136,7 +136,6 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user);
 * first step in the migration to the kernel types.  pte_pfn is already defined
 * in the kernel. */
#define pgd_flags(x)	(pgd_val(x) & ~PAGE_MASK)
#define pte_flags(x)	(pte_val(x) & ~PAGE_MASK)
#define pgd_pfn(x)	(pgd_val(x) >> PAGE_SHIFT)

/* interrupts_and_traps.c: */
+1 −0
Original line number Diff line number Diff line
@@ -160,6 +160,7 @@ static inline pteval_t native_pte_val(pte_t pte)
#endif

#define pte_val(x)	native_pte_val(x)
#define pte_flags(x)	native_pte_val(x)
#define __pte(x)	native_make_pte(x)

#endif	/* CONFIG_PARAVIRT */
+15 −0
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ struct pv_mmu_ops {
				 unsigned long addr, pte_t *ptep);

	pteval_t (*pte_val)(pte_t);
	pteval_t (*pte_flags)(pte_t);
	pte_t (*make_pte)(pteval_t pte);

	pgdval_t (*pgd_val)(pgd_t);
@@ -996,6 +997,20 @@ static inline pteval_t pte_val(pte_t pte)
	return ret;
}

static inline pteval_t pte_flags(pte_t pte)
{
	pteval_t ret;

	if (sizeof(pteval_t) > sizeof(long))
		ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_flags,
				 pte.pte, (u64)pte.pte >> 32);
	else
		ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_flags,
				 pte.pte);

	return ret;
}

static inline pgd_t __pgd(pgdval_t val)
{
	pgdval_t ret;
Loading