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