summaryrefslogtreecommitdiff
path: root/src/kernel/smp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/smp.c')
-rw-r--r--src/kernel/smp.c37
1 files changed, 22 insertions, 15 deletions
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 <kernel.h>
+#include <addr.h>
#include <printf.h>
#include <madt.h>
#include <timer.h>
@@ -7,6 +7,7 @@
#include <libc.h>
#include <paging.h>
#include <heap.h>
+#include <panic.h>
#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
}