1 /* 2 * Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef TS_SMM_VARIABLE_PARAMETERS_H 8 #define TS_SMM_VARIABLE_PARAMETERS_H 9 10 #include <stddef.h> 11 12 #include "protocols/common/efi/efi_status.h" 13 #include "protocols/common/efi/efi_types.h" 14 #include "protocols/common/efi/efi_certificate.h" 15 #include <protocols/common/efi/efi_global_variable.h> 16 #include <protocols/common/efi/efi_image_authentication.h> 17 18 /** 19 * C/C++ definition of smm_variable service parameters 20 * 21 * These defines are aligned to the SMM Variable definitions from EDK2. These versions 22 * of these defines are maintained in the TS project to avoid a mandatory dependency 23 * on the EDK2 project. 24 */ 25 26 /** 27 * SMM variable call header 28 */ 29 typedef struct { 30 uint64_t Function; 31 efi_status_t ReturnStatus; 32 uint8_t Data[1]; 33 } SMM_VARIABLE_COMMUNICATE_HEADER; 34 35 #define SMM_VARIABLE_COMMUNICATE_HEADER_SIZE \ 36 offsetof(SMM_VARIABLE_COMMUNICATE_HEADER, Data) 37 38 /** 39 * Variable attributes 40 */ 41 #define EFI_VARIABLE_NON_VOLATILE (0x00000001) 42 #define EFI_VARIABLE_BOOTSERVICE_ACCESS (0x00000002) 43 #define EFI_VARIABLE_RUNTIME_ACCESS (0x00000004) 44 #define EFI_VARIABLE_HARDWARE_ERROR_RECORD (0x00000008) 45 #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS (0x00000010) 46 #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS (0x00000020) 47 #define EFI_VARIABLE_APPEND_WRITE (0x00000040) 48 #define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS (0x00000080) 49 50 #define EFI_VARIABLE_MASK \ 51 (EFI_VARIABLE_NON_VOLATILE | \ 52 EFI_VARIABLE_BOOTSERVICE_ACCESS | \ 53 EFI_VARIABLE_RUNTIME_ACCESS | \ 54 EFI_VARIABLE_HARDWARE_ERROR_RECORD | \ 55 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \ 56 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \ 57 EFI_VARIABLE_APPEND_WRITE | \ 58 EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS) 59 60 /** 61 * Parameter structure for SetVariable and GetVariable. 62 */ 63 typedef struct { 64 EFI_GUID Guid; 65 uint64_t DataSize; 66 uint64_t NameSize; 67 uint32_t Attributes; 68 int16_t Name[1]; 69 } SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE; 70 71 #define SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_NAME_OFFSET \ 72 offsetof(SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) 73 74 #define SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_DATA_OFFSET(s) \ 75 (offsetof(SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + s->NameSize) 76 77 #define SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_TOTAL_SIZE(s) \ 78 (offsetof(SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + s->NameSize + s->DataSize) 79 80 #define SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE_SIZE(name_size, data_size) \ 81 (offsetof(SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE, Name) + name_size + data_size) 82 83 /** 84 * Parameter structure for GetNextVariableName. 85 */ 86 typedef struct { 87 EFI_GUID Guid; 88 uint64_t NameSize; 89 int16_t Name[1]; 90 } SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME; 91 92 #define SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME_NAME_OFFSET \ 93 offsetof(SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name) 94 95 #define SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME_TOTAL_SIZE(s) \ 96 (offsetof(SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name) + s->NameSize) 97 98 #define SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME_SIZE(name_size) \ 99 (offsetof(SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME, Name) + name_size) 100 101 /** 102 * Parameter structure for QueryVariableInfo. 103 */ 104 typedef struct { 105 uint64_t MaximumVariableStorageSize; 106 uint64_t RemainingVariableStorageSize; 107 uint64_t MaximumVariableSize; 108 uint32_t Attributes; 109 } SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO; 110 111 /** 112 * Variable check property structure. Specifies check constraints 113 * for a variable. 114 */ 115 typedef struct { 116 uint16_t Revision; 117 uint16_t Property; 118 uint32_t Attributes; 119 uint64_t MinSize; 120 uint64_t MaxSize; 121 } VAR_CHECK_VARIABLE_PROPERTY; 122 123 #define VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY (1U << 0) 124 125 /* Supported check property revision */ 126 #define VAR_CHECK_VARIABLE_PROPERTY_REVISION (0x0001) 127 128 /** 129 * Parameter structure for VarCheckVariableProperty Set/Get 130 */ 131 typedef struct { 132 EFI_GUID Guid; 133 uint64_t NameSize; 134 VAR_CHECK_VARIABLE_PROPERTY VariableProperty; 135 int16_t Name[1]; 136 } SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY; 137 138 #define SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY_NAME_OFFSET \ 139 offsetof(SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) 140 141 #define SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY_TOTAL_SIZE(s) \ 142 (offsetof(SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + s->NameSize) 143 144 #define SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY_SIZE(name_size) \ 145 (offsetof(SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) + name_size) 146 147 /** 148 * Parameter structure for GetPayloadSize. 149 */ 150 typedef struct { 151 uint64_t VariablePayloadSize; 152 } SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE; 153 154 /** 155 * Authentication header included at the start of variable data for SetVariable operations 156 * when the EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS attribute is set. 157 */ 158 typedef struct { 159 EFI_TIME TimeStamp; 160 WIN_CERTIFICATE_UEFI_GUID AuthInfo; 161 } EFI_VARIABLE_AUTHENTICATION_2; 162 163 #define EFI_VARIABLE_AUTHENTICATION_2_SIZE_WITHOUT_CERTDATA \ 164 offsetof(EFI_VARIABLE_AUTHENTICATION_2, AuthInfo.CertData) 165 166 #endif /* TS_SMM_VARIABLE_PARAMETERS_H */ 167