[PATCH 1/5 v2] efi_loader: Add headers for EDK2 StandAloneMM communication
Heinrich Schuchardt
xypron.glpk at gmx.de
Mon May 11 21:39:51 CEST 2020
On 5/11/20 8:13 PM, Ilias Apalodimas wrote:
> From: Sughosh Ganu <sughosh.ganu at linaro.org>
>
> In Arm devices OP-TEE has the ability to run StandAloneMM (from EDK2)
> in a separate partition and handle UEFI variables.
> A following patch introduces this functionality.
>
> Add the headers needed for OP-TEE <--> StandAloneMM communication
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>
> Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> ---
> include/mm_communication.h | 207 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 207 insertions(+)
> create mode 100644 include/mm_communication.h
>
> diff --git a/include/mm_communication.h b/include/mm_communication.h
> new file mode 100644
> index 000000000000..b9bfbe4cf0a1
> --- /dev/null
> +++ b/include/mm_communication.h
> @@ -0,0 +1,207 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Headers for EFI variable service via StandAloneMM, EDK2 application running
> + * in OP-TEE
> + *
> + * Copyright (c) 2017, Intel Corporation. All rights reserved.
> + * Copyright (C) 2020 Linaro Ltd. <sughosh.ganu at linaro.org>
> + * Copyright (C) 2020 Linaro Ltd. <ilias.apalodimas at linaro.org>
> + */
> +
> +#ifndef _MM_VARIABLE_H_
> +#define _MM_VARIABLE_H_
> +
> +#include <part_efi.h>
> +
> +/*
> + * Interface to the pseudo TA, which provides a communication channel with
U-Boot developers might not know the OP-TEE terms. So I would tend to
avoid abbreviations at least in the first reference.
%s/pseudo TA/Pseudo Trusted Application/
> + * the StandaloneMM Secure Partition (StMM) running at S-EL0
What does MM stand for? Management Mode?
> + */
> +
> +#define PTA_STMM_CMDID_COMMUNICATE 0
> +
> +/* OP-TEE is using big endian GUIDs while UEFI uses little endian ones */
> +#define PTA_STMM_UUID { 0xed32d533, 0x99e6, 0x4209, {\
> + 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } }
> +
> +#define EFI_MM_VARIABLE_GUID \
> + EFI_GUID(0xed32d533, 0x99e6, 0x4209, \
> + 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7)
> +
> +/* Defined in EDK2 MdePkg/Include/Protocol/MmCommunication.h */
> +
> +/**
> + * struct efi_mm_communicate_header - Header used for SMM variable communication
> +
> + * @header_guid: header use for disambiguation of content
> + * @message_len: length of the message. Does not include the size of the
> + * header
> + * @data: payload of the message
> + *
> + * Defined in EDK2 as EFI_MM_COMMUNICATE_HEADER
> + * To avoid confusion in interpreting frames, the communication buffer should
> + * always begin with efi_mm_communicate_header
%s/efi_mm_communicate_header/efi_mm_communicate_header./
> + */
> +struct efi_mm_communicate_header {
> + efi_guid_t header_guid;
> + size_t message_len;
> + u8 data[];
> +};
> +
> +#define MM_COMMUNICATE_HEADER_SIZE \
> + (sizeof(struct efi_mm_communicate_header))
> +
> +/* Defined in EDK2 ArmPkg/Include/IndustryStandard/ArmStdSmc.h */
> +
> +/* MM return error codes */
> +#define ARM_SMC_MM_RET_SUCCESS 0
> +#define ARM_SMC_MM_RET_NOT_SUPPORTED -1
> +#define ARM_SMC_MM_RET_INVALID_PARAMS -2
> +#define ARM_SMC_MM_RET_DENIED -3
> +#define ARM_SMC_MM_RET_NO_MEMORY -4
> +
> +/* Defined in EDK2 MdeModulePkg/Include/Guid/SmmVariableCommon.h */
> +
> +#define SMM_VARIABLE_FUNCTION_GET_VARIABLE 1
> +/*
> + * The payload for this function is
> + * SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
> + */
> +#define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME 2
> +/*
> + * The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
> + */
> +#define SMM_VARIABLE_FUNCTION_SET_VARIABLE 3
> +/*
> + * The payload for this function is
> + * SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
> + */
> +#define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO 4
> +/*
> + * It is a notify event, no extra payload for this function.
> + */
> +#define SMM_VARIABLE_FUNCTION_READY_TO_BOOT 5
> +/*
> + * It is a notify event, no extra payload for this function.
> + */
> +#define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE 6
> +/*
> + * The payload for this function is VARIABLE_INFO_ENTRY.
> + * The GUID in EFI_SMM_COMMUNICATE_HEADER is gEfiSmmVariableProtocolGuid.
> + */
> +#define SMM_VARIABLE_FUNCTION_GET_STATISTICS 7
> +/*
> + * The payload for this function is SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE
> + */
> +#define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE 8
> +
> +#define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET 9
> +
> +#define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET 10
> +
> +#define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE 11
> +/*
> + * The payload for this function is
> + * SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT
> + */
> +#define SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT 12
> +
> +#define SMM_VARIABLE_FUNCTION_SYNC_RUNTIME_CACHE 13
> +/*
> + * The payload for this function is
> + * SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO
> + */
> +#define SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO 14
> +
> +/**
> + * struct smm_variable_communicate_header - Used for SMM variable communication
> +
> + * @function: function to call in Smm.
> + * @ret_status: return status
> + * @data: payload
> + *
> + * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER
> + */
> +struct smm_variable_communicate_header {
> + efi_uintn_t function;
> + efi_status_t ret_status;
> + u8 data[];
> +};
> +
> +#define MM_VARIABLE_COMMUNICATE_SIZE \
> + (sizeof(struct smm_variable_communicate_header))
> +
> +/**
> + * struct smm_variable_access - Used to communicate with StMM by
> + * SetVariable and GetVariable.
> +
> + * @function: vendor GUID to call in Smm
> + * @data_size: size of EFI variable data
> + * @name_size: size of EFI name
> + * @attr: attributes
> + * @name: variable name
> + *
> + * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE
> + *
> + */
> +struct smm_variable_access {
> + efi_guid_t guid;
> + efi_uintn_t data_size;
> + efi_uintn_t name_size;
> + u32 attr;
> + u16 name[];
> +};
> +
> +#define MM_VARIABLE_ACCESS_HEADER_SIZE \
> + (sizeof(struct smm_variable_access))
> +/**
> + * struct smm_variable_payload_size - Used to get the max allowed
> + * payload used in StMM.
> + *
> + * @size: size to fill in
> + *
> + * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE
%s/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE./
> + *
> + */
> +struct smm_variable_payload_size {
> + efi_uintn_t size;
> +};
> +
> +/**
> + * struct smm_variable_getnext - Used to communicate with StMM for
> + * GetNextVariableName.
> + *
> + * @size: vendor GUID
> + * @name_size: size of the name of the variable
> + * @name: variable name
> + *
> + * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE
%s/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE/SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME./
Too much copy and paste ;)
> + */
> +struct smm_variable_getnext {
> + efi_guid_t guid;
> + efi_uintn_t name_size;
> + u16 name[];
> +};
> +
> +#define MM_VARIABLE_GET_NEXT_HEADER_SIZE \
> + (sizeof(struct smm_variable_getnext))
> +
> +/**
> + * struct smm_variable_query_info - Used to communicate with StMM for
> + * QueryVariableInfo.
> + *
> + * @max_variable_storage: max available storage
> + * @remaining_variable_storage: remaining available storage
> + * @max_variable_size: max variable supported size
> + * @attr: attributes to query storage for
> + *
> + * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE
%s/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE/SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO./
I hope I caught all comment errors. Please, recheck.
Otherwise:
Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> + */
> +struct smm_variable_query_info {
> + u64 max_variable_storage;
> + u64 remaining_variable_storage;
> + u64 max_variable_size;
> + u32 attr;
> +};
> +
> +#endif /* _MM_VARIABLE_H_ */
>
More information about the U-Boot
mailing list