Message ID | 20200511181403.19448-2-ilias.apalodimas@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | EFI variable support via OP-TEE | expand |
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_ */ >
Hi Heinrich On Mon, May 11, 2020 at 09:39:51PM +0200, Heinrich Schuchardt wrote: > On 5/11/20 8:13 PM, Ilias Apalodimas wrote: > > + [...] > > +/* > > + * 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? > Yes > > + */ > > + > > +#define PTA_STMM_CMDID_COMMUNICATE 0 > > + > > + 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } } [...] > > + > > +#define EFI_MM_VARIABLE_GUID \ > > + * > > + * 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 ;) > Indeed! Thanks for cathcing those > > + */ > > +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. Ok will do > > Otherwise: > Reviewed-by: Heinrich Schuchardt <xypron.glpk at gmx.de> > Thanks! /Ilias
> > %s/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE/SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE./ > > > + * @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 ;) > > > + */ > > + * @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. > There were 3-4 more c/p trainwrecks in there. I'll post a v3 once you are done with your testing. Thanks /Ilias
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 + * the StandaloneMM Secure Partition (StMM) running at S-EL0 + */ + +#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 + */ +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 + * + */ +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 + */ +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 + */ +struct smm_variable_query_info { + u64 max_variable_storage; + u64 remaining_variable_storage; + u64 max_variable_size; + u32 attr; +}; + +#endif /* _MM_VARIABLE_H_ */