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

Commit 32f13955 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

arm/arm64: KVM: Statically configure the host's view of MPIDR



We currently eagerly save/restore MPIDR. It turns out to be
slightly pointless:
- On the host, this value is known as soon as we're scheduled on a
  physical CPU
- In the guest, this value cannot change, as it is set by KVM
  (and this is a read-only register)

The result of the above is that we can perfectly avoid the eager
saving of MPIDR_EL1, and only keep the restore. We just have
to setup the host contexts appropriately at boot time.

Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@arm.com>
Signed-off-by: default avatarChristoffer Dall <christoffer.dall@arm.com>
parent d18232ea
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <asm/kvm_asm.h>
#include <asm/kvm_mmio.h>
#include <asm/fpstate.h>
#include <asm/smp_plat.h>
#include <kvm/arm_arch_timer.h>

#define __KVM_HAVE_ARCH_INTC_INITIALIZED
@@ -147,6 +148,13 @@ struct kvm_cpu_context {

typedef struct kvm_cpu_context kvm_cpu_context_t;

static inline void kvm_init_host_cpu_context(kvm_cpu_context_t *cpu_ctxt,
					     int cpu)
{
	/* The host's MPIDR is immutable, so let's set it up at boot time */
	cpu_ctxt->cp15[c0_MPIDR] = cpu_logical_map(cpu);
}

struct kvm_vcpu_arch {
	struct kvm_cpu_context ctxt;

+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ static u64 *cp15_64(struct kvm_cpu_context *ctxt, int idx)

void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
{
	ctxt->cp15[c0_MPIDR]		= read_sysreg(VMPIDR);
	ctxt->cp15[c0_CSSELR]		= read_sysreg(CSSELR);
	ctxt->cp15[c1_SCTLR]		= read_sysreg(SCTLR);
	ctxt->cp15[c1_CPACR]		= read_sysreg(CPACR);
+8 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <asm/kvm.h>
#include <asm/kvm_asm.h>
#include <asm/kvm_mmio.h>
#include <asm/smp_plat.h>
#include <asm/thread_info.h>

#define __KVM_HAVE_ARCH_INTC_INITIALIZED
@@ -418,6 +419,13 @@ struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr);

DECLARE_PER_CPU(kvm_cpu_context_t, kvm_host_cpu_state);

static inline void kvm_init_host_cpu_context(kvm_cpu_context_t *cpu_ctxt,
					     int cpu)
{
	/* The host's MPIDR is immutable, so let's set it up at boot time */
	cpu_ctxt->sys_regs[MPIDR_EL1] = cpu_logical_map(cpu);
}

void __kvm_enable_ssbs(void);

static inline void __cpu_init_hyp_mode(phys_addr_t pgd_ptr,
+0 −1
Original line number Diff line number Diff line
@@ -52,7 +52,6 @@ static void __hyp_text __sysreg_save_user_state(struct kvm_cpu_context *ctxt)

static void __hyp_text __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
{
	ctxt->sys_regs[MPIDR_EL1]	= read_sysreg(vmpidr_el2);
	ctxt->sys_regs[CSSELR_EL1]	= read_sysreg(csselr_el1);
	ctxt->sys_regs[SCTLR_EL1]	= read_sysreg_el1(sctlr);
	ctxt->sys_regs[ACTLR_EL1]	= read_sysreg(actlr_el1);
+1 −0
Original line number Diff line number Diff line
@@ -1561,6 +1561,7 @@ static int init_hyp_mode(void)
		kvm_cpu_context_t *cpu_ctxt;

		cpu_ctxt = per_cpu_ptr(&kvm_host_cpu_state, cpu);
		kvm_init_host_cpu_context(cpu_ctxt, cpu);
		err = create_hyp_mappings(cpu_ctxt, cpu_ctxt + 1, PAGE_HYP);

		if (err) {