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