| #!/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" |