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/aplic.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'kernel/aplic.c') diff --git a/kernel/aplic.c b/kernel/aplic.c index 61a42c3..a5b91be 100644 --- a/kernel/aplic.c +++ b/kernel/aplic.c @@ -1,5 +1,4 @@ #include "kernel/aplic.h" -#include "kernel/spinlock.h" static volatile char* APLIC_M = (volatile char*)0x0c00'0000; static volatile char* APLIC_S = (volatile char*)0x0d00'0000; @@ -109,13 +108,22 @@ void aplic_init() aplic_w_smsiaddr(APLIC_M, (void*)IMSIC_S); - uint32_t uart_source = 10; - aplic_w_sourcecfg_delegate(APLIC_M, uart_source, 0); - aplic_w_sourcecfg_active_high(APLIC_S, uart_source); - aplic_w_target_msi(APLIC_S, uart_source, 0, 0, uart_source); - aplic_enable_intr(APLIC_S, uart_source); - imsic_w_seithreshold(0); imsic_w_seidelivery(EIDELIVERY_ENABLED); - imsic_s_seie(uart_source); +} + +void aplic_enable_intr_s(uint32_t source, uint32_t msg) +{ + aplic_w_sourcecfg_delegate(APLIC_M, source, 0); + aplic_w_sourcecfg_active_high(APLIC_S, source); + aplic_w_target_msi(APLIC_S, source, 0, 0, msg); + aplic_enable_intr(APLIC_S, source); + imsic_s_seie(msg); +} + +uint32_t aplic_claim_msi_s() +{ + uint32_t intr; + __asm__ volatile("csrrw %0, stopei, zero" : "=r"(intr)); + return intr >> 16; } -- cgit