xref: /kvm-unit-tests/configure (revision 5f77b72dac13e8b896b71a11c2940888915bf0cb)
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