Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: hid: add vmtest.sh

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
- the working directory to store the config is in
tools/selftests/hid/results

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by

Benjamin Tissoires and committed by
Jiri Kosina
507806e9 bf7660da

+530
+1
tools/testing/selftests/hid/.gitignore
··· 2 2 *.skel.h 3 3 /tools 4 4 hid_bpf 5 + results
+241
tools/testing/selftests/hid/config.common
··· 1 + CONFIG_9P_FS_POSIX_ACL=y 2 + CONFIG_9P_FS_SECURITY=y 3 + CONFIG_9P_FS=y 4 + CONFIG_AUDIT=y 5 + CONFIG_BINFMT_MISC=y 6 + CONFIG_BLK_CGROUP_IOLATENCY=y 7 + CONFIG_BLK_CGROUP=y 8 + CONFIG_BLK_DEV_BSGLIB=y 9 + CONFIG_BLK_DEV_IO_TRACE=y 10 + CONFIG_BLK_DEV_RAM_SIZE=16384 11 + CONFIG_BLK_DEV_RAM=y 12 + CONFIG_BLK_DEV_THROTTLING=y 13 + CONFIG_BONDING=y 14 + CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y 15 + CONFIG_BOOTTIME_TRACING=y 16 + CONFIG_BSD_DISKLABEL=y 17 + CONFIG_BSD_PROCESS_ACCT=y 18 + CONFIG_CFS_BANDWIDTH=y 19 + CONFIG_CGROUP_CPUACCT=y 20 + CONFIG_CGROUP_DEBUG=y 21 + CONFIG_CGROUP_DEVICE=y 22 + CONFIG_CGROUP_FREEZER=y 23 + CONFIG_CGROUP_HUGETLB=y 24 + CONFIG_CGROUP_NET_CLASSID=y 25 + CONFIG_CGROUP_NET_PRIO=y 26 + CONFIG_CGROUP_PERF=y 27 + CONFIG_CGROUP_PIDS=y 28 + CONFIG_CGROUP_RDMA=y 29 + CONFIG_CGROUP_SCHED=y 30 + CONFIG_CGROUPS=y 31 + CONFIG_CGROUP_WRITEBACK=y 32 + CONFIG_CMA_AREAS=7 33 + CONFIG_CMA=y 34 + CONFIG_COMPAT_32BIT_TIME=y 35 + CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y 36 + CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y 37 + CONFIG_CPU_FREQ_GOV_ONDEMAND=y 38 + CONFIG_CPU_FREQ_GOV_USERSPACE=y 39 + CONFIG_CPU_FREQ_STAT=y 40 + CONFIG_CPU_IDLE_GOV_LADDER=y 41 + CONFIG_CPUSETS=y 42 + CONFIG_CRC_T10DIF=y 43 + CONFIG_CRYPTO_BLAKE2B=y 44 + CONFIG_CRYPTO_DEV_VIRTIO=y 45 + CONFIG_CRYPTO_SEQIV=y 46 + CONFIG_CRYPTO_XXHASH=y 47 + CONFIG_DCB=y 48 + CONFIG_DEBUG_ATOMIC_SLEEP=y 49 + CONFIG_DEBUG_CREDENTIALS=y 50 + CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y 51 + CONFIG_DEBUG_MEMORY_INIT=y 52 + CONFIG_DEFAULT_FQ_CODEL=y 53 + CONFIG_DEFAULT_RENO=y 54 + CONFIG_DEFAULT_SECURITY_DAC=y 55 + CONFIG_DEVTMPFS_MOUNT=y 56 + CONFIG_DEVTMPFS=y 57 + CONFIG_DMA_CMA=y 58 + CONFIG_DNS_RESOLVER=y 59 + CONFIG_EFI_STUB=y 60 + CONFIG_EFI=y 61 + CONFIG_EXPERT=y 62 + CONFIG_EXT4_FS_POSIX_ACL=y 63 + CONFIG_EXT4_FS_SECURITY=y 64 + CONFIG_EXT4_FS=y 65 + CONFIG_FAIL_FUNCTION=y 66 + CONFIG_FAULT_INJECTION_DEBUG_FS=y 67 + CONFIG_FAULT_INJECTION=y 68 + CONFIG_FB_MODE_HELPERS=y 69 + CONFIG_FB_TILEBLITTING=y 70 + CONFIG_FB_VESA=y 71 + CONFIG_FB=y 72 + CONFIG_FONT_8x16=y 73 + CONFIG_FONT_MINI_4x6=y 74 + CONFIG_FONTS=y 75 + CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y 76 + CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y 77 + CONFIG_FRAMEBUFFER_CONSOLE=y 78 + CONFIG_FUSE_FS=y 79 + CONFIG_FW_LOADER_USER_HELPER=y 80 + CONFIG_GART_IOMMU=y 81 + CONFIG_GENERIC_PHY=y 82 + CONFIG_HARDLOCKUP_DETECTOR=y 83 + CONFIG_HIGH_RES_TIMERS=y 84 + CONFIG_HPET=y 85 + CONFIG_HUGETLBFS=y 86 + CONFIG_HUGETLB_PAGE=y 87 + CONFIG_HWPOISON_INJECT=y 88 + CONFIG_HZ_1000=y 89 + CONFIG_INET=y 90 + CONFIG_INTEL_POWERCLAMP=y 91 + CONFIG_IP6_NF_FILTER=y 92 + CONFIG_IP6_NF_IPTABLES=y 93 + CONFIG_IP6_NF_NAT=y 94 + CONFIG_IP6_NF_TARGET_MASQUERADE=y 95 + CONFIG_IP_ADVANCED_ROUTER=y 96 + CONFIG_IP_MROUTE=y 97 + CONFIG_IP_MULTICAST=y 98 + CONFIG_IP_MULTIPLE_TABLES=y 99 + CONFIG_IP_NF_FILTER=y 100 + CONFIG_IP_NF_IPTABLES=y 101 + CONFIG_IP_NF_NAT=y 102 + CONFIG_IP_NF_TARGET_MASQUERADE=y 103 + CONFIG_IP_PIMSM_V1=y 104 + CONFIG_IP_PIMSM_V2=y 105 + CONFIG_IP_ROUTE_MULTIPATH=y 106 + CONFIG_IP_ROUTE_VERBOSE=y 107 + CONFIG_IPV6_MIP6=y 108 + CONFIG_IPV6_ROUTE_INFO=y 109 + CONFIG_IPV6_ROUTER_PREF=y 110 + CONFIG_IPV6_SEG6_LWTUNNEL=y 111 + CONFIG_IPV6_SUBTREES=y 112 + CONFIG_IRQ_POLL=y 113 + CONFIG_JUMP_LABEL=y 114 + CONFIG_KARMA_PARTITION=y 115 + CONFIG_KEXEC=y 116 + CONFIG_KPROBES=y 117 + CONFIG_KSM=y 118 + CONFIG_LEGACY_VSYSCALL_NONE=y 119 + CONFIG_LOG_BUF_SHIFT=21 120 + CONFIG_LOG_CPU_MAX_BUF_SHIFT=0 121 + CONFIG_LOGO=y 122 + CONFIG_LSM="selinux,bpf,integrity" 123 + CONFIG_MAC_PARTITION=y 124 + CONFIG_MAGIC_SYSRQ=y 125 + CONFIG_MCORE2=y 126 + CONFIG_MEMCG=y 127 + CONFIG_MEMORY_FAILURE=y 128 + CONFIG_MINIX_SUBPARTITION=y 129 + CONFIG_MODULES=y 130 + CONFIG_NAMESPACES=y 131 + CONFIG_NET_9P_VIRTIO=y 132 + CONFIG_NET_9P=y 133 + CONFIG_NET_ACT_BPF=y 134 + CONFIG_NET_CLS_CGROUP=y 135 + CONFIG_NETDEVICES=y 136 + CONFIG_NET_EMATCH=y 137 + CONFIG_NETFILTER_NETLINK_LOG=y 138 + CONFIG_NETFILTER_NETLINK_QUEUE=y 139 + CONFIG_NETFILTER_XTABLES=y 140 + CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y 141 + CONFIG_NETFILTER_XT_MATCH_BPF=y 142 + CONFIG_NETFILTER_XT_MATCH_COMMENT=y 143 + CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y 144 + CONFIG_NETFILTER_XT_MATCH_MARK=y 145 + CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y 146 + CONFIG_NETFILTER_XT_MATCH_STATISTIC=y 147 + CONFIG_NETFILTER_XT_NAT=y 148 + CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y 149 + CONFIG_NET_IPGRE_BROADCAST=y 150 + CONFIG_NET_L3_MASTER_DEV=y 151 + CONFIG_NETLABEL=y 152 + CONFIG_NET_SCH_DEFAULT=y 153 + CONFIG_NET_SCHED=y 154 + CONFIG_NET_SCH_FQ_CODEL=y 155 + CONFIG_NET_TC_SKB_EXT=y 156 + CONFIG_NET_VRF=y 157 + CONFIG_NET=y 158 + CONFIG_NF_CONNTRACK=y 159 + CONFIG_NF_NAT_MASQUERADE=y 160 + CONFIG_NF_NAT=y 161 + CONFIG_NLS_ASCII=y 162 + CONFIG_NLS_CODEPAGE_437=y 163 + CONFIG_NLS_DEFAULT="utf8" 164 + CONFIG_NO_HZ=y 165 + CONFIG_NR_CPUS=128 166 + CONFIG_NUMA_BALANCING=y 167 + CONFIG_NUMA=y 168 + CONFIG_NVMEM=y 169 + CONFIG_OSF_PARTITION=y 170 + CONFIG_OVERLAY_FS_INDEX=y 171 + CONFIG_OVERLAY_FS_METACOPY=y 172 + CONFIG_OVERLAY_FS_XINO_AUTO=y 173 + CONFIG_OVERLAY_FS=y 174 + CONFIG_PACKET=y 175 + CONFIG_PANIC_ON_OOPS=y 176 + CONFIG_PARTITION_ADVANCED=y 177 + CONFIG_PCIEPORTBUS=y 178 + CONFIG_PCI_IOV=y 179 + CONFIG_PCI_MSI=y 180 + CONFIG_PCI=y 181 + CONFIG_PHYSICAL_ALIGN=0x1000000 182 + CONFIG_POSIX_MQUEUE=y 183 + CONFIG_POWER_SUPPLY=y 184 + CONFIG_PREEMPT=y 185 + CONFIG_PRINTK_TIME=y 186 + CONFIG_PROC_KCORE=y 187 + CONFIG_PROFILING=y 188 + CONFIG_PROVE_LOCKING=y 189 + CONFIG_PTP_1588_CLOCK=y 190 + CONFIG_RC_DEVICES=y 191 + CONFIG_RC_LOOPBACK=y 192 + CONFIG_RCU_CPU_STALL_TIMEOUT=60 193 + CONFIG_SCHED_STACK_END_CHECK=y 194 + CONFIG_SCHEDSTATS=y 195 + CONFIG_SECURITY_NETWORK=y 196 + CONFIG_SECURITY_SELINUX=y 197 + CONFIG_SERIAL_8250_CONSOLE=y 198 + CONFIG_SERIAL_8250_DETECT_IRQ=y 199 + CONFIG_SERIAL_8250_EXTENDED=y 200 + CONFIG_SERIAL_8250_MANY_PORTS=y 201 + CONFIG_SERIAL_8250_NR_UARTS=32 202 + CONFIG_SERIAL_8250_RSA=y 203 + CONFIG_SERIAL_8250_SHARE_IRQ=y 204 + CONFIG_SERIAL_8250=y 205 + CONFIG_SERIAL_NONSTANDARD=y 206 + CONFIG_SERIO_LIBPS2=y 207 + CONFIG_SGI_PARTITION=y 208 + CONFIG_SMP=y 209 + CONFIG_SOCK_CGROUP_DATA=y 210 + CONFIG_SOLARIS_X86_PARTITION=y 211 + CONFIG_SUN_PARTITION=y 212 + CONFIG_SYNC_FILE=y 213 + CONFIG_SYSVIPC=y 214 + CONFIG_TASK_DELAY_ACCT=y 215 + CONFIG_TASK_IO_ACCOUNTING=y 216 + CONFIG_TASKSTATS=y 217 + CONFIG_TASK_XACCT=y 218 + CONFIG_TCP_CONG_ADVANCED=y 219 + CONFIG_TCP_MD5SIG=y 220 + CONFIG_TLS=y 221 + CONFIG_TMPFS_POSIX_ACL=y 222 + CONFIG_TMPFS=y 223 + CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y 224 + CONFIG_TRANSPARENT_HUGEPAGE=y 225 + CONFIG_TUN=y 226 + CONFIG_UNIXWARE_DISKLABEL=y 227 + CONFIG_UNIX=y 228 + CONFIG_USER_NS=y 229 + CONFIG_VALIDATE_FS_PARSER=y 230 + CONFIG_VETH=y 231 + CONFIG_VIRT_DRIVERS=y 232 + CONFIG_VIRTIO_BALLOON=y 233 + CONFIG_VIRTIO_BLK=y 234 + CONFIG_VIRTIO_CONSOLE=y 235 + CONFIG_VIRTIO_FS=y 236 + CONFIG_VIRTIO_NET=y 237 + CONFIG_VIRTIO_PCI=y 238 + CONFIG_VLAN_8021Q=y 239 + CONFIG_XFRM_SUB_POLICY=y 240 + CONFIG_XFRM_USER=y 241 + CONFIG_ZEROPLUS_FF=y
+4
tools/testing/selftests/hid/config.x86_64
··· 1 + CONFIG_X86_ACPI_CPUFREQ=y 2 + CONFIG_X86_CPUID=y 3 + CONFIG_X86_MSR=y 4 + CONFIG_X86_POWERNOW_K8=y
+284
tools/testing/selftests/hid/vmtest.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + set -u 5 + set -e 6 + 7 + # This script currently only works for x86_64 8 + ARCH="$(uname -m)" 9 + case "${ARCH}" in 10 + x86_64) 11 + QEMU_BINARY=qemu-system-x86_64 12 + BZIMAGE="arch/x86/boot/bzImage" 13 + ;; 14 + *) 15 + echo "Unsupported architecture" 16 + exit 1 17 + ;; 18 + esac 19 + DEFAULT_COMMAND="./hid_bpf" 20 + SCRIPT_DIR="$(dirname $(realpath $0))" 21 + OUTPUT_DIR="$SCRIPT_DIR/results" 22 + KCONFIG_REL_PATHS=("${SCRIPT_DIR}/config" "${SCRIPT_DIR}/config.common" "${SCRIPT_DIR}/config.${ARCH}") 23 + B2C_URL="https://gitlab.freedesktop.org/mupuf/boot2container/-/raw/master/vm2c.py" 24 + NUM_COMPILE_JOBS="$(nproc)" 25 + LOG_FILE_BASE="$(date +"hid_selftests.%Y-%m-%d_%H-%M-%S")" 26 + LOG_FILE="${LOG_FILE_BASE}.log" 27 + EXIT_STATUS_FILE="${LOG_FILE_BASE}.exit_status" 28 + CONTAINER_IMAGE="registry.fedoraproject.org/fedora:36" 29 + 30 + usage() 31 + { 32 + cat <<EOF 33 + Usage: $0 [-i] [-s] [-d <output_dir>] -- [<command>] 34 + 35 + <command> is the command you would normally run when you are in 36 + tools/testing/selftests/bpf. e.g: 37 + 38 + $0 -- ./hid_bpf 39 + 40 + If no command is specified and a debug shell (-s) is not requested, 41 + "${DEFAULT_COMMAND}" will be run by default. 42 + 43 + If you build your kernel using KBUILD_OUTPUT= or O= options, these 44 + can be passed as environment variables to the script: 45 + 46 + O=<kernel_build_path> $0 -- ./hid_bpf 47 + 48 + or 49 + 50 + KBUILD_OUTPUT=<kernel_build_path> $0 -- ./hid_bpf 51 + 52 + Options: 53 + 54 + -u) Update the boot2container script to a newer version. 55 + -d) Update the output directory (default: ${OUTPUT_DIR}) 56 + -j) Number of jobs for compilation, similar to -j in make 57 + (default: ${NUM_COMPILE_JOBS}) 58 + -s) Instead of powering off the VM, start an interactive 59 + shell. If <command> is specified, the shell runs after 60 + the command finishes executing 61 + EOF 62 + } 63 + 64 + download() 65 + { 66 + local file="$1" 67 + 68 + echo "Downloading $file..." >&2 69 + curl -Lsf "$file" -o "${@:2}" 70 + } 71 + 72 + recompile_kernel() 73 + { 74 + local kernel_checkout="$1" 75 + local make_command="$2" 76 + 77 + cd "${kernel_checkout}" 78 + 79 + ${make_command} olddefconfig 80 + ${make_command} 81 + } 82 + 83 + update_selftests() 84 + { 85 + local kernel_checkout="$1" 86 + local selftests_dir="${kernel_checkout}/tools/testing/selftests/hid" 87 + 88 + cd "${selftests_dir}" 89 + ${make_command} 90 + } 91 + 92 + run_vm() 93 + { 94 + local b2c="$1" 95 + local kernel_bzimage="$2" 96 + local command="$3" 97 + local post_command="" 98 + 99 + if ! which "${QEMU_BINARY}" &> /dev/null; then 100 + cat <<EOF 101 + Could not find ${QEMU_BINARY} 102 + Please install qemu or set the QEMU_BINARY environment variable. 103 + EOF 104 + exit 1 105 + fi 106 + 107 + # alpine (used in post-container requires the PATH to have /bin 108 + export PATH=$PATH:/bin 109 + 110 + if [[ "${debug_shell}" != "yes" ]] 111 + then 112 + touch ${OUTPUT_DIR}/${LOG_FILE} 113 + command="mount bpffs -t bpf /sys/fs/bpf/; set -o pipefail ; ${command} 2>&1 | tee ${OUTPUT_DIR}/${LOG_FILE}" 114 + post_command="cat ${OUTPUT_DIR}/${LOG_FILE}" 115 + else 116 + command="mount bpffs -t bpf /sys/fs/bpf/; ${command}" 117 + fi 118 + 119 + set +e 120 + $b2c --command "${command}" \ 121 + --kernel ${kernel_bzimage} \ 122 + --workdir ${OUTPUT_DIR} \ 123 + --image ${CONTAINER_IMAGE} 124 + 125 + echo $? > ${OUTPUT_DIR}/${EXIT_STATUS_FILE} 126 + 127 + set -e 128 + 129 + ${post_command} 130 + } 131 + 132 + is_rel_path() 133 + { 134 + local path="$1" 135 + 136 + [[ ${path:0:1} != "/" ]] 137 + } 138 + 139 + do_update_kconfig() 140 + { 141 + local kernel_checkout="$1" 142 + local kconfig_file="$2" 143 + 144 + rm -f "$kconfig_file" 2> /dev/null 145 + 146 + for config in "${KCONFIG_REL_PATHS[@]}"; do 147 + local kconfig_src="${config}" 148 + cat "$kconfig_src" >> "$kconfig_file" 149 + done 150 + } 151 + 152 + update_kconfig() 153 + { 154 + local kernel_checkout="$1" 155 + local kconfig_file="$2" 156 + 157 + if [[ -f "${kconfig_file}" ]]; then 158 + local local_modified="$(stat -c %Y "${kconfig_file}")" 159 + 160 + for config in "${KCONFIG_REL_PATHS[@]}"; do 161 + local kconfig_src="${config}" 162 + local src_modified="$(stat -c %Y "${kconfig_src}")" 163 + # Only update the config if it has been updated after the 164 + # previously cached config was created. This avoids 165 + # unnecessarily compiling the kernel and selftests. 166 + if [[ "${src_modified}" -gt "${local_modified}" ]]; then 167 + do_update_kconfig "$kernel_checkout" "$kconfig_file" 168 + # Once we have found one outdated configuration 169 + # there is no need to check other ones. 170 + break 171 + fi 172 + done 173 + else 174 + do_update_kconfig "$kernel_checkout" "$kconfig_file" 175 + fi 176 + } 177 + 178 + main() 179 + { 180 + local script_dir="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" 181 + local kernel_checkout=$(realpath "${script_dir}"/../../../../) 182 + # By default the script searches for the kernel in the checkout directory but 183 + # it also obeys environment variables O= and KBUILD_OUTPUT= 184 + local kernel_bzimage="${kernel_checkout}/${BZIMAGE}" 185 + local command="${DEFAULT_COMMAND}" 186 + local update_b2c="no" 187 + local debug_shell="no" 188 + 189 + while getopts ':hsud:j:' opt; do 190 + case ${opt} in 191 + u) 192 + update_b2c="yes" 193 + ;; 194 + d) 195 + OUTPUT_DIR="$OPTARG" 196 + ;; 197 + j) 198 + NUM_COMPILE_JOBS="$OPTARG" 199 + ;; 200 + s) 201 + command="/bin/sh" 202 + debug_shell="yes" 203 + ;; 204 + h) 205 + usage 206 + exit 0 207 + ;; 208 + \? ) 209 + echo "Invalid Option: -$OPTARG" 210 + usage 211 + exit 1 212 + ;; 213 + : ) 214 + echo "Invalid Option: -$OPTARG requires an argument" 215 + usage 216 + exit 1 217 + ;; 218 + esac 219 + done 220 + shift $((OPTIND -1)) 221 + 222 + # trap 'catch "$?"' EXIT 223 + 224 + if [[ "${debug_shell}" == "no" ]]; then 225 + if [[ $# -eq 0 ]]; then 226 + echo "No command specified, will run ${DEFAULT_COMMAND} in the vm" 227 + else 228 + command="$@" 229 + 230 + if [[ "${command}" == "/bin/bash" || "${command}" == "bash" ]] 231 + then 232 + debug_shell="yes" 233 + fi 234 + fi 235 + fi 236 + 237 + local kconfig_file="${OUTPUT_DIR}/latest.config" 238 + local make_command="make -j ${NUM_COMPILE_JOBS} KCONFIG_CONFIG=${kconfig_file}" 239 + 240 + # Figure out where the kernel is being built. 241 + # O takes precedence over KBUILD_OUTPUT. 242 + if [[ "${O:=""}" != "" ]]; then 243 + if is_rel_path "${O}"; then 244 + O="$(realpath "${PWD}/${O}")" 245 + fi 246 + kernel_bzimage="${O}/${BZIMAGE}" 247 + make_command="${make_command} O=${O}" 248 + elif [[ "${KBUILD_OUTPUT:=""}" != "" ]]; then 249 + if is_rel_path "${KBUILD_OUTPUT}"; then 250 + KBUILD_OUTPUT="$(realpath "${PWD}/${KBUILD_OUTPUT}")" 251 + fi 252 + kernel_bzimage="${KBUILD_OUTPUT}/${BZIMAGE}" 253 + make_command="${make_command} KBUILD_OUTPUT=${KBUILD_OUTPUT}" 254 + fi 255 + 256 + local b2c="${OUTPUT_DIR}/vm2c.py" 257 + 258 + echo "Output directory: ${OUTPUT_DIR}" 259 + 260 + mkdir -p "${OUTPUT_DIR}" 261 + update_kconfig "${kernel_checkout}" "${kconfig_file}" 262 + 263 + recompile_kernel "${kernel_checkout}" "${make_command}" 264 + 265 + if [[ "${update_b2c}" == "no" && ! -f "${b2c}" ]]; then 266 + echo "vm2c script not found in ${b2c}" 267 + update_b2c="yes" 268 + fi 269 + 270 + if [[ "${update_b2c}" == "yes" ]]; then 271 + download $B2C_URL $b2c 272 + chmod +x $b2c 273 + fi 274 + 275 + update_selftests "${kernel_checkout}" "${make_command}" 276 + run_vm $b2c "${kernel_bzimage}" "${command}" 277 + if [[ "${debug_shell}" != "yes" ]]; then 278 + echo "Logs saved in ${OUTPUT_DIR}/${LOG_FILE}" 279 + fi 280 + 281 + exit $(cat ${OUTPUT_DIR}/${EXIT_STATUS_FILE}) 282 + } 283 + 284 + main "$@"