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

x86: add PTE_FLAGS_MASK



PTE_PFN_MASK was getting lonely, so I made it a friend.

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@goop.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 59438c9f
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -221,7 +221,7 @@ static void walk_pmd_level(struct seq_file *m, struct pg_state *st, pud_t addr,
	for (i = 0; i < PTRS_PER_PMD; i++) {
	for (i = 0; i < PTRS_PER_PMD; i++) {
		st->current_address = normalize_addr(P + i * PMD_LEVEL_MULT);
		st->current_address = normalize_addr(P + i * PMD_LEVEL_MULT);
		if (!pmd_none(*start)) {
		if (!pmd_none(*start)) {
			pgprotval_t prot = pmd_val(*start) & ~PTE_PFN_MASK;
			pgprotval_t prot = pmd_val(*start) & PTE_FLAGS_MASK;


			if (pmd_large(*start) || !pmd_present(*start))
			if (pmd_large(*start) || !pmd_present(*start))
				note_page(m, st, __pgprot(prot), 3);
				note_page(m, st, __pgprot(prot), 3);
@@ -253,7 +253,7 @@ static void walk_pud_level(struct seq_file *m, struct pg_state *st, pgd_t addr,
	for (i = 0; i < PTRS_PER_PUD; i++) {
	for (i = 0; i < PTRS_PER_PUD; i++) {
		st->current_address = normalize_addr(P + i * PUD_LEVEL_MULT);
		st->current_address = normalize_addr(P + i * PUD_LEVEL_MULT);
		if (!pud_none(*start)) {
		if (!pud_none(*start)) {
			pgprotval_t prot = pud_val(*start) & ~PTE_PFN_MASK;
			pgprotval_t prot = pud_val(*start) & PTE_FLAGS_MASK;


			if (pud_large(*start) || !pud_present(*start))
			if (pud_large(*start) || !pud_present(*start))
				note_page(m, st, __pgprot(prot), 2);
				note_page(m, st, __pgprot(prot), 2);
@@ -288,7 +288,7 @@ static void walk_pgd_level(struct seq_file *m)
	for (i = 0; i < PTRS_PER_PGD; i++) {
	for (i = 0; i < PTRS_PER_PGD; i++) {
		st.current_address = normalize_addr(i * PGD_LEVEL_MULT);
		st.current_address = normalize_addr(i * PGD_LEVEL_MULT);
		if (!pgd_none(*start)) {
		if (!pgd_none(*start)) {
			pgprotval_t prot = pgd_val(*start) & ~PTE_PFN_MASK;
			pgprotval_t prot = pgd_val(*start) & PTE_FLAGS_MASK;


			if (pgd_large(*start) || !pgd_present(*start))
			if (pgd_large(*start) || !pgd_present(*start))
				note_page(m, &st, __pgprot(prot), 1);
				note_page(m, &st, __pgprot(prot), 1);
+2 −2
Original line number Original line Diff line number Diff line
@@ -344,7 +344,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
{
{
	if (val & _PAGE_PRESENT) {
	if (val & _PAGE_PRESENT) {
		unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
		unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
		pteval_t flags = val & ~PTE_PFN_MASK;
		pteval_t flags = val & PTE_FLAGS_MASK;
		val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
		val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
	}
	}


@@ -355,7 +355,7 @@ static pteval_t pte_pfn_to_mfn(pteval_t val)
{
{
	if (val & _PAGE_PRESENT) {
	if (val & _PAGE_PRESENT) {
		unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
		unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
		pteval_t flags = val & ~PTE_PFN_MASK;
		pteval_t flags = val & PTE_FLAGS_MASK;
		val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
		val = ((pteval_t)pfn_to_mfn(pfn) << PAGE_SHIFT) | flags;
	}
	}


+4 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,9 @@
/* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
/* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
#define PTE_PFN_MASK		((pteval_t)PHYSICAL_PAGE_MASK)
#define PTE_PFN_MASK		((pteval_t)PHYSICAL_PAGE_MASK)


/* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */
#define PTE_FLAGS_MASK		(~PTE_PFN_MASK)

#define PMD_PAGE_SIZE		(_AC(1, UL) << PMD_SHIFT)
#define PMD_PAGE_SIZE		(_AC(1, UL) << PMD_SHIFT)
#define PMD_PAGE_MASK		(~(PMD_PAGE_SIZE-1))
#define PMD_PAGE_MASK		(~(PMD_PAGE_SIZE-1))


@@ -146,7 +149,7 @@ static inline pteval_t native_pte_val(pte_t pte)


static inline pteval_t native_pte_flags(pte_t pte)
static inline pteval_t native_pte_flags(pte_t pte)
{
{
	return native_pte_val(pte) & ~PTE_PFN_MASK;
	return native_pte_val(pte) & PTE_FLAGS_MASK;
}
}


#define pgprot_val(x)	((x).pgprot)
#define pgprot_val(x)	((x).pgprot)
+1 −1
Original line number Original line Diff line number Diff line
@@ -286,7 +286,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
	return __pgprot(preservebits | addbits);
	return __pgprot(preservebits | addbits);
}
}


#define pte_pgprot(x) __pgprot(pte_flags(x) & ~PTE_PFN_MASK)
#define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK)


#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)
#define canon_pgprot(p) __pgprot(pgprot_val(p) & __supported_pte_mask)


+1 −1
Original line number Original line Diff line number Diff line
@@ -88,7 +88,7 @@ extern unsigned long pg0[];
/* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
/* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
#define pmd_none(x)	(!(unsigned long)pmd_val((x)))
#define pmd_none(x)	(!(unsigned long)pmd_val((x)))
#define pmd_present(x)	(pmd_val((x)) & _PAGE_PRESENT)
#define pmd_present(x)	(pmd_val((x)) & _PAGE_PRESENT)
#define pmd_bad(x) ((pmd_val(x) & (~PTE_PFN_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
#define pmd_bad(x) ((pmd_val(x) & (PTE_FLAGS_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)


#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))