13 #include <linux/bitfield.h>
14 #include <linux/bitops.h>
16 #include <asm/kvm_asm.h>
17 #include <asm/kvm_mmu.h>
28 #define VMID_MASK (~GENMASK(kvm_arm_vmid_bits - 1, 0))
29 #define VMID_FIRST_VERSION (1UL << kvm_arm_vmid_bits)
31 #define NUM_USER_VMIDS VMID_FIRST_VERSION
32 #define vmid2idx(vmid) ((vmid) & ~VMID_MASK)
33 #define idx2vmid(idx) vmid2idx(idx)
40 #define VMID_ACTIVE_INVALID VMID_FIRST_VERSION
42 #define vmid_gen_match(vmid) \
43 (!(((vmid) ^ atomic64_read(&vmid_generation)) >> kvm_arm_vmid_bits))
52 for_each_possible_cpu(cpu) {
53 vmid = atomic64_xchg_relaxed(&per_cpu(active_vmids, cpu), 0);
57 vmid = per_cpu(reserved_vmids, cpu);
59 per_cpu(reserved_vmids, cpu) = vmid;
82 for_each_possible_cpu(cpu) {
83 if (per_cpu(reserved_vmids, cpu) == vmid) {
85 per_cpu(reserved_vmids, cpu) = newvmid;
94 static u32 cur_idx = 1;
95 u64 vmid = atomic64_read(&kvm_vmid->id);
99 u64 newvmid = generation | (vmid & ~
VMID_MASK);
102 atomic64_set(&kvm_vmid->id, newvmid);
107 atomic64_set(&kvm_vmid->id, newvmid);
128 atomic64_set(&kvm_vmid->id, vmid);
141 u64 vmid, old_active_vmid;
142 bool updated =
false;
144 vmid = atomic64_read(&kvm_vmid->id);
156 old_active_vmid = atomic64_read(this_cpu_ptr(&active_vmids));
158 0 != atomic64_cmpxchg_relaxed(this_cpu_ptr(&active_vmids),
159 old_active_vmid, vmid))
162 raw_spin_lock_irqsave(&cpu_vmid_lock, flags);
165 vmid = atomic64_read(&kvm_vmid->id);
171 atomic64_set(this_cpu_ptr(&active_vmids), vmid);
172 raw_spin_unlock_irqrestore(&cpu_vmid_lock, flags);
void __kvm_flush_vm_context(void)
struct vgic_global kvm_vgic_global_state __ro_after_init
static bool check_update_reserved_vmid(u64 vmid, u64 newvmid)
unsigned int __ro_after_init kvm_arm_vmid_bits
bool kvm_arm_vmid_update(struct kvm_vmid *kvm_vmid)
void kvm_arm_vmid_clear_active(void)
static void flush_context(void)
void __init kvm_arm_vmid_alloc_free(void)
static unsigned long * vmid_map
#define VMID_ACTIVE_INVALID
static atomic64_t vmid_generation
static u64 new_vmid(struct kvm_vmid *kvm_vmid)
int __init kvm_arm_vmid_alloc_init(void)
static DEFINE_PER_CPU(atomic64_t, active_vmids)
#define vmid_gen_match(vmid)
static DEFINE_RAW_SPINLOCK(cpu_vmid_lock)
#define VMID_FIRST_VERSION