From nobody Thu Apr 18 10:46:42 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCAF0C352A1 for ; Thu, 24 Nov 2022 15:19:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230102AbiKXPTJ (ORCPT ); Thu, 24 Nov 2022 10:19:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229879AbiKXPTC (ORCPT ); Thu, 24 Nov 2022 10:19:02 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 59F6916F0C4 for ; Thu, 24 Nov 2022 07:16:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669302985; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nnQks2BxOzRnMOP9aelQae29VWIgWtLn+Wzeg2Waiik=; b=b0KJn9BO/WCNFAdll1iEtCWo2oP9oTjuaoXK93mxArWCZBEejKozHevLpqnIoEh3cVJd2D HokGlL7wWZx7wYbia4iGMrvs4wZPE4rJch4jR90yEEZxNSQ/QBTatStsL2TnoxKsjIRKls InzcTNL6C4ubUwwN6K+p/SsiruPNKZ0= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-541-Oec3o72EPpGcjuQUJS90Cg-1; Thu, 24 Nov 2022 10:16:22 -0500 X-MC-Unique: Oec3o72EPpGcjuQUJS90Cg-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9EE8E185A79C; Thu, 24 Nov 2022 15:16:21 +0000 (UTC) Received: from plouf.redhat.com (unknown [10.39.193.200]) by smtp.corp.redhat.com (Postfix) with ESMTP id E0CB140C2064; Thu, 24 Nov 2022 15:16:19 +0000 (UTC) From: Benjamin Tissoires To: Greg KH , Jiri Kosina , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Dmitry Torokhov Cc: Tero Kristo , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, Benjamin Tissoires Subject: [RFC hid v1 06/10] selftests: hid: add vmtest.sh Date: Thu, 24 Nov 2022 16:15:59 +0100 Message-Id: <20221124151603.807536-7-benjamin.tissoires@redhat.com> In-Reply-To: <20221124151603.807536-1-benjamin.tissoires@redhat.com> References: <20221124151603.807536-1-benjamin.tissoires@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Similar-ish in many points from the script in selftests/bpf, with a few differences: - relies on boot2container instead of a plain qemu image (meaning that we can take any container in a registry as a base) - runs in the hid selftest dir, and such uses the test program from there Signed-off-by: Benjamin Tissoires --- tools/testing/selftests/hid/.gitignore | 1 + tools/testing/selftests/hid/config.common | 241 +++++++++++++++++++ tools/testing/selftests/hid/config.x86_64 | 4 + tools/testing/selftests/hid/vmtest.sh | 280 ++++++++++++++++++++++ 4 files changed, 526 insertions(+) create mode 100644 tools/testing/selftests/hid/config.common create mode 100644 tools/testing/selftests/hid/config.x86_64 create mode 100755 tools/testing/selftests/hid/vmtest.sh diff --git a/tools/testing/selftests/hid/.gitignore b/tools/testing/selftes= ts/hid/.gitignore index a462ca6ab2c0..995af0670f69 100644 --- a/tools/testing/selftests/hid/.gitignore +++ b/tools/testing/selftests/hid/.gitignore @@ -2,3 +2,4 @@ bpftool *.skel.h /tools hid_bpf +results diff --git a/tools/testing/selftests/hid/config.common b/tools/testing/self= tests/hid/config.common new file mode 100644 index 000000000000..0617275d93cc --- /dev/null +++ b/tools/testing/selftests/hid/config.common @@ -0,0 +1,241 @@ +CONFIG_9P_FS_POSIX_ACL=3Dy +CONFIG_9P_FS_SECURITY=3Dy +CONFIG_9P_FS=3Dy +CONFIG_AUDIT=3Dy +CONFIG_BINFMT_MISC=3Dy +CONFIG_BLK_CGROUP_IOLATENCY=3Dy +CONFIG_BLK_CGROUP=3Dy +CONFIG_BLK_DEV_BSGLIB=3Dy +CONFIG_BLK_DEV_IO_TRACE=3Dy +CONFIG_BLK_DEV_RAM_SIZE=3D16384 +CONFIG_BLK_DEV_RAM=3Dy +CONFIG_BLK_DEV_THROTTLING=3Dy +CONFIG_BONDING=3Dy +CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=3Dy +CONFIG_BOOTTIME_TRACING=3Dy +CONFIG_BSD_DISKLABEL=3Dy +CONFIG_BSD_PROCESS_ACCT=3Dy +CONFIG_CFS_BANDWIDTH=3Dy +CONFIG_CGROUP_CPUACCT=3Dy +CONFIG_CGROUP_DEBUG=3Dy +CONFIG_CGROUP_DEVICE=3Dy +CONFIG_CGROUP_FREEZER=3Dy +CONFIG_CGROUP_HUGETLB=3Dy +CONFIG_CGROUP_NET_CLASSID=3Dy +CONFIG_CGROUP_NET_PRIO=3Dy +CONFIG_CGROUP_PERF=3Dy +CONFIG_CGROUP_PIDS=3Dy +CONFIG_CGROUP_RDMA=3Dy +CONFIG_CGROUP_SCHED=3Dy +CONFIG_CGROUPS=3Dy +CONFIG_CGROUP_WRITEBACK=3Dy +CONFIG_CMA_AREAS=3D7 +CONFIG_CMA=3Dy +CONFIG_COMPAT_32BIT_TIME=3Dy +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=3Dy +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=3Dy +CONFIG_CPU_FREQ_GOV_ONDEMAND=3Dy +CONFIG_CPU_FREQ_GOV_USERSPACE=3Dy +CONFIG_CPU_FREQ_STAT=3Dy +CONFIG_CPU_IDLE_GOV_LADDER=3Dy +CONFIG_CPUSETS=3Dy +CONFIG_CRC_T10DIF=3Dy +CONFIG_CRYPTO_BLAKE2B=3Dy +CONFIG_CRYPTO_DEV_VIRTIO=3Dy +CONFIG_CRYPTO_SEQIV=3Dy +CONFIG_CRYPTO_XXHASH=3Dy +CONFIG_DCB=3Dy +CONFIG_DEBUG_ATOMIC_SLEEP=3Dy +CONFIG_DEBUG_CREDENTIALS=3Dy +CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=3Dy +CONFIG_DEBUG_MEMORY_INIT=3Dy +CONFIG_DEFAULT_FQ_CODEL=3Dy +CONFIG_DEFAULT_RENO=3Dy +CONFIG_DEFAULT_SECURITY_DAC=3Dy +CONFIG_DEVTMPFS_MOUNT=3Dy +CONFIG_DEVTMPFS=3Dy +CONFIG_DMA_CMA=3Dy +CONFIG_DNS_RESOLVER=3Dy +CONFIG_EFI_STUB=3Dy +CONFIG_EFI=3Dy +CONFIG_EXPERT=3Dy +CONFIG_EXT4_FS_POSIX_ACL=3Dy +CONFIG_EXT4_FS_SECURITY=3Dy +CONFIG_EXT4_FS=3Dy +CONFIG_FAIL_FUNCTION=3Dy +CONFIG_FAULT_INJECTION_DEBUG_FS=3Dy +CONFIG_FAULT_INJECTION=3Dy +CONFIG_FB_MODE_HELPERS=3Dy +CONFIG_FB_TILEBLITTING=3Dy +CONFIG_FB_VESA=3Dy +CONFIG_FB=3Dy +CONFIG_FONT_8x16=3Dy +CONFIG_FONT_MINI_4x6=3Dy +CONFIG_FONTS=3Dy +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=3Dy +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=3Dy +CONFIG_FRAMEBUFFER_CONSOLE=3Dy +CONFIG_FUSE_FS=3Dy +CONFIG_FW_LOADER_USER_HELPER=3Dy +CONFIG_GART_IOMMU=3Dy +CONFIG_GENERIC_PHY=3Dy +CONFIG_HARDLOCKUP_DETECTOR=3Dy +CONFIG_HIGH_RES_TIMERS=3Dy +CONFIG_HPET=3Dy +CONFIG_HUGETLBFS=3Dy +CONFIG_HUGETLB_PAGE=3Dy +CONFIG_HWPOISON_INJECT=3Dy +CONFIG_HZ_1000=3Dy +CONFIG_INET=3Dy +CONFIG_INTEL_POWERCLAMP=3Dy +CONFIG_IP6_NF_FILTER=3Dy +CONFIG_IP6_NF_IPTABLES=3Dy +CONFIG_IP6_NF_NAT=3Dy +CONFIG_IP6_NF_TARGET_MASQUERADE=3Dy +CONFIG_IP_ADVANCED_ROUTER=3Dy +CONFIG_IP_MROUTE=3Dy +CONFIG_IP_MULTICAST=3Dy +CONFIG_IP_MULTIPLE_TABLES=3Dy +CONFIG_IP_NF_FILTER=3Dy +CONFIG_IP_NF_IPTABLES=3Dy +CONFIG_IP_NF_NAT=3Dy +CONFIG_IP_NF_TARGET_MASQUERADE=3Dy +CONFIG_IP_PIMSM_V1=3Dy +CONFIG_IP_PIMSM_V2=3Dy +CONFIG_IP_ROUTE_MULTIPATH=3Dy +CONFIG_IP_ROUTE_VERBOSE=3Dy +CONFIG_IPV6_MIP6=3Dy +CONFIG_IPV6_ROUTE_INFO=3Dy +CONFIG_IPV6_ROUTER_PREF=3Dy +CONFIG_IPV6_SEG6_LWTUNNEL=3Dy +CONFIG_IPV6_SUBTREES=3Dy +CONFIG_IRQ_POLL=3Dy +CONFIG_JUMP_LABEL=3Dy +CONFIG_KARMA_PARTITION=3Dy +CONFIG_KEXEC=3Dy +CONFIG_KPROBES=3Dy +CONFIG_KSM=3Dy +CONFIG_LEGACY_VSYSCALL_NONE=3Dy +CONFIG_LOG_BUF_SHIFT=3D21 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=3D0 +CONFIG_LOGO=3Dy +CONFIG_LSM=3D"selinux,bpf,integrity" +CONFIG_MAC_PARTITION=3Dy +CONFIG_MAGIC_SYSRQ=3Dy +CONFIG_MCORE2=3Dy +CONFIG_MEMCG=3Dy +CONFIG_MEMORY_FAILURE=3Dy +CONFIG_MINIX_SUBPARTITION=3Dy +CONFIG_MODULES=3Dy +CONFIG_NAMESPACES=3Dy +CONFIG_NET_9P_VIRTIO=3Dy +CONFIG_NET_9P=3Dy +CONFIG_NET_ACT_BPF=3Dy +CONFIG_NET_CLS_CGROUP=3Dy +CONFIG_NETDEVICES=3Dy +CONFIG_NET_EMATCH=3Dy +CONFIG_NETFILTER_NETLINK_LOG=3Dy +CONFIG_NETFILTER_NETLINK_QUEUE=3Dy +CONFIG_NETFILTER_XTABLES=3Dy +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=3Dy +CONFIG_NETFILTER_XT_MATCH_BPF=3Dy +CONFIG_NETFILTER_XT_MATCH_COMMENT=3Dy +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=3Dy +CONFIG_NETFILTER_XT_MATCH_MARK=3Dy +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=3Dy +CONFIG_NETFILTER_XT_MATCH_STATISTIC=3Dy +CONFIG_NETFILTER_XT_NAT=3Dy +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=3Dy +CONFIG_NET_IPGRE_BROADCAST=3Dy +CONFIG_NET_L3_MASTER_DEV=3Dy +CONFIG_NETLABEL=3Dy +CONFIG_NET_SCH_DEFAULT=3Dy +CONFIG_NET_SCHED=3Dy +CONFIG_NET_SCH_FQ_CODEL=3Dy +CONFIG_NET_TC_SKB_EXT=3Dy +CONFIG_NET_VRF=3Dy +CONFIG_NET=3Dy +CONFIG_NF_CONNTRACK=3Dy +CONFIG_NF_NAT_MASQUERADE=3Dy +CONFIG_NF_NAT=3Dy +CONFIG_NLS_ASCII=3Dy +CONFIG_NLS_CODEPAGE_437=3Dy +CONFIG_NLS_DEFAULT=3D"utf8" +CONFIG_NO_HZ=3Dy +CONFIG_NR_CPUS=3D128 +CONFIG_NUMA_BALANCING=3Dy +CONFIG_NUMA=3Dy +CONFIG_NVMEM=3Dy +CONFIG_OSF_PARTITION=3Dy +CONFIG_OVERLAY_FS_INDEX=3Dy +CONFIG_OVERLAY_FS_METACOPY=3Dy +CONFIG_OVERLAY_FS_XINO_AUTO=3Dy +CONFIG_OVERLAY_FS=3Dy +CONFIG_PACKET=3Dy +CONFIG_PANIC_ON_OOPS=3Dy +CONFIG_PARTITION_ADVANCED=3Dy +CONFIG_PCIEPORTBUS=3Dy +CONFIG_PCI_IOV=3Dy +CONFIG_PCI_MSI=3Dy +CONFIG_PCI=3Dy +CONFIG_PHYSICAL_ALIGN=3D0x1000000 +CONFIG_POSIX_MQUEUE=3Dy +CONFIG_POWER_SUPPLY=3Dy +CONFIG_PREEMPT=3Dy +CONFIG_PRINTK_TIME=3Dy +CONFIG_PROC_KCORE=3Dy +CONFIG_PROFILING=3Dy +CONFIG_PROVE_LOCKING=3Dy +CONFIG_PTP_1588_CLOCK=3Dy +CONFIG_RC_DEVICES=3Dy +CONFIG_RC_LOOPBACK=3Dy +CONFIG_RCU_CPU_STALL_TIMEOUT=3D60 +CONFIG_SCHED_STACK_END_CHECK=3Dy +CONFIG_SCHEDSTATS=3Dy +CONFIG_SECURITY_NETWORK=3Dy +CONFIG_SECURITY_SELINUX=3Dy +CONFIG_SERIAL_8250_CONSOLE=3Dy +CONFIG_SERIAL_8250_DETECT_IRQ=3Dy +CONFIG_SERIAL_8250_EXTENDED=3Dy +CONFIG_SERIAL_8250_MANY_PORTS=3Dy +CONFIG_SERIAL_8250_NR_UARTS=3D32 +CONFIG_SERIAL_8250_RSA=3Dy +CONFIG_SERIAL_8250_SHARE_IRQ=3Dy +CONFIG_SERIAL_8250=3Dy +CONFIG_SERIAL_NONSTANDARD=3Dy +CONFIG_SERIO_LIBPS2=3Dy +CONFIG_SGI_PARTITION=3Dy +CONFIG_SMP=3Dy +CONFIG_SOCK_CGROUP_DATA=3Dy +CONFIG_SOLARIS_X86_PARTITION=3Dy +CONFIG_SUN_PARTITION=3Dy +CONFIG_SYNC_FILE=3Dy +CONFIG_SYSVIPC=3Dy +CONFIG_TASK_DELAY_ACCT=3Dy +CONFIG_TASK_IO_ACCOUNTING=3Dy +CONFIG_TASKSTATS=3Dy +CONFIG_TASK_XACCT=3Dy +CONFIG_TCP_CONG_ADVANCED=3Dy +CONFIG_TCP_MD5SIG=3Dy +CONFIG_TLS=3Dy +CONFIG_TMPFS_POSIX_ACL=3Dy +CONFIG_TMPFS=3Dy +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=3Dy +CONFIG_TRANSPARENT_HUGEPAGE=3Dy +CONFIG_TUN=3Dy +CONFIG_UNIXWARE_DISKLABEL=3Dy +CONFIG_UNIX=3Dy +CONFIG_USER_NS=3Dy +CONFIG_VALIDATE_FS_PARSER=3Dy +CONFIG_VETH=3Dy +CONFIG_VIRT_DRIVERS=3Dy +CONFIG_VIRTIO_BALLOON=3Dy +CONFIG_VIRTIO_BLK=3Dy +CONFIG_VIRTIO_CONSOLE=3Dy +CONFIG_VIRTIO_FS=3Dy +CONFIG_VIRTIO_NET=3Dy +CONFIG_VIRTIO_PCI=3Dy +CONFIG_VLAN_8021Q=3Dy +CONFIG_XFRM_SUB_POLICY=3Dy +CONFIG_XFRM_USER=3Dy +CONFIG_ZEROPLUS_FF=3Dy diff --git a/tools/testing/selftests/hid/config.x86_64 b/tools/testing/self= tests/hid/config.x86_64 new file mode 100644 index 000000000000..a8721f403c21 --- /dev/null +++ b/tools/testing/selftests/hid/config.x86_64 @@ -0,0 +1,4 @@ +CONFIG_X86_ACPI_CPUFREQ=3Dy +CONFIG_X86_CPUID=3Dy +CONFIG_X86_MSR=3Dy +CONFIG_X86_POWERNOW_K8=3Dy diff --git a/tools/testing/selftests/hid/vmtest.sh b/tools/testing/selftest= s/hid/vmtest.sh new file mode 100755 index 000000000000..f124cf6b0d0f --- /dev/null +++ b/tools/testing/selftests/hid/vmtest.sh @@ -0,0 +1,280 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +set -u +set -e + +# This script currently only works for x86_64 +ARCH=3D"$(uname -m)" +case "${ARCH}" in +x86_64) + QEMU_BINARY=3Dqemu-system-x86_64 + BZIMAGE=3D"arch/x86/boot/bzImage" + ;; +*) + echo "Unsupported architecture" + exit 1 + ;; +esac +DEFAULT_COMMAND=3D"./hid_bpf" +OUTPUT_DIR=3D"$PWD/results" +KCONFIG_REL_PATHS=3D("tools/testing/selftests/hid/config" "tools/testing/s= elftests/hid/config.common" "tools/testing/selftests/hid/config.${ARCH}") +B2C_URL=3D"https://gitlab.freedesktop.org/mupuf/boot2container/-/raw/maste= r/vm2c.py" +NUM_COMPILE_JOBS=3D"$(nproc)" +LOG_FILE_BASE=3D"$(date +"hid_selftests.%Y-%m-%d_%H-%M-%S")" +LOG_FILE=3D"${LOG_FILE_BASE}.log" +EXIT_STATUS_FILE=3D"${LOG_FILE_BASE}.exit_status" + +usage() +{ + cat <] -- [] + + is the command you would normally run when you are in +tools/testing/selftests/bpf. e.g: + + $0 -- ./hid_bpf + +If no command is specified and a debug shell (-s) is not requested, +"${DEFAULT_COMMAND}" will be run by default. + +If you build your kernel using KBUILD_OUTPUT=3D or O=3D options, these +can be passed as environment variables to the script: + + O=3D $0 -- ./hid_bpf + +or + + KBUILD_OUTPUT=3D $0 -- ./hid_bpf + +Options: + + -u) Update the boot2container script to a newer version. + -d) Update the output directory (default: ${OUTPUT_DIR}) + -j) Number of jobs for compilation, similar to -j in make + (default: ${NUM_COMPILE_JOBS}) + -s) Instead of powering off the VM, start an interactive + shell. If is specified, the shell runs after + the command finishes executing +EOF +} + +download() +{ + local file=3D"$1" + + echo "Downloading $file..." >&2 + curl -Lsf "$file" -o "${@:2}" +} + +recompile_kernel() +{ + local kernel_checkout=3D"$1" + local make_command=3D"$2" + + cd "${kernel_checkout}" + + ${make_command} olddefconfig + ${make_command} +} + +update_selftests() +{ + local kernel_checkout=3D"$1" + local selftests_dir=3D"${kernel_checkout}/tools/testing/selftests/hid" + + cd "${selftests_dir}" + ${make_command} +} + +run_vm() +{ + local b2c=3D"$1" + local kernel_bzimage=3D"$2" + local command=3D"$3" + local post_command=3D"" + + if ! which "${QEMU_BINARY}" &> /dev/null; then + cat <&1 | tee ${OUTPUT_DIR}/${LOG_F= ILE}" + post_command=3D"cat ${OUTPUT_DIR}/${LOG_FILE}" + fi + + set +e + $b2c --command "${command}" \ + --kernel ${kernel_bzimage} \ + --workdir ${OUTPUT_DIR} \ + --image registry.fedoraproject.org/fedora:36 + + echo $? > ${OUTPUT_DIR}/${EXIT_STATUS_FILE} + + set -e + + ${post_command} +} + +is_rel_path() +{ + local path=3D"$1" + + [[ ${path:0:1} !=3D "/" ]] +} + +do_update_kconfig() +{ + local kernel_checkout=3D"$1" + local kconfig_file=3D"$2" + + rm -f "$kconfig_file" 2> /dev/null + + for config in "${KCONFIG_REL_PATHS[@]}"; do + local kconfig_src=3D"${kernel_checkout}/${config}" + cat "$kconfig_src" >> "$kconfig_file" + done +} + +update_kconfig() +{ + local kernel_checkout=3D"$1" + local kconfig_file=3D"$2" + + if [[ -f "${kconfig_file}" ]]; then + local local_modified=3D"$(stat -c %Y "${kconfig_file}")" + + for config in "${KCONFIG_REL_PATHS[@]}"; do + local kconfig_src=3D"${kernel_checkout}/${config}" + local src_modified=3D"$(stat -c %Y "${kconfig_src}")" + # Only update the config if it has been updated after the + # previously cached config was created. This avoids + # unnecessarily compiling the kernel and selftests. + if [[ "${src_modified}" -gt "${local_modified}" ]]; then + do_update_kconfig "$kernel_checkout" "$kconfig_file" + # Once we have found one outdated configuration + # there is no need to check other ones. + break + fi + done + else + do_update_kconfig "$kernel_checkout" "$kconfig_file" + fi +} + +main() +{ + local script_dir=3D"$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd= -P)" + local kernel_checkout=3D$(realpath "${script_dir}"/../../../../) + # By default the script searches for the kernel in the checkout directory= but + # it also obeys environment variables O=3D and KBUILD_OUTPUT=3D + local kernel_bzimage=3D"${kernel_checkout}/${BZIMAGE}" + local command=3D"${DEFAULT_COMMAND}" + local update_b2c=3D"no" + local debug_shell=3D"no" + + while getopts ':hsud:j:' opt; do + case ${opt} in + u) + update_b2c=3D"yes" + ;; + d) + OUTPUT_DIR=3D"$OPTARG" + ;; + j) + NUM_COMPILE_JOBS=3D"$OPTARG" + ;; + s) + command=3D"/bin/sh" + debug_shell=3D"yes" + ;; + h) + usage + exit 0 + ;; + \? ) + echo "Invalid Option: -$OPTARG" + usage + exit 1 + ;; + : ) + echo "Invalid Option: -$OPTARG requires an argument" + usage + exit 1 + ;; + esac + done + shift $((OPTIND -1)) + + # trap 'catch "$?"' EXIT + + if [[ "${debug_shell}" =3D=3D "no" ]]; then + if [[ $# -eq 0 ]]; then + echo "No command specified, will run ${DEFAULT_COMMAND} in the vm" + else + command=3D"$@" + + if [[ "${command}" =3D=3D "/bin/bash" || "${command}" =3D=3D "bash" ]] + then + debug_shell=3D"yes" + fi + fi + fi + + local kconfig_file=3D"${OUTPUT_DIR}/latest.config" + local make_command=3D"make -j ${NUM_COMPILE_JOBS} KCONFIG_CONFIG=3D${kcon= fig_file}" + + # Figure out where the kernel is being built. + # O takes precedence over KBUILD_OUTPUT. + if [[ "${O:=3D""}" !=3D "" ]]; then + if is_rel_path "${O}"; then + O=3D"$(realpath "${PWD}/${O}")" + fi + kernel_bzimage=3D"${O}/${BZIMAGE}" + make_command=3D"${make_command} O=3D${O}" + elif [[ "${KBUILD_OUTPUT:=3D""}" !=3D "" ]]; then + if is_rel_path "${KBUILD_OUTPUT}"; then + KBUILD_OUTPUT=3D"$(realpath "${PWD}/${KBUILD_OUTPUT}")" + fi + kernel_bzimage=3D"${KBUILD_OUTPUT}/${BZIMAGE}" + make_command=3D"${make_command} KBUILD_OUTPUT=3D${KBUILD_OUTPUT}" + fi + + local b2c=3D"${OUTPUT_DIR}/vm2c.py" + + echo "Output directory: ${OUTPUT_DIR}" + + mkdir -p "${OUTPUT_DIR}" + update_kconfig "${kernel_checkout}" "${kconfig_file}" + + recompile_kernel "${kernel_checkout}" "${make_command}" + + if [[ "${update_b2c}" =3D=3D "no" && ! -f "${b2c}" ]]; then + echo "vm2c script not found in ${b2c}" + update_b2c=3D"yes" + fi + + if [[ "${update_b2c}" =3D=3D "yes" ]]; then + download $B2C_URL $b2c + chmod +x $b2c + fi + + update_selftests "${kernel_checkout}" "${make_command}" + run_vm $b2c "${kernel_bzimage}" "${command}" + if [[ "${debug_shell}" !=3D "yes" ]]; then + echo "Logs saved in ${OUTPUT_DIR}/${LOG_FILE}" + fi + + exit $(cat ${OUTPUT_DIR}/${EXIT_STATUS_FILE}) +} + +main "$@" --=20 2.38.1