blob: 6420b188fa3549b0538fd2e01b96071d2f94502b [file] [log] [blame] [edit]
#
# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
# Copyright 2020, HENSOLDT Cyber GmbH
#
# SPDX-License-Identifier: BSD-2-Clause
#
cmake_minimum_required(VERSION 3.8.2)
include_guard(GLOBAL)
function(ApplyData61ElfLoaderSettings kernel_platform kernel_sel4_arch)
set(binary_list "tx1;hikey;odroidc2;odroidc4;imx8mq-evk;zynqmp;imx8mm-evk;hifive;tqma8xqp1gb")
set(efi_list "tk1;rockpro64")
set(uimage_list "tx2;am335x")
if(
${kernel_platform} IN_LIST efi_list
OR (${kernel_platform} STREQUAL "hikey" AND ${kernel_sel4_arch} STREQUAL "aarch64")
)
set(ElfloaderImage "efi" CACHE STRING "" FORCE)
elseif(${kernel_platform} IN_LIST uimage_list)
set(ElfloaderImage "uimage" CACHE STRING "" FORCE)
#rpi3
elseif(${kernel_platform} STREQUAL "bcm2837" AND ${kernel_sel4_arch} STREQUAL "aarch64")
set(ElfloaderImage "binary" CACHE STRING "" FORCE)
#rpi4
elseif(${kernel_platform} STREQUAL "bcm2711" AND ${kernel_sel4_arch} STREQUAL "aarch64")
set(ElfloaderImage "efi" CACHE STRING "" FORCE)
elseif(${kernel_platform} IN_LIST binary_list)
set(ElfloaderImage "binary" CACHE STRING "" FORCE)
else()
set(ElfloaderImage "elf" CACHE STRING "" FORCE)
endif()
if(${kernel_platform} STREQUAL "tk1" AND ${kernel_sel4_arch} STREQUAL "arm_hyp")
set(ElfloaderMode "hypervisor" CACHE STRING "" FORCE)
set(ElfloaderMonitorHook ON CACHE BOOL "" FORCE)
endif()
if((KernelPlatformImx8mm-evk OR KernelPlatformImx8mq-evk) AND KernelSel4ArchAarch32)
set(ElfloaderArmV8LeaveAarch64 ON CACHE BOOL "" FORCE)
# This applies to imx8mm and imx8mq when in aarch32 configuration
# It should be possible to use a uimage format but when tried nothing
# runs after uboot.
set(IMAGE_START_ADDR 0x41000000 CACHE INTERNAL "" FORCE)
endif()
if(KernelPlatformHikey AND KernelSel4ArchAarch32)
# This is preserving what the Hikey's bootloader requires.
set(IMAGE_START_ADDR 0x1000 CACHE INTERNAL "" FORCE)
endif()
if(KernelPlatformZynqmp AND KernelSel4ArchAarch32)
set(IMAGE_START_ADDR 0x8000000 CACHE INTERNAL "" FORCE)
endif()
if(KernelPlatformSpike AND KernelSel4ArchRiscV32)
set(IMAGE_START_ADDR 0x80400000 CACHE INTERNAL "" FORCE)
endif()
endfunction()
function(ApplyCommonSimulationSettings kernel_sel4_arch)
if("${kernel_sel4_arch}" STREQUAL "x86_64" OR "${kernel_sel4_arch}" STREQUAL "ia32")
# Generally we cannot simulate some more recent features
set(KernelSupportPCID OFF CACHE BOOL "" FORCE)
if("${kernel_sel4_arch}" STREQUAL "ia32")
set(KernelFSGSBase gdt CACHE STRING "" FORCE)
else()
set(KernelFSGSBase msr CACHE STRING "" FORCE)
endif()
set(KernelIOMMU OFF CACHE BOOL "" FORCE)
set(KernelFPU FXSAVE CACHE STRING "" FORCE)
endif()
endfunction()
function(ApplyCommonReleaseVerificationSettings release verification)
# Setup flags for different combinations of 'release' (performance optimized builds) and
# 'verification' (verification friendly features) builds
if(release)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
# TODO(sleffler): we want KernelPrinting ON together with release
# set(KernelPrinting OFF CACHE BOOL "" FORCE)
else()
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "" FORCE)
endif()
if(verification)
set(KernelVerificationBuild ON CACHE BOOL "" FORCE)
else()
set(KernelVerificationBuild OFF CACHE BOOL "" FORCE)
endif()
# If neither release nor verification then enable debug facilities, otherwise turn them off
if((NOT release) AND (NOT verification))
set(KernelDebugBuild ON CACHE BOOL "" FORCE)
set(KernelPrinting ON CACHE BOOL "" FORCE)
else()
set(KernelDebugBuild OFF CACHE BOOL "" FORCE)
endif()
mark_as_advanced(CMAKE_BUILD_TYPE)
endfunction()
# Try and map a PLATFORM value to a valid kernel platform and architecture
# variables. Additionally, the following boolean configs can be set to indicate
# which seL4 arch to select:
# - aarch32: ARM, AARCH32, AARCH32HF
# - arm_hyp: ARM_HYP
# - aarch64: AARCH64
# - riscv64: RISCV64
# - riscv32: RISCV32
#
# Calling this function will result in forced updates to the cache.
function(correct_platform_strings)
if(KernelX86Sel4Arch)
# this used to be a common mechanism how x86 architectures were
# selected. It's deprecated now and PLATFORM should be used instead. As
# of Nov/2020, we don't make this an error to give everybody a chance
# to update their scripts.
if("${PLATFORM}" STREQUAL "")
if(NOT correct_platform_strings_no_print)
message(
DEPRECATION
"setting PLATFORM from deprecated KernelX86Sel4Arch: ${KernelX86Sel4Arch}"
)
endif()
set(PLATFORM "${KernelX86Sel4Arch}")
elseif("${PLATFORM}" STREQUAL "${KernelX86Sel4Arch}")
if(NOT correct_platform_strings_no_print)
message(DEPRECATION "KernelX86Sel4Arch is deprecated, use PLATFORM only")
endif()
else()
message(
FATAL_ERROR
"PLATFORM=${PLATFORM} does not match KernelX86Sel4Arch=${KernelX86Sel4Arch}"
)
endif()
elseif(KernelArmSel4Arch)
# this has never been widely in use, so we stop supporting it
message(FATAL_ERROR "KernelArmSel4Arch is no longer supported, use PLATFROM")
elseif(KernelRiscVSel4Arch)
# this should not have been in use at all
message(FATAL_ERROR "KernelRiscVSel4Arch is no longer supported, use PLATFROM")
endif()
set(
platform_aliases
# The elements of this list are:
# "-"+<name of architecture #1 specific platform variable>
# <chip family>:<board_1>,<board_2>...
# <chip family>:<board_1>,<board_2>...
# ...
# "-"+<name of architecture #2 specific platform variable>
# <chip family>:<board_1>,<board_2>...
# ...
# where this function will try to match PLATFORM against <board_n> and
# then set:
# KernelPlatform=<chip family>
# <platform variable>=<board_n>
# Note that <board_n> must be a unique name, as the first match will be
# used. If there was no match for any board the function will set:
# KernelPlatform=${PLATFORM}
# and leave all further setup to the architecture/platform specific
# configuration to <sel4 kernel>/src/plat/*/config.cmake
#
"-KernelARMPlatform"
"imx6:sabre,wandq,nitrogen6sx"
"bcm2837:rpi3"
"bcm2711:rpi4"
"exynos5:exynos5250,exynos5410,exynos5422"
"am335x:am335x-boneblack,am335x-boneblue,am335x-bone"
"-KernelSel4Arch"
"pc99:x86_64,ia32"
)
set(all_boards "")
set(block_kernel_var "")
set(kernel_var "")
foreach(item IN LISTS platform_aliases)
if(item MATCHES "^-(.*)$")
set(block_kernel_var "${CMAKE_MATCH_1}")
continue()
endif()
if(NOT block_kernel_var)
message(
FATAL_ERROR
"platform_aliases must set architecture specific kernel platform variable first"
)
endif()
if(NOT item MATCHES "^(.*):(.*)$")
message(FATAL_ERROR "invalid line in platform_aliases: ${item}")
endif()
set(plat "${CMAKE_MATCH_1}")
string(
REPLACE
","
";"
item_board_list
"${CMAKE_MATCH_2}"
)
# remember board alias names, we need to build a complete list
list(APPEND all_boards "${item_board_list}")
if(kernel_var OR ("${PLATFORM}" STREQUAL "") OR (NOT "${PLATFORM}" IN_LIST item_board_list))
continue()
endif()
if(KernelPlatform AND (NOT "${KernelPlatform}" STREQUAL "${plat}"))
message(
FATAL_ERROR
"config mismatch, wont overwrite KernelPlatform=${KernelPlatform} with ${plat}"
)
endif()
set(KernelPlatform "${plat}" CACHE STRING "" FORCE)
if(${block_kernel_var} AND (NOT "${${block_kernel_var}}" STREQUAL "${PLATFORM}"))
message(
FATAL_ERROR
"config mismatch, wont overwrite ${block_kernel_var}=${${block_kernel_var}} with ${PLATFORM}"
)
endif()
set(kernel_var "${block_kernel_var}")
set(${kernel_var} "${PLATFORM}" CACHE STRING "" FORCE)
endforeach()
if(NOT kernel_var)
set(KernelPlatform "${PLATFORM}" CACHE STRING "" FORCE)
endif()
# declare a special variable that some CMake files expect to hold a list of
# all board alias names from the "database" above
set(correct_platform_strings_platform_aliases "${all_boards}" CACHE INTERNAL "")
# printing a message about the adaption is optional. When CMake is
# invoked multiple times to get a stable configuration, we print this
# for the first run only.
if(NOT correct_platform_strings_no_print)
message(STATUS "Set platform details from PLATFORM=${PLATFORM}")
message(STATUS " KernelPlatform: ${KernelPlatform}")
if(kernel_var)
message(STATUS " ${kernel_var}: ${${kernel_var}}")
endif()
endif()
set(_REWRITE ON)
if(ARM OR AARCH32 OR AARCH32HF)
# "arm_hyp" was needed as a new kernel architecture long time ago when
# the scripts that produced a kernel that was given to L4V could only
# handle changing the kernel architecture. It was used to mean
# "aarch32 + hyp extensions". Now it would be possible to completely
# remove it and follow the same pattern as aarch64.
if(ARM_HYP OR ("${KernelSel4Arch}" STREQUAL "arm_hyp"))
set(KernelSel4Arch "arm_hyp" CACHE STRING "" FORCE)
else()
set(KernelSel4Arch "aarch32" CACHE STRING "" FORCE)
endif()
elseif(AARCH64)
set(KernelSel4Arch "aarch64" CACHE STRING "" FORCE)
elseif(RISCV64)
set(KernelSel4Arch "riscv64" CACHE STRING "" FORCE)
elseif(RISCV32)
set(KernelSel4Arch "riscv32" CACHE STRING "" FORCE)
else()
set(_REWRITE OFF)
endif()
if(_REWRITE AND (NOT correct_platform_strings_no_print))
message(STATUS "Setting from flags KernelSel4Arch: ${KernelSel4Arch}")
endif()
# Only print out these info messages on first initialisation
# otherwise the ccache gets interrupted with output everytime it is used.
# The ccache also has a mechanism for showing what config options get
# changed after a configuration anyway so the user will still be informed.
set(correct_platform_strings_no_print ON CACHE INTERNAL "")
endfunction()