BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / bb0cb7718204df7c0cbaf87484b1def3c4b2880f / kernel / acpi

// Related

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);
+}