diff options
author | Vladimir Murzin <vladimir.murzin@arm.com> | 2015-11-16 06:28:18 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2015-12-18 05:15:12 -0500 |
commit | 20475f784d29991b3b843c80c38a36f2ebb35ac4 (patch) | |
tree | fce9116aeb5f04122e323a240daeb5a018feb360 /arch/arm/kvm | |
parent | 8420dcd37ef34040c8fc5a27bf66887b3b2faf80 (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.c | 10 |
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 */ |
61 | static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); | 61 | static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); |
62 | static u8 kvm_next_vmid; | 62 | static u32 kvm_next_vmid; |
63 | static unsigned int kvm_vmid_bits __read_mostly; | ||
63 | static DEFINE_SPINLOCK(kvm_vmid_lock); | 64 | static DEFINE_SPINLOCK(kvm_vmid_lock); |
64 | 65 | ||
65 | static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu) | 66 | static 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; |