]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Application/ShellLibTestApp/sa3.c
Fix the issue that accessing for unaligned address break IPF
[mirror_edk2.git] / ShellPkg / Application / ShellLibTestApp / sa3.c
1 /** @file
2 This is a simple shell application
3
4 This should be executed with "/Param2 Val1" and "/Param1" as the 2 command line options!
5
6 Copyright (c) 2008-2009, Intel Corporation
7 All rights reserved. This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14
15 **/
16
17 #include <Uefi.h>
18 #include <Guid/FileInfo.h>
19 #include <Protocol/SimpleFileSystem.h>
20 #include <Protocol/LoadedImage.h>
21 #include <Protocol/EfiShellInterface.h>
22 #include <Protocol/EfiShellEnvironment2.h>
23 #include <Protocol/EfiShell.h>
24 #include <Protocol/EfiShellParameters.h>
25 #include <Library/UefiApplicationEntryPoint.h>
26 #include <Library/UefiLib.h>
27 #include <Library/ShellLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/MemoryAllocationLib.h>
30
31 SHELL_PARAM_ITEM ParamList[] = {
32 {L"/Param1", TypeFlag},
33 {L"/Param2", TypeValue},
34 {L"/Param3", TypeDoubleValue},
35 {L"/Param4", TypeMaxValue},
36 {NULL, TypeMax}};
37
38 /**
39 as the real entry point for the application.
40
41 @param[in] ImageHandle The firmware allocated handle for the EFI image.
42 @param[in] SystemTable A pointer to the EFI System Table.
43
44 @retval EFI_SUCCESS The entry point is executed successfully.
45 @retval other Some error occurs when executing this entry point.
46
47 **/
48 EFI_STATUS
49 EFIAPI
50 UefiMain (
51 IN EFI_HANDLE ImageHandle,
52 IN EFI_SYSTEM_TABLE *SystemTable
53 )
54 {
55 EFI_FILE_HANDLE FileHandle;
56 EFI_STATUS Status;
57 CHAR16 FileName[100];
58 UINTN BufferSize;
59 UINT64 Position;
60 UINT8 Buffer[200];
61 EFI_FILE_INFO *pFileInfo;
62 UINT64 Size;
63 BOOLEAN NoFile;
64 EFI_SHELL_FILE_INFO *pShellFileInfo;
65 LIST_ENTRY *List;
66 // CONST CHAR16 *Tester;
67
68 FileHandle = NULL;
69 StrCpy(FileName, L"testfile.txt");
70 // Position = 0;
71 pFileInfo = NULL;
72 Size = 0;
73 NoFile = FALSE;
74 pShellFileInfo = NULL;
75 List = NULL;
76
77 // command line param functions
78 Status = ShellCommandLineParse(ParamList, &List, NULL, FALSE);
79 // if you put an invalid parameter you SHOULD hit this assert.
80 ASSERT_EFI_ERROR(Status);
81 if (List) {
82 ASSERT(ShellCommandLineGetFlag(List, L"/Param5") == FALSE);
83 ASSERT(ShellCommandLineGetFlag(List, L"/Param1") != FALSE);
84 ASSERT(StrCmp(ShellCommandLineGetValue(List, L"/Param2"), L"Val1")==0);
85 ASSERT(StrCmp(ShellCommandLineGetRawValue(List, 0), L"SimpleApplication.efi")==0);
86 // Tester = ShellCommandLineGetValue(List, L"/Param3");
87 // Tester = ShellCommandLineGetValue(List, L"/Param4");
88
89 ShellCommandLineFreeVarList(List);
90 } else {
91 Print(L"param checking skipped.\r\n");
92 }
93
94 // return (EFI_SUCCESS);
95
96
97 ASSERT(ShellGetExecutionBreakFlag() == FALSE);
98 ASSERT(StrCmp(ShellGetCurrentDir(NULL), L"f10:\\") == 0);
99 Print(L"execution break and get cur dir - pass\r\n");
100
101 ShellSetPageBreakMode(TRUE);
102
103 Status = ShellOpenFileByName(FileName,
104 &FileHandle,
105 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
106 0
107 );
108 ASSERT_EFI_ERROR(Status);
109
110 BufferSize = StrSize(FileName);
111 Status = ShellWriteFile(FileHandle, &BufferSize, FileName);
112 ASSERT_EFI_ERROR(Status);
113 Status = ShellGetFilePosition(FileHandle, &Position);
114 ASSERT_EFI_ERROR(Status);
115 ASSERT(Position == 0x1A);
116 Status = ShellSetFilePosition(FileHandle, 0);
117 ASSERT_EFI_ERROR(Status);
118 BufferSize = sizeof(Buffer) * sizeof(Buffer[0]);
119 Status = ShellReadFile(FileHandle, &BufferSize, Buffer);
120 ASSERT_EFI_ERROR(Status);
121 ASSERT(BufferSize == 0x1A);
122 ASSERT(StrCmp((CHAR16*)Buffer, FileName) == 0);
123 pFileInfo = ShellGetFileInfo(FileHandle);
124 ASSERT(pFileInfo != NULL);
125 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
126 ASSERT(pFileInfo->FileSize == 0x1A);
127 FreePool(pFileInfo);
128 pFileInfo = NULL;
129 Status = ShellCloseFile(&FileHandle);
130 ASSERT_EFI_ERROR(Status);
131 Print(L"read, write, create, getinfo - pass\r\n");
132
133 Status = ShellOpenFileByName(FileName,
134 &FileHandle,
135 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
136 0
137 );
138 ASSERT_EFI_ERROR(Status);
139 pFileInfo = ShellGetFileInfo(FileHandle);
140 ASSERT(pFileInfo != NULL);
141 pFileInfo->FileSize = 0x20;
142 Status = ShellSetFileInfo(FileHandle, pFileInfo);
143 FreePool(pFileInfo);
144 pFileInfo = NULL;
145 ASSERT_EFI_ERROR(Status);
146 pFileInfo = ShellGetFileInfo(FileHandle);
147 ASSERT(pFileInfo != NULL);
148 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
149 ASSERT(pFileInfo->PhysicalSize == 0x20);
150 ASSERT(pFileInfo->FileSize == 0x20);
151 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
152 FreePool(pFileInfo);
153 Status = ShellGetFileSize(FileHandle, &Size);
154 ASSERT(Size == 0x20);
155 ASSERT_EFI_ERROR(Status);
156 Status = ShellCloseFile(&FileHandle);
157 ASSERT_EFI_ERROR(Status);
158 Print(L"setinfo and change size, getsize - pass\r\n");
159
160 Status = ShellOpenFileByName(FileName,
161 &FileHandle,
162 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
163 0
164 );
165 ASSERT_EFI_ERROR(Status);
166
167 pFileInfo = ShellGetFileInfo(FileHandle);
168 ASSERT(pFileInfo != NULL);
169 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
170 ASSERT(pFileInfo->PhysicalSize == 0x20);
171 ASSERT(pFileInfo->FileSize == 0x20);
172 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
173 FreePool(pFileInfo);
174 pFileInfo = NULL;
175 Status = ShellDeleteFile(&FileHandle);
176 ASSERT_EFI_ERROR(Status);
177 Print(L"reopen file - pass\r\n");
178
179 Status = ShellOpenFileByName(FileName,
180 &FileHandle,
181 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
182 0
183 );
184 ASSERT_EFI_ERROR(Status);
185 pFileInfo = ShellGetFileInfo(FileHandle);
186 ASSERT(pFileInfo != NULL);
187 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
188 ASSERT(pFileInfo->PhysicalSize == 0x0);
189 ASSERT(pFileInfo->FileSize == 0x0);
190 ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
191 FreePool(pFileInfo);
192 Status = ShellDeleteFile(&FileHandle);
193 ASSERT_EFI_ERROR(Status);
194 Print(L"size of empty - pass\r\n");
195
196 Status = ShellOpenFileByName(FileName,
197 &FileHandle,
198 EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
199 0
200 );
201 ASSERT(Status == EFI_NOT_FOUND);
202 ASSERT(FileHandle == NULL);
203
204 Status = ShellCreateDirectory(FileName, &FileHandle);
205 ASSERT_EFI_ERROR(Status);
206 ASSERT(FileHandle != NULL);
207 pFileInfo = ShellGetFileInfo(FileHandle);
208 ASSERT(pFileInfo != NULL);
209 ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
210 ASSERT(pFileInfo->Attribute&EFI_FILE_DIRECTORY);
211 Status = ShellDeleteFile(&FileHandle);
212 ASSERT_EFI_ERROR(Status);
213 Print(L"Directory create - pass\r\n");
214
215 // FindFirst and FindNext
216 StrCpy(FileName, L"testDir");
217 Status = ShellCreateDirectory(FileName, &FileHandle);
218 Status = ShellCloseFile(&FileHandle);
219 StrCat(FileName, L"\\File.txt");
220 Status = ShellOpenFileByName(FileName,
221 &FileHandle,
222 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
223 0
224 );
225 ASSERT_EFI_ERROR(Status);
226 Status = ShellCloseFile(&FileHandle);
227 StrCpy(FileName, L"testDir");
228 Status = ShellOpenFileByName(FileName,
229 &FileHandle,
230 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
231 0
232 );
233 ASSERT_EFI_ERROR(Status);
234 Status = ShellFindFirstFile(FileHandle, &pFileInfo);
235 ASSERT_EFI_ERROR(Status);
236 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
237 ASSERT_EFI_ERROR(Status);
238 ASSERT(NoFile == FALSE);
239 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
240 ASSERT_EFI_ERROR(Status);
241 ASSERT(NoFile == FALSE);
242 Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
243 ASSERT_EFI_ERROR(Status);
244 ///@todo - why is NoFile never set? limitation of NT32 file system?
245 Status = ShellDeleteFile(&FileHandle);
246 ASSERT(Status == RETURN_WARN_DELETE_FAILURE);
247 Print(L"FindFirst - pass\r\n");
248 Print(L"FindNext - Verify with real EFI system. Cant verify NoFile under NT32\r\n");
249
250 // open and close meta arg
251 Status = ShellOpenFileMetaArg(L"testDir\\*.*", EFI_FILE_MODE_READ, &pShellFileInfo);
252 ASSERT_EFI_ERROR(Status);
253 ASSERT(pShellFileInfo->Status == 0);
254 ASSERT(StrCmp(pShellFileInfo->FileName, L"File.txt") == 0);
255 ASSERT(pShellFileInfo->Handle);
256 ASSERT(pShellFileInfo->Info);
257 ASSERT(pShellFileInfo->Info->FileSize == 0);
258 ASSERT(StrCmp(pShellFileInfo->Info->FileName, L"File.txt") == 0);
259 ASSERT(pShellFileInfo->Info->Attribute == 0);
260
261 Status = ShellCloseFileMetaArg(&pShellFileInfo);
262 ASSERT_EFI_ERROR(Status);
263 Print(L"Open/Close Meta Arg - pass\r\n");
264
265 // now delete that file and that directory
266 StrCat(FileName, L"\\File.txt");
267 Status = ShellOpenFileByName(FileName,
268 &FileHandle,
269 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
270 0
271 );
272 ASSERT_EFI_ERROR(Status);
273 Status = ShellDeleteFile(&FileHandle);
274 StrCpy(FileName, L"testDir");
275 ASSERT_EFI_ERROR(Status);
276 Status = ShellOpenFileByName(FileName,
277 &FileHandle,
278 EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE,
279 0
280 );
281 Status = ShellDeleteFile(&FileHandle);
282 ASSERT_EFI_ERROR(Status);
283
284 // get environment variable
285 // made for testing under nt32
286 ASSERT(StrCmp(ShellGetEnvironmentVariable(L"path"), L".;f10:\\efi\\tools;f10:\\efi\\boot;f10:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
287 Print(L"ShellGetEnvironmentVariable - pass\r\n");
288
289 // set environment variable
290 Status = ShellSetEnvironmentVariable(L"", L"", FALSE);
291 ASSERT(Status == EFI_UNSUPPORTED);
292 Print(L"ShellSetEnvironmentVariable - pass\r\n");
293
294 // ShellExecute
295 Status = ShellExecute(&ImageHandle, L"EmptyApplication.efi", TRUE, NULL, NULL);
296 ASSERT_EFI_ERROR(Status);
297 // the pass printout for this is performed by EmptyApplication
298 Print(L"\r\n");
299
300 // page break mode (done last so we can see the results)
301 // we set this true at the begining of the program
302 // this is enough lines to trigger the page...
303 Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n");
304 ShellSetPageBreakMode(FALSE);
305 Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49\r\n50\r\n51\r\n52\r\n53\r\n54\r\n55\r\n56\r\n57\r\n58\r\n59\r\n60\r\n");
306
307 return EFI_SUCCESS;
308 }
309
310
311 /*
312 done - ShellGetFileInfo
313 done - ShellSetFileInfo
314 done - ShellOpenFileByDevicePath
315 done - ShellOpenFileByName
316 done - ShellCreateDirectory
317 done - ShellReadFile
318 done - ShellWriteFile
319 done - ShellCloseFile
320 done - ShellDeleteFile
321 done - ShellSetFilePosition
322 done - ShellGetFilePosition
323 ???? - ShellFlushFile
324 done - ShellFindFirstFile
325 done - ShellFindNextFile
326 done - ShellGetFileSize
327 done - ShellGetExecutionBreakFlag
328 done - ShellGetEnvironmentVariable
329 done - ShellSetEnvironmentVariable
330 done - ShellExecute
331 done - ShellGetCurrentDir
332 done - ShellSetPageBreakMode
333 done - ShellOpenFileMetaArg
334 done - ShellCloseFileMetaArg
335 done - ShellCommandLineParse
336 done - ShellCommandLineFreeVarList
337 done - ShellCommandLineGetFlag
338 done - ShellCommandLineGetValue
339 done - ShellCommandLineGetRawValue
340 */