diff options
author | Marc Zyngier <Marc.Zyngier@arm.com> | 2013-11-05 13:29:46 -0500 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2013-11-06 05:10:12 -0500 |
commit | c5b2c0f5203b3bc678a8967daedf7114029975ae (patch) | |
tree | f4dcca6fb18d3bfd81dbcf00e417599f8ed99c1b /arch/arm64/kvm | |
parent | 18ea3dbc9e5c8a53a361b17c4a5676ea6f4bcb72 (diff) |
arm64: KVM: vgic: byteswap GICv2 access on world switch if BE
Ensure that accesses to the GICH_* registers are byteswapped
when the kernel is compiled as big-endian.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/kvm')
-rw-r--r-- | arch/arm64/kvm/hyp.S | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S index 1ac0bbbdddb2..3b47c36e10ff 100644 --- a/arch/arm64/kvm/hyp.S +++ b/arch/arm64/kvm/hyp.S | |||
@@ -403,6 +403,14 @@ __kvm_hyp_code_start: | |||
403 | ldr w9, [x2, #GICH_ELRSR0] | 403 | ldr w9, [x2, #GICH_ELRSR0] |
404 | ldr w10, [x2, #GICH_ELRSR1] | 404 | ldr w10, [x2, #GICH_ELRSR1] |
405 | ldr w11, [x2, #GICH_APR] | 405 | ldr w11, [x2, #GICH_APR] |
406 | CPU_BE( rev w4, w4 ) | ||
407 | CPU_BE( rev w5, w5 ) | ||
408 | CPU_BE( rev w6, w6 ) | ||
409 | CPU_BE( rev w7, w7 ) | ||
410 | CPU_BE( rev w8, w8 ) | ||
411 | CPU_BE( rev w9, w9 ) | ||
412 | CPU_BE( rev w10, w10 ) | ||
413 | CPU_BE( rev w11, w11 ) | ||
406 | 414 | ||
407 | str w4, [x3, #VGIC_CPU_HCR] | 415 | str w4, [x3, #VGIC_CPU_HCR] |
408 | str w5, [x3, #VGIC_CPU_VMCR] | 416 | str w5, [x3, #VGIC_CPU_VMCR] |
@@ -421,6 +429,7 @@ __kvm_hyp_code_start: | |||
421 | ldr w4, [x3, #VGIC_CPU_NR_LR] | 429 | ldr w4, [x3, #VGIC_CPU_NR_LR] |
422 | add x3, x3, #VGIC_CPU_LR | 430 | add x3, x3, #VGIC_CPU_LR |
423 | 1: ldr w5, [x2], #4 | 431 | 1: ldr w5, [x2], #4 |
432 | CPU_BE( rev w5, w5 ) | ||
424 | str w5, [x3], #4 | 433 | str w5, [x3], #4 |
425 | sub w4, w4, #1 | 434 | sub w4, w4, #1 |
426 | cbnz w4, 1b | 435 | cbnz w4, 1b |
@@ -446,6 +455,9 @@ __kvm_hyp_code_start: | |||
446 | ldr w4, [x3, #VGIC_CPU_HCR] | 455 | ldr w4, [x3, #VGIC_CPU_HCR] |
447 | ldr w5, [x3, #VGIC_CPU_VMCR] | 456 | ldr w5, [x3, #VGIC_CPU_VMCR] |
448 | ldr w6, [x3, #VGIC_CPU_APR] | 457 | ldr w6, [x3, #VGIC_CPU_APR] |
458 | CPU_BE( rev w4, w4 ) | ||
459 | CPU_BE( rev w5, w5 ) | ||
460 | CPU_BE( rev w6, w6 ) | ||
449 | 461 | ||
450 | str w4, [x2, #GICH_HCR] | 462 | str w4, [x2, #GICH_HCR] |
451 | str w5, [x2, #GICH_VMCR] | 463 | str w5, [x2, #GICH_VMCR] |
@@ -456,6 +468,7 @@ __kvm_hyp_code_start: | |||
456 | ldr w4, [x3, #VGIC_CPU_NR_LR] | 468 | ldr w4, [x3, #VGIC_CPU_NR_LR] |
457 | add x3, x3, #VGIC_CPU_LR | 469 | add x3, x3, #VGIC_CPU_LR |
458 | 1: ldr w5, [x3], #4 | 470 | 1: ldr w5, [x3], #4 |
471 | CPU_BE( rev w5, w5 ) | ||
459 | str w5, [x2], #4 | 472 | str w5, [x2], #4 |
460 | sub w4, w4, #1 | 473 | sub w4, w4, #1 |
461 | cbnz w4, 1b | 474 | cbnz w4, 1b |