[PATCH v1 10/17] xen/riscv: introduce vintc_state_{save,restore}()
Oleksii Kurochko <[email protected]>
| Newsgroups | org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <e71f53f1165619fabb9f79f34cc931cd4296af67.1784560663.git.oleksii.kurochko@gmail.com> |
Virtual interrupt controller state must be preserved across vCPU context switches: for AIA, a vCPU's guest interrupt file lives in the IMSIC of the pCPU it runs on, so the related state has to be saved when the vCPU is descheduled and re-established when it is scheduled again. Introduce vintc_state_save()/vintc_state_restore() wrappers around new store_state()/restore_state() hooks in struct vintc_ops, so that the context switch path can save/restore this state without knowing which vINTC variant a domain uses. No callers are wired up yet: the vAPLIC implementation of the hooks is added by the follow-up patch, and the calls from the context switch path will be introduced together with vCPU context switch support. Signed-off-by: Oleksii Kurochko <[email protected]> --- xen/arch/riscv/include/asm/intc.h | 9 +++++++++ xen/arch/riscv/intc.c | 14 ++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/xen/arch/riscv/include/asm/intc.h b/xen/arch/riscv/include/asm/intc.h index 2ee5d1533c8e..f4f0ce365c00 100644 --- a/xen/arch/riscv/include/asm/intc.h +++ b/xen/arch/riscv/include/asm/intc.h @@ -64,6 +64,12 @@ struct vintc_ops { /* Deinitialize some vINTC-related stuff for a vCPU */ void (*vcpu_deinit)(struct vcpu *v); + + /* Store virtual interrupt controller state */ + void (*store_state)(struct vcpu *v); + + /* Restore virtual interrupt controller state */ + void (*restore_state)(struct vcpu *v); }; struct vintc { @@ -91,4 +97,7 @@ void domain_vintc_deinit(struct domain *d); bool vintc_reserve_virq(const struct domain *d, unsigned int virq); +void vintc_state_save(struct vcpu *vcpu); +void vintc_state_restore(struct vcpu *vcpu); + #endif /* ASM__RISCV__INTERRUPT_CONTOLLER_H */ diff --git a/xen/arch/riscv/intc.c b/xen/arch/riscv/intc.c index 372c8d3a20f9..879d51337491 100644 --- a/xen/arch/riscv/intc.c +++ b/xen/arch/riscv/intc.c @@ -163,3 +163,17 @@ bool vintc_reserve_virq(const struct domain *d, unsigned int virq) return !test_and_set_bit(virq, d->arch.vintc->used_irqs); } + +void vintc_state_save(struct vcpu *vcpu) +{ + const struct vintc_ops *ops = vcpu->domain->arch.vintc->ops; + + ops->store_state(vcpu); +} + +void vintc_state_restore(struct vcpu *vcpu) +{ + const struct vintc_ops *ops = vcpu->domain->arch.vintc->ops; + + ops->restore_state(vcpu); +} -- 2.54.0