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 265f77b72dSJean-Philippe Brucker# Return the default CPU type to run on 275f77b72dSJean-Philippe Bruckerfunction get_default_qemu_cpu() 285f77b72dSJean-Philippe Brucker{ 295f77b72dSJean-Philippe Brucker local arch="$1" 305f77b72dSJean-Philippe Brucker 315f77b72dSJean-Philippe Brucker case "$arch" in 325f77b72dSJean-Philippe Brucker "arm") 335f77b72dSJean-Philippe Brucker echo "cortex-a15" 345f77b72dSJean-Philippe Brucker ;; 35*99d02e0cSJean-Philippe Brucker "arm64" | "riscv32" | "riscv64") 365f77b72dSJean-Philippe Brucker echo "max" 375f77b72dSJean-Philippe Brucker ;; 385f77b72dSJean-Philippe Brucker esac 395f77b72dSJean-Philippe Brucker} 405f77b72dSJean-Philippe Brucker 41e303c665SAlex Bennéesrcdir=$(cd "$(dirname "$0")"; pwd) 427d36db35SAvi Kivityprefix=/usr/local 437d36db35SAvi Kivitycc=gcc 44441cbc0dSThomas Huthcflags= 457d36db35SAvi Kivityld=ld 467d36db35SAvi Kivityobjcopy=objcopy 47de9d141bSAndrew Jonesobjdump=objdump 48445e5aeeSBill Wendlingreadelf=readelf 497d36db35SAvi Kivityar=ar 50e593c4fdSAndrew Jonesaddr2line=addr2line 51c157b6e2SNikos Nikolerisarch=$(uname -m | sed -e 's/i.86/i386/;s/arm64/aarch64/;s/arm.*/arm/;s/ppc64.*/ppc64/') 52c4306560SAlex Bennéehost=$arch 537d36db35SAvi Kivitycross_prefix= 54f1ccf5d2SLaurent Vivierendian="" 5556c886b0SPeter Feinerpretty_print_stacks=yes 5670fcb64bSAndrew Jonesenviron_default=yes 5744f64120SAndrew Jonesu32_long= 58450124ccSRoman Bolshakovwa_divide= 594fcad6e9SAlexandru Eliseitarget= 6035145f14SAndrew Joneserrata_force=0 611a31ffabSAndrew Joneserratatxt="$srcdir/errata.txt" 62238b5967SMarc Hartmayerhost_key_document= 63dc4f7106SJanosch Frankgen_se_header= 6403d0df32SNico Boehrenable_dump=no 65a2d06852SNikos Nikolerispage_size= 6605fa7e7aSAlexandru Eliseiearlycon= 6756a30199SAndrew Jonesconsole= 68c98ce6e0SAlexandru Eliseiefi= 695ded2989SAndrew Jonesefi_direct= 705f77b72dSJean-Philippe Bruckertarget_cpu= 717d36db35SAvi Kivity 7201c070a7SThomas Huth# Enable -Werror by default for git repositories only (i.e. developer builds) 7301c070a7SThomas Huthif [ -e "$srcdir"/.git ]; then 7401c070a7SThomas Huth werror=-Werror 7501c070a7SThomas Huthelse 7601c070a7SThomas Huth werror= 7701c070a7SThomas Huthfi 7801c070a7SThomas Huth 797d36db35SAvi Kivityusage() { 801528714dSAlexandru Elisei [ "$arch" = "aarch64" ] && arch="arm64" 8166c0dc59SAlexandru Elisei [ -z "$processor" ] && processor=$(get_default_processor $arch) 827d36db35SAvi Kivity cat <<-EOF 837d36db35SAvi Kivity Usage: $0 [options] 847d36db35SAvi Kivity 857d36db35SAvi Kivity Options include: 8655dd01b4SNicholas Piggin --arch=ARCH architecture to compile for ($arch). ARCH can be one of: 8755dd01b4SNicholas Piggin arm, arm64, i386, ppc64, riscv32, riscv64, s390x, x86_64 8866c0dc59SAlexandru Elisei --processor=PROCESSOR processor to compile for ($processor) 895f77b72dSJean-Philippe Brucker --target-cpu=CPU the CPU model to run on. If left unset, the run script 905f77b72dSJean-Philippe Brucker selects the best value based on the host system and the 915f77b72dSJean-Philippe Brucker test configuration. 924fcad6e9SAlexandru Elisei --target=TARGET target platform that the tests will be running on (qemu or 934fcad6e9SAlexandru Elisei kvmtool, default is qemu) (arm/arm64 only) 947d36db35SAvi Kivity --cross-prefix=PREFIX cross compiler prefix 957d36db35SAvi Kivity --cc=CC c compiler to use ($cc) 96441cbc0dSThomas Huth --cflags=FLAGS extra options to be passed to the c compiler 977d36db35SAvi Kivity --ld=LD ld linker to use ($ld) 987d36db35SAvi Kivity --prefix=PREFIX where to install things ($prefix) 99f1ccf5d2SLaurent Vivier --endian=ENDIAN endianness to compile for (little or big, ppc64 only) 10056c886b0SPeter Feiner --[enable|disable]-pretty-print-stacks 10156c886b0SPeter Feiner enable or disable pretty stack printing (enabled by default) 10270fcb64bSAndrew Jones --[enable|disable]-default-environ 10370fcb64bSAndrew Jones enable or disable the generation of a default environ when 10470fcb64bSAndrew Jones no environ is provided by the user (enabled by default) 105b16df9eeSAndrew Jones --erratatxt=FILE specify a file to use instead of errata.txt. Use 106b16df9eeSAndrew Jones '--erratatxt=' to ensure no file is used. 107238b5967SMarc Hartmayer --host-key-document=HOST_KEY_DOCUMENT 108238b5967SMarc Hartmayer Specify the machine-specific host-key document for creating 109238b5967SMarc Hartmayer a PVM image with 'genprotimg' (s390x only) 110dc4f7106SJanosch Frank --gen-se-header=GEN_SE_HEADER 111dc4f7106SJanosch Frank Provide an executable to generate a PV header 112dc4f7106SJanosch Frank requires --host-key-document. (s390x-snippets only) 11303d0df32SNico Boehr --[enable|disable]-dump 11403d0df32SNico Boehr Allow PV guests to be dumped. Requires at least z16. 11503d0df32SNico Boehr (s390x only) 116a2d06852SNikos Nikoleris --page-size=PAGE_SIZE 117d4c8e725SNicholas Piggin Specify the page size (translation granule). PAGE_SIZE can be 118d4c8e725SNicholas Piggin 4k [default], 16k, 64k for arm64. 119d4c8e725SNicholas Piggin 4k [default], 64k for ppc64. 12005fa7e7aSAlexandru Elisei --earlycon=EARLYCON 12156a30199SAndrew Jones Specify the UART name, type and address used for the earlycon (optional). 1226bfcc82cSAndrew Jones The specified address will overwrite the UART address set by 1236bfcc82cSAndrew Jones the --target option. EARLYCON can be one of (case sensitive): 12405fa7e7aSAlexandru Elisei uart[8250],mmio,ADDR 12505fa7e7aSAlexandru Elisei Specify an 8250 compatible UART at address ADDR. Supported 12605fa7e7aSAlexandru Elisei register stride is 8 bit only. 12705fa7e7aSAlexandru Elisei pl011,ADDR 12805fa7e7aSAlexandru Elisei pl011,mmio32,ADDR 12905fa7e7aSAlexandru Elisei Specify a PL011 compatible UART at address ADDR. Supported 13005fa7e7aSAlexandru Elisei register stride is 32 bit only. 1316bfcc82cSAndrew Jones (arm/arm64 and riscv32/riscv64 only) 13256a30199SAndrew Jones --console=CONSOLE 13356a30199SAndrew Jones Specify the device used for output (optional). 13456a30199SAndrew Jones sbi Use SBI DBCN (riscv only) 1351f233aa9SNikos Nikoleris --[enable|disable]-efi Boot and run from UEFI (disabled by default, x86_64 and arm64 only) 13601c070a7SThomas Huth --[enable|disable]-werror 13701c070a7SThomas Huth Select whether to compile with the -Werror compiler flag 1385ded2989SAndrew Jones --[enable|disable]-efi-direct 1395ded2989SAndrew Jones Select whether to run EFI tests directly with QEMU's -kernel 1405ded2989SAndrew Jones option. When not enabled, tests will be placed in an EFI file 1412e0bdc24SAndrew Jones system and run from the UEFI shell. Ignored when efi isn't enabled 1422e0bdc24SAndrew Jones and defaults to enabled when efi is enabled for riscv64. 143a755990cSAndrew Jones (arm64 and riscv64 only) 1447d36db35SAvi KivityEOF 1457d36db35SAvi Kivity exit 1 1467d36db35SAvi Kivity} 1477d36db35SAvi Kivity 148f246b160SNico Boehroptno=1 149f246b160SNico Boehrargc=$# 150f246b160SNico Boehrwhile [[ $optno -le $argc ]]; do 1517d36db35SAvi Kivity opt="$1"; shift 152f246b160SNico Boehr optno=$(( $optno + 1 )) 1537d36db35SAvi Kivity arg= 1547d36db35SAvi Kivity if [[ "$opt" = *=* ]]; then 1557d36db35SAvi Kivity arg="${opt#*=}" 1567d36db35SAvi Kivity opt="${opt%%=*}" 1577d36db35SAvi Kivity fi 1587d36db35SAvi Kivity case "$opt" in 1597d36db35SAvi Kivity --prefix) 1607d36db35SAvi Kivity prefix="$arg" 1617d36db35SAvi Kivity ;; 1627d36db35SAvi Kivity --arch) 1637d36db35SAvi Kivity arch="$arg" 1647d36db35SAvi Kivity ;; 1657d36db35SAvi Kivity --processor) 1667d36db35SAvi Kivity processor="$arg" 1677d36db35SAvi Kivity ;; 1685f77b72dSJean-Philippe Brucker --target-cpu) 1695f77b72dSJean-Philippe Brucker target_cpu="$arg" 1705f77b72dSJean-Philippe Brucker ;; 1714fcad6e9SAlexandru Elisei --target) 1724fcad6e9SAlexandru Elisei target="$arg" 173931a236aSAlexandru Elisei ;; 1747d36db35SAvi Kivity --cross-prefix) 1757d36db35SAvi Kivity cross_prefix="$arg" 1767d36db35SAvi Kivity ;; 177f1ccf5d2SLaurent Vivier --endian) 178f1ccf5d2SLaurent Vivier endian="$arg" 179f1ccf5d2SLaurent Vivier ;; 1807d36db35SAvi Kivity --cc) 1817d36db35SAvi Kivity cc="$arg" 1827c460095SAndrew Jones cc_selected=yes 1837d36db35SAvi Kivity ;; 184441cbc0dSThomas Huth --cflags) 185441cbc0dSThomas Huth cflags="$arg" 186441cbc0dSThomas Huth ;; 1877d36db35SAvi Kivity --ld) 1887d36db35SAvi Kivity ld="$arg" 1897d36db35SAvi Kivity ;; 19056c886b0SPeter Feiner --enable-pretty-print-stacks) 19156c886b0SPeter Feiner pretty_print_stacks=yes 19256c886b0SPeter Feiner ;; 19356c886b0SPeter Feiner --disable-pretty-print-stacks) 19456c886b0SPeter Feiner pretty_print_stacks=no 19556c886b0SPeter Feiner ;; 19670fcb64bSAndrew Jones --enable-default-environ) 19770fcb64bSAndrew Jones environ_default=yes 19870fcb64bSAndrew Jones ;; 19970fcb64bSAndrew Jones --disable-default-environ) 20070fcb64bSAndrew Jones environ_default=no 20170fcb64bSAndrew Jones ;; 202b16df9eeSAndrew Jones --erratatxt) 2031a31ffabSAndrew Jones erratatxt= 2041a31ffabSAndrew Jones [ "$arg" ] && erratatxt=$(eval realpath "$arg") 205b16df9eeSAndrew Jones ;; 206238b5967SMarc Hartmayer --host-key-document) 207238b5967SMarc Hartmayer host_key_document="$arg" 208238b5967SMarc Hartmayer ;; 209dc4f7106SJanosch Frank --gen-se-header) 210dc4f7106SJanosch Frank gen_se_header="$arg" 211dc4f7106SJanosch Frank ;; 21203d0df32SNico Boehr --enable-dump) 21303d0df32SNico Boehr enable_dump=yes 21403d0df32SNico Boehr ;; 21503d0df32SNico Boehr --disable-dump) 21603d0df32SNico Boehr enable_dump=no 21703d0df32SNico Boehr ;; 218a2d06852SNikos Nikoleris --page-size) 219a2d06852SNikos Nikoleris page_size="$arg" 220a2d06852SNikos Nikoleris ;; 22105fa7e7aSAlexandru Elisei --earlycon) 22205fa7e7aSAlexandru Elisei earlycon="$arg" 22305fa7e7aSAlexandru Elisei ;; 22456a30199SAndrew Jones --console) 22556a30199SAndrew Jones console="$arg" 22656a30199SAndrew Jones ;; 227c98ce6e0SAlexandru Elisei --enable-efi) 228c98ce6e0SAlexandru Elisei efi=y 229c98ce6e0SAlexandru Elisei ;; 230c98ce6e0SAlexandru Elisei --disable-efi) 231c98ce6e0SAlexandru Elisei efi=n 232ad5fb883SZixuan Wang ;; 2335ded2989SAndrew Jones --enable-efi-direct) 2345ded2989SAndrew Jones efi_direct=y 2355ded2989SAndrew Jones ;; 2365ded2989SAndrew Jones --disable-efi-direct) 2375ded2989SAndrew Jones efi_direct=n 2385ded2989SAndrew Jones ;; 23901c070a7SThomas Huth --enable-werror) 24001c070a7SThomas Huth werror=-Werror 24101c070a7SThomas Huth ;; 24201c070a7SThomas Huth --disable-werror) 24301c070a7SThomas Huth werror= 24401c070a7SThomas Huth ;; 2457d36db35SAvi Kivity --help) 2467d36db35SAvi Kivity usage 2477d36db35SAvi Kivity ;; 2487d36db35SAvi Kivity *) 2492480430aSThomas Huth echo "Unknown option '$opt'" 2502480430aSThomas Huth echo 2517d36db35SAvi Kivity usage 2527d36db35SAvi Kivity ;; 2537d36db35SAvi Kivity esac 2547d36db35SAvi Kivitydone 25539ac3f84SAndrew Jones 2567c460095SAndrew Jonesif [ -z "$cc_selected" ] && [ "$cross_prefix" ]; then 2577c460095SAndrew Jones cc="$cross_prefix$cc" 2587c460095SAndrew Jonesfi 2597c460095SAndrew Jones 2605ded2989SAndrew Jonesif [ -z "$efi" ] || [ "$efi" = "n" ]; then 2615ded2989SAndrew Jones [ "$efi_direct" = "y" ] && efi_direct= 2625ded2989SAndrew Jonesfi 2635ded2989SAndrew Jones 2645a39cec8SJanosch Frankif [ -n "$host_key_document" ] && [ ! -f "$host_key_document" ]; then 2655a39cec8SJanosch Frank echo "Host key document doesn't exist at the specified location." 2665a39cec8SJanosch Frank exit 1 2675a39cec8SJanosch Frankfi 2685a39cec8SJanosch Frank 269b16df9eeSAndrew Jonesif [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then 270b16df9eeSAndrew Jones echo "erratatxt: $erratatxt does not exist or is not a regular file" 271b16df9eeSAndrew Jones exit 1 272b16df9eeSAndrew Jonesfi 273b16df9eeSAndrew Jones 27439ac3f84SAndrew Jonesarch_name=$arch 27539ac3f84SAndrew Jones[ "$arch" = "aarch64" ] && arch="arm64" 27639ac3f84SAndrew Jones[ "$arch_name" = "arm64" ] && arch_name="aarch64" 277c3758c09SAndrew Jonesarch_libdir=$arch 27839ac3f84SAndrew Jones 279bd744d46SAndrew Jonesif [ "$arch" = "riscv" ]; then 280bd744d46SAndrew Jones echo "riscv32 or riscv64 must be specified" 281bd744d46SAndrew Jones exit 1 282bd744d46SAndrew Jonesfi 283bd744d46SAndrew Jones 2844fcad6e9SAlexandru Eliseiif [ -z "$target" ]; then 2854fcad6e9SAlexandru Elisei target="qemu" 2864fcad6e9SAlexandru Eliseielse 2874fcad6e9SAlexandru Elisei if [ "$arch" != "arm64" ] && [ "$arch" != "arm" ]; then 2884fcad6e9SAlexandru Elisei echo "--target is not supported for $arch" 2894fcad6e9SAlexandru Elisei usage 2904fcad6e9SAlexandru Elisei fi 2914fcad6e9SAlexandru Eliseifi 2924fcad6e9SAlexandru Elisei 29368128c6fSAndrew Jonesif [ "$efi" ] && [ "$arch" != "x86_64" ] && 29468128c6fSAndrew Jones [ "$arch" != "arm64" ] && [ "$arch" != "riscv64" ]; then 295c98ce6e0SAlexandru Elisei echo "--[enable|disable]-efi is not supported for $arch" 296d856a675SAlexandru Elisei usage 297d856a675SAlexandru Eliseifi 298d856a675SAlexandru Elisei 2992e0bdc24SAndrew Jonesif [ "$efi" ] && [ "$arch" = "riscv64" ] && [ -z "$efi_direct" ]; then 3002e0bdc24SAndrew Jones efi_direct=y 3012e0bdc24SAndrew Jonesfi 3022e0bdc24SAndrew Jones 303a2d06852SNikos Nikolerisif [ -z "$page_size" ]; then 3043b3f9a3eSOliver Upton if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 3051f233aa9SNikos Nikoleris page_size="4096" 306d4c8e725SNicholas Piggin elif [ "$arch" = "ppc64" ]; then 307d4c8e725SNicholas Piggin page_size="65536" 3081f233aa9SNikos Nikoleris fi 309a2d06852SNikos Nikoleriselse 310a2d06852SNikos Nikoleris if [ "${page_size: -1}" = "K" ] || [ "${page_size: -1}" = "k" ]; then 311a2d06852SNikos Nikoleris page_size=$(( ${page_size%?} * 1024 )) 312a2d06852SNikos Nikoleris fi 313d4c8e725SNicholas Piggin 314d4c8e725SNicholas Piggin if [ "$arch" = "arm64" ]; then 315a2d06852SNikos Nikoleris if [ "$page_size" != "4096" ] && [ "$page_size" != "16384" ] && 316a2d06852SNikos Nikoleris [ "$page_size" != "65536" ]; then 317a2d06852SNikos Nikoleris echo "arm64 doesn't support page size of $page_size" 318a2d06852SNikos Nikoleris usage 319a2d06852SNikos Nikoleris fi 3201f233aa9SNikos Nikoleris if [ "$efi" = 'y' ] && [ "$page_size" != "4096" ]; then 3211f233aa9SNikos Nikoleris echo "efi must use 4K pages" 3221f233aa9SNikos Nikoleris exit 1 3231f233aa9SNikos Nikoleris fi 324d4c8e725SNicholas Piggin elif [ "$arch" = "ppc64" ]; then 325d4c8e725SNicholas Piggin if [ "$page_size" != "4096" ] && [ "$page_size" != "65536" ]; then 326d4c8e725SNicholas Piggin echo "ppc64 doesn't support page size of $page_size" 327d4c8e725SNicholas Piggin usage 328d4c8e725SNicholas Piggin fi 329d4c8e725SNicholas Piggin else 330d4c8e725SNicholas Piggin echo "--page-size is not supported for $arch" 331d4c8e725SNicholas Piggin usage 332d4c8e725SNicholas Piggin fi 333a2d06852SNikos Nikolerisfi 334a2d06852SNikos Nikoleris 33505fa7e7aSAlexandru Eliseiif [ "$earlycon" ]; then 33605fa7e7aSAlexandru Elisei IFS=, read -r name type_addr addr <<<"$earlycon" 3376bfcc82cSAndrew Jones if [ "$name" != "uart" ] && [ "$name" != "uart8250" ] && [ "$name" != "pl011" ]; then 33805fa7e7aSAlexandru Elisei echo "unknown earlycon name: $name" 33905fa7e7aSAlexandru Elisei usage 34005fa7e7aSAlexandru Elisei fi 34105fa7e7aSAlexandru Elisei 34205fa7e7aSAlexandru Elisei if [ "$name" = "pl011" ]; then 34305fa7e7aSAlexandru Elisei if [ -z "$addr" ]; then 34405fa7e7aSAlexandru Elisei addr=$type_addr 34505fa7e7aSAlexandru Elisei else 34605fa7e7aSAlexandru Elisei if [ "$type_addr" != "mmio32" ]; then 34705fa7e7aSAlexandru Elisei echo "unknown $name earlycon type: $type_addr" 34805fa7e7aSAlexandru Elisei usage 34905fa7e7aSAlexandru Elisei fi 35005fa7e7aSAlexandru Elisei fi 35105fa7e7aSAlexandru Elisei else 35205fa7e7aSAlexandru Elisei if [ "$type_addr" != "mmio" ]; then 35305fa7e7aSAlexandru Elisei echo "unknown $name earlycon type: $type_addr" 35405fa7e7aSAlexandru Elisei usage 35505fa7e7aSAlexandru Elisei fi 35605fa7e7aSAlexandru Elisei fi 35705fa7e7aSAlexandru Elisei 35805fa7e7aSAlexandru Elisei if [ -z "$addr" ]; then 35905fa7e7aSAlexandru Elisei echo "missing $name earlycon address" 36005fa7e7aSAlexandru Elisei usage 36105fa7e7aSAlexandru Elisei fi 3626bfcc82cSAndrew Jones if [[ $addr =~ ^0(x|X)[0-9a-fA-F]+$ ]] || [[ $addr =~ ^[0-9]+$ ]]; then 3636bfcc82cSAndrew Jones uart_early_addr=$addr 36405fa7e7aSAlexandru Elisei else 36505fa7e7aSAlexandru Elisei echo "invalid $name earlycon address: $addr" 36605fa7e7aSAlexandru Elisei usage 36705fa7e7aSAlexandru Elisei fi 36805fa7e7aSAlexandru Eliseifi 3696bfcc82cSAndrew Jones 37066c0dc59SAlexandru Elisei# $arch will have changed when cross-compiling. 37166c0dc59SAlexandru Elisei[ -z "$processor" ] && processor=$(get_default_processor $arch) 3726bfcc82cSAndrew Jones 3736bfcc82cSAndrew Jonesif [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 3746bfcc82cSAndrew Jones testdir=x86 3756bfcc82cSAndrew Joneselif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 3766bfcc82cSAndrew Jones testdir=arm 3776bfcc82cSAndrew Jones if [ "$target" = "qemu" ]; then 3786bfcc82cSAndrew Jones : "${uart_early_addr:=0x9000000}" 3796bfcc82cSAndrew Jones elif [ "$target" = "kvmtool" ]; then 3806bfcc82cSAndrew Jones : "${uart_early_addr:=0x1000000}" 3816bfcc82cSAndrew Jones errata_force=1 3826bfcc82cSAndrew Jones else 3836bfcc82cSAndrew Jones echo "--target must be one of 'qemu' or 'kvmtool'!" 3846bfcc82cSAndrew Jones usage 3856bfcc82cSAndrew Jones fi 3861e95c7ccSAndrew Joneselif [ "$arch" = "ppc64" ]; then 3871e95c7ccSAndrew Jones testdir=powerpc 3883f8d4194SAndrew Jones firmware="$testdir/boot_rom.bin" 389f1ccf5d2SLaurent Vivier if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then 390f1ccf5d2SLaurent Vivier echo "You must provide endianness (big or little)!" 391f1ccf5d2SLaurent Vivier usage 392f1ccf5d2SLaurent Vivier fi 393bd744d46SAndrew Joneselif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then 394bd744d46SAndrew Jones testdir=riscv 395bd744d46SAndrew Jones arch_libdir=riscv 3966bfcc82cSAndrew Jones : "${uart_early_addr:=0x10000000}" 39755dd01b4SNicholas Pigginelif [ "$arch" = "s390x" ]; then 39855dd01b4SNicholas Piggin testdir=s390x 399761db0bdSAndrew Joneselse 40055dd01b4SNicholas Piggin echo "arch $arch is not supported!" 40155dd01b4SNicholas Piggin arch= 40255dd01b4SNicholas Piggin usage 403761db0bdSAndrew Jonesfi 404e303c665SAlex Bennéeif [ ! -d "$srcdir/$testdir" ]; then 40555dd01b4SNicholas Piggin echo "$srcdir/$testdir does not exist!" 406761db0bdSAndrew Jones exit 1 407761db0bdSAndrew Jonesfi 408fe1efa50SAndrew Jones 409fe1efa50SAndrew Jonesif [ "$efi" = "y" ] && [ -f "$srcdir/$testdir/efi/run" ]; then 410fe1efa50SAndrew Jones ln -fs "$srcdir/$testdir/efi/run" $testdir-run 411fe1efa50SAndrew Joneselif [ -f "$srcdir/$testdir/run" ]; then 412e303c665SAlex Bennée ln -fs "$srcdir/$testdir/run" $testdir-run 413761db0bdSAndrew Jonesfi 4147d36db35SAvi Kivity 415ad5fb883SZixuan Wangtestsubdir=$testdir 416c98ce6e0SAlexandru Eliseiif [ "$efi" = "y" ]; then 417ad5fb883SZixuan Wang testsubdir=$testdir/efi 418ad5fb883SZixuan Wangfi 419ad5fb883SZixuan Wang 420529046c3SAlex Bennée# check if uint32_t needs a long format modifier 42144f64120SAndrew Jonescat << EOF > lib-test.c 42244f64120SAndrew Jones__UINT32_TYPE__ 423529046c3SAlex BennéeEOF 4247c460095SAndrew Jonesu32_long=$("$cc" $cflags -E lib-test.c | grep -v '^#' | grep -q long && echo yes) 42544f64120SAndrew Jonesrm -f lib-test.c 426529046c3SAlex Bennée 427450124ccSRoman Bolshakov# check if slash can be used for division 428450124ccSRoman Bolshakovif [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 429450124ccSRoman Bolshakov cat << EOF > lib-test.S 430450124ccSRoman Bolshakovfoo: 431450124ccSRoman Bolshakov movl (8 / 2), %eax 432450124ccSRoman BolshakovEOF 4337c460095SAndrew Jones wa_divide=$("$cc" $cflags -c lib-test.S >/dev/null 2>&1 || echo yes) 434450124ccSRoman Bolshakov rm -f lib-test.{o,S} 435450124ccSRoman Bolshakovfi 436450124ccSRoman Bolshakov 437974f94d3SDan Cross# warn if enhanced getopt is unavailable 43883760814SPaolo Bonzinigetopt -T > /dev/null 43983760814SPaolo Bonziniif [ $? -ne 4 ]; then 440974f94d3SDan Cross echo "Without enhanced getopt you won't be able to use run_tests.sh." 441974f94d3SDan Cross echo "Add it to your PATH?" 44283760814SPaolo Bonzinifi 44383760814SPaolo Bonzini 444e303c665SAlex Bennée# Are we in a separate build tree? If so, link the Makefile 445e303c665SAlex Bennée# and shared stuff so that 'make' and run_tests.sh work. 446e303c665SAlex Bennéeif test ! -e Makefile; then 447e303c665SAlex Bennée echo "linking Makefile..." 448e303c665SAlex Bennée ln -s "$srcdir/Makefile" . 449e303c665SAlex Bennée 450e303c665SAlex Bennée echo "linking tests..." 451ad5fb883SZixuan Wang mkdir -p $testsubdir 452e303c665SAlex Bennée ln -sf "$srcdir/$testdir/run" $testdir/ 453ad5fb883SZixuan Wang if test "$testdir" != "$testsubdir"; then 454ad5fb883SZixuan Wang ln -sf "$srcdir/$testsubdir/run" $testsubdir/ 455ad5fb883SZixuan Wang fi 456e303c665SAlex Bennée ln -sf "$srcdir/$testdir/unittests.cfg" $testdir/ 457e303c665SAlex Bennée ln -sf "$srcdir/run_tests.sh" 458e303c665SAlex Bennée 4591a84232eSThomas Huth if [ -d "$srcdir/$testdir/snippets" ]; then 4601a84232eSThomas Huth mkdir -p "$testdir/snippets/c" 4611a84232eSThomas Huth fi 4621a84232eSThomas Huth 463e303c665SAlex Bennée echo "linking scripts..." 464e303c665SAlex Bennée ln -sf "$srcdir/scripts" 465e303c665SAlex Bennéefi 466e303c665SAlex Bennée 4673df0ccccSAndrew Jones# link lib/asm for the architecture 4683df0ccccSAndrew Jonesrm -f lib/asm 469d76bf076SAndrew Jonesasm="asm-generic" 470e303c665SAlex Bennéeif [ -d "$srcdir/lib/$arch/asm" ]; then 471e303c665SAlex Bennée asm="$srcdir/lib/$arch/asm" 47248dd20d7SAndrew Jones mkdir -p "lib/$arch" 47348dd20d7SAndrew Joneselif [ -d "$srcdir/lib/$arch_libdir/asm" ]; then 47448dd20d7SAndrew Jones asm="$srcdir/lib/$arch_libdir/asm" 47548dd20d7SAndrew Jones mkdir -p "lib/$arch_libdir" 476e303c665SAlex Bennéeelif [ -d "$srcdir/lib/$testdir/asm" ]; then 477e303c665SAlex Bennée asm="$srcdir/lib/$testdir/asm" 47848dd20d7SAndrew Jones mkdir -p "lib/$testdir" 4793df0ccccSAndrew Jonesfi 480e303c665SAlex Bennéeln -sf "$asm" lib/asm 48148dd20d7SAndrew Jonesmkdir -p lib/generated lib/libfdt 4823df0ccccSAndrew Jones 4833df0ccccSAndrew Jones# create the config 4847d36db35SAvi Kivitycat <<EOF > config.mak 4853df129a6SNicholas Piggin# Shellcheck does not see these are used 4863df129a6SNicholas Piggin# shellcheck disable=SC2034 487eed19302SNicholas Piggin# Shellcheck can give pointless quoting warnings for some commands 488eed19302SNicholas Piggin# shellcheck disable=SC2209 489e303c665SAlex BennéeSRCDIR=$srcdir 4907d36db35SAvi KivityPREFIX=$prefix 491c4306560SAlex BennéeHOST=$host 4927d36db35SAvi KivityARCH=$arch 49339ac3f84SAndrew JonesARCH_NAME=$arch_name 494c3758c09SAndrew JonesARCH_LIBDIR=$arch_libdir 4957d36db35SAvi KivityPROCESSOR=$processor 4965f77b72dSJean-Philippe BruckerTARGET_CPU=$target_cpu 4975f77b72dSJean-Philippe BruckerDEFAULT_QEMU_CPU=$(get_default_qemu_cpu $arch) 4987c460095SAndrew JonesCC=$cc 499441cbc0dSThomas HuthCFLAGS=$cflags 5007d36db35SAvi KivityLD=$cross_prefix$ld 5017d36db35SAvi KivityOBJCOPY=$cross_prefix$objcopy 502de9d141bSAndrew JonesOBJDUMP=$cross_prefix$objdump 503445e5aeeSBill WendlingREADELF=$cross_prefix$readelf 5047d36db35SAvi KivityAR=$cross_prefix$ar 505e593c4fdSAndrew JonesADDR2LINE=$cross_prefix$addr2line 506761db0bdSAndrew JonesTEST_DIR=$testdir 507ad5fb883SZixuan WangTEST_SUBDIR=$testsubdir 5083f8d4194SAndrew JonesFIRMWARE=$firmware 509f1ccf5d2SLaurent VivierENDIAN=$endian 51056c886b0SPeter FeinerPRETTY_PRINT_STACKS=$pretty_print_stacks 51170fcb64bSAndrew JonesENVIRON_DEFAULT=$environ_default 512b16df9eeSAndrew JonesERRATATXT=$erratatxt 513529046c3SAlex BennéeU32_LONG_FMT=$u32_long 514450124ccSRoman BolshakovWA_DIVIDE=$wa_divide 515238b5967SMarc HartmayerGENPROTIMG=${GENPROTIMG-genprotimg} 516238b5967SMarc HartmayerHOST_KEY_DOCUMENT=$host_key_document 51703d0df32SNico BoehrCONFIG_DUMP=$enable_dump 518c98ce6e0SAlexandru EliseiCONFIG_EFI=$efi 5195ded2989SAndrew JonesEFI_DIRECT=$efi_direct 52001c070a7SThomas HuthCONFIG_WERROR=$werror 521dc4f7106SJanosch FrankGEN_SE_HEADER=$gen_se_header 5227d36db35SAvi KivityEOF 5234fcad6e9SAlexandru Eliseiif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 5244fcad6e9SAlexandru Elisei echo "TARGET=$target" >> config.mak 5254fcad6e9SAlexandru Eliseifi 5269431507cSAlexandru Elisei 5279431507cSAlexandru Eliseicat <<EOF > lib/config.h 52880e8b3d8SCornelia Huck#ifndef _CONFIG_H_ 52980e8b3d8SCornelia Huck#define _CONFIG_H_ 5309431507cSAlexandru Elisei/* 5319431507cSAlexandru Elisei * Generated file. DO NOT MODIFY. 5329431507cSAlexandru Elisei * 5339431507cSAlexandru Elisei */ 534725134dbSAlexandru Elisei 5359431507cSAlexandru EliseiEOF 5369431507cSAlexandru Eliseiif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 5379431507cSAlexandru Eliseicat <<EOF >> lib/config.h 5389431507cSAlexandru Elisei 5396bfcc82cSAndrew Jones#define CONFIG_UART_EARLY_BASE ${uart_early_addr} 54035145f14SAndrew Jones#define CONFIG_ERRATA_FORCE ${errata_force} 541d4c8e725SNicholas Piggin 542d4c8e725SNicholas PigginEOF 543d4c8e725SNicholas Pigginfi 544d4c8e725SNicholas Piggin 545d4c8e725SNicholas Pigginif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ] || [ "$arch" = "ppc64" ]; then 546d4c8e725SNicholas Piggincat <<EOF >> lib/config.h 547d4c8e725SNicholas Piggin 548a2d06852SNikos Nikoleris#define CONFIG_PAGE_SIZE _AC(${page_size}, UL) 5499431507cSAlexandru Elisei 5509431507cSAlexandru EliseiEOF 551bd744d46SAndrew Joneselif [ "$arch" = "riscv32" ] || [ "$arch" = "riscv64" ]; then 55256a30199SAndrew Jones echo "#define CONFIG_UART_EARLY_BASE ${uart_early_addr}" >> lib/config.h 55356a30199SAndrew Jones [ "$console" = "sbi" ] && echo "#define CONFIG_SBI_CONSOLE" >> lib/config.h 55456a30199SAndrew Jones echo >> lib/config.h 5559431507cSAlexandru Eliseifi 5569431507cSAlexandru Eliseiecho "#endif" >> lib/config.h 557