15 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 #include <linux/kvm_types.h>
18 #include <linux/hashtable.h>
19 #include <linux/amd-iommu.h>
20 #include <linux/kvm_host.h>
22 #include <asm/irq_remapping.h>
41 #define AVIC_VCPU_ID_MASK AVIC_PHYSICAL_MAX_INDEX_MASK
43 #define AVIC_VM_ID_SHIFT HWEIGHT32(AVIC_PHYSICAL_MAX_INDEX_MASK)
44 #define AVIC_VM_ID_MASK (GENMASK(31, AVIC_VM_ID_SHIFT) >> AVIC_VM_ID_SHIFT)
46 #define AVIC_GATAG_TO_VMID(x) ((x >> AVIC_VM_ID_SHIFT) & AVIC_VM_ID_MASK)
47 #define AVIC_GATAG_TO_VCPUID(x) (x & AVIC_VCPU_ID_MASK)
49 #define __AVIC_GATAG(vm_id, vcpu_id) ((((vm_id) & AVIC_VM_ID_MASK) << AVIC_VM_ID_SHIFT) | \
50 ((vcpu_id) & AVIC_VCPU_ID_MASK))
51 #define AVIC_GATAG(vm_id, vcpu_id) \
53 u32 ga_tag = __AVIC_GATAG(vm_id, vcpu_id); \
55 WARN_ON_ONCE(AVIC_GATAG_TO_VCPUID(ga_tag) != (vcpu_id)); \
56 WARN_ON_ONCE(AVIC_GATAG_TO_VMID(ga_tag) != (vm_id)); \
70 #define SVM_VM_DATA_HASH_BITS 8
81 struct list_head
node;
89 vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
90 vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
92 vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
102 vmcb->control.int_ctl |= X2APIC_MODE_MASK;
103 vmcb->control.avic_physical_id |= X2AVIC_MAX_PHYSICAL_ID;
111 kvm_make_request(KVM_REQ_TLB_FLUSH_CURRENT, &svm->
vcpu);
114 vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID;
124 vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
125 vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
147 struct kvm_vcpu *vcpu = NULL;
151 pr_debug(
"SVM: %s: vm_id=%#x, vcpu_id=%#x\n", __func__, vm_id, vcpu_id);
152 trace_kvm_avic_ga_log(vm_id, vcpu_id);
154 spin_lock_irqsave(&svm_vm_data_hash_lock,
flags);
155 hash_for_each_possible(svm_vm_data_hash,
kvm_svm, hnode, vm_id) {
158 vcpu = kvm_get_vcpu_by_id(&
kvm_svm->
kvm, vcpu_id);
161 spin_unlock_irqrestore(&svm_vm_data_hash_lock,
flags);
187 spin_lock_irqsave(&svm_vm_data_hash_lock,
flags);
189 spin_unlock_irqrestore(&svm_vm_data_hash_lock,
flags);
206 p_page = alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
213 l_page = alloc_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO);
219 spin_lock_irqsave(&svm_vm_data_hash_lock,
flags);
228 hash_for_each_possible(svm_vm_data_hash, k2, hnode, vm_id) {
235 spin_unlock_irqrestore(&svm_vm_data_hash_lock,
flags);
251 vmcb->control.avic_backing_page = bpa & AVIC_HPA_MASK;
252 vmcb->control.avic_logical_id = lpa & AVIC_HPA_MASK;
253 vmcb->control.avic_physical_id = ppa & AVIC_HPA_MASK;
254 vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE & VMCB_AVIC_APIC_BAR_MASK;
265 u64 *avic_physical_id_table;
269 (index > X2AVIC_MAX_PHYSICAL_ID))
274 return &avic_physical_id_table[index];
279 u64 *entry, new_entry;
280 int id = vcpu->vcpu_id;
284 (
id > X2AVIC_MAX_PHYSICAL_ID))
287 if (!
vcpu->arch.apic->regs)
312 AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK) |
313 AVIC_PHYSICAL_ID_ENTRY_VALID_MASK);
314 WRITE_ONCE(*entry, new_entry);
330 int cpu = READ_ONCE(
vcpu->cpu);
332 if (cpu != get_cpu()) {
333 wrmsrl(MSR_AMD64_SVM_AVIC_DOORBELL, kvm_cpu_get_apicid(cpu));
334 trace_kvm_avic_doorbell(
vcpu->vcpu_id, kvm_cpu_get_apicid(cpu));
342 vcpu->arch.apic->irr_pending =
true;
344 icrl & APIC_MODE_MASK,
345 icrl & APIC_INT_LEVELTRIG,
346 icrl & APIC_VECTOR_MASK);
356 struct kvm_vcpu *target_vcpu = kvm_get_vcpu_by_id(kvm, physical_id);
359 if (unlikely(!target_vcpu))
366 u32 logid_index, u32 icrl)
370 if (avic_logical_id_table) {
371 u32 logid_entry = avic_logical_id_table[logid_index];
374 if (unlikely(!(logid_entry & AVIC_LOGICAL_ID_ENTRY_VALID_MASK)))
377 physical_id = logid_entry &
378 AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK;
387 physical_id = logid_index;
398 u32 icrl, u32 icrh, u32 index)
411 dest = GET_XAPIC_DEST_FIELD(icrh);
413 if (dest_mode == APIC_DEST_PHYSICAL) {
420 if (WARN_ON_ONCE(dest != index))
425 u32 *avic_logical_id_table;
426 unsigned long bitmap, i;
431 bitmap = dest & 0xFFFF;
432 cluster = (dest >> 16) << 4;
440 cluster = (dest >> 4) << 2;
444 if (unlikely(!bitmap))
448 avic_logical_id_table = NULL;
457 for_each_set_bit(i, &bitmap, 16)
466 u32 icrl, u32 icrh, u32 index)
470 struct kvm_vcpu *vcpu;
475 trace_kvm_avic_kick_vcpu_slowpath(icrh, icrl, index);
483 kvm_for_each_vcpu(i, vcpu, kvm) {
493 u32 icrh = svm->
vmcb->control.exit_info_1 >> 32;
494 u32 icrl = svm->
vmcb->control.exit_info_1;
495 u32
id = svm->
vmcb->control.exit_info_2 >> 32;
496 u32 index = svm->
vmcb->control.exit_info_2 & 0x1FF;
499 trace_kvm_avic_incomplete_ipi(
vcpu->vcpu_id, icrh, icrl,
id, index);
502 case AVIC_IPI_FAILURE_INVALID_TARGET:
503 case AVIC_IPI_FAILURE_INVALID_INT_TYPE:
516 if (icrl & APIC_ICR_BUSY)
521 case AVIC_IPI_FAILURE_TARGET_NOT_RUNNING:
529 case AVIC_IPI_FAILURE_INVALID_BACKING_PAGE:
530 WARN_ONCE(1,
"Invalid backing page\n");
532 case AVIC_IPI_FAILURE_INVALID_IPI_VECTOR:
536 vcpu_unimpl(
vcpu,
"Unknown avic incomplete IPI interception\n");
545 return APICV_INHIBIT_REASON_NESTED;
552 u32 *logical_apic_id_table;
555 ldr = GET_APIC_LOGICAL_ID(ldr);
560 cluster = (ldr >> 4);
565 if (!ldr || !is_power_of_2(ldr))
569 if (WARN_ON_ONCE(index > 7))
571 index += (cluster << 2);
575 return &logical_apic_id_table[index];
581 u32 *entry, new_entry;
588 new_entry = READ_ONCE(*entry);
589 new_entry &= ~AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK;
590 new_entry |= (g_physical_id & AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK);
591 new_entry |= AVIC_LOGICAL_ID_ENTRY_VALID_MASK;
592 WRITE_ONCE(*entry, new_entry);
598 bool flat = svm->
dfr_reg == APIC_DFR_FLAT;
607 clear_bit(AVIC_LOGICAL_ID_ENTRY_VALID_BIT, (
unsigned long *)entry);
644 AVIC_UNACCEL_ACCESS_OFFSET_MASK;
697 u32 offset = svm->
vmcb->control.exit_info_1 &
698 AVIC_UNACCEL_ACCESS_OFFSET_MASK;
699 u32 vector = svm->
vmcb->control.exit_info_2 &
700 AVIC_UNACCEL_ACCESS_VECTOR_MASK;
701 bool write = (svm->
vmcb->control.exit_info_1 >> 32) &
702 AVIC_UNACCEL_ACCESS_WRITE_MASK;
705 trace_kvm_avic_unaccelerated_access(
vcpu->vcpu_id, offset,
706 trap, write, vector);
709 WARN_ONCE(!write,
"svm: Handling trap read.\n");
722 struct kvm_vcpu *vcpu = &svm->
vcpu;
763 list_for_each_entry(ir, &svm->
ir_list, node) {
765 ret = amd_iommu_activate_guest_mode(ir->
data);
767 ret = amd_iommu_deactivate_guest_mode(ir->
data);
783 if (cur->
data != pi->ir_data)
785 list_del(&cur->
node);
804 if (pi->ir_data && (pi->prev_ga_tag != 0)) {
805 struct kvm *kvm = svm->
vcpu.kvm;
807 struct kvm_vcpu *prev_vcpu = kvm_get_vcpu_by_id(kvm, vcpu_id);
815 prev_svm =
to_svm(prev_vcpu);
828 ir->
data = pi->ir_data;
839 if (entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK)
840 amd_iommu_update_ga(entry & AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK,
862 struct vcpu_data *vcpu_info,
struct vcpu_svm **svm)
864 struct kvm_lapic_irq irq;
865 struct kvm_vcpu *vcpu = NULL;
870 !kvm_irq_is_postable(&irq)) {
871 pr_debug(
"SVM: %s: use legacy intr remap mode for irq %u\n",
872 __func__, irq.vector);
876 pr_debug(
"SVM: %s: use GA mode for irq %u\n", __func__,
879 vcpu_info->pi_desc_addr = __sme_set(page_to_phys((*svm)->avic_backing_page));
880 vcpu_info->vector = irq.vector;
895 uint32_t guest_irq,
bool set)
897 struct kvm_kernel_irq_routing_entry *e;
898 struct kvm_irq_routing_table *irq_rt;
902 !irq_remapping_cap(IRQ_POSTING_CAP))
905 pr_debug(
"SVM: %s: host_irq=%#x, guest_irq=%#x, set=%#x\n",
906 __func__, host_irq, guest_irq, set);
908 idx = srcu_read_lock(&kvm->irq_srcu);
909 irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
911 if (guest_irq >= irq_rt->nr_rt_entries ||
912 hlist_empty(&irq_rt->map[guest_irq])) {
913 pr_warn_once(
"no route for guest_irq %u/%u (broken user space?)\n",
914 guest_irq, irq_rt->nr_rt_entries);
918 hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) {
919 struct vcpu_data vcpu_info;
922 if (e->type != KVM_IRQ_ROUTING_MSI)
934 struct amd_iommu_pi_data pi;
941 pi.is_guest_mode =
true;
942 pi.vcpu_data = &vcpu_info;
943 ret = irq_set_vcpu_affinity(host_irq, &pi);
952 if (!ret && pi.is_guest_mode)
956 struct amd_iommu_pi_data pi;
964 pi.is_guest_mode =
false;
965 ret = irq_set_vcpu_affinity(host_irq, &pi);
973 if (!ret && pi.prev_ga_tag) {
975 struct kvm_vcpu *vcpu;
977 vcpu = kvm_get_vcpu_by_id(kvm,
id);
984 trace_kvm_pi_irte_update(host_irq, svm->
vcpu.vcpu_id,
985 e->gsi, vcpu_info.vector,
986 vcpu_info.pi_desc_addr, set);
990 pr_err(
"%s: failed to update PI IRTE\n", __func__);
997 srcu_read_unlock(&kvm->irq_srcu, idx);
1017 if (list_empty(&svm->
ir_list))
1020 list_for_each_entry(ir, &svm->
ir_list, node) {
1021 ret = amd_iommu_update_ga(cpu, r, ir->
data);
1031 int h_physical_id = kvm_cpu_get_apicid(cpu);
1033 unsigned long flags;
1035 lockdep_assert_preemption_disabled();
1037 if (WARN_ON(h_physical_id & ~AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK))
1047 if (kvm_vcpu_is_blocking(
vcpu))
1060 WARN_ON_ONCE(entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK);
1062 entry &= ~AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK;
1063 entry |= (h_physical_id & AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK);
1064 entry |= AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK;
1076 unsigned long flags;
1078 lockdep_assert_preemption_disabled();
1090 if (!(entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK))
1105 entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK;
1194 if (!boot_cpu_has(X86_FEATURE_AVIC) && !
force_avic) {
1195 if (boot_cpu_has(X86_FEATURE_X2AVIC)) {
1196 pr_warn(FW_BUG
"Cannot support x2AVIC due to AVIC is disabled");
1197 pr_warn(FW_BUG
"Try enable AVIC using force_avic option");
1202 if (boot_cpu_has(X86_FEATURE_AVIC)) {
1203 pr_info(
"AVIC enabled\n");
1209 pr_warn(
"AVIC is not supported in CPUID but force enabled");
1210 pr_warn(
"Your system might crash and burn");
1216 pr_info(
"x2AVIC enabled\n");
#define irqchip_in_kernel(k)
static int svm_ir_list_add(struct vcpu_svm *svm, struct amd_iommu_pi_data *pi)
void avic_vcpu_blocking(struct kvm_vcpu *vcpu)
static void svm_ir_list_del(struct vcpu_svm *svm, struct amd_iommu_pi_data *pi)
int avic_vm_init(struct kvm *kvm)
static void avic_kick_vcpu_by_logical_id(struct kvm *kvm, u32 *avic_logical_id_table, u32 logid_index, u32 icrl)
static bool next_vm_id_wrapped
static int get_pi_vcpu_info(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, struct vcpu_data *vcpu_info, struct vcpu_svm **svm)
static void avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr)
int avic_unaccelerated_access_interception(struct kvm_vcpu *vcpu)
static void avic_activate_vmcb(struct vcpu_svm *svm)
static void avic_kick_vcpu(struct kvm_vcpu *vcpu, u32 icrl)
static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu)
#define AVIC_GATAG_TO_VCPUID(x)
int avic_pi_update_irte(struct kvm *kvm, unsigned int host_irq, uint32_t guest_irq, bool set)
void avic_vm_destroy(struct kvm *kvm)
void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb)
#define SVM_VM_DATA_HASH_BITS
void avic_vcpu_put(struct kvm_vcpu *vcpu)
static DEFINE_SPINLOCK(svm_vm_data_hash_lock)
int avic_incomplete_ipi_interception(struct kvm_vcpu *vcpu)
static void avic_kick_vcpu_by_physical_id(struct kvm *kvm, u32 physical_id, u32 icrl)
#define AVIC_GATAG_TO_VMID(x)
void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu)
static int avic_set_pi_irte_mode(struct kvm_vcpu *vcpu, bool activate)
#define __AVIC_GATAG(vm_id, vcpu_id)
static u32 * avic_get_logical_id_entry(struct kvm_vcpu *vcpu, u32 ldr, bool flat)
module_param_unsafe(force_avic, bool, 0444)
static void avic_handle_ldr_update(struct kvm_vcpu *vcpu)
#define AVIC_GATAG(vm_id, vcpu_id)
static int avic_update_iommu_vcpu_affinity(struct kvm_vcpu *vcpu, int cpu, bool r)
static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source, u32 icrl, u32 icrh, u32 index)
void avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
void avic_vcpu_unblocking(struct kvm_vcpu *vcpu)
#define AVIC_VCPU_ID_MASK
static u64 * avic_get_physical_id_entry(struct kvm_vcpu *vcpu, unsigned int index)
int avic_init_vcpu(struct vcpu_svm *svm)
static bool is_avic_unaccelerated_access_trap(u32 offset)
static DEFINE_HASHTABLE(svm_vm_data_hash, SVM_VM_DATA_HASH_BITS)
static void avic_handle_dfr_update(struct kvm_vcpu *vcpu)
static int avic_unaccel_trap_write(struct kvm_vcpu *vcpu)
static void avic_deactivate_vmcb(struct vcpu_svm *svm)
void avic_ring_doorbell(struct kvm_vcpu *vcpu)
static void avic_kick_target_vcpus(struct kvm *kvm, struct kvm_lapic *source, u32 icrl, u32 icrh, u32 index)
bool avic_hardware_setup(void)
void avic_apicv_post_state_restore(struct kvm_vcpu *vcpu)
unsigned long avic_vcpu_get_apicv_inhibit_reasons(struct kvm_vcpu *vcpu)
static int avic_init_backing_page(struct kvm_vcpu *vcpu)
int avic_ga_log_notifier(u32 ga_tag)
void avic_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
void kvm_set_msi_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, struct kvm_lapic_irq *irq)
bool kvm_intr_is_single_vcpu(struct kvm *kvm, struct kvm_lapic_irq *irq, struct kvm_vcpu **dest_vcpu)
static bool is_guest_mode(struct kvm_vcpu *vcpu)
bool kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
void kvm_apic_send_ipi(struct kvm_lapic *apic, u32 icr_low, u32 icr_high)
int kvm_alloc_apic_access_page(struct kvm *kvm)
bool kvm_apic_match_dest(struct kvm_vcpu *vcpu, struct kvm_lapic *source, int shorthand, unsigned int dest, int dest_mode)
static int apic_x2apic_mode(struct kvm_lapic *apic)
static bool lapic_in_kernel(struct kvm_vcpu *vcpu)
static bool kvm_vcpu_apicv_active(struct kvm_vcpu *vcpu)
static u8 kvm_xapic_id(struct kvm_lapic *apic)
static u32 kvm_lapic_get_reg(struct kvm_lapic *apic, int reg_off)
#define APIC_DEST_NOSHORT
struct page * avic_logical_id_table_page
struct page * avic_physical_id_table_page
struct vmcb_ctrl_area_cached ctl
struct page * avic_backing_page
struct svm_nested_state nested
u64 * avic_physical_id_cache
struct kvm_vmcb_info vmcb01
void svm_set_x2apic_msr_interception(struct vcpu_svm *svm, bool intercept)
void svm_complete_interrupt_delivery(struct kvm_vcpu *vcpu, int delivery_mode, int trig_mode, int vector)
static bool vmcb12_is_intercept(struct vmcb_ctrl_area_cached *control, u32 bit)
static __always_inline struct vcpu_svm * to_svm(struct kvm_vcpu *vcpu)
static void vmcb_mark_dirty(struct vmcb *vmcb, int bit)
static __always_inline struct kvm_svm * to_kvm_svm(struct kvm *kvm)
bool __read_mostly enable_apicv
int kvm_emulate_instruction(struct kvm_vcpu *vcpu, int emulation_type)
bool kvm_apicv_activated(struct kvm *kvm)
bool noinstr kvm_arch_has_assigned_device(struct kvm *kvm)