diff options
author | Ian Moffett <ian@osmora.org> | 2025-06-01 19:00:20 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-06-01 19:00:43 -0400 |
commit | e29d9d7a9d60b91a19c4f66a8153a8ff67acb69e (patch) | |
tree | cb6e64668cec24243a598b5f6784d4c465ff3778 /sys/arch/amd64/amd64 | |
parent | 65024f230dd030f2f10c155f63b1d374aac00f86 (diff) |
kernel/amd64: mp: Keep track of CPUs by index
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/arch/amd64/amd64')
-rw-r--r-- | sys/arch/amd64/amd64/mp.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/sys/arch/amd64/amd64/mp.c b/sys/arch/amd64/amd64/mp.c index 22561d7..fe0dd9f 100644 --- a/sys/arch/amd64/amd64/mp.c +++ b/sys/arch/amd64/amd64/mp.c @@ -29,6 +29,7 @@ #include <sys/types.h> #include <sys/limine.h> +#include <sys/limits.h> #include <sys/syslog.h> #include <sys/spinlock.h> #include <sys/sched.h> @@ -46,6 +47,8 @@ static volatile struct limine_smp_request g_smp_req = { }; static volatile uint32_t ncpu_up = 0; +static struct cpu_info *ci_list[CPU_MAX]; +static struct spinlock ci_list_lock = {0}; static void ap_trampoline(struct limine_smp_info *si) @@ -57,11 +60,31 @@ ap_trampoline(struct limine_smp_info *si) memset(ci, 0, sizeof(*ci)); cpu_startup(ci); + spinlock_acquire(&ci_list_lock); + ci_list[ncpu_up] = ci; + spinlock_release(&ci_list_lock); + atomic_inc_int(&ncpu_up); sched_enter(); while (1); } +struct cpu_info * +cpu_get(uint32_t index) +{ + if (index >= ncpu_up) { + return NULL; + } + + return ci_list[index]; +} + +uint32_t +cpu_count(void) +{ + return ncpu_up; +} + void mp_bootstrap_aps(struct cpu_info *ci) { |