mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Yeoreum Yun <yeoreum.yun@arm.com>
To: Kohei Enju <enju.kohei@fujitsu.com>
Cc: Yeoreum Yun <yeoreum.yun@arm.com>,
	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 06:09:50 +0100	[thread overview]
Message-ID: <aryZnqqBAjKw5xaP@e129823.arm.com> (raw)
In-Reply-To: <arx2hnTv3QaFqMn-@FCCLS0092175.localdomain>

On Wed, Sep 30, 2026 at 12:24:08PM +0900, Kohei Enju wrote:
> 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.

Fair enough. Let's change in next-spin.

> 
> > 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.

Oh. I missed it. I'll update in next-spin.

> 
> > +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?

I don't think we need to represent the maximum extend input size separately.

The TSM measurement register interface is intended to expose PCR-like
semantics, where the value being extended is a measurement digest whose size
is determined by the selected hash algorithm.

In other words, the extend operation is conceptually:

new_digest = Hash(old_digest || measurement_digest)

Therefore, for a SHA-256 measurement register, the extend value should be
32 bytes, and rejecting a value larger than 32 bytes with -EFBIG seems
correct to me and intended. A 64-byte extend value would only be valid for
a register using a 64-byte digest, such as SHA-512.

Although the RMM interface may allow a measurement value of up to 64 bytes
independently of the REM hash algorithm, I don't think that capability
needs to be exposed through the generic TSM measurement register interface
in point of viewt to preserve PCR-like semantics.

> 
> > +};
> > +
> > +/**
> > + * 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/

Fair enough. I'll add the error log.

Thanks!

-- 
Sincerely,
Yeoreum Yun

  parent reply	other threads:[~2026-09-30  5:10 UTC|newest]

Thread overview: 22+ 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
2026-09-30  4:45     ` Kohei Enju
2026-09-30  5:09     ` Yeoreum Yun [this message]
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-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=aryZnqqBAjKw5xaP@e129823.arm.com \
    --to=yeoreum.yun@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=enju.kohei@fujitsu.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 \
    /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®