11b7dd7d3SSergey Bronnikov#!/usr/bin/env bash 27d36db35SAvi Kivity 3fc71f7d3SThomas Huthif [ -z "${BASH_VERSINFO[0]}" ] || [ "${BASH_VERSINFO[0]}" -lt 4 ] ; then 4fc71f7d3SThomas Huth echo "Error: Bash version 4 or newer is required for the kvm-unit-tests" 5fc71f7d3SThomas Huth exit 1 6fc71f7d3SThomas Huthfi 7fc71f7d3SThomas Huth 866c0dc59SAlexandru Elisei# Return the default CPU type to compile for 966c0dc59SAlexandru Eliseifunction get_default_processor() 1066c0dc59SAlexandru Elisei{ 1166c0dc59SAlexandru Elisei local arch="$1" 1266c0dc59SAlexandru Elisei 1366c0dc59SAlexandru Elisei case "$arch" in 1466c0dc59SAlexandru Elisei "arm") 1566c0dc59SAlexandru Elisei echo "cortex-a15" 1666c0dc59SAlexandru Elisei ;; 1766c0dc59SAlexandru Elisei "arm64") 1866c0dc59SAlexandru Elisei echo "cortex-a57" 1966c0dc59SAlexandru Elisei ;; 2066c0dc59SAlexandru Elisei *) 2166c0dc59SAlexandru Elisei echo "$arch" 2266c0dc59SAlexandru Elisei ;; 2366c0dc59SAlexandru Elisei esac 2466c0dc59SAlexandru Elisei} 2566c0dc59SAlexandru Elisei 26*5f77b72dSJean-Philippe Brucker# Return the default CPU type to run on 27*5f77b72dSJean-Philippe Bruckerfunction get_default_qemu_cpu() 28*5f77b72dSJean-Philippe Brucker{ 29*5f77b72dSJean-Philippe Brucker local arch="$1" 30*5f77b72dSJean-Philippe Brucker 31*5f77b72dSJean-Philippe Brucker case "$arch" in 32*5f77b72dSJean-Philippe Brucker "arm") 33*5f77b72dSJean-Philippe Brucker echo "cortex-a15" 34*5f77b72dSJean-Philippe Brucker ;; 35*5f77b72dSJean-Philippe Brucker "arm64") 36*5f77b72dSJean-Philippe Brucker echo "cortex-a57" 37*5f77b72dSJean-Philippe Brucker ;; 38*5f77b72dSJean-Philippe Brucker "riscv32" | "riscv64") 39*5f77b72dSJean-Philippe Brucker echo "max" 40*5f77b72dSJean-Philippe Brucker ;; 41*5f77b72dSJean-Philippe Brucker esac 42*5f77b72dSJean-Philippe Brucker} 43*5f77b72dSJean-Philippe Brucker 44e303c665SAlex Bennéesrcdir=$(cd "$(dirname "$0")"; pwd) 457d36db35SAvi Kivityprefix=/usr/local 467d36db35SAvi Kivitycc=gcc 47441cbc0dSThomas Huthcflags= 487d36db35SAvi Kivityld=ld 497d36db35SAvi Kivityobjcopy=objcopy 50de9d141bSAndrew Jonesobjdump=objdump 51445e5aeeSBill Wendlingreadelf=readelf 527d36db35SAvi Kivityar=ar 53e593c4fdSAndrew Jonesaddr2line=addr2line 54c157b6e2SNikos Nikolerisarch=$(uname -m | sed -e 's/i.86/i386/;s/arm64/aarch64/;s/arm.*/arm/;s/ppc64.*/ppc64/') 55c4306560SAlex Bennéehost=$arch 567d36db35SAvi Kivitycross_prefix= 57f1ccf5d2SLaurent Vivierendian="" 5856c886b0SPeter Feinerpretty_print_stacks=yes 5970fcb64bSAndrew Jonesenviron_default=yes 6044f64120SAndrew Jonesu32_long= 61450124ccSRoman Bolshakovwa_divide= 624fcad6e9SAlexandru Eliseitarget= 6335145f14SAndrew Joneserrata_force=0 641a31ffabSAndrew Joneserratatxt="$srcdir/errata.txt" 65238b5967SMarc Hartmayerhost_key_document= 66dc4f7106SJanosch Frankgen_se_header= 6703d0df32SNico Boehrenable_dump=no 68a2d06852SNikos Nikolerispage_size= 6905fa7e7aSAlexandru Eliseiearlycon= 7056a30199SAndrew Jonesconsole= 71c98ce6e0SAlexandru Eliseiefi= 725ded2989SAndrew Jonesefi_direct= 73*5f77b72dSJean-Philippe Bruckertarget_cpu= 747d36db35SAvi Kivity 7501c070a7SThomas Huth# Enable -Werror by default for git repositories only (i.e. developer builds) 7601c070a7SThomas Huthif [ -e "$srcdir"/.git ]; then 7701c070a7SThomas Huth werror=-Werror 7801c070a7SThomas Huthelse 7901c070a7SThomas Huth werror= 8001c070a7SThomas Huthfi 8101c070a7SThomas Huth 827d36db35SAvi Kivityusage() { 831528714dSAlexandru Elisei [ "$arch" = "aarch64" ] && arch="arm64" 8466c0dc59SAlexandru Elisei [ -z "$processor" ] && processor=$(get_default_processor $arch) 857d36db35SAvi Kivity cat <<-EOF 867d36db35SAvi Kivity Usage: $0 [options] 877d36db35SAvi Kivity 887d36db35SAvi Kivity Options include: 8955dd01b4SNicholas Piggin --arch=ARCH architecture to compile for ($arch). ARCH can be one of: 9055dd01b4SNicholas Piggin arm, arm64, i386, ppc64, riscv32, riscv64, s390x, x86_64 9166c0dc59SAlexandru Elisei --processor=PROCESSOR processor to compile for ($processor) 92*5f77b72dSJean-Philippe Brucker --target-cpu=CPU the CPU model to run on. If left unset, the run script 93*5f77b72dSJean-Philippe Brucker selects the best value based on the host system and the 94*5f77b72dSJean-Philippe Brucker test configuration. 954fcad6e9SAlexandru Elisei --target=TARGET target platform that the tests will be running on (qemu or 964fcad6e9SAlexandru Elisei kvmtool, default is qemu) (arm/arm64 only) 977d36db35SAvi Kivity --cross-prefix=PREFIX cross compiler prefix 987d36db35SAvi Kivity --cc=CC c compiler to use ($cc) 99441cbc0dSThomas Huth --cflags=FLAGS extra options to be passed to the c compiler 1007d36db35SAvi Kivity --ld=LD ld linker to use ($ld) 1017d36db35SAvi Kivity --prefix=PREFIX where to install things ($prefix) 102f1ccf5d2SLaurent Vivier --endian=ENDIAN endianness to compile for (little or big, ppc64 only) 10356c886b0SPeter Feiner --[enable|disable]-pretty-print-stacks 10456c886b0SPeter Feiner enable or disable pretty stack printing (enabled by default) 10570fcb64bSAndrew Jones --[enable|disable]-default-environ 10670fcb64bSAndrew Jones enable or disable the generation of a default environ when 10770fcb64bSAndrew Jones no environ is provided by the user (enabled by default) 108b16df9eeSAndrew Jones --erratatxt=FILE specify a file to use instead of errata.txt. Use 109b16df9eeSAndrew Jones '--erratatxt=' to ensure no file is used. 110238b5967SMarc Hartmayer --host-key-document=HOST_KEY_DOCUMENT 111238b5967SMarc Hartmayer Specify the machine-specific host-key document for creating 112238b5967SMarc Hartmayer a PVM image with 'genprotimg' (s390x only) 113dc4f7106SJanosch Frank --gen-se-header=GEN_SE_HEADER 114dc4f7106SJanosch Frank Provide an executable to generate a PV header 115dc4f7106SJanosch Frank requires --host-key-document. (s390x-snippets only) 11603d0df32SNico Boehr --[enable|disable]-dump 11703d0df32SNico Boehr Allow PV guests to be dumped. Requires at least z16. 11803d0df32SNico Boehr (s390x only) 119a2d06852SNikos Nikoleris --page-size=PAGE_SIZE 120d4c8e725SNicholas Piggin Specify the page size (translation granule). PAGE_SIZE can be 121d4c8e725SNicholas Piggin 4k [default], 16k, 64k for arm64. 122d4c8e725SNicholas Piggin 4k [default], 64k for ppc64. 12305fa7e7aSAlexandru Elisei --earlycon=EARLYCON 12456a30199SAndrew Jones Specify the UART name, type and address used for the earlycon (optional). 1256bfcc82cSAndrew Jones The specified address will overwrite the UART address set by 1266bfcc82cSAndrew Jones the --target option. EARLYCON can be one of (case sensitive): 12705fa7e7aSAlexandru Elisei uart[8250],mmio,ADDR 12805fa7e7aSAlexandru Elisei Specify an 8250 compatible UART at address ADDR. Supported 12905fa7e7aSAlexandru Elisei register stride is 8 bit only. 13005fa7e7aSAlexandru Elisei pl011,ADDR 13105fa7e7aSAlexandru Elisei pl011,mmio32,ADDR 13205fa7e7aSAlexandru Elisei Specify a PL011 compatible UART at address ADDR. Supported 13305fa7e7aSAlexandru Elisei register stride is 32 bit only. 1346bfcc82cSAndrew Jones (arm/arm64 and riscv32/riscv64 only) 13556a30199SAndrew Jones --console=CONSOLE 13656a30199SAndrew Jones Specify the device used for output (optional). 13756a30199SAndrew Jones sbi Use SBI DBCN (riscv only) 1381f233aa9SNikos Nikoleris --[enable|disable]-efi Boot and run from UEFI (disabled by default, x86_64 and arm64 only) 13901c070a7SThomas Huth --[enable|disable]-werror 14001c070a7SThomas Huth Select whether to compile with the -Werror compiler flag 1415ded2989SAndrew Jones --[enable|disable]-efi-direct 1425ded2989SAndrew Jones Select whether to run EFI tests directly with QEMU's -kernel 1435ded2989SAndrew Jones option. When not enabled, tests will be placed in an EFI file 1442e0bdc24SAndrew Jones system and run from the UEFI shell. Ignored when efi isn't enabled 1452e0bdc24SAndrew Jones and defaults to enabled when efi is enabled for riscv64. 146a755990cSAndrew Jones (arm64 and riscv64 only) 1477d36db35SAvi KivityEOF 1487d36db35SAvi Kivity exit 1 1497d36db35SAvi Kivity} 1507d36db35SAvi Kivity 151f246b160SNico Boehroptno=1 152f246b160SNico Boehrargc=$# 153f246b160SNico Boehrwhile [[ $optno -le $argc ]]; do 1547d36db35SAvi Kivity opt="$1"; shift 155f246b160SNico Boehr optno=$(( $optno + 1 )) 1567d36db35SAvi Kivity arg= 1577d36db35SAvi Kivity if [[ "$opt" = *=* ]]; then 1587d36db35SAvi Kivity arg="${opt#*=}" 1597d36db35SAvi Kivity opt="${opt%%=*}" 1607d36db35SAvi Kivity fi 1617d36db35SAvi Kivity case "$opt" in 1627d36db35SAvi Kivity --prefix) 1637d36db35SAvi Kivity prefix="$arg" 1647d36db35SAvi Kivity ;; 1657d36db35SAvi Kivity --arch) 1667d36db35SAvi Kivity arch="$arg" 1677d36db35SAvi Kivity ;; 1687d36db35SAvi Kivity --processor) 1697d36db35SAvi Kivity processor="$arg" 1707d36db35SAvi Kivity ;; 171*5f77b72dSJean-Philippe Brucker --target-cpu) 172*5f77b72dSJean-Philippe Brucker target_cpu="$arg" 173*5f77b72dSJean-Philippe Brucker ;; 1744fcad6e9SAlexandru Elisei --target) 1754fcad6e9SAlexandru Elisei target="$arg" 176931a236aSAlexandru Elisei ;; 1777d36db35SAvi Kivity --cross-prefix) 1787d36db35SAvi Kivity cross_prefix="$arg" 1797d36db35SAvi Kivity ;; 180f1ccf5d2SLaurent Vivier --endian) 181f1ccf5d2SLaurent Vivier endian="$arg" 182f1ccf5d2SLaurent Vivier ;; 1837d36db35SAvi Kivity --cc) 1847d36db35SAvi Kivity cc="$arg" 1857c460095SAndrew Jones cc_selected=yes 1867d36db35SAvi Kivity ;; 187441cbc0dSThomas Huth --cflags) 188441cbc0dSThomas Huth cflags="$arg" 189441cbc0dSThomas Huth ;; 1907d36db35SAvi Kivity --ld) 1917d36db35SAvi Kivity ld="$arg" 1927d36db35SAvi Kivity ;; 19356c886b0SPeter Feiner --enable-pretty-print-stacks) 19456c886b0SPeter Feiner pretty_print_stacks=yes 19556c886b0SPeter Feiner ;; 19656c886b0SPeter Feiner --disable-pretty-print-stacks) 19756c886b0SPeter Feiner pretty_print_stacks=no 19856c886b0SPeter Feiner ;; 19970fcb64bSAndrew Jones --enable-default-environ) 20070fcb64bSAndrew Jones environ_default=yes 20170fcb64bSAndrew Jones ;; 20270fcb64bSAndrew Jones --disable-default-environ) 20370fcb64bSAndrew Jones environ_default=no 20470fcb64bSAndrew Jones ;; 205b16df9eeSAndrew Jones --erratatxt) 2061a31ffabSAndrew Jones erratatxt= 2071a31ffabSAndrew Jones [ "$arg" ] && erratatxt=$(eval realpath "$arg") 208b16df9eeSAndrew Jones ;; 209238b5967SMarc Hartmayer --host-key-document) 210238b5967SMarc Hartmayer host_key_document="$arg" 211238b5967SMarc Hartmayer ;; 212dc4f7106SJanosch Frank --gen-se-header) 213dc4f7106SJanosch Frank gen_se_header="$arg" 214dc4f7106SJanosch Frank ;; 21503d0df32SNico Boehr --enable-dump) 21603d0df32SNico Boehr enable_dump=yes 21703d0df32SNico Boehr ;; 21803d0df32SNico Boehr --disable-dump) 21903d0df32SNico Boehr enable_dump=no 22003d0df32SNico Boehr ;; 221a2d06852SNikos Nikoleris --page-size) 222a2d06852SNikos Nikoleris page_size="$arg" 223a2d06852SNikos Nikoleris ;; 22405fa7e7aSAlexandru Elisei --earlycon) 22505fa7e7aSAlexandru Elisei earlycon="$arg" 22605fa7e7aSAlexandru Elisei ;; 22756a30199SAndrew Jones --console) 22856a30199SAndrew Jones console="$arg" 22956a30199SAndrew Jones ;; 230c98ce6e0SAlexandru Elisei --enable-efi) 231c98ce6e0SAlexandru Elisei efi=y 232c98ce6e0SAlexandru Elisei ;; 233c98ce6e0SAlexandru Elisei --disable-efi) 234c98ce6e0SAlexandru Elisei efi=n 235ad5fb883SZixuan Wang ;; 2365ded2989SAndrew Jones --enable-efi-direct) 2375ded2989SAndrew Jones efi_direct=y 2385ded2989SAndrew Jones ;; 2395ded2989SAndrew Jones --disable-efi-direct) 2405ded2989SAndrew Jones efi_direct=n 2415ded2989SAndrew Jones ;; 24201c070a7SThomas Huth --enable-werror) 24301c070a7SThomas Huth werror=-Werror 24401c070a7SThomas Huth ;; 24501c070a7SThomas Huth --disable-werror) 24601c070a7SThomas Huth werror= 24701c070a7SThomas Huth ;; 2487d36db35SAvi Kivity --help) 2497d36db35SAvi Kivity usage 2507d36db35SAvi Kivity ;; 2517d36db35SAvi Kivity *) 2522480430aSThomas Huth echo "Unknown option '$opt'" 2532480430aSThomas Huth echo 2547d36db35SAvi Kivity usage 2557d36db35SAvi Kivity ;; 2567d36db35SAvi Kivity esac 2577d36db35SAvi Kivitydone 25839ac3f84SAndrew Jones 2597c460095SAndrew Jonesif [ -z "$cc_selected" ] && [ "$cross_prefix" ]; then 2607c460095SAndrew Jones cc="$cross_prefix$cc" 2617c460095SAndrew Jonesfi 2627c460095SAndrew Jones 2635ded2989SAndrew Jonesif [ -z "$efi" ] || [ "$efi" = "n" ]; then 2645ded2989SAndrew Jones [ "$efi_direct" = "y" ] && efi_direct= 2655ded2989SAndrew Jonesfi 2665ded2989SAndrew Jones 2675a39cec8SJanosch Frankif [ -n "$host_key_document" ] && [ ! -f "$host_key_document" ]; then 2685a39cec8SJanosch Frank echo "Host key document doesn't exist at the specified location." 2695a39cec8SJanosch Frank exit 1 2705a39cec8SJanosch Frankfi 2715a39cec8SJanosch Frank 272b16df9eeSAndrew Jonesif [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then 273b16df9eeSAndrew Jones echo "erratatxt: $erratatxt does not exist or is not a regular file" 274b16df9eeSAndrew Jones exit 1 275b16df9eeSAndrew Jonesfi 276b16df9eeSAndrew Jones 27739ac3f84SAndrew Jonesarch_name=$arch 27839ac3f84SAndrew Jones[ "$arch" = "aarch64" ] && arch="arm64" 27939ac3f84SAndrew Jones[ "$arch_name" = "arm64" ] && arch_name="aarch64" 280c3758c09SAndrew Jonesarch_libdir=$arch 28139ac3f84SAndrew Jones 282bd744d46SAndrew Jonesif [ "$arch" = "riscv" ]; then 283bd744d46SAndrew Jones echo "riscv32 or riscv64 must be specified" 284bd744d46SAndrew Jones exit 1 285bd744d46SAndrew Jonesfi 286bd744d46SAndrew Jones 2874fcad6e9SAlexandru Eliseiif [ -z "$target" ]; then 2884fcad6e9SAlexandru Elisei target="qemu" 2894fcad6e9SAlexandru Eliseielse 2904fcad6e9SAlexandru Elisei if [ "$arch" != "arm64" ] && [ "$arch" != "arm" ]; then 2914fcad6e9SAlexandru Elisei echo "--target is not supported for $arch" 2924fcad6e9SAlexandru Elisei usage 2934fcad6e9SAlexandru Elisei fi 2944fcad6e9SAlexandru Eliseifi 2954fcad6e9SAlexandru Elisei 29668128c6fSAndrew Jonesif [ "$efi" ] && [ "$arch" != "x86_64" ] && 29768128c6fSAndrew Jones [ "$arch" != "arm64" ] && [ "$arch" != "riscv64" ]; then 298c98ce6e0SAlexandru Elisei echo "--[enable|disable]-efi is not supported for $arch" 299d856a675SAlexandru Elisei usage 300d856a675SAlexandru Eliseifi 301d856a675SAlexandru Elisei 3022e0bdc24SAndrew Jonesif [ "$efi" ] && [ "$arch" = "riscv64" ] && [ -z "$efi_direct" ]; then 3032e0bdc24SAndrew Jones efi_direct=y 3042e0bdc24SAndrew Jonesfi 3052e0bdc24SAndrew Jones 306a2d06852SNikos Nikolerisif [ -z "$page_size" ]; then 3073b3f9a3eSOliver Upton if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 3081f233aa9SNikos Nikoleris page_size="4096" 309d4c8e725SNicholas Piggin elif [ "$arch" = "ppc64" ]; then 310d4c8e725SNicholas Piggin page_size="65536" 3111f233aa9SNikos Nikoleris fi 312a2d06852SNikos Nikoleriselse 313a2d06852SNikos Nikoleris if [ "${page_size: -1}" = "K" ] || [ "${page_size: -1}" = "k" ]; then 314a2d06852SNikos Nikoleris page_size=$(( ${page_size%?} * 1024 )) 315a2d06852SNikos Nikoleris fi 316d4c8e725SNicholas Piggin 317d4c8e725SNicholas Piggin if [ "$arch" = "arm64" ]; then 318a2d06852SNikos Nikoleris if [ "$page_size" != "4096" ] && [ "$page_size" != "16384" ] && 319a2d06852SNikos Nikoleris [ "$page_size" != "65536" ]; then 320a2d06852SNikos Nikoleris echo "arm64 doesn't support page size of $page_size" 321a2d06852SNikos Nikoleris usage 322a2d06852SNikos Nikoleris fi 3231f233aa9SNikos Nikoleris if [ "$efi" = 'y' ] && [ "$page_size" != "4096" ]; then 3241f233aa9SNikos Nikoleris echo "efi must use 4K pages" 3251f233aa9SNikos Nikoleris exit 1 3261f233aa9SNikos Nikoleris fi 327d4c8e725SNicholas Piggin elif [ "$arch" = "ppc64" ]; then 328d4c8e725SNicholas Piggin if [ "$page_size" != "4096" ] && [ "$page_size" != "65536" ]; then 329d4c8e725SNicholas Piggin echo "ppc64 doesn't support page size of $page_size" 330d4c8e725SNicholas Piggin usage 331d4c8e725SNicholas Piggin fi 332d4c8e725SNicholas Piggin else 333d4c8e725SNicholas Piggin echo "--page-size is not supported for $arch" 334d4c8e725SNicholas Piggin usage 335d4c8e725SNicholas Piggin fi 336a2d06852SNikos Nikolerisfi 337a2d06852SNikos Nikoleris 33805fa7e7aSAlexandru Eliseiif [ "$earlycon" ]; then 33905fa7e7aSAlexandru Elisei IFS=, read -r name type_addr addr <<<"$earlycon" 3406bfcc82cSAndrew Jones if [ "$name" != "uart" ] && [ "$name" != "uart8250" ] && [ "$name" != "pl011" ]; then 34105fa7e7aSAlexandru Elisei echo "unknown earlycon name: $name" 34205fa7e7aSAlexandru Elisei usage 34305fa7e7aSAlexandru Elisei fi 34405fa7e7aSAlexandru Elisei 34505fa7e7aSAlexandru Elisei if [ "$name" = "pl011" ]; then 34605fa7e7aSAlexandru Elisei if [ -z "$addr" ]; then 34705fa7e7aSAlexandru Elisei addr=$type_addr 34805fa7e7aSAlexandru Elisei else 34905fa7e7aSAlexandru Elisei if [ "$type_addr" != "mmio32" ]; then 35005fa7e7aSAlexandru Elisei echo "unknown $name earlycon type: $type_addr" 35105fa7e7aSAlexandru Elisei usage 35205fa7e7aSAlexandru Elisei fi 35305fa7e7aSAlexandru Elisei fi 35405fa7e7aSAlexandru Elisei else 35505fa7e7aSAlexandru Elisei if [ "$type_addr" != "mmio" ]; then 35605fa7e7aSAlexandru Elisei echo "unknown $name earlycon type: $type_addr" 35705fa7e7aSAlexandru Elisei usage 35805fa7e7aSAlexandru Elisei fi 35905fa7e7aSAlexandru Elisei fi 36005fa7e7aSAlexandru Elisei 36105fa7e7aSAlexandru Elisei if [ -z "$addr" ]; then 36205fa7e7aSAlexandru Elisei echo "missing $name earlycon address" 36305fa7e7aSAlexandru Elisei usage 36405fa7e7aSAlexandru Elisei fi 3656bfcc82cSAndrew Jones if [[ $addr =~ ^0(x|X)[0-9a-fA-F]+$ ]] || [[ $addr =~ ^[0-9]+$ ]]; then 3666bfcc82cSAndrew Jones uart_early_addr=$addr 36705fa7e7aSAlexandru Elisei else 36805fa7e7aSAlexandru Elisei echo "invalid $name earlycon address: $addr" 36905fa7e7aSAlexandru Elisei usage 37005fa7e7aSAlexandru Elisei fi 37105fa7e7aSAlexandru Eliseifi 3726bfcc82cSAndrew Jones 37366c0dc59SAlexandru Elisei# $arch will have changed when cross-compiling. 37466c0dc59SAlexandru Elisei[ -z "$processor" ] && processor=$(get_default_processor $arch) 3756bfcc82cSAndrew Jones 3766bfcc82cSAndrew Jonesif [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 3776bfcc82cSAndrew Jones testdir=x86 3786bfcc82cSAndrew Joneselif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 3796bfcc82cSAndrew Jones testdir=arm 3806bfcc82cSAndrew Jones if [ "$target" = "qemu" ]; then 3816bfcc82cSAndrew Jones : "${uart_early_addr:=0x9000000}" 3826bfcc82cSAndrew Jones elif [ "$target" = "kvmtool" ]; then 3836bfcc82cSAndrew Jones : "${uart_early_addr:=0x1000000}" 3846bfcc82cSAndrew Jones errata_force=1 3856bfcc82cSAndrew Jones else 3866bfcc82cSAndrew Jones echo "--target must be one of 'qemu' or 'kvmtool'!" 3876bfcc82cSAndrew Jones usage 3886bfcc82cSAndrew Jones fi 3891e95c7ccSAndrew Joneselif [ "$arch" = "ppc64" ]; then 3901e95c7ccSAndrew Jones testdir=powerpc 3913f8d4194SAndrew Jones firmware="$testdir/boot_rom.bin" 392f1ccf5d2SLaurent Vivier if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then 393f1ccf5d2SLaurent Vivier echo "You must provide endianness (big or little)!" 394f1ccf5d2SLaurent Vivier usage 395f1ccf5d2SLaurent Vivier fi 396bd744d46SAndrew Joneselif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then 397bd744d46SAndrew Jones testdir=riscv 398bd744d46SAndrew Jones arch_libdir=riscv 3996bfcc82cSAndrew Jones : "${uart_early_addr:=0x10000000}" 40055dd01b4SNicholas Pigginelif [ "$arch" = "s390x" ]; then 40155dd01b4SNicholas Piggin testdir=s390x 402761db0bdSAndrew Joneselse 40355dd01b4SNicholas Piggin echo "arch $arch is not supported!" 40455dd01b4SNicholas Piggin arch= 40555dd01b4SNicholas Piggin usage 406761db0bdSAndrew Jonesfi 407e303c665SAlex Bennéeif [ ! -d "$srcdir/$testdir" ]; then 40855dd01b4SNicholas Piggin echo "$srcdir/$testdir does not exist!" 409761db0bdSAndrew Jones exit 1 410761db0bdSAndrew Jonesfi 411fe1efa50SAndrew Jones 412fe1efa50SAndrew Jonesif [ "$efi" = "y" ] && [ -f "$srcdir/$testdir/efi/run" ]; then 413fe1efa50SAndrew Jones ln -fs "$srcdir/$testdir/efi/run" $testdir-run 414fe1efa50SAndrew Joneselif [ -f "$srcdir/$testdir/run" ]; then 415e303c665SAlex Bennée ln -fs "$srcdir/$testdir/run" $testdir-run 416761db0bdSAndrew Jonesfi 4177d36db35SAvi Kivity 418ad5fb883SZixuan Wangtestsubdir=$testdir 419c98ce6e0SAlexandru Eliseiif [ "$efi" = "y" ]; then 420ad5fb883SZixuan Wang testsubdir=$testdir/efi 421ad5fb883SZixuan Wangfi 422ad5fb883SZixuan Wang 423529046c3SAlex Bennée# check if uint32_t needs a long format modifier 42444f64120SAndrew Jonescat << EOF > lib-test.c 42544f64120SAndrew Jones__UINT32_TYPE__ 426529046c3SAlex BennéeEOF 4277c460095SAndrew Jonesu32_long=$("$cc" $cflags -E lib-test.c | grep -v '^#' | grep -q long && echo yes) 42844f64120SAndrew Jonesrm -f lib-test.c 429529046c3SAlex Bennée 430450124ccSRoman Bolshakov# check if slash can be used for division 431450124ccSRoman Bolshakovif [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 432450124ccSRoman Bolshakov cat << EOF > lib-test.S 433450124ccSRoman Bolshakovfoo: 434450124ccSRoman Bolshakov movl (8 / 2), %eax 435450124ccSRoman BolshakovEOF 4367c460095SAndrew Jones wa_divide=$("$cc" $cflags -c lib-test.S >/dev/null 2>&1 || echo yes) 437450124ccSRoman Bolshakov rm -f lib-test.{o,S} 438450124ccSRoman Bolshakovfi 439450124ccSRoman Bolshakov 440974f94d3SDan Cross# warn if enhanced getopt is unavailable 44183760814SPaolo Bonzinigetopt -T > /dev/null 44283760814SPaolo Bonziniif [ $? -ne 4 ]; then 443974f94d3SDan Cross echo "Without enhanced getopt you won't be able to use run_tests.sh." 444974f94d3SDan Cross echo "Add it to your PATH?" 44583760814SPaolo Bonzinifi 44683760814SPaolo Bonzini 447e303c665SAlex Bennée# Are we in a separate build tree? If so, link the Makefile 448e303c665SAlex Bennée# and shared stuff so that 'make' and run_tests.sh work. 449e303c665SAlex Bennéeif test ! -e Makefile; then 450e303c665SAlex Bennée echo "linking Makefile..." 451e303c665SAlex Bennée ln -s "$srcdir/Makefile" . 452e303c665SAlex Bennée 453e303c665SAlex Bennée echo "linking tests..." 454ad5fb883SZixuan Wang mkdir -p $testsubdir 455e303c665SAlex Bennée ln -sf "$srcdir/$testdir/run" $testdir/ 456ad5fb883SZixuan Wang if test "$testdir" != "$testsubdir"; then 457ad5fb883SZixuan Wang ln -sf "$srcdir/$testsubdir/run" $testsubdir/ 458ad5fb883SZixuan Wang fi 459e303c665SAlex Bennée ln -sf "$srcdir/$testdir/unittests.cfg" $testdir/ 460e303c665SAlex Bennée ln -sf "$srcdir/run_tests.sh" 461e303c665SAlex Bennée 4621a84232eSThomas Huth if [ -d "$srcdir/$testdir/snippets" ]; then 4631a84232eSThomas Huth mkdir -p "$testdir/snippets/c" 4641a84232eSThomas Huth fi 4651a84232eSThomas Huth 466e303c665SAlex Bennée echo "linking scripts..." 467e303c665SAlex Bennée ln -sf "$srcdir/scripts" 468e303c665SAlex Bennéefi 469e303c665SAlex Bennée 4703df0ccccSAndrew Jones# link lib/asm for the architecture 4713df0ccccSAndrew Jonesrm -f lib/asm 472d76bf076SAndrew Jonesasm="asm-generic" 473e303c665SAlex Bennéeif [ -d "$srcdir/lib/$arch/asm" ]; then 474e303c665SAlex Bennée asm="$srcdir/lib/$arch/asm" 47548dd20d7SAndrew Jones mkdir -p "lib/$arch" 47648dd20d7SAndrew Joneselif [ -d "$srcdir/lib/$arch_libdir/asm" ]; then 47748dd20d7SAndrew Jones asm="$srcdir/lib/$arch_libdir/asm" 47848dd20d7SAndrew Jones mkdir -p "lib/$arch_libdir" 479e303c665SAlex Bennéeelif [ -d "$srcdir/lib/$testdir/asm" ]; then 480e303c665SAlex Bennée asm="$srcdir/lib/$testdir/asm" 48148dd20d7SAndrew Jones mkdir -p "lib/$testdir" 4823df0ccccSAndrew Jonesfi 483e303c665SAlex Bennéeln -sf "$asm" lib/asm 48448dd20d7SAndrew Jonesmkdir -p lib/generated lib/libfdt 4853df0ccccSAndrew Jones 4863df0ccccSAndrew Jones# create the config 4877d36db35SAvi Kivitycat <<EOF > config.mak 4883df129a6SNicholas Piggin# Shellcheck does not see these are used 4893df129a6SNicholas Piggin# shellcheck disable=SC2034 490eed19302SNicholas Piggin# Shellcheck can give pointless quoting warnings for some commands 491eed19302SNicholas Piggin# shellcheck disable=SC2209 492e303c665SAlex BennéeSRCDIR=$srcdir 4937d36db35SAvi KivityPREFIX=$prefix 494c4306560SAlex BennéeHOST=$host 4957d36db35SAvi KivityARCH=$arch 49639ac3f84SAndrew JonesARCH_NAME=$arch_name 497c3758c09SAndrew JonesARCH_LIBDIR=$arch_libdir 4987d36db35SAvi KivityPROCESSOR=$processor 499*5f77b72dSJean-Philippe BruckerTARGET_CPU=$target_cpu 500*5f77b72dSJean-Philippe BruckerDEFAULT_QEMU_CPU=$(get_default_qemu_cpu $arch) 5017c460095SAndrew JonesCC=$cc 502441cbc0dSThomas HuthCFLAGS=$cflags 5037d36db35SAvi KivityLD=$cross_prefix$ld 5047d36db35SAvi KivityOBJCOPY=$cross_prefix$objcopy 505de9d141bSAndrew JonesOBJDUMP=$cross_prefix$objdump 506445e5aeeSBill WendlingREADELF=$cross_prefix$readelf 5077d36db35SAvi KivityAR=$cross_prefix$ar 508e593c4fdSAndrew JonesADDR2LINE=$cross_prefix$addr2line 509761db0bdSAndrew JonesTEST_DIR=$testdir 510ad5fb883SZixuan WangTEST_SUBDIR=$testsubdir 5113f8d4194SAndrew JonesFIRMWARE=$firmware 512f1ccf5d2SLaurent VivierENDIAN=$endian 51356c886b0SPeter FeinerPRETTY_PRINT_STACKS=$pretty_print_stacks 51470fcb64bSAndrew JonesENVIRON_DEFAULT=$environ_default 515b16df9eeSAndrew JonesERRATATXT=$erratatxt 516529046c3SAlex BennéeU32_LONG_FMT=$u32_long 517450124ccSRoman BolshakovWA_DIVIDE=$wa_divide 518238b5967SMarc HartmayerGENPROTIMG=${GENPROTIMG-genprotimg} 519238b5967SMarc HartmayerHOST_KEY_DOCUMENT=$host_key_document 52003d0df32SNico BoehrCONFIG_DUMP=$enable_dump 521c98ce6e0SAlexandru EliseiCONFIG_EFI=$efi 5225ded2989SAndrew JonesEFI_DIRECT=$efi_direct 52301c070a7SThomas HuthCONFIG_WERROR=$werror 524dc4f7106SJanosch FrankGEN_SE_HEADER=$gen_se_header 5257d36db35SAvi KivityEOF 5264fcad6e9SAlexandru Eliseiif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 5274fcad6e9SAlexandru Elisei echo "TARGET=$target" >> config.mak 5284fcad6e9SAlexandru Eliseifi 5299431507cSAlexandru Elisei 5309431507cSAlexandru Eliseicat <<EOF > lib/config.h 53180e8b3d8SCornelia Huck#ifndef _CONFIG_H_ 53280e8b3d8SCornelia Huck#define _CONFIG_H_ 5339431507cSAlexandru Elisei/* 5349431507cSAlexandru Elisei * Generated file. DO NOT MODIFY. 5359431507cSAlexandru Elisei * 5369431507cSAlexandru Elisei */ 537725134dbSAlexandru Elisei 5389431507cSAlexandru EliseiEOF 5399431507cSAlexandru Eliseiif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 5409431507cSAlexandru Eliseicat <<EOF >> lib/config.h 5419431507cSAlexandru Elisei 5426bfcc82cSAndrew Jones#define CONFIG_UART_EARLY_BASE ${uart_early_addr} 54335145f14SAndrew Jones#define CONFIG_ERRATA_FORCE ${errata_force} 544d4c8e725SNicholas Piggin 545d4c8e725SNicholas PigginEOF 546d4c8e725SNicholas Pigginfi 547d4c8e725SNicholas Piggin 548d4c8e725SNicholas Pigginif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ] || [ "$arch" = "ppc64" ]; then 549d4c8e725SNicholas Piggincat <<EOF >> lib/config.h 550d4c8e725SNicholas Piggin 551a2d06852SNikos Nikoleris#define CONFIG_PAGE_SIZE _AC(${page_size}, UL) 5529431507cSAlexandru Elisei 5539431507cSAlexandru EliseiEOF 554bd744d46SAndrew Joneselif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then 55556a30199SAndrew Jones echo "#define CONFIG_UART_EARLY_BASE ${uart_early_addr}" >> lib/config.h 55656a30199SAndrew Jones [ "$console" = "sbi" ] && echo "#define CONFIG_SBI_CONSOLE" >> lib/config.h 55756a30199SAndrew Jones echo >> lib/config.h 5589431507cSAlexandru Eliseifi 5599431507cSAlexandru Eliseiecho "#endif" >> lib/config.h 560