From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 03/14] ARM: KVM: handle 64bit values passed to mrcc or from mcrr instructions in BE case
Date: Tue, 27 May 2014 15:30:53 +0100 [thread overview]
Message-ID: <5384A19D.1030205@arm.com> (raw)
In-Reply-To: <1399997646-4716-4-git-send-email-victor.kamensky@linaro.org>
On 13/05/14 17:13, Victor Kamensky wrote:
> In some cases the mcrr and mrrc instructions in combination with the ldrd
> and strd instructions need to deal with 64bit value in memory. The ldrd
> and strd instructions already handle endianness within word (register)
> boundaries but to get effect of the whole 64bit value represented correctly,
> rr_lo_hi macro is introduced and is used to swap registers positions when
> the mcrr and mrrc instructions are used. That has the effect of swapping
> two words.
>
> Signed-off-by: Victor Kamensky <victor.kamensky@linaro.org>
> ---
> arch/arm/include/asm/kvm_asm.h | 18 ++++++++++++++++++
> arch/arm/kvm/init.S | 4 ++--
> arch/arm/kvm/interrupts.S | 4 ++--
> arch/arm/kvm/interrupts_head.S | 6 +++---
> 4 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
> index 53b3c4a..3a67bec 100644
> --- a/arch/arm/include/asm/kvm_asm.h
> +++ b/arch/arm/include/asm/kvm_asm.h
> @@ -61,6 +61,24 @@
> #define ARM_EXCEPTION_FIQ 6
> #define ARM_EXCEPTION_HVC 7
>
> +/*
> + * The rr_lo_hi macro swaps a pair of registers depending on
> + * current endianness. It is used in conjunction with ldrd and strd
> + * instructions that load/store a 64-bit value from/to memory to/from
> + * a pair of registers which are used with the mrrc and mcrr instructions.
> + * If used with the ldrd/strd instructions, the a1 parameter is the first
> + * source/destination register and the a2 parameter is the second
> + * source/destination register. Note that the ldrd/strd instructions
> + * already swap the bytes within the words correctly according to the
> + * endianness setting, but the order of the registers need to be effectively
> + * swapped when used with the mrrc/mcrr instructions.
> + */
> +#ifdef CONFIG_CPU_ENDIAN_BE8
> +#define rr_lo_hi(a1, a2) a2, a1
> +#else
> +#define rr_lo_hi(a1, a2) a1, a2
> +#endif
> +
> #ifndef __ASSEMBLY__
> struct kvm;
> struct kvm_vcpu;
> diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
> index 74f0718..2d10b2d 100644
> --- a/arch/arm/kvm/init.S
> +++ b/arch/arm/kvm/init.S
> @@ -74,7 +74,7 @@ __do_hyp_init:
> ARM_BE8(setend be) @ Switch to Big Endian mode if needed
>
> @ Set the HTTBR to point to the hypervisor PGD pointer passed
> - mcrr p15, 4, r2, r3, c2
> + mcrr p15, 4, rr_lo_hi(r2, r3), c2
>
> @ Set the HTCR and VTCR to the same shareability and cacheability
> @ settings as the non-secure TTBCR and with T0SZ == 0.
> @@ -140,7 +140,7 @@ phase2:
> mov pc, r0
>
> target: @ We're now in the trampoline code, switch page tables
> - mcrr p15, 4, r2, r3, c2
> + mcrr p15, 4, rr_lo_hi(r2, r3), c2
> isb
>
> @ Invalidate the old TLBs
> diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
> index 0d68d40..24d4e65 100644
> --- a/arch/arm/kvm/interrupts.S
> +++ b/arch/arm/kvm/interrupts.S
> @@ -52,7 +52,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
> dsb ishst
> add r0, r0, #KVM_VTTBR
> ldrd r2, r3, [r0]
> - mcrr p15, 6, r2, r3, c2 @ Write VTTBR
> + mcrr p15, 6, rr_lo_hi(r2, r3), c2 @ Write VTTBR
> isb
> mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored)
> dsb ish
> @@ -135,7 +135,7 @@ ENTRY(__kvm_vcpu_run)
> ldr r1, [vcpu, #VCPU_KVM]
> add r1, r1, #KVM_VTTBR
> ldrd r2, r3, [r1]
> - mcrr p15, 6, r2, r3, c2 @ Write VTTBR
> + mcrr p15, 6, rr_lo_hi(r2, r3), c2 @ Write VTTBR
>
> @ We're all done, just restore the GPRs and go to the guest
> restore_guest_regs
> diff --git a/arch/arm/kvm/interrupts_head.S b/arch/arm/kvm/interrupts_head.S
> index e627858..104977f 100644
> --- a/arch/arm/kvm/interrupts_head.S
> +++ b/arch/arm/kvm/interrupts_head.S
> @@ -520,7 +520,7 @@ ARM_BE8(rev r6, r6 )
> mcr p15, 0, r2, c14, c3, 1 @ CNTV_CTL
> isb
>
> - mrrc p15, 3, r2, r3, c14 @ CNTV_CVAL
> + mrrc p15, 3, rr_lo_hi(r2, r3), c14 @ CNTV_CVAL
> ldr r4, =VCPU_TIMER_CNTV_CVAL
> add r5, vcpu, r4
> strd r2, r3, [r5]
> @@ -560,12 +560,12 @@ ARM_BE8(rev r6, r6 )
>
> ldr r2, [r4, #KVM_TIMER_CNTVOFF]
> ldr r3, [r4, #(KVM_TIMER_CNTVOFF + 4)]
> - mcrr p15, 4, r2, r3, c14 @ CNTVOFF
> + mcrr p15, 4, rr_lo_hi(r2, r3), c14 @ CNTVOFF
>
> ldr r4, =VCPU_TIMER_CNTV_CVAL
> add r5, vcpu, r4
> ldrd r2, r3, [r5]
> - mcrr p15, 3, r2, r3, c14 @ CNTV_CVAL
> + mcrr p15, 3, rr_lo_hi(r2, r3), c14 @ CNTV_CVAL
> isb
>
> ldr r2, [vcpu, #VCPU_TIMER_CNTV_CTL]
>
As much as I hate the macro, I can't find a better solution. As such:
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
M.
--
Jazz is not dead. It just smells funny...
next prev parent reply other threads:[~2014-05-27 14:30 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-13 16:13 [PATCH v3 00/14] ARM/ARM64: KVM: big endian host support Victor Kamensky
2014-05-13 16:13 ` [PATCH v3 01/14] ARM: KVM: switch hypervisor into BE mode in case of BE host Victor Kamensky
2014-05-27 14:23 ` Marc Zyngier
2014-05-13 16:13 ` [PATCH v3 02/14] ARM: KVM: fix vgic V7 assembler code to work in BE image Victor Kamensky
2014-05-27 14:24 ` Marc Zyngier
2014-05-13 16:13 ` [PATCH v3 03/14] ARM: KVM: handle 64bit values passed to mrcc or from mcrr instructions in BE case Victor Kamensky
2014-05-26 15:28 ` Christoffer Dall
2014-05-28 6:09 ` Victor Kamensky
2014-05-27 14:30 ` Marc Zyngier [this message]
2014-05-13 16:13 ` [PATCH v3 04/14] ARM: KVM: __kvm_vcpu_run function return result fix " Victor Kamensky
2014-05-27 15:02 ` Marc Zyngier
2014-05-28 6:10 ` Victor Kamensky
2014-05-13 16:13 ` [PATCH v3 05/14] ARM: KVM: vgic mmio should hold data as LE bytes array " Victor Kamensky
2014-05-27 15:07 ` Marc Zyngier
2014-05-13 16:13 ` [PATCH v3 06/14] ARM: KVM: MMIO support BE host running LE code Victor Kamensky
2014-05-27 15:49 ` Marc Zyngier
2014-05-13 16:13 ` [PATCH v3 07/14] ARM: KVM: one_reg coproc set and get BE fixes Victor Kamensky
2014-05-25 19:14 ` Christoffer Dall
2014-05-28 6:19 ` Victor Kamensky
2014-05-28 8:03 ` Christoffer Dall
2014-05-27 18:22 ` Marc Zyngier
2014-05-28 6:23 ` Victor Kamensky
2014-05-13 16:14 ` [PATCH v3 08/14] ARM: KVM: enable KVM in Kconfig on big-endian systems Victor Kamensky
2014-05-13 16:14 ` [PATCH v3 09/14] ARM64: KVM: MMIO support BE host running LE code Victor Kamensky
2014-05-27 18:25 ` Marc Zyngier
2014-05-13 16:14 ` [PATCH v3 10/14] ARM64: KVM: store kvm_vcpu_fault_info est_el2 as word Victor Kamensky
2014-05-27 18:34 ` Marc Zyngier
2014-05-13 16:14 ` [PATCH v3 11/14] ARM64: KVM: fix vgic_bitmap_get_reg function for BE 64bit case Victor Kamensky
2014-05-26 15:49 ` Christoffer Dall
2014-05-13 16:14 ` [PATCH v3 12/14] ARM64: KVM: vgic_elrsr and vgic_eisr need to be byteswapped in BE case Victor Kamensky
2014-05-26 17:35 ` Christoffer Dall
2014-05-27 19:11 ` Marc Zyngier
2014-05-13 16:14 ` [PATCH v3 13/14] ARM64: KVM: set and get of sys registers " Victor Kamensky
2014-05-14 8:45 ` Marc Zyngier
2014-05-14 14:18 ` Victor Kamensky
2014-05-25 18:26 ` Christoffer Dall
2014-05-13 16:14 ` [PATCH v3 14/14] ARM64: KVM: fix big endian issue in access_vm_reg for 32bit guest Victor Kamensky
2014-05-26 17:52 ` Christoffer Dall
2014-05-28 6:11 ` Victor Kamensky
2014-05-28 9:14 ` Christoffer Dall
2014-05-28 13:56 ` Victor Kamensky
2014-05-28 14:09 ` Christoffer Dall
2014-05-28 14:20 ` Marc Zyngier
2014-05-26 15:49 ` [PATCH v3 00/14] ARM/ARM64: KVM: big endian host support Christoffer Dall
2014-05-28 6:31 ` Victor Kamensky
2014-05-28 8:12 ` Christoffer Dall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5384A19D.1030205@arm.com \
--to=marc.zyngier@arm.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).