Commit c052de26 authored by Nicolas Pitre's avatar Nicolas Pitre

ARM: bL_switcher: simplify stack isolation

We now have a dedicated thread for each logical CPU.  That's plenty
of stack space for our needs.
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
parent 71ce1dee
...@@ -53,12 +53,6 @@ static void bL_do_switch(void *_unused) ...@@ -53,12 +53,6 @@ static void bL_do_switch(void *_unused)
{ {
unsigned mpidr, cpuid, clusterid, ob_cluster, ib_cluster; unsigned mpidr, cpuid, clusterid, ob_cluster, ib_cluster;
/*
* We now have a piece of stack borrowed from the init task's.
* Let's also switch to init_mm right away to match it.
*/
cpu_switch_mm(init_mm.pgd, &init_mm);
pr_debug("%s\n", __func__); pr_debug("%s\n", __func__);
mpidr = read_mpidr(); mpidr = read_mpidr();
...@@ -93,22 +87,21 @@ static void bL_do_switch(void *_unused) ...@@ -93,22 +87,21 @@ static void bL_do_switch(void *_unused)
} }
/* /*
* Stack isolation. To ensure 'current' remains valid, we just borrow * Stack isolation. To ensure 'current' remains valid, we just use another
* a slice of the init/idle task which should be fairly lightly used. * piece of our thread's stack space which should be fairly lightly used.
* The borrowed area starts just above the thread_info structure located * The selected area starts just above the thread_info structure located
* at the very bottom of the stack, aligned to a cache line. * at the very bottom of the stack, aligned to a cache line, and indexed
* with the cluster number.
*/ */
#define STACK_SIZE 256 #define STACK_SIZE 512
extern void call_with_stack(void (*fn)(void *), void *arg, void *sp); extern void call_with_stack(void (*fn)(void *), void *arg, void *sp);
static int bL_switchpoint(unsigned long _arg) static int bL_switchpoint(unsigned long _arg)
{ {
unsigned int mpidr = read_mpidr(); unsigned int mpidr = read_mpidr();
unsigned int cpuid = MPIDR_AFFINITY_LEVEL(mpidr, 0);
unsigned int clusterid = MPIDR_AFFINITY_LEVEL(mpidr, 1); unsigned int clusterid = MPIDR_AFFINITY_LEVEL(mpidr, 1);
unsigned int cpu_index = cpuid + clusterid * MAX_CPUS_PER_CLUSTER; void *stack = current_thread_info() + 1;
void *stack = &init_thread_info + 1;
stack = PTR_ALIGN(stack, L1_CACHE_BYTES); stack = PTR_ALIGN(stack, L1_CACHE_BYTES);
stack += cpu_index * STACK_SIZE + STACK_SIZE; stack += clusterid * STACK_SIZE + STACK_SIZE;
call_with_stack(bL_do_switch, (void *)_arg, stack); call_with_stack(bL_do_switch, (void *)_arg, stack);
BUG(); BUG();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment