]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
arch/arm64: Fix cpu and erratas for clang
authorStefan Jumarea <stefanjumarea02@gmail.com>
Tue, 20 Jun 2023 08:09:26 +0000 (11:09 +0300)
committerUnikraft <monkey@unikraft.io>
Wed, 2 Aug 2023 12:43:29 +0000 (12:43 +0000)
Previously the cpu selections and the erratas were available only when
compiling with `GCC`. This commit adds `Clang` support by checking if
the feature is available for the compiler version.

A lot of checks will also be completely removed, since minimum required
compiler versions were introduced (`GCC` >= 7, `Clang` >= 9).

Signed-off-by: Stefan Jumarea <stefanjumarea02@gmail.com>
Reviewed-by: Maria Sfiraiala <maria.sfiraiala@gmail.com>
Approved-by: Michalis Pappas <michalis@unikraft.io>
Tested-by: Unikraft CI <monkey@unikraft.io>
GitHub-Closes: #949

arch/arm/arm64/Makefile.uk

index 609c8e2e61c0eae9f782ea14bebb383d98607be2..53faa629bacf569a754705b923b95f34ca00779b 100644 (file)
@@ -67,205 +67,246 @@ ARCHFLAGS-y += -mbranch-protection=$(BRANCH_PROTECTION)
 ISR_ARCHFLAGS-y += -mbranch-protection=$(BRANCH_PROTECTION)
 endif
 
-# GCC support -mcpu=native for arm64 from 6.0
 ifeq ($(CONFIG_MCPU_ARM64_NATIVE),y)
-$(call error_if_gcc_version_lt,6,0)
-ARCHFLAGS-$(call gcc_version_ge,6,0)     += -mcpu=native
-ISR_ARCHFLAGS-$(call gcc_version_ge,6,0) += -mcpu=native
+ARCHFLAGS     += -mcpu=native
+ISR_ARCHFLAGS += -mcpu=native
 endif
 
-# GCC support -mcpu=generic for arm64 from 4.8
 ifeq ($(CONFIG_MCPU_ARM64_GENERIC),y)
-$(call error_if_gcc_version_lt,4,8)
-ARCHFLAGS-$(call gcc_version_ge,4,8)     += -mcpu=generic -mtune=generic
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,8) += -mcpu=generic -mtune=generic
+ARCHFLAGS     += -mcpu=generic -mtune=generic
+ISR_ARCHFLAGS += -mcpu=generic -mtune=generic
 endif
 
-# GCC support -mcpu=cortex-a53 for arm64 from 4.9
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A53),y)
-$(call error_if_gcc_version_lt,4,9)
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mcpu=cortex-a53 -mtune=cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mcpu=cortex-a53 -mtune=cortex-a53
+ARCHFLAGS     += -mcpu=cortex-a53 -mtune=cortex-a53
+ISR_ARCHFLAGS += -mcpu=cortex-a53 -mtune=cortex-a53
 endif
 
 # For erratum 835769
 ifeq ($(CONFIG_ARM64_ERRATUM_835769),y)
-$(call error_if_gcc_version_lt,4,9)
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mfix-cortex-a53-835769
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mfix-cortex-a53-835769
+ARCHFLAGS     += -mfix-cortex-a53-835769
+ISR_ARCHFLAGS += -mfix-cortex-a53-835769
 endif
 
 # For erratum 843419
 ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
-$(call error_if_gcc_version_lt,4,9)
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mfix-cortex-a53-843419
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mfix-cortex-a53-843419
+ifeq ($(call have_clang),y)
+$(error The workaround for erratum 843419 is only supported with GCC)
+endif
+ARCHFLAGS     += -mfix-cortex-a53-843419
+ISR_ARCHFLAGS += -mfix-cortex-a53-843419
 endif
 
-# GCC support -mcpu=cortex-a57 for arm64 from 4.9
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A57),y)
-$(call error_if_gcc_version_lt,4,9)
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mcpu=cortex-a57 -mtune=cortex-a57
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mcpu=cortex-a57 -mtune=cortex-a57
+ARCHFLAGS     += -mcpu=cortex-a57 -mtune=cortex-a57
+ISR_ARCHFLAGS += -mcpu=cortex-a57 -mtune=cortex-a57
 endif
 
-# GCC support -mcpu=cortex-a57.cortex-a53 for arm64 from 4.9
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A57_A53),y)
-$(call error_if_gcc_version_lt,4,9)
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mcpu=cortex-a57.cortex-a53
-ARCHFLAGS-$(call gcc_version_ge,4,9)     += -mtune=cortex-a57.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mcpu=cortex-a57.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,4,9) += -mtune=cortex-a57.cortex-a53
+ifeq ($(call have_clang),y)
+$(error Cortex A57-A53 CPU model is only supported with GCC)
+endif
+ARCHFLAGS     += -mcpu=cortex-a57.cortex-a53
+ARCHFLAGS     += -mtune=cortex-a57.cortex-a53
+ISR_ARCHFLAGS += -mcpu=cortex-a57.cortex-a53
+ISR_ARCHFLAGS += -mtune=cortex-a57.cortex-a53
 endif
 
-# GCC support -mcpu=cortex-a72 for arm64 from 5.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A72),y)
-$(call error_if_gcc_version_lt,5,0)
-ARCHFLAGS-$(call gcc_version_ge,5,0)     += -mcpu=cortex-a72 -mtune=cortex-a72
-ISR_ARCHFLAGS-$(call gcc_version_ge,5,0) += -mcpu=cortex-a72 -mtune=cortex-a72
+ARCHFLAGS     += -mcpu=cortex-a72 -mtune=cortex-a72
+ISR_ARCHFLAGS += -mcpu=cortex-a72 -mtune=cortex-a72
 endif
 
-# GCC support -mcpu=cortex-a72.cortex-a53 for arm64 from 5.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A72_A53),y)
-$(call error_if_gcc_version_lt,5,0)
-ARCHFLAGS-$(call gcc_version_ge,5,0)     += -mcpu=cortex-a72.cortex-a53
-ARCHFLAGS-$(call gcc_version_ge,5,0)     += -mtune=cortex-a72.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,5,0) += -mcpu=cortex-a72.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,5,0) += -mtune=cortex-a72.cortex-a53
+ifeq ($(call have_clang),y)
+$(error Cortex A72-A53 CPU model is only supported with GCC)
+endif
+ARCHFLAGS     += -mcpu=cortex-a72.cortex-a53
+ARCHFLAGS     += -mtune=cortex-a72.cortex-a53
+ISR_ARCHFLAGS += -mcpu=cortex-a72.cortex-a53
+ISR_ARCHFLAGS += -mtune=cortex-a72.cortex-a53
 endif
 
-# GCC support -mcpu=cortex-a35 for arm64 from 6.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A35),y)
-$(call error_if_gcc_version_lt,6,0)
-ARCHFLAGS-$(call gcc_version_ge,6,0)     += -mcpu=cortex-a35 -mtune=cortex-a35
-ISR_ARCHFLAGS-$(call gcc_version_ge,6,0) += -mcpu=cortex-a35 -mtune=cortex-a35
+ARCHFLAGS     += -mcpu=cortex-a35 -mtune=cortex-a35
+ISR_ARCHFLAGS += -mcpu=cortex-a35 -mtune=cortex-a35
 endif
 
-# GCC support -mcpu=cortex-a73 for arm64 from 7.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A73),y)
-$(call error_if_gcc_version_lt,7,0)
-ARCHFLAGS-$(call gcc_version_ge,7,0)     += -mcpu=cortex-a73 -mtune=cortex-a73
-ISR_ARCHFLAGS-$(call gcc_version_ge,7,0) += -mcpu=cortex-a73 -mtune=cortex-a73
+ARCHFLAGS     += -mcpu=cortex-a73 -mtune=cortex-a73
+ISR_ARCHFLAGS += -mcpu=cortex-a73 -mtune=cortex-a73
 endif
 
-# GCC support -mcpu=cortex-a73.cortex-a35 for arm64 from 7.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A73_A35),y)
-$(call error_if_gcc_version_lt,7,0)
-ARCHFLAGS-$(call gcc_version_ge,7,0)     += -mcpu=cortex-a73.cortex-a35
-ARCHFLAGS-$(call gcc_version_ge,7,0)     += -mtune=cortex-a73.cortex-a35
-ISR_ARCHFLAGS-$(call gcc_version_ge,7,0) += -mcpu=cortex-a73.cortex-a35
-ISR_ARCHFLAGS-$(call gcc_version_ge,7,0) += -mtune=cortex-a73.cortex-a35
+ifeq ($(call have_clang),y)
+$(error Cortex A73-A35 CPU model is only supported with GCC)
+endif
+ARCHFLAGS     += -mcpu=cortex-a73.cortex-a35
+ARCHFLAGS     += -mtune=cortex-a73.cortex-a35
+ISR_ARCHFLAGS += -mcpu=cortex-a73.cortex-a35
+ISR_ARCHFLAGS += -mtune=cortex-a73.cortex-a35
 endif
 
-# GCC support -mcpu=cortex-a73.cortex-a53 for arm64 from 7.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A73_A53),y)
-$(call error_if_gcc_version_lt,7,0)
-ARCHFLAGS-$(call gcc_version_ge,7,0)     += -mcpu=cortex-a73.cortex-a53
-ARCHFLAGS-$(call gcc_version_ge,7,0)     += -mtune=cortex-a73.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,7,0) += -mcpu=cortex-a73.cortex-a53
-ISR_ARCHFLAGS-$(call gcc_version_ge,7,0) += -mtune=cortex-a73.cortex-a53
+ifeq ($(call have_clang),y)
+$(error Cortex A73-A53 CPU model is only supported with GCC)
+endif
+ARCHFLAGS     += -mcpu=cortex-a73.cortex-a53
+ARCHFLAGS     += -mtune=cortex-a73.cortex-a53
+ISR_ARCHFLAGS += -mcpu=cortex-a73.cortex-a53
+ISR_ARCHFLAGS += -mtune=cortex-a73.cortex-a53
 endif
 
-# GCC support -mcpu=cortex-a55 for arm64 from 8.0
+# GCC supports -mcpu=cortex-a55 for arm64 from 8.0
+# Clang supports it from 9.0, the minimum required version
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A55),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,8,0)
-ARCHFLAGS-$(call gcc_version_ge,8,0)     += -mcpu=cortex-a55 -mtune=cortex-a55
-ISR_ARCHFLAGS-$(call gcc_version_ge,8,0) += -mcpu=cortex-a55 -mtune=cortex-a55
+endif
+ARCHFLAGS     += -mcpu=cortex-a55 -mtune=cortex-a55
+ISR_ARCHFLAGS += -mcpu=cortex-a55 -mtune=cortex-a55
 endif
 
 # GCC support -mcpu=cortex-a75 for arm64 from 8.0
+# Clang supports it from 9.0, the minimum required version
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A75),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,8,0)
-ARCHFLAGS-$(call gcc_version_ge,8,0)     += -mcpu=cortex-a75 -mtune=cortex-a75
-ISR_ARCHFLAGS-$(call gcc_version_ge,8,0) += -mcpu=cortex-a75 -mtune=cortex-a75
+endif
+ARCHFLAGS     += -mcpu=cortex-a75 -mtune=cortex-a75
+ISR_ARCHFLAGS += -mcpu=cortex-a75 -mtune=cortex-a75
 endif
 
 # GCC support -mcpu=cortex-a75.cortex-a55 for arm64 from 8.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A75_A55),y)
 $(call error_if_gcc_version_lt,8,0)
-ARCHFLAGS-$(call gcc_version_ge,8,0)     += -mcpu=cortex-a75.cortex-a55
-ARCHFLAGS-$(call gcc_version_ge,8,0)     += -mtune=cortex-a75.cortex-a55
-ISR_ARCHFLAGS-$(call gcc_version_ge,8,0) += -mcpu=cortex-a75.cortex-a55
-ISR_ARCHFLAGS-$(call gcc_version_ge,8,0) += -mtune=cortex-a75.cortex-a55
+ARCHFLAGS     += -mcpu=cortex-a75.cortex-a55
+ARCHFLAGS     += -mtune=cortex-a75.cortex-a55
+ISR_ARCHFLAGS += -mcpu=cortex-a75.cortex-a55
+ISR_ARCHFLAGS += -mtune=cortex-a75.cortex-a55
 endif
 
 # GCC support -mcpu=cortex-a76 for arm64 from 9.1
+# Clang supports it from 9.0, the minimum required version
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A76),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,9,1)
-ARCHFLAGS-$(call gcc_version_ge,9,1)     += -mcpu=cortex-a76 -mtune=cortex-a76
-ISR_ARCHFLAGS-$(call gcc_version_ge,9,1) += -mcpu=cortex-a76 -mtune=cortex-a76
+endif
+ARCHFLAGS     += -mcpu=cortex-a76 -mtune=cortex-a76
+ISR_ARCHFLAGS += -mcpu=cortex-a76 -mtune=cortex-a76
 endif
 
 # GCC support -mcpu=cortex-a76.cortex-a55 for arm64 from 9.1
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A76_A55),y)
 $(call error_if_gcc_version_lt,9,1)
-ARCHFLAGS-$(call gcc_version_ge,9,1)     += -mcpu=cortex-a76.cortex-a55
-ARCHFLAGS-$(call gcc_version_ge,9,1)     += -mtune=cortex-a76.cortex-a55
-ISR_ARCHFLAGS-$(call gcc_version_ge,9,1) += -mcpu=cortex-a76.cortex-a55
-ISR_ARCHFLAGS-$(call gcc_version_ge,9,1) += -mtune=cortex-a76.cortex-a55
+ARCHFLAGS     += -mcpu=cortex-a76.cortex-a55
+ARCHFLAGS     += -mtune=cortex-a76.cortex-a55
+ISR_ARCHFLAGS += -mcpu=cortex-a76.cortex-a55
+ISR_ARCHFLAGS += -mtune=cortex-a76.cortex-a55
 endif
 
-# GCC support -mcpu=neoverse-n1 for arm64 from 9.1
+# GCC supports -mcpu=neoverse-n1 for arm64 from 9.1
+# Clang supports -mcpu=neoverse-n1 for arm64 from 10.0
 ifeq ($(CONFIG_MCPU_ARM64_NEOVERSE_N1),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,9,1)
-ARCHFLAGS-$(call gcc_version_ge,9,1)     += -mcpu=neoverse-n1 -mtune=neoverse-n1
-ISR_ARCHFLAGS-$(call gcc_version_ge,9,1) += -mcpu=neoverse-n1 -mtune=neoverse-n1
+else
+$(call error_if_clang_version_lt,10,0)
+endif
+ARCHFLAGS     += -mcpu=neoverse-n1 -mtune=neoverse-n1
+ISR_ARCHFLAGS += -mcpu=neoverse-n1 -mtune=neoverse-n1
 endif
 
-# GCC support -mcpu=neoverse-e1 for arm64 from 9.1
+# GCC supports -mcpu=neoverse-e1 for arm64 from 9.1
+# Clang supports -mcpu=neoverse-e1 for arm64 from 10.0
 ifeq ($(CONFIG_MCPU_ARM64_NEOVERSE_E1),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,9,1)
-ARCHFLAGS-$(call gcc_version_ge,9,1)     += -mcpu=neoverse-e1 -mtune=neoverse-e1
-ISR_ARCHFLAGS-$(call gcc_version_ge,9,1) += -mcpu=neoverse-e1 -mtune=neoverse-e1
+else
+$(call error_if_clang_version_lt,10,0)
+endif
+ARCHFLAGS     += -mcpu=neoverse-e1 -mtune=neoverse-e1
+ISR_ARCHFLAGS += -mcpu=neoverse-e1 -mtune=neoverse-e1
 endif
 
-# GCC support -mcpu=cortex-a34 for arm64 from 10.1
+# GCC supports -mcpu=cortex-a34 for arm64 from 10.1
+# Clang supports -mcpu=cortex-a34 for arm64 from 11.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A34),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=cortex-a34 -mtune=cortex-a34
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=cortex-a34 -mtune=cortex-a34
+else
+$(call error_if_clang_version_lt,11,0)
+endif
+ARCHFLAGS     += -mcpu=cortex-a34 -mtune=cortex-a34
+ISR_ARCHFLAGS += -mcpu=cortex-a34 -mtune=cortex-a34
 endif
 
-# GCC support -mcpu=cortex-a65 for arm64 from 10.1
+# GCC supports -mcpu=cortex-a65 for arm64 from 10.1
+# Clang supports -mcpu=cortex-a65 for arm64 from 10.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A65),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=cortex-a65 -mtune=cortex-a65
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=cortex-a65 -mtune=cortex-a65
+else
+$(call error_if_clang_version_lt,10,0)
+endif
+ARCHFLAGS     += -mcpu=cortex-a65 -mtune=cortex-a65
+ISR_ARCHFLAGS += -mcpu=cortex-a65 -mtune=cortex-a65
 endif
 
-# GCC support -mcpu=cortex-a65ae for arm64 from 10.1
+# GCC supports -mcpu=cortex-a65ae for arm64 from 10.1
+# Clang supports -mcpu=cortex-a65ae for arm64 from 10.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A65AE),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=cortex-a65ae -mtune=cortex-a65ae
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=cortex-a65ae -mtune=cortex-a65ae
+else
+$(call error_if_clang_version_lt,10,0)
+endif
+ARCHFLAGS     += -mcpu=cortex-a65ae -mtune=cortex-a65ae
+ISR_ARCHFLAGS += -mcpu=cortex-a65ae -mtune=cortex-a65ae
 endif
 
-# GCC support -mcpu=cortex-a76ae for arm64 from 10.1
+# GCC supports -mcpu=cortex-a76ae for arm64 from 10.1
+# Clang supports it from 9.0, the minimum required version
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A76AE),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=cortex-a76ae -mtune=cortex-a76ae
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=cortex-a76ae -mtune=cortex-a76ae
+endif
+ARCHFLAGS     += -mcpu=cortex-a76ae -mtune=cortex-a76ae
+ISR_ARCHFLAGS += -mcpu=cortex-a76ae -mtune=cortex-a76ae
 endif
 
-# GCC support -mcpu=cortex-a77 for arm64 from 10.1
+# GCC supports -mcpu=cortex-a77 for arm64 from 10.1
+# Clang supports -mcpu=cortex-a77 for arm64 from 11.0
 ifeq ($(CONFIG_MCPU_ARM64_CORTEX_A77),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=cortex-a77 -mtune=cortex-a77
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=cortex-a77 -mtune=cortex-a77
+else
+$(call error_if_clang_version_lt,11,0)
+endif
+ARCHFLAGS     += -mcpu=cortex-a77 -mtune=cortex-a77
+ISR_ARCHFLAGS += -mcpu=cortex-a77 -mtune=cortex-a77
 endif
 
-# GCC support -mcpu=neoverse-n2 for arm64 from 10.1
+# GCC supports -mcpu=neoverse-n2 for arm64 from 10.1
 ifeq ($(CONFIG_MCPU_ARM64_NEOVERSE_N2),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=neoverse-n2 -mtune=neoverse-n2
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=neoverse-n2 -mtune=neoverse-n2
+else
+$(call error_if_clang_version_lt,12,0)
+endif
+ARCHFLAGS     += -mcpu=neoverse-n2 -mtune=neoverse-n2
+ISR_ARCHFLAGS += -mcpu=neoverse-n2 -mtune=neoverse-n2
 endif
 
 # GCC support -mcpu=neoverse-v1 for arm64 from 10.1
 ifeq ($(CONFIG_MCPU_ARM64_NEOVERSE_V1),y)
+ifeq ($(call have_gcc),y)
 $(call error_if_gcc_version_lt,10,1)
-ARCHFLAGS-$(call gcc_version_ge,10,1)     += -mcpu=neoverse-v1 -mtune=neoverse-v1
-ISR_ARCHFLAGS-$(call gcc_version_ge,10,1) += -mcpu=neoverse-v1 -mtune=neoverse-v1
+else
+$(call error_if_clang_version_lt,12,0)
+endif
+ARCHFLAGS     += -mcpu=neoverse-v1 -mtune=neoverse-v1
+ISR_ARCHFLAGS += -mcpu=neoverse-v1 -mtune=neoverse-v1
 endif
 
 $(eval $(call addlib,libarm64arch))