From: Kohei Enju <enju.kohei@fujitsu.com>
To: Yeoreum Yun <yeoreum.yun@arm.com>
Cc: linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Jason Gunthorpe <jgg@ziepe.ca>,
Suzuki Poulose <suzuki.poulose@arm.com>,
Steven Price <steven.price@arm.com>,
Sami Mujawar <sami.mujawar@arm.com>,
thuth@redhat.com
Subject: Re: [PATCH v2 3/3] virt: arm-cca-guest: Add support for measurement registers
Date: Wed, 30 Sep 2026 12:24:08 +0900 [thread overview]
Message-ID: <arx2hnTv3QaFqMn-@FCCLS0092175.localdomain> (raw)
In-Reply-To: <20260929-arm_cca_mr-v2-3-1d98bba187fd@arm.com>
Hi Yeoreum, Sami,
On 09/29 17:57, Yeoreum Yun wrote:
> From: Sami Mujawar <sami.mujawar@arm.com>
>
> Add support for Arm CCA measurement registers (MRs), enabling attestation
> and runtime integrity tracking from guest Realms.
>
> This implementation registers a measurement configuration with the TSM
> framework and exposes measurement register values via sysfs using a
> misc device. The supported registers include the Realm Initial
> Measurement (RIM) and four Runtime Extensible Measurement Registers
> (REM0–REM3), each using SHA-256 or SHA-512 depending on Realm
Is SHA-384 intentionally out of scope for this series?
Although TF-RMM does not support it yet, the RMM specification defines
RSI_HASH_SHA_384. A platform using a custom RMM implementation could
therefore launch a Realm configured to use SHA-384. I think the Realm
guest driver should support it rather than fail initialization.
> configuration.
>
> The measurement registers are located under the following sysfs node:
> /sys/devices/virtual/misc/arm_cca_guest/measurements/
> -rw-r--r-- 1 0 0 64 Jul 21 11:46 rem0:sha512
> -rw-r--r-- 1 0 0 64 Jul 21 11:46 rem1:sha512
> -rw-r--r-- 1 0 0 64 Jul 21 11:46 rem2:sha512
> -rw-r--r-- 1 0 0 64 Jul 21 11:46 rem3:sha512
> -r--r--r-- 1 0 0 64 Jul 21 11:46 rim:sha512
>
> As seen above the attributes for the REMs are 'rw' indicating they can
> be read or extended. While the attributes for RIM is 'r' indicating
> that it can only be read and not extended.
>
> The sysfs node suffix for the measurement register (i.e. ':sha512')
> indicates the hash algorithm used is sha512. This also reflects
> that the Realm was launched with SHA512 as the measurement algorithm.
>
> Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
> ---
> .../sysfs-devices-virtual-misc-arm_cca_guest | 38 +++
> drivers/virt/coco/arm-cca-guest/Kconfig | 1 +
> drivers/virt/coco/arm-cca-guest/main.c | 282 ++++++++++++++++++++-
> 3 files changed, 319 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/ABI/testing/sysfs-devices-virtual-misc-arm_cca_guest b/Documentation/ABI/testing/sysfs-devices-virtual-misc-arm_cca_guest
> new file mode 100644
> index 000000000000..878dc54e48f8
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-devices-virtual-misc-arm_cca_guest
> @@ -0,0 +1,38 @@
> +What: /sys/devices/virtual/misc/arm_cca_guest/measurements/MRNAME[:HASH]
> +Date: July, 2025
> +KernelVersion: v6.16
I think this Date and KernelVersion are stale and they should be
updated.
> +Contact: linux-coco@lists.linux.dev
> +Description:
> + Value of a Arm CCA Realm measurement register (MR). The optional
If the :HASH suffix actually optional for Arm CCA?
It appears that the driver always associates a hash algorithm with each
register.
> + suffix :HASH is to represent the hash algorithms associated with
> + the MRs. See below for a complete list of Arm CCA Realm MRs exposed
> + via sysfs. Refer to the Arm Realm Management Monitor (RMM)
> + Specification for more information on the Realm Measurement registers.
> +
> + The Arm Realm Management Monitor Specification can be found at:
> + https://developer.arm.com/documentation/den0137/latest/
> +
> + See also:
> + https://docs.kernel.org/driver-api/coco/measurement-registers.html
> +
> +What: /sys/devices/virtual/misc/arm_cca_guest/measurements/rim:[sha256|sha512]
> +Date: July, 2025
> +KernelVersion: v6.16
> +Contact: linux-coco@lists.linux.dev
> +Description:
> + (RO) RIM - [32|64]-byte immutable storage typically used to represent
> + the Realm Initial Measurement (RIM) which is the measurement of
> + the configuration and contents of a Realm at the time of activation.
> +
> +What: /sys/devices/virtual/misc/arm_cca_guest/measurements/rem[0123]:[sha256|sha512]
> +Date: July, 2025
> +KernelVersion: v6.16
> +Contact: linux-coco@lists.linux.dev
> +Description:
> + (RW) REM[0123] - 4 Run-Time extendable Measurement Registers that
> + represent the Realm Extensible Measurement (REM) registers which
> + can be extended during the lifetime of a Realm.
> + Read from any of these returns the current value of the corresponding
> + REM. Write extends the written buffer to the REM. All writes must start
> + at offset 0 and be maximum 64 bytes in size. Attempting to write more
> + than 64 bytes will result in EINVAL returned by the write() syscall.
> diff --git a/drivers/virt/coco/arm-cca-guest/Kconfig b/drivers/virt/coco/arm-cca-guest/Kconfig
> index 0d4ce72e2d86..3693d3bc90c6 100644
> --- a/drivers/virt/coco/arm-cca-guest/Kconfig
> +++ b/drivers/virt/coco/arm-cca-guest/Kconfig
> @@ -3,6 +3,7 @@ config ARM_CCA_GUEST
> depends on ARM_RMM_RSI
> depends on HAVE_ARM_SMCCC_DISCOVERY
> select TSM_REPORTS
> + select TSM_MEASUREMENTS
> help
> The driver provides userspace interface to request and
> attestation report from the Realm Management Monitor(RMM).
> diff --git a/drivers/virt/coco/arm-cca-guest/main.c b/drivers/virt/coco/arm-cca-guest/main.c
> index f97f593da6e3..9bbad43c4669 100644
> --- a/drivers/virt/coco/arm-cca-guest/main.c
> +++ b/drivers/virt/coco/arm-cca-guest/main.c
> @@ -1,6 +1,6 @@
> // SPDX-License-Identifier: GPL-2.0-only
> /*
> - * Copyright (C) 2023 ARM Ltd.
> + * Copyright (C) 2023 - 2025 ARM Ltd.
> */
>
> #include <linux/arm-rsi-cmds.h>
> @@ -9,11 +9,280 @@
> #include <linux/cc_platform.h>
> #include <linux/kernel.h>
> #include <linux/device-id/platform.h>
> +#include <linux/miscdevice.h>
> #include <linux/module.h>
> #include <linux/smp.h>
> #include <linux/tsm.h>
> +#include <linux/tsm-mr.h>
> #include <linux/types.h>
>
> +#include <crypto/hash.h>
> +
> +/* MR buffer */
> +static u8 *arm_cca_mr_buf;
> +
> +/**
> + * arm_cca_mrs - ARM CCA measurement register set.
> + *
> + * Defines a static array of measurement registers used by the ARM
> + * Confidential Compute Architecture (CCA). These registers are used
> + * for attestation and runtime integrity tracking.
> + *
> + * Register types:
> + * - rim: Realm initial measurement register (RIM)
> + * - rem0–rem3: Runtime extensible measurement registers (REMs)
> + */
> +static struct tsm_measurement_register arm_cca_mrs[] = {
> + { TSM_MR_(rim, SHA256) | TSM_MR_F_READABLE },
> + { TSM_MR_(rem0, SHA256) | TSM_MR_F_RTMR },
> + { TSM_MR_(rem1, SHA256) | TSM_MR_F_RTMR },
> + { TSM_MR_(rem2, SHA256) | TSM_MR_F_RTMR },
> + { TSM_MR_(rem3, SHA256) | TSM_MR_F_RTMR }
> +};
> +
> +/**
> + * arm_cca_mr_refresh - Refresh measurement registers for ARM CCA.
> + *
> + * @tm: Pointer to a struct tsm_measurements containing measurement registers.
> + *
> + * Iterates through all measurement registers in @tm and refreshes those
> + * marked with TSM_MR_F_LIVE or TSM_MR_F_READABLE by invoking
> + * rsi_measurement_read() for each.
> + *
> + * Return: 0 on success, or -EINVAL if @tm is NULL or a read operation fails.
> + */
> +static int arm_cca_mr_refresh(const struct tsm_measurements *tm)
> +{
> + int retval;
> + int index = 0;
> + const struct tsm_measurement_register *mr;
> +
> + if (!tm)
> + return -EINVAL;
> +
> + while (index < tm->nr_mrs) {
> + mr = &tm->mrs[index];
> +
> + /* Skip if the MR is not Live or Readable. */
> + if ((mr->mr_flags & (TSM_MR_F_LIVE | TSM_MR_F_READABLE)) != 0) {
> + retval = rsi_measurement_read(index,
> + mr->mr_value,
> + mr->mr_size);
> + if (retval != 0)
> + return -EINVAL;
> + }
> +
> + index++;
> + }
> +
> + return 0;
> +}
> +
> +/**
> + * arm_cca_mr_extend - Extend a measurement register with new data.
> + *
> + * @tm: Pointer to the tsm_measurements structure containing measurement
> + * registers.
> + * @mr: Pointer to the specific measurement register to extend.
> + * @data: Pointer to the data to be used for extension.
> + *
> + * This function extends a measurement register with new input data.
> + *
> + * Return: 0 on success, or a negative error code (e.g., -EINVAL for invalid
> + * arguments).
> + */
> +static int arm_cca_mr_extend(const struct tsm_measurements *tm,
> + const struct tsm_measurement_register *mr,
> + const u8 *data)
> +{
> + if (!tm || !mr || !data)
> + return -EINVAL;
> +
> + return rsi_measurement_extend((mr - tm->mrs), data, mr->mr_size);
> +}
> +
> +/**
> + * arm_cca_measurements - ARM CCA measurement configuration instance.
> + *
> + * This defines the measurement set and behavior for the ARM
> + * Confidential Compute Architecture, enabling measurements
> + * for attestation and runtime validation.
> + */
> +static struct tsm_measurements arm_cca_measurements = {
> + .mrs = arm_cca_mrs,
> + .nr_mrs = ARRAY_SIZE(arm_cca_mrs),
> + .refresh = arm_cca_mr_refresh,
> + .write = arm_cca_mr_extend,
From the RMM specification and the commit message, I understand that a
REM can be extended with a measurement value of up to 64 bytes,
regardless of the selected hash algorithm (for example, SHA-256 or
SHA-512).
However, when SHA-256 is selected, this interface does not allow a REM
to be extended with a 64-byte value. The write partially succeeds: the
REM is extended with the first 32 bytes, and then the write of the
remaining 32 bytes fails with -EFBIG.
As far as I can tell, the write is truncated to the sysfs binary
attribute size, which is set to the SHA-256 digest size (32 bytes). The
subsequent write at offset 32 is then rejected by sysfs_kf_bin_write()
with -EFBIG.
I do not see a straightforward fix because the TSM measurement register
interface currently uses mr_size both as the readable digest size and as
the required write size.
[Realm VM]
~ # export REM3=/sys/devices/virtual/misc/arm_cca_guest/measurements/rem3:sha256
~ # dd if=/dev/urandom bs=64 count=1 of=$REM3
dd: error writing '/sys/devices/virtual/misc/arm_cca_guest/measurements/rem3:sha256': File too large
1+0 records in
0+0 records out
[RMM]
SMC_RSI_MEASUREMENT_EXTEND 4 20 3cfcaa635bca042d c148121346b6e1b5 7342800b438d20d7 3dc7a25048cbbad8 0 0 0 0 > RSI_SUCCESS
Do you have any thoughts on how the TSM interface should represent the
maximum extend input size separately from the digest size?
> +};
> +
> +/**
> + * arm_cca_attr_groups - Attribute groups for the arm_cca_misc_dev miscellaneous
> + * device.
> + *
> + */
> +static const struct attribute_group *arm_cca_attr_groups[] = {
> + NULL, /* measurements */
> + NULL
> +};
> +
> +/**
> + * arm_cca_misc_dev - Miscellaneous device for ARM CCA functionality.
> + *
> + */
> +static struct miscdevice arm_cca_misc_dev = {
> + .name = KBUILD_MODNAME,
> + .minor = MISC_DYNAMIC_MINOR,
> + .groups = arm_cca_attr_groups,
> +};
> +
> +/**
> + * arm_cca_get_hash_algorithm - Get the hash algorithm and digest size for
> + * a Realm.
> + *
> + * @hash_algo: Pointer to an int to receive the internal hash algorithm ID
> + * (e.g., HASH_ALGO_SHA256 or HASH_ALGO_SHA512).
> + * @digest_size: Pointer to an int to receive the digest size in bytes
> + * (e.g., SHA256_DIGEST_SIZE or SHA512_DIGEST_SIZE).
> + *
> + * This function retrieves the hash algorithm used in a Realm's configuration
> + * by invoking the `rsi_get_realm_config()` interface.
> + *
> + * Return:
> + * * %0 - Success. The hash algorithm and digest size are returned.
> + * * %-ENOMEM - Memory allocation failed.
> + * * %-EINVAL - Configuration fetch failed or algorithm is unsupported.
> + *
> + */
> +static int arm_cca_get_hash_algorithm(int *hash_algo, int *digest_size)
> +{
> + int ret = 0;
> + unsigned long result;
> + struct realm_config *cfg = NULL;
> +
> + cfg = alloc_pages_exact(sizeof(*cfg), GFP_KERNEL);
> + if (!cfg)
> + return -ENOMEM;
> +
> + result = rsi_get_realm_config(cfg);
> + if (result != RSI_SUCCESS) {
> + ret = -EINVAL;
> + goto exit_free_realm_config;
> + }
> +
> + switch (cfg->hash_algo) {
> + case RSI_HASH_SHA_512:
> + *hash_algo = HASH_ALGO_SHA512;
> + *digest_size = SHA512_DIGEST_SIZE;
> + break;
> + case RSI_HASH_SHA_256:
> + *hash_algo = HASH_ALGO_SHA256;
> + *digest_size = SHA256_DIGEST_SIZE;
> + break;
> + default:
> + /* Unknown/unsupported algorithm. */
> + ret = -EINVAL;
Would it make sense to add an error message here? For example:
pr_err("Unknown/unsupported Realm hash algorithm: %u\n", cfg->hash_algo);
For context, I tested your v1 series in the past and found that this function
sometimes failed due to wrong definition of realm_config::hash_algo [0].
Therefore, I think a diagnostic message including the returned value
would be useful.
[0] https://lore.kernel.org/all/20260929-cca-b4-rsi-fix-hash_algo-type-rebase-v1-1-6932cf0aa605@fujitsu.com/
Thanks,
Kohei
next prev parent reply other threads:[~2026-09-30 3:25 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-29 16:57 [PATCH v2 0/3] arm64/virt: Add Arm CCA measurement register support Yeoreum Yun
2026-09-29 16:57 ` [PATCH v2 1/3] arm64: rsi: Add helpers for Arm CCA measurement register operations Yeoreum Yun
2026-09-30 2:04 ` Kohei Enju
2026-09-30 5:13 ` Yeoreum Yun
2026-09-29 16:57 ` [PATCH v2 2/3] arm64: rsi: Add realm hash algorithm defines Yeoreum Yun
2026-09-30 2:39 ` Kohei Enju
2026-09-30 5:10 ` Yeoreum Yun
2026-09-29 16:57 ` [PATCH v2 3/3] virt: arm-cca-guest: Add support for measurement registers Yeoreum Yun
2026-09-30 3:24 ` Kohei Enju [this message]
2026-09-30 4:45 ` Kohei Enju
2026-09-30 5:09 ` Yeoreum Yun
2026-09-30 5:59 ` Kohei Enju
2026-09-30 6:40 ` Yeoreum Yun
2026-09-30 7:04 ` Kohei Enju
2026-09-30 7:54 ` Yeoreum Yun
2026-09-30 13:54 ` Jason Gunthorpe
2026-09-30 14:12 ` Yeoreum Yun
2026-09-30 14:17 ` Jason Gunthorpe
2026-09-30 14:28 ` Yeoreum Yun
2026-10-01 1:33 ` Kohei Enju
2026-09-29 19:20 ` [PATCH v2 0/3] arm64/virt: Add Arm CCA measurement register support Jason Gunthorpe
2026-09-29 19:42 ` Yeoreum Yun
2026-09-29 19:45 ` Jason Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=arx2hnTv3QaFqMn-@FCCLS0092175.localdomain \
--to=enju.kohei@fujitsu.com \
--cc=catalin.marinas@arm.com \
--cc=jgg@ziepe.ca \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sami.mujawar@arm.com \
--cc=steven.price@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=thuth@redhat.com \
--cc=will@kernel.org \
--cc=yeoreum.yun@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®