Run first app from ramdisk!
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <amd64/apic.h>
|
||||
#include <amd64/intr_defs.h>
|
||||
#include <amd64/msr-index.h>
|
||||
#include <amd64/msr.h>
|
||||
#include <libk/std.h>
|
||||
@@ -14,10 +15,10 @@
|
||||
#define IOAPICS_MAX 24
|
||||
#define INTERRUPT_SRC_OVERRIDES_MAX 24
|
||||
|
||||
#define LAPIC_ID 0x20 /* ID */
|
||||
#define LAPIC_EOI 0xB0 /* End of interrupt */
|
||||
#define LAPIC_SIVR 0xF0 /* Spurious interrupt vector register */
|
||||
#define LAPIC_ICR 0x300
|
||||
#define LAPIC_ID 0x20 /* ID */
|
||||
#define LAPIC_EOI 0xB0 /* End of interrupt */
|
||||
#define LAPIC_SIVR 0xF0 /* Spurious interrupt vector register */
|
||||
#define LAPIC_ICR 0x300 /* Interrupt command register */
|
||||
#define LAPIC_LVTTR 0x320 /* LVT timer register */
|
||||
#define LAPIC_TIMICT 0x380 /* Initial count register */
|
||||
#define LAPIC_TIMCCT 0x390 /* Current count register */
|
||||
@@ -60,7 +61,7 @@ static struct acpi_madt_ioapic* amd64_ioapic_find (uint8_t irq) {
|
||||
}
|
||||
|
||||
void amd64_ioapic_route_irq (uint8_t vec, uint8_t irq, uint64_t flags, uint64_t lapic_id) {
|
||||
struct acpi_madt_ioapic* apic;
|
||||
struct acpi_madt_ioapic* apic = NULL;
|
||||
struct acpi_madt_interrupt_source_override* override;
|
||||
bool found_override = false;
|
||||
struct limine_hhdm_response* hhdm = limine_hhdm_request.response;
|
||||
@@ -155,7 +156,7 @@ void amd64_ioapic_init (void) {
|
||||
struct acpi_madt_ioapic* ioapic = (struct acpi_madt_ioapic*)current;
|
||||
mm_map_kernel_page ((uintptr_t)ioapic->address,
|
||||
(uintptr_t)hhdm->offset + (uintptr_t)ioapic->address,
|
||||
MM_PG_PRESENT | MM_PG_RW);
|
||||
MM_PG_PRESENT | MM_PG_RW | MM_PD_RELOAD);
|
||||
apics[ioapic_entries++] = *ioapic;
|
||||
} break;
|
||||
case ACPI_MADT_ENTRY_TYPE_INTERRUPT_SOURCE_OVERRIDE: {
|
||||
@@ -188,7 +189,7 @@ void amd64_lapic_tick (uint32_t tick) { amd64_lapic_write (LAPIC_TIMICT, tick);
|
||||
static uint32_t amd64_lapic_calibrate (uint32_t us) {
|
||||
amd64_lapic_write (LAPIC_DCR, 0x03);
|
||||
|
||||
amd64_lapic_write (LAPIC_LVTTR, 0x20 | (1 << 16));
|
||||
amd64_lapic_write (LAPIC_LVTTR, SCHED_PREEMPT_TIMER | (1 << 16));
|
||||
|
||||
amd64_lapic_write (LAPIC_TIMICT, 0xFFFFFFFF);
|
||||
|
||||
@@ -202,7 +203,7 @@ static uint32_t amd64_lapic_calibrate (uint32_t us) {
|
||||
static void amd64_lapic_start (uint32_t ticks) {
|
||||
amd64_lapic_write (LAPIC_DCR, 0x03);
|
||||
|
||||
amd64_lapic_write (LAPIC_LVTTR, 0x20 | (1 << 17));
|
||||
amd64_lapic_write (LAPIC_LVTTR, SCHED_PREEMPT_TIMER | (1 << 17));
|
||||
|
||||
amd64_lapic_write (LAPIC_TIMICT, ticks);
|
||||
}
|
||||
@@ -215,7 +216,8 @@ uint64_t amd64_lapic_init (uint32_t us) {
|
||||
uintptr_t lapic_paddr = amd64_rdmsr (MSR_APIC_BASE) & 0xFFFFF000;
|
||||
lapic_mmio_base = lapic_paddr + (uintptr_t)hhdm->offset;
|
||||
|
||||
mm_map_kernel_page (lapic_paddr, lapic_mmio_base, MM_PG_PRESENT | MM_PG_RW | MM_PD_LOCK);
|
||||
mm_map_kernel_page (lapic_paddr, lapic_mmio_base,
|
||||
MM_PG_PRESENT | MM_PG_RW | MM_PD_LOCK | MM_PD_RELOAD);
|
||||
|
||||
amd64_lapic_write (LAPIC_SIVR, 0xFF | (1 << 8));
|
||||
|
||||
@@ -225,3 +227,8 @@ uint64_t amd64_lapic_init (uint32_t us) {
|
||||
|
||||
return ticks;
|
||||
}
|
||||
|
||||
void amd64_lapic_ipi (uint8_t lapic_id, uint8_t vec) {
|
||||
amd64_lapic_write (LAPIC_ICR + 0x10, (lapic_id << 24));
|
||||
amd64_lapic_write (LAPIC_ICR, vec);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user