blob: d1edbc3e54ab29e51f835ea627a01bc5b776034f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
id = 2167
title = "The GPIO controllers connected to the emulated PCIe bus via vhost-user can't generate interrupts."
state = "opened"
created_at = "2024-02-14T19:51:20.667Z"
closed_at = "n/a"
labels = ["device:virtio", "workflow::Patch available"]
url = "https://gitlab.com/qemu-project/qemu/-/issues/2167"
host-os = "Debian/testing Linux"
host-arch = "x86"
qemu-version = "8.1.1"
guest-os = "Linux (built with Buildroot,based on qemu_aarch64_virt_defconfig)"
guest-arch = "Aarch64"
description = """The problem is related to emulation of GPIO controllers using the vhost-user protocol for GPIO. The problem was detected when using the [vhost-device-gpio](https://github.com/rust-vmm/vhost-device) software. I have described the whole issue in https://github.com/rust-vmm/vhost-device/issues/613 , but it is QEMU related, and therefore I describe it here as well.
The broader context is described in https://stackoverflow.com/questions/75906208/how-to-connect-via-virtio-gui-running-on-host-with-gpio-in-a-qemu-emulated-virtu ."""
reproduce = """1. For Debian/testing you need to compile a libgpiod-2.1.1 (I assume that the following is done in the home directory directory of the `dev` user: `/home/dev`):
```
wget https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/libgpiod-2.1.tar.gz ; \\
tar -xzf libgpiod-2.1.tar.gz ; \\
cd libgpiod-2.1 ; \\
autoupdate ; \\
./autogen.sh ; \\
make
```
2. Download the vhost-device-gpio (`git clone https://github.com/rust-vmm/vhost-device.git`)
3. Build the vhost-device-gpio (in the `vhost-device-gpio` subdirectory)
```
export PATH_TO_LIBGPIOD=/home/dev/libgpiod-2.1
export SYSTEM_DEPS_LIBGPIOD_NO_PKG_CONFIG=1
export SYSTEM_DEPS_LIBGPIOD_SEARCH_NATIVE="${PATH_TO_LIBGPIOD}/lib/.libs/"
export SYSTEM_DEPS_LIBGPIOD_LIB=gpiod
export SYSTEM_DEPS_LIBGPIOD_INCLUDE="${PATH_TO_LIBGPIOD}/include/"
cargo build --features "mock_gpio"
```
4. Start vhost-device-gpio: (`LD_LIBRARY_PATH=/home/emb/libgpiod-2.1/lib/.libs/ ./vhost-device-gpio -s /tmp/gpio.sock -l s4`)
5. Download the Buildroot 2023.11.1 (`wget https://buildroot.org/downloads/buildroot-2023.11.1.tar.xz` in another directory) and unpack it. Buildroot and the main directory of Buildroot tree are denoted by BR if the following description.
6. Configure BR (run `make qemu_aarch64_virt_defconfig` in the main BR directory, run `make menuconfig` and select external toolchain, `BR2_PACKAGE_LIBGPIOD=y`, `BR2_PACKAGE_LIBGPIOD_TOOLS=y`, run `make linux-menuconfig` and select `CONFIG_GPIO_VIRTIO=m` in the kernel configuration)
7. Build the Linux and QEMU (run `make` in the BR directory).
8. Run the emulation in BR/output/images, using the command line given above.
9. After the virtual machine starts, log in as root and load the driver: `modprobe gpio-virtio`
10. Try to monitor changes of one of the emulated pins: `gpiomon 0 0`
11. You'll get the error message:
```
gpiomon: error waiting for events: No such device
```"""
additional = """[0009-enable-F-IRQ-in-virtio-pci.patch](/uploads/39bc04b2d94063ccd539c5cfbc9cd105/0009-enable-F-IRQ-in-virtio-pci.patch)"""
|