Annotation of qemu/scripts/kvm/vmxcap, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.