#!/bin/sh # # kvm-ok - check whether the CPU we're running on supports KVM acceleration # Copyright (C) 2008-2010 Canonical Ltd. # # Authors: # Dustin Kirkland # Kees Cook # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e assert_root() { if [ "$(id -u)" != "0" ]; then echo "INFO: For more detailed results, you should run this as root" echo "HINT: sudo $0" exit 1 fi } verdict() { # Print verdict if [ "$1" = "0" ]; then echo "KVM acceleration can be used" exit 0 else echo "KVM acceleration can NOT be used" exit 1 fi } ARM_CPU_PART_CORTEX_A15="0xc0f" # # check cpu flags for capability if [ "$(uname -m)" = "armv7l" ]; then if egrep -m1 -w '^CPU part[[:blank:]]*:' /proc/cpuinfo | \ egrep -wq "$ARM_CPU_PART_CORTEX_A15"; then virt="ARM" kvm_mod="kvm" fi elif [ "$(uname -m)" = "aarch64" ]; then virt="ARM" kvm_mod="kvm" elif [ "$(uname -m)" = "ppc64le" ]; then # FIXME: Assume that all ppc64el is kvm capable exit 0 virt="POWER" kvm_mod="kvm" else virt=$(egrep -m1 -w '^flags[[:blank:]]*:' /proc/cpuinfo | egrep -wo '(vmx|svm)') || true [ "$virt" = "vmx" ] && kvm_mod="kvm_intel" [ "$virt" = "svm" ] && kvm_mod="kvm_amd" fi if [ -z "$virt" ]; then echo "INFO: Your CPU does not support KVM extensions" assert_root verdict 1 fi # Now, check that the device exists if [ -e /dev/kvm ]; then echo "INFO: /dev/kvm exists" verdict 0 else echo "INFO: /dev/kvm does not exist" echo "HINT: sudo modprobe $kvm_mod" fi assert_root # Prepare MSR access msr="/dev/cpu/0/msr" if [ ! -r "$msr" ]; then modprobe msr fi if [ -e "$msr" -a ! -r "$msr" ]; then echo "You must be root to run this check." >&2 exit 2 fi echo "INFO: Your CPU supports KVM extensions" disabled=0 # check brand-specific registers if [ "$virt" = "vmx" ]; then BIT=$(rdmsr --bitfield 0:0 0x3a 2>/dev/null || true) if [ "$BIT" = "1" ]; then # and FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX clear (no tboot) BIT=$(rdmsr --bitfield 2:2 0x3a 2>/dev/null || true) if [ "$BIT" = "0" ]; then disabled=1 fi fi elif [ "$virt" = "svm" ]; then BIT=$(rdmsr --bitfield 4:4 0xc0010114 2>/dev/null || true) if [ "$BIT" = "1" ]; then disabled=1 fi elif [ "$virt" = "ARM" ]; then # Should also test that we booted in HYP mode, if detectable : elif [ "$virt" = "POWER" ]; then # Should also test that we booted in HYP mode, if detectable : else echo "FAIL: Unknown virtualization extension: $virt" verdict 1 fi if [ "$disabled" -eq 1 ]; then echo "INFO: KVM ($virt) is disabled by your BIOS" echo "HINT: Enter your BIOS setup and enable Virtualization Technology (VT)," echo " and then hard poweroff/poweron your system" verdict 1 fi verdict 0