2 Main file for NULL named library for debug1 profile shell command functions.
4 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>
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
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.
15 #include "UefiShellDebug1CommandsLib.h"
16 #include <Library/BcfgCommandLib.h>
18 STATIC CONST CHAR16 mFileName
[] = L
"Debug1Commands";
19 EFI_HANDLE gShellDebug1HiiHandle
= NULL
;
22 Gets the debug file name. This will be used if HII is not working.
24 @retval NULL No file is available.
25 @return The NULL-terminated filename to get help from.
29 ShellCommandGetManFileNameDebug1 (
37 Constructor for the Shell Debug1 Commands library.
39 @param ImageHandle the image handle of the process
40 @param SystemTable the EFI System Table pointer
42 @retval EFI_SUCCESS the shell command handlers were installed sucessfully
43 @retval EFI_UNSUPPORTED the shell level required was not found.
47 UefiShellDebug1CommandsLibConstructor (
48 IN EFI_HANDLE ImageHandle
,
49 IN EFI_SYSTEM_TABLE
*SystemTable
53 // check our bit of the profiles mask
55 if ((PcdGet8(PcdShellProfileMask
) & BIT1
) == 0) {
60 // install the HII stuff.
62 gShellDebug1HiiHandle
= HiiAddPackages (&gShellDebug1HiiGuid
, gImageHandle
, UefiShellDebug1CommandsLibStrings
, NULL
);
63 if (gShellDebug1HiiHandle
== NULL
) {
64 return (EFI_DEVICE_ERROR
);
68 // install our shell command handlers that are always installed
70 ShellCommandRegisterCommandName(L
"setsize", ShellCommandRunSetSize
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_SETSIZE
) );
71 ShellCommandRegisterCommandName(L
"comp", ShellCommandRunComp
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_COMP
) );
72 ShellCommandRegisterCommandName(L
"mode", ShellCommandRunMode
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_MODE
) );
73 ShellCommandRegisterCommandName(L
"memmap", ShellCommandRunMemMap
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_MEMMAP
) );
74 ShellCommandRegisterCommandName(L
"eficompress", ShellCommandRunEfiCompress
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_EFICOMPRESS
) );
75 ShellCommandRegisterCommandName(L
"efidecompress", ShellCommandRunEfiDecompress
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_EFIDCOMPRESS
) );
76 ShellCommandRegisterCommandName(L
"dmem", ShellCommandRunDmem
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_DMEM
) );
77 ShellCommandRegisterCommandName(L
"loadpcirom", ShellCommandRunLoadPciRom
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_LOAD_PCI_ROM
) );
78 ShellCommandRegisterCommandName(L
"mm", ShellCommandRunMm
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_MM
) );
79 ShellCommandRegisterCommandName(L
"setvar", ShellCommandRunSetVar
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_SETVAR
) );
80 ShellCommandRegisterCommandName(L
"sermode", ShellCommandRunSerMode
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_SERMODE
) );
81 ShellCommandRegisterCommandName(L
"pci", ShellCommandRunPci
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_PCI
) );
82 ShellCommandRegisterCommandName(L
"smbiosview", ShellCommandRunSmbiosView
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_SMBIOSVIEW
) );
83 ShellCommandRegisterCommandName(L
"dmpstore", ShellCommandRunDmpStore
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_DMPSTORE
) );
84 ShellCommandRegisterCommandName(L
"dblk", ShellCommandRunDblk
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_DBLK
) );
85 ShellCommandRegisterCommandName(L
"edit", ShellCommandRunEdit
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_EDIT
) );
86 ShellCommandRegisterCommandName(L
"hexedit", ShellCommandRunHexEdit
, ShellCommandGetManFileNameDebug1
, 0, L
"Debug1", TRUE
, gShellDebug1HiiHandle
, STRING_TOKEN(STR_GET_HELP_HEXEDIT
) );
88 ShellCommandRegisterAlias(L
"dmem", L
"mem");
90 BcfgLibraryRegisterBcfgCommand(ImageHandle
, SystemTable
, L
"Debug1");
96 Destructor for the library. free any resources.
98 @param ImageHandle The image handle of the process.
99 @param SystemTable The EFI System Table pointer.
103 UefiShellDebug1CommandsLibDestructor (
104 IN EFI_HANDLE ImageHandle
,
105 IN EFI_SYSTEM_TABLE
*SystemTable
108 if (gShellDebug1HiiHandle
!= NULL
) {
109 HiiRemovePackages(gShellDebug1HiiHandle
);
112 BcfgLibraryUnregisterBcfgCommand(ImageHandle
, SystemTable
);
113 return (EFI_SUCCESS
);
117 Convert a Unicode character to upper case only if
118 it maps to a valid small-case ASCII character.
120 This internal function only deal with Unicode character
121 which maps to a valid small-case ASCII character, i.e.
122 L'a' to L'z'. For other Unicode character, the input character
123 is returned directly.
125 @param Char The character to convert.
127 @retval LowerCharacter If the Char is with range L'a' to L'z'.
128 @retval Unchanged Otherwise.
131 //Stolen from MdePkg Baselib
138 if (Char
>= L
'a' && Char
<= L
'z') {
139 return (CHAR16
) (Char
- (L
'a' - L
'A'));
146 Function returns a system configuration table that is stored in the
147 EFI System Table based on the provided GUID.
149 @param[in] TableGuid A pointer to the table's GUID type.
150 @param[in, out] Table On exit, a pointer to a system configuration table.
152 @retval EFI_SUCCESS A configuration table matching TableGuid was found.
153 @retval EFI_NOT_FOUND A configuration table matching TableGuid was not found.
156 GetSystemConfigurationTable (
157 IN EFI_GUID
*TableGuid
,
162 ASSERT (Table
!= NULL
);
164 for (Index
= 0; Index
< gST
->NumberOfTableEntries
; Index
++) {
165 if (CompareGuid (TableGuid
, &(gST
->ConfigurationTable
[Index
].VendorGuid
))) {
166 *Table
= gST
->ConfigurationTable
[Index
].VendorTable
;
171 return EFI_NOT_FOUND
;
175 Clear the line at the specified Row.
177 @param[in] Row The row number to be cleared ( start from 1 )
178 @param[in] LastCol The last printable column.
179 @param[in] LastRow The last printable row.
196 // prepare a blank line
197 // If max column is larger, split to multiple prints.
199 SetMem16 (Line
, sizeof (Line
), L
' ');
200 Line
[ARRAY_SIZE (Line
) - 1] = CHAR_NULL
;
202 for (Col
= 1; Col
<= LastCol
; Col
+= ARRAY_SIZE (Line
) - 1) {
203 if (Col
+ ARRAY_SIZE (Line
) - 1 > LastCol
) {
204 if (Row
== LastRow
) {
206 // if CHAR_NULL is still at position LastCol, it will cause first line error
208 Line
[(LastCol
- 1) % (ARRAY_SIZE (Line
) - 1)] = CHAR_NULL
;
210 Line
[LastCol
% (ARRAY_SIZE (Line
) - 1)] = CHAR_NULL
;
215 // print out the blank line
217 ShellPrintEx ((INT32
) Col
- 1, (INT32
) Row
- 1, Line
);
222 Determine if the character is valid for a filename.
224 @param[in] Ch The character to test.
226 @retval TRUE The character is valid.
227 @retval FALSE The character is not valid.
230 IsValidFileNameChar (
235 // See if there are any illegal characters within the name
237 if (Ch
< 0x20 || Ch
== L
'\"' || Ch
== L
'*' || Ch
== L
'/' || Ch
== L
'<' || Ch
== L
'>' || Ch
== L
'?' || Ch
== L
'|') {
245 Check if file name has illegal characters.
247 @param Name The filename to check.
249 @retval TRUE The filename is ok.
250 @retval FALSE The filename is not ok.
254 IN CONST CHAR16
*Name
262 // check the length of Name
264 for (Len
= 0, Index
= StrLen (Name
) - 1; Index
+ 1 != 0; Index
--, Len
++) {
265 if (Name
[Index
] == '\\' || Name
[Index
] == ':') {
270 if (Len
== 0 || Len
> 255) {
274 // check whether any char in Name not appears in valid file name char
276 for (Index
= 0; Index
< StrLen (Name
); Index
++) {
277 if (!IsValidFileNameChar (Name
[Index
])) {
286 Find a filename that is valid (not taken) with the given extension.
288 @param[in] Extension The file extension.
290 @retval NULL Something went wrong.
291 @return the valid filename.
294 EditGetDefaultFileName (
295 IN CONST CHAR16
*Extension
305 FileNameTmp
= CatSPrint (NULL
, L
"NewFile%d.%s", Suffix
, Extension
);
308 // after that filename changed to path
310 Status
= ShellFileExists (FileNameTmp
);
312 if (Status
== EFI_NOT_FOUND
) {
316 FreePool (FileNameTmp
);
319 } while (Suffix
!= 0);
321 FreePool (FileNameTmp
);
326 Read a file into an allocated buffer. The buffer is the responsibility
327 of the caller to free.
329 @param[in] FileName The filename of the file to open.
330 @param[out] Buffer Upon successful return, the pointer to the
331 address of the allocated buffer.
332 @param[out] BufferSize If not NULL, then the pointer to the size
333 of the allocated buffer.
334 @param[out] ReadOnly Upon successful return TRUE if the file is
335 read only. FALSE otherwise.
337 @retval EFI_NOT_FOUND The filename did not represent a file in the
339 @retval EFI_SUCCESS The file was read into the buffer.
340 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
341 @retval EFI_LOAD_ERROR The file read operation failed.
342 @retval EFI_INVALID_PARAMETER A parameter was invalid.
343 @retval EFI_INVALID_PARAMETER FileName was NULL.
344 @retval EFI_INVALID_PARAMETER FileName was a directory.
348 IN CONST CHAR16
*FileName
,
350 OUT UINTN
*BufferSize OPTIONAL
,
351 OUT BOOLEAN
*ReadOnly
354 VOID
*InternalBuffer
;
356 SHELL_FILE_HANDLE FileHandle
;
361 InternalBuffer
= NULL
;
365 Status
= EFI_SUCCESS
;
368 if (FileName
== NULL
|| Buffer
== NULL
|| ReadOnly
== NULL
) {
369 return (EFI_INVALID_PARAMETER
);
373 // try to open the file
375 Status
= ShellOpenFileByName (FileName
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
377 if (!EFI_ERROR(Status
)) {
378 ASSERT(CreateFile
== FALSE
);
379 if (FileHandle
== NULL
) {
380 return EFI_LOAD_ERROR
;
383 Info
= ShellGetFileInfo(FileHandle
);
385 if (Info
->Attribute
& EFI_FILE_DIRECTORY
) {
387 return EFI_INVALID_PARAMETER
;
390 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
398 FileSize
= (UINTN
) Info
->FileSize
;
401 } else if (Status
== EFI_NOT_FOUND
) {
403 // file not exists. add create and try again
405 Status
= ShellOpenFileByName (FileName
, &FileHandle
, EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
|EFI_FILE_MODE_CREATE
, 0);
406 if (EFI_ERROR (Status
)) {
410 // it worked. now delete it and move on with the name (now validated)
412 Status
= ShellDeleteFile (&FileHandle
);
413 if (Status
== EFI_WARN_DELETE_FAILURE
) {
414 Status
= EFI_ACCESS_DENIED
;
416 if (EFI_ERROR (Status
)) {
421 // file doesn't exist, so set CreateFile to TRUE and can't be read-only
432 // allocate buffer to read file
434 InternalBuffer
= AllocateZeroPool (FileSize
);
435 if (InternalBuffer
== NULL
) {
436 return EFI_OUT_OF_RESOURCES
;
439 // read file into InternalBuffer
441 Status
= ShellReadFile (FileHandle
, &FileSize
, InternalBuffer
);
442 ShellCloseFile(&FileHandle
);
444 if (EFI_ERROR (Status
)) {
445 SHELL_FREE_NON_NULL (InternalBuffer
);
446 return EFI_LOAD_ERROR
;
449 *Buffer
= InternalBuffer
;
450 if (BufferSize
!= NULL
) {
451 *BufferSize
= FileSize
;
453 return (EFI_SUCCESS
);