summaryrefslogtreecommitdiff
path: root/EmbeddedPkg
diff options
context:
space:
mode:
Diffstat (limited to 'EmbeddedPkg')
-rw-r--r--EmbeddedPkg/Ebl/Command.c86
-rw-r--r--EmbeddedPkg/Include/Library/EfiFileLib.h33
-rw-r--r--EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c83
3 files changed, 158 insertions, 44 deletions
diff --git a/EmbeddedPkg/Ebl/Command.c b/EmbeddedPkg/Ebl/Command.c
index 7899a0f442..a525e3a4fa 100644
--- a/EmbeddedPkg/Ebl/Command.c
+++ b/EmbeddedPkg/Ebl/Command.c
@@ -282,13 +282,13 @@ EblExitCmd (
IN CHAR8 **Argv
)
{
- EFI_STATUS Status;
- UINTN MemoryMapSize;
- EFI_MEMORY_DESCRIPTOR *MemoryMap;
- UINTN MapKey;
- UINTN DescriptorSize;
- UINTN DescriptorVersion;
- UINTN Pages;
+ EFI_STATUS Status;
+ UINTN MemoryMapSize;
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;
+ UINTN MapKey;
+ UINTN DescriptorSize;
+ UINT32 DescriptorVersion;
+ UINTN Pages;
if (Argc > 1) {
if (AsciiStriCmp (Argv[1], "efi") != 0) {
@@ -298,42 +298,42 @@ EblExitCmd (
return EFI_ABORTED;
}
- MemoryMap = NULL;
- MemoryMapSize = 0;
- do {
- Status = gBS->GetMemoryMap (
- &MemoryMapSize,
- MemoryMap,
- &MapKey,
- &DescriptorSize,
- &DescriptorVersion
- );
- if (Status == EFI_BUFFER_TOO_SMALL) {
-
- Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;
- MemoryMap = AllocatePages (Pages);
-
- //
- // Get System MemoryMap
- //
- Status = gBS->GetMemoryMap (
- &MemoryMapSize,
- MemoryMap,
- &MapKey,
- &DescriptorSize,
- &DescriptorVersion
- );
- // Don't do anything between the GetMemoryMap() and ExitBootServices()
- if (!EFI_ERROR (Status)) {
- Status = gBS->ExitBootServices (gImageHandle, MapKey);
- if (EFI_ERROR (Status)) {
- FreePages (MemoryMap, Pages);
- MemoryMap = NULL;
- MemoryMapSize = 0;
- }
- }
- }
- } while (EFI_ERROR (Status));
+ MemoryMap = NULL;
+ MemoryMapSize = 0;
+ do {
+ Status = gBS->GetMemoryMap (
+ &MemoryMapSize,
+ MemoryMap,
+ &MapKey,
+ &DescriptorSize,
+ &DescriptorVersion
+ );
+ if (Status == EFI_BUFFER_TOO_SMALL) {
+
+ Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;
+ MemoryMap = AllocatePages (Pages);
+
+ //
+ // Get System MemoryMap
+ //
+ Status = gBS->GetMemoryMap (
+ &MemoryMapSize,
+ MemoryMap,
+ &MapKey,
+ &DescriptorSize,
+ &DescriptorVersion
+ );
+ // Don't do anything between the GetMemoryMap() and ExitBootServices()
+ if (!EFI_ERROR (Status)) {
+ Status = gBS->ExitBootServices (gImageHandle, MapKey);
+ if (EFI_ERROR (Status)) {
+ FreePages (MemoryMap, Pages);
+ MemoryMap = NULL;
+ MemoryMapSize = 0;
+ }
+ }
+ }
+ } while (EFI_ERROR (Status));
//
// At this point it is very dangerous to do things EFI as most of EFI is now gone.
diff --git a/EmbeddedPkg/Include/Library/EfiFileLib.h b/EmbeddedPkg/Include/Library/EfiFileLib.h
index 992d326997..4e3c80d7ec 100644
--- a/EmbeddedPkg/Include/Library/EfiFileLib.h
+++ b/EmbeddedPkg/Include/Library/EfiFileLib.h
@@ -311,5 +311,38 @@ UINTN
EfiGetDeviceCounts (
IN EFI_OPEN_FILE_TYPE Type
);
+
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+
+ @param Cwd Current Working Directory to set
+
+
+ @return EFI_SUCCESS CWD is set
+ @return EFI_INVALID_PARAMETER Cwd is not a valid device:path
+
+**/
+EFI_STATUS
+EfiSetCwd (
+ IN CHAR8 *Cwd
+ );
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+
+ @param Cwd Current Working Directory
+
+
+ @return NULL No CWD set
+ @return 'other' malloc'ed buffer contains CWD.
+
+**/
+CHAR8 *
+EfiGettCwd (
+ VOID
+ );
#endif
diff --git a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
index 5effe7fcb9..cbe2aeeceb 100644
--- a/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
+++ b/EmbeddedPkg/Library/EfiFileLib/EfiFileLib.c
@@ -55,6 +55,9 @@
#include <Library/EblNetworkLib.h>
+CHAR8 *gCwd = NULL;
+
+
#define EFI_OPEN_FILE_GUARD_HEADER 0x4B4D4641
#define EFI_OPEN_FILE_GUARD_FOOTER 0x444D5A56
@@ -635,6 +638,7 @@ EfiOpen (
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN Size;
EFI_IP_ADDRESS Ip;
+ CHAR8 *CwdPlusPathName;
EblUpdateDeviceLists ();
@@ -656,8 +660,22 @@ EfiOpen (
}
if (FileStart == 0) {
+ if (gCwd == NULL) {
+ // No CWD
+ return NULL;
+ }
+
// We could add a current working diretory concept
- return NULL;
+ CwdPlusPathName = AllocatePool (AsciiStrSize (gCwd) + AsciiStrSize (PathName));
+ if (CwdPlusPathName == NULL) {
+ return NULL;
+ }
+
+ AsciiStrCpy (CwdPlusPathName, gCwd);
+ AsciiStrCat (CwdPlusPathName, PathName);
+ File = EfiOpen (CwdPlusPathName, OpenMode, SectionType);
+ FreePool (CwdPlusPathName);
+ return File;
}
//
@@ -1481,3 +1499,66 @@ EfiWrite (
return Status;
}
+
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+
+ @param Cwd Current Working Directory to set
+
+
+ @return EFI_SUCCESS CWD is set
+ @return EFI_INVALID_PARAMETER Cwd is not a valid device:path
+
+**/
+EFI_STATUS
+EfiSetCwd (
+ IN CHAR8 *Cwd
+ )
+{
+ EFI_OPEN_FILE *File;
+
+ File = EfiOpen (Cwd, EFI_FILE_MODE_READ, 0);
+ if (File == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ EfiClose (File);
+
+ if (gCwd != NULL) {
+ FreePool (gCwd);
+ }
+
+ gCwd = AllocatePool (AsciiStrSize (Cwd));
+ if (gCwd == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+ AsciiStrCpy (gCwd, Cwd);
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and
+ the path does not contain a device name, The CWD is prepended to the path.
+ The CWD buffer is only valid until a new call is made to EfiSetCwd(). After
+ a call to EfiSetCwd() it is not legal to use the pointer returned by
+ this funciton.
+
+ @param Cwd Current Working Directory
+
+
+ @return NULL No CWD set
+ @return 'other' Returns buffer that contains CWD.
+
+**/
+CHAR8 *
+EfiGettCwd (
+ VOID
+ )
+{
+ return gCwd;
+}
+
+