xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/bpf/vmtest.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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