[PATCH v2] efi_loader: Don't limit the StMM buffer size explicitly

Heinrich Schuchardt xypron.glpk at gmx.de
Sat Dec 25 11:03:07 CET 2021


On 12/24/21 09:08, Ilias Apalodimas wrote:
> From: Ilias Apalodimas <apalos at gmail.com>
>
> Currently we allow and explicitly check a single shared page with
> StandAloneMM.  This is dictated by OP-TEE which runs the application.
> However there's no way for us dynamically discover the number of pages we
> are allowed to use.  Since writing big EFI signature list variable
> requires more than a page, OP-TEE has bumped the number of shared pages to
> four.
>
> Let's remove our explicit check and allow the request to reach OP-TEE even
> if it's bigger than what it supports.  There's no need to sanitize the
> number of pages internally.  OP-TEE will fail if we try to write more
> than it's allowed. The error will just trigger later on,  during the
> StMM access.
>
> While at it add an error message to help users figure out what failed.
>
> Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Tested-by: Ying-Chun Liu (PaulLiu) <paul.liu at linaro.org>
>
> Signed-off-by: Ilias Apalodimas <apalos at gmail.com>
> ---
> Changes since v1: (was "Bump the number of shared pages with StandAloneMM")
> - Remove the check entirely and rely on tee trigeering the error
>
>   include/tee.h                     |  1 +
>   lib/efi_loader/efi_variable_tee.c | 21 ++++++++++-----------
>   2 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/include/tee.h b/include/tee.h
> index 44e9cd4321bc..087810bd12e4 100644
> --- a/include/tee.h
> +++ b/include/tee.h
> @@ -39,6 +39,7 @@
>   #define TEE_SUCCESS			0x00000000
>   #define TEE_ERROR_STORAGE_NOT_AVAILABLE	0xf0100003
>   #define TEE_ERROR_GENERIC		0xffff0000
> +#define TEE_ERROR_EXCESS_DATA		0xffff0004
>   #define TEE_ERROR_BAD_PARAMETERS	0xffff0006
>   #define TEE_ERROR_ITEM_NOT_FOUND	0xffff0008
>   #define TEE_ERROR_NOT_IMPLEMENTED	0xffff0009
> diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c
> index 281f886124af..b2d1513bea5d 100644
> --- a/lib/efi_loader/efi_variable_tee.c
> +++ b/lib/efi_loader/efi_variable_tee.c
> @@ -15,7 +15,6 @@
>   #include <malloc.h>
>   #include <mm_communication.h>
>
> -#define OPTEE_PAGE_SIZE BIT(12)
>   extern struct efi_var_file __efi_runtime_data *efi_var_buf;
>   static efi_uintn_t max_buffer_size;	/* comm + var + func + data */
>   static efi_uintn_t max_payload_size;	/* func + data */
> @@ -113,9 +112,18 @@ static efi_status_t optee_mm_communicate(void *comm_buf, ulong dsize)
>
>   	rc = tee_invoke_func(conn.tee, &arg, 2, param);
>   	tee_shm_free(shm);
> +	/*
> +	 * Although the max payload is configurable on StMM, we only share
> +	 * four pages from OP-TEE for the non-secure buffer used to communicate
> +	 * with StMM. OP-TEE will reject anything bigger than that and will
> +	 * return.  So le'ts at least warn users
> +	 */
>   	tee_close_session(conn.tee, conn.session);
> -	if (rc || arg.ret != TEE_SUCCESS)
> +	if (rc || arg.ret != TEE_SUCCESS) {

tee_close_session(): Will arg.ret be valid if rc != 0?

Best regards

Heinrich

> +		if (arg.ret == TEE_ERROR_EXCESS_DATA)
> +			log_err("Variable payload too large\n");
>   		return EFI_DEVICE_ERROR;
> +	}
>
>   	switch (param[1].u.value.a) {
>   	case ARM_SVC_SPM_RET_SUCCESS:
> @@ -255,15 +263,6 @@ efi_status_t EFIAPI get_max_payload(efi_uintn_t *size)
>   		goto out;
>   	}
>   	*size = var_payload->size;
> -	/*
> -	 * Although the max payload is configurable on StMM, we only share a
> -	 * single page from OP-TEE for the non-secure buffer used to communicate
> -	 * with StMM. Since OP-TEE will reject to map anything bigger than that,
> -	 * make sure we are in bounds.
> -	 */
> -	if (*size > OPTEE_PAGE_SIZE)
> -		*size = OPTEE_PAGE_SIZE - MM_COMMUNICATE_HEADER_SIZE  -
> -			MM_VARIABLE_COMMUNICATE_SIZE;
>   	/*
>   	 * There seems to be a bug in EDK2 miscalculating the boundaries and
>   	 * size checks, so deduct 2 more bytes to fulfill this requirement. Fix



More information about the U-Boot mailing list