Skip to contentSkip to conversation

vmxcap: Add tool to query vmx capabilities

PATCH Applied Avi Kivity 3 participants 8 messages Sep 1, 2009 – Sep 2, 2009 KVM

lore
Share & tools
lore

Avi Kivity

author
#0 lore raw

PATCH v2 1/1 vmxcap: Add tool to query vmx capabilities

This should really be in the kernel, but there are too many of them.

---

v2: try /dev/cpu/0/msr first

 kvm/scripts/vmxcap |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 154 insertions(+), 0 deletions(-)
 create mode 100755 kvm/scripts/vmxcap
kvm/scripts/vmxcap new file +154 -0
new file mode 100755
index 0000000..50f094b
@@ -0,0 +1,154 @@
+#!/usr/bin/python
+
+MSR_IA32_VMX_BASIC = 0x480
+MSR_IA32_VMX_PINBASED_CTLS = 0x481
+MSR_IA32_VMX_PROCBASED_CTLS = 0x482
+MSR_IA32_VMX_EXIT_CTLS = 0x483
+MSR_IA32_VMX_ENTRY_CTLS = 0x484
+MSR_IA32_VMX_MISC_CTLS = 0x485
+MSR_IA32_VMX_PROCBASED_CTLS2 = 0x48B
+MSR_IA32_VMX_TRUE_PINBASED_CTLS = 0x48D
+MSR_IA32_VMX_TRUE_PROCBASED_CTLS = 0x48E
+MSR_IA32_VMX_TRUE_EXIT_CTLS = 0x48F
+MSR_IA32_VMX_TRUE_ENTRY_CTLS = 0x490
+
+class msr(object):
+    def __init__(self):
+        try:
+            self.f = file('/dev/cpu/0/msr')
+        except:
+            self.f = file('/dev/msr0')
+    def read(self, index, default = None):
+        import struct
+        self.f.seek(index)
+        try:
+            return struct.unpack('Q', self.f.read(8))[0]
+        except:
+            return default
+
+class Control(object):
+    def __init__(self, name, bits, cap_msr, true_cap_msr = None):
+        self.name = name
+        self.bits = bits
+        self.cap_msr = cap_msr
+        self.true_cap_msr = true_cap_msr
+    def read2(self, nr):
+        m = msr()
+        val = m.read(nr, 0)
+        return (val & 0xffffffff, val >> 32)
+    def show(self):
+        print self.name
+        mbz, mb1 = self.read2(self.cap_msr)
+        tmbz, tmb1 = 0, 0
+        if self.true_cap_msr:
+            tmbz, tmb1 = self.read2(self.true_cap_msr)
+        for bit in sorted(self.bits.keys()):
+            zero = not (mbz & (1 << bit))
+            one = mb1 & (1 << bit)
+            true_zero = not (tmbz & (1 << bit))
+            true_one = tmb1 & (1 << bit)
+            s= '?'
+            if (self.true_cap_msr and true_zero and true_one
+                and one and not zero):
+                s = 'default'
+            elif zero and not one:
+                s = 'no'
+            elif one and not zero:
+                s = 'forced'
+            elif one and zero:
+                s = 'yes'
+            print '  %-40s %s' % (self.bits[bit], s)
+
+controls = [
+    Control(
+        name = 'pin-based controls',
+        bits = {
+            0: 'External interrupt exiting',
+            3: 'NMI exiting',
+            5: 'Virtual NMIs',
+            6: 'Activate VMX-preemption timer',
+            7: 'Unrestricted guest',
+            },
+        cap_msr = MSR_IA32_VMX_PINBASED_CTLS,
+        true_cap_msr = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
+        ),
+
+    Control(
+        name = 'primary processor-based controls',
+        bits = {
+            2: 'Interrupt window exiting',
+            3: 'Use TSC offsetting',
+            7: 'HLT exiting',
+            9: 'INVLPG exiting',
+            10: 'MWAIT exiting',
+            11: 'RDPMC exiting',
+            12: 'RDTSC exiting',
+            15: 'CR3-load exiting',
+            16: 'CR3-store exiting',
+            19: 'CR8-load exiting',
+            20: 'CR8-store exiting',
+            21: 'Use TPR shadow',
+            22: 'NMI-window exiting',
+            23: 'MOV-DR exiting',
+            24: 'Unconditional I/O exiting',
+            25: 'Use I/O bitmaps',
+            27: 'Monitor trap flag',
+            28: 'Use MSR bitmaps',
+            29: 'MONITOR exiting',
+            30: 'PAUSE exiting',
+            31: 'Activate secondary control',
+            },
+        cap_msr = MSR_IA32_VMX_PROCBASED_CTLS,
+        true_cap_msr = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
+        ),
+
+    Control(
+        name = 'secondary processor-based controls',
+        bits = {
+            0: 'Virtualize APIC accesses',
+            1: 'Enable EPT',
+            2: 'Descriptor-table exiting',
+            4: 'Virtualize x2APIC mode',
+            5: 'Enable VPID',
+            6: 'WBINVD exiting',
+            },
+        cap_msr = MSR_IA32_VMX_PROCBASED_CTLS2,
+        ),
+
+    Control(
+        name = 'VM-Exit controls',
+        bits = {
+            2: 'Save debug controls',
+            9: 'Host address-space size',
+            12: 'Load IA32_PERF_GLOBAL_CTRL',
+            15: 'Acknowledge interrupt on exit',
+            18: 'Save IA32_PAT',
+            19: 'Load IA32_PAT',
+            20: 'Save IA32_EFER',
+            21: 'Load IA32_EFER',
+            22: 'Save VMX-preemption timer value',
+            },
+        cap_msr = MSR_IA32_VMX_EXIT_CTLS,
+        true_cap_msr = MSR_IA32_VMX_TRUE_EXIT_CTLS,
+        ),
+
+    Control(
+        name = 'VM-Entry controls',
+        bits = {
+            2: 'Load debug controls',
+            9: 'IA-64 mode guest',
+            10: 'Entry to SMM',
+            11: 'Deactivate dual-monitor treatment',
+            13: 'Load IA32_PERF_GLOBAL_CTRL',
+            14: 'Load IA32_PAT',
+            15: 'Load IA32_EFER',
+            },
+        cap_msr = MSR_IA32_VMX_ENTRY_CTLS,
+        true_cap_msr = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
+        ),
+    ]
+
+for c in controls:
+    c.show()
+
+
Signature · 1 line
1.6.4.1
#1 lore raw
Quoted 8 lines · Avi Kivity

This should really be in the kernel, but there are too many of them.

---

v2: try /dev/cpu/0/msr first

 kvm/scripts/vmxcap |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++

Why not call it cpucap and add svm support later?

Amit

author
#2 lore raw
Quoted 4 lines · Amit Shah
Quoted 2 lines · Avi Kivity

This should really be in the kernel, but there are too many of them.

Quoted 9 lines
Quoted 7 lines

---

v2: try /dev/cpu/0/msr first

  kvm/scripts/vmxcap |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++

Why not call it cpucap and add svm support later?

It's just a hack.

Signature · 1 line
error compiling committee.c: too many arguments to function
#3 lore raw
Quoted 8 lines · Avi Kivity
Quoted 7 lines · Amit Shah
Quoted 5 lines · Avi Kivity

This should really be in the kernel, but there are too many of them.

---

Quoted 8 lines
Quoted 6 lines
Quoted 4 lines

v2: try /dev/cpu/0/msr first

  kvm/scripts/vmxcap |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++

Why not call it cpucap and add svm support later?

It's just a hack.

In that case there's danger of this becoming a "stable interface"
- when eg libvirt picks up support for it. It is useful functionality.

Amit

author
#4 lore raw
Quoted 6 lines · Amit Shah
Quoted 2 lines

It's just a hack.

In that case there's danger of this becoming a "stable interface"
- when eg libvirt picks up support for it. It is useful functionality.

They'll learn when the first spelling fix comes in. Don't use text APIs.

Signature · 1 line
error compiling committee.c: too many arguments to function
#5 lore raw
Quoted 9 lines · Avi Kivity
Quoted 6 lines · Amit Shah
Quoted 2 lines

It's just a hack.

In that case there's danger of this becoming a "stable interface"
- when eg libvirt picks up support for it. It is useful functionality.

They'll learn when the first spelling fix comes in. Don't use text APIs.

:-) Interesting.

So then is this just meant to be a debug or informational tool?

Amit

author
#6 lore raw
Quoted 2 lines · Amit Shah

So then is this just meant to be a debug or informational tool?

It's a stopgap until we expose it via /proc/cpuinfo or something similar.

Signature · 1 line
error compiling committee.c: too many arguments to function
#7 lore raw
In reply to Avi Kivity
Quoted 10 lines · Avi Kivity

This should really be in the kernel, but there are too many of them.

---

v2: try /dev/cpu/0/msr first

 kvm/scripts/vmxcap |  154 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 154 insertions(+), 0 deletions(-)
 create mode 100755 kvm/scripts/vmxcap

Applied, thanks.