1#
2# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3#
4# SPDX-License-Identifier: GPL-2.0-only
5#
6
7cmake_minimum_required(VERSION 3.7.2)
8
9declare_platform(qemu-arm-virt KernelPlatformQEMUArmVirt PLAT_QEMU_ARM_VIRT KernelArchARM)
10
11set(MIN_QEMU_VERSION "3.1.0")
12
13if(KernelPlatformQEMUArmVirt)
14    if("${ARM_CPU}" STREQUAL "cortex-a15")
15        declare_seL4_arch(aarch32)
16        set(QEMU_ARCH "arm")
17        set(KernelArmCortexA15 ON)
18        set(KernelArchArmV7a ON)
19    elseif("${ARM_CPU}" STREQUAL "cortex-a53")
20        declare_seL4_arch(aarch64)
21        set(QEMU_ARCH "aarch64")
22        set(KernelArmCortexA53 ON)
23        set(KernelArchArmV8a ON)
24    elseif("${ARM_CPU}" STREQUAL "cortex-a57")
25        declare_seL4_arch(aarch64)
26        set(QEMU_ARCH "aarch64")
27        set(KernelArmCortexA57 ON)
28        set(KernelArchArmV8a ON)
29    else()
30        message(STATUS "Default cpu specified for virt board: cortex-a53")
31        declare_seL4_arch(aarch64)
32        set(ARM_CPU "cortex-a53")
33        set(QEMU_ARCH "aarch64")
34        set(KernelArmCortexA53 ON)
35        set(KernelArchArmV8a ON)
36    endif()
37    execute_process(
38        COMMAND qemu-system-${QEMU_ARCH} -version
39        OUTPUT_VARIABLE QEMU_VERSION_STR
40        RESULT_VARIABLE error
41    )
42    if(error)
43        message(FATAL_ERROR "Failed to determine qemu version (qemu-system-${QEMU_ARCH})")
44    endif()
45    string(
46        REGEX
47            MATCH
48            "[0-9](\\.[0-9])+"
49            QEMU_VERSION
50            ${QEMU_VERSION_STR}
51    )
52    if("${QEMU_VERSION}" VERSION_LESS "${MIN_QEMU_VERSION}")
53        message(FATAL_ERROR "Error: qemu version must be at least ${MIN_QEMU_VERSION}")
54    endif()
55
56    if("${QEMU_MEMORY}" STREQUAL "")
57        set(QEMU_MEMORY "1024")
58    endif()
59    message(STATUS "QEMU MEMORY is: ${QEMU_MEMORY}")
60    config_set(KernelARMPlatform ARM_PLAT qemu-arm-virt)
61    set(DTBPath "${CMAKE_BINARY_DIR}/virt.dtb")
62    set(DTSPath "${CMAKE_BINARY_DIR}/virt.dts")
63    if(KernelArmHypervisorSupport)
64        set(QEMU_VIRT_OPTION "virtualization=on,highmem=off,secure=off")
65    else()
66        if(Kernel32)
67            set(QEMU_VIRT_OPTION "virtualization=off,highmem=off")
68        else()
69            set(QEMU_VIRT_OPTION "virtualization=off")
70        endif()
71    endif()
72    if(KernelMaxNumNodes)
73        set(QEMU_SMP_OPTION "${KernelMaxNumNodes}")
74    else()
75        set(QEMU_SMP_OPTION "1")
76    endif()
77    find_program(QEMU_BINARY qemu-system-${QEMU_ARCH})
78    execute_process(
79        COMMAND
80            ${QEMU_BINARY} -machine virt,dumpdtb=${DTBPath},${QEMU_VIRT_OPTION} -m ${QEMU_MEMORY}
81            -cpu ${ARM_CPU} -smp ${QEMU_SMP_OPTION} -nographic
82        ERROR_VARIABLE QEMU_OUTPUT_MESSAGE
83        RESULT_VARIABLE error
84    )
85    if(${QEMU_OUTPUT_MESSAGE})
86        string(STRIP ${QEMU_OUTPUT_MESSAGE} QEMU_OUTPUT_MESSAGE)
87    endif()
88    message(STATUS ${QEMU_OUTPUT_MESSAGE})
89    if(error)
90        message(FATAL_ERROR "Failed to dump DTB using ${QEMU_BINARY})")
91    endif()
92    execute_process(
93        COMMAND
94            dtc -q -I dtb -O dts ${DTBPath}
95        OUTPUT_FILE ${DTSPath}
96        RESULT_VARIABLE error
97    )
98    if(error)
99        message(FATAL_ERROR "Failed to convert DTB to DTS (${DTBPath})")
100    endif()
101    list(APPEND KernelDTSList "${DTSPath}")
102    list(APPEND KernelDTSList "src/plat/qemu-arm-virt/overlay-qemu-arm-virt.dts")
103    if(KernelArmHypervisorSupport)
104        list(APPEND KernelDTSList "src/plat/qemu-arm-virt/overlay-reserve-vm-memory.dts")
105    endif()
106    declare_default_headers(
107        TIMER_FREQUENCY 62500000
108        MAX_IRQ 159
109        NUM_PPI 32
110        TIMER drivers/timer/arm_generic.h
111        INTERRUPT_CONTROLLER arch/machine/gic_v2.h
112        CLK_MAGIC 4611686019llu
113        CLK_SHIFT 58u
114        KERNEL_WCET 10u
115    )
116endif()
117
118add_sources(
119    DEP "KernelPlatformQEMUArmVirt"
120    CFILES src/arch/arm/machine/gic_v2.c src/arch/arm/machine/l2c_nop.c
121)
122
123config_string(
124    KernelUserTop USER_TOP "Set seL4_UserTop constant"
125    DEFAULT 0xa0000000
126    UNQUOTE
127    DEPENDS "KernelPlatformQEMUArmVirt;KernelSel4ArchAarch32"
128)
129