]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - MdeModulePkg/Application/CapsuleApp/AppSupport.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / AppSupport.c
... / ...
CommitLineData
1/** @file\r
2 A shell application that triggers capsule update process.\r
3\r
4 Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include "CapsuleApp.h"\r
10\r
11UINTN Argc;\r
12CHAR16 **Argv;\r
13EFI_SHELL_PROTOCOL *mShellProtocol = NULL;\r
14\r
15/**\r
16\r
17 This function parse application ARG.\r
18\r
19 @return Status\r
20**/\r
21EFI_STATUS\r
22GetArg (\r
23 VOID\r
24 )\r
25{\r
26 EFI_STATUS Status;\r
27 EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;\r
28\r
29 Status = gBS->HandleProtocol (\r
30 gImageHandle,\r
31 &gEfiShellParametersProtocolGuid,\r
32 (VOID **)&ShellParameters\r
33 );\r
34 if (EFI_ERROR (Status)) {\r
35 return Status;\r
36 }\r
37\r
38 Argc = ShellParameters->Argc;\r
39 Argv = ShellParameters->Argv;\r
40 return EFI_SUCCESS;\r
41}\r
42\r
43/**\r
44 Get shell protocol.\r
45\r
46 @return Pointer to shell protocol.\r
47**/\r
48EFI_SHELL_PROTOCOL *\r
49GetShellProtocol (\r
50 VOID\r
51 )\r
52{\r
53 EFI_STATUS Status;\r
54\r
55 if (mShellProtocol == NULL) {\r
56 Status = gBS->LocateProtocol (\r
57 &gEfiShellProtocolGuid,\r
58 NULL,\r
59 (VOID **)&mShellProtocol\r
60 );\r
61 if (EFI_ERROR (Status)) {\r
62 mShellProtocol = NULL;\r
63 }\r
64 }\r
65\r
66 return mShellProtocol;\r
67}\r
68\r
69/**\r
70 Read a file.\r
71\r
72 @param[in] FileName The file to be read.\r
73 @param[out] BufferSize The file buffer size\r
74 @param[out] Buffer The file buffer\r
75\r
76 @retval EFI_SUCCESS Read file successfully\r
77 @retval EFI_NOT_FOUND Shell protocol or file not found\r
78 @retval others Read file failed\r
79**/\r
80EFI_STATUS\r
81ReadFileToBuffer (\r
82 IN CHAR16 *FileName,\r
83 OUT UINTN *BufferSize,\r
84 OUT VOID **Buffer\r
85 )\r
86{\r
87 EFI_STATUS Status;\r
88 EFI_SHELL_PROTOCOL *ShellProtocol;\r
89 SHELL_FILE_HANDLE Handle;\r
90 UINT64 FileSize;\r
91 UINTN TempBufferSize;\r
92 VOID *TempBuffer;\r
93\r
94 ShellProtocol = GetShellProtocol ();\r
95 if (ShellProtocol == NULL) {\r
96 return EFI_NOT_FOUND;\r
97 }\r
98\r
99 //\r
100 // Open file by FileName.\r
101 //\r
102 Status = ShellProtocol->OpenFileByName (\r
103 FileName,\r
104 &Handle,\r
105 EFI_FILE_MODE_READ\r
106 );\r
107 if (EFI_ERROR (Status)) {\r
108 return Status;\r
109 }\r
110\r
111 //\r
112 // Get the file size.\r
113 //\r
114 Status = ShellProtocol->GetFileSize (Handle, &FileSize);\r
115 if (EFI_ERROR (Status)) {\r
116 ShellProtocol->CloseFile (Handle);\r
117 return Status;\r
118 }\r
119\r
120 TempBufferSize = (UINTN)FileSize;\r
121 TempBuffer = AllocateZeroPool (TempBufferSize);\r
122 if (TempBuffer == NULL) {\r
123 ShellProtocol->CloseFile (Handle);\r
124 return EFI_OUT_OF_RESOURCES;\r
125 }\r
126\r
127 //\r
128 // Read the file data to the buffer\r
129 //\r
130 Status = ShellProtocol->ReadFile (\r
131 Handle,\r
132 &TempBufferSize,\r
133 TempBuffer\r
134 );\r
135 if (EFI_ERROR (Status)) {\r
136 ShellProtocol->CloseFile (Handle);\r
137 return Status;\r
138 }\r
139\r
140 ShellProtocol->CloseFile (Handle);\r
141\r
142 *BufferSize = TempBufferSize;\r
143 *Buffer = TempBuffer;\r
144 return EFI_SUCCESS;\r
145}\r
146\r
147/**\r
148 Write a file.\r
149\r
150 @param[in] FileName The file to be written.\r
151 @param[in] BufferSize The file buffer size\r
152 @param[in] Buffer The file buffer\r
153\r
154 @retval EFI_SUCCESS Write file successfully\r
155 @retval EFI_NOT_FOUND Shell protocol not found\r
156 @retval others Write file failed\r
157**/\r
158EFI_STATUS\r
159WriteFileFromBuffer (\r
160 IN CHAR16 *FileName,\r
161 IN UINTN BufferSize,\r
162 IN VOID *Buffer\r
163 )\r
164{\r
165 EFI_STATUS Status;\r
166 EFI_SHELL_PROTOCOL *ShellProtocol;\r
167 SHELL_FILE_HANDLE Handle;\r
168 EFI_FILE_INFO *FileInfo;\r
169 UINTN TempBufferSize;\r
170\r
171 ShellProtocol = GetShellProtocol ();\r
172 if (ShellProtocol == NULL) {\r
173 return EFI_NOT_FOUND;\r
174 }\r
175\r
176 //\r
177 // Open file by FileName.\r
178 //\r
179 Status = ShellProtocol->OpenFileByName (\r
180 FileName,\r
181 &Handle,\r
182 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE\r
183 );\r
184 if (EFI_ERROR (Status)) {\r
185 return Status;\r
186 }\r
187\r
188 //\r
189 // Empty the file contents.\r
190 //\r
191 FileInfo = ShellProtocol->GetFileInfo (Handle);\r
192 if (FileInfo == NULL) {\r
193 ShellProtocol->CloseFile (Handle);\r
194 return EFI_DEVICE_ERROR;\r
195 }\r
196\r
197 //\r
198 // If the file size is already 0, then it has been empty.\r
199 //\r
200 if (FileInfo->FileSize != 0) {\r
201 //\r
202 // Set the file size to 0.\r
203 //\r
204 FileInfo->FileSize = 0;\r
205 Status = ShellProtocol->SetFileInfo (Handle, FileInfo);\r
206 if (EFI_ERROR (Status)) {\r
207 FreePool (FileInfo);\r
208 ShellProtocol->CloseFile (Handle);\r
209 return Status;\r
210 }\r
211 }\r
212\r
213 FreePool (FileInfo);\r
214\r
215 //\r
216 // Write the file data from the buffer\r
217 //\r
218 TempBufferSize = BufferSize;\r
219 Status = ShellProtocol->WriteFile (\r
220 Handle,\r
221 &TempBufferSize,\r
222 Buffer\r
223 );\r
224 if (EFI_ERROR (Status)) {\r
225 ShellProtocol->CloseFile (Handle);\r
226 return Status;\r
227 }\r
228\r
229 ShellProtocol->CloseFile (Handle);\r
230\r
231 return EFI_SUCCESS;\r
232}\r