2016-01-02 15:09:54 +00:00
/*
* Original code :
* Copyright ( C ) 2012 - Virtual Open Systems and Columbia University
* Author : Christoffer Dall < c . dall @ virtualopensystems . com >
*
* Mostly rewritten in C by Marc Zyngier < marc . zyngier @ arm . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2016-01-28 14:31:37 +00:00
# include <asm/kvm_hyp.h>
2016-01-02 15:09:54 +00:00
/**
* Flush per - VMID TLBs
*
* __kvm_tlb_flush_vmid ( struct kvm * kvm ) ;
*
* We rely on the hardware to broadcast the TLB invalidation to all CPUs
* inside the inner - shareable domain ( which is the case for all v7
* implementations ) . If we come across a non - IS SMP implementation , we ' ll
* have to use an IPI based mechanism . Until then , we stick to the simple
* hardware assisted version .
*
* As v7 does not support flushing per IPA , just nuke the whole TLB
* instead , ignoring the ipa value .
*/
2016-09-01 13:16:03 +02:00
void __hyp_text __kvm_tlb_flush_vmid ( struct kvm * kvm )
2016-01-02 15:09:54 +00:00
{
dsb ( ishst ) ;
/* Switch to requested VMID */
kvm = kern_hyp_va ( kvm ) ;
write_sysreg ( kvm - > arch . vttbr , VTTBR ) ;
isb ( ) ;
write_sysreg ( 0 , TLBIALLIS ) ;
dsb ( ish ) ;
isb ( ) ;
write_sysreg ( 0 , VTTBR ) ;
}
2016-09-01 13:16:03 +02:00
void __hyp_text __kvm_tlb_flush_vmid_ipa ( struct kvm * kvm , phys_addr_t ipa )
2016-01-02 15:09:54 +00:00
{
2016-09-01 13:16:03 +02:00
__kvm_tlb_flush_vmid ( kvm ) ;
2016-01-02 15:09:54 +00:00
}
2016-09-01 13:16:03 +02:00
void __hyp_text __kvm_flush_vm_context ( void )
2016-01-02 15:09:54 +00:00
{
write_sysreg ( 0 , TLBIALLNSNHIS ) ;
write_sysreg ( 0 , ICIALLUIS ) ;
dsb ( ish ) ;
}