Re: [PATCH v1 00/17] [RISC-V] virtual interrupt controller (vAPLIC/vIMSIC) support
Oleksii Kurochko <[email protected]> Wed, 29 Jul 2026 15:41:26 +0200
| Newsgroups | gmane.comp.emulators.xen.devel |
|---|---|
| Message-ID | <[email protected]> |
On 7/27/26 5:21 PM, Jan Beulich wrote:
> On 20.07.2026 18:01, Oleksii Kurochko wrote:
>> Hi all,
>>
>> This series adds the initial virtual interrupt controller (vINTC) support
>> for RISC-V guests in Xen, based on the Advanced Interrupt Architecture
>> (AIA): a virtual APLIC (vAPLIC) in MSI mode backed by a virtual IMSIC
>> (vIMSIC) using hardware guest interrupt files.
>>
>> Rather than emulating APLIC in direct-delivery mode (which requires
>> trap-and-emulate for every interrupt and is costly), the series targets
>> IMSIC from the start. AIA lets a hart implement several "guest interrupt
>> files" (up to GEILEN), so external interrupts can be delivered to a vCPU
>> directly by hardware via the VGEIN field of hstatus, without a hypervisor
>> round-trip. Xen only has to emulate the APLIC MMIO programming interface
>> and route the guest's intent onto the physical MSI topology; interrupt
>> delivery itself stays in hardware.
>>
>> The work breaks down into a few logical blocks:
>>
>> Physical APLIC/AIA groundwork (patches 1-3)
>> - Correctly track IRQ_DISABLED across runtime enable/disable and order
>> the ->status update against the IMSIC CSR write.
>> - Per-pCPU VGEIN (guest interrupt file) allocator: assign/release a
>> hardware guest file to a vCPU and program hstatus.VGEIN.
>> - Add the missing APLIC register offsets/masks needed by both the
>> physical and virtual APLIC code (no functional change).
>>
>> Device-agnostic MMIO dispatch + vAPLIC emulation (patches 4-5)
>> - A per-domain MMIO handler table modelled on Arm's framework, so
>> emulated devices self-register their GPA ranges and the fault path
>> stays agnostic via a single try_handle_mmio() entry point.
>> - vAPLIC MMIO read/write emulation. Writes are gated by the domain's
>> authorised-IRQ bitmap so a guest cannot touch interrupts it does not
>> own, and TARGET writes are translated from virtual to physical
>> hart/guest-file indices. Delegation (SOURCECFG.D) is not yet
>> supported.
>>
>> vIMSIC guest interrupt files and state (patches 6-9)
>> - Stage-2 map a vCPU's physical guest interrupt file to the fixed
>> per-vCPU GPA page the guest expects at offset 0.
>> - vcpu_aia_init(): assign a VGEIN, map its guest file and record the
>> IMSIC state as a consistent unit.
>> - IMSIC state save/restore (currently tracking which pCPU owns the
>> guest file, needed because the pCPU id is part of the MSI address).
>> - has_msi_support() helper to decide whether IMSIC state has to be
>> saved/restored.
>>
>> vINTC state save/restore plumbing (patches 10-11)
>> - vintc_state_{save,restore}() wrappers over new store/restore hooks in
>> struct vintc_ops, and the vAPLIC implementation of those hooks. No
>> callers are wired up yet; the context-switch calls arrive with vCPU
>> context switch support.
>>
>> Trap and instruction emulation infrastructure (patches 12-17)
>> - Extend the exception-table format with type/data fields and add
>> EX_TYPE_TRAP_INFO so fixups can capture sepc/scause/stval.
>> - riscv_vcpu_unpriv_read() (HLV/HLVX) to read guest memory/instructions
>> safely, and riscv_vcpu_trap_redirect() to forward a synchronous trap
>> back into the guest's VS-mode handler.
>> - A guest page-fault handler that decodes the trapped load/store
>> instruction (HTINST, or an unprivileged fetch as a fallback) and
>> dispatches the MMIO access through try_handle_mmio().
>>
>> Note on versioning: the series is posted as v1 as a freshly split-out
>> series, but several patches carry v2/v3 changelogs because they were
>> previously circulated as part of a larger another patches [1] from which the
>> current depends.
>>
>> CI tests: https://gitlab.com/xen-project/people/olkur/xen/-/pipelines/2690874319
>>
>> [1] https://lore.kernel.org/xen-devel/[email protected]/T/#t
>>
>> Oleksii Kurochko (17):
>> xen/riscv: manage IRQ_DISABLED flag in APLIC irq enable/disable
>> callbacks
>> xen/riscv: add basic VGEIN management for AIA guests
>> xen/riscv: add missing APLIC register offsets, masks to asm/aplic.h
>> xen/riscv: introduce device-agnostic MMIO emulation dispatch
>> xen/riscv: implement virtual APLIC MMIO emulation
>> xen/riscv: map IMSIC interrupt file for vCPUs
>> xen/riscv: introduce vCPU AIA initialization
>> xen/riscv: add IMSIC state save/restore
>> xen/riscv: add helper to check APLIC MSI mode
>> xen/riscv: introduce vintc_state_{save,restore}()
>> xen/riscv: add vAPLIC state save/restore hooks
>> xen/riscv: extend exception tables with type and data fields
>> xen/riscv: add unprivileged guest memory read helper
>> xen/riscv: add guest page fault handling stub
>> xen/riscv: implement trap redirection to a guest
>> xen/riscv: add guest load emulation for trapped MMIO accesses
>> xen/riscv: add guest store emulation for trapped MMIO accesses
>
> Where did the last two patches go? My inbox agrees with [1] that only 15 of the
> 17 patches arrived.
>
They lost for some reason, I sent them separately again. Now it should
be okay.
> [1] https://lists.xen.org/archives/html/xen-devel/2026-07/threads.html