4 This module provides utilities for discover and check the availability of
7 # Copyright (C) 2015-2016 Red Hat Inc.
8 # Copyright (C) 2012 IBM Corp.
13 # This work is licensed under the terms of the GNU GPL, version 2. See
14 # the COPYING file in the top-level directory.
20 from typing import List, Optional
23 LOG = logging.getLogger(__name__)
25 # Mapping host architecture to any additional architectures it can
26 # support which often includes its 32 bit cousin.
34 def list_accel(qemu_bin: str) -> List[str]:
36 List accelerators enabled in the QEMU binary.
38 @param qemu_bin (str): path to the QEMU binary.
39 @raise Exception: if failed to run ``qemu -accel help``
40 @return a list of accelerator names.
45 out = subprocess.check_output([qemu_bin, '-accel', 'help'],
46 universal_newlines=True)
48 LOG.debug("Failed to get the list of accelerators in %s", qemu_bin)
50 # Skip the first line which is the header.
51 return [acc.strip() for acc in out.splitlines()[1:]]
54 def kvm_available(target_arch: Optional[str] = None,
55 qemu_bin: Optional[str] = None) -> bool:
57 Check if KVM is available using the following heuristic:
58 - Kernel module is present in the host;
59 - Target and host arches don't mismatch;
60 - KVM is enabled in the QEMU binary.
62 @param target_arch (str): target architecture
63 @param qemu_bin (str): path to the QEMU binary
64 @return True if kvm is available, otherwise False.
66 if not os.access("/dev/kvm", os.R_OK | os.W_OK):
69 host_arch = os.uname()[4]
70 if target_arch != host_arch:
71 if target_arch != ADDITIONAL_ARCHES.get(host_arch):
73 if qemu_bin and "kvm" not in list_accel(qemu_bin):
78 def tcg_available(qemu_bin: str) -> bool:
80 Check if TCG is available.
82 @param qemu_bin (str): path to the QEMU binary
84 return 'tcg' in list_accel(qemu_bin)