diff options
author | Ben Dooks <ben-linux@fluff.org> | 2008-07-15 15:19:14 -0400 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2008-07-15 15:19:14 -0400 |
commit | 0c17e4ceedd35c78b1c7413dbd16279a350be6bc (patch) | |
tree | 313b3b9ca04727f3704464e01d8dd97da1dd534b /arch/x86/mm/pgtable_32.c | |
parent | 19c1d6a34abf73d0baf8e325d018c920fa78dddc (diff) | |
parent | b9d2252c1e44fa83a4e65fdc9eb93db6297c55af (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-rmk
Diffstat (limited to 'arch/x86/mm/pgtable_32.c')
-rw-r--r-- | arch/x86/mm/pgtable_32.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index 369cf065b6a4..b4becbf8c570 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
@@ -71,7 +71,7 @@ void show_mem(void) | |||
71 | * Associate a virtual page frame with a given physical page frame | 71 | * Associate a virtual page frame with a given physical page frame |
72 | * and protection flags for that frame. | 72 | * and protection flags for that frame. |
73 | */ | 73 | */ |
74 | static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) | 74 | void set_pte_vaddr(unsigned long vaddr, pte_t pteval) |
75 | { | 75 | { |
76 | pgd_t *pgd; | 76 | pgd_t *pgd; |
77 | pud_t *pud; | 77 | pud_t *pud; |
@@ -94,8 +94,8 @@ static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) | |||
94 | return; | 94 | return; |
95 | } | 95 | } |
96 | pte = pte_offset_kernel(pmd, vaddr); | 96 | pte = pte_offset_kernel(pmd, vaddr); |
97 | if (pgprot_val(flags)) | 97 | if (pte_val(pteval)) |
98 | set_pte_present(&init_mm, vaddr, pte, pfn_pte(pfn, flags)); | 98 | set_pte_present(&init_mm, vaddr, pte, pteval); |
99 | else | 99 | else |
100 | pte_clear(&init_mm, vaddr, pte); | 100 | pte_clear(&init_mm, vaddr, pte); |
101 | 101 | ||
@@ -141,22 +141,9 @@ void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags) | |||
141 | __flush_tlb_one(vaddr); | 141 | __flush_tlb_one(vaddr); |
142 | } | 142 | } |
143 | 143 | ||
144 | static int fixmaps; | ||
145 | unsigned long __FIXADDR_TOP = 0xfffff000; | 144 | unsigned long __FIXADDR_TOP = 0xfffff000; |
146 | EXPORT_SYMBOL(__FIXADDR_TOP); | 145 | EXPORT_SYMBOL(__FIXADDR_TOP); |
147 | 146 | ||
148 | void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) | ||
149 | { | ||
150 | unsigned long address = __fix_to_virt(idx); | ||
151 | |||
152 | if (idx >= __end_of_fixed_addresses) { | ||
153 | BUG(); | ||
154 | return; | ||
155 | } | ||
156 | set_pte_pfn(address, phys >> PAGE_SHIFT, flags); | ||
157 | fixmaps++; | ||
158 | } | ||
159 | |||
160 | /** | 147 | /** |
161 | * reserve_top_address - reserves a hole in the top of kernel address space | 148 | * reserve_top_address - reserves a hole in the top of kernel address space |
162 | * @reserve - size of hole to reserve | 149 | * @reserve - size of hole to reserve |
@@ -164,11 +151,44 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) | |||
164 | * Can be used to relocate the fixmap area and poke a hole in the top | 151 | * Can be used to relocate the fixmap area and poke a hole in the top |
165 | * of kernel address space to make room for a hypervisor. | 152 | * of kernel address space to make room for a hypervisor. |
166 | */ | 153 | */ |
167 | void reserve_top_address(unsigned long reserve) | 154 | void __init reserve_top_address(unsigned long reserve) |
168 | { | 155 | { |
169 | BUG_ON(fixmaps > 0); | 156 | BUG_ON(fixmaps_set > 0); |
170 | printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", | 157 | printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", |
171 | (int)-reserve); | 158 | (int)-reserve); |
172 | __FIXADDR_TOP = -reserve - PAGE_SIZE; | 159 | __FIXADDR_TOP = -reserve - PAGE_SIZE; |
173 | __VMALLOC_RESERVE += reserve; | 160 | __VMALLOC_RESERVE += reserve; |
174 | } | 161 | } |
162 | |||
163 | /* | ||
164 | * vmalloc=size forces the vmalloc area to be exactly 'size' | ||
165 | * bytes. This can be used to increase (or decrease) the | ||
166 | * vmalloc area - the default is 128m. | ||
167 | */ | ||
168 | static int __init parse_vmalloc(char *arg) | ||
169 | { | ||
170 | if (!arg) | ||
171 | return -EINVAL; | ||
172 | |||
173 | __VMALLOC_RESERVE = memparse(arg, &arg); | ||
174 | return 0; | ||
175 | } | ||
176 | early_param("vmalloc", parse_vmalloc); | ||
177 | |||
178 | /* | ||
179 | * reservetop=size reserves a hole at the top of the kernel address space which | ||
180 | * a hypervisor can load into later. Needed for dynamically loaded hypervisors, | ||
181 | * so relocating the fixmap can be done before paging initialization. | ||
182 | */ | ||
183 | static int __init parse_reservetop(char *arg) | ||
184 | { | ||
185 | unsigned long address; | ||
186 | |||
187 | if (!arg) | ||
188 | return -EINVAL; | ||
189 | |||
190 | address = memparse(arg, &arg); | ||
191 | reserve_top_address(address); | ||
192 | return 0; | ||
193 | } | ||
194 | early_param("reservetop", parse_reservetop); | ||