Skip to content

Commit

Permalink
arm64: Use __tlbi() macros in KVM code
Browse files Browse the repository at this point in the history
Refactor the KVM code to use the __tlbi macros, which will allow an errata
workaround that repeats tlbi dsb sequences to only change one location.
This is not intended to change the generated assembly and comparing before
and after vmlinux objdump shows no functional changes.

Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Christopher Covington <cov@codeaurora.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
  • Loading branch information
Christopher Covington authored and Will Deacon committed Jan 27, 2017
1 parent ea5f9d1 commit fa71531
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions arch/arm64/kvm/hyp/tlb.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/

#include <asm/kvm_hyp.h>
#include <asm/tlbflush.h>

void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
{
Expand All @@ -32,7 +33,7 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
* whole of Stage-1. Weep...
*/
ipa >>= 12;
asm volatile("tlbi ipas2e1is, %0" : : "r" (ipa));
__tlbi(ipas2e1is, ipa);

/*
* We have to ensure completion of the invalidation at Stage-2,
Expand All @@ -41,7 +42,7 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
* the Stage-1 invalidation happened first.
*/
dsb(ish);
asm volatile("tlbi vmalle1is" : : );
__tlbi(vmalle1is);
dsb(ish);
isb();

Expand All @@ -57,7 +58,7 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
write_sysreg(kvm->arch.vttbr, vttbr_el2);
isb();

asm volatile("tlbi vmalls12e1is" : : );
__tlbi(vmalls12e1is);
dsb(ish);
isb();

Expand All @@ -72,7 +73,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
write_sysreg(kvm->arch.vttbr, vttbr_el2);
isb();

asm volatile("tlbi vmalle1" : : );
__tlbi(vmalle1);
dsb(nsh);
isb();

Expand All @@ -82,7 +83,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
void __hyp_text __kvm_flush_vm_context(void)
{
dsb(ishst);
asm volatile("tlbi alle1is \n"
"ic ialluis ": : );
__tlbi(alle1is);
asm volatile("ic ialluis" : : );
dsb(ish);
}

0 comments on commit fa71531

Please sign in to comment.