From d78b60f868f40cefe3ac958800ac828f2eafc81c Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Tue, 4 Jun 2024 23:32:33 +0200 Subject: Supervisor trap & claim MSI --- kernel/start.c | 77 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 24 deletions(-) (limited to 'kernel/start.c') diff --git a/kernel/start.c b/kernel/start.c index 859ae5d..ddd31c2 100644 --- a/kernel/start.c +++ b/kernel/start.c @@ -11,29 +11,56 @@ extern uint32_t _bss_start; extern uint32_t _bss_end; extern uint32_t _ram_end; -void kstrap() +#define UART_MSI 1 + +extern uint32_t strap; + +void ktrap(uint32_t cause) { - uint32_t scause; - __asm__ volatile("csrr %0, scause" : "=r"(scause)); - switch (scause) + if ((cause & 0x8000'0000) == 0) + { + switch (cause) + { + case 0: panic("kstrap: Instruction address misaligned"); + case 1: panic("kstrap: Instruction access fault"); + case 2: panic("kstrap: Illegal instruction"); + case 3: panic("kstrap: Breakpoint"); + case 4: panic("kstrap: Load address misaligned"); + case 5: panic("kstrap: Load access fault"); + case 6: panic("kstrap: Store/AMO address misaligned"); + case 7: panic("kstrap: Store/AMO access fault"); + case 8: panic("kstrap: Environment call from U-mode"); + case 9: panic("kstrap: Environment call from S-mode"); + case 12: panic("kstrap: Instruction page fault"); + case 13: panic("kstrap: Load page fault"); + case 14: panic("kstrap: Reserved"); + case 15: panic("kstrap: Store/AMO page fault"); + case 18: panic("kstrap: Software check"); + case 19: panic("kstrap: Hardware error"); + default: panic("kstrap: Unknown"); + } + } + else { - case 0: panic("kstrap: Instruction address misaligned"); - case 1: panic("kstrap: Instruction access fault"); - case 2: panic("kstrap: Illegal instruction"); - case 3: panic("kstrap: Breakpoint"); - case 4: panic("kstrap: Load address misaligned"); - case 5: panic("kstrap: Load access fault"); - case 6: panic("kstrap: Store/AMO address misaligned"); - case 7: panic("kstrap: Store/AMO access fault"); - case 8: panic("kstrap: Environment call from U-mode"); - case 9: panic("kstrap: Environment call from S-mode"); - case 12: panic("kstrap: Instruction page fault"); - case 13: panic("kstrap: Load page fault"); - case 14: panic("kstrap: Reserved"); - case 15: panic("kstrap: Store/AMO page fault"); - case 18: panic("kstrap: Software check"); - case 19: panic("kstrap: Hardware error"); - default: panic("kstrap: Unknown"); + cause = cause & 0x7fff'ffff; + if (cause == 9) + { + uint32_t msi = aplic_claim_msi_s(); + switch (msi) + { + case UART_MSI: + { + volatile char* UART_BASE = (volatile char*)0x1000'0000; + *UART_BASE = *UART_BASE; + break; + } + default: panic("Unknown MSI"); + } + } + else + { + panic("Interrupt"); + } } } @@ -57,9 +84,8 @@ void kstart() kalloc_init(); kvm_init(); - aplic_init(); - panic("kstart: end"); + panic("kstart: end\n"); } void kinit() @@ -80,7 +106,10 @@ void kinit() w_sstatus(SSTATUS_SPIE | SSTATUS_SPP_S); w_sie(SIE_SEIE); w_sepc(&kstart); - w_stvec(&kstrap); + w_stvec(&strap); + + aplic_init(); + aplic_enable_intr_s(10, UART_MSI); w_pmpcfg0(PMPCFG_RW | PMPCFG_X | PMPCFG_TOR); w_pmpaddr0(((uint32_t)&_ram_end) >> PMPADDR_SHIFT); -- cgit