1 #!/bin/sh 2 3 # Copyright 2014 Google Inc. 4 # 5 # Use of this source code is governed by a BSD-style license that can be 6 # found in the LICENSE file. 7 8 9 usage() { 10 cat >&2 <<EOF 11 arm64_download - this script downloads the Linaro's ARMv8 Aarch64 12 toolchain and minimal embedded Linux system as well as ARM's 13 foundation model. The required files are mirrored on Google Cloud. 14 15 If the files are already located in the working directory, the 16 download can be skipped if the checksums match. 17 18 The script then starts a emulated Arm64 Linux system in the 19 background. After the boot is complete, you can SSH into the system 20 at port 8022 via user@localhost. The SSH key will be downloaded into 21 the working directery as well. 22 23 Requires gsutil, xz, tar, and gunzip. 24 25 Usage: 26 $0 WORKING_DIRECTORY 27 ssh-add WORKING_DIRECTORY/key 28 ...wait... 29 ssh -p 8022 user@localhost 30 EOF 31 return 1 32 } 33 34 try() { 35 # print an error on nonzero return code 36 "$@" 37 local ret=$? 38 if [ $ret != 0 ] ; then 39 echo "'$@' failed and returned ${ret}." >&2 40 return $ret 41 fi 42 } 43 44 download_necessary_software_to_dir() ( 45 cd "$1" 46 local location="chromium-skia-gm/arm64env" 47 try gsutil cp "gs://${location}/md5sum.txt" . || return 48 if md5sum -c --quiet "md5sum.txt"; then 49 return 0 50 fi 51 try gsutil cp "gs://${location}/*" . || return 52 ) 53 54 install_compiler() { 55 local working_dir="$1" 56 local toolchain="gcc-linaro-aarch64-linux-gnu-4.8-2013.12_linux" 57 ( 58 try cd "$working_dir" || return 59 try test -f "${toolchain}.tar.xz" || return 60 try xz --decompress --stdout < "${toolchain}.tar.xz" | \ 61 try tar xf - || return 62 ) 63 local dir="${working_dir}/${toolchain}" 64 try test -d "$dir" || return 65 try test -x "${dir}/bin/aarch64-linux-gnu-gcc" || return 66 try test -x "${dir}/bin/aarch64-linux-gnu-g++" || return 67 } 68 69 install_runtime() { 70 local working_dir="$1" 71 72 local firmware='img-foundation.axf' 73 local rootfs='vexpress64-openembedded_lamp-armv8-gcc-4.8_20131215-557' 74 local compressed_rootfs="${rootfs}.img.CLEAN_AND_CONFIGURED.xz" 75 local compressed_foundation_model='FM000-KT-00035-r0p8-52rel06.tgz' 76 local keyfile='CLEAN_AND_CONFIGURED_key' 77 78 try cp "${working_dir}/$firmware" "${working_dir}/firmware" || return 79 80 try xz --decompress --stdout \ 81 < "${working_dir}/${compressed_rootfs}" \ 82 > "${working_dir}/rootfs" || return 83 try test -f "${working_dir}/rootfs" || return 84 85 ( 86 try cd "$working_dir" || return 87 try test -f "$compressed_foundation_model" || return 88 try gunzip -c "$compressed_foundation_model" | try tar xf - || return 89 try test -d "Foundation_v8pkg" || return # Assert. 90 ) 91 92 try cp "${working_dir}/${keyfile}" "${working_dir}/key" || return 93 chmod 'go=' "${working_dir}/key" 94 } 95 96 start_arm64_image() { 97 local working_dir="$1" 98 local foundation_dir="${working_dir}/Foundation_v8pkg" 99 local foundation="${foundation_dir}/models/Linux64_GCC-4.1/Foundation_v8" 100 local firmware="${working_dir}/firmware" 101 local rootfs="${working_dir}/rootfs" 102 103 try test -d "$foundation_dir" || return 104 try test -x "$foundation" || return 105 try test -f "$firmware" || return 106 try test -f "$rootfs" || return 107 108 for PID in $(ps -o 'pid=' -C 'Foundation_v8') ; do 109 kill $PID 110 done 111 112 DISPLAY='' nohup \ 113 "$foundation" \ 114 --image="${firmware}" \ 115 --cores=4 \ 116 --block-device="${rootfs}" \ 117 --network="nat" \ 118 --network-nat-subnet="192.168.31.0/24" \ 119 --network-nat-ports="8022=22" \ 120 > /dev/null 2>&1 & 121 echo 'Waiting for foundation model to boot...' 122 while ! ssh -i "${working_dir}/key" \ 123 -o NoHostAuthenticationForLocalhost=yes \ 124 -p 8022 user@localhost true 2> /dev/null; do 125 sleep 5 126 done 127 echo 'Listening to SSH on port 8022.' 128 } 129 130 arm64_download() { 131 local working_directory="$1" 132 try mkdir -p "$working_directory" || return 133 134 try download_necessary_software_to_dir "$working_directory" || return 135 136 try install_compiler "$working_directory" || return 137 138 try install_runtime "$working_directory" || return 139 140 try start_arm64_image "$working_directory" || return 141 } 142 143 for command in gsutil xz tar md5sum gunzip; do 144 try command -v "$command" > /dev/null || usage || exit 145 done 146 147 if [ -z "$1" ] ; then 148 usage || exit 149 fi 150 try arm64_download "$1" 151