xref: /openbmc/qemu/scripts/kvm/vmxcap (revision 5f6caa4f2ba45c8a99c915c09c4d56bd1621a450)
1*5f6caa4fSJan Kiszka#!/usr/bin/python
2*5f6caa4fSJan Kiszka#
3*5f6caa4fSJan Kiszka# tool for querying VMX capabilities
4*5f6caa4fSJan Kiszka#
5*5f6caa4fSJan Kiszka# Copyright 2009-2010 Red Hat, Inc.
6*5f6caa4fSJan Kiszka#
7*5f6caa4fSJan Kiszka# Authors:
8*5f6caa4fSJan Kiszka#  Avi Kivity <avi@redhat.com>
9*5f6caa4fSJan Kiszka#
10*5f6caa4fSJan Kiszka# This work is licensed under the terms of the GNU GPL, version 2.  See
11*5f6caa4fSJan Kiszka# the COPYING file in the top-level directory.
12*5f6caa4fSJan Kiszka
13*5f6caa4fSJan KiszkaMSR_IA32_VMX_BASIC = 0x480
14*5f6caa4fSJan KiszkaMSR_IA32_VMX_PINBASED_CTLS = 0x481
15*5f6caa4fSJan KiszkaMSR_IA32_VMX_PROCBASED_CTLS = 0x482
16*5f6caa4fSJan KiszkaMSR_IA32_VMX_EXIT_CTLS = 0x483
17*5f6caa4fSJan KiszkaMSR_IA32_VMX_ENTRY_CTLS = 0x484
18*5f6caa4fSJan KiszkaMSR_IA32_VMX_MISC_CTLS = 0x485
19*5f6caa4fSJan KiszkaMSR_IA32_VMX_PROCBASED_CTLS2 = 0x48B
20*5f6caa4fSJan KiszkaMSR_IA32_VMX_EPT_VPID_CAP = 0x48C
21*5f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_PINBASED_CTLS = 0x48D
22*5f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_PROCBASED_CTLS = 0x48E
23*5f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_EXIT_CTLS = 0x48F
24*5f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_ENTRY_CTLS = 0x490
25*5f6caa4fSJan Kiszka
26*5f6caa4fSJan Kiszkaclass msr(object):
27*5f6caa4fSJan Kiszka    def __init__(self):
28*5f6caa4fSJan Kiszka        try:
29*5f6caa4fSJan Kiszka            self.f = file('/dev/cpu/0/msr')
30*5f6caa4fSJan Kiszka        except:
31*5f6caa4fSJan Kiszka            self.f = file('/dev/msr0')
32*5f6caa4fSJan Kiszka    def read(self, index, default = None):
33*5f6caa4fSJan Kiszka        import struct
34*5f6caa4fSJan Kiszka        self.f.seek(index)
35*5f6caa4fSJan Kiszka        try:
36*5f6caa4fSJan Kiszka            return struct.unpack('Q', self.f.read(8))[0]
37*5f6caa4fSJan Kiszka        except:
38*5f6caa4fSJan Kiszka            return default
39*5f6caa4fSJan Kiszka
40*5f6caa4fSJan Kiszkaclass Control(object):
41*5f6caa4fSJan Kiszka    def __init__(self, name, bits, cap_msr, true_cap_msr = None):
42*5f6caa4fSJan Kiszka        self.name = name
43*5f6caa4fSJan Kiszka        self.bits = bits
44*5f6caa4fSJan Kiszka        self.cap_msr = cap_msr
45*5f6caa4fSJan Kiszka        self.true_cap_msr = true_cap_msr
46*5f6caa4fSJan Kiszka    def read2(self, nr):
47*5f6caa4fSJan Kiszka        m = msr()
48*5f6caa4fSJan Kiszka        val = m.read(nr, 0)
49*5f6caa4fSJan Kiszka        return (val & 0xffffffff, val >> 32)
50*5f6caa4fSJan Kiszka    def show(self):
51*5f6caa4fSJan Kiszka        print self.name
52*5f6caa4fSJan Kiszka        mbz, mb1 = self.read2(self.cap_msr)
53*5f6caa4fSJan Kiszka        tmbz, tmb1 = 0, 0
54*5f6caa4fSJan Kiszka        if self.true_cap_msr:
55*5f6caa4fSJan Kiszka            tmbz, tmb1 = self.read2(self.true_cap_msr)
56*5f6caa4fSJan Kiszka        for bit in sorted(self.bits.keys()):
57*5f6caa4fSJan Kiszka            zero = not (mbz & (1 << bit))
58*5f6caa4fSJan Kiszka            one = mb1 & (1 << bit)
59*5f6caa4fSJan Kiszka            true_zero = not (tmbz & (1 << bit))
60*5f6caa4fSJan Kiszka            true_one = tmb1 & (1 << bit)
61*5f6caa4fSJan Kiszka            s= '?'
62*5f6caa4fSJan Kiszka            if (self.true_cap_msr and true_zero and true_one
63*5f6caa4fSJan Kiszka                and one and not zero):
64*5f6caa4fSJan Kiszka                s = 'default'
65*5f6caa4fSJan Kiszka            elif zero and not one:
66*5f6caa4fSJan Kiszka                s = 'no'
67*5f6caa4fSJan Kiszka            elif one and not zero:
68*5f6caa4fSJan Kiszka                s = 'forced'
69*5f6caa4fSJan Kiszka            elif one and zero:
70*5f6caa4fSJan Kiszka                s = 'yes'
71*5f6caa4fSJan Kiszka            print '  %-40s %s' % (self.bits[bit], s)
72*5f6caa4fSJan Kiszka
73*5f6caa4fSJan Kiszkaclass Misc(object):
74*5f6caa4fSJan Kiszka    def __init__(self, name, bits, msr):
75*5f6caa4fSJan Kiszka        self.name = name
76*5f6caa4fSJan Kiszka        self.bits = bits
77*5f6caa4fSJan Kiszka        self.msr = msr
78*5f6caa4fSJan Kiszka    def show(self):
79*5f6caa4fSJan Kiszka        print self.name
80*5f6caa4fSJan Kiszka        value = msr().read(self.msr, 0)
81*5f6caa4fSJan Kiszka        def first_bit(key):
82*5f6caa4fSJan Kiszka            if type(key) is tuple:
83*5f6caa4fSJan Kiszka                return key[0]
84*5f6caa4fSJan Kiszka            else:
85*5f6caa4fSJan Kiszka                return key
86*5f6caa4fSJan Kiszka        for bits in sorted(self.bits.keys(), key = first_bit):
87*5f6caa4fSJan Kiszka            if type(bits) is tuple:
88*5f6caa4fSJan Kiszka                lo, hi = bits
89*5f6caa4fSJan Kiszka                fmt = int
90*5f6caa4fSJan Kiszka            else:
91*5f6caa4fSJan Kiszka                lo = hi = bits
92*5f6caa4fSJan Kiszka                def fmt(x):
93*5f6caa4fSJan Kiszka                    return { True: 'yes', False: 'no' }[x]
94*5f6caa4fSJan Kiszka            v = (value >> lo) & ((1 << (hi - lo + 1)) - 1)
95*5f6caa4fSJan Kiszka            print '  %-40s %s' % (self.bits[bits], fmt(v))
96*5f6caa4fSJan Kiszka
97*5f6caa4fSJan Kiszkacontrols = [
98*5f6caa4fSJan Kiszka    Control(
99*5f6caa4fSJan Kiszka        name = 'pin-based controls',
100*5f6caa4fSJan Kiszka        bits = {
101*5f6caa4fSJan Kiszka            0: 'External interrupt exiting',
102*5f6caa4fSJan Kiszka            3: 'NMI exiting',
103*5f6caa4fSJan Kiszka            5: 'Virtual NMIs',
104*5f6caa4fSJan Kiszka            6: 'Activate VMX-preemption timer',
105*5f6caa4fSJan Kiszka            },
106*5f6caa4fSJan Kiszka        cap_msr = MSR_IA32_VMX_PINBASED_CTLS,
107*5f6caa4fSJan Kiszka        true_cap_msr = MSR_IA32_VMX_TRUE_PINBASED_CTLS,
108*5f6caa4fSJan Kiszka        ),
109*5f6caa4fSJan Kiszka
110*5f6caa4fSJan Kiszka    Control(
111*5f6caa4fSJan Kiszka        name = 'primary processor-based controls',
112*5f6caa4fSJan Kiszka        bits = {
113*5f6caa4fSJan Kiszka            2: 'Interrupt window exiting',
114*5f6caa4fSJan Kiszka            3: 'Use TSC offsetting',
115*5f6caa4fSJan Kiszka            7: 'HLT exiting',
116*5f6caa4fSJan Kiszka            9: 'INVLPG exiting',
117*5f6caa4fSJan Kiszka            10: 'MWAIT exiting',
118*5f6caa4fSJan Kiszka            11: 'RDPMC exiting',
119*5f6caa4fSJan Kiszka            12: 'RDTSC exiting',
120*5f6caa4fSJan Kiszka            15: 'CR3-load exiting',
121*5f6caa4fSJan Kiszka            16: 'CR3-store exiting',
122*5f6caa4fSJan Kiszka            19: 'CR8-load exiting',
123*5f6caa4fSJan Kiszka            20: 'CR8-store exiting',
124*5f6caa4fSJan Kiszka            21: 'Use TPR shadow',
125*5f6caa4fSJan Kiszka            22: 'NMI-window exiting',
126*5f6caa4fSJan Kiszka            23: 'MOV-DR exiting',
127*5f6caa4fSJan Kiszka            24: 'Unconditional I/O exiting',
128*5f6caa4fSJan Kiszka            25: 'Use I/O bitmaps',
129*5f6caa4fSJan Kiszka            27: 'Monitor trap flag',
130*5f6caa4fSJan Kiszka            28: 'Use MSR bitmaps',
131*5f6caa4fSJan Kiszka            29: 'MONITOR exiting',
132*5f6caa4fSJan Kiszka            30: 'PAUSE exiting',
133*5f6caa4fSJan Kiszka            31: 'Activate secondary control',
134*5f6caa4fSJan Kiszka            },
135*5f6caa4fSJan Kiszka        cap_msr = MSR_IA32_VMX_PROCBASED_CTLS,
136*5f6caa4fSJan Kiszka        true_cap_msr = MSR_IA32_VMX_TRUE_PROCBASED_CTLS,
137*5f6caa4fSJan Kiszka        ),
138*5f6caa4fSJan Kiszka
139*5f6caa4fSJan Kiszka    Control(
140*5f6caa4fSJan Kiszka        name = 'secondary processor-based controls',
141*5f6caa4fSJan Kiszka        bits = {
142*5f6caa4fSJan Kiszka            0: 'Virtualize APIC accesses',
143*5f6caa4fSJan Kiszka            1: 'Enable EPT',
144*5f6caa4fSJan Kiszka            2: 'Descriptor-table exiting',
145*5f6caa4fSJan Kiszka            4: 'Virtualize x2APIC mode',
146*5f6caa4fSJan Kiszka            5: 'Enable VPID',
147*5f6caa4fSJan Kiszka            6: 'WBINVD exiting',
148*5f6caa4fSJan Kiszka            7: 'Unrestricted guest',
149*5f6caa4fSJan Kiszka            10: 'PAUSE-loop exiting',
150*5f6caa4fSJan Kiszka            },
151*5f6caa4fSJan Kiszka        cap_msr = MSR_IA32_VMX_PROCBASED_CTLS2,
152*5f6caa4fSJan Kiszka        ),
153*5f6caa4fSJan Kiszka
154*5f6caa4fSJan Kiszka    Control(
155*5f6caa4fSJan Kiszka        name = 'VM-Exit controls',
156*5f6caa4fSJan Kiszka        bits = {
157*5f6caa4fSJan Kiszka            2: 'Save debug controls',
158*5f6caa4fSJan Kiszka            9: 'Host address-space size',
159*5f6caa4fSJan Kiszka            12: 'Load IA32_PERF_GLOBAL_CTRL',
160*5f6caa4fSJan Kiszka            15: 'Acknowledge interrupt on exit',
161*5f6caa4fSJan Kiszka            18: 'Save IA32_PAT',
162*5f6caa4fSJan Kiszka            19: 'Load IA32_PAT',
163*5f6caa4fSJan Kiszka            20: 'Save IA32_EFER',
164*5f6caa4fSJan Kiszka            21: 'Load IA32_EFER',
165*5f6caa4fSJan Kiszka            22: 'Save VMX-preemption timer value',
166*5f6caa4fSJan Kiszka            },
167*5f6caa4fSJan Kiszka        cap_msr = MSR_IA32_VMX_EXIT_CTLS,
168*5f6caa4fSJan Kiszka        true_cap_msr = MSR_IA32_VMX_TRUE_EXIT_CTLS,
169*5f6caa4fSJan Kiszka        ),
170*5f6caa4fSJan Kiszka
171*5f6caa4fSJan Kiszka    Control(
172*5f6caa4fSJan Kiszka        name = 'VM-Entry controls',
173*5f6caa4fSJan Kiszka        bits = {
174*5f6caa4fSJan Kiszka            2: 'Load debug controls',
175*5f6caa4fSJan Kiszka            9: 'IA-64 mode guest',
176*5f6caa4fSJan Kiszka            10: 'Entry to SMM',
177*5f6caa4fSJan Kiszka            11: 'Deactivate dual-monitor treatment',
178*5f6caa4fSJan Kiszka            13: 'Load IA32_PERF_GLOBAL_CTRL',
179*5f6caa4fSJan Kiszka            14: 'Load IA32_PAT',
180*5f6caa4fSJan Kiszka            15: 'Load IA32_EFER',
181*5f6caa4fSJan Kiszka            },
182*5f6caa4fSJan Kiszka        cap_msr = MSR_IA32_VMX_ENTRY_CTLS,
183*5f6caa4fSJan Kiszka        true_cap_msr = MSR_IA32_VMX_TRUE_ENTRY_CTLS,
184*5f6caa4fSJan Kiszka        ),
185*5f6caa4fSJan Kiszka
186*5f6caa4fSJan Kiszka    Misc(
187*5f6caa4fSJan Kiszka        name = 'Miscellaneous data',
188*5f6caa4fSJan Kiszka        bits = {
189*5f6caa4fSJan Kiszka            (0,4): 'VMX-preemption timer scale (log2)',
190*5f6caa4fSJan Kiszka            5: 'Store EFER.LMA into IA-32e mode guest control',
191*5f6caa4fSJan Kiszka            6: 'HLT activity state',
192*5f6caa4fSJan Kiszka            7: 'Shutdown activity state',
193*5f6caa4fSJan Kiszka            8: 'Wait-for-SIPI activity state',
194*5f6caa4fSJan Kiszka            (16,24): 'Number of CR3-target values',
195*5f6caa4fSJan Kiszka            (25,27): 'MSR-load/store count recommenation',
196*5f6caa4fSJan Kiszka            (32,62): 'MSEG revision identifier',
197*5f6caa4fSJan Kiszka            },
198*5f6caa4fSJan Kiszka        msr = MSR_IA32_VMX_MISC_CTLS,
199*5f6caa4fSJan Kiszka        ),
200*5f6caa4fSJan Kiszka
201*5f6caa4fSJan Kiszka    Misc(
202*5f6caa4fSJan Kiszka        name = 'VPID and EPT capabilities',
203*5f6caa4fSJan Kiszka        bits = {
204*5f6caa4fSJan Kiszka            0: 'Execute-only EPT translations',
205*5f6caa4fSJan Kiszka            6: 'Page-walk length 4',
206*5f6caa4fSJan Kiszka            8: 'Paging-structure memory type UC',
207*5f6caa4fSJan Kiszka            14: 'Paging-structure memory type WB',
208*5f6caa4fSJan Kiszka            16: '2MB EPT pages',
209*5f6caa4fSJan Kiszka            17: '1GB EPT pages',
210*5f6caa4fSJan Kiszka            20: 'INVEPT supported',
211*5f6caa4fSJan Kiszka            25: 'Single-context INVEPT',
212*5f6caa4fSJan Kiszka            26: 'All-context INVEPT',
213*5f6caa4fSJan Kiszka            32: 'INVVPID supported',
214*5f6caa4fSJan Kiszka            40: 'Individual-address INVVPID',
215*5f6caa4fSJan Kiszka            41: 'Single-context INVVPID',
216*5f6caa4fSJan Kiszka            42: 'All-context INVVPID',
217*5f6caa4fSJan Kiszka            43: 'Single-context-retaining-globals INVVPID',
218*5f6caa4fSJan Kiszka            },
219*5f6caa4fSJan Kiszka        msr = MSR_IA32_VMX_EPT_VPID_CAP,
220*5f6caa4fSJan Kiszka        ),
221*5f6caa4fSJan Kiszka    ]
222*5f6caa4fSJan Kiszka
223*5f6caa4fSJan Kiszkafor c in controls:
224*5f6caa4fSJan Kiszka    c.show()
225