1f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org#!/bin/sh
2f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
3f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org# Copyright 2014 Google Inc.
4f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org#
5f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org# Use of this source code is governed by a BSD-style license that can be
6f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org# found in the LICENSE file.
7f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
8f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
9f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgusage() {
10f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    cat >&2 <<EOF
11f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgarm64_download - this script downloads the Linaro's ARMv8 Aarch64
12f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgtoolchain and minimal embedded Linux system as well as ARM's
13f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgfoundation model.  The required files are mirrored on Google Cloud.
14f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
15f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgIf the files are already located in the working directory, the
16f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgdownload can be skipped if the checksums match.
17f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
18f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgThe script then starts a emulated Arm64 Linux system in the
19f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgbackground.  After the boot is complete, you can SSH into the system
20f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgat port 8022 via user@localhost.  The SSH key will be downloaded into
21f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgthe working directery as well.
22f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
23f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgRequires gsutil, xz, tar, and gunzip.
24f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
25f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgUsage:
26f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org  $0 WORKING_DIRECTORY
27f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org  ssh-add WORKING_DIRECTORY/key
28f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org  ...wait...
29f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org  ssh -p 8022 user@localhost
30f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgEOF
31f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    return 1
32f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
33f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
34f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgtry() {
35f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    # print an error on nonzero return code
36f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    "$@"
37f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local ret=$?
38f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    if [ $ret != 0 ] ; then
39f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        echo "'$@' failed and returned ${ret}." >&2
40f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        return $ret
41f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    fi
42f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
43f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
440015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.orgdownload_necessary_software_to_dir() (
450015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    cd "$1"
460015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local location="chromium-skia-gm/arm64env"
470015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try gsutil cp "gs://${location}/md5sum.txt" . || return
480015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    if md5sum -c --quiet "md5sum.txt"; then
490015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        return 0
50f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    fi
510015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try gsutil cp "gs://${location}/*" . || return
520015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org)
53f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
540015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.orginstall_compiler() {
55f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local working_dir="$1"
560015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local toolchain="gcc-linaro-aarch64-linux-gnu-4.8-2013.12_linux"
57f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    (
580015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        try cd "$working_dir" || return
590015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        try test -f "${toolchain}.tar.xz" || return
600015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        try xz --decompress --stdout < "${toolchain}.tar.xz" | \
610015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org            try tar xf - || return
62f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    )
63f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local dir="${working_dir}/${toolchain}"
64f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -d "$dir" || return
65f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -x "${dir}/bin/aarch64-linux-gnu-gcc" || return
66f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -x "${dir}/bin/aarch64-linux-gnu-g++" || return
67f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
68f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
690015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.orginstall_runtime() {
70f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local working_dir="$1"
71f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
720015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local firmware='img-foundation.axf'
730015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local rootfs='vexpress64-openembedded_lamp-armv8-gcc-4.8_20131215-557'
740015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local compressed_rootfs="${rootfs}.img.CLEAN_AND_CONFIGURED.xz"
750015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local compressed_foundation_model='FM000-KT-00035-r0p8-52rel06.tgz'
760015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    local keyfile='CLEAN_AND_CONFIGURED_key'
77f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
780015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try cp "${working_dir}/$firmware" "${working_dir}/firmware" || return
79f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
80f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try xz --decompress --stdout \
810015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        < "${working_dir}/${compressed_rootfs}" \
820015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        > "${working_dir}/rootfs" || return
83f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -f "${working_dir}/rootfs" || return
84f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
85f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    (
86f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        try cd "$working_dir" || return
870015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org        try test -f "$compressed_foundation_model" || return
88f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        try gunzip -c "$compressed_foundation_model" | try tar xf - || return
89f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        try test -d "Foundation_v8pkg" || return  #  Assert.
90f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    )
91f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
920015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try cp "${working_dir}/${keyfile}" "${working_dir}/key" || return
930015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    chmod 'go=' "${working_dir}/key"
94f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
95f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
96f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgstart_arm64_image() {
97f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local working_dir="$1"
98f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local foundation_dir="${working_dir}/Foundation_v8pkg"
99f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local foundation="${foundation_dir}/models/Linux64_GCC-4.1/Foundation_v8"
100f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local firmware="${working_dir}/firmware"
101f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local rootfs="${working_dir}/rootfs"
102f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
103f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -d "$foundation_dir" || return
104f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -x "$foundation" || return
105f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -f "$firmware" || return
106f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try test -f "$rootfs" || return
107f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
108f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    for PID in $(ps -o 'pid=' -C 'Foundation_v8') ; do
109f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        kill $PID
110f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    done
111f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
112f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    DISPLAY='' nohup \
113f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    "$foundation" \
114f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --image="${firmware}" \
115f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --cores=4 \
116f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --block-device="${rootfs}" \
117f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --network="nat" \
118f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --network-nat-subnet="192.168.31.0/24" \
119f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        --network-nat-ports="8022=22" \
120f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org        > /dev/null 2>&1 &
12187126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org    echo 'Waiting for foundation model to boot...'
12287126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org    while ! ssh -i "${working_dir}/key" \
12387126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org        -o NoHostAuthenticationForLocalhost=yes \
12487126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org        -p 8022 user@localhost true 2> /dev/null; do
12587126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org        sleep 5
12687126fb154af54a4e251e84f6b490f1210a4e013commit-bot@chromium.org    done
127f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    echo 'Listening to SSH on port 8022.'
128f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
129f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
130f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgarm64_download() {
131f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    local working_directory="$1"
132f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try mkdir -p "$working_directory" || return
133f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
1340015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try download_necessary_software_to_dir "$working_directory" || return
135f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
1360015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try install_compiler "$working_directory" || return
1370015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org
1380015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try install_runtime "$working_directory" || return
1390015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org
1400015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.org    try start_arm64_image "$working_directory" || return
141f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org}
142f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
1430015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.orgfor command in gsutil xz tar md5sum gunzip; do
144f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    try command -v "$command" > /dev/null || usage || exit
145f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgdone
146f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org
147f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgif [ -z "$1" ] ; then
148f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.org    usage || exit
149f84722e47772f130d523254df2b4ed276b3f1432commit-bot@chromium.orgfi
1500015df93b3a583d05e1ff4a0dc548be6d4f20d25commit-bot@chromium.orgtry arm64_download "$1"
151