| # |
| # 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() |