diff --git a/.circleci/config.yml b/.circleci/config.yml index 10fb5046c74c27..bae425bc04a192 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,8 +56,6 @@ do_steps: &do_steps command: | if [[ $CROSS_COMPILE == *android* ]]; then emulator -avd Nexus5_API24 -no-window -no-audio -no-boot-anim; - elif [[ $CROSS_COMPILE == *freebsd* ]] || [[ -n "$LKL_QEMU_TEST" ]]; then - cd /home/ubuntu && eval $QEMU fi background: true - run: cd tools/lkl && make -j8 ${MKARG} @@ -71,11 +69,6 @@ do_steps: &do_steps command: | if [[ $CROSS_COMPILE == *android* ]]; then /home/ubuntu/circle-android.sh wait-for-boot; - elif [[ $CROSS_COMPILE == *freebsd* ]] || [[ -n "$LKL_QEMU_TEST" ]]; then - while ! $MYSSH -o ConnectTimeout=1 exit 2> /dev/null - do - sleep 5 - done fi - run: name: run tests @@ -116,13 +109,6 @@ jobs: ANDROID_SDK_ROOT: /home/ubuntu/android-sdk <<: *do_steps - freebsd11_x86_64: - docker: - - image: lkldocker/circleci-freebsd11-x86_64:v1.4 - environment: - CROSS_COMPILE: "x86_64-pc-freebsd11-" - <<: *do_steps - x86_64_valgrind: docker: - image: lkldocker/circleci-x86_64:v1.4 @@ -137,7 +123,6 @@ workflows: build: jobs: - android-aarch64 - - freebsd11_x86_64 - i386 nightly: triggers: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2eef1ab49648e5..037c7efab5c996 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,6 +18,7 @@ jobs: os: unix runs_on: ubuntu-22.04 shell: bash + run_qemu: true - displayTargetName: kunit os: unix runs_on: ubuntu-22.04 @@ -33,15 +34,24 @@ jobs: runs_on: windows-2022 pip_option: --break-system-packages shell: msys2 {0} - - displayTargetName: clang-build + - displayTargetName: freebsd os: unix runs_on: ubuntu-22.04 shell: bash - build_options: "LLVM=1 CROSS_COMPILE=x86_64-linux-gnu" + build_options: "LLVM=1 CROSS_COMPILE=x86_64-unknown-freebsd SYSROOT=~/freebsd-sysroot" + make_sysroot: "./tools/lkl/scripts/freebsd-make-sysroot.sh" + run_qemu: true + - displayTargetName: fuzzers + os: unix + runs_on: ubuntu-22.04 + shell: bash + build_options: "LKL_FUZZING=1 MMU=1 fuzzers" + timeout-minutes: 100 env: CCACHE_DIR: ${{ github.workspace }}/.ccache USE_CCACHE: 1 + PROTOBUF_MUTATOR_DIR: /tmp/libprotobuf-mutator defaults: run: @@ -103,13 +113,16 @@ jobs: - uses: actions/cache@v4 with: path: ${{ env.CCACHE_DIR }} - key: ${{ runner.os }}-ccache-build-${{ github.sha }} - restore-keys: ${{ runner.os }}-ccache-build- + key: ${{ matrix.displayTargetName }}-ccache-build-${{ github.sha }} + restore-keys: ${{ matrix.displayTargetName }}-ccache-build- - name: Install ccache on ubuntu-latest if: runner.os == 'Linux' run: | sudo apt update -y - sudo apt install -y ccache libjsmn-dev libfuse3-dev clang lld llvm qemu-system-x86 qemu-utils sshpass cloud-image-utils + sudo apt install -y ccache libjsmn-dev libfuse3-dev clang lld llvm qemu-system-x86 \ + qemu-utils sshpass cloud-image-utils binutils cmake ninja-build liblzma-dev libz-dev \ + pkg-config autoconf libtool + - name: Install patched binutils for Windows if: runner.os == 'Windows' run: | @@ -141,19 +154,26 @@ jobs: echo "setting env variable (debug)" echo "ZPOLINE_DEBUG=0" >> "$GITHUB_ENV" - name: Start QEMU - if: matrix.displayTargetName == 'linux' + if: matrix.run_qemu run: | - ./tools/lkl/scripts/qemu-x86_64-make-images.sh + ./tools/lkl/scripts/qemu-${{ matrix.displayTargetName }}-make-images.sh sudo chmod a+rw /dev/kvm - . tools/lkl/scripts/qemu-x86_64-start-and-set-env.sh - echo MYHOST="$HOST" >> $GITHUB_ENV + . tools/lkl/scripts/qemu-${{ matrix.displayTargetName }}-start-and-set-env.sh + echo MYHOST="$MYHOST" >> $GITHUB_ENV echo MYSSH="$MYSSH" >> $GITHUB_ENV echo MYSCP="$MYSCP" >> $GITHUB_ENV echo LKL_QEMU_TEST=1 >> $GITHUB_ENV + - name: Make sysroot + run: | + ${{ matrix.make_sysroot }} + - name: Build libprotobuf-mutator + if: matrix.displayTargetName == 'fuzzers' + run: tools/lkl/scripts/libprotobuf-mutator-build.sh - name: Build run: | make -j4 -C tools/lkl ${{ matrix.build_options }} - name: Tests + if: matrix.displayTargetName != 'fuzzers' run: mkdir junit && make -C tools/lkl run-tests tests="--junit-dir ../../junit" - name: Save test results uses: actions/upload-artifact@v5 @@ -184,27 +204,3 @@ jobs: run: sudo pip install ply GitPython - name: Check coding style run: tools/lkl/scripts/checkpatch.sh - - fuzzers: - runs-on: ubuntu-22.04 - name: fuzzers - env: - PROTOBUF_MUTATOR_DIR: /tmp/libprotobuf-mutator - steps: - - name: Checkout - with: - fetch-depth: 0 - uses: actions/checkout@v4 - - name: Install clang toolchain - run: | - sudo apt update -y - sudo apt install -y clang lld llvm - - name: Install libprotobuf-mutator prerequisites - run: | - sudo apt update -y - sudo apt install -y binutils cmake ninja-build liblzma-dev libz-dev \ - pkg-config autoconf libtool - - name: Build libprotobuf-mutator - run: tools/lkl/scripts/libprotobuf-mutator-build.sh - - name: Build fuzzers - run: make -j4 -C tools/lkl LKL_FUZZING=1 MMU=1 fuzzers diff --git a/arch/lkl/include/asm/io.h b/arch/lkl/include/asm/io.h index 4a2aba31d8f5e2..9652daf7d68605 100644 --- a/arch/lkl/include/asm/io.h +++ b/arch/lkl/include/asm/io.h @@ -106,7 +106,16 @@ static inline void __iounmap(void __iomem *addr) #define iounmap __iounmap #endif +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnull-pointer-arithmetic" +#endif + #include +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + #endif /* _ASM_LKL_IO_H */ diff --git a/tools/lkl/Makefile.autoconf b/tools/lkl/Makefile.autoconf index 5c4e0194b31a9b..b665f75bfefb9c 100644 --- a/tools/lkl/Makefile.autoconf +++ b/tools/lkl/Makefile.autoconf @@ -14,12 +14,12 @@ $(shell echo "CONFIG_$(1)=$(2)" >> $(OUTPUT)/kernel.config) endef define find_include - $(eval include_paths=$(shell $(CC) -E -Wp,-v -xc /dev/null 2>&1 | grep '^ ')) - $(foreach f, $(include_paths), $(wildcard $(f)/$(1))) + $(eval include_paths=$(shell $(CC) $(SYSROOT_FLAGS) -E -Wp,-v -xc /dev/null 2>&1 | grep '^ ')) + $(foreach f,$(include_paths),$(wildcard $(f)/$(1))) endef define is_defined -$(shell $(CC) -dM -E - 0) - bytes_read += lkl_printf("%s", str); + lkl_printf("%s", str); lkl_printf("==========\n"); if (ret) { diff --git a/tools/lkl/lib/net.c b/tools/lkl/lib/net.c index 967e1dac5cb371..8c4f692308c5c8 100644 --- a/tools/lkl/lib/net.c +++ b/tools/lkl/lib/net.c @@ -41,14 +41,6 @@ int lkl_inet_pton(int af, const char *src, void *dst) } #endif -static inline void set_sockaddr(struct lkl_sockaddr_in *sin, unsigned int addr, - unsigned short port) -{ - sin->sin_family = LKL_AF_INET; - sin->sin_addr.lkl_s_addr = addr; - sin->sin_port = port; -} - static inline int ifindex_to_name(int sock, struct lkl_ifreq *ifr, int ifindex) { ifr->lkl_ifr_ifindex = ifindex; diff --git a/tools/lkl/lib/posix-host.c b/tools/lkl/lib/posix-host.c index 89fea03891bd8e..2f4e0191dd78a7 100644 --- a/tools/lkl/lib/posix-host.c +++ b/tools/lkl/lib/posix-host.c @@ -21,6 +21,9 @@ #include #include #include +#ifdef __FreeBSD__ +#include +#endif #include #include "iomem.h" #include "jmp_buf.h" diff --git a/tools/lkl/lib/virtio_net_fd.c b/tools/lkl/lib/virtio_net_fd.c index 4e2b67bfda0a0c..ae7032dd54038e 100644 --- a/tools/lkl/lib/virtio_net_fd.c +++ b/tools/lkl/lib/virtio_net_fd.c @@ -12,10 +12,9 @@ #include #include #include +#include #ifdef __FreeBSD__ #include -#else -#include #endif #include #include diff --git a/tools/lkl/lklfuse.c b/tools/lkl/lklfuse.c index ac40f16b2fc387..446966a12f923b 100644 --- a/tools/lkl/lklfuse.c +++ b/tools/lkl/lklfuse.c @@ -249,6 +249,12 @@ static int lklfuse_truncate(const char *path, off_t off, return ret; } +#ifdef __FreeBSD__ +#define O_LARGEFILE 0 +#define O_NOATIME 0 +#define O_TMPFILE 0 +#endif + static int lklfuse_open3(const char *path, bool create, mode_t mode, struct fuse_file_info *fi) { diff --git a/tools/lkl/scripts/freebsd-make-sysroot.sh b/tools/lkl/scripts/freebsd-make-sysroot.sh new file mode 100755 index 00000000000000..a22abe903ece08 --- /dev/null +++ b/tools/lkl/scripts/freebsd-make-sysroot.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +function package_path() +{ + grep \"name\":\"$1\" packagesite.yaml | jq -r .repopath +} + +mkdir -p ~/freebsd-sysroot +cd ~/freebsd-sysroot +wget -q https://download.freebsd.org/releases/amd64/14.4-RELEASE/base.txz +tar -xf base.txz --exclude='./dev/*' --exclude='./chroot/*' + +# Get FreeBSD package index... +wget -q https://pkg.freebsd.org/FreeBSD:14:amd64/latest/packagesite.pkg +tar -xf packagesite.pkg packagesite.yaml + +wget -q https://pkg.freebsd.org/FreeBSD:14:amd64/latest/$(package_path argp-standalone) +wget -q https://pkg.freebsd.org/FreeBSD:14:amd64/latest/$(package_path fusefs-libs3) + +tar -xf argp-standalone-*.pkg +tar -xf fusefs-libs3-*.pkg + +rm fusefs-libs3-*.pkg argp-standalone-*.pkg base.txz packagesite.pkg packagesite.yaml diff --git a/tools/lkl/scripts/qemu-freebsd-make-images.sh b/tools/lkl/scripts/qemu-freebsd-make-images.sh new file mode 100755 index 00000000000000..03b42af26580ee --- /dev/null +++ b/tools/lkl/scripts/qemu-freebsd-make-images.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +if ! [ -e FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz ]; then + wget -q https://download.freebsd.org/releases/VM-IMAGES/14.4-RELEASE/amd64/Latest/FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz +fi +unxz -k -f FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz + +cat > cloud-freebsd.yml < /dev/null; then - break - fi - sleep 1 - done -} - function init() { # initialize @@ -40,12 +30,10 @@ function cleanup() sudo tee /sys/bus/pci/drivers/vfio-pci/unbind'" } -if [ -z "$LKL_QEMU_TEST" ]; then +if [ -z "$LKL_QEMU_TEST" ] || ! [ -e $script_dir/disk-vfio-pci ] ; then lkl_test_plan 0 "disk-vfio-pci" echo "vfio not supported" else - lkl_test_plan 1 "disk-vfio-pci" - lkl_test_run 1 wait_guest lkl_test_plan 1 "disk-vfio-pci" lkl_test_run 1 init lkl_test_exec $MYSSH ./$bin_name -n $pciname diff --git a/tools/lkl/tests/disk.sh b/tools/lkl/tests/disk.sh index b7b431a5650886..277a2be5c3ad63 100755 --- a/tools/lkl/tests/disk.sh +++ b/tools/lkl/tests/disk.sh @@ -3,47 +3,7 @@ script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) source $script_dir/test.sh - -function prepfs() -{ - set -e - - file=`mktemp disk-XXXX` - - dd if=/dev/zero of=$file bs=1048576 count=300 - - yes | mkfs.$1 $file - - if ! [ -z $ANDROID_WDIR ]; then - adb shell mkdir -p $ANDROID_WDIR - adb push $file $ANDROID_WDIR - rm $file - file=$ANDROID_WDIR/$(basename $file) - fi - if ! [ -z $BSD_WDIR ]; then - $MYSSH mkdir -p $BSD_WDIR - ssh_copy $file $BSD_WDIR - rm $file - file=$BSD_WDIR/$(basename $file) - fi - - export_vars file -} - -function cleanfs() -{ - set -e - - if ! [ -z $ANDROID_WDIR ]; then - adb shell rm $file - adb shell rm $ANDROID_WDIR/disk - elif ! [ -z $BSD_WDIR ]; then - $MYSSH rm $file - $MYSSH rm $BSD_WDIR/disk - else - rm $file - fi -} +source $script_dir/fs.sh if [ "$1" = "-t" ]; then shift @@ -62,8 +22,8 @@ if [ -z $(which mkfs.$fstype) ]; then fi lkl_test_plan 1 "disk $fstype" -lkl_test_run 1 prepfs $fstype +lkl_test_run 1 prepfsimg $fstype lkl_test_exec $script_dir/disk -d $file -t $fstype $@ lkl_test_plan 1 "disk $fstype" -lkl_test_run 1 cleanfs +lkl_test_run 1 cleanfsimg diff --git a/tools/lkl/tests/fs.sh b/tools/lkl/tests/fs.sh new file mode 100644 index 00000000000000..630b31fb64ca5c --- /dev/null +++ b/tools/lkl/tests/fs.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0 + +prepfsimg() +{ + set -e + + file=`mktemp disk-XXXX` + + size_mb=10 + if [ $1 == "xfs" ]; then + size_mb=300 + elif [ $1 == "btrfs" ]; then + size_mb=115 + fi + + dd if=/dev/zero of=$file bs=1048576 count=$size_mb + + yes | mkfs.$1 $file + + if ! [ -z $ANDROID_WDIR ]; then + adb shell mkdir -p $ANDROID_WDIR + adb push $file $ANDROID_WDIR + rm $file + file=$ANDROID_WDIR/$(basename $file) + fi + if ! [ -z $BSD_WDIR ]; then + $MYSSH mkdir -p $BSD_WDIR + $MYSCP $file $MYHOST:$BSD_WDIR + rm $file + file=$BSD_WDIR/$(basename $file) + fi + + export_vars file +} + +cleanfsimg() +{ + set -e + + if ! [ -z $ANDROID_WDIR ]; then + adb shell rm -f $file + adb shell rm -f $ANDROID_WDIR/disk + elif ! [ -z $BSD_WDIR ]; then + $MYSSH rm -f $file + $MYSSH rm -f $BSD_WDIR/disk + else + rm -f $file + fi +} diff --git a/tools/lkl/tests/lklfuse.sh b/tools/lkl/tests/lklfuse.sh index df160279792b89..b53c07d72c1f33 100755 --- a/tools/lkl/tests/lklfuse.sh +++ b/tools/lkl/tests/lklfuse.sh @@ -3,47 +3,38 @@ script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) source $script_dir/test.sh +source $script_dir/fs.sh cleanup() { - set -e - - if type -P fusermount3 > /dev/null; then - fusermount3 -u $dir + umount_cmd=$(lkl_test_cmd 'which fusermount3 || which fusermount') + if [ -n "$umount_cmd" ]; then + lkl_test_cmd $umount_cmd -u $dir else - fusermount -u $dir + lkl_test_cmd umount $dir fi - rm $file - rmdir $dir -} - -# $1 - fstype -function prepfs() -{ - set -e - - dd if=/dev/zero of=$file bs=1048576 count=300 - - yes | mkfs.$1 $file + cleanfsimg + lkl_test_cmd rmdir $dir } # $1 - filesystem type lklfuse_mount() { - ${script_dir}/../lklfuse $file $dir -o type=$1,lock=$lock_file + dir=$(lkl_test_cmd mktemp -d mnt-XXXX) + export_vars dir + lkl_test_exec ${script_dir}/../lklfuse $file $dir -o type=$1,lock=$file } lklfuse_basic() { set -e - cd $dir - touch a - if ! [ -e ]; then exit 1; fi - rm a - mkdir a - if ! [ -d ]; then exit 1; fi - rmdir a + lkl_test_cmd touch $dir/a + lkl_test_cmd test -e $dir/a + lkl_test_cmd rm $dir/a + lkl_test_cmd mkdir $dir/a + lkl_test_cmd test -d $dir/a + lkl_test_cmd rmdir $dir/a } # $1 - filesystem type @@ -70,13 +61,17 @@ lklfuse_stressng() # $1 - filesystem type lklfuse_lock_conflict() { - local ret=$TEST_FAILURE unused_mnt=`mktemp -d` + local ret=$TEST_FAILURE unused_mnt=$(lkl_test_cmd mktemp -d) set +e # assume lklfuse already running with same lock file, causing lock conflict - ${script_dir}/../lklfuse -f $file $unused_mnt -o type=$1,lock=$lock_file + if [ -n "$BSD_WDIR" ]; then + lkl_test_cmd $BSD_WDIR/lklfuse -f $file $unused_mnt -o type=$1,lock=$file + else + lkl_test_exec ${script_dir}/../lklfuse -f $file $unused_mnt -o type=$1,lock=$file + fi [ $? -eq 2 ] && ret=$TEST_SUCCESS - rmdir "$unused_mnt" + lkl_test_cmd rmdir "$unused_mnt" return $ret } @@ -96,7 +91,7 @@ if [ "$LKL_HOST_CONFIG_FUSE" != "y" ]; then exit 0 fi -if ! [ -e /dev/fuse ]; then +if ! QUIET=1 lkl_test_cmd test -e /dev/fuse; then lkl_test_plan 0 "lklfuse.sh $fstype" echo "/dev/fuse not available" exit 0 @@ -108,15 +103,11 @@ if [ -z $(which mkfs.$fstype) ]; then exit 0 fi -file=`mktemp` -dir=`mktemp -d` -lock_file="$file" - trap cleanup EXIT lkl_test_plan 5 "lklfuse $fstype" -lkl_test_run 1 prepfs $fstype +lkl_test_run 1 prepfsimg $fstype lkl_test_run 2 lklfuse_mount $fstype lkl_test_run 3 lklfuse_basic # stress-ng returns 2 with no apparent failures so skip it for now diff --git a/tools/lkl/tests/run.py b/tools/lkl/tests/run.py index ca16f98841b51f..bdea6225df73fd 100755 --- a/tools/lkl/tests/run.py +++ b/tools/lkl/tests/run.py @@ -47,6 +47,7 @@ def end(self, obj): mydir=os.path.dirname(os.path.realpath(__file__)) tests = [ + 'vm-boot.sh', 'boot.sh', 'disk.sh -t ext4', 'disk.sh -t btrfs', diff --git a/tools/lkl/tests/test.sh b/tools/lkl/tests/test.sh index c81bbe3ca75685..42a99cc5518f1e 100644 --- a/tools/lkl/tests/test.sh +++ b/tools/lkl/tests/test.sh @@ -97,7 +97,7 @@ lkl_test_exec() file=$file.exe fi - if file $file | grep "interpreter /system/bin/linker" ; then + if file $file | grep -q "interpreter /system/bin/linker"; then adb push "$file" $ANDROID_WDIR if [ -n "$SUDO" ]; then ANDROID_USER=root @@ -110,18 +110,15 @@ lkl_test_exec() fi WRAPPER="adb shell $SU" file=$ANDROID_WDIR/$(basename $file) - elif file $file | grep PE32; then - if uname -s | grep Linux; then + elif file $file | grep -q PE32; then + if uname -s | grep -q Linux; then WRAPPER="wine" - fi - elif file $file | grep ARM; then - WRAPPER="qemu-arm-static" - elif file $file | grep "FreeBSD" ; then - ssh_copy "$file" $BSD_WDIR - if [ -n "$SUDO" ]; then - SUDO="" fi - WRAPPER="$MYSSH $SU" + elif file $file | grep -q ARM; then + WRAPPER="qemu-arm-static" + elif file $file | grep -q "FreeBSD"; then + $MYSCP $file $MYHOST:$BSD_WDIR + WRAPPER="$MYSSH $SUDO" # ssh will mess up with pipes ('|') so, escape the pipe char. args="${@//\|/\\\|}" set - $BSD_WDIR/$(basename $file) $args @@ -160,7 +157,8 @@ lkl_test_cmd() fi WRAPPER="adb shell $SU" elif [ -n "$LKL_HOST_CONFIG_BSD" ]; then - WRAPPER="$MYSSH $SU" + WRAPPER="$MYSSH" + USER=lkl fi echo "$@" | $WRAPPER sh $SHOPTS @@ -190,34 +188,6 @@ adb_push() done } -# XXX: $MYSSH and $MYSCP are defined in a circleci docker image. -# see the definitions in lkl/lkl-docker:circleci/freebsd11/Dockerfile -ssh_push() -{ - while [ -n "$1" ]; do - if [[ "$1" = *.sh ]]; then - type="script" - else - type="file" - fi - - dir=$(dirname $1) - $MYSSH mkdir -p $BSD_WDIR/$dir - - $MYSCP -P 7722 -r $basedir/$1 root@localhost:$BSD_WDIR/$dir - if [ "$type" = "script" ]; then - $MYSSH chmod a+x $BSD_WDIR/$1 - fi - - shift - done -} - -ssh_copy() -{ - $MYSCP -P 7722 -r $1 root@localhost:$2 -} - lkl_test_android_cleanup() { adb shell rm -rf $ANDROID_WDIR @@ -236,6 +206,6 @@ fi if [ -n "$LKL_HOST_CONFIG_BSD" ]; then trap lkl_test_bsd_cleanup EXIT - export BSD_WDIR=/root/lkl + export BSD_WDIR=lkl $MYSSH mkdir -p $BSD_WDIR fi diff --git a/tools/lkl/tests/vm-boot.sh b/tools/lkl/tests/vm-boot.sh new file mode 100755 index 00000000000000..3e780e5735f5b7 --- /dev/null +++ b/tools/lkl/tests/vm-boot.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0 + +script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd) +source $script_dir/test.sh + +function vm_boot() +{ + if [ -z "$LKL_QEMU_TEST" ]; then + return + fi + + for i in `seq 300`; do + if $MYSSH exit 2> /dev/null; then + break + fi + sleep 1 + done +} + +lkl_test_plan 1 "vm-boot" +lkl_test_run 1 vm_boot