13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
34ea9375a2d02a43671437e0d3d808d85afb30afahhtianCopyright (c) 2005 - 2006, Intel Corporation. All rights reserved.<BR>
44ea9375a2d02a43671437e0d3d808d85afb30afahhtianThis program and the accompanying materials
53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangare licensed and made available under the terms and conditions of the BSD License
63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangwhich accompanies this distribution.  The full text of the license may be found at
73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwanghttp://opensource.org/licenses/bsd-license.php
83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangModule Name:
143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  PeCoffLoaderEx.c
163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangAbstract:
183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  x64 Specific relocation fixups
203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRevision History
223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "TianoCommon.h"
263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "EfiImage.h"
273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangEFI_STATUS
293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPeCoffLoaderRelocateImageEx (
303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN UINT16      *Reloc,
313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN OUT CHAR8   *Fixup,
323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN OUT CHAR8   **FixupData,
333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN UINT64      Adjust
343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  )
353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRoutine Description:
383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Performs an x64 specific relocation fixup
393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangArguments:
413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Reloc      - Pointer to the relocation record
423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Fixup      - Pointer to the address to fix up
433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  FixupData  - Pointer to a buffer to log the fixups
443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Adjust     - The offset to adjust the fixup
453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangReturns:
473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  EFI_UNSUPPORTED - relocate unsupported
483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  return EFI_UNSUPPORTED;
523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangBOOLEAN
553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPeCoffLoaderImageFormatSupported (
563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN  UINT16  Machine
573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  )
583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRoutine Description:
603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Returns TRUE if the machine type of PE/COFF image is supported. Supported
623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  does not mean the image can be executed it means the PE/COFF loader supports
633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  loading and relocating of the image type. It's up to the caller to support
643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  the entry point.
653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,
673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  & X64 images. Calling the entry point in a correct mannor is up to the
683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  consumer of this library.
693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangArguments:
713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Machine   - Machine type from the PE Header.
733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangReturns:
753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  TRUE      - if this PE/COFF loader can load the image
773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  FALSE     - if this PE/COFF loader cannot load the image
783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  if ((Machine == EFI_IMAGE_MACHINE_IA32) || (Machine == EFI_IMAGE_MACHINE_X64) ||
823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      (Machine ==  EFI_IMAGE_MACHINE_EBC)) {
833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    return TRUE;
843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  }
853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  return FALSE;
873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
88