diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2016-02-17 05:25:05 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-02-24 12:25:58 -0500 |
commit | fd451b90e78c4178bcfc5072f2b2b637500c109a (patch) | |
tree | 301f738e1831bcd7d2c49099e4177da621cf19a7 /arch/arm64/kvm | |
parent | 1d6a821277aaa0cdd666278aaff93298df313d41 (diff) |
arm64: KVM: vgic-v3: Restore ICH_APR0Rn_EL2 before ICH_APR1Rn_EL2
The GICv3 architecture spec says:
Writing to the active priority registers in any order other than
the following order will result in UNPREDICTABLE behavior:
- ICH_AP0R<n>_EL2.
- ICH_AP1R<n>_EL2.
So let's not pointlessly go against the rule...
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'arch/arm64/kvm')
-rw-r--r-- | arch/arm64/kvm/hyp/vgic-v3-sr.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c index 9142e082f5f3..5dd2a26444ec 100644 --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c | |||
@@ -149,16 +149,6 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu) | |||
149 | 149 | ||
150 | switch (nr_pri_bits) { | 150 | switch (nr_pri_bits) { |
151 | case 7: | 151 | case 7: |
152 | write_gicreg(cpu_if->vgic_ap1r[3], ICH_AP1R3_EL2); | ||
153 | write_gicreg(cpu_if->vgic_ap1r[2], ICH_AP1R2_EL2); | ||
154 | case 6: | ||
155 | write_gicreg(cpu_if->vgic_ap1r[1], ICH_AP1R1_EL2); | ||
156 | default: | ||
157 | write_gicreg(cpu_if->vgic_ap1r[0], ICH_AP1R0_EL2); | ||
158 | } | ||
159 | |||
160 | switch (nr_pri_bits) { | ||
161 | case 7: | ||
162 | write_gicreg(cpu_if->vgic_ap0r[3], ICH_AP0R3_EL2); | 152 | write_gicreg(cpu_if->vgic_ap0r[3], ICH_AP0R3_EL2); |
163 | write_gicreg(cpu_if->vgic_ap0r[2], ICH_AP0R2_EL2); | 153 | write_gicreg(cpu_if->vgic_ap0r[2], ICH_AP0R2_EL2); |
164 | case 6: | 154 | case 6: |
@@ -167,6 +157,16 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu) | |||
167 | write_gicreg(cpu_if->vgic_ap0r[0], ICH_AP0R0_EL2); | 157 | write_gicreg(cpu_if->vgic_ap0r[0], ICH_AP0R0_EL2); |
168 | } | 158 | } |
169 | 159 | ||
160 | switch (nr_pri_bits) { | ||
161 | case 7: | ||
162 | write_gicreg(cpu_if->vgic_ap1r[3], ICH_AP1R3_EL2); | ||
163 | write_gicreg(cpu_if->vgic_ap1r[2], ICH_AP1R2_EL2); | ||
164 | case 6: | ||
165 | write_gicreg(cpu_if->vgic_ap1r[1], ICH_AP1R1_EL2); | ||
166 | default: | ||
167 | write_gicreg(cpu_if->vgic_ap1r[0], ICH_AP1R0_EL2); | ||
168 | } | ||
169 | |||
170 | switch (max_lr_idx) { | 170 | switch (max_lr_idx) { |
171 | case 15: | 171 | case 15: |
172 | write_gicreg(cpu_if->vgic_lr[VGIC_V3_LR_INDEX(15)], ICH_LR15_EL2); | 172 | write_gicreg(cpu_if->vgic_lr[VGIC_V3_LR_INDEX(15)], ICH_LR15_EL2); |