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