aboutsummaryrefslogtreecommitdiffstats
path: root/xen
diff options
context:
space:
mode:
authorTim Deegan <tim@xen.org>2012-03-13 15:10:55 +0000
committerTim Deegan <tim@xen.org>2012-03-13 15:10:55 +0000
commit9e5e386e7c90669709dbc4c2f6cb5ab9e483c6d7 (patch)
tree892c147b2d80cb9aa2d291ea2be42c0b2073d7ad /xen
parent2ba79489668e8486341b24fd6efcfe5e7674a44c (diff)
downloadxen-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.S3
-rw-r--r--xen/arch/arm/setup.c7
-rw-r--r--xen/arch/arm/smpboot.c43
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