1 /** @file
2   Variable check definitions.
3 
4   Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef _VARIABLE_CHECK_H_
10 #define _VARIABLE_CHECK_H_
11 
12 #include <Uefi/UefiSpec.h>
13 
14 typedef struct _EDKII_VAR_CHECK_PROTOCOL    EDKII_VAR_CHECK_PROTOCOL;
15 
16 #define EDKII_VAR_CHECK_PROTOCOL_GUID { \
17   0xaf23b340, 0x97b4, 0x4685, { 0x8d, 0x4f, 0xa3, 0xf2, 0x81, 0x69, 0xb2, 0x1d } \
18 };
19 
20 typedef EFI_SET_VARIABLE VAR_CHECK_SET_VARIABLE_CHECK_HANDLER;
21 
22 /**
23   Register SetVariable check handler.
24   Variable driver will call the handler to do check before
25   really setting the variable into variable storage.
26 
27   @param[in] Handler            Pointer to the check handler.
28 
29   @retval EFI_SUCCESS           The SetVariable check handler was registered successfully.
30   @retval EFI_INVALID_PARAMETER Handler is NULL.
31   @retval EFI_ACCESS_DENIED     EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has already been signaled.
32   @retval EFI_OUT_OF_RESOURCES  There is not enough resource for the SetVariable check handler register request.
33   @retval EFI_UNSUPPORTED       This interface is not implemented.
34                                 For example, it is unsupported in VarCheck protocol if both VarCheck and SmmVarCheck protocols are present.
35 
36 **/
37 typedef
38 EFI_STATUS
39 (EFIAPI * EDKII_VAR_CHECK_REGISTER_SET_VARIABLE_CHECK_HANDLER) (
40   IN VAR_CHECK_SET_VARIABLE_CHECK_HANDLER   Handler
41   );
42 
43 #define VAR_CHECK_VARIABLE_PROPERTY_REVISION      0x0001
44 //
45 // 1. Set by VariableLock PROTOCOL
46 // 2. Set by VarCheck PROTOCOL
47 //
48 // If set, other fields for check will be ignored.
49 //
50 #define VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY     BIT0
51 
52 typedef struct {
53   UINT16                            Revision;
54   UINT16                            Property;
55   UINT32                            Attributes;
56   UINTN                             MinSize;
57   UINTN                             MaxSize;
58 } VAR_CHECK_VARIABLE_PROPERTY;
59 
60 typedef struct {
61   EFI_GUID                      *Guid;
62   CHAR16                        *Name;
63   VAR_CHECK_VARIABLE_PROPERTY   VariableProperty;
64 } VARIABLE_ENTRY_PROPERTY;
65 
66 /**
67   Variable property set.
68   Variable driver will do check according to the VariableProperty before
69   really setting the variable into variable storage.
70 
71   @param[in] Name               Pointer to the variable name.
72   @param[in] Guid               Pointer to the vendor GUID.
73   @param[in] VariableProperty   Pointer to the input variable property.
74 
75   @retval EFI_SUCCESS           The property of variable specified by the Name and Guid was set successfully.
76   @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string,
77                                 or the fields of VariableProperty are not valid.
78   @retval EFI_ACCESS_DENIED     EFI_END_OF_DXE_EVENT_GROUP_GUID or EFI_EVENT_GROUP_READY_TO_BOOT has
79                                 already been signaled.
80   @retval EFI_OUT_OF_RESOURCES  There is not enough resource for the variable property set request.
81 
82 **/
83 typedef
84 EFI_STATUS
85 (EFIAPI * EDKII_VAR_CHECK_VARIABLE_PROPERTY_SET) (
86   IN CHAR16                         *Name,
87   IN EFI_GUID                       *Guid,
88   IN VAR_CHECK_VARIABLE_PROPERTY    *VariableProperty
89   );
90 
91 /**
92   Variable property get.
93 
94   @param[in]  Name              Pointer to the variable name.
95   @param[in]  Guid              Pointer to the vendor GUID.
96   @param[out] VariableProperty  Pointer to the output variable property.
97 
98   @retval EFI_SUCCESS           The property of variable specified by the Name and Guid was got successfully.
99   @retval EFI_INVALID_PARAMETER Name, Guid or VariableProperty is NULL, or Name is an empty string.
100   @retval EFI_NOT_FOUND         The property of variable specified by the Name and Guid was not found.
101 
102 **/
103 typedef
104 EFI_STATUS
105 (EFIAPI * EDKII_VAR_CHECK_VARIABLE_PROPERTY_GET) (
106   IN CHAR16                         *Name,
107   IN EFI_GUID                       *Guid,
108   OUT VAR_CHECK_VARIABLE_PROPERTY   *VariableProperty
109   );
110 
111 struct _EDKII_VAR_CHECK_PROTOCOL {
112   EDKII_VAR_CHECK_REGISTER_SET_VARIABLE_CHECK_HANDLER   RegisterSetVariableCheckHandler;
113   EDKII_VAR_CHECK_VARIABLE_PROPERTY_SET                 VariablePropertySet;
114   EDKII_VAR_CHECK_VARIABLE_PROPERTY_GET                 VariablePropertyGet;
115 };
116 
117 extern EFI_GUID gEdkiiVarCheckProtocolGuid;
118 
119 #endif
120 
121