Skip to content

Commit

Permalink
KVM: arm/arm64: vgic-v2: Move GICH_ELRSR saving to its own function
Browse files Browse the repository at this point in the history
In order to make the saving path slightly more readable and
prepare for some more optimizations, let's move the GICH_ELRSR
saving to its own function.

No functional change.

Reviewed-by: Christoffer Dall <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
  • Loading branch information
Marc Zyngier committed Mar 9, 2016
1 parent c813bb1 commit 2a1044f
Showing 1 changed file with 21 additions and 15 deletions.
36 changes: 21 additions & 15 deletions virt/kvm/arm/hyp/vgic-v2-sr.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,32 @@ static void __hyp_text save_maint_int_state(struct kvm_vcpu *vcpu,
#endif
}

static void __hyp_text save_elrsr(struct kvm_vcpu *vcpu, void __iomem *base)
{
struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
int nr_lr = vcpu->arch.vgic_cpu.nr_lr;
u32 elrsr0, elrsr1;

elrsr0 = readl_relaxed(base + GICH_ELRSR0);
if (unlikely(nr_lr > 32))
elrsr1 = readl_relaxed(base + GICH_ELRSR1);
else
elrsr1 = 0;

#ifdef CONFIG_CPU_BIG_ENDIAN
cpu_if->vgic_elrsr = ((u64)elrsr0 << 32) | elrsr1;
#else
cpu_if->vgic_elrsr = ((u64)elrsr1 << 32) | elrsr0;
#endif
}

/* vcpu is already in the HYP VA space */
void __hyp_text __vgic_v2_save_state(struct kvm_vcpu *vcpu)
{
struct kvm *kvm = kern_hyp_va(vcpu->kvm);
struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2;
struct vgic_dist *vgic = &kvm->arch.vgic;
void __iomem *base = kern_hyp_va(vgic->vctrl_base);
u32 elrsr0, elrsr1;
int i, nr_lr;

if (!base)
Expand All @@ -81,22 +99,10 @@ void __hyp_text __vgic_v2_save_state(struct kvm_vcpu *vcpu)
cpu_if->vgic_vmcr = readl_relaxed(base + GICH_VMCR);

if (vcpu->arch.vgic_cpu.live_lrs) {
elrsr0 = readl_relaxed(base + GICH_ELRSR0);
cpu_if->vgic_apr = readl_relaxed(base + GICH_APR);

if (unlikely(nr_lr > 32)) {
elrsr1 = readl_relaxed(base + GICH_ELRSR1);
} else {
elrsr1 = 0;
}

#ifdef CONFIG_CPU_BIG_ENDIAN
cpu_if->vgic_elrsr = ((u64)elrsr0 << 32) | elrsr1;
#else
cpu_if->vgic_elrsr = ((u64)elrsr1 << 32) | elrsr0;
#endif
cpu_if->vgic_apr = readl_relaxed(base + GICH_APR);

save_maint_int_state(vcpu, base);
save_elrsr(vcpu, base);

for (i = 0; i < nr_lr; i++)
if (vcpu->arch.vgic_cpu.live_lrs & (1UL << i))
Expand Down

0 comments on commit 2a1044f

Please sign in to comment.