)\r
{\r
if (Thumb) {\r
- DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, &ItBlock, Extended);\r
+ DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, ItBlock, Extended);\r
} else {\r
DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);\r
}\r
IN CHAR8 **Argv\r
)\r
{\r
- EFI_STATUS Status;
- UINTN MemoryMapSize;
- EFI_MEMORY_DESCRIPTOR *MemoryMap;
- UINTN MapKey;
- UINTN DescriptorSize;
- UINTN DescriptorVersion;
- UINTN Pages;
+ EFI_STATUS Status;\r
+ UINTN MemoryMapSize;\r
+ EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
+ UINTN MapKey;\r
+ UINTN DescriptorSize;\r
+ UINT32 DescriptorVersion;\r
+ UINTN Pages;\r
\r
if (Argc > 1) { \r
if (AsciiStriCmp (Argv[1], "efi") != 0) {\r
return EFI_ABORTED;\r
}\r
\r
- 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;\r
+ MemoryMapSize = 0;\r
+ do {\r
+ Status = gBS->GetMemoryMap (\r
+ &MemoryMapSize,\r
+ MemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+\r
+ Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
+ MemoryMap = AllocatePages (Pages);\r
+ \r
+ //\r
+ // Get System MemoryMap\r
+ //\r
+ Status = gBS->GetMemoryMap (\r
+ &MemoryMapSize,\r
+ MemoryMap,\r
+ &MapKey,\r
+ &DescriptorSize,\r
+ &DescriptorVersion\r
+ );\r
+ // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
+ if (EFI_ERROR (Status)) {\r
+ FreePages (MemoryMap, Pages);\r
+ MemoryMap = NULL;\r
+ MemoryMapSize = 0;\r
+ }\r
+ }\r
+ }\r
+ } while (EFI_ERROR (Status));\r
\r
//\r
// At this point it is very dangerous to do things EFI as most of EFI is now gone.\r
EfiGetDeviceCounts (\r
IN EFI_OPEN_FILE_TYPE Type\r
);\r
+ \r
+\r
+/**\r
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and \r
+ the path does not contain a device name, The CWD is prepended to the path.\r
+ \r
+ @param Cwd Current Working Directory to set\r
+\r
+\r
+ @return EFI_SUCCESS CWD is set\r
+ @return EFI_INVALID_PARAMETER Cwd is not a valid device:path\r
+\r
+**/\r
+EFI_STATUS\r
+EfiSetCwd (\r
+ IN CHAR8 *Cwd\r
+ ); \r
+\r
+/**\r
+ Set the Curent Working Directory (CWD). If a call is made to EfiOpen () and \r
+ the path does not contain a device name, The CWD is prepended to the path.\r
+ \r
+ @param Cwd Current Working Directory \r
+\r
+\r
+ @return NULL No CWD set\r
+ @return 'other' malloc'ed buffer contains CWD.\r
+ \r
+**/\r
+CHAR8 *\r
+EfiGettCwd (\r
+ VOID\r
+ ); \r
\r
#endif\r
#include <Library/EblNetworkLib.h>
+CHAR8 *gCwd = NULL;
+
+
#define EFI_OPEN_FILE_GUARD_HEADER 0x4B4D4641
#define EFI_OPEN_FILE_GUARD_FOOTER 0x444D5A56
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN Size;
EFI_IP_ADDRESS Ip;
+ CHAR8 *CwdPlusPathName;
EblUpdateDeviceLists ();
}
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;
}
//
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;
+}
+
+