diff --git a/src/kernel/interrupts.c b/src/kernel/interrupts.c index 366f1c3..c700b19 100644 --- a/src/kernel/interrupts.c +++ b/src/kernel/interrupts.c @@ -23,6 +23,17 @@ void interrupt_init() mie_val |= (1 << MIE_BIT_MEIE) | (1 << MIE_BIT_MTIE); asm volatile("csrw mie, %0" ::"r"(mie_val)); kputs("OK"); + + uint32_t mie, sie, mstatus; + asm volatile ("csrr %0, mie" : "=r"(mie)); + asm volatile ("csrr %0, sie" : "=r"(sie)); + asm volatile ("csrr %0, mstatus" : "=r"(mstatus)); + kprintf("mie: 0x%X, sie: 0x%X, mstatus: 0x%X\n", mie, sie, mstatus); + + // Enable timer and global interrupts + asm volatile ("csrs mie, %0" : : "r"(mie | (1 << 7) | (1 << 3))); // Enable timer and global + asm volatile ("csrs sie, %0" : : "r"(sie | (1 << 7) | (1 << 3))); // Enable timer and global + asm volatile ("csrs mstatus, %0" : : "r"(mstatus | (1 << 3))); // Set MIE bit } void kpanic(const char *reason, ...) diff --git a/src/kernel/plic.c b/src/kernel/plic.c index 86e6792..f482fa8 100644 --- a/src/kernel/plic.c +++ b/src/kernel/plic.c @@ -13,7 +13,7 @@ void plic_init() // This is a bitmask, so we shift 1 by the IRQ number. *PLIC_ENABLE(hart) = (1 << UART_IRQ); - // Set priority for CLINT timer interrupt (IRQ 5) + // Set priority for CLINT timer interrupt (IRQ 7) *PLIC_PRIORITY(TIMER_IRQ) = 1; // Lowest priority // Enable CLINT timer interrupt for Hart 0 diff --git a/src/kernel/plic.h b/src/kernel/plic.h index 3e72087..cca2c60 100644 --- a/src/kernel/plic.h +++ b/src/kernel/plic.h @@ -16,7 +16,7 @@ #define PLIC_CLAIM(hart) ((volatile uint32_t *)(PLIC_BASE + 0x200004 + (hart) * 0x1000)) #define UART_IRQ 10 -#define TIMER_IRQ 5 +#define TIMER_IRQ 7 void plic_init(); diff --git a/src/kernel/timer.c b/src/kernel/timer.c index 2267aef..fe57e23 100644 --- a/src/kernel/timer.c +++ b/src/kernel/timer.c @@ -1,7 +1,9 @@ #include +#include #include "timer.h" #include "plic.h" #include "interrupts.h" +#include "drivers/uart.h" _Atomic uint64_t sys_ticks = 0; const uint64_t tick_delta = 1000; @@ -11,10 +13,12 @@ void timer_init() { } void timer_tick() { - // Set the first timer interrupt to fire after 1ms static volatile uint64_t *mtime = (uint64_t *)CLINT_MTIME; static volatile uint64_t *mtimecmp = (uint64_t *)CLINT_MTIMECMP(0); - *mtimecmp = *mtime + tick_delta; + uint64_t current_mtime = *mtime; + uint64_t new_mtimecmp = current_mtime + tick_delta; + *mtimecmp = new_mtimecmp; + //kprintf("Set mtimecmp: %u (mtime: %u, delta: %u)\n", new_mtimecmp, current_mtime, tick_delta); sys_ticks++; }