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:
Richard Henderson 2025-10-21 08:58:57 -05:00
commit 08d11ca028
20 changed files with 342 additions and 462 deletions

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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.

View file

@ -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 \
...

View file

@ -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 \
...

View 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

View 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.

View file

@ -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.

View file

@ -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.

View file

@ -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

View file

@ -1,4 +1,4 @@
virtio sound
VirtIO Sound
============
This document explains the setup and usage of the Virtio sound device.

View file

@ -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"

View file

@ -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:
*

View file

@ -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'

View file

@ -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

View file

@ -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))

View file

@ -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;
}