summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-06-08 18:15:13 -0400
committerIan Moffett <ian@osmora.org>2024-06-08 18:15:13 -0400
commit44ef655a0afc3d2c8aa305f94b412f9d89bec846 (patch)
treea04fb4070745ad66f267695d91cfa92e5a573a57
parentd5381223cea600ff007069bc1313de142cd06972 (diff)
kernel/amd64: Pass CPU info to cpu_startup()
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--sys/arch/amd64/amd64/machdep.c9
-rw-r--r--sys/include/arch/amd64/cpu.h3
-rw-r--r--sys/kern/init_main.c2
3 files changed, 8 insertions, 6 deletions
diff --git a/sys/arch/amd64/amd64/machdep.c b/sys/arch/amd64/amd64/machdep.c
index 2fe71a9..82fa97b 100644
--- a/sys/arch/amd64/amd64/machdep.c
+++ b/sys/arch/amd64/amd64/machdep.c
@@ -45,7 +45,7 @@
int ibrs_enable(void);
-static struct cpu_info g_bsp_ci = {0};
+struct cpu_info g_bsp_ci = {0};
static struct gdtr bsp_gdtr = {
.limit = sizeof(struct gdt_entry) * 256 - 1,
.offset = (uintptr_t)&g_gdt_data[0]
@@ -99,15 +99,16 @@ this_cpu(void)
}
void
-cpu_startup(void)
+cpu_startup(struct cpu_info *ci)
{
gdt_load(&bsp_gdtr);
idt_load();
setup_vectors();
- amd64_write_gs_base((uintptr_t)&g_bsp_ci);
- init_tss(&g_bsp_ci);
+ amd64_write_gs_base((uintptr_t)ci);
+ init_tss(ci);
try_mitigate_spectre();
+ __ASMV("sti"); /* Unmask interrupts */
lapic_init();
}
diff --git a/sys/include/arch/amd64/cpu.h b/sys/include/arch/amd64/cpu.h
index ef2eb78..84391ba 100644
--- a/sys/include/arch/amd64/cpu.h
+++ b/sys/include/arch/amd64/cpu.h
@@ -41,7 +41,8 @@ struct cpu_info {
struct tss_entry *tss;
};
-void cpu_startup(void);
+void cpu_startup(struct cpu_info *ci);
struct cpu_info *this_cpu(void);
+extern struct cpu_info g_bsp_ci;
#endif /* !_MACHINE_CPU_H_ */
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 6f17227..94fa8c0 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -49,7 +49,7 @@ main(void)
vm_init();
/* Startup the BSP */
- cpu_startup();
+ cpu_startup(&g_bsp_ci);
/* Nothing left to do... halt */
cpu_reboot(REBOOT_HALT);