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