Skip to content

Commit

Permalink
arm64: KVM: vgic-v3: Reset LRs at boot time
Browse files Browse the repository at this point in the history
In order to let the GICv3 code be more lazy in the way it
accesses the LRs, it is necessary to start with a clean slate.

Let's reset the LRs on each CPU when the vgic is probed (which
includes a round trip to EL2...).

Reviewed-by: Christoffer Dall <[email protected]>
Signed-off-by: Marc Zyngier <[email protected]>
  • Loading branch information
Marc Zyngier committed Mar 9, 2016
1 parent 84e8b9c commit 0d98d00
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/arm64/include/asm/kvm_asm.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);

extern u64 __vgic_v3_get_ich_vtr_el2(void);
extern void __vgic_v3_init_lrs(void);

extern u32 __kvm_get_mdcr_el2(void);

Expand Down
9 changes: 9 additions & 0 deletions arch/arm64/kvm/hyp/vgic-v3-sr.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,15 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
}
}

void __hyp_text __vgic_v3_init_lrs(void)
{
int max_lr_idx = vtr_to_max_lr_idx(read_gicreg(ICH_VTR_EL2));
int i;

for (i = 0; i <= max_lr_idx; i++)
__gic_v3_set_lr(0, i);
}

static u64 __hyp_text __vgic_v3_read_ich_vtr_el2(void)
{
return read_gicreg(ICH_VTR_EL2);
Expand Down
7 changes: 7 additions & 0 deletions virt/kvm/arm/vgic-v3.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,11 @@ static const struct vgic_ops vgic_v3_ops = {

static struct vgic_params vgic_v3_params;

static void vgic_cpu_init_lrs(void *params)
{
kvm_call_hyp(__vgic_v3_init_lrs);
}

/**
* vgic_v3_probe - probe for a GICv3 compatible interrupt controller in DT
* @node: pointer to the DT node
Expand Down Expand Up @@ -284,6 +289,8 @@ int vgic_v3_probe(struct device_node *vgic_node,
kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
vcpu_res.start, vgic->maint_irq);

on_each_cpu(vgic_cpu_init_lrs, vgic, 1);

*ops = &vgic_v3_ops;
*params = vgic;

Expand Down

0 comments on commit 0d98d00

Please sign in to comment.