aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2021-10-08 13:10:38 -0600
committerFelix Held <felix-coreboot@felixheld.de>2021-10-18 12:36:30 +0000
commitc2c38f5fdea0579d1a64ce63c00737bbe3ca5759 (patch)
tree0372610e9b701006bb6c9935b474bd8671f97e17
parent12ae850dfc10709f8c3bcf92ab7ba1397eb4ae43 (diff)
arch/x86,cpu/x86,lib/thread: Remove usage of cpu_info from lib/thread
We only ever start and execute threads on the BSP. By explicitly checking to see if the CPU is the BSP we can remove the dependency on cpu_info. With this change we can in theory enable threads in all stages. BUG=b:194391185, b:179699789 TEST=Boot guybrush to OS and verify coop multithreading still works Suggested-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Raul E Rangel <rrangel@chromium.org> Change-Id: Iea4622d52c36d529e100b7ea55f32c334acfdf3e Reviewed-on: https://review.coreboot.org/c/coreboot/+/58199 Reviewed-by: Karthik Ramasubramanian <kramasub@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/arch/x86/include/arch/cpu.h3
-rw-r--r--src/cpu/x86/cpu_info.S.inc3
-rw-r--r--src/cpu/x86/lapic/lapic_cpu_init.c1
-rw-r--r--src/cpu/x86/mp_init.c1
-rw-r--r--src/include/thread.h7
-rw-r--r--src/lib/thread.c23
6 files changed, 15 insertions, 23 deletions
diff --git a/src/arch/x86/include/arch/cpu.h b/src/arch/x86/include/arch/cpu.h
index 8e96fae2c2..9a3b63d6b3 100644
--- a/src/arch/x86/include/arch/cpu.h
+++ b/src/arch/x86/include/arch/cpu.h
@@ -231,9 +231,6 @@ struct thread;
struct cpu_info {
struct device *cpu;
size_t index;
-#if CONFIG(COOP_MULTITASKING)
- struct thread *thread;
-#endif
};
/*
diff --git a/src/cpu/x86/cpu_info.S.inc b/src/cpu/x86/cpu_info.S.inc
index dffd1bc346..fc3e26d178 100644
--- a/src/cpu/x86/cpu_info.S.inc
+++ b/src/cpu/x86/cpu_info.S.inc
@@ -2,9 +2,6 @@
/* Push struct cpu_info */
.macro push_cpu_info index=$0
-#if CONFIG(COOP_MULTITASKING)
- push $0 /* *thread */
-#endif
push \index /* index */
push $0 /* *cpu */
.endm
diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c
index bc0f44fd90..c35888a7fd 100644
--- a/src/cpu/x86/lapic/lapic_cpu_init.c
+++ b/src/cpu/x86/lapic/lapic_cpu_init.c
@@ -253,7 +253,6 @@ static int start_cpu(struct device *cpu)
info->index = index;
info->cpu = cpu;
cpu_add_map_entry(info->index);
- thread_init_cpu_info_non_bsp(info);
/* Advertise the new stack and index to start_cpu */
secondary_stack = stack_top;
diff --git a/src/cpu/x86/mp_init.c b/src/cpu/x86/mp_init.c
index 123b2b5eb5..497ed3cfc5 100644
--- a/src/cpu/x86/mp_init.c
+++ b/src/cpu/x86/mp_init.c
@@ -193,7 +193,6 @@ static void asmlinkage ap_init(unsigned int cpu)
info->cpu = cpus_dev[cpu];
cpu_add_map_entry(info->index);
- thread_init_cpu_info_non_bsp(info);
/* Fix up APIC id with reality. */
info->cpu->path.apic.apic_id = lapicid();
diff --git a/src/include/thread.h b/src/include/thread.h
index cb085b5509..62c6283acf 100644
--- a/src/include/thread.h
+++ b/src/include/thread.h
@@ -73,11 +73,6 @@ void thread_coop_disable(void);
void thread_mutex_lock(struct thread_mutex *mutex);
void thread_mutex_unlock(struct thread_mutex *mutex);
-static inline void thread_init_cpu_info_non_bsp(struct cpu_info *ci)
-{
- ci->thread = NULL;
-}
-
/* Architecture specific thread functions. */
asmlinkage void switch_to_thread(uintptr_t new_stack, uintptr_t *saved_stack);
/* Set up the stack frame for a new thread so that a switch_to_thread() call
@@ -96,8 +91,6 @@ static inline int thread_yield_microseconds(unsigned int microsecs)
}
static inline void thread_coop_enable(void) {}
static inline void thread_coop_disable(void) {}
-struct cpu_info;
-static inline void thread_init_cpu_info_non_bsp(struct cpu_info *ci) { }
static inline void thread_mutex_lock(struct thread_mutex *mutex) {}
diff --git a/src/lib/thread.c b/src/lib/thread.c
index 9008147eae..da6189d6f1 100644
--- a/src/lib/thread.c
+++ b/src/lib/thread.c
@@ -4,10 +4,10 @@
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
-#include <arch/cpu.h>
#include <bootstate.h>
#include <commonlib/bsd/compiler.h>
#include <console/console.h>
+#include <smp/node.h>
#include <thread.h>
#include <timer.h>
@@ -27,17 +27,25 @@ static struct thread all_threads[TOTAL_NUM_THREADS];
static struct thread *runnable_threads;
static struct thread *free_threads;
+static struct thread *active_thread;
+
static inline int thread_can_yield(const struct thread *t)
{
return (t != NULL && t->can_yield > 0);
}
+static inline void set_current_thread(struct thread *t)
+{
+ assert(boot_cpu());
+ active_thread = t;
+}
+
static inline struct thread *current_thread(void)
{
- if (!initialized)
+ if (!initialized || !boot_cpu())
return NULL;
- return cpu_info()->thread;
+ return active_thread;
}
static inline int thread_list_empty(struct thread **list)
@@ -108,7 +116,6 @@ __noreturn static enum cb_err idle_thread(void *unused)
static void schedule(struct thread *t)
{
struct thread *current = current_thread();
- struct cpu_info *ci = cpu_info();
/* If t is NULL need to find new runnable thread. */
if (t == NULL) {
@@ -123,7 +130,7 @@ static void schedule(struct thread *t)
if (t->handle)
t->handle->state = THREAD_STARTED;
- ci->thread = t;
+ set_current_thread(t);
switch_to_thread(t->stack_current, &current->stack_current);
}
@@ -239,14 +246,14 @@ static void threads_initialize(void)
int i;
struct thread *t;
u8 *stack_top;
- struct cpu_info *ci;
if (initialized)
return;
t = &all_threads[0];
- ci = cpu_info();
- ci->thread = t;
+
+ set_current_thread(t);
+
t->stack_orig = (uintptr_t)NULL; /* We never free the main thread */
t->id = 0;
t->can_yield = 1;