1e57a707aSPhilippe Mathieu-Daudé#!/usr/bin/env python3 25f6caa4fSJan Kiszka# 35f6caa4fSJan Kiszka# tool for querying VMX capabilities 45f6caa4fSJan Kiszka# 55f6caa4fSJan Kiszka# Copyright 2009-2010 Red Hat, Inc. 65f6caa4fSJan Kiszka# 75f6caa4fSJan Kiszka# Authors: 85f6caa4fSJan Kiszka# Avi Kivity <avi@redhat.com> 95f6caa4fSJan Kiszka# 105f6caa4fSJan Kiszka# This work is licensed under the terms of the GNU GPL, version 2. See 115f6caa4fSJan Kiszka# the COPYING file in the top-level directory. 125f6caa4fSJan Kiszka 135f6caa4fSJan KiszkaMSR_IA32_VMX_BASIC = 0x480 145f6caa4fSJan KiszkaMSR_IA32_VMX_PINBASED_CTLS = 0x481 155f6caa4fSJan KiszkaMSR_IA32_VMX_PROCBASED_CTLS = 0x482 165f6caa4fSJan KiszkaMSR_IA32_VMX_EXIT_CTLS = 0x483 175f6caa4fSJan KiszkaMSR_IA32_VMX_ENTRY_CTLS = 0x484 185f6caa4fSJan KiszkaMSR_IA32_VMX_MISC_CTLS = 0x485 195f6caa4fSJan KiszkaMSR_IA32_VMX_PROCBASED_CTLS2 = 0x48B 205f6caa4fSJan KiszkaMSR_IA32_VMX_EPT_VPID_CAP = 0x48C 215f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_PINBASED_CTLS = 0x48D 225f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_PROCBASED_CTLS = 0x48E 235f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_EXIT_CTLS = 0x48F 245f6caa4fSJan KiszkaMSR_IA32_VMX_TRUE_ENTRY_CTLS = 0x490 25287d55c6SAvi KivityMSR_IA32_VMX_VMFUNC = 0x491 26333dbac3SPaolo BonziniMSR_IA32_VMX_PROCBASED_CTLS3 = 0x492 272e641870SXin LiMSR_IA32_VMX_EXIT_CTLS2 = 0x493 285f6caa4fSJan Kiszka 295f6caa4fSJan Kiszkaclass msr(object): 305f6caa4fSJan Kiszka def __init__(self): 315f6caa4fSJan Kiszka try: 32c3e31eaaSPaolo Bonzini self.f = open('/dev/cpu/0/msr', 'rb', 0) 335f6caa4fSJan Kiszka except: 34c3e31eaaSPaolo Bonzini self.f = open('/dev/msr0', 'rb', 0) 355f6caa4fSJan Kiszka def read(self, index, default = None): 365f6caa4fSJan Kiszka import struct 375f6caa4fSJan Kiszka self.f.seek(index) 385f6caa4fSJan Kiszka try: 395f6caa4fSJan Kiszka return struct.unpack('Q', self.f.read(8))[0] 405f6caa4fSJan Kiszka except: 415f6caa4fSJan Kiszka return default 425f6caa4fSJan Kiszka 435f6caa4fSJan Kiszkaclass Control(object): 445f6caa4fSJan Kiszka def __init__(self, name, bits, cap_msr, true_cap_msr = None): 455f6caa4fSJan Kiszka self.name = name 465f6caa4fSJan Kiszka self.bits = bits 475f6caa4fSJan Kiszka self.cap_msr = cap_msr 485f6caa4fSJan Kiszka self.true_cap_msr = true_cap_msr 495f6caa4fSJan Kiszka def read2(self, nr): 505f6caa4fSJan Kiszka m = msr() 515f6caa4fSJan Kiszka val = m.read(nr, 0) 525f6caa4fSJan Kiszka return (val & 0xffffffff, val >> 32) 535f6caa4fSJan Kiszka def show(self): 54c3e31eaaSPaolo Bonzini print(self.name) 5549d51b89SPaolo Bonzini mb1, cb1 = self.read2(self.cap_msr) 5649d51b89SPaolo Bonzini tmb1, tcb1 = 0, 0 575f6caa4fSJan Kiszka if self.true_cap_msr: 5849d51b89SPaolo Bonzini tmb1, tcb1 = self.read2(self.true_cap_msr) 595f6caa4fSJan Kiszka for bit in sorted(self.bits.keys()): 6049d51b89SPaolo Bonzini zero = not (mb1 & (1 << bit)) 6149d51b89SPaolo Bonzini one = cb1 & (1 << bit) 6249d51b89SPaolo Bonzini true_zero = not (tmb1 & (1 << bit)) 6349d51b89SPaolo Bonzini true_one = tcb1 & (1 << bit) 645f6caa4fSJan Kiszka s= '?' 655f6caa4fSJan Kiszka if (self.true_cap_msr and true_zero and true_one 665f6caa4fSJan Kiszka and one and not zero): 675f6caa4fSJan Kiszka s = 'default' 685f6caa4fSJan Kiszka elif zero and not one: 695f6caa4fSJan Kiszka s = 'no' 705f6caa4fSJan Kiszka elif one and not zero: 715f6caa4fSJan Kiszka s = 'forced' 725f6caa4fSJan Kiszka elif one and zero: 735f6caa4fSJan Kiszka s = 'yes' 74c3e31eaaSPaolo Bonzini print(' %-40s %s' % (self.bits[bit], s)) 755f6caa4fSJan Kiszka 76333dbac3SPaolo Bonzini# All 64 bits in the tertiary controls MSR are allowed-1 77333dbac3SPaolo Bonziniclass Allowed1Control(Control): 78333dbac3SPaolo Bonzini def read2(self, nr): 79333dbac3SPaolo Bonzini m = msr() 80333dbac3SPaolo Bonzini val = m.read(nr, 0) 81333dbac3SPaolo Bonzini return (0, val) 82333dbac3SPaolo Bonzini 835f6caa4fSJan Kiszkaclass Misc(object): 845f6caa4fSJan Kiszka def __init__(self, name, bits, msr): 855f6caa4fSJan Kiszka self.name = name 865f6caa4fSJan Kiszka self.bits = bits 875f6caa4fSJan Kiszka self.msr = msr 885f6caa4fSJan Kiszka def show(self): 89c3e31eaaSPaolo Bonzini print(self.name) 905f6caa4fSJan Kiszka value = msr().read(self.msr, 0) 91c3e31eaaSPaolo Bonzini print(' Hex: 0x%x' % (value)) 925f6caa4fSJan Kiszka def first_bit(key): 935f6caa4fSJan Kiszka if type(key) is tuple: 945f6caa4fSJan Kiszka return key[0] 955f6caa4fSJan Kiszka else: 965f6caa4fSJan Kiszka return key 975f6caa4fSJan Kiszka for bits in sorted(self.bits.keys(), key = first_bit): 985f6caa4fSJan Kiszka if type(bits) is tuple: 995f6caa4fSJan Kiszka lo, hi = bits 1005f6caa4fSJan Kiszka fmt = int 1015f6caa4fSJan Kiszka else: 1025f6caa4fSJan Kiszka lo = hi = bits 1035f6caa4fSJan Kiszka def fmt(x): 1045f6caa4fSJan Kiszka return { True: 'yes', False: 'no' }[x] 1055f6caa4fSJan Kiszka v = (value >> lo) & ((1 << (hi - lo + 1)) - 1) 106c3e31eaaSPaolo Bonzini print(' %-40s %s' % (self.bits[bits], fmt(v))) 1075f6caa4fSJan Kiszka 1085f6caa4fSJan Kiszkacontrols = [ 109ea4ee283SJan Kiszka Misc( 110ea4ee283SJan Kiszka name = 'Basic VMX Information', 111ea4ee283SJan Kiszka bits = { 112c5d1e2ccSAdrian-Ken Rueegsegger (0, 30): 'Revision', 113ea4ee283SJan Kiszka (32,44): 'VMCS size', 114ea4ee283SJan Kiszka 48: 'VMCS restricted to 32 bit addresses', 115ea4ee283SJan Kiszka 49: 'Dual-monitor support', 116ea4ee283SJan Kiszka (50, 53): 'VMCS memory type', 117ea4ee283SJan Kiszka 54: 'INS/OUTS instruction information', 118ea4ee283SJan Kiszka 55: 'IA32_VMX_TRUE_*_CTLS support', 1190c49c918SPaolo Bonzini 56: 'Skip checks on event error code', 120*ef202d64SXin Li 58: 'VMX nested exception support', 121ea4ee283SJan Kiszka }, 122ea4ee283SJan Kiszka msr = MSR_IA32_VMX_BASIC, 123ea4ee283SJan Kiszka ), 1245f6caa4fSJan Kiszka Control( 1255f6caa4fSJan Kiszka name = 'pin-based controls', 1265f6caa4fSJan Kiszka bits = { 1275f6caa4fSJan Kiszka 0: 'External interrupt exiting', 1285f6caa4fSJan Kiszka 3: 'NMI exiting', 1295f6caa4fSJan Kiszka 5: 'Virtual NMIs', 1305f6caa4fSJan Kiszka 6: 'Activate VMX-preemption timer', 131ea4ee283SJan Kiszka 7: 'Process posted interrupts', 1325f6caa4fSJan Kiszka }, 1335f6caa4fSJan Kiszka cap_msr = MSR_IA32_VMX_PINBASED_CTLS, 1345f6caa4fSJan Kiszka true_cap_msr = MSR_IA32_VMX_TRUE_PINBASED_CTLS, 1355f6caa4fSJan Kiszka ), 1365f6caa4fSJan Kiszka 1375f6caa4fSJan Kiszka Control( 1385f6caa4fSJan Kiszka name = 'primary processor-based controls', 1395f6caa4fSJan Kiszka bits = { 1405f6caa4fSJan Kiszka 2: 'Interrupt window exiting', 1415f6caa4fSJan Kiszka 3: 'Use TSC offsetting', 1425f6caa4fSJan Kiszka 7: 'HLT exiting', 1435f6caa4fSJan Kiszka 9: 'INVLPG exiting', 1445f6caa4fSJan Kiszka 10: 'MWAIT exiting', 1455f6caa4fSJan Kiszka 11: 'RDPMC exiting', 1465f6caa4fSJan Kiszka 12: 'RDTSC exiting', 1475f6caa4fSJan Kiszka 15: 'CR3-load exiting', 1485f6caa4fSJan Kiszka 16: 'CR3-store exiting', 149333dbac3SPaolo Bonzini 17: 'Activate tertiary controls', 1505f6caa4fSJan Kiszka 19: 'CR8-load exiting', 1515f6caa4fSJan Kiszka 20: 'CR8-store exiting', 1525f6caa4fSJan Kiszka 21: 'Use TPR shadow', 1535f6caa4fSJan Kiszka 22: 'NMI-window exiting', 1545f6caa4fSJan Kiszka 23: 'MOV-DR exiting', 1555f6caa4fSJan Kiszka 24: 'Unconditional I/O exiting', 1565f6caa4fSJan Kiszka 25: 'Use I/O bitmaps', 1575f6caa4fSJan Kiszka 27: 'Monitor trap flag', 1585f6caa4fSJan Kiszka 28: 'Use MSR bitmaps', 1595f6caa4fSJan Kiszka 29: 'MONITOR exiting', 1605f6caa4fSJan Kiszka 30: 'PAUSE exiting', 1615f6caa4fSJan Kiszka 31: 'Activate secondary control', 1625f6caa4fSJan Kiszka }, 1635f6caa4fSJan Kiszka cap_msr = MSR_IA32_VMX_PROCBASED_CTLS, 1645f6caa4fSJan Kiszka true_cap_msr = MSR_IA32_VMX_TRUE_PROCBASED_CTLS, 1655f6caa4fSJan Kiszka ), 1665f6caa4fSJan Kiszka 1675f6caa4fSJan Kiszka Control( 1685f6caa4fSJan Kiszka name = 'secondary processor-based controls', 1695f6caa4fSJan Kiszka bits = { 1705f6caa4fSJan Kiszka 0: 'Virtualize APIC accesses', 1715f6caa4fSJan Kiszka 1: 'Enable EPT', 1725f6caa4fSJan Kiszka 2: 'Descriptor-table exiting', 173614413f7SJan Kiszka 3: 'Enable RDTSCP', 1745f6caa4fSJan Kiszka 4: 'Virtualize x2APIC mode', 1755f6caa4fSJan Kiszka 5: 'Enable VPID', 1765f6caa4fSJan Kiszka 6: 'WBINVD exiting', 1775f6caa4fSJan Kiszka 7: 'Unrestricted guest', 178614413f7SJan Kiszka 8: 'APIC register emulation', 179f9e90c79SMarcelo Tosatti 9: 'Virtual interrupt delivery', 1805f6caa4fSJan Kiszka 10: 'PAUSE-loop exiting', 181287d55c6SAvi Kivity 11: 'RDRAND exiting', 182287d55c6SAvi Kivity 12: 'Enable INVPCID', 183287d55c6SAvi Kivity 13: 'Enable VM functions', 184007e986fSJan Kiszka 14: 'VMCS shadowing', 185025533f6SPaolo Bonzini 15: 'Enable ENCLS exiting', 186c5d1e2ccSAdrian-Ken Rueegsegger 16: 'RDSEED exiting', 187025533f6SPaolo Bonzini 17: 'Enable PML', 188c5d1e2ccSAdrian-Ken Rueegsegger 18: 'EPT-violation #VE', 189025533f6SPaolo Bonzini 19: 'Conceal non-root operation from PT', 190c5d1e2ccSAdrian-Ken Rueegsegger 20: 'Enable XSAVES/XRSTORS', 191025533f6SPaolo Bonzini 22: 'Mode-based execute control (XS/XU)', 192fc7d2b45SJan Kiszka 23: 'Sub-page write permissions', 193fc7d2b45SJan Kiszka 24: 'GPA translation for PT', 194349cb2fbSEduardo Habkost 25: 'TSC scaling', 195fc7d2b45SJan Kiszka 26: 'User wait and pause', 196fc7d2b45SJan Kiszka 28: 'ENCLV exiting', 1975f6caa4fSJan Kiszka }, 1985f6caa4fSJan Kiszka cap_msr = MSR_IA32_VMX_PROCBASED_CTLS2, 1995f6caa4fSJan Kiszka ), 2005f6caa4fSJan Kiszka 201333dbac3SPaolo Bonzini Allowed1Control( 202333dbac3SPaolo Bonzini name = 'tertiary processor-based controls', 203333dbac3SPaolo Bonzini bits = { 204333dbac3SPaolo Bonzini 4: 'Enable IPI virtualization' 205333dbac3SPaolo Bonzini }, 206333dbac3SPaolo Bonzini cap_msr = MSR_IA32_VMX_PROCBASED_CTLS3, 207333dbac3SPaolo Bonzini ), 208333dbac3SPaolo Bonzini 2095f6caa4fSJan Kiszka Control( 2105f6caa4fSJan Kiszka name = 'VM-Exit controls', 2115f6caa4fSJan Kiszka bits = { 2125f6caa4fSJan Kiszka 2: 'Save debug controls', 2135f6caa4fSJan Kiszka 9: 'Host address-space size', 2145f6caa4fSJan Kiszka 12: 'Load IA32_PERF_GLOBAL_CTRL', 2155f6caa4fSJan Kiszka 15: 'Acknowledge interrupt on exit', 2165f6caa4fSJan Kiszka 18: 'Save IA32_PAT', 2175f6caa4fSJan Kiszka 19: 'Load IA32_PAT', 2185f6caa4fSJan Kiszka 20: 'Save IA32_EFER', 2195f6caa4fSJan Kiszka 21: 'Load IA32_EFER', 2205f6caa4fSJan Kiszka 22: 'Save VMX-preemption timer value', 221025533f6SPaolo Bonzini 23: 'Clear IA32_BNDCFGS', 222025533f6SPaolo Bonzini 24: 'Conceal VM exits from PT', 223fc7d2b45SJan Kiszka 25: 'Clear IA32_RTIT_CTL', 2242e641870SXin Li 31: 'Activate secondary VM-exit controls', 2255f6caa4fSJan Kiszka }, 2265f6caa4fSJan Kiszka cap_msr = MSR_IA32_VMX_EXIT_CTLS, 2275f6caa4fSJan Kiszka true_cap_msr = MSR_IA32_VMX_TRUE_EXIT_CTLS, 2285f6caa4fSJan Kiszka ), 2295f6caa4fSJan Kiszka 2302e641870SXin Li Allowed1Control( 2312e641870SXin Li name = 'secondary VM-Exit controls', 2322e641870SXin Li bits = { 2332e641870SXin Li 0: 'Save IA32 FRED MSRs', 2342e641870SXin Li 1: 'Load IA32 FRED MSRs', 2352e641870SXin Li }, 2362e641870SXin Li cap_msr = MSR_IA32_VMX_EXIT_CTLS2, 2372e641870SXin Li ), 2382e641870SXin Li 2395f6caa4fSJan Kiszka Control( 2405f6caa4fSJan Kiszka name = 'VM-Entry controls', 2415f6caa4fSJan Kiszka bits = { 2425f6caa4fSJan Kiszka 2: 'Load debug controls', 243c5d1e2ccSAdrian-Ken Rueegsegger 9: 'IA-32e mode guest', 2445f6caa4fSJan Kiszka 10: 'Entry to SMM', 2455f6caa4fSJan Kiszka 11: 'Deactivate dual-monitor treatment', 2465f6caa4fSJan Kiszka 13: 'Load IA32_PERF_GLOBAL_CTRL', 2475f6caa4fSJan Kiszka 14: 'Load IA32_PAT', 2485f6caa4fSJan Kiszka 15: 'Load IA32_EFER', 249025533f6SPaolo Bonzini 16: 'Load IA32_BNDCFGS', 250025533f6SPaolo Bonzini 17: 'Conceal VM entries from PT', 251fc7d2b45SJan Kiszka 18: 'Load IA32_RTIT_CTL', 2522e641870SXin Li 23: 'Load IA32 FRED MSRs', 2535f6caa4fSJan Kiszka }, 2545f6caa4fSJan Kiszka cap_msr = MSR_IA32_VMX_ENTRY_CTLS, 2555f6caa4fSJan Kiszka true_cap_msr = MSR_IA32_VMX_TRUE_ENTRY_CTLS, 2565f6caa4fSJan Kiszka ), 2575f6caa4fSJan Kiszka 2585f6caa4fSJan Kiszka Misc( 2595f6caa4fSJan Kiszka name = 'Miscellaneous data', 2605f6caa4fSJan Kiszka bits = { 2615f6caa4fSJan Kiszka (0,4): 'VMX-preemption timer scale (log2)', 2625f6caa4fSJan Kiszka 5: 'Store EFER.LMA into IA-32e mode guest control', 2635f6caa4fSJan Kiszka 6: 'HLT activity state', 2645f6caa4fSJan Kiszka 7: 'Shutdown activity state', 2655f6caa4fSJan Kiszka 8: 'Wait-for-SIPI activity state', 266fc7d2b45SJan Kiszka 14: 'PT in VMX operation', 267007e986fSJan Kiszka 15: 'IA32_SMBASE support', 2685f6caa4fSJan Kiszka (16,24): 'Number of CR3-target values', 269c5d1e2ccSAdrian-Ken Rueegsegger (25,27): 'MSR-load/store count recommendation', 270287d55c6SAvi Kivity 28: 'IA32_SMM_MONITOR_CTL[2] can be set to 1', 271007e986fSJan Kiszka 29: 'VMWRITE to VM-exit information fields', 272025533f6SPaolo Bonzini 30: 'Inject event with insn length=0', 273007e986fSJan Kiszka (32,63): 'MSEG revision identifier', 2745f6caa4fSJan Kiszka }, 2755f6caa4fSJan Kiszka msr = MSR_IA32_VMX_MISC_CTLS, 2765f6caa4fSJan Kiszka ), 2775f6caa4fSJan Kiszka 2785f6caa4fSJan Kiszka Misc( 2795f6caa4fSJan Kiszka name = 'VPID and EPT capabilities', 2805f6caa4fSJan Kiszka bits = { 2815f6caa4fSJan Kiszka 0: 'Execute-only EPT translations', 2825f6caa4fSJan Kiszka 6: 'Page-walk length 4', 283d312378eSVitaly Kuznetsov 7: 'Page-walk length 5', 2845f6caa4fSJan Kiszka 8: 'Paging-structure memory type UC', 2855f6caa4fSJan Kiszka 14: 'Paging-structure memory type WB', 2865f6caa4fSJan Kiszka 16: '2MB EPT pages', 2875f6caa4fSJan Kiszka 17: '1GB EPT pages', 2885f6caa4fSJan Kiszka 20: 'INVEPT supported', 289287d55c6SAvi Kivity 21: 'EPT accessed and dirty flags', 290fc7d2b45SJan Kiszka 22: 'Advanced VM-exit information for EPT violations', 2915f6caa4fSJan Kiszka 25: 'Single-context INVEPT', 2925f6caa4fSJan Kiszka 26: 'All-context INVEPT', 2935f6caa4fSJan Kiszka 32: 'INVVPID supported', 2945f6caa4fSJan Kiszka 40: 'Individual-address INVVPID', 2955f6caa4fSJan Kiszka 41: 'Single-context INVVPID', 2965f6caa4fSJan Kiszka 42: 'All-context INVVPID', 2975f6caa4fSJan Kiszka 43: 'Single-context-retaining-globals INVVPID', 2985f6caa4fSJan Kiszka }, 2995f6caa4fSJan Kiszka msr = MSR_IA32_VMX_EPT_VPID_CAP, 3005f6caa4fSJan Kiszka ), 301287d55c6SAvi Kivity Misc( 302287d55c6SAvi Kivity name = 'VM Functions', 303287d55c6SAvi Kivity bits = { 304287d55c6SAvi Kivity 0: 'EPTP Switching', 305287d55c6SAvi Kivity }, 306287d55c6SAvi Kivity msr = MSR_IA32_VMX_VMFUNC, 307287d55c6SAvi Kivity ), 3085f6caa4fSJan Kiszka ] 3095f6caa4fSJan Kiszka 310e57a707aSPhilippe Mathieu-Daudéif __name__ == '__main__': 3115f6caa4fSJan Kiszka for c in controls: 3125f6caa4fSJan Kiszka c.show() 313