aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-ppc64/page.h
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2005-08-05 05:39:06 -0400
committerPaul Mackerras <paulus@samba.org>2005-08-28 20:53:31 -0400
commite28f7faf05159f1cfd564596f5e6178edba6bd49 (patch)
tree45534d2c33bff8b64e3fd155fba55146cb7518e6 /include/asm-ppc64/page.h
parentdecd300b30e499fe6be1bbfc5650fc971de8c1fa (diff)
[PATCH] Four level pagetables for ppc64
Implement 4-level pagetables for ppc64 This patch implements full four-level page tables for ppc64, thereby extending the usable user address range to 44 bits (16T). The patch uses a full page for the tables at the bottom and top level, and a quarter page for the intermediate levels. It uses full 64-bit pointers at every level, thus also increasing the addressable range of physical memory. This patch also tweaks the VSID allocation to allow matching range for user addresses (this halves the number of available contexts) and adds some #if and BUILD_BUG sanity checks. Signed-off-by: David Gibson <dwg@au1.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'include/asm-ppc64/page.h')
-rw-r--r--include/asm-ppc64/page.h26
1 files changed, 15 insertions, 11 deletions
diff --git a/include/asm-ppc64/page.h b/include/asm-ppc64/page.h
index a5893a305a09..7e7b18ea986e 100644
--- a/include/asm-ppc64/page.h
+++ b/include/asm-ppc64/page.h
@@ -46,6 +46,7 @@
46 46
47#define ARCH_HAS_HUGEPAGE_ONLY_RANGE 47#define ARCH_HAS_HUGEPAGE_ONLY_RANGE
48#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE 48#define ARCH_HAS_PREPARE_HUGEPAGE_RANGE
49#define ARCH_HAS_SETCLEAR_HUGE_PTE
49 50
50#define touches_hugepage_low_range(mm, addr, len) \ 51#define touches_hugepage_low_range(mm, addr, len) \
51 (LOW_ESID_MASK((addr), (len)) & mm->context.htlb_segs) 52 (LOW_ESID_MASK((addr), (len)) & mm->context.htlb_segs)
@@ -125,36 +126,42 @@ extern void copy_user_page(void *to, void *from, unsigned long vaddr, struct pag
125 * Entries in the pte table are 64b, while entries in the pgd & pmd are 32b. 126 * Entries in the pte table are 64b, while entries in the pgd & pmd are 32b.
126 */ 127 */
127typedef struct { unsigned long pte; } pte_t; 128typedef struct { unsigned long pte; } pte_t;
128typedef struct { unsigned int pmd; } pmd_t; 129typedef struct { unsigned long pmd; } pmd_t;
129typedef struct { unsigned int pgd; } pgd_t; 130typedef struct { unsigned long pud; } pud_t;
131typedef struct { unsigned long pgd; } pgd_t;
130typedef struct { unsigned long pgprot; } pgprot_t; 132typedef struct { unsigned long pgprot; } pgprot_t;
131 133
132#define pte_val(x) ((x).pte) 134#define pte_val(x) ((x).pte)
133#define pmd_val(x) ((x).pmd) 135#define pmd_val(x) ((x).pmd)
136#define pud_val(x) ((x).pud)
134#define pgd_val(x) ((x).pgd) 137#define pgd_val(x) ((x).pgd)
135#define pgprot_val(x) ((x).pgprot) 138#define pgprot_val(x) ((x).pgprot)
136 139
137#define __pte(x) ((pte_t) { (x) } ) 140#define __pte(x) ((pte_t) { (x) })
138#define __pmd(x) ((pmd_t) { (x) } ) 141#define __pmd(x) ((pmd_t) { (x) })
139#define __pgd(x) ((pgd_t) { (x) } ) 142#define __pud(x) ((pud_t) { (x) })
140#define __pgprot(x) ((pgprot_t) { (x) } ) 143#define __pgd(x) ((pgd_t) { (x) })
144#define __pgprot(x) ((pgprot_t) { (x) })
141 145
142#else 146#else
143/* 147/*
144 * .. while these make it easier on the compiler 148 * .. while these make it easier on the compiler
145 */ 149 */
146typedef unsigned long pte_t; 150typedef unsigned long pte_t;
147typedef unsigned int pmd_t; 151typedef unsigned long pmd_t;
148typedef unsigned int pgd_t; 152typedef unsigned long pud_t;
153typedef unsigned long pgd_t;
149typedef unsigned long pgprot_t; 154typedef unsigned long pgprot_t;
150 155
151#define pte_val(x) (x) 156#define pte_val(x) (x)
152#define pmd_val(x) (x) 157#define pmd_val(x) (x)
158#define pud_val(x) (x)
153#define pgd_val(x) (x) 159#define pgd_val(x) (x)
154#define pgprot_val(x) (x) 160#define pgprot_val(x) (x)
155 161
156#define __pte(x) (x) 162#define __pte(x) (x)
157#define __pmd(x) (x) 163#define __pmd(x) (x)
164#define __pud(x) (x)
158#define __pgd(x) (x) 165#define __pgd(x) (x)
159#define __pgprot(x) (x) 166#define __pgprot(x) (x)
160 167
@@ -208,9 +215,6 @@ extern u64 ppc64_pft_size; /* Log 2 of page table size */
208#define USER_REGION_ID (0UL) 215#define USER_REGION_ID (0UL)
209#define REGION_ID(ea) (((unsigned long)(ea)) >> REGION_SHIFT) 216#define REGION_ID(ea) (((unsigned long)(ea)) >> REGION_SHIFT)
210 217
211#define __bpn_to_ba(x) ((((unsigned long)(x)) << PAGE_SHIFT) + KERNELBASE)
212#define __ba_to_bpn(x) ((((unsigned long)(x)) & ~REGION_MASK) >> PAGE_SHIFT)
213
214#define __va(x) ((void *)((unsigned long)(x) + KERNELBASE)) 218#define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
215 219
216#ifdef CONFIG_DISCONTIGMEM 220#ifdef CONFIG_DISCONTIGMEM