1#!/usr/bin/env bash 2 3srcdir=$(cd "$(dirname "$0")"; pwd) 4prefix=/usr/local 5cc=gcc 6ld=ld 7objcopy=objcopy 8objdump=objdump 9ar=ar 10addr2line=addr2line 11arch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'` 12host=$arch 13cross_prefix= 14endian="" 15pretty_print_stacks=yes 16environ_default=yes 17u32_long= 18wa_divide= 19vmm="qemu" 20errata_force=0 21erratatxt="$srcdir/errata.txt" 22 23usage() { 24 cat <<-EOF 25 Usage: $0 [options] 26 27 Options include: 28 --arch=ARCH architecture to compile for ($arch) 29 --processor=PROCESSOR processor to compile for ($arch) 30 --vmm=VMM virtual machine monitor to compile for (qemu 31 or kvmtool, default is qemu) (arm/arm64 only) 32 --cross-prefix=PREFIX cross compiler prefix 33 --cc=CC c compiler to use ($cc) 34 --ld=LD ld linker to use ($ld) 35 --prefix=PREFIX where to install things ($prefix) 36 --endian=ENDIAN endianness to compile for (little or big, ppc64 only) 37 --[enable|disable]-pretty-print-stacks 38 enable or disable pretty stack printing (enabled by default) 39 --[enable|disable]-default-environ 40 enable or disable the generation of a default environ when 41 no environ is provided by the user (enabled by default) 42 --erratatxt=FILE specify a file to use instead of errata.txt. Use 43 '--erratatxt=' to ensure no file is used. 44EOF 45 exit 1 46} 47 48while [[ "$1" = -* ]]; do 49 opt="$1"; shift 50 arg= 51 if [[ "$opt" = *=* ]]; then 52 arg="${opt#*=}" 53 opt="${opt%%=*}" 54 fi 55 case "$opt" in 56 --prefix) 57 prefix="$arg" 58 ;; 59 --arch) 60 arch="$arg" 61 ;; 62 --processor) 63 processor="$arg" 64 ;; 65 --vmm) 66 vmm="$arg" 67 ;; 68 --cross-prefix) 69 cross_prefix="$arg" 70 ;; 71 --endian) 72 endian="$arg" 73 ;; 74 --cc) 75 cc="$arg" 76 ;; 77 --ld) 78 ld="$arg" 79 ;; 80 --enable-pretty-print-stacks) 81 pretty_print_stacks=yes 82 ;; 83 --disable-pretty-print-stacks) 84 pretty_print_stacks=no 85 ;; 86 --enable-default-environ) 87 environ_default=yes 88 ;; 89 --disable-default-environ) 90 environ_default=no 91 ;; 92 --erratatxt) 93 erratatxt= 94 [ "$arg" ] && erratatxt=$(eval realpath "$arg") 95 ;; 96 --help) 97 usage 98 ;; 99 *) 100 usage 101 ;; 102 esac 103done 104 105if [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then 106 echo "erratatxt: $erratatxt does not exist or is not a regular file" 107 exit 1 108fi 109 110arch_name=$arch 111[ "$arch" = "aarch64" ] && arch="arm64" 112[ "$arch_name" = "arm64" ] && arch_name="aarch64" 113 114[ -z "$processor" ] && processor="$arch" 115 116if [ "$processor" = "arm64" ]; then 117 processor="cortex-a57" 118elif [ "$processor" = "arm" ]; then 119 processor="cortex-a15" 120fi 121 122if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 123 testdir=x86 124elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 125 testdir=arm 126 if [ "$vmm" = "qemu" ]; then 127 arm_uart_early_addr=0x09000000 128 elif [ "$vmm" = "kvmtool" ]; then 129 arm_uart_early_addr=0x3f8 130 errata_force=1 131 else 132 echo '--vmm must be one of "qemu" or "kvmtool"!' 133 usage 134 fi 135elif [ "$arch" = "ppc64" ]; then 136 testdir=powerpc 137 firmware="$testdir/boot_rom.bin" 138 if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then 139 echo "You must provide endianness (big or little)!" 140 usage 141 fi 142else 143 testdir=$arch 144fi 145if [ ! -d "$srcdir/$testdir" ]; then 146 echo "$testdir does not exist!" 147 exit 1 148fi 149if [ -f "$srcdir/$testdir/run" ]; then 150 ln -fs "$srcdir/$testdir/run" $testdir-run 151fi 152 153# check if uint32_t needs a long format modifier 154cat << EOF > lib-test.c 155__UINT32_TYPE__ 156EOF 157u32_long=$("$cross_prefix$cc" -E lib-test.c | grep -v '^#' | grep -q long && echo yes) 158rm -f lib-test.c 159 160# check if slash can be used for division 161if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 162 cat << EOF > lib-test.S 163foo: 164 movl (8 / 2), %eax 165EOF 166 wa_divide=$("$cross_prefix$cc" -c lib-test.S >/dev/null 2>&1 || echo yes) 167 rm -f lib-test.{o,S} 168fi 169 170# Are we in a separate build tree? If so, link the Makefile 171# and shared stuff so that 'make' and run_tests.sh work. 172if test ! -e Makefile; then 173 echo "linking Makefile..." 174 ln -s "$srcdir/Makefile" . 175 176 echo "linking tests..." 177 mkdir -p $testdir 178 ln -sf "$srcdir/$testdir/run" $testdir/ 179 ln -sf "$srcdir/$testdir/unittests.cfg" $testdir/ 180 ln -sf "$srcdir/run_tests.sh" 181 182 echo "linking scripts..." 183 ln -sf "$srcdir/scripts" 184fi 185 186# link lib/asm for the architecture 187rm -f lib/asm 188asm="asm-generic" 189if [ -d "$srcdir/lib/$arch/asm" ]; then 190 asm="$srcdir/lib/$arch/asm" 191elif [ -d "$srcdir/lib/$testdir/asm" ]; then 192 asm="$srcdir/lib/$testdir/asm" 193fi 194mkdir -p lib 195ln -sf "$asm" lib/asm 196 197 198# create the config 199cat <<EOF > config.mak 200SRCDIR=$srcdir 201PREFIX=$prefix 202HOST=$host 203ARCH=$arch 204ARCH_NAME=$arch_name 205PROCESSOR=$processor 206CC=$cross_prefix$cc 207LD=$cross_prefix$ld 208OBJCOPY=$cross_prefix$objcopy 209OBJDUMP=$cross_prefix$objdump 210AR=$cross_prefix$ar 211ADDR2LINE=$cross_prefix$addr2line 212TEST_DIR=$testdir 213FIRMWARE=$firmware 214ENDIAN=$endian 215PRETTY_PRINT_STACKS=$pretty_print_stacks 216ENVIRON_DEFAULT=$environ_default 217ERRATATXT=$erratatxt 218U32_LONG_FMT=$u32_long 219WA_DIVIDE=$wa_divide 220EOF 221 222cat <<EOF > lib/config.h 223#ifndef CONFIG_H 224#define CONFIG_H 1 225/* 226 * Generated file. DO NOT MODIFY. 227 * 228 */ 229 230EOF 231if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 232cat <<EOF >> lib/config.h 233 234#define CONFIG_UART_EARLY_BASE ${arm_uart_early_addr} 235#define CONFIG_ERRATA_FORCE ${errata_force} 236 237EOF 238fi 239echo "#endif" >> lib/config.h 240