Files
acrn-hypervisor/hypervisor/include/arch/riscv/asm/trap.h
Haicheng Li fc495b946a hv: riscv: irq: add interrupt initialization and handlers
This patch implements interrupt initialization and the basic
exception/interrupt handling flow on RISC-V.

init_interrupt() needs to be invoked during CPU initialization to
set up the trap vector and enable the interrupt.

RISC-V exception and interrupt handling includes:
- Saving and restoring CPU registers around traps
- Implementing handlers for:
  - Supervisor software interrupt
  - Supervisor timer interrupt
- Halting the CPU for all other interrupts and exceptions

------
TODOs:
1. add support for registering interrupt handlers via request_irq() and
   further adoption of the common IRQ framework.
2. add support for external interrupt.

Tracked-On: #8813
Signed-off-by: Haicheng Li <haicheng.li@intel.com>
Co-developed-by: Shiqing Gao <shiqing.gao@intel.com>
Signed-off-by: Shiqing Gao <shiqing.gao@intel.com>
Reviewed-by: Yifan Liu  <yifan1.liu@intel.com>
Acked-by: Wang, Yu1 <yu1.wang@intel.com>
2025-09-29 14:01:00 +08:00

64 lines
2.2 KiB
C

/*
* Copyright (C) 2025 Intel Corporation.
*
* SPDX-License-Identifier: BSD-3-Clause
*
* Authors:
* Haicheng Li <haicheng.li@intel.com>
*/
#ifndef RISCV_TRAP_H
#define RISCV_TRAP_H
#define TRAP_VECTOR_MODE_DIRECT 0U
#define TRAP_VECTOR_MODE_VECTORED 1U
/**
* The Interrupt bit (most significant bit) in the scause register
* is set if the trap was caused by an interrupt.
*/
#define TRAP_CAUSE_INTERRUPT_BITMASK (1UL << 63U)
/* Trap Cause Codes - Interrupt */
/* Software Interrupt */
#define TRAP_CAUSE_IRQ_S_SOFT 1UL /* Supervisor software interrupt */
#define TRAP_CAUSE_IRQ_VS_SOFT 2UL /* Virtual supervisor software interrupt */
#define TRAP_CAUSE_IRQ_M_SOFT 3UL /* Machine software interrupt */
/* Timer Interrupt */
#define TRAP_CAUSE_IRQ_S_TIMER 5UL /* Supervisor timer interrupt */
#define TRAP_CAUSE_IRQ_VS_TIMER 6UL /* Virtual supervisor timer interrupt */
#define TRAP_CAUSE_IRQ_M_TIMER 7UL /* Machine timer interrupt */
/* External Interrupt */
#define TRAP_CAUSE_IRQ_S_EXT 9UL /* Supervisor external interrupt */
#define TRAP_CAUSE_IRQ_VS_EXT 10UL /* Virtual supervisor external interrupt */
#define TRAP_CAUSE_IRQ_M_EXT 11UL /* Machine external interrupt */
#define TRAP_CAUSE_IRQ_S_GUEST_EXT 12UL /* Supervisor guest external interrupt */
#define TRAP_CAUSE_IRQ_COUNTER_OVF 13UL /* Reserved for counter-overflow interrupt */
/* Interrupt Pending/Enable registers flags */
/* Software Interrupt */
#define IP_IE_SSI (1UL << TRAP_CAUSE_IRQ_S_SOFT)
#define IP_IE_VSSI (1UL << TRAP_CAUSE_IRQ_VS_SOFT)
#define IP_IE_MSI (1UL << TRAP_CAUSE_IRQ_M_SOFT)
/* Timer Interrupt */
#define IP_IE_STI (1UL << TRAP_CAUSE_IRQ_S_TIMER)
#define IP_IE_VSTI (1UL << TRAP_CAUSE_IRQ_VS_TIMER)
#define IP_IE_MTI (1UL << TRAP_CAUSE_IRQ_M_TIMER)
/* External Interrupt */
#define IP_IE_SEI (1UL << TRAP_CAUSE_IRQ_S_EXT)
#define IP_IE_VSEI (1UL << TRAP_CAUSE_IRQ_VS_EXT)
#define IP_IE_MEI (1UL << TRAP_CAUSE_IRQ_M_EXT)
#define IP_IE_SGEI (1UL << TRAP_CAUSE_IRQ_S_GUEST_EXT)
#define IP_IE_LCOFI (1UL << TRAP_CAUSE_IRQ_COUNTER_OVF)
#ifndef ASSEMBLER
#include <asm/irq.h>
extern uint64_t strap_handler;
void dispatch_trap(const struct intr_excp_ctx *ctx);
#endif /* ASSEMBLER */
#endif /* RISCV_TRAP_H */