diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:49:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-27 11:49:07 -0400 |
commit | b98adfccdf5f8dd34ae56a2d5adbe2c030bd4674 (patch) | |
tree | 1807a029520f550dd4f90c95ad0063bceb00d645 /arch/sh/mm/init.c | |
parent | ba21fe71725f94792330ebc3034ef2b35a36276f (diff) | |
parent | 33573c0e3243aaa38b6ad96942de85a1b713c2ff (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6: (108 commits)
sh: Fix occasional flush_cache_4096() stack corruption.
sh: Calculate shm alignment at runtime.
sh: dma-mapping compile fixes.
sh: Initial vsyscall page support.
sh: Clean up PAGE_SIZE definition for assembly use.
sh: Selective flush_cache_mm() flushing.
sh: More intelligent entry_mask/way_size calculation.
sh: Support for L2 cache on newer SH-4A CPUs.
sh: Update kexec support for API changes.
sh: Optimized readsl()/writesl() support.
sh: Report movli.l/movco.l capabilities.
sh: CPU flags in AT_HWCAP in ELF auxvt.
sh: Add support for 4K stacks.
sh: Enable /proc/kcore support.
sh: stack debugging support.
sh: select CONFIG_EMBEDDED.
sh: machvec rework.
sh: Solution Engine SH7343 board support.
sh: SH7710VoIPGW board support.
sh: Enable verbose BUG() support.
...
Diffstat (limited to 'arch/sh/mm/init.c')
-rw-r--r-- | arch/sh/mm/init.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 8ea27ca4b700..7154d1ce9785 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/highmem.h> | 24 | #include <linux/highmem.h> |
25 | #include <linux/bootmem.h> | 25 | #include <linux/bootmem.h> |
26 | #include <linux/pagemap.h> | 26 | #include <linux/pagemap.h> |
27 | 27 | #include <linux/proc_fs.h> | |
28 | #include <asm/processor.h> | 28 | #include <asm/processor.h> |
29 | #include <asm/system.h> | 29 | #include <asm/system.h> |
30 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
@@ -80,6 +80,7 @@ void show_mem(void) | |||
80 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | 80 | static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) |
81 | { | 81 | { |
82 | pgd_t *pgd; | 82 | pgd_t *pgd; |
83 | pud_t *pud; | ||
83 | pmd_t *pmd; | 84 | pmd_t *pmd; |
84 | pte_t *pte; | 85 | pte_t *pte; |
85 | 86 | ||
@@ -89,7 +90,17 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot) | |||
89 | return; | 90 | return; |
90 | } | 91 | } |
91 | 92 | ||
92 | pmd = pmd_offset(pgd, addr); | 93 | pud = pud_offset(pgd, addr); |
94 | if (pud_none(*pud)) { | ||
95 | pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC); | ||
96 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER)); | ||
97 | if (pmd != pmd_offset(pud, 0)) { | ||
98 | pud_ERROR(*pud); | ||
99 | return; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | pmd = pmd_offset(pud, addr); | ||
93 | if (pmd_none(*pmd)) { | 104 | if (pmd_none(*pmd)) { |
94 | pte = (pte_t *)get_zeroed_page(GFP_ATOMIC); | 105 | pte = (pte_t *)get_zeroed_page(GFP_ATOMIC); |
95 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER)); | 106 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER)); |
@@ -212,6 +223,8 @@ void __init paging_init(void) | |||
212 | free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); | 223 | free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0); |
213 | } | 224 | } |
214 | 225 | ||
226 | static struct kcore_list kcore_mem, kcore_vmalloc; | ||
227 | |||
215 | void __init mem_init(void) | 228 | void __init mem_init(void) |
216 | { | 229 | { |
217 | extern unsigned long empty_zero_page[1024]; | 230 | extern unsigned long empty_zero_page[1024]; |
@@ -237,8 +250,13 @@ void __init mem_init(void) | |||
237 | * Setup wrappers for copy/clear_page(), these will get overridden | 250 | * Setup wrappers for copy/clear_page(), these will get overridden |
238 | * later in the boot process if a better method is available. | 251 | * later in the boot process if a better method is available. |
239 | */ | 252 | */ |
253 | #ifdef CONFIG_MMU | ||
240 | copy_page = copy_page_slow; | 254 | copy_page = copy_page_slow; |
241 | clear_page = clear_page_slow; | 255 | clear_page = clear_page_slow; |
256 | #else | ||
257 | copy_page = copy_page_nommu; | ||
258 | clear_page = clear_page_nommu; | ||
259 | #endif | ||
242 | 260 | ||
243 | /* this will put all low memory onto the freelists */ | 261 | /* this will put all low memory onto the freelists */ |
244 | totalram_pages += free_all_bootmem_node(NODE_DATA(0)); | 262 | totalram_pages += free_all_bootmem_node(NODE_DATA(0)); |
@@ -254,7 +272,12 @@ void __init mem_init(void) | |||
254 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; | 272 | datasize = (unsigned long) &_edata - (unsigned long) &_etext; |
255 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; | 273 | initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; |
256 | 274 | ||
257 | printk("Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n", | 275 | kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); |
276 | kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, | ||
277 | VMALLOC_END - VMALLOC_START); | ||
278 | |||
279 | printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, " | ||
280 | "%dk reserved, %dk data, %dk init)\n", | ||
258 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 281 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
259 | max_mapnr << (PAGE_SHIFT-10), | 282 | max_mapnr << (PAGE_SHIFT-10), |
260 | codesize >> 10, | 283 | codesize >> 10, |
@@ -263,6 +286,9 @@ void __init mem_init(void) | |||
263 | initsize >> 10); | 286 | initsize >> 10); |
264 | 287 | ||
265 | p3_cache_init(); | 288 | p3_cache_init(); |
289 | |||
290 | /* Initialize the vDSO */ | ||
291 | vsyscall_init(); | ||
266 | } | 292 | } |
267 | 293 | ||
268 | void free_initmem(void) | 294 | void free_initmem(void) |