8 IBM Z are mainframe computers, which are descendants of IBM System/360 from
9 year 1964. They are supported by the Linux kernel under the name "s390". This
10 document describes how to test BPF in an s390 QEMU guest.
15 The following is required to build and run the test suite:
18 * s390 development headers and libraries
19 * Clang with BPF support
20 * QEMU with s390 support
21 * Disk image with s390 rootfs
23 Debian supports installing compiler and libraries for s390 out of the box.
24 Users of other distros may use debootstrap in order to set up a Debian chroot::
31 sudo mount --rbind /dev ./s390-toolchain/dev
32 sudo mount --rbind /proc ./s390-toolchain/proc
33 sudo mount --rbind /sys ./s390-toolchain/sys
34 sudo chroot ./s390-toolchain
36 Once on Debian, the build prerequisites can be installed as follows::
38 sudo dpkg --add-architecture s390x
40 sudo apt-get install \
62 Latest Clang targeting BPF can be installed as follows::
64 git clone https://github.com/llvm/llvm-project.git
65 ln -s ../../clang llvm-project/llvm/tools/
66 mkdir llvm-project-build
69 -DLLVM_TARGETS_TO_BUILD=BPF \
70 -DCMAKE_BUILD_TYPE=Release \
71 -DCMAKE_INSTALL_PREFIX=/opt/clang-bpf \
75 export PATH=/opt/clang-bpf/bin:$PATH
77 The disk image can be prepared using a loopback mount and debootstrap::
79 qemu-img create -f raw ./s390.img 1G
80 sudo losetup -f ./s390.img
81 sudo mkfs.ext4 /dev/loopX
83 sudo mount /dev/loopX ./s390.rootfs
99 sudo umount ./s390.rootfs
100 sudo losetup -d /dev/loopX
105 In addition to the usual Kconfig options required to run the BPF test suite, it
106 is also helpful to select::
110 CONFIG_NET_9P_VIRTIO=y
113 as that would enable a very easy way to share files with the s390 virtual
116 Compiling kernel, modules and testsuite, as well as preparing gdb scripts to
117 simplify debugging, can be done using the following commands::
119 make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- menuconfig
120 make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- bzImage modules scripts_gdb
121 make ARCH=s390 CROSS_COMPILE=s390x-linux-gnu- \
122 -C tools/testing/selftests \
124 INSTALL_PATH=$PWD/tools/testing/selftests/kselftest_install \
127 4. Running the test suite
128 *************************
130 The virtual machine can be started as follows::
136 -kernel linux/arch/s390/boot/compressed/vmlinux \
137 -drive file=./s390.img,if=virtio,format=raw \
139 -append 'root=/dev/vda rw console=ttyS1' \
140 -virtfs local,path=./linux,security_model=none,mount_tag=linux \
141 -object rng-random,filename=/dev/urandom,id=rng0 \
142 -device virtio-rng-ccw,rng=rng0 \
143 -netdev user,id=net0 \
144 -device virtio-net-ccw,netdev=net0
146 When using this on a real IBM Z, ``-enable-kvm`` may be added for better
147 performance. When starting the virtual machine for the first time, disk image
148 setup must be finalized using the following command::
150 /debootstrap/debootstrap --second-stage
152 Directory with the code built on the host as well as ``/proc`` and ``/sys``
153 need to be mounted as follows::
156 mount -t 9p linux /linux
157 mount -t proc proc /proc
158 mount -t sysfs sys /sys
160 After that, the test suite can be run using the following commands::
162 cd /linux/tools/testing/selftests/kselftest_install
165 As usual, tests can be also run individually::
167 cd /linux/tools/testing/selftests/bpf
173 It is possible to debug the s390 kernel using QEMU GDB stub, which is activated
174 by passing ``-s`` to QEMU.
176 It is preferable to turn KASLR off, so that gdb would know where to find the
177 kernel image in memory, by building the kernel with::
181 GDB can then be attached using the following command::
183 gdb-multiarch -ex 'target remote localhost:1234' ./vmlinux
188 In case one needs to use the network in the virtual machine in order to e.g.
189 install additional packages, it can be configured using::
196 This document is a compilation of techniques, whose more comprehensive
197 descriptions can be found by following these links:
199 - `Debootstrap <https://wiki.debian.org/EmDebian/CrossDebootstrap>`_
200 - `Multiarch <https://wiki.debian.org/Multiarch/HOWTO>`_
201 - `Building LLVM <https://llvm.org/docs/CMake.html>`_
202 - `Cross-compiling the kernel <https://wiki.gentoo.org/wiki/Embedded_Handbook/General/Cross-compiling_the_kernel>`_
203 - `QEMU s390x Guest Support <https://wiki.qemu.org/Documentation/Platforms/S390X>`_
204 - `Plan 9 folder sharing over Virtio <https://wiki.qemu.org/Documentation/9psetup>`_
205 - `Using GDB with QEMU <https://wiki.osdev.org/Kernel_Debugging#Use_GDB_with_QEMU>`_