diff --git a/ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c b/ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c index 75d0f1c687..8b3132cc99 100644 --- a/ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c +++ b/ArmPkg/Library/ArmDisassemblerLib/ThumbDisassembler.c @@ -1057,7 +1057,7 @@ DisassembleInstruction ( ) { if (Thumb) { - DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, &ItBlock, Extended); + DisassembleThumbInstruction ((UINT16 **)OpCodePtr, Buf, Size, ItBlock, Extended); } else { DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended); } 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 +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; +} + +