From c6aeafc9c7647a49ab45ae912dd8285e42dbe1eb Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Mon, 19 May 2025 00:47:05 -0400 Subject: kernel/amd64: mp: Improve AP bootstrap logic Signed-off-by: Ian Moffett --- sys/arch/amd64/amd64/mp.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'sys/arch/amd64') diff --git a/sys/arch/amd64/amd64/mp.c b/sys/arch/amd64/amd64/mp.c index a8a36c7..22561d7 100644 --- a/sys/arch/amd64/amd64/mp.c +++ b/sys/arch/amd64/amd64/mp.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -44,22 +45,20 @@ static volatile struct limine_smp_request g_smp_req = { .revision = 0 }; +static volatile uint32_t ncpu_up = 0; + static void ap_trampoline(struct limine_smp_info *si) { - static struct spinlock lock = {0}; struct cpu_info *ci; ci = dynalloc(sizeof(*ci)); __assert(ci != NULL); memset(ci, 0, sizeof(*ci)); - spinlock_acquire(&lock); cpu_startup(ci); - - spinlock_release(&lock); + atomic_inc_int(&ncpu_up); sched_enter(); - while (1); } @@ -90,4 +89,7 @@ mp_bootstrap_aps(struct cpu_info *ci) cpus[i]->goto_address = ap_trampoline; } + + /* Wait for all cores to be ready */ + while (ncpu_up < cpu_init_counter); } -- cgit v1.2.3