]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
kvm: Setup VCPU MSRs
authorPekka Enberg <penberg@cs.helsinki.fi>
Thu, 8 Apr 2010 17:44:37 +0000 (20:44 +0300)
committerPekka Enberg <penberg@cs.helsinki.fi>
Thu, 8 Apr 2010 18:00:40 +0000 (21:00 +0300)
Use the KVM_SET_MSRS ioctl() to set up model-specific registers (MSRs) to a
known state.  The MSRs are initialized to zero for now because I'm not sure
what are the right values.

Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
tools/kvm/include/kvm/kvm.h
tools/kvm/kvm.c

index dd5a3bb40562f8dbae0886b61c898dec13ba759a..cddcad0a9f1d01a7d88fcd6af6ae5aea8a9afc72 100644 (file)
@@ -26,6 +26,7 @@ struct kvm {
        struct kvm_regs         regs;
        struct kvm_sregs        sregs;
        struct kvm_fpu          fpu;
+       struct kvm_msrs         *msrs;  /* dynamically allocated */
 
        struct interrupt_table  interrupt_table;
 };
index 4bea85cd640726f73ae999f5e1cdec895258f8ee..bfff0b9177a13e9929f2daa6187bc9f38ac542d3 100644 (file)
@@ -378,6 +378,53 @@ static inline uint32_t selector_to_base(uint16_t selector)
        return (uint32_t)selector * 16;
 }
 
+static struct kvm_msrs *kvm_msrs__new(size_t nmsrs)
+{
+       struct kvm_msrs *self = calloc(1, sizeof(*self) + (sizeof(struct kvm_msr_entry) * nmsrs));
+
+       if (!self)
+               die("out of memory");
+
+       return self;
+}
+
+#define MSR_IA32_TIME_STAMP_COUNTER    0x10
+
+#define MSR_IA32_SYSENTER_CS           0x174
+#define MSR_IA32_SYSENTER_ESP          0x175
+#define MSR_IA32_SYSENTER_EIP          0x176
+
+#define MSR_IA32_STAR                  0xc0000081
+#define MSR_IA32_LSTAR                 0xc0000082
+#define MSR_IA32_CSTAR                 0xc0000083
+#define MSR_IA32_FMASK                 0xc0000084
+#define MSR_IA32_KERNEL_GS_BASE                0xc0000102
+
+#define KVM_MSR_ENTRY(_index, _data)   \
+       (struct kvm_msr_entry) { .index = _index, .data = _data }
+
+static void kvm__setup_msrs(struct kvm *self)
+{
+       unsigned long ndx = 0;
+
+       self->msrs = kvm_msrs__new(100);
+
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_CS,        0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_ESP,       0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_SYSENTER_EIP,       0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_STAR,               0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_CSTAR,              0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_KERNEL_GS_BASE,     0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_FMASK,              0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_LSTAR,              0x0);
+       self->msrs->entries[ndx++] = KVM_MSR_ENTRY(MSR_IA32_TIME_STAMP_COUNTER, 0x0);
+
+       self->msrs->nmsrs       = ndx;
+
+       if (ioctl(self->vcpu_fd, KVM_SET_MSRS, self->msrs) < 0)
+               die_perror("KVM_SET_MSRS failed");
+}
+
 static void kvm__setup_fpu(struct kvm *self)
 {
        self->fpu = (struct kvm_fpu) {
@@ -494,6 +541,8 @@ void kvm__reset_vcpu(struct kvm *self)
        kvm__setup_regs(self);
 
        kvm__setup_fpu(self);
+
+       kvm__setup_msrs(self);
 }
 
 void kvm__run(struct kvm *self)