Skip to content

Commit db8b7e9

Browse files
committed
RISC-V: KVM: Add in-kernel virtualization of AIA IMSIC
We can have AIA IMSIC support for both HS-level and VS-level but the VS-level IMSICs are optional. We use the VS-level IMSICs for Guest/VM whenever available otherwise we fallback to software emulation of AIA IMSIC. This patch adds in-kernel virtualization of AIA IMSIC. Signed-off-by: Anup Patel <apatel@ventanamicro.com> Reviewed-by: Atish Patra <atishp@rivosinc.com> Signed-off-by: Anup Patel <anup@brainfault.org>
1 parent 289a007 commit db8b7e9

3 files changed

Lines changed: 925 additions & 36 deletions

File tree

arch/riscv/include/asm/kvm_aia.h

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -90,44 +90,18 @@ DECLARE_STATIC_KEY_FALSE(kvm_riscv_aia_available);
9090

9191
extern struct kvm_device_ops kvm_riscv_aia_device_ops;
9292

93-
static inline void kvm_riscv_vcpu_aia_imsic_release(struct kvm_vcpu *vcpu)
94-
{
95-
}
96-
97-
static inline int kvm_riscv_vcpu_aia_imsic_update(struct kvm_vcpu *vcpu)
98-
{
99-
return 1;
100-
}
93+
void kvm_riscv_vcpu_aia_imsic_release(struct kvm_vcpu *vcpu);
94+
int kvm_riscv_vcpu_aia_imsic_update(struct kvm_vcpu *vcpu);
10195

10296
#define KVM_RISCV_AIA_IMSIC_TOPEI (ISELECT_MASK + 1)
103-
static inline int kvm_riscv_vcpu_aia_imsic_rmw(struct kvm_vcpu *vcpu,
104-
unsigned long isel,
105-
unsigned long *val,
106-
unsigned long new_val,
107-
unsigned long wr_mask)
108-
{
109-
return 0;
110-
}
111-
112-
static inline void kvm_riscv_vcpu_aia_imsic_reset(struct kvm_vcpu *vcpu)
113-
{
114-
}
115-
116-
static inline int kvm_riscv_vcpu_aia_imsic_inject(struct kvm_vcpu *vcpu,
117-
u32 guest_index, u32 offset,
118-
u32 iid)
119-
{
120-
return 0;
121-
}
122-
123-
static inline int kvm_riscv_vcpu_aia_imsic_init(struct kvm_vcpu *vcpu)
124-
{
125-
return 0;
126-
}
127-
128-
static inline void kvm_riscv_vcpu_aia_imsic_cleanup(struct kvm_vcpu *vcpu)
129-
{
130-
}
97+
int kvm_riscv_vcpu_aia_imsic_rmw(struct kvm_vcpu *vcpu, unsigned long isel,
98+
unsigned long *val, unsigned long new_val,
99+
unsigned long wr_mask);
100+
void kvm_riscv_vcpu_aia_imsic_reset(struct kvm_vcpu *vcpu);
101+
int kvm_riscv_vcpu_aia_imsic_inject(struct kvm_vcpu *vcpu,
102+
u32 guest_index, u32 offset, u32 iid);
103+
int kvm_riscv_vcpu_aia_imsic_init(struct kvm_vcpu *vcpu);
104+
void kvm_riscv_vcpu_aia_imsic_cleanup(struct kvm_vcpu *vcpu);
131105

132106
int kvm_riscv_aia_aplic_set_attr(struct kvm *kvm, unsigned long type, u32 v);
133107
int kvm_riscv_aia_aplic_get_attr(struct kvm *kvm, unsigned long type, u32 *v);

arch/riscv/kvm/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ kvm-$(CONFIG_RISCV_PMU_SBI) += vcpu_pmu.o vcpu_sbi_pmu.o
2929
kvm-y += aia.o
3030
kvm-y += aia_device.o
3131
kvm-y += aia_aplic.o
32+
kvm-y += aia_imsic.o

0 commit comments

Comments
 (0)