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>
This commit is contained in:
parent
b9d94ecd78
commit
7db7ee984c
|
@ -17,11 +17,6 @@ _stack:
|
||||||
.space (CONFIG_MAX_CPUS+1)*CONFIG_STACK_SIZE
|
.space (CONFIG_MAX_CPUS+1)*CONFIG_STACK_SIZE
|
||||||
_estack:
|
_estack:
|
||||||
.set _stack_size, _estack - _stack
|
.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
|
.section ".text._start", "ax", @progbits
|
||||||
#if ENV_X86_64
|
#if ENV_X86_64
|
||||||
|
|
|
@ -39,10 +39,3 @@ void arch_prepare_thread(struct thread *t,
|
||||||
|
|
||||||
t->stack_current = stack;
|
t->stack_current = stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *arch_get_thread_stackbase(void)
|
|
||||||
{
|
|
||||||
/* defined in c_start.S */
|
|
||||||
extern u8 thread_stacks[];
|
|
||||||
return &thread_stacks[0];
|
|
||||||
}
|
|
||||||
|
|
|
@ -52,11 +52,6 @@ struct thread {
|
||||||
};
|
};
|
||||||
|
|
||||||
void threads_initialize(void);
|
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. */
|
/* Return 0 on successful yield, < 0 when thread did not yield. */
|
||||||
int thread_yield(void);
|
int thread_yield(void);
|
||||||
|
|
|
@ -15,6 +15,12 @@
|
||||||
_Static_assert((CONFIG_STACK_SIZE & (CONFIG_STACK_SIZE - 1)) == 0,
|
_Static_assert((CONFIG_STACK_SIZE & (CONFIG_STACK_SIZE - 1)) == 0,
|
||||||
"`cpu_info()` requires the stack size to be a power of 2");
|
"`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 bool initialized;
|
||||||
|
|
||||||
static void idle_thread_init(void);
|
static void idle_thread_init(void);
|
||||||
|
@ -257,9 +263,6 @@ void threads_initialize(void)
|
||||||
struct thread *t;
|
struct thread *t;
|
||||||
u8 *stack_top;
|
u8 *stack_top;
|
||||||
struct cpu_info *ci;
|
struct cpu_info *ci;
|
||||||
u8 *thread_stacks;
|
|
||||||
|
|
||||||
thread_stacks = arch_get_thread_stackbase();
|
|
||||||
|
|
||||||
/* `cpu_info()` requires the stacks to be STACK_SIZE aligned */
|
/* `cpu_info()` requires the stacks to be STACK_SIZE aligned */
|
||||||
assert(IS_ALIGNED((uintptr_t)thread_stacks, CONFIG_STACK_SIZE));
|
assert(IS_ALIGNED((uintptr_t)thread_stacks, CONFIG_STACK_SIZE));
|
||||||
|
|
Loading…
Reference in New Issue