summaryrefslogtreecommitdiffstats
path: root/arch/m68k/mm/sun3mmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/m68k/mm/sun3mmu.c')
-rw-r--r--arch/m68k/mm/sun3mmu.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/arch/m68k/mm/sun3mmu.c b/arch/m68k/mm/sun3mmu.c
index 8d6632d2f..0d2637685 100644
--- a/arch/m68k/mm/sun3mmu.c
+++ b/arch/m68k/mm/sun3mmu.c
@@ -19,6 +19,7 @@
#ifdef CONFIG_BLK_DEV_RAM
#include <linux/blk.h>
#endif
+#include <linux/bootmem.h>
#include <asm/setup.h>
#include <asm/uaccess.h>
@@ -28,39 +29,39 @@
#include <asm/machdep.h>
#include <asm/io.h>
-extern void mmu_emu_init (void);
-
-extern unsigned long free_area_init(unsigned long *zones_size);
+extern void mmu_emu_init (unsigned long bootmem_end);
const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";
extern unsigned long empty_bad_page_table;
extern unsigned long empty_bad_page;
+extern unsigned long num_pages;
void free_initmem(void)
{
}
+
/* For the sun3 we try to follow the i386 paging_init() more closely */
/* start_mem and end_mem have PAGE_OFFSET added already */
/* now sets up tables using sun3 PTEs rather than i386 as before. --m */
-unsigned long __init paging_init(unsigned long start_mem,
- unsigned long end_mem)
+void __init paging_init(void)
{
pgd_t * pg_dir;
pte_t * pg_table;
int i;
unsigned long address;
+ unsigned long next_pgtable;
+ unsigned long bootmem_end;
+ unsigned long zones_size[3] = {0, 0, 0};
+ unsigned long size;
+
#ifdef TEST_VERIFY_AREA
wp_works_ok = 0;
#endif
- start_mem = PAGE_ALIGN(start_mem);
- empty_bad_page_table = start_mem;
- start_mem += PAGE_SIZE;
- empty_bad_page = start_mem;
- start_mem += PAGE_SIZE;
- empty_zero_page = start_mem;
- start_mem += PAGE_SIZE;
+ empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
+ empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
+ empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
memset((void *)empty_zero_page, 0, PAGE_SIZE);
address = PAGE_OFFSET;
@@ -68,12 +69,18 @@ unsigned long __init paging_init(unsigned long start_mem,
memset (swapper_pg_dir, 0, sizeof (swapper_pg_dir));
memset (kernel_pg_dir, 0, sizeof (kernel_pg_dir));
+ size = num_pages * sizeof(pte_t);
+ size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1);
+
+ next_pgtable = (unsigned long)alloc_bootmem_pages(size);
+ bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK;
+
/* Map whole memory from PAGE_OFFSET (0x0E000000) */
pg_dir += PAGE_OFFSET >> PGDIR_SHIFT;
- while (address < end_mem) {
- pg_table = (pte_t *) __pa (start_mem);
- start_mem += PTRS_PER_PTE * sizeof (pte_t);
+ while (address < (unsigned long)high_memory) {
+ pg_table = (pte_t *) __pa (next_pgtable);
+ next_pgtable += PTRS_PER_PTE * sizeof (pte_t);
pgd_val(*pg_dir) = (unsigned long) pg_table;
pg_dir++;
@@ -81,18 +88,24 @@ unsigned long __init paging_init(unsigned long start_mem,
pg_table = (pte_t *) __va ((unsigned long) pg_table);
for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table) {
pte_t pte = __mk_pte(address, PAGE_INIT);
- if (address >= end_mem)
+ if (address >= (unsigned long)high_memory)
pte_val (pte) = 0;
set_pte (pg_table, pte);
address += PAGE_SIZE;
}
}
- mmu_emu_init();
+ mmu_emu_init(bootmem_end);
current->mm = NULL;
- return PAGE_ALIGN(free_area_init(start_mem, end_mem));
+ /* memory sizing is a hack stolen from motorola.c.. hope it works for us */
+ zones_size[1] = ((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT;
+ zones_size[0] = zones_size[1]/2;
+ zones_size[1] -= zones_size[0];
+
+ free_area_init(zones_size);
+
}