Commit 30b6ab45 authored by Marc Zyngier's avatar Marc Zyngier
Browse files

KVM: arm64: Convert vcpu sysregs_loaded_on_cpu to a state flag



The aptly named boolean 'sysregs_loaded_on_cpu' tracks whether
some of the vcpu system registers are resident on the physical
CPU when running in VHE mode.

This is obviously a flag in hidding, so let's convert it to
a state flag, since this is solely a host concern (the hypervisor
itself always knows which state we're in).

Reviewed-by: default avatarFuad Tabba <tabba@google.com>
Reviewed-by: default avatarReiji Watanabe <reijiw@google.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 781e3ae1
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -410,10 +410,6 @@ struct kvm_vcpu_arch {
	/* Additional reset state */
	struct vcpu_reset_state	reset_state;

	/* True when deferrable sysregs are loaded on the physical CPU,
	 * see kvm_vcpu_load_sysregs_vhe and kvm_vcpu_put_sysregs_vhe. */
	bool sysregs_loaded_on_cpu;

	/* Guest PV state */
	struct {
		u64 last_steal;
@@ -520,6 +516,8 @@ struct kvm_vcpu_arch {
#define ON_UNSUPPORTED_CPU	__vcpu_single_flag(sflags, BIT(2))
/* WFIT instruction trapped */
#define IN_WFIT			__vcpu_single_flag(sflags, BIT(3))
/* vcpu system registers loaded on physical CPU */
#define SYSREGS_ON_CPU		__vcpu_single_flag(sflags, BIT(4))

/* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */
#define vcpu_sve_pffr(vcpu) (kern_hyp_va((vcpu)->arch.sve_state) +	\
+2 −2
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ void kvm_vcpu_load_sysregs_vhe(struct kvm_vcpu *vcpu)
	__sysreg_restore_user_state(guest_ctxt);
	__sysreg_restore_el1_state(guest_ctxt);

	vcpu->arch.sysregs_loaded_on_cpu = true;
	vcpu_set_flag(vcpu, SYSREGS_ON_CPU);

	activate_traps_vhe_load(vcpu);
}
@@ -110,5 +110,5 @@ void kvm_vcpu_put_sysregs_vhe(struct kvm_vcpu *vcpu)
	/* Restore host user state */
	__sysreg_restore_user_state(host_ctxt);

	vcpu->arch.sysregs_loaded_on_cpu = false;
	vcpu_clear_flag(vcpu, SYSREGS_ON_CPU);
}
+2 −2
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ u64 vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, int reg)
{
	u64 val = 0x8badf00d8badf00d;

	if (vcpu->arch.sysregs_loaded_on_cpu &&
	if (vcpu_get_flag(vcpu, SYSREGS_ON_CPU) &&
	    __vcpu_read_sys_reg_from_cpu(reg, &val))
		return val;

@@ -81,7 +81,7 @@ u64 vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, int reg)

void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg)
{
	if (vcpu->arch.sysregs_loaded_on_cpu &&
	if (vcpu_get_flag(vcpu, SYSREGS_ON_CPU) &&
	    __vcpu_write_sys_reg_to_cpu(val, reg))
		return;