aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm
diff options
context:
space:
mode:
authorVladimir Murzin <vladimir.murzin@arm.com>2015-11-16 06:28:18 -0500
committerMarc Zyngier <marc.zyngier@arm.com>2015-12-18 05:15:12 -0500
commit20475f784d29991b3b843c80c38a36f2ebb35ac4 (patch)
treefce9116aeb5f04122e323a240daeb5a018feb360 /arch/arm/kvm
parent8420dcd37ef34040c8fc5a27bf66887b3b2faf80 (diff)
arm64: KVM: Add support for 16-bit VMID
The ARMv8.1 architecture extension allows to choose between 8-bit and 16-bit of VMID, so use this capability for KVM. Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Vladimir Murzin <vladimir.murzin@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r--arch/arm/kvm/arm.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 6e35d1d7893e..f6bcc2e4a133 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -59,7 +59,8 @@ static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu);
59 59
60/* The VMID used in the VTTBR */ 60/* The VMID used in the VTTBR */
61static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); 61static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
62static u8 kvm_next_vmid; 62static u32 kvm_next_vmid;
63static unsigned int kvm_vmid_bits __read_mostly;
63static DEFINE_SPINLOCK(kvm_vmid_lock); 64static DEFINE_SPINLOCK(kvm_vmid_lock);
64 65
65static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu) 66static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu)
@@ -434,11 +435,12 @@ static void update_vttbr(struct kvm *kvm)
434 kvm->arch.vmid_gen = atomic64_read(&kvm_vmid_gen); 435 kvm->arch.vmid_gen = atomic64_read(&kvm_vmid_gen);
435 kvm->arch.vmid = kvm_next_vmid; 436 kvm->arch.vmid = kvm_next_vmid;
436 kvm_next_vmid++; 437 kvm_next_vmid++;
438 kvm_next_vmid &= (1 << kvm_vmid_bits) - 1;
437 439
438 /* update vttbr to be used with the new vmid */ 440 /* update vttbr to be used with the new vmid */
439 pgd_phys = virt_to_phys(kvm_get_hwpgd(kvm)); 441 pgd_phys = virt_to_phys(kvm_get_hwpgd(kvm));
440 BUG_ON(pgd_phys & ~VTTBR_BADDR_MASK); 442 BUG_ON(pgd_phys & ~VTTBR_BADDR_MASK);
441 vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK; 443 vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK(kvm_vmid_bits);
442 kvm->arch.vttbr = pgd_phys | vmid; 444 kvm->arch.vttbr = pgd_phys | vmid;
443 445
444 spin_unlock(&kvm_vmid_lock); 446 spin_unlock(&kvm_vmid_lock);
@@ -1135,6 +1137,10 @@ static int init_hyp_mode(void)
1135 1137
1136 kvm_perf_init(); 1138 kvm_perf_init();
1137 1139
1140 /* set size of VMID supported by CPU */
1141 kvm_vmid_bits = kvm_get_vmid_bits();
1142 kvm_info("%d-bit VMID\n", kvm_vmid_bits);
1143
1138 kvm_info("Hyp mode initialized successfully\n"); 1144 kvm_info("Hyp mode initialized successfully\n");
1139 1145
1140 return 0; 1146 return 0;