diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml
index a4fcdfbc9d..e89f72bc22 100644
--- a/man/systemd-detect-virt.xml
+++ b/man/systemd-detect-virt.xml
@@ -258,6 +258,11 @@
protvirt
IBM Protected Virtualization (Secure Execution)
+
+ arm64
+ cca
+ Arm Confidential Compute Architecture
+
diff --git a/src/basic/confidential-virt.c b/src/basic/confidential-virt.c
index 986a57e046..796ae6143c 100644
--- a/src/basic/confidential-virt.c
+++ b/src/basic/confidential-virt.c
@@ -10,6 +10,7 @@
#include "confidential-virt-fundamental.h"
#include "confidential-virt.h"
+#include "errno-util.h"
#include "fd-util.h"
#include "fileio.h"
#include "missing_threads.h"
@@ -226,7 +227,18 @@ static ConfidentialVirtualization detect_confidential_virtualization_impl(void)
return CONFIDENTIAL_VIRTUALIZATION_NONE;
}
+#elif defined(__aarch64__)
+static ConfidentialVirtualization detect_confidential_virtualization_impl(void) {
+ int r;
+ r = RET_NERRNO(access("/sys/devices/platform/arm-cca-dev", F_OK));
+ if (r < 0) {
+ log_debug_errno(r, "Unable to check /sys/devices/platform/arm-cca-dev: %m");
+ return CONFIDENTIAL_VIRTUALIZATION_NONE;
+ }
+
+ return CONFIDENTIAL_VIRTUALIZATION_CCA;
+}
#else /* ! x86_64 */
static ConfidentialVirtualization detect_confidential_virtualization_impl(void) {
log_debug("No confidential virtualization detection on this architecture");
@@ -250,6 +262,7 @@ static const char *const confidential_virtualization_table[_CONFIDENTIAL_VIRTUAL
[CONFIDENTIAL_VIRTUALIZATION_SEV_SNP] = "sev-snp",
[CONFIDENTIAL_VIRTUALIZATION_TDX] = "tdx",
[CONFIDENTIAL_VIRTUALIZATION_PROTVIRT] = "protvirt",
+ [CONFIDENTIAL_VIRTUALIZATION_CCA] = "cca",
};
DEFINE_STRING_TABLE_LOOKUP(confidential_virtualization, ConfidentialVirtualization);
diff --git a/src/basic/confidential-virt.h b/src/basic/confidential-virt.h
index 07379bca7c..097bbf7cfe 100644
--- a/src/basic/confidential-virt.h
+++ b/src/basic/confidential-virt.h
@@ -14,6 +14,7 @@ typedef enum ConfidentialVirtualization {
CONFIDENTIAL_VIRTUALIZATION_SEV_SNP,
CONFIDENTIAL_VIRTUALIZATION_TDX,
CONFIDENTIAL_VIRTUALIZATION_PROTVIRT,
+ CONFIDENTIAL_VIRTUALIZATION_CCA,
_CONFIDENTIAL_VIRTUALIZATION_MAX,
_CONFIDENTIAL_VIRTUALIZATION_INVALID = -EINVAL,