1 #!/bin/bash 2 # 3 # Builds ARM Trusted Firmware, and generates FIPs with UEFI and optionally 4 # Trusted OS for the supported platforms. 5 # Not intended to be called directly, invoked from uefi-build.sh. 6 # 7 # Board configuration is extracted from 8 # parse-platforms.py and platforms.config. 9 # 10 11 TOOLS_DIR="`dirname $0`" 12 . "$TOOLS_DIR"/common-functions 13 OUTPUT_DIR="$PWD"/uefi-build 14 15 ATF_BUILDVER=1 16 17 function usage 18 { 19 echo "usage:" 20 echo "atf-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>" 21 echo 22 } 23 24 function check_atf_buildver 25 { 26 MAJOR=`grep "^VERSION_MAJOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'` 27 [ $? -ne 0 ] && return 1 28 MINOR=`grep "^VERSION_MINOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'` 29 [ $? -ne 0 ] && return 1 30 31 if [ "$MAJOR" -eq 1 -a "$MINOR" -ge 2 ]; then 32 ATF_BUILDVER=2 33 fi 34 } 35 36 function build_platform 37 { 38 if [ X"$EDK2_DIR" = X"" ];then 39 echo "EDK2_DIR not set!" >&2 40 return 1 41 fi 42 43 check_atf_buildver || return 1 44 45 BUILD_ATF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_atf`" 46 if [ X"$BUILD_ATF" = X"" ]; then 47 echo "Platform '$1' is not configured to build ARM Trusted Firmware." 48 return 0 49 fi 50 51 ATF_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`" 52 if [ X"$ATF_PLATFORM" = X"" ]; then 53 ATF_PLATFORM=$1 54 fi 55 56 # 57 # Read platform configuration 58 # 59 PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o longname`" 60 PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o arch`" 61 PLATFORM_IMAGE_DIR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_image_dir`" 62 PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_buildflags`" 63 64 if [ $VERBOSE -eq 1 ]; then 65 echo "PLATFORM_NAME=$PLATFORM_NAME" 66 echo "PLATFORM_ARCH=$PLATFORM_ARCH" 67 echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR" 68 echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS" 69 fi 70 71 unset BL30 BL31 BL32 BL33 72 BL30="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o scp_bin`" 73 if [ $ATF_BUILDVER -gt 1 ]; then 74 unset SCP_BL2 75 SCP_BL2="$EDK2_DIR/$BL30" 76 fi 77 BL31="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o el3_bin`" 78 BL33="$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_bin`" 79 80 # 81 # Set up cross compilation variables (if applicable) 82 # 83 set_cross_compile 84 CROSS_COMPILE="$TEMP_CROSS_COMPILE" 85 echo "Building ARM Trusted Firmware for $PLATFORM_NAME - $BUILD_PROFILE" 86 echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\"" 87 88 if [ X"$BL30" != X"" ]; then 89 BL30="${EDK2_DIR}"/"${BL30}" 90 fi 91 if [ X"$BL31" != X"" ]; then 92 BL31="${EDK2_DIR}"/"${BL31}" 93 fi 94 95 # 96 # BL32 requires more attention 97 # If TOS_DIR is not set, we assume user does not want a Trusted OS, 98 # even if the source directory and/or binary for it exists 99 # 100 if [ X"$TOS_DIR" != X"" ]; then 101 SPD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_spd`" 102 103 TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`" 104 if [ X"$TOS_BIN" != X"" ]; then 105 BL32=$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN 106 fi 107 108 if [ X"$SPD" != X"" ] && [ X"$BL32" != X"" ]; then 109 # 110 # Since SPD cannot be exported or undefined, 111 # we parametrise it here 112 # 113 SPD_OPTION="SPD=$SPD" 114 else 115 echo "WARNING: Proceeding without Trusted OS!" 116 echo " Please specify both ATF_SPD and TOS_BIN" 117 echo " if you wish to use a Trusted OS!" 118 fi 119 fi 120 121 # 122 # Debug extraction handling 123 # 124 case "$BUILD_ATF" in 125 debug*) 126 DEBUG=1 127 BUILD_TYPE="debug" 128 ;; 129 *) 130 DEBUG=0 131 BUILD_TYPE="release" 132 ;; 133 esac 134 135 export BL30 BL31 BL32 BL33 136 137 echo "BL30=$BL30" 138 if [ $ATF_BUILDVER -gt 1 ]; then 139 export SCP_BL2 140 echo "SCP_BL2=$BL30" 141 fi 142 echo "BL31=$BL31" 143 echo "BL32=$BL32" 144 echo "BL33=$BL33" 145 echo "$SPD_OPTION" 146 echo "BUILD_TYPE=$BUILD_TYPE" 147 148 # 149 # If a build was done with BL32, and followed by another without, 150 # the BL32 component remains in fip.bin, so we delete the build dir 151 # contents before calling make 152 # 153 rm -rf build/"$ATF_PLATFORM/$BUILD_TYPE"/* 154 155 # 156 # Build ARM Trusted Firmware and create FIP 157 # 158 if [ $VERBOSE -eq 1 ]; then 159 echo "Calling ARM Trusted Firmware build:" 160 echo "CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip" 161 fi 162 CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip 163 if [ $? -eq 0 ]; then 164 # 165 # Copy resulting images to UEFI image dir 166 # 167 if [ $VERBOSE -eq 1 ]; then 168 echo "Copying bl1.bin and fip.bin to "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"" 169 fi 170 cp -a build/"$ATF_PLATFORM/$BUILD_TYPE"/{bl1,fip}.bin "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/" 171 else 172 return 1 173 fi 174 } 175 176 # Check to see if we are in a trusted firmware directory 177 # refuse to continue if we aren't 178 if [ ! -d bl32 ] 179 then 180 echo "ERROR: we aren't in the arm-trusted-firmware directory." 181 usage 182 exit 1 183 fi 184 185 build= 186 187 if [ $# = 0 ] 188 then 189 usage 190 exit 1 191 else 192 while [ "$1" != "" ]; do 193 case $1 in 194 "-e" ) 195 shift 196 EDK2_DIR="$1" 197 ;; 198 "/h" | "/?" | "-?" | "-h" | "--help" ) 199 usage 200 exit 201 ;; 202 "-t" ) 203 shift 204 BUILD_PROFILE="$1" 205 ;; 206 * ) 207 build="$1" 208 ;; 209 esac 210 shift 211 done 212 fi 213 214 if [ X"$build" = X"" ]; then 215 echo "No platform specified!" >&2 216 echo 217 usage 218 exit 1 219 fi 220 221 build_platform $build 222 exit $? 223