Skip to content

Commit

Permalink
KVM: SVM: enable LBRV virtualization if available
Browse files Browse the repository at this point in the history
This patch enables the virtualization of the last branch record MSRs on
SVM if this feature is available in hardware. It also introduces a small
and simple check feature for specific SVM extensions.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
  • Loading branch information
Joerg Roedel authored and Avi Kivity committed May 3, 2007
1 parent b883673 commit 80b7706
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions drivers/kvm/svm.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ MODULE_LICENSE("GPL");
#define KVM_EFER_LMA (1 << 10)
#define KVM_EFER_LME (1 << 8)

#define SVM_FEATURE_NPT (1 << 0)
#define SVM_FEATURE_LBRV (1 << 1)
#define SVM_DEATURE_SVML (1 << 2)

unsigned long iopm_base;
unsigned long msrpm_base;

Expand All @@ -68,6 +72,7 @@ struct svm_cpu_data {
};

static DEFINE_PER_CPU(struct svm_cpu_data *, svm_data);
static uint32_t svm_features;

struct svm_init_data {
int cpu;
Expand All @@ -82,6 +87,11 @@ static u32 msrpm_ranges[] = {0, 0xc0000000, 0xc0010000};

#define MAX_INST_SIZE 15

static inline u32 svm_has(u32 feat)
{
return svm_features & feat;
}

static unsigned get_addr_size(struct kvm_vcpu *vcpu)
{
struct vmcb_save_area *sa = &vcpu->svm->vmcb->save;
Expand Down Expand Up @@ -302,6 +312,7 @@ static void svm_hardware_enable(void *garbage)
svm_data->asid_generation = 1;
svm_data->max_asid = cpuid_ebx(SVM_CPUID_FUNC) - 1;
svm_data->next_asid = svm_data->max_asid + 1;
svm_features = cpuid_edx(SVM_CPUID_FUNC);

asm volatile ( "sgdt %0" : "=m"(gdt_descr) );
gdt = (struct desc_struct *)gdt_descr.address;
Expand Down Expand Up @@ -511,6 +522,8 @@ static void init_vmcb(struct vmcb *vmcb)
control->msrpm_base_pa = msrpm_base;
control->tsc_offset = 0;
control->int_ctl = V_INTR_MASKING_MASK;
if (svm_has(SVM_FEATURE_LBRV))
control->lbr_ctl = 1ULL;

init_seg(&save->es);
init_seg(&save->ss);
Expand Down

0 comments on commit 80b7706

Please sign in to comment.