From c2c38f5fdea0579d1a64ce63c00737bbe3ca5759 Mon Sep 17 00:00:00 2001 From: Raul E Rangel Date: Fri, 8 Oct 2021 13:10:38 -0600 Subject: [PATCH] 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 Signed-off-by: Raul E Rangel Change-Id: Iea4622d52c36d529e100b7ea55f32c334acfdf3e Reviewed-on: https://review.coreboot.org/c/coreboot/+/58199 Reviewed-by: Karthik Ramasubramanian Tested-by: build bot (Jenkins) --- src/arch/x86/include/arch/cpu.h | 3 --- src/cpu/x86/cpu_info.S.inc | 3 --- src/cpu/x86/lapic/lapic_cpu_init.c | 1 - src/cpu/x86/mp_init.c | 1 - src/include/thread.h | 7 ------- src/lib/thread.c | 23 +++++++++++++++-------- 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 #include #include -#include #include #include #include +#include #include #include @@ -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, ¤t->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;