Skip to content

Commit 3915035

Browse files
Maxim Levitskybonzini
authored andcommitted
KVM: x86: SVM: move avic definitions from AMD's spec to svm.h
asm/svm.h is the correct place for all values that are defined in the SVM spec, and that includes AVIC. Also add some values from the spec that were not defined before and will be soon useful. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20220207155447.840194-10-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent 755c2bf commit 3915035

File tree

4 files changed

+38
-32
lines changed

4 files changed

+38
-32
lines changed

arch/x86/include/asm/msr-index.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@
476476
#define MSR_AMD64_ICIBSEXTDCTL 0xc001103c
477477
#define MSR_AMD64_IBSOPDATA4 0xc001103d
478478
#define MSR_AMD64_IBS_REG_COUNT_MAX 8 /* includes MSR_AMD64_IBSBRTARGET */
479+
#define MSR_AMD64_SVM_AVIC_DOORBELL 0xc001011b
479480
#define MSR_AMD64_VM_PAGE_FLUSH 0xc001011e
480481
#define MSR_AMD64_SEV_ES_GHCB 0xc0010130
481482
#define MSR_AMD64_SEV 0xc0010131

arch/x86/include/asm/svm.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,42 @@ struct __attribute__ ((__packed__)) vmcb_control_area {
220220
#define SVM_NESTED_CTL_SEV_ENABLE BIT(1)
221221
#define SVM_NESTED_CTL_SEV_ES_ENABLE BIT(2)
222222

223+
224+
/* AVIC */
225+
#define AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK (0xFF)
226+
#define AVIC_LOGICAL_ID_ENTRY_VALID_BIT 31
227+
#define AVIC_LOGICAL_ID_ENTRY_VALID_MASK (1 << 31)
228+
229+
#define AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK (0xFFULL)
230+
#define AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK (0xFFFFFFFFFFULL << 12)
231+
#define AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK (1ULL << 62)
232+
#define AVIC_PHYSICAL_ID_ENTRY_VALID_MASK (1ULL << 63)
233+
#define AVIC_PHYSICAL_ID_TABLE_SIZE_MASK (0xFF)
234+
235+
#define AVIC_DOORBELL_PHYSICAL_ID_MASK (0xFF)
236+
237+
#define AVIC_UNACCEL_ACCESS_WRITE_MASK 1
238+
#define AVIC_UNACCEL_ACCESS_OFFSET_MASK 0xFF0
239+
#define AVIC_UNACCEL_ACCESS_VECTOR_MASK 0xFFFFFFFF
240+
241+
enum avic_ipi_failure_cause {
242+
AVIC_IPI_FAILURE_INVALID_INT_TYPE,
243+
AVIC_IPI_FAILURE_TARGET_NOT_RUNNING,
244+
AVIC_IPI_FAILURE_INVALID_TARGET,
245+
AVIC_IPI_FAILURE_INVALID_BACKING_PAGE,
246+
};
247+
248+
249+
/*
250+
* 0xff is broadcast, so the max index allowed for physical APIC ID
251+
* table is 0xfe. APIC IDs above 0xff are reserved.
252+
*/
253+
#define AVIC_MAX_PHYSICAL_ID_COUNT 0xff
254+
255+
#define AVIC_HPA_MASK ~((0xFFFULL << 52) | 0xFFF)
256+
#define VMCB_AVIC_APIC_BAR_MASK 0xFFFFFFFFFF000ULL
257+
258+
223259
struct vmcb_seg {
224260
u16 selector;
225261
u16 attrib;

arch/x86/kvm/svm/avic.c

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,6 @@
2727
#include "irq.h"
2828
#include "svm.h"
2929

30-
#define SVM_AVIC_DOORBELL 0xc001011b
31-
32-
#define AVIC_HPA_MASK ~((0xFFFULL << 52) | 0xFFF)
33-
34-
/*
35-
* 0xff is broadcast, so the max index allowed for physical APIC ID
36-
* table is 0xfe. APIC IDs above 0xff are reserved.
37-
*/
38-
#define AVIC_MAX_PHYSICAL_ID_COUNT 255
39-
40-
#define AVIC_UNACCEL_ACCESS_WRITE_MASK 1
41-
#define AVIC_UNACCEL_ACCESS_OFFSET_MASK 0xFF0
42-
#define AVIC_UNACCEL_ACCESS_VECTOR_MASK 0xFFFFFFFF
43-
4430
/* AVIC GATAG is encoded using VM and VCPU IDs */
4531
#define AVIC_VCPU_ID_BITS 8
4632
#define AVIC_VCPU_ID_MASK ((1 << AVIC_VCPU_ID_BITS) - 1)
@@ -73,12 +59,6 @@ struct amd_svm_iommu_ir {
7359
void *data; /* Storing pointer to struct amd_ir_data */
7460
};
7561

76-
enum avic_ipi_failure_cause {
77-
AVIC_IPI_FAILURE_INVALID_INT_TYPE,
78-
AVIC_IPI_FAILURE_TARGET_NOT_RUNNING,
79-
AVIC_IPI_FAILURE_INVALID_TARGET,
80-
AVIC_IPI_FAILURE_INVALID_BACKING_PAGE,
81-
};
8262

8363
/* Note:
8464
* This function is called from IOMMU driver to notify
@@ -700,7 +680,7 @@ int svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec)
700680
* one is harmless).
701681
*/
702682
if (cpu != get_cpu())
703-
wrmsrl(SVM_AVIC_DOORBELL, kvm_cpu_get_apicid(cpu));
683+
wrmsrl(MSR_AMD64_SVM_AVIC_DOORBELL, kvm_cpu_get_apicid(cpu));
704684
put_cpu();
705685
} else {
706686
/*

arch/x86/kvm/svm/svm.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -556,17 +556,6 @@ extern struct kvm_x86_nested_ops svm_nested_ops;
556556

557557
/* avic.c */
558558

559-
#define AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK (0xFF)
560-
#define AVIC_LOGICAL_ID_ENTRY_VALID_BIT 31
561-
#define AVIC_LOGICAL_ID_ENTRY_VALID_MASK (1 << 31)
562-
563-
#define AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK (0xFFULL)
564-
#define AVIC_PHYSICAL_ID_ENTRY_BACKING_PAGE_MASK (0xFFFFFFFFFFULL << 12)
565-
#define AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK (1ULL << 62)
566-
#define AVIC_PHYSICAL_ID_ENTRY_VALID_MASK (1ULL << 63)
567-
568-
#define VMCB_AVIC_APIC_BAR_MASK 0xFFFFFFFFFF000ULL
569-
570559
int avic_ga_log_notifier(u32 ga_tag);
571560
void avic_vm_destroy(struct kvm *kvm);
572561
int avic_vm_init(struct kvm *kvm);

0 commit comments

Comments
 (0)