2016-06-01 21:57:00 +08:00
|
|
|
#!/bin/bash
|
|
|
|
#
|
|
|
|
# The cpuid tool can be usually found in a package called "cpuid". If your
|
|
|
|
# distro does not provide such package, you can find the sources or binary
|
|
|
|
# packages at http://www.etallen.com/cpuid.html
|
|
|
|
|
|
|
|
grep 'model name' /proc/cpuinfo | head -n1
|
|
|
|
|
|
|
|
cpuid -1r
|
|
|
|
echo
|
2019-03-26 17:18:10 +08:00
|
|
|
|
|
|
|
for python in python3 python2; do
|
|
|
|
$python <<EOF
|
|
|
|
from __future__ import print_function
|
|
|
|
from struct import pack, unpack
|
|
|
|
from fcntl import ioctl
|
|
|
|
import sys, errno
|
|
|
|
|
|
|
|
IA32_ARCH_CAPABILITIES_MSR = 0x10a
|
|
|
|
KVM_GET_MSRS = 0xc008ae88
|
|
|
|
|
|
|
|
def print_msr(msr, via=None):
|
|
|
|
if via is None:
|
|
|
|
print("MSR:")
|
|
|
|
else:
|
|
|
|
print("MSR via %s:" % via)
|
|
|
|
print(" 0x%x: 0x%016x" % (IA32_ARCH_CAPABILITIES_MSR, msr))
|
|
|
|
print()
|
|
|
|
|
|
|
|
try:
|
|
|
|
fd = open("/dev/cpu/0/msr", "rb")
|
|
|
|
fd.seek(IA32_ARCH_CAPABILITIES_MSR)
|
|
|
|
buf = fd.read(8)
|
|
|
|
msr = unpack("=Q", buf)[0]
|
|
|
|
|
|
|
|
print_msr(msr)
|
|
|
|
sys.exit(0)
|
|
|
|
except IOError as e:
|
|
|
|
# The MSR is not supported on the host
|
|
|
|
if e.errno == errno.EIO:
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
try:
|
|
|
|
fd = open("/dev/kvm", "r")
|
|
|
|
bufIn = pack("=LLLLQ", 1, 0, IA32_ARCH_CAPABILITIES_MSR, 0, 0)
|
|
|
|
bufOut = ioctl(fd, KVM_GET_MSRS, bufIn)
|
|
|
|
msr = unpack("=LLLLQ", bufOut)[4]
|
|
|
|
|
|
|
|
print_msr(msr, via="KVM")
|
|
|
|
except IOError as e:
|
|
|
|
pass
|
|
|
|
EOF
|
|
|
|
|
|
|
|
if [[ $? -eq 0 ]]; then
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2016-06-01 21:57:00 +08:00
|
|
|
qemu=qemu-system-x86_64
|
|
|
|
for cmd in /usr/bin/$qemu /usr/bin/qemu-kvm /usr/libexec/qemu-kvm; do
|
|
|
|
if [[ -x $cmd ]]; then
|
|
|
|
qemu=$cmd
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
qom_get()
|
|
|
|
{
|
|
|
|
path='/machine/unattached/device[0]'
|
|
|
|
echo '{"execute":"qom-get","arguments":{"path":"'$path'",' \
|
|
|
|
'"property":"'$1'"},"id":"'$1'"}'
|
|
|
|
}
|
|
|
|
|
2017-02-02 00:48:41 +08:00
|
|
|
model_expansion()
|
|
|
|
{
|
|
|
|
mode=$1
|
|
|
|
model=$2
|
|
|
|
|
|
|
|
echo '{"execute":"query-cpu-model-expansion","arguments":' \
|
|
|
|
'{"type":"'"$mode"'","model":'"$model"'},"id":"model-expansion"}'
|
|
|
|
}
|
|
|
|
|
|
|
|
model=$(
|
|
|
|
$qemu -machine accel=kvm -cpu host -nodefaults -nographic -qmp stdio <<EOF
|
|
|
|
{"execute":"qmp_capabilities"}
|
|
|
|
$(model_expansion static '{"name":"host"}')
|
|
|
|
{"execute":"quit"}
|
|
|
|
EOF
|
|
|
|
)
|
|
|
|
model=$(
|
|
|
|
echo "$model" | \
|
|
|
|
sed -ne 's/^{"return": {"model": {\(.*{.*}\)}}, .*/{\1}/p'
|
|
|
|
)
|
|
|
|
|
2016-06-01 21:57:00 +08:00
|
|
|
$qemu -machine accel=kvm -cpu host -nodefaults -nographic -qmp stdio <<EOF
|
|
|
|
{"execute":"qmp_capabilities"}
|
2017-02-02 00:48:41 +08:00
|
|
|
$(
|
|
|
|
if [ "x$model" != x ]; then
|
|
|
|
model_expansion full "$model"
|
|
|
|
else
|
|
|
|
qom_get feature-words
|
|
|
|
qom_get family
|
|
|
|
qom_get model
|
|
|
|
qom_get stepping
|
|
|
|
qom_get model-id
|
|
|
|
fi
|
|
|
|
)
|
2017-09-27 03:08:37 +08:00
|
|
|
{"execute":"query-cpu-definitions","id":"definitions"}
|
2016-06-01 21:57:00 +08:00
|
|
|
{"execute":"quit"}
|
|
|
|
EOF
|