Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion arch/arm/kernel/asm-offsets.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ int main(void)
DEFINE(VCPU_HxFAR, offsetof(struct kvm_vcpu, arch.fault.hxfar));
DEFINE(VCPU_HPFAR, offsetof(struct kvm_vcpu, arch.fault.hpfar));
DEFINE(VCPU_HYP_PC, offsetof(struct kvm_vcpu, arch.fault.hyp_pc));
#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
DEFINE(VCPU_VGIC_CPU, offsetof(struct kvm_vcpu, arch.vgic_cpu));
DEFINE(VGIC_V2_CPU_HCR, offsetof(struct vgic_cpu, vgic_v2.vgic_hcr));
DEFINE(VGIC_V2_CPU_VMCR, offsetof(struct vgic_cpu, vgic_v2.vgic_vmcr));
Expand Down
12 changes: 11 additions & 1 deletion arch/arm/kvm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,19 @@ config KVM_ARM_VGIC
---help---
Adds support for a hardware assisted, in-kernel GIC emulation.

config KVM_ARM_VGIC_EMU
bool "KVM support for Emulated GIC"
depends on KVM_ARM_HOST
depends on !KVM_ARM_VGIC
select HAVE_KVM_IRQCHIP
default y
---help---
Adds support for in-kernel GIC emulation, for boards without
a GIC with virtualization extensions.

config KVM_ARM_TIMER
bool "KVM support for Architected Timers"
depends on KVM_ARM_VGIC && ARM_ARCH_TIMER
depends on (KVM_ARM_VGIC || KVM_ARM_VGIC_EMU) && ARM_ARCH_TIMER
select HAVE_KVM_IRQCHIP
default y
---help---
Expand Down
1 change: 1 addition & 0 deletions arch/arm/kvm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o
obj-y += coproc.o coproc_a15.o coproc_a7.o mmio.o psci.o perf.o
obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o
obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2.o
obj-$(CONFIG_KVM_ARM_VGIC_EMU) += $(KVM)/arm/vgic-emu.o
obj-$(CONFIG_KVM_ARM_TIMER) += $(KVM)/arm/arch_timer.o
6 changes: 5 additions & 1 deletion arch/arm/kvm/arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -936,11 +936,15 @@ static int init_hyp_mode(void)
/*
* Init HYP view of VGIC
*/
#ifdef CONFIG_KVM_ARM_VGIC_EMU
err = kvm_vgic_emu_hyp_init();
#else
err = kvm_vgic_hyp_init();
#endif
if (err)
goto out_free_context;

#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
vgic_present = true;
#endif

Expand Down
4 changes: 2 additions & 2 deletions arch/arm/kvm/interrupts_head.S
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ vcpu .req r0 @ vcpu pointer always in r0
* Assumes vcpu pointer in vcpu reg
*/
.macro save_vgic_state
#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
/* Get VGIC VCTRL base into r2 */
ldr r2, [vcpu, #VCPU_KVM]
ldr r2, [r2, #KVM_VGIC_VCTRL]
Expand Down Expand Up @@ -469,7 +469,7 @@ ARM_BE8(rev r6, r6 )
* Assumes vcpu pointer in vcpu reg
*/
.macro restore_vgic_state
#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
/* Get VGIC VCTRL base into r2 */
ldr r2, [vcpu, #VCPU_KVM]
ldr r2, [r2, #KVM_VGIC_VCTRL]
Expand Down
7 changes: 4 additions & 3 deletions include/kvm/arm_vgic.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ struct vgic_params {
};

struct vgic_dist {
#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
spinlock_t lock;
bool in_kernel;
bool ready;
Expand Down Expand Up @@ -239,7 +239,7 @@ struct vgic_v3_cpu_if {
};

struct vgic_cpu {
#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
/* per IRQ to LR mapping */
u8 *vgic_irq_lr_map;

Expand Down Expand Up @@ -271,9 +271,10 @@ struct kvm_vcpu;
struct kvm_run;
struct kvm_exit_mmio;

#ifdef CONFIG_KVM_ARM_VGIC
#if defined(CONFIG_KVM_ARM_VGIC) || defined(CONFIG_KVM_ARM_VGIC_EMU)
int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write);
int kvm_vgic_hyp_init(void);
int kvm_vgic_emu_hyp_init(void);
int kvm_vgic_init(struct kvm *kvm);
int kvm_vgic_create(struct kvm *kvm);
void kvm_vgic_destroy(struct kvm *kvm);
Expand Down
Loading