diff options
author | Peter Chubb <peterc@gelato.unsw.edu.au> | 2005-08-16 22:54:00 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-08-24 18:35:41 -0400 |
commit | 0a41e2501160587eb8f66cef3bdf1c6f2cb86997 (patch) | |
tree | 9f5b0288c3101344acd22f7e901fe909a8f98df6 | |
parent | 0572e3da3ff5c3744b2f606ecf296d5f89a4bbdf (diff) |
[IA64] Rationalise Region Definitions
Currently, region numbers are defined in several files, with several
names. For example, we have REGION_KERNEL in asm/page.h and
RGN_KERNEL in pgtable.h
We also have address definitions that should depend on the
RGN_XXX macros, but are currently just long constants.
The following patch reorganises all the definitions so that they have
the same form (RGN_XXX), are in one place, and that addresses that
depend on RGN_XXX are derived from them.
(This is a necessary but not sufficient patch to allow UML-like
operation on IA64).
Thanks to David Mosberger for catching the change I missed in mmu_context.h.
Signed-off-by: Peter Chubb <peterc@gelato.unsw.edu.au>
Signed-off-by: Tony Luck <tony.luck@intel.com>
-rw-r--r-- | arch/ia64/kernel/sys_ia64.c | 2 | ||||
-rw-r--r-- | arch/ia64/mm/hugetlbpage.c | 8 | ||||
-rw-r--r-- | include/asm-ia64/io.h | 2 | ||||
-rw-r--r-- | include/asm-ia64/mmu_context.h | 7 | ||||
-rw-r--r-- | include/asm-ia64/page.h | 27 | ||||
-rw-r--r-- | include/asm-ia64/pgtable.h | 13 | ||||
-rw-r--r-- | include/asm-ia64/system.h | 5 |
7 files changed, 38 insertions, 26 deletions
diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c index 770fab37928e..f2dbcd1db0d4 100644 --- a/arch/ia64/kernel/sys_ia64.c +++ b/arch/ia64/kernel/sys_ia64.c | |||
@@ -35,7 +35,7 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len | |||
35 | return -ENOMEM; | 35 | return -ENOMEM; |
36 | 36 | ||
37 | #ifdef CONFIG_HUGETLB_PAGE | 37 | #ifdef CONFIG_HUGETLB_PAGE |
38 | if (REGION_NUMBER(addr) == REGION_HPAGE) | 38 | if (REGION_NUMBER(addr) == RGN_HPAGE) |
39 | addr = 0; | 39 | addr = 0; |
40 | #endif | 40 | #endif |
41 | if (!addr) | 41 | if (!addr) |
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index e0a776a3044c..2d13889d0a99 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c | |||
@@ -76,7 +76,7 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len) | |||
76 | return -EINVAL; | 76 | return -EINVAL; |
77 | if (addr & ~HPAGE_MASK) | 77 | if (addr & ~HPAGE_MASK) |
78 | return -EINVAL; | 78 | return -EINVAL; |
79 | if (REGION_NUMBER(addr) != REGION_HPAGE) | 79 | if (REGION_NUMBER(addr) != RGN_HPAGE) |
80 | return -EINVAL; | 80 | return -EINVAL; |
81 | 81 | ||
82 | return 0; | 82 | return 0; |
@@ -87,7 +87,7 @@ struct page *follow_huge_addr(struct mm_struct *mm, unsigned long addr, int writ | |||
87 | struct page *page; | 87 | struct page *page; |
88 | pte_t *ptep; | 88 | pte_t *ptep; |
89 | 89 | ||
90 | if (REGION_NUMBER(addr) != REGION_HPAGE) | 90 | if (REGION_NUMBER(addr) != RGN_HPAGE) |
91 | return ERR_PTR(-EINVAL); | 91 | return ERR_PTR(-EINVAL); |
92 | 92 | ||
93 | ptep = huge_pte_offset(mm, addr); | 93 | ptep = huge_pte_offset(mm, addr); |
@@ -142,8 +142,8 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u | |||
142 | return -ENOMEM; | 142 | return -ENOMEM; |
143 | if (len & ~HPAGE_MASK) | 143 | if (len & ~HPAGE_MASK) |
144 | return -EINVAL; | 144 | return -EINVAL; |
145 | /* This code assumes that REGION_HPAGE != 0. */ | 145 | /* This code assumes that RGN_HPAGE != 0. */ |
146 | if ((REGION_NUMBER(addr) != REGION_HPAGE) || (addr & (HPAGE_SIZE - 1))) | 146 | if ((REGION_NUMBER(addr) != RGN_HPAGE) || (addr & (HPAGE_SIZE - 1))) |
147 | addr = HPAGE_REGION_BASE; | 147 | addr = HPAGE_REGION_BASE; |
148 | else | 148 | else |
149 | addr = ALIGN(addr, HPAGE_SIZE); | 149 | addr = ALIGN(addr, HPAGE_SIZE); |
diff --git a/include/asm-ia64/io.h b/include/asm-ia64/io.h index 54e7637a326c..3c28eeb0b009 100644 --- a/include/asm-ia64/io.h +++ b/include/asm-ia64/io.h | |||
@@ -23,7 +23,7 @@ | |||
23 | #define __SLOW_DOWN_IO do { } while (0) | 23 | #define __SLOW_DOWN_IO do { } while (0) |
24 | #define SLOW_DOWN_IO do { } while (0) | 24 | #define SLOW_DOWN_IO do { } while (0) |
25 | 25 | ||
26 | #define __IA64_UNCACHED_OFFSET 0xc000000000000000UL /* region 6 */ | 26 | #define __IA64_UNCACHED_OFFSET RGN_BASE(RGN_UNCACHED) |
27 | 27 | ||
28 | /* | 28 | /* |
29 | * The legacy I/O space defined by the ia64 architecture supports only 65536 ports, but | 29 | * The legacy I/O space defined by the ia64 architecture supports only 65536 ports, but |
diff --git a/include/asm-ia64/mmu_context.h b/include/asm-ia64/mmu_context.h index e3e5fededb04..ab60a6a26911 100644 --- a/include/asm-ia64/mmu_context.h +++ b/include/asm-ia64/mmu_context.h | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #define ia64_rid(ctx,addr) (((ctx) << 3) | (addr >> 61)) | 20 | #define ia64_rid(ctx,addr) (((ctx) << 3) | (addr >> 61)) |
21 | 21 | ||
22 | # include <asm/page.h> | ||
22 | # ifndef __ASSEMBLY__ | 23 | # ifndef __ASSEMBLY__ |
23 | 24 | ||
24 | #include <linux/compiler.h> | 25 | #include <linux/compiler.h> |
@@ -110,7 +111,7 @@ reload_context (mm_context_t context) | |||
110 | unsigned long rid_incr = 0; | 111 | unsigned long rid_incr = 0; |
111 | unsigned long rr0, rr1, rr2, rr3, rr4, old_rr4; | 112 | unsigned long rr0, rr1, rr2, rr3, rr4, old_rr4; |
112 | 113 | ||
113 | old_rr4 = ia64_get_rr(0x8000000000000000UL); | 114 | old_rr4 = ia64_get_rr(RGN_BASE(RGN_HPAGE)); |
114 | rid = context << 3; /* make space for encoding the region number */ | 115 | rid = context << 3; /* make space for encoding the region number */ |
115 | rid_incr = 1 << 8; | 116 | rid_incr = 1 << 8; |
116 | 117 | ||
@@ -122,6 +123,10 @@ reload_context (mm_context_t context) | |||
122 | rr4 = rr0 + 4*rid_incr; | 123 | rr4 = rr0 + 4*rid_incr; |
123 | #ifdef CONFIG_HUGETLB_PAGE | 124 | #ifdef CONFIG_HUGETLB_PAGE |
124 | rr4 = (rr4 & (~(0xfcUL))) | (old_rr4 & 0xfc); | 125 | rr4 = (rr4 & (~(0xfcUL))) | (old_rr4 & 0xfc); |
126 | |||
127 | # if RGN_HPAGE != 4 | ||
128 | # error "reload_context assumes RGN_HPAGE is 4" | ||
129 | # endif | ||
125 | #endif | 130 | #endif |
126 | 131 | ||
127 | ia64_set_rr(0x0000000000000000UL, rr0); | 132 | ia64_set_rr(0x0000000000000000UL, rr0); |
diff --git a/include/asm-ia64/page.h b/include/asm-ia64/page.h index 08894f73abf0..ec17f9e9da75 100644 --- a/include/asm-ia64/page.h +++ b/include/asm-ia64/page.h | |||
@@ -13,6 +13,19 @@ | |||
13 | #include <asm/types.h> | 13 | #include <asm/types.h> |
14 | 14 | ||
15 | /* | 15 | /* |
16 | * The top three bits of an IA64 address are its Region Number. | ||
17 | * Different regions are assigned to different purposes. | ||
18 | */ | ||
19 | #define RGN_SHIFT (61) | ||
20 | #define RGN_BASE(r) (__IA64_UL_CONST(r)<<RGN_SHIFT) | ||
21 | |||
22 | #define KHIGH -1 /* high three bits of Kernel virtual address */ | ||
23 | #define RGN_KERNEL 7 /* Identity mapped region */ | ||
24 | #define RGN_UNCACHED 6 /* Identity mapped I/O region */ | ||
25 | #define RGN_GATE 5 /* Gate page, Kernel text, etc */ | ||
26 | #define RGN_HPAGE 4 /* For Huge TLB pages */ | ||
27 | |||
28 | /* | ||
16 | * PAGE_SHIFT determines the actual kernel page size. | 29 | * PAGE_SHIFT determines the actual kernel page size. |
17 | */ | 30 | */ |
18 | #if defined(CONFIG_IA64_PAGE_SIZE_4KB) | 31 | #if defined(CONFIG_IA64_PAGE_SIZE_4KB) |
@@ -36,10 +49,9 @@ | |||
36 | 49 | ||
37 | #define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */ | 50 | #define RGN_MAP_LIMIT ((1UL << (4*PAGE_SHIFT - 12)) - PAGE_SIZE) /* per region addr limit */ |
38 | 51 | ||
52 | |||
39 | #ifdef CONFIG_HUGETLB_PAGE | 53 | #ifdef CONFIG_HUGETLB_PAGE |
40 | # define REGION_HPAGE (4UL) /* note: this is hardcoded in reload_context()!*/ | 54 | # define HPAGE_REGION_BASE RGN_BASE(RGN_HPAGE) |
41 | # define REGION_SHIFT 61 | ||
42 | # define HPAGE_REGION_BASE (REGION_HPAGE << REGION_SHIFT) | ||
43 | # define HPAGE_SHIFT hpage_shift | 55 | # define HPAGE_SHIFT hpage_shift |
44 | # define HPAGE_SHIFT_DEFAULT 28 /* check ia64 SDM for architecture supported size */ | 56 | # define HPAGE_SHIFT_DEFAULT 28 /* check ia64 SDM for architecture supported size */ |
45 | # define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT) | 57 | # define HPAGE_SIZE (__IA64_UL_CONST(1) << HPAGE_SHIFT) |
@@ -130,16 +142,13 @@ typedef union ia64_va { | |||
130 | #define REGION_NUMBER(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg;}) | 142 | #define REGION_NUMBER(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg;}) |
131 | #define REGION_OFFSET(x) ({ia64_va _v; _v.l = (long) (x); _v.f.off;}) | 143 | #define REGION_OFFSET(x) ({ia64_va _v; _v.l = (long) (x); _v.f.off;}) |
132 | 144 | ||
133 | #define REGION_SIZE REGION_NUMBER(1) | ||
134 | #define REGION_KERNEL 7 | ||
135 | |||
136 | #ifdef CONFIG_HUGETLB_PAGE | 145 | #ifdef CONFIG_HUGETLB_PAGE |
137 | # define htlbpage_to_page(x) (((unsigned long) REGION_NUMBER(x) << 61) \ | 146 | # define htlbpage_to_page(x) (((unsigned long) REGION_NUMBER(x) << 61) \ |
138 | | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) | 147 | | (REGION_OFFSET(x) >> (HPAGE_SHIFT-PAGE_SHIFT))) |
139 | # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 148 | # define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
140 | # define is_hugepage_only_range(mm, addr, len) \ | 149 | # define is_hugepage_only_range(mm, addr, len) \ |
141 | (REGION_NUMBER(addr) == REGION_HPAGE && \ | 150 | (REGION_NUMBER(addr) == RGN_HPAGE && \ |
142 | REGION_NUMBER((addr)+(len)-1) == REGION_HPAGE) | 151 | REGION_NUMBER((addr)+(len)-1) == RGN_HPAGE) |
143 | extern unsigned int hpage_shift; | 152 | extern unsigned int hpage_shift; |
144 | #endif | 153 | #endif |
145 | 154 | ||
@@ -197,7 +206,7 @@ get_order (unsigned long size) | |||
197 | # define __pgprot(x) (x) | 206 | # define __pgprot(x) (x) |
198 | #endif /* !STRICT_MM_TYPECHECKS */ | 207 | #endif /* !STRICT_MM_TYPECHECKS */ |
199 | 208 | ||
200 | #define PAGE_OFFSET __IA64_UL_CONST(0xe000000000000000) | 209 | #define PAGE_OFFSET RGN_BASE(RGN_KERNEL) |
201 | 210 | ||
202 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \ | 211 | #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \ |
203 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | \ | 212 | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC | \ |
diff --git a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h index 48586e08f432..2e34c06e6777 100644 --- a/include/asm-ia64/pgtable.h +++ b/include/asm-ia64/pgtable.h | |||
@@ -204,21 +204,18 @@ ia64_phys_addr_valid (unsigned long addr) | |||
204 | #define set_pte(ptep, pteval) (*(ptep) = (pteval)) | 204 | #define set_pte(ptep, pteval) (*(ptep) = (pteval)) |
205 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | 205 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) |
206 | 206 | ||
207 | #define RGN_SIZE (1UL << 61) | 207 | #define VMALLOC_START (RGN_BASE(RGN_GATE) + 0x200000000UL) |
208 | #define RGN_KERNEL 7 | ||
209 | |||
210 | #define VMALLOC_START 0xa000000200000000UL | ||
211 | #ifdef CONFIG_VIRTUAL_MEM_MAP | 208 | #ifdef CONFIG_VIRTUAL_MEM_MAP |
212 | # define VMALLOC_END_INIT (0xa000000000000000UL + (1UL << (4*PAGE_SHIFT - 9))) | 209 | # define VMALLOC_END_INIT (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9))) |
213 | # define VMALLOC_END vmalloc_end | 210 | # define VMALLOC_END vmalloc_end |
214 | extern unsigned long vmalloc_end; | 211 | extern unsigned long vmalloc_end; |
215 | #else | 212 | #else |
216 | # define VMALLOC_END (0xa000000000000000UL + (1UL << (4*PAGE_SHIFT - 9))) | 213 | # define VMALLOC_END (RGN_BASE(RGN_GATE) + (1UL << (4*PAGE_SHIFT - 9))) |
217 | #endif | 214 | #endif |
218 | 215 | ||
219 | /* fs/proc/kcore.c */ | 216 | /* fs/proc/kcore.c */ |
220 | #define kc_vaddr_to_offset(v) ((v) - 0xa000000000000000UL) | 217 | #define kc_vaddr_to_offset(v) ((v) - RGN_BASE(RGN_GATE)) |
221 | #define kc_offset_to_vaddr(o) ((o) + 0xa000000000000000UL) | 218 | #define kc_offset_to_vaddr(o) ((o) + RGN_BASE(RGN_GATE)) |
222 | 219 | ||
223 | /* | 220 | /* |
224 | * Conversion functions: convert page frame number (pfn) and a protection value to a page | 221 | * Conversion functions: convert page frame number (pfn) and a protection value to a page |
diff --git a/include/asm-ia64/system.h b/include/asm-ia64/system.h index cd2cf76b2db1..33256db4a7cf 100644 --- a/include/asm-ia64/system.h +++ b/include/asm-ia64/system.h | |||
@@ -19,12 +19,13 @@ | |||
19 | #include <asm/pal.h> | 19 | #include <asm/pal.h> |
20 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
21 | 21 | ||
22 | #define GATE_ADDR __IA64_UL_CONST(0xa000000000000000) | 22 | #define GATE_ADDR RGN_BASE(RGN_GATE) |
23 | |||
23 | /* | 24 | /* |
24 | * 0xa000000000000000+2*PERCPU_PAGE_SIZE | 25 | * 0xa000000000000000+2*PERCPU_PAGE_SIZE |
25 | * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) | 26 | * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) |
26 | */ | 27 | */ |
27 | #define KERNEL_START __IA64_UL_CONST(0xa000000100000000) | 28 | #define KERNEL_START (GATE_ADDR+0x100000000) |
28 | #define PERCPU_ADDR (-PERCPU_PAGE_SIZE) | 29 | #define PERCPU_ADDR (-PERCPU_PAGE_SIZE) |
29 | 30 | ||
30 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |