blob: 257d464be173aa94a398fab68299e11263b4f5e9 [file] [log] [blame]
#!/bin/sh
# Copyright 2014 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
usage() {
cat >&2 <<EOF
arm64_download - this script downloads the Linaro's ARMv8 Aarch64
toolchain and minimal embedded Linux system as well as ARM's
foundation model. The required files are mirrored on Google Cloud.
If the files are already located in the working directory, the
download can be skipped if the checksums match.
The script then starts a emulated Arm64 Linux system in the
background. After the boot is complete, you can SSH into the system
at port 8022 via user@localhost. The SSH key will be downloaded into
the working directery as well.
Requires gsutil, xz, tar, and gunzip.
Usage:
$0 WORKING_DIRECTORY
ssh-add WORKING_DIRECTORY/key
...wait...
ssh -p 8022 user@localhost
EOF
return 1
}
try() {
# print an error on nonzero return code
"$@"
local ret=$?
if [ $ret != 0 ] ; then
echo "'$@' failed and returned ${ret}." >&2
return $ret
fi
}
download_necessary_software_to_dir() (
cd "$1"
local location="chromium-skia-gm/arm64env"
try gsutil cp "gs://${location}/md5sum.txt" . || return
if md5sum -c --quiet "md5sum.txt"; then
return 0
fi
try gsutil cp "gs://${location}/*" . || return
)
install_compiler() {
local working_dir="$1"
local toolchain="gcc-linaro-aarch64-linux-gnu-4.8-2013.12_linux"
(
try cd "$working_dir" || return
try test -f "${toolchain}.tar.xz" || return
try xz --decompress --stdout < "${toolchain}.tar.xz" | \
try tar xf - || return
)
local dir="${working_dir}/${toolchain}"
try test -d "$dir" || return
try test -x "${dir}/bin/aarch64-linux-gnu-gcc" || return
try test -x "${dir}/bin/aarch64-linux-gnu-g++" || return
}
install_runtime() {
local working_dir="$1"
local firmware='img-foundation.axf'
local rootfs='vexpress64-openembedded_lamp-armv8-gcc-4.8_20131215-557'
local compressed_rootfs="${rootfs}.img.CLEAN_AND_CONFIGURED.xz"
local compressed_foundation_model='FM000-KT-00035-r0p8-52rel06.tgz'
local keyfile='CLEAN_AND_CONFIGURED_key'
try cp "${working_dir}/$firmware" "${working_dir}/firmware" || return
try xz --decompress --stdout \
< "${working_dir}/${compressed_rootfs}" \
> "${working_dir}/rootfs" || return
try test -f "${working_dir}/rootfs" || return
(
try cd "$working_dir" || return
try test -f "$compressed_foundation_model" || return
try gunzip -c "$compressed_foundation_model" | try tar xf - || return
try test -d "Foundation_v8pkg" || return # Assert.
)
try cp "${working_dir}/${keyfile}" "${working_dir}/key" || return
chmod 'go=' "${working_dir}/key"
}
start_arm64_image() {
local working_dir="$1"
local foundation_dir="${working_dir}/Foundation_v8pkg"
local foundation="${foundation_dir}/models/Linux64_GCC-4.1/Foundation_v8"
local firmware="${working_dir}/firmware"
local rootfs="${working_dir}/rootfs"
try test -d "$foundation_dir" || return
try test -x "$foundation" || return
try test -f "$firmware" || return
try test -f "$rootfs" || return
for PID in $(ps -o 'pid=' -C 'Foundation_v8') ; do
kill $PID
done
DISPLAY='' nohup \
"$foundation" \
--image="${firmware}" \
--cores=4 \
--block-device="${rootfs}" \
--network="nat" \
--network-nat-subnet="192.168.31.0/24" \
--network-nat-ports="8022=22" \
> /dev/null 2>&1 &
echo 'Waiting for foundation model to boot...'
while ! ssh -i "${working_dir}/key" \
-o NoHostAuthenticationForLocalhost=yes \
-p 8022 user@localhost true 2> /dev/null; do
sleep 5
done
echo 'Listening to SSH on port 8022.'
}
arm64_download() {
local working_directory="$1"
try mkdir -p "$working_directory" || return
try download_necessary_software_to_dir "$working_directory" || return
try install_compiler "$working_directory" || return
try install_runtime "$working_directory" || return
try start_arm64_image "$working_directory" || return
}
for command in gsutil xz tar md5sum gunzip; do
try command -v "$command" > /dev/null || usage || exit
done
if [ -z "$1" ] ; then
usage || exit
fi
try arm64_download "$1"