diff options
author | Tim Deegan <tim@xen.org> | 2012-03-13 15:10:55 +0000 |
---|---|---|
committer | Tim Deegan <tim@xen.org> | 2012-03-13 15:10:55 +0000 |
commit | 9e5e386e7c90669709dbc4c2f6cb5ab9e483c6d7 (patch) | |
tree | 892c147b2d80cb9aa2d291ea2be42c0b2073d7ad /xen | |
parent | 2ba79489668e8486341b24fd6efcfe5e7674a44c (diff) | |
download | xen-9e5e386e7c90669709dbc4c2f6cb5ab9e483c6d7.tar.gz xen-9e5e386e7c90669709dbc4c2f6cb5ab9e483c6d7.tar.bz2 xen-9e5e386e7c90669709dbc4c2f6cb5ab9e483c6d7.zip |
arm: start plumbing in SMP bringup in C
Still a noop, but no longer just a dummy symbol.
Signed-off-by: Tim Deegan <tim@xen.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'xen')
-rw-r--r-- | xen/arch/arm/dummy.S | 3 | ||||
-rw-r--r-- | xen/arch/arm/setup.c | 7 | ||||
-rw-r--r-- | xen/arch/arm/smpboot.c | 43 |
3 files changed, 36 insertions, 17 deletions
diff --git a/xen/arch/arm/dummy.S b/xen/arch/arm/dummy.S index 5f1fe2c462..8c6151cfc4 100644 --- a/xen/arch/arm/dummy.S +++ b/xen/arch/arm/dummy.S @@ -7,9 +7,6 @@ x: .word 0xe7f000f0 /* Undefined instruction */ x: mov pc, lr /* SMP support */ -DUMMY(__cpu_die); -DUMMY(__cpu_disable); -DUMMY(__cpu_up); DUMMY(per_cpu__cpu_core_mask); DUMMY(per_cpu__cpu_sibling_mask); DUMMY(node_online_map); diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 865f6fabae..8d919d182b 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -38,9 +38,6 @@ #include <asm/setup.h> #include "gic.h" -/* maxcpus: maximum number of CPUs to activate. */ -static unsigned int __initdata max_cpus = NR_CPUS; - /* Xen stack for bringing up the first CPU. */ unsigned char __initdata init_stack[STACK_SIZE] __attribute__((__aligned__(STACK_SIZE))); @@ -204,7 +201,7 @@ void __init start_xen(unsigned long boot_phys_offset, __set_current((struct vcpu *)0xfffff000); /* debug sanity */ idle_vcpu[0] = current; - smp_prepare_cpus(max_cpus); + smp_prepare_cpus(cpus); init_xen_time(); @@ -251,7 +248,7 @@ void __init start_xen(unsigned long boot_phys_offset, for_each_present_cpu ( i ) { - if ( (num_online_cpus() < max_cpus) && !cpu_online(i) ) + if ( (num_online_cpus() < cpus) && !cpu_online(i) ) { int ret = cpu_up(i); if ( ret != 0 ) diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c index 82874733e1..b4f25eeb71 100644 --- a/xen/arch/arm/smpboot.c +++ b/xen/arch/arm/smpboot.c @@ -19,6 +19,7 @@ #include <xen/cpumask.h> #include <xen/smp.h> #include <xen/init.h> +#include <xen/errno.h> cpumask_t cpu_online_map; EXPORT_SYMBOL(cpu_online_map); @@ -30,16 +31,40 @@ EXPORT_SYMBOL(cpu_possible_map); void __init smp_prepare_cpus (unsigned int max_cpus) { - set_processor_id(0); /* needed early, for smp_processor_id() */ - - cpumask_clear(&cpu_online_map); - cpumask_clear(&cpu_present_map); - cpumask_clear(&cpu_possible_map); - cpumask_set_cpu(0, &cpu_online_map); - cpumask_set_cpu(0, &cpu_present_map); - cpumask_set_cpu(0, &cpu_possible_map); - return; + int i; + set_processor_id(0); /* needed early, for smp_processor_id() */ + + cpumask_clear(&cpu_online_map); + cpumask_set_cpu(0, &cpu_online_map); + + cpumask_clear(&cpu_possible_map); + for ( i = 0; i < max_cpus; i++ ) + cpumask_set_cpu(i, &cpu_possible_map); + cpumask_copy(&cpu_present_map, &cpu_possible_map); } + +/* Bring up a non-boot CPU */ +int __cpu_up(unsigned int cpu) +{ + /* Not yet... */ + return -ENODEV; +} + +/* Shut down the current CPU */ +void __cpu_disable(void) +{ + /* TODO: take down timers, GIC, &c. */ + BUG(); +} + +/* Wait for a remote CPU to die */ +void __cpu_die(unsigned int cpu) +{ + /* TODO: interlock with __cpu_disable */ + BUG(); +} + + /* * Local variables: * mode: C |