From a709adfaf0bebbaf3d989f56b500e3985687d0e3 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Tue, 29 Dec 2009 06:16:53 +0000 Subject: Sync tool code to BuildTools project r1783. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9623 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/Common/BasePeCoff.c | 52 +++++++++++++++++++++++++++ BaseTools/Source/C/Common/FvLib.c | 3 +- BaseTools/Source/C/Common/ParseInf.c | 4 +-- BaseTools/Source/C/Common/PeCoffLib.h | 10 ++++++ BaseTools/Source/C/Common/SimpleFileParsing.c | 12 +++---- BaseTools/Source/C/Common/StringFuncs.c | 8 ++--- 6 files changed, 76 insertions(+), 13 deletions(-) (limited to 'BaseTools/Source/C/Common') diff --git a/BaseTools/Source/C/Common/BasePeCoff.c b/BaseTools/Source/C/Common/BasePeCoff.c index 0166c22460..5ffb5d4503 100644 --- a/BaseTools/Source/C/Common/BasePeCoff.c +++ b/BaseTools/Source/C/Common/BasePeCoff.c @@ -1173,6 +1173,9 @@ Returns: ImageContext->PdbPointer = (CHAR8 *) ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY); break; + case CODEVIEW_SIGNATURE_MTOC: + ImageContext->PdbPointer = (CHAR8 *) ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY); + default: break; } @@ -1377,6 +1380,8 @@ PeCoffLoaderGetPdbPointer ( return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY)); case CODEVIEW_SIGNATURE_RSDS: return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY)); + case CODEVIEW_SIGNATURE_MTOC: + return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY)); default: break; } @@ -1386,3 +1391,50 @@ PeCoffLoaderGetPdbPointer ( return NULL; } + + +RETURN_STATUS +EFIAPI +PeCoffLoaderGetEntryPoint ( + IN VOID *Pe32Data, + OUT VOID **EntryPoint, + OUT VOID **BaseOfImage + ) +{ + EFI_IMAGE_DOS_HEADER *DosHdr; + EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; + + DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data; + if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) { + // + // DOS image header is present, so read the PE header after the DOS image header. + // + Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff)); + } else { + // + // DOS image header is not present, so PE header is at the image base. + // + Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data; + } + + // + // Calculate the entry point relative to the start of the image. + // AddressOfEntryPoint is common for PE32 & PE32+ + // + if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) { + *BaseOfImage = (VOID *)(UINTN)(Hdr.Te->ImageBase + Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER)); + *EntryPoint = (VOID *)((UINTN)*BaseOfImage + (Hdr.Te->AddressOfEntryPoint & 0x0ffffffff) + sizeof(EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize); + return RETURN_SUCCESS; + } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) { + *EntryPoint = (VOID *)(UINTN)Hdr.Pe32->OptionalHeader.AddressOfEntryPoint; + if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) { + *BaseOfImage = (VOID *)(UINTN)Hdr.Pe32->OptionalHeader.ImageBase; + } else { + *BaseOfImage = (VOID *)(UINTN)Hdr.Pe32Plus->OptionalHeader.ImageBase; + } + *EntryPoint = (VOID *)(UINTN)((UINTN)*EntryPoint + (UINTN)*BaseOfImage); + return RETURN_SUCCESS; + } + + return RETURN_UNSUPPORTED; +} diff --git a/BaseTools/Source/C/Common/FvLib.c b/BaseTools/Source/C/Common/FvLib.c index dc50e877e6..a6f17e17a8 100644 --- a/BaseTools/Source/C/Common/FvLib.c +++ b/BaseTools/Source/C/Common/FvLib.c @@ -110,6 +110,7 @@ Returns: } *FvHeader = mFvHeader; + *FvLength = mFvLength; return EFI_SUCCESS; } @@ -200,7 +201,7 @@ Returns: // // Get next file, compensate for 8 byte alignment if necessary. // - *NextFile = (EFI_FFS_FILE_HEADER *) (((UINTN) CurrentFile + GetLength (CurrentFile->Size) + 0x07) & (-1 << 3)); + *NextFile = (EFI_FFS_FILE_HEADER *) ((((UINTN) CurrentFile - (UINTN) mFvHeader + GetLength (CurrentFile->Size) + 0x07) & (-1 << 3)) + (UINT8 *) mFvHeader); // // Verify file is in this FV. diff --git a/BaseTools/Source/C/Common/ParseInf.c b/BaseTools/Source/C/Common/ParseInf.c index b39c5bde40..cd10da9b2d 100644 --- a/BaseTools/Source/C/Common/ParseInf.c +++ b/BaseTools/Source/C/Common/ParseInf.c @@ -506,7 +506,7 @@ Returns: // Verify string is a hex number // for (Index = 2; Index < strlen (AsciiString); Index++) { - if (isxdigit (AsciiString[Index]) == 0) { + if (isxdigit ((int)AsciiString[Index]) == 0) { return EFI_ABORTED; } } @@ -536,7 +536,7 @@ Returns: // Verify string is a number // for (Index = 0; Index < strlen (AsciiString); Index++) { - if (isdigit (AsciiString[Index]) == 0) { + if (isdigit ((int)AsciiString[Index]) == 0) { return EFI_ABORTED; } } diff --git a/BaseTools/Source/C/Common/PeCoffLib.h b/BaseTools/Source/C/Common/PeCoffLib.h index fc2e4cafc9..077a66c5d7 100644 --- a/BaseTools/Source/C/Common/PeCoffLib.h +++ b/BaseTools/Source/C/Common/PeCoffLib.h @@ -134,4 +134,14 @@ PeCoffLoaderGetPdbPointer ( IN VOID *Pe32Data ) ; + +RETURN_STATUS +EFIAPI +PeCoffLoaderGetEntryPoint ( + IN VOID *Pe32Data, + OUT VOID **EntryPoint, + OUT VOID **BaseOfImage + ) +; + #endif diff --git a/BaseTools/Source/C/Common/SimpleFileParsing.c b/BaseTools/Source/C/Common/SimpleFileParsing.c index 5a7111c8eb..68cdc630c1 100644 --- a/BaseTools/Source/C/Common/SimpleFileParsing.c +++ b/BaseTools/Source/C/Common/SimpleFileParsing.c @@ -328,7 +328,7 @@ Notes: } if ((Len = t_strcmp (mGlobals.SourceFile.FileBufferPtr, Str)) > 0) { - if (isalnum (mGlobals.SourceFile.FileBufferPtr[Len])) { + if (isalnum ((int)mGlobals.SourceFile.FileBufferPtr[Len])) { return FALSE; } @@ -543,26 +543,26 @@ Returns: return FALSE; } - if (isdigit (mGlobals.SourceFile.FileBufferPtr[0])) { + if (isdigit ((int)mGlobals.SourceFile.FileBufferPtr[0])) { // // Check for hex value // if ((mGlobals.SourceFile.FileBufferPtr[0] == T_CHAR_0) && (mGlobals.SourceFile.FileBufferPtr[1] == T_CHAR_LC_X)) { - if (!isxdigit (mGlobals.SourceFile.FileBufferPtr[2])) { + if (!isxdigit ((int)mGlobals.SourceFile.FileBufferPtr[2])) { return FALSE; } mGlobals.SourceFile.FileBufferPtr += 2; sscanf (mGlobals.SourceFile.FileBufferPtr, "%x", &Val); *Value = (UINT32) Val; - while (isxdigit (mGlobals.SourceFile.FileBufferPtr[0])) { + while (isxdigit ((int)mGlobals.SourceFile.FileBufferPtr[0])) { mGlobals.SourceFile.FileBufferPtr++; } return TRUE; } else { *Value = atoi (mGlobals.SourceFile.FileBufferPtr); - while (isdigit (mGlobals.SourceFile.FileBufferPtr[0])) { + while (isdigit ((int)mGlobals.SourceFile.FileBufferPtr[0])) { mGlobals.SourceFile.FileBufferPtr++; } @@ -1239,7 +1239,7 @@ GetHexChars ( UINT32 Len; Len = 0; while (!EndOfFile (&mGlobals.SourceFile) && (BufferLen > 0)) { - if (isxdigit (mGlobals.SourceFile.FileBufferPtr[0])) { + if (isxdigit ((int)mGlobals.SourceFile.FileBufferPtr[0])) { *Buffer = mGlobals.SourceFile.FileBufferPtr[0]; Buffer++; Len++; diff --git a/BaseTools/Source/C/Common/StringFuncs.c b/BaseTools/Source/C/Common/StringFuncs.c index b0ad2d165e..f65ba96661 100644 --- a/BaseTools/Source/C/Common/StringFuncs.c +++ b/BaseTools/Source/C/Common/StringFuncs.c @@ -87,7 +87,7 @@ Returns: // // Remove leading whitespace // - for (Pos = String; isspace (*Pos); Pos++) { + for (Pos = String; isspace ((int)*Pos); Pos++) { } if (Pos != String) { memmove (String, Pos, strlen (Pos) + 1); @@ -114,7 +114,7 @@ Returns: // Remove trailing whitespace // for (Pos = String + strlen (String); - ((Pos - 1) >= String) && (isspace (*(Pos - 1))); + ((Pos - 1) >= String) && (isspace ((int)*(Pos - 1))); Pos-- ) { } @@ -160,12 +160,12 @@ Returns: Output = NewStringList (); for (Pos = String, Item = 0; Pos < EndOfString; Item++) { - while (isspace (*Pos)) { + while (isspace ((int)*Pos)) { Pos++; } for (EndOfSubString=Pos; - (*EndOfSubString != '\0') && !isspace (*EndOfSubString); + (*EndOfSubString != '\0') && !isspace ((int)*EndOfSubString); EndOfSubString++ ) { } -- cgit v1.2.3