blob: 7395cee793a7d1b5beaeba2c0818ba1f8fda344a [file] [log] [blame]
Wainer dos Santos Moschetta8b272e02019-12-16 16:14:34 -03001"""
2QEMU accel module:
3
4This module provides utilities for discover and check the availability of
5accelerators.
6"""
7# Copyright (C) 2015-2016 Red Hat Inc.
8# Copyright (C) 2012 IBM Corp.
9#
10# Authors:
11# Fam Zheng <famz@redhat.com>
12#
13# This work is licensed under the terms of the GNU GPL, version 2. See
14# the COPYING file in the top-level directory.
15#
16
Wainer dos Santos Moschetta1650c3e2019-12-16 16:14:35 -030017import logging
Wainer dos Santos Moschetta8b272e02019-12-16 16:14:34 -030018import os
Wainer dos Santos Moschetta1650c3e2019-12-16 16:14:35 -030019import subprocess
20
21LOG = logging.getLogger(__name__)
Wainer dos Santos Moschetta8b272e02019-12-16 16:14:34 -030022
23# Mapping host architecture to any additional architectures it can
24# support which often includes its 32 bit cousin.
25ADDITIONAL_ARCHES = {
26 "x86_64" : "i386",
27 "aarch64" : "armhf"
28}
29
Wainer dos Santos Moschetta1650c3e2019-12-16 16:14:35 -030030def list_accel(qemu_bin):
31 """
32 List accelerators enabled in the QEMU binary.
33
34 @param qemu_bin (str): path to the QEMU binary.
35 @raise Exception: if failed to run `qemu -accel help`
36 @return a list of accelerator names.
37 """
38 if not qemu_bin:
39 return []
40 try:
41 out = subprocess.check_output([qemu_bin, '-accel', 'help'],
42 universal_newlines=True)
43 except:
44 LOG.debug("Failed to get the list of accelerators in %s", qemu_bin)
45 raise
46 # Skip the first line which is the header.
47 return [acc.strip() for acc in out.splitlines()[1:]]
48
Wainer dos Santos Moschetta8b272e02019-12-16 16:14:34 -030049def kvm_available(target_arch=None):
50 host_arch = os.uname()[4]
51 if target_arch and target_arch != host_arch:
52 if target_arch != ADDITIONAL_ARCHES.get(host_arch):
53 return False
54 return os.access("/dev/kvm", os.R_OK | os.W_OK)