diff options
author | Victor Kamensky <victor.kamensky@linaro.org> | 2014-06-12 12:30:01 -0400 |
---|---|---|
committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-07-11 07:57:38 -0400 |
commit | 64054c25cf7e060cd6780744fefe7ed3990e4f21 (patch) | |
tree | 90cb733124a81f393f6caab5209d91b64ccba0e1 | |
parent | af92394efc8be73edd2301fc15f9b57fd430cd18 (diff) |
ARM: KVM: fix vgic V7 assembler code to work in BE image
The vgic h/w registers are little endian; when BE asm code
reads/writes from/to them, it needs to do byteswap after/before.
Byteswap code uses ARM_BE8 wrapper to add swap only if
CONFIG_CPU_BIG_ENDIAN is configured.
Signed-off-by: Victor Kamensky <victor.kamensky@linaro.org>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r-- | arch/arm/kvm/interrupts_head.S | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S index e4eaf30205c5..68d99c69639c 100644 --- a/arch/arm/kvm/interrupts_head.S +++ b/arch/arm/kvm/interrupts_head.S | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/irqchip/arm-gic.h> | 1 | #include <linux/irqchip/arm-gic.h> |
2 | #include <asm/assembler.h> | ||
2 | 3 | ||
3 | #define VCPU_USR_REG(_reg_nr) (VCPU_USR_REGS + (_reg_nr * 4)) | 4 | #define VCPU_USR_REG(_reg_nr) (VCPU_USR_REGS + (_reg_nr * 4)) |
4 | #define VCPU_USR_SP (VCPU_USR_REG(13)) | 5 | #define VCPU_USR_SP (VCPU_USR_REG(13)) |
@@ -420,6 +421,14 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
420 | ldr r8, [r2, #GICH_ELRSR0] | 421 | ldr r8, [r2, #GICH_ELRSR0] |
421 | ldr r9, [r2, #GICH_ELRSR1] | 422 | ldr r9, [r2, #GICH_ELRSR1] |
422 | ldr r10, [r2, #GICH_APR] | 423 | ldr r10, [r2, #GICH_APR] |
424 | ARM_BE8(rev r3, r3 ) | ||
425 | ARM_BE8(rev r4, r4 ) | ||
426 | ARM_BE8(rev r5, r5 ) | ||
427 | ARM_BE8(rev r6, r6 ) | ||
428 | ARM_BE8(rev r7, r7 ) | ||
429 | ARM_BE8(rev r8, r8 ) | ||
430 | ARM_BE8(rev r9, r9 ) | ||
431 | ARM_BE8(rev r10, r10 ) | ||
423 | 432 | ||
424 | str r3, [r11, #VGIC_V2_CPU_HCR] | 433 | str r3, [r11, #VGIC_V2_CPU_HCR] |
425 | str r4, [r11, #VGIC_V2_CPU_VMCR] | 434 | str r4, [r11, #VGIC_V2_CPU_VMCR] |
@@ -439,6 +448,7 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
439 | add r3, r11, #VGIC_V2_CPU_LR | 448 | add r3, r11, #VGIC_V2_CPU_LR |
440 | ldr r4, [r11, #VGIC_CPU_NR_LR] | 449 | ldr r4, [r11, #VGIC_CPU_NR_LR] |
441 | 1: ldr r6, [r2], #4 | 450 | 1: ldr r6, [r2], #4 |
451 | ARM_BE8(rev r6, r6 ) | ||
442 | str r6, [r3], #4 | 452 | str r6, [r3], #4 |
443 | subs r4, r4, #1 | 453 | subs r4, r4, #1 |
444 | bne 1b | 454 | bne 1b |
@@ -466,6 +476,9 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
466 | ldr r3, [r11, #VGIC_V2_CPU_HCR] | 476 | ldr r3, [r11, #VGIC_V2_CPU_HCR] |
467 | ldr r4, [r11, #VGIC_V2_CPU_VMCR] | 477 | ldr r4, [r11, #VGIC_V2_CPU_VMCR] |
468 | ldr r8, [r11, #VGIC_V2_CPU_APR] | 478 | ldr r8, [r11, #VGIC_V2_CPU_APR] |
479 | ARM_BE8(rev r3, r3 ) | ||
480 | ARM_BE8(rev r4, r4 ) | ||
481 | ARM_BE8(rev r8, r8 ) | ||
469 | 482 | ||
470 | str r3, [r2, #GICH_HCR] | 483 | str r3, [r2, #GICH_HCR] |
471 | str r4, [r2, #GICH_VMCR] | 484 | str r4, [r2, #GICH_VMCR] |
@@ -476,6 +489,7 @@ vcpu .req r0 @ vcpu pointer always in r0 | |||
476 | add r3, r11, #VGIC_V2_CPU_LR | 489 | add r3, r11, #VGIC_V2_CPU_LR |
477 | ldr r4, [r11, #VGIC_CPU_NR_LR] | 490 | ldr r4, [r11, #VGIC_CPU_NR_LR] |
478 | 1: ldr r6, [r3], #4 | 491 | 1: ldr r6, [r3], #4 |
492 | ARM_BE8(rev r6, r6 ) | ||
479 | str r6, [r2], #4 | 493 | str r6, [r2], #4 |
480 | subs r4, r4, #1 | 494 | subs r4, r4, #1 |
481 | bne 1b | 495 | bne 1b |