BarryServer : Git

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

// Related

Nucleus

Barry Initialise ACPI later acd0915 (3 years, 3 months ago)
diff --git a/kernel/acpi/acpi.c b/kernel/acpi/acpi.c
index c30fde8..2774dbe 100644
--- a/kernel/acpi/acpi.c
+++ b/kernel/acpi/acpi.c
@@ -1,10 +1,11 @@
 /*
- * This file controls the ACPI
+ * This file controls the ACPI.
  */
 
 #include <stdint.h>
 #include <string.h>
 #include <nucleus/panic.h>
+#include <nucleus/memory.h>
 #include "acpi.h"
 
 /* Root System Descriptor Pointer */
@@ -61,6 +62,9 @@ init_acpi(void *ebda)
 	uint32_t j;
 	struct SDTHeader *rsdt = (void *) ((struct RSDPDesc *) sig)->rsdt;
 	struct SDTHeader **table = (void *) (rsdt + 1);
+	set_page((uintptr_t) rsdt, PAGE_ADDR((uintptr_t) rsdt) |
+	         PTE_PRESENT | PTE_WRITE);
+	flush_tlb((uintptr_t) rsdt);
 	for (i = 0; i < (rsdt->length - sizeof(struct SDTHeader)) / 4; i++) {
 		if (!checksum(table[i]))
 			continue;
diff --git a/kernel/acpi/apic.c b/kernel/acpi/apic.c
index 67ebb06..423d815 100644
--- a/kernel/acpi/apic.c
+++ b/kernel/acpi/apic.c
@@ -53,6 +53,7 @@ struct ISOEntry {
 	uint8_t gsi, flags;
 };
 
+int apic = 0;
 size_t numCores = 1;
 uintptr_t lapicPtr, ioapicPtr;
 cpu_t lapicIds[MAX_CPUS], lapicNums[MAX_CPUS];
@@ -125,12 +126,16 @@ apic_start_timer(void)
 void
 init_apic(struct SDTHeader *header)
 {
+	apic = 1;
 	numCores = 0;
 
 	uint8_t overrides[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
 
 	/* Iterate the entries */
 	lapicPtr = *(uint32_t *) (header + 1);
+	set_page(lapicPtr, PAGE_ADDR(lapicPtr) |
+	         PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
+	flush_tlb(lapicPtr);
 	struct EntryHeader *entry = (void *) (header + 1) + 8;
 	struct LAPICEntry *lapic;
 	struct IOAPICEntry *ioapic;
@@ -158,6 +163,9 @@ init_apic(struct SDTHeader *header)
 		}
 		entry = (void *) entry + entry->length;
 	}
+	set_page(ioapicPtr, PAGE_ADDR(ioapicPtr) |
+	         PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
+	flush_tlb(ioapicPtr);
 
 	/* Send INT#1 to IRQ#33 on CPU#0 */
 	write_io_apic(0x10 + (2 * overrides[1] + 0), 33);
diff --git a/kernel/idt.c b/kernel/idt.c
index a7dc998..3303aa8 100644
--- a/kernel/idt.c
+++ b/kernel/idt.c
@@ -49,7 +49,8 @@ exc_handler(int num, struct InterruptFrame *frame, uint32_t err)
 	exceptions[num](frame, err);
 
 	/* Send APIC EOI */
-	LAPIC(0xB0) = 0;
+	if (apic)
+		LAPIC(0xB0) = 0;
 
 	asm volatile("sti");
 }
@@ -68,7 +69,8 @@ int_handler(int num, struct InterruptFrame *frame)
 		outb(0xA0, 0x20);
 	outb(0x20, 0x20);
 	/* Send APIC EOI*/
-	LAPIC(0xB0) = 0;
+	if (apic)
+		LAPIC(0xB0) = 0;
 
 	asm volatile("sti");
 }
diff --git a/kernel/main.c b/kernel/main.c
index 3655743..b4e639e 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -59,8 +59,6 @@ kmain(uint32_t esp, struct MultibootInfo *mbinfo)
 	init_idt();
 	init_pic();
 	cpu_load();
-	/* Search ACPI tables */
-	init_acpi(ebda);
 
 	/* Initialise paging */
 	init_paging();
@@ -68,6 +66,8 @@ kmain(uint32_t esp, struct MultibootInfo *mbinfo)
 	init_tasking();
 	/* Initialise the VFS */
 	init_vfs();
+	/* Search ACPI tables */
+	init_acpi(ebda);
 
 	panic("End of kernel!");
 }