diff options
Diffstat (limited to 'arch/arm/kernel/smp.c')
| -rw-r--r-- | arch/arm/kernel/smp.c | 36 | 
1 files changed, 6 insertions, 30 deletions
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index ef5640b9e21..57db122a4f6 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -31,6 +31,7 @@  #include <asm/cpu.h>  #include <asm/cputype.h>  #include <asm/exception.h> +#include <asm/idmap.h>  #include <asm/topology.h>  #include <asm/mmu_context.h>  #include <asm/pgtable.h> @@ -61,7 +62,6 @@ int __cpuinit __cpu_up(unsigned int cpu)  {  	struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu);  	struct task_struct *idle = ci->idle; -	pgd_t *pgd;  	int ret;  	/* @@ -84,29 +84,11 @@ int __cpuinit __cpu_up(unsigned int cpu)  	}  	/* -	 * Allocate initial page tables to allow the new CPU to -	 * enable the MMU safely.  This essentially means a set -	 * of our "standard" page tables, with the addition of -	 * a 1:1 mapping for the physical address of the kernel. -	 */ -	pgd = pgd_alloc(&init_mm); -	if (!pgd) -		return -ENOMEM; - -	if (PHYS_OFFSET != PAGE_OFFSET) { -#ifndef CONFIG_HOTPLUG_CPU -		identity_mapping_add(pgd, __pa(__init_begin), __pa(__init_end)); -#endif -		identity_mapping_add(pgd, __pa(_stext), __pa(_etext)); -		identity_mapping_add(pgd, __pa(_sdata), __pa(_edata)); -	} - -	/*  	 * We need to tell the secondary core where to find  	 * its stack and the page tables.  	 */  	secondary_data.stack = task_stack_page(idle) + THREAD_START_SP; -	secondary_data.pgdir = virt_to_phys(pgd); +	secondary_data.pgdir = virt_to_phys(idmap_pgd);  	secondary_data.swapper_pg_dir = virt_to_phys(swapper_pg_dir);  	__cpuc_flush_dcache_area(&secondary_data, sizeof(secondary_data));  	outer_clean_range(__pa(&secondary_data), __pa(&secondary_data + 1)); @@ -142,16 +124,6 @@ int __cpuinit __cpu_up(unsigned int cpu)  	secondary_data.stack = NULL;  	secondary_data.pgdir = 0; -	if (PHYS_OFFSET != PAGE_OFFSET) { -#ifndef CONFIG_HOTPLUG_CPU -		identity_mapping_del(pgd, __pa(__init_begin), __pa(__init_end)); -#endif -		identity_mapping_del(pgd, __pa(_stext), __pa(_etext)); -		identity_mapping_del(pgd, __pa(_sdata), __pa(_edata)); -	} - -	pgd_free(&init_mm, pgd); -  	return ret;  } @@ -550,6 +522,10 @@ static void ipi_cpu_stop(unsigned int cpu)  	local_fiq_disable();  	local_irq_disable(); +#ifdef CONFIG_HOTPLUG_CPU +	platform_cpu_kill(cpu); +#endif +  	while (1)  		cpu_relax();  }  |