forked from luck/tmp_suning_uos_patched
[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:
parent
f3402a4e52
commit
9d0e59a341
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user