]> git.proxmox.com Git - mirror_edk2.git/blob - EmbeddedPkg/Ebl/Variable.c
Patch from open source community for CryptoPkg to allow it to build for ARM using...
[mirror_edk2.git] / EmbeddedPkg / Ebl / Variable.c
1 /** @file
2 *
3 * Copyright (c) 2011, ARM Limited. All rights reserved.
4 *
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
9 *
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 *
13 **/
14
15 #include "Ebl.h"
16
17 #include <Guid/GlobalVariable.h>
18
19 EFI_STATUS
20 EblGetCmd (
21 IN UINTN Argc,
22 IN CHAR8 **Argv
23 )
24 {
25 EFI_STATUS Status = EFI_INVALID_PARAMETER;
26 UINTN Size;
27 VOID* Value;
28 CHAR8* AsciiVariableName = NULL;
29 CHAR16* VariableName;
30 UINT32 Index;
31
32 if (Argc == 1) {
33 AsciiPrint("Variable name is missing.\n");
34 return Status;
35 }
36
37 for (Index = 1; Index < Argc; Index++) {
38 if (Argv[Index][0] == '-') {
39 AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);
40 } else {
41 AsciiVariableName = Argv[Index];
42 }
43 }
44
45 if (AsciiVariableName == NULL) {
46 AsciiPrint("Variable name is missing.\n");
47 return Status;
48 } else {
49 VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));
50 AsciiStrToUnicodeStr (AsciiVariableName,VariableName);
51 }
52
53 // Try to get the variable size.
54 Value = NULL;
55 Size = 0;
56 Status = gRT->GetVariable (VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);
57 if (Status == EFI_NOT_FOUND) {
58 AsciiPrint("Variable name '%s' not found.\n",VariableName);
59 } else if (Status == EFI_BUFFER_TOO_SMALL) {
60 // Get the environment variable value
61 Value = AllocatePool (Size);
62 if (Value == NULL) {
63 return EFI_OUT_OF_RESOURCES;
64 }
65
66 Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);
67 if (EFI_ERROR (Status)) {
68 AsciiPrint("Error: '%r'\n",Status);
69 } else {
70 AsciiPrint("%a=%a\n",AsciiVariableName,Value);
71 }
72 FreePool(Value);
73 } else {
74 AsciiPrint("Error: '%r'\n",Status);
75 }
76
77 FreePool(VariableName);
78 return Status;
79 }
80
81 EFI_STATUS
82 EblSetCmd (
83 IN UINTN Argc,
84 IN CHAR8 **Argv
85 )
86 {
87 EFI_STATUS Status = EFI_INVALID_PARAMETER;
88 CHAR8* AsciiVariableSetting = NULL;
89 CHAR8* AsciiVariableName;
90 CHAR8* AsciiValue;
91 UINT32 AsciiValueLength;
92 CHAR16* VariableName;
93 UINT32 Index;
94 UINT32 EscapedQuotes = 0;
95 BOOLEAN Volatile = FALSE;
96
97 if (Argc == 1) {
98 AsciiPrint("Variable name is missing.\n");
99 return Status;
100 }
101
102 for (Index = 1; Index < Argc; Index++) {
103 if (AsciiStrCmp(Argv[Index],"-v") == 0) {
104 Volatile = 0;
105 } else if (Argv[Index][0] == '-') {
106 AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);
107 } else {
108 AsciiVariableSetting = Argv[Index];
109 }
110 }
111
112 if (AsciiVariableSetting == NULL) {
113 AsciiPrint("Variable name is missing.\n");
114 return Status;
115 }
116
117 // Check if it is a valid variable setting
118 AsciiValue = AsciiStrStr (AsciiVariableSetting,"=");
119 if (AsciiValue == NULL) {
120 //
121 // There is no value. It means this variable will be deleted
122 //
123
124 // Convert VariableName into Unicode
125 VariableName = AllocatePool((AsciiStrLen (AsciiVariableSetting) + 1) * sizeof (CHAR16));
126 AsciiStrToUnicodeStr (AsciiVariableSetting,VariableName);
127
128 Status = gRT->SetVariable (
129 VariableName,
130 &gEfiGlobalVariableGuid,
131 ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |
132 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
133 0,
134 NULL
135 );
136 if (!EFI_ERROR(Status)) {
137 AsciiPrint("Variable '%s' deleted\n",VariableName);
138 } else {
139 AsciiPrint("Variable setting is incorrect. It should be VariableName=Value\n");
140 }
141 return Status;
142 }
143
144 AsciiValue[0] = '\0';
145 AsciiVariableName = AsciiVariableSetting;
146 AsciiValue++;
147
148 // Clean AsciiValue from quote
149 if (AsciiValue[0] == '"') {
150 AsciiValue++;
151 }
152 AsciiValueLength = AsciiStrLen (AsciiValue);
153 if ((AsciiValue[AsciiValueLength-2] != '\\') && (AsciiValue[AsciiValueLength-1] == '"')) {
154 AsciiValue[AsciiValueLength-1] = '\0';
155 }
156
157 // Clean AsciiValue from escaped quotes
158 for (Index = 0; Index < AsciiValueLength; Index++) {
159 if ((Index > 0) && (AsciiValue[Index-1] == '\\') && (AsciiValue[Index] == '"')) {
160 EscapedQuotes++;
161 }
162 AsciiValue[Index-EscapedQuotes] = AsciiValue[Index];
163 }
164 // Fill the end of the value with '\0'
165 for (Index = 0; Index < EscapedQuotes; Index++) {
166 AsciiValue[AsciiValueLength-1-Index] = '\0';
167 }
168
169 // Convert VariableName into Unicode
170 VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));
171 AsciiStrToUnicodeStr (AsciiVariableName,VariableName);
172
173 Status = gRT->SetVariable (
174 VariableName,
175 &gEfiGlobalVariableGuid,
176 ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |
177 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
178 AsciiStrLen (AsciiValue)+1,
179 AsciiValue
180 );
181 if (!EFI_ERROR(Status)) {
182 AsciiPrint("'%a'='%a'\n",AsciiVariableName,AsciiValue);
183 }
184
185 return Status;
186 }
187
188 GLOBAL_REMOVE_IF_UNREFERENCED const EBL_COMMAND_TABLE mCmdVariableTemplate[] =
189 {
190 {
191 "get",
192 " ; get UEFI variable\n\r [v]; verbose",
193 NULL,
194 EblGetCmd
195 },
196 {
197 "set",
198 " ; set UEFI variable\n\r [v]; create volatile variable",
199 NULL,
200 EblSetCmd
201 }
202 };
203
204 /**
205 Initialize the commands in this in this file
206 **/
207 VOID
208 EblInitializeVariableCmds (
209 VOID
210 )
211 {
212 EblAddCommands (mCmdVariableTemplate, sizeof (mCmdVariableTemplate)/sizeof (EBL_COMMAND_TABLE));
213 }