summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaul E Rangel <rrangel@chromium.org>2021-07-22 12:37:23 -0600
committerPatrick Georgi <pgeorgi@google.com>2021-07-26 07:28:08 +0000
commit7db7ee984c7268b6a60eae051a919e428b2db988 (patch)
tree25462429207623ec7eda70a5630e215a5e262917
parentb9d94ecd78c4c85aa27e8b6a692f413eff2ed9a3 (diff)
lib/thread,arch/x86: Move thread stacks into C bss
There is no reason this needs to be done in asm. It also allows different stages to use threads. If threads are no used in a specific stage, the compiler will garbage collect the space. BUG=b:179699789 TEST=Boot guybrush to the OS Suggested-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Raul E Rangel <rrangel@chromium.org> Change-Id: Ib5a84a62fdc75db8ef0358ae16ff69c20cbafd5f Reviewed-on: https://review.coreboot.org/c/coreboot/+/56531 Reviewed-by: Furquan Shaikh <furquan@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/arch/x86/c_start.S5
-rw-r--r--src/arch/x86/thread.c7
-rw-r--r--src/include/thread.h5
-rw-r--r--src/lib/thread.c9
4 files changed, 6 insertions, 20 deletions
diff --git a/src/arch/x86/c_start.S b/src/arch/x86/c_start.S
index 3ef03b3346..34ed4e3665 100644
--- a/src/arch/x86/c_start.S
+++ b/src/arch/x86/c_start.S
@@ -17,11 +17,6 @@ _stack:
.space (CONFIG_MAX_CPUS+1)*CONFIG_STACK_SIZE
_estack:
.set _stack_size, _estack - _stack
-#if CONFIG(COOP_MULTITASKING)
-.global thread_stacks
-thread_stacks:
-.space CONFIG_STACK_SIZE*CONFIG_NUM_THREADS
-#endif
.section ".text._start", "ax", @progbits
#if ENV_X86_64
diff --git a/src/arch/x86/thread.c b/src/arch/x86/thread.c
index 3d12bf8d5c..a9fda66245 100644
--- a/src/arch/x86/thread.c
+++ b/src/arch/x86/thread.c
@@ -39,10 +39,3 @@ void arch_prepare_thread(struct thread *t,
t->stack_current = stack;
}
-
-void *arch_get_thread_stackbase(void)
-{
- /* defined in c_start.S */
- extern u8 thread_stacks[];
- return &thread_stacks[0];
-}
diff --git a/src/include/thread.h b/src/include/thread.h
index fed0bfb964..ce250b8520 100644
--- a/src/include/thread.h
+++ b/src/include/thread.h
@@ -52,11 +52,6 @@ struct thread {
};
void threads_initialize(void);
-/* Get the base of the thread stacks.
- * Returns pointer to CONFIG_NUM_THREADS*CONFIG_STACK_SIZE contiguous bytes
- * aligned to CONFIG_STACK_SIZE, or NULL.
- */
-void *arch_get_thread_stackbase(void);
/* Return 0 on successful yield, < 0 when thread did not yield. */
int thread_yield(void);
diff --git a/src/lib/thread.c b/src/lib/thread.c
index 262cfa53bd..413e5b4bec 100644
--- a/src/lib/thread.c
+++ b/src/lib/thread.c
@@ -15,6 +15,12 @@
_Static_assert((CONFIG_STACK_SIZE & (CONFIG_STACK_SIZE - 1)) == 0,
"`cpu_info()` requires the stack size to be a power of 2");
+/*
+ * struct cpu_info lives at the top of each thread's stack. `cpu_info()` locates this struct by
+ * taking the current stack pointer and masking off CONFIG_STACK_SIZE. This requires the stack
+ * to be STACK_SIZE aligned.
+ */
+static u8 thread_stacks[CONFIG_STACK_SIZE * CONFIG_NUM_THREADS] __aligned(CONFIG_STACK_SIZE);
static bool initialized;
static void idle_thread_init(void);
@@ -257,9 +263,6 @@ void threads_initialize(void)
struct thread *t;
u8 *stack_top;
struct cpu_info *ci;
- u8 *thread_stacks;
-
- thread_stacks = arch_get_thread_stackbase();
/* `cpu_info()` requires the stacks to be STACK_SIZE aligned */
assert(IS_ALIGNED((uintptr_t)thread_stacks, CONFIG_STACK_SIZE));