Nucleus
Barry Initialise ACPI later acd0915 (3 years, 3 months ago)
diff --git a/include/io.h b/include/io.h
index ec0abcf..e0204fd 100644
--- a/include/io.h
+++ b/include/io.h
@@ -1,5 +1,5 @@
-#ifndef KERNEL_IO_H
-#define KERNEL_IO_H
+#ifndef _IO_H
+#define _IO_H
#include <stdint.h>
#include <stddef.h>
diff --git a/include/nucleus/cpu.h b/include/nucleus/cpu.h
index 8ed1f43..88c7506 100644
--- a/include/nucleus/cpu.h
+++ b/include/nucleus/cpu.h
@@ -13,12 +13,14 @@ struct InterruptFrame {
typedef void (*exc_handler_t)(struct InterruptFrame *, uint32_t);
typedef void (*int_handler_t)(struct InterruptFrame *);
+extern int apic;
+
extern uintptr_t lapicPtr, ioapicPtr;
#define LAPIC(off) (*((uint32_t *) ((uint32_t) lapicPtr + (off))))
#define IOAPIC(off) (*((uint32_t *) ((uint32_t) ioapicPtr + (off))))
extern cpu_t lapicNums[];
-#define CPUID lapicNums[(cpu_t) (LAPIC(0x20) >> 24)]
+#define CPUID (apic ? lapicNums[(cpu_t) (LAPIC(0x20) >> 24)] : 0)
#define MAX_CPUS 2
/* Push/pop interrupts */
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!");
}
diff --git a/memory/paging.c b/memory/paging.c
index bf90d0e..10d20d5 100644
--- a/memory/paging.c
+++ b/memory/paging.c
@@ -130,10 +130,6 @@ init_paging(void)
register_exception(14, early_page_fault_handler);
cpu_load_paging();
- /* Identity page the APIC registers */
- set_page(lapicPtr, lapicPtr | PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
- set_page(ioapicPtr, ioapicPtr | PTE_PRESENT | PTE_WRITE | PTE_GLOBAL);
-
/* Allocate a kernel stack */
uintptr_t stk;
for (stk = 0xF0400000; stk < 0xF0800000; stk += PAGE_SIZE)
@@ -144,8 +140,6 @@ init_paging(void)
void
cpu_load_paging(void)
{
- static cpu_t c = 0;
- while (c != CPUID);
switch_dir(kernelDir);
asm volatile (
"movl %%cr0, %%eax;"
@@ -153,5 +147,4 @@ cpu_load_paging(void)
"movl %%eax, %%cr0"
::: "%eax"
);
- c++;
}