maintainer updates (gitlab, check-tcg, virtio-gpu, plugins, docs)
- drop aarch32 runner from custom runners - use template for aarch64 custom jobs - don't test for atime in linux-test - drop extra draw call causing corruption in gtk-gl-area - add trace event for blob map/unmap - extend ufrace_symbols to generate dbg files - group VirtIO devices in device documentation - merge vhost-user device docs into single file -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmj2L2EACgkQ+9DbCVqe KkQhFAf/d22W8F3h4E9N1y2t4OaIsVH6iynctKuKqURbW4g/QngreMnvge12Ixf1 puSkvMTPVAkEzT/mm+jl3XPgBOnayj5kiU/RAEGmpuelhlE9gJftIikHlfbr+urF kWbdrug8EuPwu7XVAfvUoygjDEfC50EzDyw45saGq4h1fQS7hVganBKPV20Ha4SQ Qf4F3pLO//4DC2LcUFKEeCf4l0i/jXXmeJvbT9bucGD057NVcPJY7v6Cw4UwQvla GBwY5NaxuORpfOQOWobuTn2fcbIw6E4yFuEuRd++ZsPGRFIS6Fzo4Xiw3xzd70qD ms0bFg6cvMMyzqVlf2THdHxozVuU5w== =kh5z -----END PGP SIGNATURE----- Merge tag 'pull-10.2-maintainer-201025-2' of https://gitlab.com/stsquad/qemu into staging maintainer updates (gitlab, check-tcg, virtio-gpu, plugins, docs) - drop aarch32 runner from custom runners - use template for aarch64 custom jobs - don't test for atime in linux-test - drop extra draw call causing corruption in gtk-gl-area - add trace event for blob map/unmap - extend ufrace_symbols to generate dbg files - group VirtIO devices in device documentation - merge vhost-user device docs into single file # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmj2L2EACgkQ+9DbCVqe # KkQhFAf/d22W8F3h4E9N1y2t4OaIsVH6iynctKuKqURbW4g/QngreMnvge12Ixf1 # puSkvMTPVAkEzT/mm+jl3XPgBOnayj5kiU/RAEGmpuelhlE9gJftIikHlfbr+urF # kWbdrug8EuPwu7XVAfvUoygjDEfC50EzDyw45saGq4h1fQS7hVganBKPV20Ha4SQ # Qf4F3pLO//4DC2LcUFKEeCf4l0i/jXXmeJvbT9bucGD057NVcPJY7v6Cw4UwQvla # GBwY5NaxuORpfOQOWobuTn2fcbIw6E4yFuEuRd++ZsPGRFIS6Fzo4Xiw3xzd70qD # ms0bFg6cvMMyzqVlf2THdHxozVuU5w== # =kh5z # -----END PGP SIGNATURE----- # gpg: Signature made Mon 20 Oct 2025 07:47:29 AM CDT # gpg: using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * tag 'pull-10.2-maintainer-201025-2' of https://gitlab.com/stsquad/qemu: docs/system: merge vhost-user-input into vhost-user-contrib docs/system: drop vhost-user-rng docs docs/system: unify the naming style for VirtIO devices docs/system: split VirtIO devices from the rest contrib/plugins/uftrace_symbols.py: generate debug files to map symbols to source hw/display: add blob map/unmap trace events ui/gtk-gl-area: Remove extra draw call in refresh tests/tcg/multiarch/linux/linux-test: Don't try to test atime update gitlab: drop aarch32 runner and associated bits gitlab: use template for ubuntu-24.04-aarch64 jobs Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
08d11ca028
20 changed files with 342 additions and 462 deletions
|
|
@ -31,4 +31,3 @@
|
|||
include:
|
||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-24.04-s390x.yml'
|
||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-24.04-aarch64.yml'
|
||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-24.04-aarch32.yml'
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
# All ubuntu-24.04 jobs should run successfully in an environment
|
||||
# setup by the scripts/ci/setup/ubuntu/build-environment.yml task
|
||||
# "Install basic packages to build QEMU on Ubuntu 24.04"
|
||||
|
||||
ubuntu-24.04-aarch32-all:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch32
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH32_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --cross-prefix=arm-linux-gnueabihf-
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|
|
@ -2,150 +2,112 @@
|
|||
# setup by the scripts/ci/setup/ubuntu/build-environment.yml task
|
||||
# "Install basic packages to build QEMU on Ubuntu 24.04"
|
||||
|
||||
.ubuntu_aarch64_template:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
before_script:
|
||||
- source scripts/ci/gitlab-ci-section
|
||||
- section_start setup "Pre-script setup"
|
||||
- JOBS=$(expr $(nproc) - 4)
|
||||
- section_end setup
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- section_start configure "Running configure"
|
||||
- ../configure $CONFIGURE_ARGS ||
|
||||
{ cat config.log meson-logs/meson-log.txt && exit 1; }
|
||||
- section_end configure
|
||||
- section_start build "Building QEMU"
|
||||
- make --output-sync -j"$JOBS"
|
||||
- section_end build
|
||||
- section_start test "Running tests"
|
||||
- if test -n "$MAKE_CHECK_ARGS";
|
||||
then
|
||||
make -j"$JOBS" $MAKE_CHECK_ARGS ;
|
||||
fi
|
||||
- section_end test
|
||||
|
||||
ubuntu-24.04-aarch64-all-linux-static:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
# Disable -static-pie due to build error with system libc:
|
||||
# https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1987438
|
||||
- ../configure --enable-debug --static --disable-system --disable-pie
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make check-tcg
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
# Disable -static-pie due to build error with system libc:
|
||||
# https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1987438
|
||||
CONFIGURE_ARGS: --enable-debug --static --disable-system --disable-pie
|
||||
MAKE_CHECK_ARGS: check-tcg
|
||||
|
||||
ubuntu-24.04-aarch64-all:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
MAKE_CHECK_ARGS: check
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
ubuntu-24.04-aarch64-without-defaults:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --disable-user --without-default-devices --without-default-features
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
CONFIGURE_ARGS: --disable-user --without-default-devices --without-default-features
|
||||
MAKE_CHECK_ARGS: check
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
ubuntu-24.04-aarch64-alldbg:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --enable-debug
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make clean
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
CONFIGURE_ARGS: --enable-debug
|
||||
MAKE_CHECK_ARGS: check-tcg
|
||||
|
||||
ubuntu-24.04-aarch64-clang:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --disable-libssh --cc=clang --cxx=clang++ --enable-ubsan
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
CONFIGURE_ARGS: --cc=clang --cxx=clang++ --enable-ubsan
|
||||
MAKE_CHECK_ARGS: check
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
ubuntu-24.04-aarch64-tci:
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --enable-tcg-interpreter
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
CONFIGURE_ARGS: --enable-tcg-interpreter
|
||||
MAKE_CHECK_ARGS: check
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
ubuntu-24.04-aarch64-notcg:
|
||||
extends: .custom_runner_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
- ubuntu_24.04
|
||||
- aarch64
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --disable-tcg --with-devices-aarch64=minimal
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
extends: .ubuntu_aarch64_template
|
||||
variables:
|
||||
CONFIGURE_ARGS: --disable-tcg --with-devices-aarch64=minimal
|
||||
MAKE_CHECK_ARGS: check
|
||||
rules:
|
||||
- if: '$CI_PROJECT_NAMESPACE == "qemu-project" && $CI_COMMIT_BRANCH =~ /^staging/'
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- if: "$AARCH64_RUNNER_AVAILABLE"
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Create symbols and mapping files for uftrace.
|
||||
# Create symbols, debug and mapping files for uftrace.
|
||||
#
|
||||
# Copyright 2025 Linaro Ltd
|
||||
# Author: Pierrick Bouvier <pierrick.bouvier@linaro.org>
|
||||
|
|
@ -9,44 +9,71 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import argparse
|
||||
import elftools # pip install pyelftools
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
from elftools.elf.elffile import ELFFile
|
||||
from elftools.elf.sections import SymbolTableSection
|
||||
class Symbol:
|
||||
def __init__(self, name, addr, size):
|
||||
self.name = name
|
||||
# clamp addr to 48 bits, like uftrace entries
|
||||
self.addr = addr & 0xffffffffffff
|
||||
self.full_addr = addr
|
||||
self.size = size
|
||||
|
||||
def elf_func_symbols(elf):
|
||||
symbol_tables = [(idx, s) for idx, s in enumerate(elf.iter_sections())
|
||||
if isinstance(s, SymbolTableSection)]
|
||||
symbols = []
|
||||
for _, section in symbol_tables:
|
||||
for _, symbol in enumerate(section.iter_symbols()):
|
||||
if symbol_size(symbol) == 0:
|
||||
continue
|
||||
type = symbol['st_info']['type']
|
||||
if type == 'STT_FUNC' or type == 'STT_NOTYPE':
|
||||
symbols.append(symbol)
|
||||
symbols.sort(key = lambda x: symbol_addr(x))
|
||||
def set_loc(self, file, line):
|
||||
self.file = file
|
||||
self.line = line
|
||||
|
||||
def get_symbols(elf_file):
|
||||
symbols=[]
|
||||
try:
|
||||
out = subprocess.check_output(['nm', '--print-size', elf_file],
|
||||
stderr=subprocess.STDOUT,
|
||||
text=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(e.output)
|
||||
raise
|
||||
out = out.strip().split('\n')
|
||||
for line in out:
|
||||
info = line.split(' ')
|
||||
if len(info) == 3:
|
||||
# missing size information
|
||||
continue
|
||||
addr, size, type, name = info
|
||||
# add only symbols from .text section
|
||||
if type.lower() != 't':
|
||||
continue
|
||||
addr = int(addr, 16)
|
||||
size = int(size, 16)
|
||||
symbols.append(Symbol(name, addr, size))
|
||||
symbols.sort(key = lambda x: x.addr)
|
||||
return symbols
|
||||
|
||||
def symbol_size(symbol):
|
||||
return symbol['st_size']
|
||||
|
||||
def symbol_addr(symbol):
|
||||
addr = symbol['st_value']
|
||||
# clamp addr to 48 bits, like uftrace entries
|
||||
return addr & 0xffffffffffff
|
||||
|
||||
def symbol_name(symbol):
|
||||
return symbol.name
|
||||
def find_symbols_locations(elf_file, symbols):
|
||||
addresses = '\n'.join([hex(x.full_addr) for x in symbols])
|
||||
try:
|
||||
out = subprocess.check_output(['addr2line', '--exe', elf_file],
|
||||
stderr=subprocess.STDOUT,
|
||||
input=addresses, text=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(e.output)
|
||||
raise
|
||||
out = out.strip().split('\n')
|
||||
assert len(out) == len(symbols)
|
||||
for i in range(len(symbols)):
|
||||
s = symbols[i]
|
||||
file, line = out[i].split(':')
|
||||
# addr2line may return 'line (discriminator [0-9]+)' sometimes,
|
||||
# remove this to keep only line number.
|
||||
line = line.split(' ')[0]
|
||||
s.set_loc(file, line)
|
||||
|
||||
class BinaryFile:
|
||||
def __init__(self, path, map_offset):
|
||||
self.fullpath = os.path.realpath(path)
|
||||
self.map_offset = map_offset
|
||||
with open(path, 'rb') as f:
|
||||
self.elf = ELFFile(f)
|
||||
self.symbols = elf_func_symbols(self.elf)
|
||||
self.symbols = get_symbols(self.fullpath)
|
||||
find_symbols_locations(self.fullpath, self.symbols)
|
||||
|
||||
def path(self):
|
||||
return self.fullpath
|
||||
|
|
@ -56,24 +83,31 @@ class BinaryFile:
|
|||
|
||||
def addr_end(self):
|
||||
last_sym = self.symbols[-1]
|
||||
return symbol_addr(last_sym) + symbol_size(last_sym) + self.map_offset
|
||||
return last_sym.addr + last_sym.size + self.map_offset
|
||||
|
||||
def generate_symbol_file(self, prefix_symbols):
|
||||
binary_name = os.path.basename(self.fullpath)
|
||||
sym_file_path = f'./uftrace.data/{binary_name}.sym'
|
||||
sym_file_path = os.path.join('uftrace.data', f'{binary_name}.sym')
|
||||
print(f'{sym_file_path} ({len(self.symbols)} symbols)')
|
||||
with open(sym_file_path, 'w') as sym_file:
|
||||
# print hexadecimal addresses on 48 bits
|
||||
addrx = "0>12x"
|
||||
for s in self.symbols:
|
||||
addr = symbol_addr(s)
|
||||
addr = s.addr
|
||||
addr = f'{addr:{addrx}}'
|
||||
size = f'{symbol_size(s):{addrx}}'
|
||||
name = symbol_name(s)
|
||||
size = f'{s.size:{addrx}}'
|
||||
if prefix_symbols:
|
||||
name = f'{binary_name}:{name}'
|
||||
name = f'{binary_name}:{s.name}'
|
||||
print(addr, size, 'T', name, file=sym_file)
|
||||
|
||||
def generate_debug_file(self):
|
||||
binary_name = os.path.basename(self.fullpath)
|
||||
dbg_file_path = os.path.join('uftrace.data', f'{binary_name}.dbg')
|
||||
with open(dbg_file_path, 'w') as dbg_file:
|
||||
for s in self.symbols:
|
||||
print(f'F: {hex(s.addr)} {s.name}', file=dbg_file)
|
||||
print(f'L: {s.line} {s.file}', file=dbg_file)
|
||||
|
||||
def parse_parameter(p):
|
||||
s = p.split(":")
|
||||
path = s[0]
|
||||
|
|
@ -84,7 +118,7 @@ def parse_parameter(p):
|
|||
offset = s[1]
|
||||
if not offset.startswith('0x'):
|
||||
err = f'offset "{offset}" is not an hexadecimal constant. '
|
||||
err += 'It should starts with "0x".'
|
||||
err += 'It should start with "0x".'
|
||||
raise ValueError(err)
|
||||
offset = int(offset, 16)
|
||||
return path, offset
|
||||
|
|
@ -97,7 +131,7 @@ def is_from_user_mode(map_file_path):
|
|||
return False
|
||||
|
||||
def generate_map(binaries):
|
||||
map_file_path = './uftrace.data/sid-0.map'
|
||||
map_file_path = os.path.join('uftrace.data', 'sid-0.map')
|
||||
|
||||
if is_from_user_mode(map_file_path):
|
||||
print(f'do not overwrite {map_file_path} generated from qemu-user')
|
||||
|
|
@ -124,7 +158,8 @@ def generate_map(binaries):
|
|||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=
|
||||
'generate symbol files for uftrace')
|
||||
'generate symbol files for uftrace. '
|
||||
'Require binutils (nm and addr2line).')
|
||||
parser.add_argument('elf_file', nargs='+',
|
||||
help='path to an ELF file. '
|
||||
'Use /path/to/file:0xdeadbeef to add a mapping offset.')
|
||||
|
|
@ -133,8 +168,8 @@ def main():
|
|||
action=argparse.BooleanOptionalAction)
|
||||
args = parser.parse_args()
|
||||
|
||||
if not os.path.exists('./uftrace.data'):
|
||||
os.mkdir('./uftrace.data')
|
||||
if not os.path.exists('uftrace.data'):
|
||||
os.mkdir('uftrace.data')
|
||||
|
||||
binaries = []
|
||||
for file in args.elf_file:
|
||||
|
|
@ -145,6 +180,7 @@ def main():
|
|||
|
||||
for b in binaries:
|
||||
b.generate_symbol_file(args.prefix_symbols)
|
||||
b.generate_debug_file()
|
||||
|
||||
generate_map(binaries)
|
||||
|
||||
|
|
|
|||
|
|
@ -82,22 +82,18 @@ Emulated Devices
|
|||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
devices/virtio/index.rst
|
||||
|
||||
devices/can.rst
|
||||
devices/canokey.rst
|
||||
devices/ccid.rst
|
||||
devices/cxl.rst
|
||||
devices/vfio-user.rst
|
||||
devices/ivshmem.rst
|
||||
devices/igb.rst
|
||||
devices/ivshmem-flat.rst
|
||||
devices/ivshmem.rst
|
||||
devices/keyboard.rst
|
||||
devices/net.rst
|
||||
devices/nvme.rst
|
||||
devices/usb.rst
|
||||
devices/vhost-user.rst
|
||||
devices/virtio-gpu.rst
|
||||
devices/virtio-pmem.rst
|
||||
devices/virtio-snd.rst
|
||||
devices/vhost-user-input.rst
|
||||
devices/vhost-user-rng.rst
|
||||
devices/canokey.rst
|
||||
devices/usb-u2f.rst
|
||||
devices/igb.rst
|
||||
devices/usb.rst
|
||||
devices/vfio-user.rst
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ vfio-user
|
|||
|
||||
QEMU includes a ``vfio-user`` client. The ``vfio-user`` specification allows for
|
||||
implementing (PCI) devices in userspace outside of QEMU; it is similar to
|
||||
``vhost-user`` in this respect (see :doc:`vhost-user`), but can emulate arbitrary
|
||||
``vhost-user`` in this respect (see :doc:`virtio/vhost-user`), but can emulate arbitrary
|
||||
PCI devices, not just ``virtio``. Whereas ``vfio`` is handled by the host
|
||||
kernel, ``vfio-user``, while similar in implementation, is handled entirely in
|
||||
userspace.
|
||||
|
|
|
|||
|
|
@ -1,45 +0,0 @@
|
|||
.. _vhost_user_input:
|
||||
|
||||
QEMU vhost-user-input - Input emulation
|
||||
=======================================
|
||||
|
||||
This document describes the setup and usage of the Virtio input device.
|
||||
The Virtio input device is a paravirtualized device for input events.
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The vhost-user-input device implementation was designed to work with a daemon
|
||||
polling on input devices and passes input events to the guest.
|
||||
|
||||
QEMU provides a backend implementation in contrib/vhost-user-input.
|
||||
|
||||
Linux kernel support
|
||||
--------------------
|
||||
|
||||
Virtio input requires a guest Linux kernel built with the
|
||||
``CONFIG_VIRTIO_INPUT`` option.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The backend daemon should be started first:
|
||||
|
||||
::
|
||||
|
||||
host# vhost-user-input --socket-path=input.sock \
|
||||
--evdev-path=/dev/input/event17
|
||||
|
||||
The QEMU invocation needs to create a chardev socket to communicate with the
|
||||
backend daemon and access the VirtIO queues with the guest over the
|
||||
:ref:`shared memory <shared_memory_object>`.
|
||||
|
||||
::
|
||||
|
||||
host# qemu-system \
|
||||
-chardev socket,path=/tmp/input.sock,id=mouse0 \
|
||||
-device vhost-user-input-pci,chardev=mouse0 \
|
||||
-m 4096 \
|
||||
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on \
|
||||
-numa node,memdev=mem \
|
||||
...
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
.. _vhost_user_rng:
|
||||
|
||||
QEMU vhost-user-rng - RNG emulation
|
||||
===================================
|
||||
|
||||
Background
|
||||
----------
|
||||
|
||||
What follows builds on the material presented in vhost-user.rst - it should
|
||||
be reviewed before moving forward with the content in this file.
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The vhost-user-rng device implementation was designed to work with a random
|
||||
number generator daemon such as the one found in the vhost-device crate of
|
||||
the rust-vmm project available on github [1].
|
||||
|
||||
[1]. https://github.com/rust-vmm/vhost-device
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The daemon should be started first:
|
||||
|
||||
::
|
||||
|
||||
host# vhost-device-rng --socket-path=rng.sock -c 1 -m 512 -p 1000
|
||||
|
||||
The QEMU invocation needs to create a chardev socket the device can
|
||||
use to communicate as well as share the guests memory over a memfd.
|
||||
|
||||
::
|
||||
|
||||
host# qemu-system \
|
||||
-chardev socket,path=$(PATH)/rng.sock,id=rng0 \
|
||||
-device vhost-user-rng-pci,chardev=rng0 \
|
||||
-m 4096 \
|
||||
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on \
|
||||
-numa node,memdev=mem \
|
||||
...
|
||||
29
docs/system/devices/virtio/index.rst
Normal file
29
docs/system/devices/virtio/index.rst
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
VirtIO Devices
|
||||
==============
|
||||
|
||||
VirtIO devices are paravirtualized devices designed to be efficient to
|
||||
emulate and virtualize. Unless you are specifically trying to exercise
|
||||
a driver for some particular hardware they are the recommended device
|
||||
models to use for virtual machines.
|
||||
|
||||
The `VirtIO specification`_ is an open standard managed by OASIS. It
|
||||
describes how a *driver* in a guest operating system interacts with
|
||||
the *device* model provided by QEMU. Multiple Operating Systems
|
||||
support drivers for VirtIO with Linux perhaps having the widest range
|
||||
of device types supported.
|
||||
|
||||
The device implementation can either be provided wholly by QEMU, or in
|
||||
concert with the kernel (known as *vhost*). The device implementation
|
||||
can also be off-loaded to an external process via :ref:`vhost user
|
||||
<vhost_user>`.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
virtio-gpu.rst
|
||||
virtio-pmem.rst
|
||||
virtio-snd.rst
|
||||
vhost-user.rst
|
||||
vhost-user-contrib.rst
|
||||
|
||||
.. _VirtIO specification: https://docs.oasis-open.org/virtio/virtio/v1.3/virtio-v1.3.html
|
||||
87
docs/system/devices/virtio/vhost-user-contrib.rst
Normal file
87
docs/system/devices/virtio/vhost-user-contrib.rst
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
vhost-user daemons in contrib
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
QEMU provides a number of :ref:`vhost_user` daemons in the contrib
|
||||
directory. They were often written when vhost-user was initially added
|
||||
to the code base. You should also consider if other vhost-user daemons
|
||||
such as those from the rust-vmm `vhost-device repository`_ are better
|
||||
suited for production use.
|
||||
|
||||
.. _vhost-device repository: https://github.com/rust-vmm/vhost-device
|
||||
|
||||
.. _vhost_user_block:
|
||||
|
||||
vhost-user-block - block device
|
||||
===============================
|
||||
|
||||
vhost-user-block is a backend for exposing block devices. It can
|
||||
present a flat file or block device as a simple block device to the
|
||||
guest. You almost certainly want to use the :ref:`storage-daemon`
|
||||
instead which supports a wide variety of storage modes and exports a
|
||||
number of interfaces including vhost-user.
|
||||
|
||||
.. _vhost_user_gpu:
|
||||
|
||||
vhost-user-gpu - gpu device
|
||||
===========================
|
||||
|
||||
vhost-user-gpu presents a paravirtualized GPU and display controller.
|
||||
You probably want to use the internal :ref:`virtio_gpu` implementation
|
||||
if you want the latest features. There is also a `vhost_device_gpu`_
|
||||
daemon as part of the rust-vmm project.
|
||||
|
||||
.. _vhost_device_gpu: https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-gpu
|
||||
|
||||
.. _vhost_user_input:
|
||||
|
||||
vhost-user-input - Input emulation
|
||||
==================================
|
||||
|
||||
The Virtio input device is a paravirtualized device for input events.
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The vhost-user-input device implementation was designed to work with a daemon
|
||||
polling on input devices and passes input events to the guest.
|
||||
|
||||
QEMU provides a backend implementation in contrib/vhost-user-input.
|
||||
|
||||
Linux kernel support
|
||||
--------------------
|
||||
|
||||
Virtio input requires a guest Linux kernel built with the
|
||||
``CONFIG_VIRTIO_INPUT`` option.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
The backend daemon should be started first:
|
||||
|
||||
::
|
||||
|
||||
host# vhost-user-input --socket-path=input.sock \
|
||||
--evdev-path=/dev/input/event17
|
||||
|
||||
The QEMU invocation needs to create a chardev socket to communicate with the
|
||||
backend daemon and access the VirtIO queues with the guest over the
|
||||
:ref:`shared memory <shared_memory_object>`.
|
||||
|
||||
::
|
||||
|
||||
host# qemu-system \
|
||||
-chardev socket,path=/tmp/input.sock,id=mouse0 \
|
||||
-device vhost-user-input-pci,chardev=mouse0 \
|
||||
-m 4096 \
|
||||
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/shm,share=on \
|
||||
-numa node,memdev=mem \
|
||||
...
|
||||
|
||||
|
||||
.. _vhost_user_scsi:
|
||||
|
||||
vhost-user-scsi - SCSI controller
|
||||
=================================
|
||||
|
||||
The vhost-user-scsi daemon can proxy iSCSI devices onto a virtualized
|
||||
SCSI controller.
|
||||
|
|
@ -27,37 +27,37 @@ platform details for what sort of virtio bus to use.
|
|||
- Notes
|
||||
* - vhost-user-blk
|
||||
- Block storage
|
||||
- See contrib/vhost-user-blk
|
||||
- :ref:`storage-daemon`
|
||||
* - vhost-user-fs
|
||||
- File based storage driver
|
||||
- See https://gitlab.com/virtio-fs/virtiofsd
|
||||
- `virtiofsd <https://gitlab.com/virtio-fs/virtiofsd>`_
|
||||
* - vhost-user-gpio
|
||||
- Proxy gpio pins to host
|
||||
- See https://github.com/rust-vmm/vhost-device
|
||||
- `vhost-device-gpio <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-gpio>`_
|
||||
* - vhost-user-gpu
|
||||
- GPU driver
|
||||
- See contrib/vhost-user-gpu
|
||||
- `vhost-device-gpu <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-gpu>`_ or :ref:`vhost_user_gpu`
|
||||
* - vhost-user-i2c
|
||||
- Proxy i2c devices to host
|
||||
- See https://github.com/rust-vmm/vhost-device
|
||||
- `vhost-device-i2c <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-i2c>`_
|
||||
* - vhost-user-input
|
||||
- Generic input driver
|
||||
- :ref:`vhost_user_input`
|
||||
- `vhost-device-input <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-input>`_ or :ref:`vhost_user_input`
|
||||
* - vhost-user-rng
|
||||
- Entropy driver
|
||||
- :ref:`vhost_user_rng`
|
||||
- `vhost-device-rng <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-rng>`_
|
||||
* - vhost-user-scmi
|
||||
- System Control and Management Interface
|
||||
- See https://github.com/rust-vmm/vhost-device
|
||||
- `vhost-device-scmi <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-scmi>`_
|
||||
* - vhost-user-snd
|
||||
- Audio device
|
||||
- See https://github.com/rust-vmm/vhost-device/staging
|
||||
- `vhost-device-sound <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-sound>`_
|
||||
* - vhost-user-scsi
|
||||
- SCSI based storage
|
||||
- See contrib/vhost-user-scsi
|
||||
- :ref:`vhost_user_scsi`
|
||||
* - vhost-user-vsock
|
||||
- Socket based communication
|
||||
- See https://github.com/rust-vmm/vhost-device
|
||||
- `vhost-device-vsock <https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-vsock>`_
|
||||
|
||||
The referenced *daemons* are not exhaustive, any conforming backend
|
||||
implementing the device and using the vhost-user protocol should work.
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
..
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
virtio-gpu
|
||||
.. _virtio_gpu:
|
||||
|
||||
VirtIO GPU
|
||||
==========
|
||||
|
||||
This document explains the setup and usage of the virtio-gpu device.
|
||||
|
|
@ -1,7 +1,5 @@
|
|||
|
||||
===========
|
||||
virtio pmem
|
||||
===========
|
||||
VirtIO Persistent Memory
|
||||
========================
|
||||
|
||||
This document explains the setup and usage of the virtio pmem device.
|
||||
The virtio pmem device is a paravirtualized persistent memory device
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
virtio sound
|
||||
VirtIO Sound
|
||||
============
|
||||
|
||||
This document explains the setup and usage of the Virtio sound device.
|
||||
|
|
@ -38,6 +38,8 @@ virtio_gpu_cmd_set_scanout_blob(uint32_t id, uint32_t res, uint32_t w, uint32_t
|
|||
virtio_gpu_cmd_res_create_2d(uint32_t res, uint32_t fmt, uint32_t w, uint32_t h) "res 0x%x, fmt 0x%x, w %d, h %d"
|
||||
virtio_gpu_cmd_res_create_3d(uint32_t res, uint32_t fmt, uint32_t w, uint32_t h, uint32_t d) "res 0x%x, fmt 0x%x, w %d, h %d, d %d"
|
||||
virtio_gpu_cmd_res_create_blob(uint32_t res, uint64_t size) "res 0x%x, size %" PRId64
|
||||
virtio_gpu_cmd_res_map_blob(uint32_t res, void *vmr, void *mr) "res 0x%x, vmr %p, mr %p"
|
||||
virtio_gpu_cmd_res_unmap_blob(uint32_t res, void *mr, bool finish_unmapping) "res 0x%x, mr %p, finish_unmapping %d"
|
||||
virtio_gpu_cmd_res_unref(uint32_t res) "res 0x%x"
|
||||
virtio_gpu_cmd_res_back_attach(uint32_t res) "res 0x%x"
|
||||
virtio_gpu_cmd_res_back_detach(uint32_t res) "res 0x%x"
|
||||
|
|
|
|||
|
|
@ -134,6 +134,8 @@ virtio_gpu_virgl_map_resource_blob(VirtIOGPU *g,
|
|||
|
||||
res->mr = mr;
|
||||
|
||||
trace_virtio_gpu_cmd_res_map_blob(res->base.resource_id, vmr, mr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -153,6 +155,8 @@ virtio_gpu_virgl_unmap_resource_blob(VirtIOGPU *g,
|
|||
|
||||
vmr = to_hostmem_region(res->mr);
|
||||
|
||||
trace_virtio_gpu_cmd_res_unmap_blob(res->base.resource_id, mr, vmr->finish_unmapping);
|
||||
|
||||
/*
|
||||
* Perform async unmapping in 3 steps:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -47,21 +47,4 @@
|
|||
- ansible_facts['distribution'] == 'Ubuntu'
|
||||
- ansible_facts['distribution_version'] == '24.04'
|
||||
|
||||
- name: Install armhf cross-compile packages to build QEMU on AArch64 Ubuntu 24.04
|
||||
package:
|
||||
name:
|
||||
- binutils-arm-linux-gnueabihf
|
||||
- gcc-arm-linux-gnueabihf
|
||||
- libblkid-dev:armhf
|
||||
- libc6-dev:armhf
|
||||
- libffi-dev:armhf
|
||||
- libglib2.0-dev:armhf
|
||||
- libmount-dev:armhf
|
||||
- libpcre2-dev:armhf
|
||||
- libpixman-1-dev:armhf
|
||||
- zlib1g-dev:armhf
|
||||
when:
|
||||
- ansible_facts['distribution'] == 'Ubuntu'
|
||||
- ansible_facts['distribution_version'] == '24.04'
|
||||
- ansible_facts['architecture'] == 'aarch64'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,127 +0,0 @@
|
|||
# THIS FILE WAS AUTO-GENERATED
|
||||
#
|
||||
# $ lcitool variables --cross-arch armv7l ubuntu-2204 qemu
|
||||
#
|
||||
# https://gitlab.com/libvirt/libvirt-ci
|
||||
|
||||
packages:
|
||||
- bash
|
||||
- bc
|
||||
- bison
|
||||
- bsdextrautils
|
||||
- bzip2
|
||||
- ca-certificates
|
||||
- ccache
|
||||
- dbus
|
||||
- debianutils
|
||||
- diffutils
|
||||
- exuberant-ctags
|
||||
- findutils
|
||||
- flex
|
||||
- gcc
|
||||
- gcovr
|
||||
- gettext
|
||||
- git
|
||||
- hostname
|
||||
- libglib2.0-dev
|
||||
- libpcre2-dev
|
||||
- libsndio-dev
|
||||
- libspice-protocol-dev
|
||||
- llvm
|
||||
- locales
|
||||
- make
|
||||
- meson
|
||||
- mtools
|
||||
- ncat
|
||||
- ninja-build
|
||||
- openssh-client
|
||||
- pkgconf
|
||||
- python3
|
||||
- python3-numpy
|
||||
- python3-opencv
|
||||
- python3-pillow
|
||||
- python3-pip
|
||||
- python3-sphinx
|
||||
- python3-sphinx-rtd-theme
|
||||
- python3-tomli
|
||||
- python3-venv
|
||||
- python3-yaml
|
||||
- rpm2cpio
|
||||
- sed
|
||||
- socat
|
||||
- sparse
|
||||
- swtpm
|
||||
- tar
|
||||
- tesseract-ocr
|
||||
- tesseract-ocr-eng
|
||||
- xorriso
|
||||
- zstd
|
||||
- gcc-arm-linux-gnueabihf
|
||||
- libaio-dev:armhf
|
||||
- libasan6:armhf
|
||||
- libasound2-dev:armhf
|
||||
- libattr1-dev:armhf
|
||||
- libbpf-dev:armhf
|
||||
- libbrlapi-dev:armhf
|
||||
- libbz2-dev:armhf
|
||||
- libc6-dev:armhf
|
||||
- libcacard-dev:armhf
|
||||
- libcap-ng-dev:armhf
|
||||
- libcapstone-dev:armhf
|
||||
- libcmocka-dev:armhf
|
||||
- libcurl4-gnutls-dev:armhf
|
||||
- libdaxctl-dev:armhf
|
||||
- libdrm-dev:armhf
|
||||
- libepoxy-dev:armhf
|
||||
- libfdt-dev:armhf
|
||||
- libffi-dev:armhf
|
||||
- libfuse3-dev:armhf
|
||||
- libgbm-dev:armhf
|
||||
- libgcrypt20-dev:armhf
|
||||
- libglib2.0-dev:armhf
|
||||
- libglusterfs-dev:armhf
|
||||
- libgnutls28-dev:armhf
|
||||
- libgtk-3-dev:armhf
|
||||
- libibumad-dev:armhf
|
||||
- libibverbs-dev:armhf
|
||||
- libiscsi-dev:armhf
|
||||
- libjemalloc-dev:armhf
|
||||
- libjpeg-turbo8-dev:armhf
|
||||
- libjson-c-dev:armhf
|
||||
- liblttng-ust-dev:armhf
|
||||
- liblzo2-dev:armhf
|
||||
- libncursesw5-dev:armhf
|
||||
- libnfs-dev:armhf
|
||||
- libnuma-dev:armhf
|
||||
- libpam0g-dev:armhf
|
||||
- libpipewire-0.3-dev:armhf
|
||||
- libpixman-1-dev:armhf
|
||||
- libpng-dev:armhf
|
||||
- libpulse-dev:armhf
|
||||
- librbd-dev:armhf
|
||||
- librdmacm-dev:armhf
|
||||
- libsasl2-dev:armhf
|
||||
- libsdl2-dev:armhf
|
||||
- libsdl2-image-dev:armhf
|
||||
- libseccomp-dev:armhf
|
||||
- libselinux1-dev:armhf
|
||||
- libslirp-dev:armhf
|
||||
- libsnappy-dev:armhf
|
||||
- libspice-server-dev:armhf
|
||||
- libssh-dev:armhf
|
||||
- libsystemd-dev:armhf
|
||||
- libtasn1-6-dev:armhf
|
||||
- libubsan1:armhf
|
||||
- libudev-dev:armhf
|
||||
- liburing-dev:armhf
|
||||
- libusb-1.0-0-dev:armhf
|
||||
- libusbredirhost-dev:armhf
|
||||
- libvdeplug-dev:armhf
|
||||
- libvirglrenderer-dev:armhf
|
||||
- libvte-2.91-dev:armhf
|
||||
- libxen-dev:armhf
|
||||
- libzstd-dev:armhf
|
||||
- nettle-dev:armhf
|
||||
- systemtap-sdt-dev:armhf
|
||||
- zlib1g-dev:armhf
|
||||
|
||||
|
|
@ -155,9 +155,14 @@ static void test_file(void)
|
|||
error("stat mode");
|
||||
if ((st.st_mode & 0777) != 0600)
|
||||
error("stat mode2");
|
||||
if (st.st_atime != 1001 ||
|
||||
st.st_mtime != 1000)
|
||||
/*
|
||||
* Only check mtime, not atime: other processes such as
|
||||
* virus scanners might race with this test program and get
|
||||
* in and update the atime, causing random failures.
|
||||
*/
|
||||
if (st.st_mtime != 1000) {
|
||||
error("stat time");
|
||||
}
|
||||
|
||||
chk_error(stat(tmpdir, &st));
|
||||
if (!S_ISDIR(st.st_mode))
|
||||
|
|
|
|||
|
|
@ -165,7 +165,22 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl)
|
|||
|
||||
if (vc->gfx.guest_fb.dmabuf &&
|
||||
qemu_dmabuf_get_draw_submitted(vc->gfx.guest_fb.dmabuf)) {
|
||||
gd_gl_area_draw(vc);
|
||||
/*
|
||||
* gd_egl_refresh() calls gd_egl_draw() if a DMA-BUF draw has already
|
||||
* been submitted, but this function does not call gd_gl_area_draw() in
|
||||
* such a case due to display corruption.
|
||||
*
|
||||
* Calling gd_gl_area_draw() is necessary to prevent a situation where
|
||||
* there is a scheduled draw event but it won't happen bacause the window
|
||||
* is currently in inactive state (minimized or tabified). If draw is not
|
||||
* done for a long time, gl_block timeout and/or fence timeout (on the
|
||||
* guest) will happen eventually.
|
||||
*
|
||||
* However, it is found that calling gd_gl_area_draw() here causes guest
|
||||
* display corruption on a Wayland Compositor. The display corruption is
|
||||
* more serious than the possible fence timeout so gd_gl_area_draw() is
|
||||
* omitted for now.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue