Re: [PATCH v6 14/23] xen/riscv: introduce minimal virtual APLIC (vAPLIC) infrastructure
Oleksii Kurochko <[email protected]> Wed, 29 Jul 2026 12:41:40 +0200
| Newsgroups | gmane.comp.emulators.xen.devel |
|---|---|
| Message-ID | <[email protected]> |
On 7/22/26 9:40 AM, Jan Beulich wrote: > On 20.07.2026 17:59, Oleksii Kurochko wrote: >> At the current development stage, only domain vINTC init and deinit >> operations are required, so implement those first. >> >> Initialize vAPLIC's domaincfg to with the interrupt-enable bit set and >> MSI delivery mode selected as the current solution is exepcted to have >> always IMSIC, and initialize vintc->ops. >> >> Other operations such as emulate_load(), emulate_store(), and is_access() >> will be needed once guests are running and MMIO accesses to APLIC MMIO >> range must be handled. These will be introduced separately later. >> >> Introduce a structure to describe a virtual interrupt controller (vINTC) >> and a vintc_ops structure, which provides operations to emulate load and >> store accesses to interrupt controller MMIOs and to check whether a given >> address falls within the MMIO range of a specific virtual interrupt >> controller. >> Note that already existed init_ops field in struct vintc will be init-ed >> for APLIC in the follow up patch. >> >> The vAPLIC implementation of these operations will be provided later >> once guests can be run and these operations are actually needed. >> >> Introduce these structures here as they are required for the implementation >> of domain_vaplic_init() and domain_vaplic_alloc(). Also, introduce >> vaplic_init() and init vintc_ops->vcpu_init() with it. >> >> Co-developed-by: Romain Caritey <[email protected]> >> Signed-off-by: Oleksii Kurochko <[email protected]> > > Acked-by: Jan Beulich <[email protected]> Thanks. > albeit I (continue to) think that ... > >> --- a/xen/arch/riscv/include/asm/intc.h >> +++ b/xen/arch/riscv/include/asm/intc.h >> @@ -17,6 +17,7 @@ enum intc_variant { >> struct cpu_user_regs; >> struct irq_desc; >> struct kernel_info; >> +struct vcpu; >> >> struct intc_info { >> enum intc_variant hw_variant; >> @@ -53,8 +54,19 @@ struct vintc_init_ops { >> int (*make_domu_dt_node)(struct kernel_info *kinfo); >> }; >> >> +struct vintc_ops { >> + /* Initialize some vINTC-related stuff for a vCPU */ >> + int (*vcpu_init)(struct vcpu *v); >> + >> + /* Deinitialize some vINTC-related stuff for a vCPU */ >> + void (*vcpu_deinit)(struct vcpu *v); >> +}; >> + >> struct vintc { >> + /* Used during domain build only; dropped afterwards. */ >> const struct vintc_init_ops *init_ops; > > ... "dropped" in the comment is misleading - there's nothing being dropped > here, as that's technically impossible. Iirc you don't even poison the > field once domain build is finished. I will rephrase that in the following way: /* Callbacks invoked during domain construction only. */ ~ Oleksii