1*053f45beSAndroid Build Coastguard Worker#!/bin/bash 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker 4*053f45beSAndroid Build Coastguard Workerset -u 5*053f45beSAndroid Build Coastguard Workerset -e 6*053f45beSAndroid Build Coastguard Worker 7*053f45beSAndroid Build Coastguard Worker# This script currently only works for x86_64 and s390x, as 8*053f45beSAndroid Build Coastguard Worker# it is based on the VM image used by the BPF CI, which is 9*053f45beSAndroid Build Coastguard Worker# available only for these architectures. 10*053f45beSAndroid Build Coastguard WorkerARCH="$(uname -m)" 11*053f45beSAndroid Build Coastguard Workercase "${ARCH}" in 12*053f45beSAndroid Build Coastguard Workers390x) 13*053f45beSAndroid Build Coastguard Worker QEMU_BINARY=qemu-system-s390x 14*053f45beSAndroid Build Coastguard Worker QEMU_CONSOLE="ttyS1" 15*053f45beSAndroid Build Coastguard Worker QEMU_FLAGS=(-smp 2) 16*053f45beSAndroid Build Coastguard Worker BZIMAGE="arch/s390/boot/compressed/vmlinux" 17*053f45beSAndroid Build Coastguard Worker ;; 18*053f45beSAndroid Build Coastguard Workerx86_64) 19*053f45beSAndroid Build Coastguard Worker QEMU_BINARY=qemu-system-x86_64 20*053f45beSAndroid Build Coastguard Worker QEMU_CONSOLE="ttyS0,115200" 21*053f45beSAndroid Build Coastguard Worker QEMU_FLAGS=(-cpu host -smp 8) 22*053f45beSAndroid Build Coastguard Worker BZIMAGE="arch/x86/boot/bzImage" 23*053f45beSAndroid Build Coastguard Worker ;; 24*053f45beSAndroid Build Coastguard Worker*) 25*053f45beSAndroid Build Coastguard Worker echo "Unsupported architecture" 26*053f45beSAndroid Build Coastguard Worker exit 1 27*053f45beSAndroid Build Coastguard Worker ;; 28*053f45beSAndroid Build Coastguard Workeresac 29*053f45beSAndroid Build Coastguard WorkerDEFAULT_COMMAND="./test_progs" 30*053f45beSAndroid Build Coastguard WorkerMOUNT_DIR="mnt" 31*053f45beSAndroid Build Coastguard WorkerROOTFS_IMAGE="root.img" 32*053f45beSAndroid Build Coastguard WorkerOUTPUT_DIR="$HOME/.bpf_selftests" 33*053f45beSAndroid Build Coastguard WorkerKCONFIG_REL_PATHS=("tools/testing/selftests/bpf/config" "tools/testing/selftests/bpf/config.${ARCH}") 34*053f45beSAndroid Build Coastguard WorkerINDEX_URL="https://raw.githubusercontent.com/libbpf/ci/master/INDEX" 35*053f45beSAndroid Build Coastguard WorkerNUM_COMPILE_JOBS="$(nproc)" 36*053f45beSAndroid Build Coastguard WorkerLOG_FILE_BASE="$(date +"bpf_selftests.%Y-%m-%d_%H-%M-%S")" 37*053f45beSAndroid Build Coastguard WorkerLOG_FILE="${LOG_FILE_BASE}.log" 38*053f45beSAndroid Build Coastguard WorkerEXIT_STATUS_FILE="${LOG_FILE_BASE}.exit_status" 39*053f45beSAndroid Build Coastguard Worker 40*053f45beSAndroid Build Coastguard Workerusage() 41*053f45beSAndroid Build Coastguard Worker{ 42*053f45beSAndroid Build Coastguard Worker cat <<EOF 43*053f45beSAndroid Build Coastguard WorkerUsage: $0 [-i] [-s] [-d <output_dir>] -- [<command>] 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Worker<command> is the command you would normally run when you are in 46*053f45beSAndroid Build Coastguard Workertools/testing/selftests/bpf. e.g: 47*053f45beSAndroid Build Coastguard Worker 48*053f45beSAndroid Build Coastguard Worker $0 -- ./test_progs -t test_lsm 49*053f45beSAndroid Build Coastguard Worker 50*053f45beSAndroid Build Coastguard WorkerIf no command is specified and a debug shell (-s) is not requested, 51*053f45beSAndroid Build Coastguard Worker"${DEFAULT_COMMAND}" will be run by default. 52*053f45beSAndroid Build Coastguard Worker 53*053f45beSAndroid Build Coastguard WorkerIf you build your kernel using KBUILD_OUTPUT= or O= options, these 54*053f45beSAndroid Build Coastguard Workercan be passed as environment variables to the script: 55*053f45beSAndroid Build Coastguard Worker 56*053f45beSAndroid Build Coastguard Worker O=<kernel_build_path> $0 -- ./test_progs -t test_lsm 57*053f45beSAndroid Build Coastguard Worker 58*053f45beSAndroid Build Coastguard Workeror 59*053f45beSAndroid Build Coastguard Worker 60*053f45beSAndroid Build Coastguard Worker KBUILD_OUTPUT=<kernel_build_path> $0 -- ./test_progs -t test_lsm 61*053f45beSAndroid Build Coastguard Worker 62*053f45beSAndroid Build Coastguard WorkerOptions: 63*053f45beSAndroid Build Coastguard Worker 64*053f45beSAndroid Build Coastguard Worker -i) Update the rootfs image with a newer version. 65*053f45beSAndroid Build Coastguard Worker -d) Update the output directory (default: ${OUTPUT_DIR}) 66*053f45beSAndroid Build Coastguard Worker -j) Number of jobs for compilation, similar to -j in make 67*053f45beSAndroid Build Coastguard Worker (default: ${NUM_COMPILE_JOBS}) 68*053f45beSAndroid Build Coastguard Worker -s) Instead of powering off the VM, start an interactive 69*053f45beSAndroid Build Coastguard Worker shell. If <command> is specified, the shell runs after 70*053f45beSAndroid Build Coastguard Worker the command finishes executing 71*053f45beSAndroid Build Coastguard WorkerEOF 72*053f45beSAndroid Build Coastguard Worker} 73*053f45beSAndroid Build Coastguard Worker 74*053f45beSAndroid Build Coastguard Workerunset URLS 75*053f45beSAndroid Build Coastguard Workerpopulate_url_map() 76*053f45beSAndroid Build Coastguard Worker{ 77*053f45beSAndroid Build Coastguard Worker if ! declare -p URLS &> /dev/null; then 78*053f45beSAndroid Build Coastguard Worker # URLS contain the mapping from file names to URLs where 79*053f45beSAndroid Build Coastguard Worker # those files can be downloaded from. 80*053f45beSAndroid Build Coastguard Worker declare -gA URLS 81*053f45beSAndroid Build Coastguard Worker while IFS=$'\t' read -r name url; do 82*053f45beSAndroid Build Coastguard Worker URLS["$name"]="$url" 83*053f45beSAndroid Build Coastguard Worker done < <(curl -Lsf ${INDEX_URL}) 84*053f45beSAndroid Build Coastguard Worker fi 85*053f45beSAndroid Build Coastguard Worker} 86*053f45beSAndroid Build Coastguard Worker 87*053f45beSAndroid Build Coastguard Workerdownload() 88*053f45beSAndroid Build Coastguard Worker{ 89*053f45beSAndroid Build Coastguard Worker local file="$1" 90*053f45beSAndroid Build Coastguard Worker 91*053f45beSAndroid Build Coastguard Worker if [[ ! -v URLS[$file] ]]; then 92*053f45beSAndroid Build Coastguard Worker echo "$file not found" >&2 93*053f45beSAndroid Build Coastguard Worker return 1 94*053f45beSAndroid Build Coastguard Worker fi 95*053f45beSAndroid Build Coastguard Worker 96*053f45beSAndroid Build Coastguard Worker echo "Downloading $file..." >&2 97*053f45beSAndroid Build Coastguard Worker curl -Lsf "${URLS[$file]}" "${@:2}" 98*053f45beSAndroid Build Coastguard Worker} 99*053f45beSAndroid Build Coastguard Worker 100*053f45beSAndroid Build Coastguard Workernewest_rootfs_version() 101*053f45beSAndroid Build Coastguard Worker{ 102*053f45beSAndroid Build Coastguard Worker { 103*053f45beSAndroid Build Coastguard Worker for file in "${!URLS[@]}"; do 104*053f45beSAndroid Build Coastguard Worker if [[ $file =~ ^"${ARCH}"/libbpf-vmtest-rootfs-(.*)\.tar\.zst$ ]]; then 105*053f45beSAndroid Build Coastguard Worker echo "${BASH_REMATCH[1]}" 106*053f45beSAndroid Build Coastguard Worker fi 107*053f45beSAndroid Build Coastguard Worker done 108*053f45beSAndroid Build Coastguard Worker } | sort -rV | head -1 109*053f45beSAndroid Build Coastguard Worker} 110*053f45beSAndroid Build Coastguard Worker 111*053f45beSAndroid Build Coastguard Workerdownload_rootfs() 112*053f45beSAndroid Build Coastguard Worker{ 113*053f45beSAndroid Build Coastguard Worker local rootfsversion="$1" 114*053f45beSAndroid Build Coastguard Worker local dir="$2" 115*053f45beSAndroid Build Coastguard Worker 116*053f45beSAndroid Build Coastguard Worker if ! which zstd &> /dev/null; then 117*053f45beSAndroid Build Coastguard Worker echo 'Could not find "zstd" on the system, please install zstd' 118*053f45beSAndroid Build Coastguard Worker exit 1 119*053f45beSAndroid Build Coastguard Worker fi 120*053f45beSAndroid Build Coastguard Worker 121*053f45beSAndroid Build Coastguard Worker download "${ARCH}/libbpf-vmtest-rootfs-$rootfsversion.tar.zst" | 122*053f45beSAndroid Build Coastguard Worker zstd -d | sudo tar -C "$dir" -x 123*053f45beSAndroid Build Coastguard Worker} 124*053f45beSAndroid Build Coastguard Worker 125*053f45beSAndroid Build Coastguard Workerrecompile_kernel() 126*053f45beSAndroid Build Coastguard Worker{ 127*053f45beSAndroid Build Coastguard Worker local kernel_checkout="$1" 128*053f45beSAndroid Build Coastguard Worker local make_command="$2" 129*053f45beSAndroid Build Coastguard Worker 130*053f45beSAndroid Build Coastguard Worker cd "${kernel_checkout}" 131*053f45beSAndroid Build Coastguard Worker 132*053f45beSAndroid Build Coastguard Worker ${make_command} olddefconfig 133*053f45beSAndroid Build Coastguard Worker ${make_command} 134*053f45beSAndroid Build Coastguard Worker} 135*053f45beSAndroid Build Coastguard Worker 136*053f45beSAndroid Build Coastguard Workermount_image() 137*053f45beSAndroid Build Coastguard Worker{ 138*053f45beSAndroid Build Coastguard Worker local rootfs_img="${OUTPUT_DIR}/${ROOTFS_IMAGE}" 139*053f45beSAndroid Build Coastguard Worker local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}" 140*053f45beSAndroid Build Coastguard Worker 141*053f45beSAndroid Build Coastguard Worker sudo mount -o loop "${rootfs_img}" "${mount_dir}" 142*053f45beSAndroid Build Coastguard Worker} 143*053f45beSAndroid Build Coastguard Worker 144*053f45beSAndroid Build Coastguard Workerunmount_image() 145*053f45beSAndroid Build Coastguard Worker{ 146*053f45beSAndroid Build Coastguard Worker local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}" 147*053f45beSAndroid Build Coastguard Worker 148*053f45beSAndroid Build Coastguard Worker sudo umount "${mount_dir}" &> /dev/null 149*053f45beSAndroid Build Coastguard Worker} 150*053f45beSAndroid Build Coastguard Worker 151*053f45beSAndroid Build Coastguard Workerupdate_selftests() 152*053f45beSAndroid Build Coastguard Worker{ 153*053f45beSAndroid Build Coastguard Worker local kernel_checkout="$1" 154*053f45beSAndroid Build Coastguard Worker local selftests_dir="${kernel_checkout}/tools/testing/selftests/bpf" 155*053f45beSAndroid Build Coastguard Worker 156*053f45beSAndroid Build Coastguard Worker cd "${selftests_dir}" 157*053f45beSAndroid Build Coastguard Worker ${make_command} 158*053f45beSAndroid Build Coastguard Worker 159*053f45beSAndroid Build Coastguard Worker # Mount the image and copy the selftests to the image. 160*053f45beSAndroid Build Coastguard Worker mount_image 161*053f45beSAndroid Build Coastguard Worker sudo rm -rf "${mount_dir}/root/bpf" 162*053f45beSAndroid Build Coastguard Worker sudo cp -r "${selftests_dir}" "${mount_dir}/root" 163*053f45beSAndroid Build Coastguard Worker unmount_image 164*053f45beSAndroid Build Coastguard Worker} 165*053f45beSAndroid Build Coastguard Worker 166*053f45beSAndroid Build Coastguard Workerupdate_init_script() 167*053f45beSAndroid Build Coastguard Worker{ 168*053f45beSAndroid Build Coastguard Worker local init_script_dir="${OUTPUT_DIR}/${MOUNT_DIR}/etc/rcS.d" 169*053f45beSAndroid Build Coastguard Worker local init_script="${init_script_dir}/S50-startup" 170*053f45beSAndroid Build Coastguard Worker local command="$1" 171*053f45beSAndroid Build Coastguard Worker local exit_command="$2" 172*053f45beSAndroid Build Coastguard Worker 173*053f45beSAndroid Build Coastguard Worker mount_image 174*053f45beSAndroid Build Coastguard Worker 175*053f45beSAndroid Build Coastguard Worker if [[ ! -d "${init_script_dir}" ]]; then 176*053f45beSAndroid Build Coastguard Worker cat <<EOF 177*053f45beSAndroid Build Coastguard WorkerCould not find ${init_script_dir} in the mounted image. 178*053f45beSAndroid Build Coastguard WorkerThis likely indicates a bad rootfs image, Please download 179*053f45beSAndroid Build Coastguard Workera new image by passing "-i" to the script 180*053f45beSAndroid Build Coastguard WorkerEOF 181*053f45beSAndroid Build Coastguard Worker exit 1 182*053f45beSAndroid Build Coastguard Worker 183*053f45beSAndroid Build Coastguard Worker fi 184*053f45beSAndroid Build Coastguard Worker 185*053f45beSAndroid Build Coastguard Worker sudo bash -c "echo '#!/bin/bash' > ${init_script}" 186*053f45beSAndroid Build Coastguard Worker 187*053f45beSAndroid Build Coastguard Worker if [[ "${command}" != "" ]]; then 188*053f45beSAndroid Build Coastguard Worker sudo bash -c "cat >>${init_script}" <<EOF 189*053f45beSAndroid Build Coastguard Worker# Have a default value in the exit status file 190*053f45beSAndroid Build Coastguard Worker# incase the VM is forcefully stopped. 191*053f45beSAndroid Build Coastguard Workerecho "130" > "/root/${EXIT_STATUS_FILE}" 192*053f45beSAndroid Build Coastguard Worker 193*053f45beSAndroid Build Coastguard Worker{ 194*053f45beSAndroid Build Coastguard Worker cd /root/bpf 195*053f45beSAndroid Build Coastguard Worker echo ${command} 196*053f45beSAndroid Build Coastguard Worker stdbuf -oL -eL ${command} 197*053f45beSAndroid Build Coastguard Worker echo "\$?" > "/root/${EXIT_STATUS_FILE}" 198*053f45beSAndroid Build Coastguard Worker} 2>&1 | tee "/root/${LOG_FILE}" 199*053f45beSAndroid Build Coastguard Worker# Ensure that the logs are written to disk 200*053f45beSAndroid Build Coastguard Workersync 201*053f45beSAndroid Build Coastguard WorkerEOF 202*053f45beSAndroid Build Coastguard Worker fi 203*053f45beSAndroid Build Coastguard Worker 204*053f45beSAndroid Build Coastguard Worker sudo bash -c "echo ${exit_command} >> ${init_script}" 205*053f45beSAndroid Build Coastguard Worker sudo chmod a+x "${init_script}" 206*053f45beSAndroid Build Coastguard Worker unmount_image 207*053f45beSAndroid Build Coastguard Worker} 208*053f45beSAndroid Build Coastguard Worker 209*053f45beSAndroid Build Coastguard Workercreate_vm_image() 210*053f45beSAndroid Build Coastguard Worker{ 211*053f45beSAndroid Build Coastguard Worker local rootfs_img="${OUTPUT_DIR}/${ROOTFS_IMAGE}" 212*053f45beSAndroid Build Coastguard Worker local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}" 213*053f45beSAndroid Build Coastguard Worker 214*053f45beSAndroid Build Coastguard Worker rm -rf "${rootfs_img}" 215*053f45beSAndroid Build Coastguard Worker touch "${rootfs_img}" 216*053f45beSAndroid Build Coastguard Worker chattr +C "${rootfs_img}" >/dev/null 2>&1 || true 217*053f45beSAndroid Build Coastguard Worker 218*053f45beSAndroid Build Coastguard Worker truncate -s 2G "${rootfs_img}" 219*053f45beSAndroid Build Coastguard Worker mkfs.ext4 -q "${rootfs_img}" 220*053f45beSAndroid Build Coastguard Worker 221*053f45beSAndroid Build Coastguard Worker mount_image 222*053f45beSAndroid Build Coastguard Worker download_rootfs "$(newest_rootfs_version)" "${mount_dir}" 223*053f45beSAndroid Build Coastguard Worker unmount_image 224*053f45beSAndroid Build Coastguard Worker} 225*053f45beSAndroid Build Coastguard Worker 226*053f45beSAndroid Build Coastguard Workerrun_vm() 227*053f45beSAndroid Build Coastguard Worker{ 228*053f45beSAndroid Build Coastguard Worker local kernel_bzimage="$1" 229*053f45beSAndroid Build Coastguard Worker local rootfs_img="${OUTPUT_DIR}/${ROOTFS_IMAGE}" 230*053f45beSAndroid Build Coastguard Worker 231*053f45beSAndroid Build Coastguard Worker if ! which "${QEMU_BINARY}" &> /dev/null; then 232*053f45beSAndroid Build Coastguard Worker cat <<EOF 233*053f45beSAndroid Build Coastguard WorkerCould not find ${QEMU_BINARY} 234*053f45beSAndroid Build Coastguard WorkerPlease install qemu or set the QEMU_BINARY environment variable. 235*053f45beSAndroid Build Coastguard WorkerEOF 236*053f45beSAndroid Build Coastguard Worker exit 1 237*053f45beSAndroid Build Coastguard Worker fi 238*053f45beSAndroid Build Coastguard Worker 239*053f45beSAndroid Build Coastguard Worker ${QEMU_BINARY} \ 240*053f45beSAndroid Build Coastguard Worker -nodefaults \ 241*053f45beSAndroid Build Coastguard Worker -display none \ 242*053f45beSAndroid Build Coastguard Worker -serial mon:stdio \ 243*053f45beSAndroid Build Coastguard Worker "${QEMU_FLAGS[@]}" \ 244*053f45beSAndroid Build Coastguard Worker -enable-kvm \ 245*053f45beSAndroid Build Coastguard Worker -m 4G \ 246*053f45beSAndroid Build Coastguard Worker -drive file="${rootfs_img}",format=raw,index=1,media=disk,if=virtio,cache=none \ 247*053f45beSAndroid Build Coastguard Worker -kernel "${kernel_bzimage}" \ 248*053f45beSAndroid Build Coastguard Worker -append "root=/dev/vda rw console=${QEMU_CONSOLE}" 249*053f45beSAndroid Build Coastguard Worker} 250*053f45beSAndroid Build Coastguard Worker 251*053f45beSAndroid Build Coastguard Workercopy_logs() 252*053f45beSAndroid Build Coastguard Worker{ 253*053f45beSAndroid Build Coastguard Worker local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}" 254*053f45beSAndroid Build Coastguard Worker local log_file="${mount_dir}/root/${LOG_FILE}" 255*053f45beSAndroid Build Coastguard Worker local exit_status_file="${mount_dir}/root/${EXIT_STATUS_FILE}" 256*053f45beSAndroid Build Coastguard Worker 257*053f45beSAndroid Build Coastguard Worker mount_image 258*053f45beSAndroid Build Coastguard Worker sudo cp ${log_file} "${OUTPUT_DIR}" 259*053f45beSAndroid Build Coastguard Worker sudo cp ${exit_status_file} "${OUTPUT_DIR}" 260*053f45beSAndroid Build Coastguard Worker sudo rm -f ${log_file} 261*053f45beSAndroid Build Coastguard Worker unmount_image 262*053f45beSAndroid Build Coastguard Worker} 263*053f45beSAndroid Build Coastguard Worker 264*053f45beSAndroid Build Coastguard Workeris_rel_path() 265*053f45beSAndroid Build Coastguard Worker{ 266*053f45beSAndroid Build Coastguard Worker local path="$1" 267*053f45beSAndroid Build Coastguard Worker 268*053f45beSAndroid Build Coastguard Worker [[ ${path:0:1} != "/" ]] 269*053f45beSAndroid Build Coastguard Worker} 270*053f45beSAndroid Build Coastguard Worker 271*053f45beSAndroid Build Coastguard Workerdo_update_kconfig() 272*053f45beSAndroid Build Coastguard Worker{ 273*053f45beSAndroid Build Coastguard Worker local kernel_checkout="$1" 274*053f45beSAndroid Build Coastguard Worker local kconfig_file="$2" 275*053f45beSAndroid Build Coastguard Worker 276*053f45beSAndroid Build Coastguard Worker rm -f "$kconfig_file" 2> /dev/null 277*053f45beSAndroid Build Coastguard Worker 278*053f45beSAndroid Build Coastguard Worker for config in "${KCONFIG_REL_PATHS[@]}"; do 279*053f45beSAndroid Build Coastguard Worker local kconfig_src="${kernel_checkout}/${config}" 280*053f45beSAndroid Build Coastguard Worker cat "$kconfig_src" >> "$kconfig_file" 281*053f45beSAndroid Build Coastguard Worker done 282*053f45beSAndroid Build Coastguard Worker} 283*053f45beSAndroid Build Coastguard Worker 284*053f45beSAndroid Build Coastguard Workerupdate_kconfig() 285*053f45beSAndroid Build Coastguard Worker{ 286*053f45beSAndroid Build Coastguard Worker local kernel_checkout="$1" 287*053f45beSAndroid Build Coastguard Worker local kconfig_file="$2" 288*053f45beSAndroid Build Coastguard Worker 289*053f45beSAndroid Build Coastguard Worker if [[ -f "${kconfig_file}" ]]; then 290*053f45beSAndroid Build Coastguard Worker local local_modified="$(stat -c %Y "${kconfig_file}")" 291*053f45beSAndroid Build Coastguard Worker 292*053f45beSAndroid Build Coastguard Worker for config in "${KCONFIG_REL_PATHS[@]}"; do 293*053f45beSAndroid Build Coastguard Worker local kconfig_src="${kernel_checkout}/${config}" 294*053f45beSAndroid Build Coastguard Worker local src_modified="$(stat -c %Y "${kconfig_src}")" 295*053f45beSAndroid Build Coastguard Worker # Only update the config if it has been updated after the 296*053f45beSAndroid Build Coastguard Worker # previously cached config was created. This avoids 297*053f45beSAndroid Build Coastguard Worker # unnecessarily compiling the kernel and selftests. 298*053f45beSAndroid Build Coastguard Worker if [[ "${src_modified}" -gt "${local_modified}" ]]; then 299*053f45beSAndroid Build Coastguard Worker do_update_kconfig "$kernel_checkout" "$kconfig_file" 300*053f45beSAndroid Build Coastguard Worker # Once we have found one outdated configuration 301*053f45beSAndroid Build Coastguard Worker # there is no need to check other ones. 302*053f45beSAndroid Build Coastguard Worker break 303*053f45beSAndroid Build Coastguard Worker fi 304*053f45beSAndroid Build Coastguard Worker done 305*053f45beSAndroid Build Coastguard Worker else 306*053f45beSAndroid Build Coastguard Worker do_update_kconfig "$kernel_checkout" "$kconfig_file" 307*053f45beSAndroid Build Coastguard Worker fi 308*053f45beSAndroid Build Coastguard Worker} 309*053f45beSAndroid Build Coastguard Worker 310*053f45beSAndroid Build Coastguard Workercatch() 311*053f45beSAndroid Build Coastguard Worker{ 312*053f45beSAndroid Build Coastguard Worker local exit_code=$1 313*053f45beSAndroid Build Coastguard Worker local exit_status_file="${OUTPUT_DIR}/${EXIT_STATUS_FILE}" 314*053f45beSAndroid Build Coastguard Worker # This is just a cleanup and the directory may 315*053f45beSAndroid Build Coastguard Worker # have already been unmounted. So, don't let this 316*053f45beSAndroid Build Coastguard Worker # clobber the error code we intend to return. 317*053f45beSAndroid Build Coastguard Worker unmount_image || true 318*053f45beSAndroid Build Coastguard Worker if [[ -f "${exit_status_file}" ]]; then 319*053f45beSAndroid Build Coastguard Worker exit_code="$(cat ${exit_status_file})" 320*053f45beSAndroid Build Coastguard Worker fi 321*053f45beSAndroid Build Coastguard Worker exit ${exit_code} 322*053f45beSAndroid Build Coastguard Worker} 323*053f45beSAndroid Build Coastguard Worker 324*053f45beSAndroid Build Coastguard Workermain() 325*053f45beSAndroid Build Coastguard Worker{ 326*053f45beSAndroid Build Coastguard Worker local script_dir="$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" 327*053f45beSAndroid Build Coastguard Worker local kernel_checkout=$(realpath "${script_dir}"/../../../../) 328*053f45beSAndroid Build Coastguard Worker # By default the script searches for the kernel in the checkout directory but 329*053f45beSAndroid Build Coastguard Worker # it also obeys environment variables O= and KBUILD_OUTPUT= 330*053f45beSAndroid Build Coastguard Worker local kernel_bzimage="${kernel_checkout}/${BZIMAGE}" 331*053f45beSAndroid Build Coastguard Worker local command="${DEFAULT_COMMAND}" 332*053f45beSAndroid Build Coastguard Worker local update_image="no" 333*053f45beSAndroid Build Coastguard Worker local exit_command="poweroff -f" 334*053f45beSAndroid Build Coastguard Worker local debug_shell="no" 335*053f45beSAndroid Build Coastguard Worker 336*053f45beSAndroid Build Coastguard Worker while getopts ':hskid:j:' opt; do 337*053f45beSAndroid Build Coastguard Worker case ${opt} in 338*053f45beSAndroid Build Coastguard Worker i) 339*053f45beSAndroid Build Coastguard Worker update_image="yes" 340*053f45beSAndroid Build Coastguard Worker ;; 341*053f45beSAndroid Build Coastguard Worker d) 342*053f45beSAndroid Build Coastguard Worker OUTPUT_DIR="$OPTARG" 343*053f45beSAndroid Build Coastguard Worker ;; 344*053f45beSAndroid Build Coastguard Worker j) 345*053f45beSAndroid Build Coastguard Worker NUM_COMPILE_JOBS="$OPTARG" 346*053f45beSAndroid Build Coastguard Worker ;; 347*053f45beSAndroid Build Coastguard Worker s) 348*053f45beSAndroid Build Coastguard Worker command="" 349*053f45beSAndroid Build Coastguard Worker debug_shell="yes" 350*053f45beSAndroid Build Coastguard Worker exit_command="bash" 351*053f45beSAndroid Build Coastguard Worker ;; 352*053f45beSAndroid Build Coastguard Worker h) 353*053f45beSAndroid Build Coastguard Worker usage 354*053f45beSAndroid Build Coastguard Worker exit 0 355*053f45beSAndroid Build Coastguard Worker ;; 356*053f45beSAndroid Build Coastguard Worker \? ) 357*053f45beSAndroid Build Coastguard Worker echo "Invalid Option: -$OPTARG" 358*053f45beSAndroid Build Coastguard Worker usage 359*053f45beSAndroid Build Coastguard Worker exit 1 360*053f45beSAndroid Build Coastguard Worker ;; 361*053f45beSAndroid Build Coastguard Worker : ) 362*053f45beSAndroid Build Coastguard Worker echo "Invalid Option: -$OPTARG requires an argument" 363*053f45beSAndroid Build Coastguard Worker usage 364*053f45beSAndroid Build Coastguard Worker exit 1 365*053f45beSAndroid Build Coastguard Worker ;; 366*053f45beSAndroid Build Coastguard Worker esac 367*053f45beSAndroid Build Coastguard Worker done 368*053f45beSAndroid Build Coastguard Worker shift $((OPTIND -1)) 369*053f45beSAndroid Build Coastguard Worker 370*053f45beSAndroid Build Coastguard Worker trap 'catch "$?"' EXIT 371*053f45beSAndroid Build Coastguard Worker 372*053f45beSAndroid Build Coastguard Worker if [[ $# -eq 0 && "${debug_shell}" == "no" ]]; then 373*053f45beSAndroid Build Coastguard Worker echo "No command specified, will run ${DEFAULT_COMMAND} in the vm" 374*053f45beSAndroid Build Coastguard Worker else 375*053f45beSAndroid Build Coastguard Worker command="$@" 376*053f45beSAndroid Build Coastguard Worker fi 377*053f45beSAndroid Build Coastguard Worker 378*053f45beSAndroid Build Coastguard Worker local kconfig_file="${OUTPUT_DIR}/latest.config" 379*053f45beSAndroid Build Coastguard Worker local make_command="make -j ${NUM_COMPILE_JOBS} KCONFIG_CONFIG=${kconfig_file}" 380*053f45beSAndroid Build Coastguard Worker 381*053f45beSAndroid Build Coastguard Worker # Figure out where the kernel is being built. 382*053f45beSAndroid Build Coastguard Worker # O takes precedence over KBUILD_OUTPUT. 383*053f45beSAndroid Build Coastguard Worker if [[ "${O:=""}" != "" ]]; then 384*053f45beSAndroid Build Coastguard Worker if is_rel_path "${O}"; then 385*053f45beSAndroid Build Coastguard Worker O="$(realpath "${PWD}/${O}")" 386*053f45beSAndroid Build Coastguard Worker fi 387*053f45beSAndroid Build Coastguard Worker kernel_bzimage="${O}/${BZIMAGE}" 388*053f45beSAndroid Build Coastguard Worker make_command="${make_command} O=${O}" 389*053f45beSAndroid Build Coastguard Worker elif [[ "${KBUILD_OUTPUT:=""}" != "" ]]; then 390*053f45beSAndroid Build Coastguard Worker if is_rel_path "${KBUILD_OUTPUT}"; then 391*053f45beSAndroid Build Coastguard Worker KBUILD_OUTPUT="$(realpath "${PWD}/${KBUILD_OUTPUT}")" 392*053f45beSAndroid Build Coastguard Worker fi 393*053f45beSAndroid Build Coastguard Worker kernel_bzimage="${KBUILD_OUTPUT}/${BZIMAGE}" 394*053f45beSAndroid Build Coastguard Worker make_command="${make_command} KBUILD_OUTPUT=${KBUILD_OUTPUT}" 395*053f45beSAndroid Build Coastguard Worker fi 396*053f45beSAndroid Build Coastguard Worker 397*053f45beSAndroid Build Coastguard Worker populate_url_map 398*053f45beSAndroid Build Coastguard Worker 399*053f45beSAndroid Build Coastguard Worker local rootfs_img="${OUTPUT_DIR}/${ROOTFS_IMAGE}" 400*053f45beSAndroid Build Coastguard Worker local mount_dir="${OUTPUT_DIR}/${MOUNT_DIR}" 401*053f45beSAndroid Build Coastguard Worker 402*053f45beSAndroid Build Coastguard Worker echo "Output directory: ${OUTPUT_DIR}" 403*053f45beSAndroid Build Coastguard Worker 404*053f45beSAndroid Build Coastguard Worker mkdir -p "${OUTPUT_DIR}" 405*053f45beSAndroid Build Coastguard Worker mkdir -p "${mount_dir}" 406*053f45beSAndroid Build Coastguard Worker update_kconfig "${kernel_checkout}" "${kconfig_file}" 407*053f45beSAndroid Build Coastguard Worker 408*053f45beSAndroid Build Coastguard Worker recompile_kernel "${kernel_checkout}" "${make_command}" 409*053f45beSAndroid Build Coastguard Worker 410*053f45beSAndroid Build Coastguard Worker if [[ "${update_image}" == "no" && ! -f "${rootfs_img}" ]]; then 411*053f45beSAndroid Build Coastguard Worker echo "rootfs image not found in ${rootfs_img}" 412*053f45beSAndroid Build Coastguard Worker update_image="yes" 413*053f45beSAndroid Build Coastguard Worker fi 414*053f45beSAndroid Build Coastguard Worker 415*053f45beSAndroid Build Coastguard Worker if [[ "${update_image}" == "yes" ]]; then 416*053f45beSAndroid Build Coastguard Worker create_vm_image 417*053f45beSAndroid Build Coastguard Worker fi 418*053f45beSAndroid Build Coastguard Worker 419*053f45beSAndroid Build Coastguard Worker update_selftests "${kernel_checkout}" "${make_command}" 420*053f45beSAndroid Build Coastguard Worker update_init_script "${command}" "${exit_command}" 421*053f45beSAndroid Build Coastguard Worker run_vm "${kernel_bzimage}" 422*053f45beSAndroid Build Coastguard Worker if [[ "${command}" != "" ]]; then 423*053f45beSAndroid Build Coastguard Worker copy_logs 424*053f45beSAndroid Build Coastguard Worker echo "Logs saved in ${OUTPUT_DIR}/${LOG_FILE}" 425*053f45beSAndroid Build Coastguard Worker fi 426*053f45beSAndroid Build Coastguard Worker} 427*053f45beSAndroid Build Coastguard Worker 428*053f45beSAndroid Build Coastguard Workermain "$@" 429