aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-x86
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2008-05-20 03:26:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-05-20 10:51:20 -0400
commit2bd3a99c9d1851182f73d0a024dc5bdb0a470e8c (patch)
treeb6fae90c97de3abf7f68d47f98eee65f6b4bc174 /include/asm-x86
parent8033c6e9736c29cce5f0d0abbca9a44dffb20c39 (diff)
x86: define PTE_MASK in a universally useful way
Define PTE_MASK so that it contains a meaningful value for all x86 pagetable configurations. Previously it was defined as a "long" which means that it was too short to cover a 32-bit PAE pte entry. It is now defined as a pteval_t, which is an integer type long enough to contain a full pte (or pmd, pud, pgd). This fixes an Xorg crash on 32-bit x86 with PAE due to corruption of the NX bit in mprotect due to the incorrect type/value of PTE_MASK reported by Hugh Dickins: "Yes, thanks Jeremy: I've checked that each stage builds and runs X on my boxes here, x86_32 and x86_32+PAE and x86_64. (So even 1/8 is enough to fix the PAT pte_modify issue, though 2/8 then fixes compiler warnings.)" Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Tested-by: Hugh Dickins <hugh@veritas.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/asm-x86')
-rw-r--r--include/asm-x86/page.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h
index b381f4a5a0bd..76b35e636d7d 100644
--- a/include/asm-x86/page.h
+++ b/include/asm-x86/page.h
@@ -10,8 +10,13 @@
10 10
11#ifdef __KERNEL__ 11#ifdef __KERNEL__
12 12
13#define PHYSICAL_PAGE_MASK (PAGE_MASK & __PHYSICAL_MASK) 13/* Cast PAGE_MASK to a signed type so that it is sign-extended if
14#define PTE_MASK (_AT(long, PHYSICAL_PAGE_MASK)) 14 virtual addresses are 32-bits but physical addresses are larger
15 (ie, 32-bit PAE). */
16#define PHYSICAL_PAGE_MASK (((signed long)PAGE_MASK) & __PHYSICAL_MASK)
17
18/* PTE_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
19#define PTE_MASK ((pteval_t)PHYSICAL_PAGE_MASK)
15 20
16#define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT) 21#define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT)
17#define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1)) 22#define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1))
@@ -24,8 +29,8 @@
24/* to align the pointer to the (next) page boundary */ 29/* to align the pointer to the (next) page boundary */
25#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) 30#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
26 31
27#define __PHYSICAL_MASK _AT(phys_addr_t, (_AC(1,ULL) << __PHYSICAL_MASK_SHIFT) - 1) 32#define __PHYSICAL_MASK ((((phys_addr_t)1) << __PHYSICAL_MASK_SHIFT) - 1)
28#define __VIRTUAL_MASK ((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1) 33#define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1)
29 34
30#ifndef __ASSEMBLY__ 35#ifndef __ASSEMBLY__
31#include <linux/types.h> 36#include <linux/types.h>