Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a9b1305 authored by Marc Zyngier's avatar Marc Zyngier Committed by Christoffer Dall
Browse files

arm64: KVM: split GICv2 world switch from hyp code



Move the GICv2 world switch code into its own file, and add the
necessary indirection to the arm64 switch code.

Also introduce a new type field to the vgic_params structure.

Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 45451914
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -225,6 +225,11 @@ static inline int kvm_arch_dev_ioctl_check_extension(long ext)
	return 0;
}

static inline void vgic_arch_setup(const struct vgic_params *vgic)
{
	BUG_ON(vgic->type != VGIC_V2);
}

int kvm_perf_init(void);
int kvm_perf_teardown(void);

+4 −0
Original line number Diff line number Diff line
@@ -105,6 +105,10 @@ extern void __kvm_flush_vm_context(void);
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);

extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);

extern char __save_vgic_v2_state[];
extern char __restore_vgic_v2_state[];

#endif

#endif /* __ARM_KVM_ASM_H__ */
+21 −0
Original line number Diff line number Diff line
@@ -200,4 +200,25 @@ static inline void __cpu_init_hyp_mode(phys_addr_t boot_pgd_ptr,
		     hyp_stack_ptr, vector_ptr);
}

struct vgic_sr_vectors {
	void	*save_vgic;
	void	*restore_vgic;
};

static inline void vgic_arch_setup(const struct vgic_params *vgic)
{
	extern struct vgic_sr_vectors __vgic_sr_vectors;

	switch(vgic->type)
	{
	case VGIC_V2:
		__vgic_sr_vectors.save_vgic	= __save_vgic_v2_state;
		__vgic_sr_vectors.restore_vgic	= __restore_vgic_v2_state;
		break;

	default:
		BUG();
	}
}

#endif /* __ARM64_KVM_HOST_H__ */
+3 −0
Original line number Diff line number Diff line
@@ -129,6 +129,9 @@ int main(void)
  DEFINE(KVM_TIMER_ENABLED,	offsetof(struct kvm, arch.timer.enabled));
  DEFINE(VCPU_KVM,		offsetof(struct kvm_vcpu, kvm));
  DEFINE(VCPU_VGIC_CPU,		offsetof(struct kvm_vcpu, arch.vgic_cpu));
  DEFINE(VGIC_SAVE_FN,		offsetof(struct vgic_sr_vectors, save_vgic));
  DEFINE(VGIC_RESTORE_FN,	offsetof(struct vgic_sr_vectors, restore_vgic));
  DEFINE(VGIC_SR_VECTOR_SZ,	sizeof(struct vgic_sr_vectors));
  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));
  DEFINE(VGIC_V2_CPU_MISR,	offsetof(struct vgic_cpu, vgic_v2.vgic_misr));
+3 −1
Original line number Diff line number Diff line
@@ -19,5 +19,7 @@ kvm-$(CONFIG_KVM_ARM_HOST) += emulate.o inject_fault.o regmap.o
kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o
kvm-$(CONFIG_KVM_ARM_HOST) += guest.o reset.o sys_regs.o sys_regs_generic_v8.o

kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o $(KVM)/arm/vgic-v2.o
kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o
kvm-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2.o
kvm-$(CONFIG_KVM_ARM_VGIC) += vgic-v2-switch.o
kvm-$(CONFIG_KVM_ARM_TIMER) += $(KVM)/arm/arch_timer.o
Loading