diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml index b72c57e4df..d9b834c848 100644 --- a/.gitlab-ci.d/buildtest.yml +++ b/.gitlab-ci.d/buildtest.yml @@ -558,16 +558,27 @@ check-deprecated: allow_failure: true # gprof/gcov are GCC features -gprof-gcov: +build-gprof-gcov: extends: .native_build_job_template needs: job: amd64-ubuntu2004-container variables: IMAGE: ubuntu2004 CONFIGURE_ARGS: --enable-gprof --enable-gcov - MAKE_CHECK_ARGS: check TARGETS: aarch64-softmmu ppc64-softmmu s390x-softmmu x86_64-softmmu - timeout: 70m + artifacts: + expire_in: 1 days + paths: + - build + +check-gprof-gcov: + extends: .native_test_job_template + needs: + - job: build-gprof-gcov + artifacts: true + variables: + IMAGE: ubuntu2004 + MAKE_CHECK_ARGS: check after_script: - ${CI_PROJECT_DIR}/scripts/ci/coverage-summary.sh diff --git a/.gitlab-ci.d/static_checks.yml b/.gitlab-ci.d/static_checks.yml index 8e30872164..7e685c6a65 100644 --- a/.gitlab-ci.d/static_checks.yml +++ b/.gitlab-ci.d/static_checks.yml @@ -3,7 +3,11 @@ check-patch: image: $CI_REGISTRY_IMAGE/qemu/centos8:latest needs: job: amd64-centos8-container - script: .gitlab-ci.d/check-patch.py + script: + - git config --local diff.renamelimit 0 + - git config --local diff.renames True + - git config --local diff.algorithm histogram + - .gitlab-ci.d/check-patch.py variables: GIT_DEPTH: 1000 rules: diff --git a/meson.build b/meson.build index 626cf932c1..d2a9ce91f5 100644 --- a/meson.build +++ b/meson.build @@ -2537,15 +2537,15 @@ summary(summary_info, bool_yn: true, section: 'Configurable features') summary_info = {} summary_info += {'host CPU': cpu} summary_info += {'host endianness': build_machine.endian()} -summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]} -summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]} +summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} +summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} if link_language == 'cpp' - summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]} + summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} else summary_info += {'C++ compiler': false} endif if targetos == 'darwin' - summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]} + summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} endif if targetos == 'windows' if 'WIN_SDK' in config_host diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 3d185cceac..bbcd25ae05 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -12,7 +12,7 @@ use Term::ANSIColor qw(:constants); my $P = $0; $P =~ s@.*/@@g; -our $SrcFile = qr{\.(?:h|c|cpp|s|S|pl|py|sh)$}; +our $SrcFile = qr{\.(?:(h|c)(\.inc)?|cpp|s|S|pl|py|sh)$}; my $V = '0.31'; @@ -1671,7 +1671,7 @@ sub process { } # check we are in a valid C source file if not then ignore this hunk - next if ($realfile !~ /\.(h|c|cpp)$/); + next if ($realfile !~ /\.((h|c)(\.inc)?|cpp)$/); # Block comment styles diff --git a/tests/acceptance/boot_linux_console.py b/tests/acceptance/boot_linux_console.py index 276a53f146..cded547d1d 100644 --- a/tests/acceptance/boot_linux_console.py +++ b/tests/acceptance/boot_linux_console.py @@ -333,6 +333,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:aarch64 :avocado: tags=machine:virt + :avocado: tags=accel:tcg """ kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/29/Everything/aarch64/os/images/pxeboot' @@ -343,7 +344,9 @@ class BootLinuxConsole(LinuxKernelTest): self.vm.set_console() kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE + 'console=ttyAMA0') + self.require_accelerator("tcg") self.vm.add_args('-cpu', 'cortex-a53', + '-accel', 'tcg', '-kernel', kernel_path, '-append', kernel_command_line) self.vm.launch() @@ -356,6 +359,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=machine:xlnx-versal-virt :avocado: tags=device:pl011 :avocado: tags=device:arm_gicv3 + :avocado: tags=accel:tcg """ images_url = ('http://ports.ubuntu.com/ubuntu-ports/dists/' 'bionic-updates/main/installer-arm64/' @@ -370,6 +374,7 @@ class BootLinuxConsole(LinuxKernelTest): self.vm.set_console() self.vm.add_args('-m', '2G', + '-accel', 'tcg', '-kernel', kernel_path, '-initrd', initrd_path) self.vm.launch() @@ -379,6 +384,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:virt + :avocado: tags=accel:tcg """ kernel_url = ('https://archives.fedoraproject.org/pub/archive/fedora' '/linux/releases/29/Everything/armhfp/os/images/pxeboot' @@ -401,6 +407,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=machine:emcraft-sf2 :avocado: tags=endian:little :avocado: tags=u-boot + :avocado: tags=accel:tcg """ uboot_url = ('https://raw.githubusercontent.com/' 'Subbaraya-Sundeep/qemu-test-binaries/' @@ -429,6 +436,8 @@ class BootLinuxConsole(LinuxKernelTest): def do_test_arm_raspi2(self, uart_id): """ + :avocado: tags=accel:tcg + The kernel can be rebuilt using the kernel source referenced and following the instructions on the on: https://www.raspberrypi.org/documentation/linux/kernel/building.md @@ -464,6 +473,7 @@ class BootLinuxConsole(LinuxKernelTest): :avocado: tags=arch:arm :avocado: tags=machine:raspi2 :avocado: tags=device:pl011 + :avocado: tags=accel:tcg """ self.do_test_arm_raspi2(0) @@ -471,6 +481,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:smdkc210 + :avocado: tags=accel:tcg """ deb_url = ('https://snapshot.debian.org/archive/debian/' '20190928T224601Z/pool/main/l/linux/' @@ -511,6 +522,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:cubieboard + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -551,6 +563,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:cubieboard + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -595,6 +608,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:quanta-gsj + :avocado: tags=accel:tcg """ # 25 MiB compressed, 32 MiB uncompressed. image_url = ( @@ -642,6 +656,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:quanta-gsj + :avocado: tags=accel:tcg """ initrd_url = ( 'https://github.com/hskinnemoen/openbmc/releases/download/' @@ -678,6 +693,7 @@ class BootLinuxConsole(LinuxKernelTest): """ :avocado: tags=arch:arm :avocado: tags=machine:orangepi-pc + :avocado: tags=accel:tcg """ deb_url = ('https://apt.armbian.com/pool/main/l/' 'linux-5.10.16-sunxi/linux-image-current-sunxi_21.02.2_armhf.deb') @@ -702,6 +718,7 @@ class BootLinuxConsole(LinuxKernelTest): def test_arm_orangepi_initrd(self): """ :avocado: tags=arch:arm + :avocado: tags=accel:tcg :avocado: tags=machine:orangepi-pc """ deb_url = ('https://apt.armbian.com/pool/main/l/' @@ -744,6 +761,7 @@ class BootLinuxConsole(LinuxKernelTest): def test_arm_orangepi_sd(self): """ :avocado: tags=arch:arm + :avocado: tags=accel:tcg :avocado: tags=machine:orangepi-pc :avocado: tags=device:sd """ diff --git a/tests/tcg/configure.sh b/tests/tcg/configure.sh index ed6492ce59..aa7c24328a 100755 --- a/tests/tcg/configure.sh +++ b/tests/tcg/configure.sh @@ -222,10 +222,10 @@ for target in $target_list; do got_cross_cc=no - if eval test "x\${cross_cc_$arch}" != xyes; then - eval "target_compiler=\${cross_cc_$arch}" + if eval test "x\"\${cross_cc_$arch}\"" != xyes; then + eval "target_compiler=\"\${cross_cc_$arch}\"" - if has "$target_compiler"; then + if has $target_compiler; then if test "$supress_clang" = yes && $target_compiler --version | grep -qi "clang"; then got_cross_cc=no diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target index a3a751723d..3f283eabe6 100644 --- a/tests/tcg/multiarch/Makefile.target +++ b/tests/tcg/multiarch/Makefile.target @@ -30,6 +30,8 @@ testthread: LDFLAGS+=-lpthread threadcount: LDFLAGS+=-lpthread +signals: LDFLAGS+=-lrt -lpthread + # We define the runner for test-mmap after the individual # architectures have defined their supported pages sizes. If no # additional page sizes are defined we only run the default test. diff --git a/tests/tcg/multiarch/signals.c b/tests/tcg/multiarch/signals.c new file mode 100644 index 0000000000..998c8fdefd --- /dev/null +++ b/tests/tcg/multiarch/signals.c @@ -0,0 +1,149 @@ +/* + * linux-user signal handling tests. + * + * Copyright (c) 2021 Linaro Ltd + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void error1(const char *filename, int line, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d: ", filename, line); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +static int __chk_error(const char *filename, int line, int ret) +{ + if (ret < 0) { + error1(filename, line, "%m (ret=%d, errno=%d/%s)", + ret, errno, strerror(errno)); + } + return ret; +} + +#define error(fmt, ...) error1(__FILE__, __LINE__, fmt, ## __VA_ARGS__) + +#define chk_error(ret) __chk_error(__FILE__, __LINE__, (ret)) + +/* + * Thread handling + */ +typedef struct ThreadJob ThreadJob; + +struct ThreadJob { + int number; + int sleep; + int count; +}; + +static pthread_t *threads; +static int max_threads = 10; +__thread int signal_count; +int total_signal_count; + +static void *background_thread_func(void *arg) +{ + ThreadJob *job = (ThreadJob *) arg; + + printf("thread%d: started\n", job->number); + while (total_signal_count < job->count) { + usleep(job->sleep); + } + printf("thread%d: saw %d alarms from %d\n", job->number, + signal_count, total_signal_count); + return NULL; +} + +static void spawn_threads(void) +{ + int i; + threads = calloc(sizeof(pthread_t), max_threads); + + for (i = 0; i < max_threads; i++) { + ThreadJob *job = calloc(sizeof(ThreadJob), 1); + job->number = i; + job->sleep = i * 1000; + job->count = i * 100; + pthread_create(threads + i, NULL, background_thread_func, job); + } +} + +static void close_threads(void) +{ + int i; + for (i = 0; i < max_threads; i++) { + pthread_join(threads[i], NULL); + } + free(threads); + threads = NULL; +} + +static void sig_alarm(int sig, siginfo_t *info, void *puc) +{ + if (sig != SIGRTMIN) { + error("unexpected signal"); + } + signal_count++; + __atomic_fetch_add(&total_signal_count, 1, __ATOMIC_SEQ_CST); +} + +static void test_signals(void) +{ + struct sigaction act; + struct itimerspec it; + timer_t tid; + struct sigevent sev; + + /* Set up SIG handler */ + act.sa_sigaction = sig_alarm; + sigemptyset(&act.sa_mask); + act.sa_flags = SA_SIGINFO; + chk_error(sigaction(SIGRTMIN, &act, NULL)); + + /* Create POSIX timer */ + sev.sigev_notify = SIGEV_SIGNAL; + sev.sigev_signo = SIGRTMIN; + sev.sigev_value.sival_ptr = &tid; + chk_error(timer_create(CLOCK_REALTIME, &sev, &tid)); + + it.it_interval.tv_sec = 0; + it.it_interval.tv_nsec = 1000000; + it.it_value.tv_sec = 0; + it.it_value.tv_nsec = 1000000; + chk_error(timer_settime(tid, 0, &it, NULL)); + + spawn_threads(); + + do { + usleep(1000); + } while (total_signal_count < 2000); + + printf("shutting down after: %d signals\n", total_signal_count); + + close_threads(); + + chk_error(timer_delete(tid)); +} + +int main(int argc, char **argv) +{ + test_signals(); + return 0; +} diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include index e94d95ec54..f3a3a1c751 100644 --- a/tests/vm/Makefile.include +++ b/tests/vm/Makefile.include @@ -84,6 +84,7 @@ $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \ $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \ $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \ $(if $(LOG_CONSOLE),--log-console) \ + --source-path $(SRC_PATH) \ --image "$@" \ --force \ --build-image $@, \ diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py index 0f2e436ed3..254e11c932 100644 --- a/tests/vm/basevm.py +++ b/tests/vm/basevm.py @@ -96,6 +96,7 @@ class BaseVM(object): self._genisoimage = args.genisoimage self._build_path = args.build_path self._efi_aarch64 = args.efi_aarch64 + self._source_path = args.source_path # Allow input config to override defaults. self._config = DEFAULT_CONFIG.copy() if config != None: @@ -591,6 +592,9 @@ def parse_args(vmcls): parser.add_argument("--build-path", default=None, help="Path of build directory, "\ "for using build tree QEMU binary. ") + parser.add_argument("--source-path", default=None, + help="Path of source directory, "\ + "for finding additional files. ") parser.add_argument("--interactive", "-I", action="store_true", help="Interactively run command") parser.add_argument("--snapshot", "-s", action="store_true", diff --git a/tests/vm/centos.aarch64 b/tests/vm/centos.aarch64 index e687b93e52..81c3004c3c 100755 --- a/tests/vm/centos.aarch64 +++ b/tests/vm/centos.aarch64 @@ -64,7 +64,7 @@ class CentosAarch64VM(basevm.BaseVM): def create_kickstart(self): """Generate the kickstart file used to generate the centos image.""" # Start with the template for the kickstart. - ks_file = "../tests/vm/centos-8-aarch64.ks" + ks_file = self._source_path + "/tests/vm/centos-8-aarch64.ks" subprocess.check_call("cp {} ./ks.cfg".format(ks_file), shell=True) # Append the ssh keys to the kickstart file # as the post processing phase of installation.