[VOYAGER] Use modern techniques to setup and teardown low identiy mappings.

This is a trivial and hopefully obviously correct patch to setup
and teardown the identity mappings the way the rest of arch/i386
does.

My new page table setup code will break some assumptions below so
this is my attempt to keep voyager working.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
Eric W. Biederman 2007-04-30 09:57:40 -06:00 committed by James Bottomley
parent f3402a4e52
commit 9d0e59a341

View File

@ -536,15 +536,6 @@ do_boot_cpu(__u8 cpu)
& ~( voyager_extended_vic_processors
& voyager_allowed_boot_processors);
/* For the 486, we can't use the 4Mb page table trick, so
* must map a region of memory */
#ifdef CONFIG_M486
int i;
unsigned long *page_table_copies = (unsigned long *)
__get_free_page(GFP_KERNEL);
#endif
pgd_t orig_swapper_pg_dir0;
/* This is an area in head.S which was used to set up the
* initial kernel stack. We need to alter this to give the
* booting CPU a new stack (taken from its idle process) */
@ -595,24 +586,11 @@ do_boot_cpu(__u8 cpu)
VDEBUG(("VOYAGER SMP: Booting CPU%d at 0x%lx[%x:%x], stack %p\n", cpu,
(unsigned long)hijack_source.val, hijack_source.idt.Segment,
hijack_source.idt.Offset, stack_start.esp));
/* set the original swapper_pg_dir[0] to map 0 to 4Mb transparently
* (so that the booting CPU can find start_32 */
orig_swapper_pg_dir0 = swapper_pg_dir[0];
#ifdef CONFIG_M486
if(page_table_copies == NULL)
panic("No free memory for 486 page tables\n");
for(i = 0; i < PAGE_SIZE/sizeof(unsigned long); i++)
page_table_copies[i] = (i * PAGE_SIZE)
| _PAGE_RW | _PAGE_USER | _PAGE_PRESENT;
((unsigned long *)swapper_pg_dir)[0] =
((virt_to_phys(page_table_copies)) & PAGE_MASK)
| _PAGE_RW | _PAGE_USER | _PAGE_PRESENT;
#else
((unsigned long *)swapper_pg_dir)[0] =
(virt_to_phys(pg0) & PAGE_MASK)
| _PAGE_RW | _PAGE_USER | _PAGE_PRESENT;
#endif
/* init lowmem identity mapping */
clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
flush_tlb_all();
if(quad_boot) {
printk("CPU %d: non extended Quad boot\n", cpu);
@ -655,11 +633,7 @@ do_boot_cpu(__u8 cpu)
udelay(100);
}
/* reset the page table */
swapper_pg_dir[0] = orig_swapper_pg_dir0;
local_flush_tlb();
#ifdef CONFIG_M486
free_page((unsigned long)page_table_copies);
#endif
zap_low_mappings();
if (cpu_booted_map) {
VDEBUG(("CPU%d: Booted successfully, back in CPU %d\n",