Nucleus
Barry Per-CPU Scheduler bb0cb77 (3 years, 2 months ago)
diff --git a/kernel/acpi/apic.c b/kernel/acpi/apic.c
index c7f8259..5c2297d 100644
--- a/kernel/acpi/apic.c
+++ b/kernel/acpi/apic.c
@@ -55,7 +55,7 @@ struct ISOEntry {
};
int apic = 0;
-size_t numCores = 1;
+size_t ncpus = 1;
uintptr_t lapicPtr, ioapicPtr;
cpu_t lapicIds[MAX_CPUS], lapicNums[MAX_CPUS];
@@ -128,7 +128,7 @@ void
init_apic(struct SDTHeader *header)
{
apic = 1;
- numCores = 0;
+ ncpus = 0;
uint8_t overrides[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
@@ -144,14 +144,14 @@ init_apic(struct SDTHeader *header)
while ((void *) entry < (((void *) header) + header->length)) {
switch (entry->type) {
case ENTRY_LAPIC:
- if (numCores >= MAX_CPUS)
+ if (ncpus >= MAX_CPUS)
break;
lapic = (void *) entry;
if (!(lapic->flags & 1))
break;
- lapicNums[lapic->id] = numCores;
- lapicIds[numCores] = lapic->id;
- numCores++;
+ lapicNums[lapic->id] = ncpus;
+ lapicIds[ncpus] = lapic->id;
+ ncpus++;
break;
case ENTRY_IOAPIC:
ioapic = (void *) entry;
@@ -176,7 +176,7 @@ init_apic(struct SDTHeader *header)
uint32_t i, j;
uintptr_t apTrampoline = 0x1000, stack;
memcpy((void *) apTrampoline, &ap_trampoline, PAGE_SIZE);
- for (i = 1; i < numCores; i++) {
+ for (i = 1; i < ncpus; i++) {
/* Give each processor a separate stack */
stack = alloc_frame() + PAGE_SIZE - sizeof(uintptr_t);
*((uint32_t *) (apTrampoline + 0xF00 + i)) = stack;
@@ -230,3 +230,14 @@ ap_startup(void)
schedule();
__builtin_unreachable();
}
+
+/* Send an IPI */
+void
+send_ipi(cpu_t target, uint8_t num)
+{
+ LAPIC(0x310) = (LAPIC(0x310) & 0x00FFFFFF)
+ | (lapicIds[target] << 24);
+ LAPIC(0x300) = (LAPIC(0x300) & 0xFFF32000)
+ | (0x5000 + num + 48);
+ while ((LAPIC(0x300) >> 12) & 1);
+}