Various fixes from feedback and comments
Signed-off-by: Fuad Tabba <tabba@google.com>
diff --git a/Makefile b/Makefile
index 5680316..1ab4f9d 100644
--- a/Makefile
+++ b/Makefile
@@ -3,25 +3,29 @@
##
ROOT_DIR := $(CURDIR)
OUT_DIR := $(ROOT_DIR)/out
-CCACHE_DIR := $(ROOT_DIR)/.ccache
+CCACHE_DIR := $(OUT_DIR)/.ccache
TEST_SCRIPTS_DIR := $(ROOT_DIR)/build/aarch64-unit-tests
##
## Common options
##
VERBOSE ?= 0
-CROSS_PREFIX ?= "aarch64-linux-gnu-"
CCACHE ?= ""
# Find toolchain for current OS
UNNAME_S := $(shell uname -s | tr '[:upper:]' '[:lower:]')
-TOOLCHAIN_CLANG := $(ROOT_DIR)/toolchains/clang/$(UNNAME_S)-x86/clang-r383902
-TOOLCHAIN_BINUTILS := $(ROOT_DIR)/toolchains/gcc/linux-x86/aarch64/aarch64-linux-androide-4.9/aarch64-linux-android
+TOOLCHAIN_CLANG := $(ROOT_DIR)/toolchains/$(UNNAME_S)-x86/clang/clang-r383902
+TOOLCHAIN_BINUTILS := $(ROOT_DIR)/toolchains/$(UNNAME_S)-x86/gcc/aarch64-linux-android
##
## Common targets
##
+.DEFAULT_GOAL := default
+
+.PHONY: default
+default: kvmunittests linux
+
.PHONY: clean
clean: buildroot_clean kvmunittests_clean linux_clean
@@ -35,7 +39,8 @@
.PHONY: help
help:
@echo 'Generic Targets:'
- @echo ' all - builds alli generic targetst'
+ @echo ' default - builds all generic targets except for buildroot'
+ @echo ' all - builds all generic targets'
@echo ' buildroot - the buildroot rootfs image as well as the host qemu'
@echo ' kvmunittests - the kvm-unit-tests'
@echo ' linux - the linux kernel'
@@ -48,8 +53,8 @@
@echo ' linux_clean - the linux kernel'
@echo ''
@echo 'Misc Targets:'
- @echo ' unittests - runs the kvm unit tests in the qemu-aarch64 simulated environment'
- @echo ' update-prebuilts - generates/update the prebuilt rootfs image (aarch64) and the qemu host utilities (aarch64)'
+ @echo ' test - runs the kvm unit tests in the qemu-aarch64 simulated environment'
+ @echo ' update-prebuilts - generates/update the prebuilt rootfs image (aarch64) and the qemu host (aarch64)'
##
@@ -76,7 +81,7 @@
##
## kvmunittests
##
-KUT_CROSS_PREFIX ?= $(CROSS_PREFIX)
+KUT_CROSS_PREFIX ?= "aarch64-linux-android-"
KUT_ARCH := "arm64"
KUT_SRC := $(ROOT_DIR)/kvm-unit-tests
@@ -95,11 +100,11 @@
./configure --prefix=$(KUT_OUT) --arch=$(KUT_ARCH) \
--cc=$(KUT_CC) --ld=$(KUT_LD) \
--objcopy=$(KUT_OBJCOPY) --objdump=$(KUT_OBJDUMP)
- + cd $(KUT_SRC) && PATH=$(KUT_PATH) COMMON_CFLAGS=$(KUT_COMMON_CFLAGS) $(MAKE) install
+ PATH=$(KUT_PATH) COMMON_CFLAGS=$(KUT_COMMON_CFLAGS) $(MAKE) -C $(KUT_SRC) install
.PHONY: kvmunittests_clean
kvmunittests_clean:
- + cd $(KUT_SRC) && $(MAKE) clean
+ - $(MAKE) -C $(KUT_SRC) clean
##
@@ -107,25 +112,32 @@
##
LINUX_DEFCONFIG ?= defconfig
LINUX_VERBOSE ?= $(VERBOSE)
-LINUX_CROSS_PREFIX ?= $(CROSS_PREFIX)
+LINUX_CROSS_COMPILE ?= "aarch64-linux-gnu-"
+LINUX_SRC ?= $(ROOT_DIR)/linux
LINUX_ARCH := arm64
-LINUX_SRC := $(ROOT_DIR)/linux
LINUX_OUT := $(OUT_DIR)/linux
LINUX_PATH := $(TOOLCHAIN_CLANG)/bin:$(PATH)
-LINUX_MAKE := PATH=$(LINUX_PATH) $(MAKE) \
+LINUX_MAKE := \
+ PATH=$(LINUX_PATH) \
ARCH=$(LINUX_ARCH) \
- CROSS_COMPILE=$(LINUX_CROSS_PREFIX) \
+ CROSS_COMPILE=$(LINUX_CROSS_COMPILE) \
+ $(MAKE) \
LLVM=1 \
+ GCC_TOOLCHAIN_DIR=$(TOOLCHAIN_BINUTILS)/bin \
-C $(LINUX_SRC) \
V=$(LINUX_VERBOSE) \
O=$(LINUX_OUT)
.PHONY: linux
linux:
- + $(LINUX_MAKE) defconfig
+ + $(LINUX_MAKE) $(LINUX_DEFCONFIG)
+ $(LINUX_MAKE)
+.PHONY: linux_image
+linux_image:
+ + $(LINUX_MAKE) $(LINUX_DEFCONFIG)
+ + $(LINUX_MAKE) Image.gz
.PHONY: linux_clean
linux_clean:
@@ -134,34 +146,22 @@
##
-## Run unit tests
-##
-
-MAKE_PID := $(shell echo $$PPID)
-JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)")))
-JOBS := $(subst -j,,$(JOB_FLAG))
-ifeq ($(JOBS),)
- JOBS := "1"
-endif
-
-
-##
## Generating/Updating prebuilts
##
update-prebuilts: \
- prebuilts/images/linux-aarch64 \
- prebuilts/host_utils/linux-x86
+ prebuilts/linux-aarch64/images \
+ prebuilts/linux-x86/qemu
# The rootfs and rom images for qemu
-prebuilts/images/linux-aarch64: buildroot
+prebuilts/linux-aarch64/images: buildroot
- rm -rf $@
mkdir -p $@
cp $(BR_OUT)/images/rootfs.ext4 $@
cp $(BR_OUT)/per-package/host-qemu/host/share/qemu/efi-virtio.rom $@
# The qemu binary and the libraries it requires
-prebuilts/host_utils/linux-x86: buildroot
+prebuilts/linux-x86/qemu: buildroot
- rm -rf $@
mkdir -p $@/bin
cp $(BR_OUT)/host/bin/qemu-system-aarch64 $@/bin
@@ -180,15 +180,15 @@
JOBS := "1"
endif
-KUT_QEMU_BIN := $(ROOT_DIR)/prebuilts/host_utils/linux-x86/bin/qemu-system-aarch64
-KUT_QEMU_LIB := $(ROOT_DIR)/prebuilts/host_utils/linux-x86/lib
-KUT_ROOTFS_IMAGE := $(ROOT_DIR)/prebuilts/images/linux-aarch64/rootfs.ext4
+KUT_QEMU_BIN := $(ROOT_DIR)/prebuilts/linux-x86/qemu/bin/qemu-system-aarch64
+KUT_QEMU_LIB := $(ROOT_DIR)/prebuilts/linux-x86/qemu/lib
+KUT_ROOTFS_IMAGE := $(ROOT_DIR)/prebuilts/linux-aarch64/images/rootfs.ext4
# Exclude tests that require user interaction or are known to fail.
KUT_EXCLUDE := "(.+migrat.+)|(pmu-event-introspection)"
-.PHONY: unittests
-unittests: kvmunittests linux
+.PHONY: test
+test: kvmunittests linux_image
@LD_LIBRARY_PATH=$(KUT_QEMU_LIB):$(LD_LIBRARY_PATH) VERBOSE=$(VERBOSE) \
$(TEST_SCRIPTS_DIR)/run_tests.sh \
-j $(JOBS) \
diff --git a/aarch64-unit-tests/run_emu.sh b/aarch64-unit-tests/run_emu.sh
index e44a0cd..73ed673 100755
--- a/aarch64-unit-tests/run_emu.sh
+++ b/aarch64-unit-tests/run_emu.sh
@@ -17,7 +17,7 @@
TIMEOUT=180s
# QEMU CPUs to use for VHE and nVHE runs
-VHE_CPU="max,sve=off"
+VHE_CPU="max"
NVHE_CPU="cortex-a53"
TEST_FILE=$1
@@ -28,38 +28,36 @@
CPU=""
# Assume that the roms are located with the disk image.
-ROM_PATH=$(dirname ${ROOTFS})
+ROM_PATH=$(dirname "${ROOTFS}")
-echo $ROM_PATH
-
-if [ ! -f ${TEST_FILE} ]; then
+if [ ! -f "${TEST_FILE}" ]; then
echo "Standalone kvmunittest file not found"
echo "Run make standalone first to generate the standalone test files."
exit 1
fi
-if [ ! -f ${LINUX_KERNEL} ]; then
+if [ ! -f "${LINUX_KERNEL}" ]; then
echo "Linux kernel image file not found."
exit 1
fi
-if [ ! -f ${ROOTFS} ]; then
+if [ ! -f "${ROOTFS}" ]; then
echo "Root filesystem image file not found."
exit 1
fi
-if [ ! -x ${QEMU} ]; then
+if [ ! -x "${QEMU}" ]; then
echo "QEMU executable not found."
exit 1
fi
-if [ ${VHE} = 1 ]; then
+if [ "${VHE}" = 1 ]; then
CPU=${VHE_CPU}
else
CPU=${NVHE_CPU}
fi
-timeout -k 1s --foreground ${TIMEOUT} ${QEMU} \
+timeout -k 1s --foreground "${TIMEOUT}" "${QEMU}" \
-M virt \
-machine virtualization=true -machine virt,gic-version=3 \
-cpu "${CPU}" \
@@ -67,7 +65,7 @@
-smp 2 \
-m 512 \
-kernel "${LINUX_KERNEL}" \
- -L ${ROM_PATH} \
+ -L "${ROM_PATH}" \
-append "rootwait root=/dev/vda" \
-drive file="${ROOTFS}",readonly,if=virtio,format=raw \
-drive file="${TEST_FILE}",readonly,if=virtio,format=raw \
diff --git a/aarch64-unit-tests/run_tests.sh b/aarch64-unit-tests/run_tests.sh
index 2633451..19e4a53 100755
--- a/aarch64-unit-tests/run_tests.sh
+++ b/aarch64-unit-tests/run_tests.sh
@@ -14,25 +14,18 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+
# Variables to represent VHE and nVHE emulation parameter
VHE=1
NVHE=0
function get_qemu_binary()
{
- local qemucmd
- local qemu
+ local qemu=${QEMU:-qemu-system-aarch64}
- qemucmd=${QEMU:-qemu-system-aarch64}
- if $qemucmd --help 2>/dev/null | grep -q 'QEMU'; then
- qemu="$qemucmd"
+ if $qemu --help 2>/dev/null | grep -q 'QEMU'; then
+ command -v "${qemu}"
fi
-
- if [ -z "${qemu}" ]; then
- return
- fi
-
- command -v "${qemu}"
}
function get_outcome()
@@ -70,12 +63,12 @@
return
fi
- while (( $(jobs | wc -l) == $j )); do
+ while (( $(jobs | wc -l) == j )); do
# Wait for background jobs
wait -n 2>/dev/null
done
- if [ $j = 1 ]; then
+ if [ "$j" = 1 ]; then
bash -c "$@"
else
bash -c "$@" &
@@ -84,6 +77,7 @@
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
test_dir=""
+log_dir=${LOG_DIR:-out/test/kvm-unit-tests}
exclude_regex=""
j=1
linux=""
@@ -98,7 +92,7 @@
;;
x)
# OR with the previous regex if specified
- if [ ! -z $exclude_regex ]; then
+ if [ -n "${exclude_regex}" ]; then
exclude_regex+="|"
fi
exclude_regex+="(^${OPTARG}$)"
@@ -152,17 +146,17 @@
usage_abort
fi
-rm -rf logs.old
-if [ -d logs ]; then
- mv logs logs.old
+rm -rf "$log_dir"/logs.old
+if [ -d "$log_dir"/logs ]; then
+ mv "$log_dir"/logs "$log_dir"/logs.old
fi
-mkdir -p logs/vhe || exit 2
-mkdir -p logs/nvhe || exit 2
+mkdir -p "$log_dir"/logs/vhe || exit 2
+mkdir -p "$log_dir"/logs/nvhe || exit 2
-for test in ${test_dir}/*; do
- test_name="$(basename ${test})"
+for test in "${test_dir}"/*; do
+ test_name=$(basename "${test}")
- if [[ ! -z $exclude_regex && "${test_name}" =~ ${exclude_regex} ]]; then
+ if [[ -n "${exclude_regex}" && "${test_name}" =~ ${exclude_regex} ]]; then
if [ "$verbose" != "0" ]; then
echo "Excluding ${test_name}"
fi
@@ -174,7 +168,7 @@
fi
# Redirect output instead of pipe to preserve exit status.
- run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${VHE} &> >(tee logs/vhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
- run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${NVHE} &> >(tee logs/nvhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
+ run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${VHE} &> >(tee $log_dir/logs/vhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
+ run_job "${script_dir}/run_emu.sh ${test} ${linux} ${rootfs} ${qemu} ${NVHE} &> >(tee $log_dir/logs/nvhe/${test_name}.log | grep -E -h --color=never \"[^ ](PASS|FAIL|SKIP)[^:]\")"
done
wait