summaryrefslogtreecommitdiff
path: root/kernel/src/apic/madt.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/apic/madt.c')
-rw-r--r--kernel/src/apic/madt.c60
1 files changed, 43 insertions, 17 deletions
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c
index d133f2d..6d701b7 100644
--- a/kernel/src/apic/madt.c
+++ b/kernel/src/apic/madt.c
@@ -4,6 +4,7 @@
#include <libk/string.h>
#include <libk/stdio.h>
#include <apic.h>
+#include <timer.h>
uint8_t curr_cpu_apic_id(void);
uint8_t curr_cpu_apic_id()
@@ -14,7 +15,7 @@ uint8_t curr_cpu_apic_id()
}
uint32_t ioapic_addr = 0;
-uint32_t lapic_addr = 0;
+uint64_t lapic_addr = 0;
uint32_t numcores = 0;
uint8_t cpu_apic_ids[256];
@@ -147,6 +148,11 @@ void parse_madt()
uint8_t bspid = curr_cpu_apic_id();
+ uint8_t* bspdone = (uint8_t*)0x3000100;
+ uint8_t* aprunning = (uint8_t*)0x3000200;
+ *bspdone = 0;
+ *aprunning = 0;
+
map_addr(lapic_addr, lapic_addr, FLAG_PRESENT);
map_addr(ioapic_addr, ioapic_addr, FLAG_PRESENT);
@@ -155,27 +161,47 @@ void parse_madt()
ioapic_set_irq(0x1, bspid, 0x21); // keyboard
__asm__ volatile ("sti;");
- /*
for(size_t i = 0; i < numcores; i++) {
// do not start BSP, that's already running this code
- if(cpu_apic_ids[i] == bspid) continue;
+ if(cpu_apic_ids[i] == bspid)
+ continue;
+
+ printf("initializing cpu with apic id 0x%x\n", cpu_apic_ids[i]);
// send INIT IPI
- *((volatile uint32_t*)(lapic_addr + 0x280)) = 0; // clear APIC errors
- *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | (i << 24); // select AP
- *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x00C500; // trigger INIT IPI
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(lapic_addr + 0x300)) & (1 << 12)); // wait for delivery
- *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | (i << 24); // select AP
- *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x008500; // deassert
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(lapic_addr + 0x300)) & (1 << 12)); // wait for delivery
- mdelay(10); // wait 10 msec
+
+ // clear APIC errors
+ *((volatile uint32_t*)(lapic_addr + 0x280)) = 0;
+ // select AP
+ *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ // trigger INIT IPI
+ *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x00C500;
+ // wait for delivery
+ do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
+ // select AP
+ *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ // deassert
+ *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x008500;
+ // wait for delivery
+ do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
+ // wait 10 msec
+ wait(10);
+
// send STARTUP IPI (twice)
+
for(size_t j = 0; j < 2; j++) {
- *((volatile uint32_t*)(lapic_addr + 0x280)) = 0; // clear APIC errors
- *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | (i << 24); // select AP
- *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff0f800) | 0x000608; // trigger STARTUP IPI for 0800:0000
- udelay(200); // wait 200 usec
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(lapic_addr + 0x300)) & (1 << 12)); // wait for delivery
+ // clear APIC errors
+ *((volatile uint32_t*)(lapic_addr + 0x280)) = 0;
+ // select AP
+ *((volatile uint32_t*)(lapic_addr + 0x310)) = (*((volatile uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ // trigger STARTUP IPI for 0800:0000
+ *((volatile uint32_t*)(lapic_addr + 0x300)) = (*((volatile uint32_t*)(lapic_addr + 0x300)) & 0xfff0f800) | 0x000608;
+ // wait 200 usec
+ wait(1);
+ // wait for delivery
+ do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((volatile uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
}
}
- */
+ *bspdone = 1;
+ wait(1);
+ printf("aprunning: %d\n", *aprunning);
}