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