Files
gps/soc/software/bsp/drivers/irq.c
T
2026-07-12 11:01:51 +03:00

50 lines
1.1 KiB
C

#include "bsp/irq.h"
#define MSTATUS_MIE (1u << 3)
#define MIE_MTIE (1u << 7)
#define MIE_MEIE (1u << 11)
uint64_t bsp_read_mcause(void)
{
uint64_t value;
asm volatile ("csrr %0, mcause" : "=r"(value));
return value;
}
void bsp_set_mtvec(void (*handler)(void))
{
asm volatile ("csrw mtvec, %0" :: "r"(handler));
}
void bsp_enable_machine_external_interrupts(void)
{
uint64_t mie = MIE_MEIE;
uint64_t mstatus = MSTATUS_MIE;
asm volatile ("csrs mie, %0" :: "r"(mie));
asm volatile ("csrs mstatus, %0" :: "r"(mstatus));
}
void bsp_enable_machine_timer_interrupts(void)
{
uint64_t mie = MIE_MTIE;
uint64_t mstatus = MSTATUS_MIE;
asm volatile ("csrs mie, %0" :: "r"(mie));
asm volatile ("csrs mstatus, %0" :: "r"(mstatus));
}
uint64_t bsp_irq_save(void)
{
uint64_t state;
uint64_t mask = MSTATUS_MIE;
asm volatile ("csrrc %0, mstatus, %1" : "=r"(state) : "r"(mask) : "memory");
return state;
}
void bsp_irq_restore(uint64_t state)
{
if ((state & MSTATUS_MIE) != 0u) {
uint64_t mask = MSTATUS_MIE;
asm volatile ("csrs mstatus, %0" :: "r"(mask) : "memory");
}
}