2010-04-14 23:52:26 +02:00
/**@file
2010-04-29 14:15:47 +02:00
Copyright ( c ) 2006 - 2009 , Intel Corporation . All rights reserved . < BR >
Portions copyright ( c ) 2008 - 2010 , Apple Inc . All rights reserved . < BR >
This program and the accompanying materials
2010-04-14 23:52:26 +02:00
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution . The full text of the license may be found at
http : //opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN " AS IS " BASIS ,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND , EITHER EXPRESS OR IMPLIED .
* */
# include <PiDxe.h>
# include <Library/PeCoffLib.h>
# include <Library/BaseLib.h>
# include <Library/DebugLib.h>
# include <Library/BaseMemoryLib.h>
# include <Library/PeCoffExtraActionLib.h>
# include <Library/PrintLib.h>
/**
If the build is done on cygwin the paths are cygpaths .
/ cygdrive / c / tmp . txt vs c : \ tmp . txt so we need to convert
them to work with RVD commands
@ param Name Path to convert if needed
* */
CHAR8 *
DeCygwinPathIfNeeded (
2011-02-02 23:35:30 +01:00
IN CHAR8 * Name ,
IN CHAR8 * Temp ,
IN UINTN Size
2010-04-14 23:52:26 +02:00
)
{
CHAR8 * Ptr ;
UINTN Index ;
2011-02-02 23:35:30 +01:00
UINTN Index2 ;
2010-04-14 23:52:26 +02:00
Ptr = AsciiStrStr ( Name , " /cygdrive/ " ) ;
if ( Ptr = = NULL ) {
return Name ;
}
2011-02-02 23:35:30 +01:00
for ( Index = 9 , Index2 = 0 ; ( Index < ( Size + 9 ) ) & & ( Ptr [ Index ] ! = ' \0 ' ) ; Index + + , Index2 + + ) {
Temp [ Index2 ] = Ptr [ Index ] ;
if ( Temp [ Index2 ] = = ' / ' ) {
Temp [ Index2 ] = ' \\ ' ;
2010-04-14 23:52:26 +02:00
}
2011-02-02 23:35:30 +01:00
if ( Index2 = = 1 ) {
Temp [ Index2 - 1 ] = Ptr [ Index ] ;
Temp [ Index2 ] = ' : ' ;
2010-04-14 23:52:26 +02:00
}
}
2011-02-02 23:35:30 +01:00
return Temp ;
2010-04-14 23:52:26 +02:00
}
/**
Performs additional actions after a PE / COFF image has been loaded and relocated .
If ImageContext is NULL , then ASSERT ( ) .
@ param ImageContext Pointer to the image context structure that describes the
PE / COFF image that has already been loaded and relocated .
* */
VOID
EFIAPI
PeCoffLoaderRelocateImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT * ImageContext
)
{
2011-06-15 21:53:15 +02:00
# if !defined(MDEPKG_NDEBUG)
CHAR8 Temp [ 512 ] ;
# endif
2011-02-02 23:35:30 +01:00
2010-04-14 23:52:26 +02:00
# ifdef __CC_ARM
// Print out the command for the RVD debugger to load symbols for this image
2011-02-02 23:35:30 +01:00
DEBUG ( ( EFI_D_ERROR , " load /a /ni /np %a &0x%08x \n " , DeCygwinPathIfNeeded ( ImageContext - > PdbPointer , Temp , sizeof ( Temp ) ) , ( UINTN ) ( ImageContext - > ImageAddress + ImageContext - > SizeOfHeaders ) ) ) ;
2010-04-14 23:52:26 +02:00
# elif __GNUC__
// This may not work correctly if you generate PE/COFF directlyas then the Offset would not be required
2011-02-02 23:35:30 +01:00
DEBUG ( ( EFI_D_ERROR , " add-symbol-file %a 0x%08x \n " , DeCygwinPathIfNeeded ( ImageContext - > PdbPointer , Temp , sizeof ( Temp ) ) , ( UINTN ) ( ImageContext - > ImageAddress + ImageContext - > SizeOfHeaders ) ) ) ;
2010-04-14 23:52:26 +02:00
# else
2011-06-03 11:26:44 +02:00
DEBUG ( ( EFI_D_ERROR , " Loading driver at 0x%11p EntryPoint=0x%11p \n " , ( VOID * ) ( UINTN ) ImageContext - > ImageAddress , FUNCTION_ENTRY_POINT ( ImageContext - > EntryPoint ) ) ) ;
2010-04-14 23:52:26 +02:00
# endif
}
/**
Performs additional actions just before a PE / COFF image is unloaded . Any resources
that were allocated by PeCoffLoaderRelocateImageExtraAction ( ) must be freed .
If ImageContext is NULL , then ASSERT ( ) .
@ param ImageContext Pointer to the image context structure that describes the
PE / COFF image that is being unloaded .
* */
VOID
EFIAPI
PeCoffLoaderUnloadImageExtraAction (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT * ImageContext
)
{
2011-06-15 21:53:15 +02:00
# if !defined(MDEPKG_NDEBUG)
2011-02-02 23:35:30 +01:00
CHAR8 Temp [ 512 ] ;
2011-06-15 21:53:15 +02:00
# endif
2011-02-02 23:35:30 +01:00
2010-04-14 23:52:26 +02:00
# ifdef __CC_ARM
2011-02-02 23:35:30 +01:00
{
2010-04-14 23:52:26 +02:00
// Print out the command for the RVD debugger to load symbols for this image
2011-06-03 11:26:44 +02:00
DEBUG ( ( EFI_D_ERROR , " unload symbols_only %a \n " , DeCygwinPathIfNeeded ( ImageContext - > PdbPointer , Temp , sizeof ( Temp ) ) ) ) ;
2011-02-02 23:35:30 +01:00
}
2010-04-14 23:52:26 +02:00
# elif __GNUC__
// This may not work correctly if you generate PE/COFF directlyas then the Offset would not be required
2011-02-02 23:35:30 +01:00
DEBUG ( ( EFI_D_ERROR , " remove-symbol-file %a 0x%08x \n " , DeCygwinPathIfNeeded ( ImageContext - > PdbPointer , Temp , sizeof ( Temp ) ) , ( UINTN ) ( ImageContext - > ImageAddress + ImageContext - > SizeOfHeaders ) ) ) ;
2010-04-14 23:52:26 +02:00
# else
2011-06-03 11:26:44 +02:00
DEBUG ( ( EFI_D_ERROR , " Unloading %a \n " , ImageContext - > PdbPointer ) ) ;
2010-04-14 23:52:26 +02:00
# endif
}