summaryrefslogtreecommitdiff
path: root/MdePkg/Library
diff options
context:
space:
mode:
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2006-12-08 03:43:57 +0000
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>2006-12-08 03:43:57 +0000
commit265c22cc33668997ac811a3bad61e0e6c3177f15 (patch)
treee5a92b0078c331c720d540e67297272dec791f7b /MdePkg/Library
parent1082de3167ca730c49ad694e564eb976b30f5244 (diff)
downloadedk2-265c22cc33668997ac811a3bad61e0e6c3177f15.zip
edk2-265c22cc33668997ac811a3bad61e0e6c3177f15.tar.gz
edk2-265c22cc33668997ac811a3bad61e0e6c3177f15.tar.bz2
Handle new relocation type EFI_IMAGE_REL_BASED_DIR64 for X64.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2075 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library')
-rw-r--r--MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c b/MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c
index 7141adc..8628dc7 100644
--- a/MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c
+++ b/MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c
@@ -1,16 +1,14 @@
/** @file
x64 Specific relocation fixups.
- Copyright (c) 2006, Intel Corporation
- All rights reserved. This program and the accompanying materials
- 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.
-
- Module Name: PeCoffLoaderEx.c
+Copyright (c) 2005 - 2006 Intel Corporation. <BR>
+All rights reserved. This program and the accompanying materials
+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.
**/
@@ -22,13 +20,15 @@
@param FixupData Pointer to a buffer to log the fixups
@param Adjust The offset to adjust the fixup
+ @retval RETURN_SUCCESS Success to perform relocation
+ @retval RETURN_UNSUPPORTED Unsupported.
**/
RETURN_STATUS
PeCoffLoaderRelocateImageEx (
- IN UINT16 *Reloc,
- IN OUT CHAR8 *Fixup,
- IN OUT CHAR8 **FixupData,
- IN UINT64 Adjust
+ IN UINT16 *Reloc,
+ IN OUT CHAR8 *Fixup,
+ IN OUT CHAR8 **FixupData,
+ IN UINT64 Adjust
)
{
return RETURN_UNSUPPORTED;
@@ -64,7 +64,7 @@ PeCoffLoaderImageFormatSupported (
/**
- Performs an Itanium-based specific re-relocation fixup and is a no-op on other
+ Performs an X64 specific re-relocation fixup and is a no-op on other
instruction sets. This is used to re-relocated the image into the EFI virtual
space for runtime calls.
@@ -84,5 +84,22 @@ PeHotRelocateImageEx (
IN UINT64 Adjust
)
{
- return RETURN_UNSUPPORTED;
+ UINT64 *F64;
+
+ switch ((*Reloc) >> 12) {
+ case EFI_IMAGE_REL_BASED_DIR64:
+ F64 = (UINT64 *) Fixup;
+ *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));
+ if (*(UINT64 *)(*FixupData) == *F64) {
+ *F64 = *F64 + (UINT64) Adjust;
+ }
+
+ *FixupData = *FixupData + sizeof(UINT64);
+ break;
+
+ default:
+ return RETURN_UNSUPPORTED;
+ }
+
+ return RETURN_SUCCESS;
}