RISC-V AIA support for RISC-V machines
AIA (Advanced Interrupt Architecture) support is implemented in the virt
RISC-V machine for TCG and KVM accelerators.
The support consists of two main modes:
- “aia=aplic”: adds one or more APLIC (Advanced Platform Level Interrupt Controller) devices 
- “aia=aplic-imsic”: adds one or more APLIC device and an IMSIC (Incoming MSI
- Controller) device for each CPU 
 
From an user standpoint, these modes will behave the same regardless of the accelerator used. From a developer standpoint the accelerator settings will change what it being emulated in userspace versus what is being emulated by an in-kernel irqchip.
When running TCG, all controllers are emulated in userspace, including machine mode (m-mode) APLIC and IMSIC (when applicable).
When running KVM:
- no m-mode is provided, so there is no m-mode APLIC or IMSIC emulation regardless of the AIA mode chosen 
- with “aia=aplic”, s-mode APLIC will be emulated by userspace 
- with “aia=aplic-imsic” there are two possibilities. If no additional KVM option is provided there will be no APLIC or IMSIC emulation in userspace, and the virtual machine will use the provided in-kernel APLIC and IMSIC controllers. If the user chooses to use the irqchip in split mode via “-accel kvm,kernel-irqchip=split”, s-mode APLIC will be emulated while using the s-mode IMSIC from the irqchip 
The following table summarizes how the AIA and accelerator options defines what we will emulate in userspace:
| Accel | Accel props | AIA type | APLIC m-mode | IMSIC m-mode | APLIC s-mode | IMSIC s-mode | 
|---|---|---|---|---|---|---|
| tcg | — | aplic | emul | n/a | emul | n/a | 
| tcg | — | aplic-imsic | emul | emul | emul | emul | 
| kvm | — | aplic | n/a | n/a | emul | n/a | 
| kvm | none | aplic-imsic | n/a | n/a | in-kernel | in-kernel | 
| kvm | irqchip=split | aplic-imsic | n/a | n/a | emul | in-kernel |