diff options
Diffstat (limited to 'kernel/src/apic/madt.c')
| -rw-r--r-- | kernel/src/apic/madt.c | 60 |
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); } |
