From 1f71b9576db536af84155363e14fc49e92de2eef Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Sun, 29 Aug 2021 02:52:48 -0500 Subject: backup 8.29.21 --- src/kernel/smp.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'src/kernel/smp.c') diff --git a/src/kernel/smp.c b/src/kernel/smp.c index 5796ab9..9714c91 100644 --- a/src/kernel/smp.c +++ b/src/kernel/smp.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -7,6 +7,7 @@ #include #include #include +#include #define LAPIC_ICR_LOW 192 #define LAPIC_ICR_HIGH 196 @@ -16,6 +17,7 @@ extern char __load_start_smp_bootloader, __load_stop_smp_bootloader; extern uint8_t *smp_bootstrap_corecount; extern uint8_t smp_bootstrap_bsp; extern uint64_t *smp_bootstrap_stackarray; +extern char final_gdt_descriptor; struct icr_reg { uint8_t vector; @@ -30,22 +32,30 @@ struct icr_reg { unsigned int reserved_2:12; }__attribute__((packed)); -//1: get bsp number 2 -//2: get list of lapics 3 -//3: copy code 1 -//4: - static inline void write_icr(uint8_t dest, uint32_t message) { lapic[LAPIC_ICR_HIGH] = (uint32_t)dest << 24; lapic[LAPIC_ICR_LOW] = message; } +struct gdt_descriptor { + uint16_t size; + void *offset; +} __attribute__((packed)); + +static struct gdt_descriptor gdtr; + void smp_boot() { - uint8_t cores_active = 1; //TODO change in asm + uint8_t cores_active = 1; struct cores_info cores; struct icr_reg icr; get_coreinfo(&cores); + if(cores.corecount == 1) { + asm("sgdt [%0]"::"m"(gdtr)); + gdtr.offset = PHYS_TO_VIRT(gdtr.offset); + asm("lgdt [%0]"::"m"(gdtr)); + return; + } bzero(&icr, sizeof(icr)); void **core_stacks = malloc(sizeof(void *) * (cores.corecount - 1)); @@ -57,9 +67,7 @@ void smp_boot() { &__load_stop_smp_bootloader - &__load_start_smp_bootloader); smp_bootstrap_corecount = &cores_active; smp_bootstrap_bsp = cores.bsp; - smp_bootstrap_stackarray = (uint64_t)core_stacks; - - + smp_bootstrap_stackarray = (void *)core_stacks; icr.deliv_mode = 0b101; icr.dest_shorthand = 0b11; @@ -74,10 +82,9 @@ void smp_boot() { if(cores_active != cores.corecount) write_icr(0, *(uint32_t *)&icr); usleep(200); if(cores_active != cores.corecount) { - printf("NOT ALL CORES ONLINE\n"); - asm("cli\nhlt"); - } - else { - printf("%i!!!!!!\n", cores_active); + printf("Only %i cores online (expected %i)\n", cores_active, cores.corecount); //maybe add a panic + PANIC(KERNEL_PANIC_SMP_FAILED); } + printf("%i \n", cores_active); + //asm("lgdt [%0]\n"::"r"(PHYS_TO_VIRT(&final_gdt_descriptor))); TODO NOW } -- cgit v1.2.3