From 4ede700fe73f677d5dcbd9f1078a39c78476685d Mon Sep 17 00:00:00 2001
From: Kent McLeod <Kent.Mcleod@data61.csiro.au>
Date: Tue, 7 May 2019 11:09:45 +1000
Subject: [PATCH] CMake: Invert plat config.cmake processing order

Instead of processing each platform CMake file during the arch's
config.cmake file, we process all of the platform CMake files first.
This is primarily motivated by wanting to move platform configuration
into a config file that is processed via a -C argument to the initial
build initialisation command.

Now a platform config is responsible for setting the kernel architecture
and it's own platform/arch specific config settings. Where previously a
platform was chosen in an arch specific way via either setting
KernelARMPlatform or KernelX86Sel4Arch or KernelRiscVPlatform, a
platform can now be set by KernelPlatform. In cases where a platform may
further parameterise its configuration it is free to choose its own
config options to query. Platforms that support multiple seL4
architectures should use KernelSel4Arch to query this.  Platforms that
provide sub platforms such as exynos5 and subplatforms exynos5250,
exynos5410 and exynos5422 can be selected by specifying
KernelPlatform=exynos5, KernelARMPlatform=exynos5410 for example.
---
 config.cmake                       | 172 ++++++++++++++++++++++++++---
 configs/ARM_HYP_verified.cmake     |   6 +-
 configs/ARM_verified.cmake         |   4 +-
 configs/RISCV64_verified.cmake     |   5 +-
 configs/X64_verified.cmake         |   4 +-
 src/arch/arm/config.cmake          | 152 +------------------------
 src/arch/riscv/config.cmake        |  30 -----
 src/arch/x86/config.cmake          |  29 +----
 src/plat/allwinnerA20/config.cmake |  11 +-
 src/plat/am335x/config.cmake       |  35 ++++--
 src/plat/apq8064/config.cmake      |   5 +-
 src/plat/bcm2837/config.cmake      |  15 ++-
 src/plat/exynos4/config.cmake      |   5 +-
 src/plat/exynos5/config.cmake      |  50 ++++++++-
 src/plat/hifive/config.cmake       |   7 +-
 src/plat/hikey/config.cmake        |  43 +++++---
 src/plat/imx31/config.cmake        |   5 +-
 src/plat/imx6/config.cmake         |  37 ++++---
 src/plat/imx7/config.cmake         |   8 +-
 src/plat/odroidc2/config.cmake     |   5 +-
 src/plat/omap3/config.cmake        |   5 +-
 src/plat/pc99/config.cmake         |  15 +++
 src/plat/spike/config.cmake        |  17 ++-
 src/plat/tk1/config.cmake          |  13 ++-
 src/plat/tx1/config.cmake          |   5 +-
 src/plat/tx2/config.cmake          |   5 +-
 src/plat/zynq7000/config.cmake     |   5 +-
 src/plat/zynqmp/config.cmake       |  17 ++-
 28 files changed, 420 insertions(+), 290 deletions(-)

diff --git a/config.cmake b/config.cmake
index e1f2e8924..441641e20 100644
--- a/config.cmake
+++ b/config.cmake
@@ -45,20 +45,80 @@ set_property(
         user_data_device_C
 )
 
-#
-# Architecture selection
-#
-config_choice(
-    KernelArch
-    ARCH
-    "Architecture to use when building the kernel"
-    "arm;KernelArchARM;ARCH_ARM"
-    "riscv;KernelArchRiscV;ARCH_RISCV"
-    "x86;KernelArchX86;ARCH_X86"
-)
+# Create and set all of the Kernel config options that can
+# be derived from the seL4 arch which is one of the following:
+# aarch32, aarch64, arm_hyp, riscv32, riscv64, x86_64, ia32
+# This macro is intended to be called from within a platform config.
+macro(declare_seL4_arch sel4_arch)
+    set(KernelSel4Arch "${sel4_arch}" CACHE STRING "")
+    config_choice(
+        KernelSel4Arch
+        SEL4_ARCH
+        "Architecture mode for building the kernel"
+        "aarch32;KernelSel4ArchAarch32;ARCH_AARCH32"
+        "aarch64;KernelSel4ArchAarch64;ARCH_AARCH64"
+        "arm_hyp;KernelSel4ArchArmHyp;ARCH_ARM_HYP"
+        "riscv32;KernelSel4ArchRiscV32;ARCH_RISCV32"
+        "riscv64;KernelSel4ArchRiscV64;ARCH_RISCV64"
+        "x86_64;KernelSel4ArchX86_64;ARCH_X86_64"
+        "ia32;KernelSel4ArchIA32;ARCH_IA32"
+    )
 
-# Set defaults for common variables
-set(KernelHaveFPU OFF)
+    config_choice(
+        KernelArch
+        ARCH
+        "Architecture to use when building the kernel"
+        "arm;KernelArchARM;ARCH_ARM;KernelSel4ArchAarch32 OR KernelSel4ArchAarch64 OR KernelSel4ArchArmHyp"
+        "riscv;KernelArchRiscV;ARCH_RISCV;KernelSel4ArchRiscV32 OR KernelSel4ArchRiscV64"
+        "x86;KernelArchX86;ARCH_X86;KernelSel4ArchX86_64 OR KernelSel4ArchIA32"
+    )
+
+    # The following config options are legacy and can be removed if they
+    # aren't used anywhere anymore.
+    if(KernelArchARM)
+        config_set(KernelArmSel4Arch ARM_SEL4_ARCH "${KernelSel4Arch}")
+    elseif(KernelArchRiscV)
+        config_set(KernelRiscVSel4Arch RISCV_SEL4_ARCH "${KernelSel4Arch}")
+    elseif(KernelArchX86)
+        config_set(KernelX86Sel4Arch X86_SEL4_ARCH "${KernelSel4Arch}")
+    endif()
+
+    # arm-hyp masquerades as an aarch32 build
+    if(KernelSel4ArchArmHyp)
+        config_set(KernelSel4ArmHypAarch32 ARCH_AARCH32 ON)
+        set(KernelSel4ArchAarch32 ON CACHE INTERNAL "" FORCE)
+    else()
+        config_set(KernelSel4ArmHypAarch32 ARCH_AARCH32 OFF)
+    endif()
+
+    # Set kernel mode options
+    if(KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp OR KernelSel4ArchRiscV32 OR KernelSel4ArchIA32)
+        set_kernel_32()
+    elseif(KernelSel4ArchAarch64 OR KernelSel4ArchRiscV64 OR KernelSel4ArchX86_64)
+        set_kernel_64()
+    endif()
+
+endmacro()
+
+# Register a platform's config options to be set if it is selected.
+# Additionally, the kernel_platforms variable can be used as a record of all
+# platforms that can be built once the platform configuration files have been
+# processed.
+# name: name of the platform, KernelPlatform will be set to this.
+# config1: the CMake configuration name. Such as KernelPlatImx7.
+# config2: the C header file config name without CONFIG_. Such as PLAT_IMX7_SABRE.
+# enable_test: A CMake boolean formula that allows the option to be selected.
+#     e.g. "KernelSel4ArchAarch32", or "KernelSel4ArchX86_64 OR KernelSel4ArchIA32"
+macro(declare_platform name config1 config2 enable_test)
+    list(APPEND kernel_platforms "${name}\;${config1}\;${config2}\;${enable_test}")
+    if("${KernelPlatform}" STREQUAL ${name})
+        set(${config1} ON CACHE INTERNAL "" FORCE)
+        # Write KernelPlatform into the cache in case it is only a local variable
+        set(KernelPlatform ${KernelPlatform} CACHE STRING "")
+    else()
+        set(${config1} OFF CACHE INTERNAL "" FORCE)
+    endif()
+endmacro()
 
 function(declare_default_headers)
     cmake_parse_arguments(
@@ -96,6 +156,92 @@ function(declare_default_headers)
     include_directories(include/plat/default)
 endfunction()
 
+# For all of the common variables we set a default value here if they haven't
+# been set by a platform.
+foreach(
+    var
+    IN
+    ITEMS
+    KernelArmCortexA7
+    KernelArmCortexA8
+    KernelArmCortexA9
+    KernelArmCortexA15
+    KernelArmCortexA53
+    KernelArmCortexA57
+    KernelArm1136JF_S
+    KernelArchArmV6
+    KernelArchArmV7a
+    KernelArchArmV7ve
+    KernelArchArmV8a
+    KernelArmPASizeBits40
+    KernelArmPASizeBits44
+)
+    unset(${var} CACHE)
+    set(${var} OFF)
+endforeach()
+unset(KernelArmMach CACHE)
+unset(KernelArmMachFeatureModifiers CACHE)
+unset(KernelArmCPU CACHE)
+unset(KernelArmArmV CACHE)
+
+file(GLOB result ${CMAKE_CURRENT_LIST_DIR}/src/plat/*/config.cmake)
+list(SORT result)
+
+foreach(file ${result})
+    include("${file}")
+endforeach()
+
+config_choice(KernelPlatform PLAT "Select the platform" ${kernel_platforms})
+
+# Now enshrine all the common variables in the config
+config_set(KernelArmCortexA7 ARM_CORTEX_A7 "${KernelArmCortexA7}")
+config_set(KernelArmCortexA8 ARM_CORTEX_A8 "${KernelArmCortexA8}")
+config_set(KernelArmCortexA9 ARM_CORTEX_A9 "${KernelArmCortexA9}")
+config_set(KernelArmCortexA15 ARM_CORTEX_A15 "${KernelArmCortexA15}")
+config_set(KernelArmCortexA53 ARM_CORTEX_A53 "${KernelArmCortexA53}")
+config_set(KernelArmCortexA57 ARM_CORTEX_A57 "${KernelArmCortexA57}")
+config_set(KernelArm1136JF_S ARM1136JF_S "${KernelArm1136JF_S}")
+config_set(KernelArchArmV6 ARCH_ARM_V6 "${KernelArchArmV6}")
+config_set(KernelArchArmV7a ARCH_ARM_V7A "${KernelArchArmV7a}")
+config_set(KernelArchArmV7ve ARCH_ARM_V7VE "${KernelArchArmV7ve}")
+config_set(KernelArchArmV8a ARCH_ARM_V8A "${KernelArchArmV8a}")
+config_set(KernelArmPASizeBits40 ARM_PA_SIZE_BITS_40 "${KernelArmPASizeBits40}")
+config_set(KernelArmPASizeBits44 ARM_PA_SIZE_BITS_44 "${KernelArmPASizeBits44}")
+
+# Check for v7ve before v7a as v7ve is a superset and we want to set the
+# actual armv to that, but leave armv7a config enabled for anything that
+# checks directly against it
+if(KernelArchArmV7ve)
+    set(KernelArmArmV "armv7ve" CACHE INTERNAL "")
+elseif(KernelArchArmV7a)
+    set(KernelArmArmV "armv7-a" CACHE INTERNAL "")
+elseif(KernelArchArmV8a)
+    set(KernelArmArmV "armv8-a" CACHE INTERNAL "")
+elseif(KernelArchArmV6)
+    set(KernelArmArmV "armv6" CACHE INTERNAL "")
+endif()
+if(KernelArmCortexA7)
+    set(KernelArmCPU "cortex-a7" CACHE INTERNAL "")
+elseif(KernelArmCortexA8)
+    set(KernelArmCPU "cortex-a8" CACHE INTERNAL "")
+elseif(KernelArmCortexA9)
+    set(KernelArmCPU "cortex-a9" CACHE INTERNAL "")
+elseif(KernelArmCortexA15)
+    set(KernelArmCPU "cortex-a15" CACHE INTERNAL "")
+elseif(KernelArmCortexA53)
+    set(KernelArmCPU "cortex-a53" CACHE INTERNAL "")
+elseif(KernelArmCortexA57)
+    set(KernelArmCPU "cortex-a57" CACHE INTERNAL "")
+elseif(KernelArm1136JF_S)
+    set(KernelArmCPU "arm1136jf-s" CACHE INTERNAL "")
+endif()
+if(KernelArchARM)
+    config_set(KernelArmMach ARM_MACH "${KernelArmMach}")
+endif()
+
+# Set defaults for common variables
+set(KernelHaveFPU OFF)
+
 include(src/arch/arm/config.cmake)
 include(src/arch/riscv/config.cmake)
 include(src/arch/x86/config.cmake)
diff --git a/configs/ARM_HYP_verified.cmake b/configs/ARM_HYP_verified.cmake
index 0d2e044b2..a1ab8a241 100644
--- a/configs/ARM_HYP_verified.cmake
+++ b/configs/ARM_HYP_verified.cmake
@@ -10,10 +10,8 @@
 # @TAG(DATA61_GPL)
 #
 
-set(KernelARMPlatform "tk1" CACHE STRING "")
-set(KernelArch "arm" CACHE STRING "")
-set(KernelArmSel4Arch "arm_hyp" CACHE STRING "")
-set(KernelArmHypervisorSupport ON CACHE BOOL "")
+set(KernelPlatform "tk1" CACHE STRING "")
+set(KernelSel4Arch "arm_hyp" CACHE STRING "")
 set(KernelVerificationBuild ON CACHE BOOL "")
 set(KernelIPCBufferLocation "threadID_register" CACHE STRING "")
 set(KernelMaxNumNodes "1" CACHE STRING "")
diff --git a/configs/ARM_verified.cmake b/configs/ARM_verified.cmake
index aab81277f..77b169e01 100644
--- a/configs/ARM_verified.cmake
+++ b/configs/ARM_verified.cmake
@@ -10,9 +10,7 @@
 # @TAG(DATA61_GPL)
 #
 
-set(KernelARMPlatform "sabre" CACHE STRING "")
-set(KernelArch "arm" CACHE STRING "")
-set(KernelArmSel4Arch "aarch32" CACHE STRING "")
+set(KernelPlatform "imx6" CACHE STRING "")
 set(KernelVerificationBuild ON CACHE BOOL "")
 set(KernelIPCBufferLocation "threadID_register" CACHE STRING "")
 set(KernelMaxNumNodes "1" CACHE STRING "")
diff --git a/configs/RISCV64_verified.cmake b/configs/RISCV64_verified.cmake
index 7275d5ac0..38fc065dc 100644
--- a/configs/RISCV64_verified.cmake
+++ b/configs/RISCV64_verified.cmake
@@ -10,9 +10,8 @@
 # @TAG(DATA61_GPL)
 #
 
-set(KernelArch "riscv" CACHE STRING "")
-set(KernelRiscVSel4Arch "riscv64" CACHE STRING "")
-set(KernelRiscVPlatform "spike" CACHE STRING "")
+set(KernelSel4Arch "riscv64" CACHE STRING "")
+set(KernelPlatform "spike" CACHE STRING "")
 set(KernelPTLevels "3" CACHE STRING "")
 set(KernelVerificationBuild ON CACHE BOOL "")
 set(KernelMaxNumNodes "1" CACHE STRING "")
diff --git a/configs/X64_verified.cmake b/configs/X64_verified.cmake
index 04ea21b4e..326971c43 100644
--- a/configs/X64_verified.cmake
+++ b/configs/X64_verified.cmake
@@ -10,8 +10,8 @@
 # @TAG(DATA61_GPL)
 #
 
-set(KernelArch "x86" CACHE STRING "")
-set(KernelX86Sel4Arch "x86_64" CACHE STRING "")
+set(KernelPlatform "pc99" CACHE STRING "")
+set(KernelSel4Arch "x86_64" CACHE STRING "")
 set(KernelVerificationBuild ON CACHE BOOL "")
 set(KernelMaxNumNodes "1" CACHE STRING "")
 set(KernelOptimisation "-O2" CACHE STRING "")
diff --git a/src/arch/arm/config.cmake b/src/arch/arm/config.cmake
index 065279982..1e59daf14 100644
--- a/src/arch/arm/config.cmake
+++ b/src/arch/arm/config.cmake
@@ -12,154 +12,10 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-config_choice(
-    KernelArmSel4Arch
-    ARM_SEL4_ARCH
-    "Architecture mode for building the kernel"
-    "aarch32;KernelSel4ArchAarch32;ARCH_AARCH32;KernelArchARM"
-    "aarch64;KernelSel4ArchAarch64;ARCH_AARCH64;KernelArchARM"
-    "arm_hyp;KernelSel4ArchArmHyp;ARCH_ARM_HYP;KernelArchARM;KernelArmHypervisorSupport"
-)
-
-config_choice(
-    KernelARMPlatform
-    ARM_PLAT
-    "Select the platform for the architecture"
-    "sabre;KernelPlatformSabre;PLAT_SABRE;KernelSel4ArchAarch32"
-    "kzm;KernelPlatformKZM;PLAT_KZM;KernelSel4ArchAarch32"
-    "omap3;KernelPlatformOMAP3;PLAT_OMAP3;KernelSel4ArchAarch32"
-    "am335x-boneblack;KernelPlatformAM335XBoneBlack;PLAT_AM335X_BONEBLACK;KernelSel4ArchAarch32"
-    "am335x-boneblue;KernelPlatformAM335XBoneBlue;PLAT_AM335X_BONEBLUE;KernelSel4ArchAarch32"
-    "exynos4;KernelPlatformExynos4;PLAT_EXYNOS4;KernelSel4ArchAarch32"
-    "exynos5410;KernelPlatformExynos5410;PLAT_EXYNOS5410;KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp"
-    "exynos5422;KernelPlatformExynos5422;PLAT_EXYNOS5422;KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp"
-    "exynos5250;KernelPlatformExynos5250;PLAT_EXYNOS5250;KernelSel4ArchAarch32"
-    "apq8064;KernelPlatformAPQ8064;PLAT_APQ8064;KernelSel4ArchAarch32"
-    "wandq;KernelPlatformWandQ;PLAT_WANDQ;KernelSel4ArchAarch32"
-    "imx7sabre;KernelPlatformImx7Sabre;PLAT_IMX7_SABRE;KernelSel4ArchAarch32"
-    "zynq7000;KernelPlatformZynq7000;PLAT_ZYNQ7000;KernelSel4ArchAarch32"
-    "zynqmp;KernelPlatformZynqmp;PLAT_ZYNQMP;KernelArchARM"
-    "ultra96;KernelPlatformUltra96;PLAT_ULTRA96;KernelArchARM"
-    "allwinnera20;KernelPlatformAllwinnerA20;PLAT_ALLWINNERA20;KernelSel4ArchAarch32"
-    "tk1;KernelPlatformTK1;PLAT_TK1;KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp"
-    "hikey;KernelPlatformHikey;PLAT_HIKEY;KernelArchARM"
-    "rpi3;KernelPlatformRpi3;PLAT_BCM2837;KernelArchARM"
-    "tx1;KernelPlatformTx1;PLAT_TX1;KernelSel4ArchAarch64"
-    "tx2;KernelPlatformTx2;PLAT_TX2;KernelSel4ArchAarch64"
-    "odroidc2;KernelPlatformOdroidc2;PLAT_ODROIDC2;KernelSel4ArchAarch64"
-)
-
 if(KernelArchARM)
-    config_set(KernelSel4Arch SEL4_ARCH "${KernelArmSel4Arch}")
     set_property(TARGET kernel_config_target APPEND PROPERTY TOPLEVELTYPES pde_C)
 endif()
 
-# arm-hyp masquerades as an aarch32 build
-if(KernelSel4ArchArmHyp)
-    config_set(KernelSel4ArmHypAarch32 ARCH_AARCH32 ON)
-    set(KernelSel4ArchAarch32 ON CACHE INTERNAL "")
-else()
-    config_set(KernelSel4ArmHypAarch32 ARCH_AARCH32 OFF)
-endif()
-
-if(KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp)
-    set_kernel_32()
-elseif(KernelSel4ArchAarch64)
-    set_kernel_64()
-endif()
-
-# Include all the platforms. For all of the common variables we set a default value here
-# and let the platforms override them.
-foreach(
-    var
-    IN
-    ITEMS
-    KernelArmCortexA7
-    KernelArmCortexA8
-    KernelArmCortexA9
-    KernelArmCortexA15
-    KernelArmCortexA53
-    KernelArmCortexA57
-    KernelArm1136JF_S
-    KernelArchArmV6
-    KernelArchArmV7a
-    KernelArchArmV7ve
-    KernelArchArmV8a
-    KernelArmPASizeBits40
-    KernelArmPASizeBits44
-)
-    unset(${var} CACHE)
-    set(${var} OFF)
-endforeach()
-unset(KernelArmMach CACHE)
-unset(KernelArmMachFeatureModifiers CACHE)
-unset(KernelArmCPU CACHE)
-unset(KernelArmArmV CACHE)
-
-include(src/plat/allwinnerA20/config.cmake)
-include(src/plat/imx6/config.cmake)
-include(src/plat/imx7/config.cmake)
-include(src/plat/imx31/config.cmake)
-include(src/plat/omap3/config.cmake)
-include(src/plat/exynos4/config.cmake)
-include(src/plat/exynos5/config.cmake)
-include(src/plat/am335x/config.cmake)
-include(src/plat/hikey/config.cmake)
-include(src/plat/apq8064/config.cmake)
-include(src/plat/bcm2837/config.cmake)
-include(src/plat/tk1/config.cmake)
-include(src/plat/tx1/config.cmake)
-include(src/plat/tx2/config.cmake)
-include(src/plat/zynq7000/config.cmake)
-include(src/plat/zynqmp/config.cmake)
-include(src/plat/odroidc2/config.cmake)
-
-# Now enshrine all the common variables in the config
-config_set(KernelArmCortexA7 ARM_CORTEX_A7 "${KernelArmCortexA7}")
-config_set(KernelArmCortexA8 ARM_CORTEX_A8 "${KernelArmCortexA8}")
-config_set(KernelArmCortexA9 ARM_CORTEX_A9 "${KernelArmCortexA9}")
-config_set(KernelArmCortexA15 ARM_CORTEX_A15 "${KernelArmCortexA15}")
-config_set(KernelArmCortexA53 ARM_CORTEX_A53 "${KernelArmCortexA53}")
-config_set(KernelArmCortexA57 ARM_CORTEX_A57 "${KernelArmCortexA57}")
-config_set(KernelArm1136JF_S ARM1136JF_S "${KernelArm1136JF_S}")
-config_set(KernelArchArmV6 ARCH_ARM_V6 "${KernelArchArmV6}")
-config_set(KernelArchArmV7a ARCH_ARM_V7A "${KernelArchArmV7a}")
-config_set(KernelArchArmV7ve ARCH_ARM_V7VE "${KernelArchArmV7ve}")
-config_set(KernelArchArmV8a ARCH_ARM_V8A "${KernelArchArmV8a}")
-config_set(KernelArmPASizeBits40 ARM_PA_SIZE_BITS_40 "${KernelArmPASizeBits40}")
-config_set(KernelArmPASizeBits44 ARM_PA_SIZE_BITS_44 "${KernelArmPASizeBits44}")
-
-# Check for v7ve before v7a as v7ve is a superset and we want to set the
-# actual armv to that, but leave armv7a config enabled for anything that
-# checks directly against it
-if(KernelArchArmV7ve)
-    set(KernelArmArmV "armv7ve" CACHE INTERNAL "")
-elseif(KernelArchArmV7a)
-    set(KernelArmArmV "armv7-a" CACHE INTERNAL "")
-elseif(KernelArchArmV8a)
-    set(KernelArmArmV "armv8-a" CACHE INTERNAL "")
-elseif(KernelArchArmV6)
-    set(KernelArmArmV "armv6" CACHE INTERNAL "")
-endif()
-if(KernelArmCortexA7)
-    set(KernelArmCPU "cortex-a7" CACHE INTERNAL "")
-elseif(KernelArmCortexA8)
-    set(KernelArmCPU "cortex-a8" CACHE INTERNAL "")
-elseif(KernelArmCortexA9)
-    set(KernelArmCPU "cortex-a9" CACHE INTERNAL "")
-elseif(KernelArmCortexA15)
-    set(KernelArmCPU "cortex-a15" CACHE INTERNAL "")
-elseif(KernelArmCortexA53)
-    set(KernelArmCPU "cortex-a53" CACHE INTERNAL "")
-elseif(KernelArmCortexA57)
-    set(KernelArmCPU "cortex-a57" CACHE INTERNAL "")
-elseif(KernelArm1136JF_S)
-    set(KernelArmCPU "arm1136jf-s" CACHE INTERNAL "")
-endif()
-if(KernelArchARM)
-    config_set(KernelArmMach ARM_MACH "${KernelArmMach}")
-endif()
-
 include(src/arch/arm/armv/armv6/config.cmake)
 include(src/arch/arm/armv/armv7-a/config.cmake)
 include(src/arch/arm/armv/armv8-a/config.cmake)
@@ -213,11 +69,15 @@ config_option(
     DEFAULT OFF
     DEPENDS "KernelArchARM"
 )
-
+if(KernelSel4ArchArmHyp)
+    set(default_hyp_support ON)
+else()
+    set(default_hyp_support OFF)
+endif()
 config_option(
     KernelArmHypervisorSupport ARM_HYPERVISOR_SUPPORT
     "Build as Hypervisor. Utilise ARM virtualisation extensions to build the kernel as a hypervisor"
-    DEFAULT OFF
+    DEFAULT ${default_hyp_support}
     DEPENDS "KernelArmCortexA15 OR KernelArmCortexA57"
 )
 
diff --git a/src/arch/riscv/config.cmake b/src/arch/riscv/config.cmake
index cbce46c31..460eb430e 100644
--- a/src/arch/riscv/config.cmake
+++ b/src/arch/riscv/config.cmake
@@ -12,36 +12,6 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-config_choice(
-    KernelRiscVSel4Arch
-    RISCV_SEL4_ARCH
-    "Architecture mode for building the kernel"
-    "riscv32;KernelSel4ArchRiscV32;ARCH_RISCV32;KernelArchRiscV"
-    "riscv64;KernelSel4ArchRiscV64;ARCH_RISCV64;KernelArchRiscV"
-)
-
-config_choice(
-    KernelRiscVPlatform
-    RISCV_PLAT
-    "Select the platform for the architecture"
-    "spike;KernelPlatformSpike;PLAT_SPIKE;KernelArchRiscV"
-    "hifive;KernelPlatformHifive;PLAT_HIFIVE;KernelSel4ArchRiscV64"
-)
-
-# Include all the platforms.
-include(src/plat/spike/config.cmake)
-include(src/plat/hifive/config.cmake)
-
-if(KernelArchRiscV)
-    config_set(KernelSel4Arch SEL4_ARCH "${KernelRiscVSel4Arch}")
-endif()
-
-if(KernelSel4ArchRiscV32)
-    set_kernel_32()
-elseif(KernelSel4ArchRiscV64)
-    set_kernel_64()
-endif()
-
 config_string(
     KernelPTLevels PT_LEVELS "Number of page \
     table levels for RISC-V depends on the mode. For example there are: \
diff --git a/src/arch/x86/config.cmake b/src/arch/x86/config.cmake
index aeefbc379..5cf9201b3 100644
--- a/src/arch/x86/config.cmake
+++ b/src/arch/x86/config.cmake
@@ -12,35 +12,16 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-config_choice(
-    KernelX86Sel4Arch
-    X86_SEL4_ARCH
-    "Architecture mode for building the kernel"
-    "x86_64;KernelSel4ArchX86_64;ARCH_X86_64;KernelArchX86"
-    "ia32;KernelSel4ArchIA32;ARCH_IA32;KernelArchX86"
-)
-
-# Add any top level types
-if(KernelSel4ArchX86_64)
-    set_property(TARGET kernel_config_target APPEND PROPERTY TOPLEVELTYPES pdpte_C pml4e_C)
-endif()
-
 if(KernelArchX86)
-    # Only one platform so just force it to be set
-    config_set(KernelPlatform PLAT "pc99")
-    config_set(KernelPlatPC99 PLAT_PC99 ON)
-    config_set(KernelSel4Arch SEL4_ARCH "${KernelX86Sel4Arch}")
+    set_property(TARGET kernel_config_target APPEND PROPERTY TOPLEVELTYPES pde_C)
     # x86 always has an FPU
     set(KernelHaveFPU ON)
-    set_property(TARGET kernel_config_target APPEND PROPERTY TOPLEVELTYPES pde_C)
-else()
-    config_set(KernelPlatPC99 PLAT_PC99 OFF)
+
 endif()
 
+# Add any top level types
 if(KernelSel4ArchX86_64)
-    set_kernel_64()
-elseif(KernelSel4ArchIA32)
-    set_kernel_32()
+    set_property(TARGET kernel_config_target APPEND PROPERTY TOPLEVELTYPES pdpte_C pml4e_C)
 endif()
 
 config_choice(
@@ -391,7 +372,5 @@ add_sources(DEP "KernelArchX86;KernelDebugBuild" CFILES src/arch/x86/machine/cap
 
 add_bf_source_old("KernelArchX86" "structures.bf" "include/arch/x86" "arch/object")
 
-include(src/plat/pc99/config.cmake)
-
 include(src/arch/x86/32/config.cmake)
 include(src/arch/x86/64/config.cmake)
diff --git a/src/plat/allwinnerA20/config.cmake b/src/plat/allwinnerA20/config.cmake
index 52c18d9bb..85ccd601a 100644
--- a/src/plat/allwinnerA20/config.cmake
+++ b/src/plat/allwinnerA20/config.cmake
@@ -12,12 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(allwinnera20 KernelPlatformAllwinnerA20 PLAT_ALLWINNERA20 KernelSel4ArchAarch32)
+
 if(KernelPlatformAllwinnerA20)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA7 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatAllwinnerA20 PLAT_ALLWINNERA20 ON)
-    config_set(KernelPlatform PLAT "allwinnerA20")
-    set(KernelArmMach "allwinner" CACHE INTERNAL "")
+    config_set(KernelARMPlatform ARM_PLAT allwinnera20)
     list(APPEND KernelDTSList "tools/dts/allwinnera20.dts")
     list(APPEND KernelDTSList "src/plat/allwinnerA20/overlay-allwinnera20.dts")
 
@@ -27,11 +28,9 @@ if(KernelPlatformAllwinnerA20)
         TIMER drivers/timer/allwinner.h
         INTERRUPT_CONTROLLER arch/machine/gic_pl390.h
     )
-else()
-    config_set(KernelPlatAllwinnerA20 PLAT_ALLWINNERA20 OFF)
 endif()
 
 add_sources(
-    DEP "KernelPlatAllwinnerA20"
+    DEP "KernelPlatformAllwinnerA20"
     CFILES src/plat/allwinnerA20/machine/l2cache.c src/arch/arm/machine/gic_pl390.c
 )
diff --git a/src/plat/am335x/config.cmake b/src/plat/am335x/config.cmake
index a3974c6ea..06ad5f881 100644
--- a/src/plat/am335x/config.cmake
+++ b/src/plat/am335x/config.cmake
@@ -12,16 +12,37 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-if(KernelPlatformAM335XBoneBlack OR KernelPlatformAM335XBoneBlue)
+declare_platform(am335x KernelPlatformAM335X PLAT_AM335X KernelSel4ArchAarch32)
+set(c_configs PLAT_AM335X_BONEBLACK PLAT_AM335X_BONEBLUE)
+set(cmake_configs KernelPlatformAM335XBoneBlack KernelPlatformAM335XBoneBlue)
+set(plat_lists am335x-boneblack am335x-boneblue)
+foreach(config IN LISTS cmake_configs)
+    unset(${config} CACHE)
+endforeach()
+
+if(KernelPlatformAM335X)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA8 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatform PLAT "am335x")
-    config_set(KernelPlatformAM335X PLAT_AM335X ON)
-    if(KernelPlatformAM335XBoneBlack)
-        list(APPEND KernelDTSList "tools/dts/am335x-boneblack.dts")
+    if("${KernelARMPlatform}" STREQUAL "")
+        message(
+            STATUS "Selected platform am335x supports multiple sub platforms but none were given"
+        )
+        message(STATUS "  Defaulting to am335x-boneblack")
+        set(KernelARMPlatform am335x-boneblack)
+    endif()
+    list(FIND plat_lists ${KernelARMPlatform} index)
+    if("${index}" STREQUAL "-1")
+        message(FATAL_ERROR "Which am335x platform not specified")
+    endif()
+
+    list(GET c_configs ${index} c_config)
+    list(GET cmake_configs ${index} cmake_config)
+    config_set(KernelARMPlatform ARM_PLAT ${KernelARMPlatform})
+    config_set(${cmake_config} ${c_config} ON)
+    list(APPEND KernelDTSList "tools/dts/${KernelARMPlatform}.dts")
+    if("${KernelARMPlatform}" STREQUAL "am335x-boneblack")
         list(APPEND KernelDTSList "src/plat/am335x/overlay-am335x-boneblack.dts")
-    elseif(KernelPlatformAM335XBoneBlue)
-        list(APPEND KernelDTSList "tools/dts/am335x-boneblue.dts")
     endif()
     list(APPEND KernelDTSList "src/plat/am335x/overlay-am335x.dts")
 
diff --git a/src/plat/apq8064/config.cmake b/src/plat/apq8064/config.cmake
index 88227133c..9ac41fe9b 100644
--- a/src/plat/apq8064/config.cmake
+++ b/src/plat/apq8064/config.cmake
@@ -12,11 +12,14 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(apq8064 KernelPlatformAPQ8064 PLAT_APQ8064 KernelSel4ArchAarch32)
+
 if(KernelPlatformAPQ8064)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA15 ON)
     set(KernelArchArmV7a ON)
     set(KernelArchArmV7ve ON)
-    config_set(KernelPlatform PLAT "apq8064")
+    config_set(KernelARMPlatform ARM_PLAT apq8064)
     list(APPEND KernelDTSList "tools/dts/apq8064.dts")
     list(APPEND KernelDTSList "src/plat/apq8064/overlay-apq8064.dts")
 
diff --git a/src/plat/bcm2837/config.cmake b/src/plat/bcm2837/config.cmake
index df284a119..ea074cc57 100644
--- a/src/plat/bcm2837/config.cmake
+++ b/src/plat/bcm2837/config.cmake
@@ -12,10 +12,23 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(bcm2837 KernelPlatformRpi3 PLAT_BCM2837 KernelArchARM)
+
 if(KernelPlatformRpi3)
+    if("${KernelSel4Arch}" STREQUAL aarch32)
+        declare_seL4_arch(aarch32)
+    elseif("${KernelSel4Arch}" STREQUAL aarch64)
+        declare_seL4_arch(aarch64)
+    else()
+        message(
+            STATUS "Selected platform bcm2837 supports multiple architectures but none were given"
+        )
+        message(STATUS "  Defaulting to aarch32")
+        declare_seL4_arch(aarch32)
+    endif()
     set(KernelArmCortexA53 ON)
     set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "bcm2837")
+    config_set(KernelARMPlatform ARM_PLAT rpi3)
     set(KernelArmMachFeatureModifiers "+crc" CACHE INTERNAL "")
     list(APPEND KernelDTSList "tools/dts/rpi3.dts")
     list(APPEND KernelDTSList "src/plat/bcm2837/overlay-rpi3.dts")
diff --git a/src/plat/exynos4/config.cmake b/src/plat/exynos4/config.cmake
index 352b55045..1cc8a7883 100644
--- a/src/plat/exynos4/config.cmake
+++ b/src/plat/exynos4/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(exynos4 KernelPlatformExynos4 PLAT_EXYNOS4 KernelSel4ArchAarch32)
+
 if(KernelPlatformExynos4)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA9 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatform PLAT "exynos4")
+    config_set(KernelARMPlatform ARM_PLAT exynos4)
     config_set(KernelArmMach MACH "exynos")
     list(APPEND KernelDTSList "tools/dts/exynos4.dts")
     list(APPEND KernelDTSList "src/plat/exynos4/overlay-exynos4.dts")
diff --git a/src/plat/exynos5/config.cmake b/src/plat/exynos5/config.cmake
index 82222085c..67ec5ccdb 100644
--- a/src/plat/exynos5/config.cmake
+++ b/src/plat/exynos5/config.cmake
@@ -12,16 +12,57 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-if(KernelPlatformExynos5250 OR KernelPlatformExynos5410 OR KernelPlatformExynos5422)
+declare_platform(
+    exynos5
+    KernelPlatExynos5
+    PLAT_EXYNOS5
+    "KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp"
+)
+
+set(cmake_configs KernelPlatformExynos5250 KernelPlatformExynos5410 KernelPlatformExynos5422)
+set(c_configs PLAT_EXYNOS5250 PLAT_EXYNOS5410 PLAT_EXYNOS5422)
+set(plat_lists exynos5250 exynos5410 exynos5422)
+foreach(config IN LISTS cmake_configs)
+    unset(${config} CACHE)
+endforeach()
+unset(KernelPlatExynos54xx CACHE)
+if(KernelPlatExynos5)
+    if("${KernelSel4Arch}" STREQUAL aarch32)
+        declare_seL4_arch(aarch32)
+    elseif("${KernelSel4Arch}" STREQUAL arm_hyp)
+        declare_seL4_arch(arm_hyp)
+    else()
+        message(
+            STATUS "Selected platform exynos5 supports multiple architectures but none were given"
+        )
+        message(STATUS "  Defaulting to aarch32")
+        declare_seL4_arch(aarch32)
+    endif()
     set(KernelArmCortexA15 ON)
     set(KernelArchArmV7ve ON)
     # v7ve is a superset of v7a, so we enable that as well
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatform PLAT "exynos5")
     config_set(KernelArmMach MACH "exynos")
-    config_set(KernelPlatExynos5 PLAT_EXYNOS5 ON)
+    if("${KernelARMPlatform}" STREQUAL "")
+        message(
+            STATUS "Selected platform exynos5 supports multiple sub platforms but none were given"
+        )
+        message(STATUS "  Defaulting to exynos5250")
+        set(KernelARMPlatform exynos5250)
+    endif()
+
+    list(FIND plat_lists "${KernelARMPlatform}" index)
+    if("${index}" STREQUAL "-1")
+        message(FATAL_ERROR "Invalid exynos5 platform selected: \"${KernelARMPlatform}\"")
+    endif()
+    list(GET c_configs ${index} c_config)
+    list(GET cmake_configs ${index} cmake_config)
+    config_set(KernelARMPlatform ARM_PLAT ${KernelARMPlatform})
+    config_set(${cmake_config} ${c_config} ON)
     if(KernelPlatformExynos5410 OR KernelPlatformExynos5422)
         config_set(KernelPlatExynos54xx PLAT_EXYNOS54XX ON)
+    else()
+        config_set(KernelPlatExynos54xx PLAT_EXYNOS54XX OFF)
     endif()
 
     list(APPEND KernelDTSList "tools/dts/${KernelARMPlatform}.dts")
@@ -32,9 +73,6 @@ if(KernelPlatformExynos5250 OR KernelPlatformExynos5410 OR KernelPlatformExynos5
         TIMER drivers/timer/arm_generic.h
         INTERRUPT_CONTROLLER arch/machine/gic_pl390.h
     )
-else()
-    config_set(KernelPlatExynos5 PLAT_EXYNOS5 OFF)
-    config_set(KernelPlatExynos54xx PLAT_EXYNOS54XX OFF)
 endif()
 
 add_sources(
diff --git a/src/plat/hifive/config.cmake b/src/plat/hifive/config.cmake
index 140021245..d77a0ee76 100644
--- a/src/plat/hifive/config.cmake
+++ b/src/plat/hifive/config.cmake
@@ -14,12 +14,17 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(hifive KernelPlatformHifive PLAT_HIFIVE KernelSel4ArchRiscV64)
+
 if(KernelPlatformHifive)
-    config_set(KernelPlatform PLAT "hifive")
+    declare_seL4_arch(riscv64)
+    config_set(KernelRiscVPlatform RISCV_PLAT "hifive")
     config_set(KernelPlatformFirstHartID FIRST_HART_ID 1)
     list(APPEND KernelDTSList "tools/dts/hifive.dts")
     declare_default_headers(
         TIMER_FREQUENCY 10000000llu PLIC_MAX_NUM_INT 53
         INTERRUPT_CONTROLLER drivers/irq/hifive.h
     )
+else()
+    unset(KernelPlatformFirstHartID CACHE)
 endif()
diff --git a/src/plat/hikey/config.cmake b/src/plat/hikey/config.cmake
index 675911344..eaf89e653 100644
--- a/src/plat/hikey/config.cmake
+++ b/src/plat/hikey/config.cmake
@@ -12,6 +12,34 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(hikey KernelPlatformHikey PLAT_HIKEY KernelArchARM)
+
+if(KernelPlatformHikey)
+    if("${KernelSel4Arch}" STREQUAL aarch32)
+        declare_seL4_arch(aarch32)
+    elseif("${KernelSel4Arch}" STREQUAL aarch64)
+        declare_seL4_arch(aarch64)
+    else()
+        message(
+            STATUS "Selected platform hikey supports multiple architectures but none were given"
+        )
+        message(STATUS "  Defaulting to aarch32")
+        declare_seL4_arch(aarch32)
+    endif()
+    set(KernelArmCortexA53 ON)
+    set(KernelArchArmV8a ON)
+    config_set(KernelARMPlatform ARM_PLAT hikey)
+    set(KernelArmMachFeatureModifiers "+crc" CACHE INTERNAL "")
+    list(APPEND KernelDTSList "tools/dts/hikey.dts")
+    list(APPEND KernelDTSList "src/plat/hikey/overlay-hikey.dts")
+    declare_default_headers(
+        TIMER_FREQUENCY 1200000llu
+        MAX_IRQ 159
+        TIMER drivers/timer/arm_generic.h
+        INTERRUPT_CONTROLLER arch/machine/gic_pl390.h
+    )
+endif()
+
 config_string(
     KernelArmHikeyOutstandingPrefetchers ARM_HIKEY_OUTSTANDING_PREFETCHERS
     "Number of outstanding prefetch allowed \
@@ -64,21 +92,6 @@ config_option(
     DEPENDS "KernelPlatformHikey;NOT KernelDebugDisablePrefetchers"
 )
 
-if(KernelPlatformHikey)
-    set(KernelArmCortexA53 ON)
-    set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "hikey")
-    set(KernelArmMachFeatureModifiers "+crc" CACHE INTERNAL "")
-    list(APPEND KernelDTSList "tools/dts/hikey.dts")
-    list(APPEND KernelDTSList "src/plat/hikey/overlay-hikey.dts")
-    declare_default_headers(
-        TIMER_FREQUENCY 1200000llu
-        MAX_IRQ 159
-        TIMER drivers/timer/arm_generic.h
-        INTERRUPT_CONTROLLER arch/machine/gic_pl390.h
-    )
-endif()
-
 add_sources(
     DEP "KernelPlatformHikey"
     CFILES src/arch/arm/machine/gic_pl390.c src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/imx31/config.cmake b/src/plat/imx31/config.cmake
index 8fda8e100..689262f61 100644
--- a/src/plat/imx31/config.cmake
+++ b/src/plat/imx31/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(imx31 KernelPlatformKZM PLAT_KZM KernelSel4ArchAarch32)
+
 if(KernelPlatformKZM)
+    declare_seL4_arch(aarch32)
     set(KernelArm1136JF_S ON)
     set(KernelArchArmV6 ON)
-    config_set(KernelPlatform PLAT "imx31")
+    config_set(KernelARMPlatform ARM_PLAT kzm)
     set(KernelArmMach "imx" CACHE INTERNAL "")
     list(APPEND KernelDTSList "tools/dts/kzm.dts")
     list(APPEND KernelDTSList "src/plat/imx31/overlay-kzm.dts")
diff --git a/src/plat/imx6/config.cmake b/src/plat/imx6/config.cmake
index 8d405b964..220a9ab28 100644
--- a/src/plat/imx6/config.cmake
+++ b/src/plat/imx6/config.cmake
@@ -12,29 +12,40 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-if(KernelPlatformWandQ OR KernelPlatformSabre)
+declare_platform(imx6 KernelPlatImx6 PLAT_IMX6 KernelSel4ArchAarch32)
+
+set(c_configs PLAT_SABRE PLAT_WANDQ)
+set(cmake_configs KernelPlatformSabre KernelPlatformWandQ)
+set(plat_lists sabre wandq)
+foreach(config IN LISTS cmake_configs)
+    unset(${config} CACHE)
+endforeach()
+if(KernelPlatImx6)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA9 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatImx6 PLAT_IMX6 ON)
-    config_set(KernelPlatform PLAT "imx6")
     set(KernelArmMach "imx" CACHE INTERNAL "")
-
-    if(KernelPlatformWandQ)
-        list(APPEND KernelDTSList "tools/dts/wandq.dts")
-        list(APPEND KernelDTSList "src/plat/imx6/overlay-wandq.dts")
-    else()
-        list(APPEND KernelDTSList "tools/dts/sabre.dts")
-        list(APPEND KernelDTSList "src/plat/imx6/overlay-sabre.dts")
+    if("${KernelARMPlatform}" STREQUAL "")
+        message(STATUS "Selected platform imx6 supports multiple sub platforms but none were given")
+        message(STATUS "  Defaulting to sabre")
+        set(KernelARMPlatform sabre)
     endif()
-
+    list(FIND plat_lists ${KernelARMPlatform} index)
+    if("${index}" STREQUAL "-1")
+        message(FATAL_ERROR "Which imx6 platform not specified")
+    endif()
+    list(GET c_configs ${index} c_config)
+    list(GET cmake_configs ${index} cmake_config)
+    config_set(KernelARMPlatform ARM_PLAT ${KernelARMPlatform})
+    config_set(${cmake_config} ${c_config} ON)
+    list(APPEND KernelDTSList "tools/dts/${KernelARMPlatform}.dts")
+    list(APPEND KernelDTSList "src/plat/imx6/overlay-${KernelARMPlatform}.dts")
     declare_default_headers(
         TIMER_FREQUENCY 400000000llu
         MAX_IRQ 159
         INTERRUPT_CONTROLLER arch/machine/gic_pl390.h
         TIMER drivers/timer/arm_priv.h
     )
-else()
-    config_set(KernelPlatImx6 PLAT_IMX6 OFF)
 endif()
 
 add_sources(
diff --git a/src/plat/imx7/config.cmake b/src/plat/imx7/config.cmake
index c60cb59fd..e11c0477d 100644
--- a/src/plat/imx7/config.cmake
+++ b/src/plat/imx7/config.cmake
@@ -12,11 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
-if(KernelPlatformImx7Sabre)
+declare_platform(imx7 KernelPlatImx7 PLAT_IMX7_SABRE KernelSel4ArchAarch32)
+
+if(KernelPlatImx7)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA7 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatImx7 PLAT_IMX7 ON)
-    config_set(KernelPlatform PLAT "imx7")
+    config_set(KernelARMPlatform ARM_PLAT imx7sabre)
     set(KernelArmMach "imx" CACHE INTERNAL "")
     list(APPEND KernelDTSList "tools/dts/imx7sabre.dts")
     list(APPEND KernelDTSList "src/plat/imx7/overlay-imx7sabre.dts")
diff --git a/src/plat/odroidc2/config.cmake b/src/plat/odroidc2/config.cmake
index f19cb3a91..a009515e1 100644
--- a/src/plat/odroidc2/config.cmake
+++ b/src/plat/odroidc2/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(odroidc2 KernelPlatformOdroidc2 PLAT_ODROIDC2 KernelSel4ArchAarch64)
+
 if(KernelPlatformOdroidc2)
+    declare_seL4_arch(aarch64)
     set(KernelArmCortexA53 ON)
     set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "odroidc2")
+    config_set(KernelARMPlatform ARM_PLAT odroidc2)
     set(KernelArmMachFeatureModifiers "+crc" CACHE INTERNAL "")
     list(APPEND KernelDTSList "tools/dts/odroidc2.dts")
     declare_default_headers(
diff --git a/src/plat/omap3/config.cmake b/src/plat/omap3/config.cmake
index 05d443133..f5d3ad87e 100644
--- a/src/plat/omap3/config.cmake
+++ b/src/plat/omap3/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(omap3 KernelPlatformOMAP3 PLAT_OMAP3 KernelSel4ArchAarch32)
+
 if(KernelPlatformOMAP3)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA8 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatform PLAT "omap3")
+    config_set(KernelARMPlatform ARM_PLAT omap3)
     config_set(KernelArmMach MACH "omap")
     list(APPEND KernelDTSList "tools/dts/omap3.dts")
     list(APPEND KernelDTSList "src/plat/omap3/overlay-omap3.dts")
diff --git a/src/plat/pc99/config.cmake b/src/plat/pc99/config.cmake
index b3dc63ddd..2fac9de60 100644
--- a/src/plat/pc99/config.cmake
+++ b/src/plat/pc99/config.cmake
@@ -12,6 +12,21 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(pc99 KernelPlatPC99 PLAT_PC99 KernelArchX86)
+
+if(KernelPlatPC99)
+    if("${KernelSel4Arch}" STREQUAL ia32)
+        declare_seL4_arch(ia32)
+    elseif("${KernelSel4Arch}" STREQUAL x86_64)
+        declare_seL4_arch(x86_64)
+    else()
+        message(STATUS "Selected platform pc99 supports multiple architectures but none were given")
+        message(STATUS "  Defaulting to x86_64")
+        declare_seL4_arch(x86_64)
+    endif()
+
+endif()
+
 config_option(
     KernelIOMMU IOMMU "IOMMU support for VT-d enabled chipset"
     DEFAULT ON
diff --git a/src/plat/spike/config.cmake b/src/plat/spike/config.cmake
index 8d44c5cf0..bedf95a69 100644
--- a/src/plat/spike/config.cmake
+++ b/src/plat/spike/config.cmake
@@ -14,8 +14,21 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(spike KernelPlatformSpike PLAT_SPIKE KernelArchRiscV)
+
 if(KernelPlatformSpike)
-    config_set(KernelPlatform PLAT "spike")
+    if("${KernelSel4Arch}" STREQUAL riscv32)
+        declare_seL4_arch(riscv32)
+    elseif("${KernelSel4Arch}" STREQUAL riscv64)
+        declare_seL4_arch(riscv64)
+    else()
+        message(
+            STATUS "Selected platform spike supports multiple architectures but none were given"
+        )
+        message(STATUS "  Defaulting to riscv64")
+        declare_seL4_arch(riscv64)
+    endif()
+    config_set(KernelRiscVPlatform RISCV_PLAT "spike")
     config_set(KernelPlatformFirstHartID FIRST_HART_ID 0)
     if(KernelSel4ArchRiscV32)
         list(APPEND KernelDTSList "tools/dts/spike32.dts")
@@ -26,4 +39,6 @@ if(KernelPlatformSpike)
         TIMER_FREQUENCY 10000000llu PLIC_MAX_NUM_INT 0
         INTERRUPT_CONTROLLER arch/machine/plic.h
     )
+else()
+    unset(KernelPlatformFirstHartID CACHE)
 endif()
diff --git a/src/plat/tk1/config.cmake b/src/plat/tk1/config.cmake
index d6a919195..862f9be1e 100644
--- a/src/plat/tk1/config.cmake
+++ b/src/plat/tk1/config.cmake
@@ -12,11 +12,22 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(tk1 KernelPlatformTK1 PLAT_TK1 "KernelSel4ArchAarch32 OR KernelSel4ArchArmHyp")
+
 if(KernelPlatformTK1)
+    if("${KernelSel4Arch}" STREQUAL aarch32)
+        declare_seL4_arch(aarch32)
+    elseif("${KernelSel4Arch}" STREQUAL arm_hyp)
+        declare_seL4_arch(arm_hyp)
+    else()
+        message(STATUS "Selected platform tk1 supports multiple architectures but none were given")
+        message(STATUS "  Defaulting to aarch32")
+        declare_seL4_arch(aarch32)
+    endif()
     set(KernelArmCortexA15 ON)
     set(KernelArchArmV7a ON)
     set(KernelArchArmV7ve ON)
-    config_set(KernelPlatform PLAT "tk1")
+    config_set(KernelARMPlatform ARM_PLAT tk1)
     config_set(KernelArmMach MACH "nvidia")
     list(APPEND KernelDTSList "tools/dts/tk1.dts")
     list(APPEND KernelDTSList "src/plat/tk1/overlay-tk1.dts")
diff --git a/src/plat/tx1/config.cmake b/src/plat/tx1/config.cmake
index 677c35883..b4380bd36 100644
--- a/src/plat/tx1/config.cmake
+++ b/src/plat/tx1/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(tx1 KernelPlatformTx1 PLAT_TX1 KernelSel4ArchAarch64)
+
 if(KernelPlatformTx1)
+    declare_seL4_arch(aarch64)
     set(KernelArmCortexA57 ON)
     set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "tx1")
+    config_set(KernelARMPlatform ARM_PLAT tx1)
     config_set(KernelArmMach MACH "nvidia")
     set(KernelArmPASizeBits44 ON)
     list(APPEND KernelDTSList "tools/dts/tx1.dts")
diff --git a/src/plat/tx2/config.cmake b/src/plat/tx2/config.cmake
index 3a339be7f..618cfdb05 100644
--- a/src/plat/tx2/config.cmake
+++ b/src/plat/tx2/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(tx2 KernelPlatformTx2 PLAT_TX2 KernelSel4ArchAarch64)
+
 if(KernelPlatformTx2)
+    declare_seL4_arch(aarch64)
     set(KernelArmCortexA57 ON)
     set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "tx2")
+    config_set(KernelARMPlatform ARM_PLAT tx2)
     config_set(KernelArmMach MACH "nvidia")
     # Note that the 44-bit PA is only for Cortex-A57 cores.
     # If we enable the Denver 2 cores, which support 40-bit PA,
diff --git a/src/plat/zynq7000/config.cmake b/src/plat/zynq7000/config.cmake
index 7560d3b38..ce65c2185 100644
--- a/src/plat/zynq7000/config.cmake
+++ b/src/plat/zynq7000/config.cmake
@@ -12,10 +12,13 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(zynq7000 KernelPlatformZynq7000 PLAT_ZYNQ7000 KernelSel4ArchAarch32)
+
 if(KernelPlatformZynq7000)
+    declare_seL4_arch(aarch32)
     set(KernelArmCortexA9 ON)
     set(KernelArchArmV7a ON)
-    config_set(KernelPlatform PLAT "zynq7000")
+    config_set(KernelARMPlatform ARM_PLAT zynq7000)
     config_set(KernelArmMach MACH "zynq")
     list(APPEND KernelDTSList "tools/dts/zynq7000.dts")
     declare_default_headers(
diff --git a/src/plat/zynqmp/config.cmake b/src/plat/zynqmp/config.cmake
index bb71f16f4..c17799ea1 100644
--- a/src/plat/zynqmp/config.cmake
+++ b/src/plat/zynqmp/config.cmake
@@ -12,17 +12,30 @@
 
 cmake_minimum_required(VERSION 3.7.2)
 
+declare_platform(ultra96 KernelPlatformUltra96 PLAT_ZYNQMP_ULTRA96 KernelArchARM)
+declare_platform(zynqmp KernelPlatformZynqmp PLAT_ZYNQMP KernelArchARM)
+
 if(KernelPlatformUltra96)
     # Ultra96 is is basically Zynqmp
     list(APPEND KernelDTSList "tools/dts/ultra96.dts")
     config_set(KernelPlatformZynqmp PLAT_ZYNQMP ON)
-    config_set(KernelPlatformZynqmpUltra96 PLAT_ZYNQMP_ULTRA96 ON)
 endif()
 
 if(KernelPlatformZynqmp)
+    if("${KernelSel4Arch}" STREQUAL aarch32)
+        declare_seL4_arch(aarch32)
+    elseif("${KernelSel4Arch}" STREQUAL aarch64)
+        declare_seL4_arch(aarch64)
+    else()
+        message(
+            STATUS "Selected platform zynqmp supports multiple architectures but none were given"
+        )
+        message(STATUS "  Defaulting to aarch64")
+        declare_seL4_arch(aarch64)
+    endif()
     set(KernelArmCortexA53 ON)
     set(KernelArchArmV8a ON)
-    config_set(KernelPlatform PLAT "zynqmp")
+    config_set(KernelARMPlatform ARM_PLAT zynqmp)
     config_set(KernelArmMach MACH "zynq")
 
     if(NOT KernelPlatformUltra96)
-- 
GitLab