13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
34ea9375a2d02a43671437e0d3d808d85afb30afahhtianCopyright (c) 2004 - 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
123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangModule Name:
133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    PeCoffLoaderEx.c
153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangAbstract:
173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    IA-32 Specific relocation fixups
193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRevision History
213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "TianoCommon.h"
253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "EfiImage.h"
263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangEFI_STATUS
283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPeCoffLoaderRelocateImageEx (
293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN UINT16      *Reloc,
303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN OUT CHAR8   *Fixup,
313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN OUT CHAR8   **FixupData,
323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN UINT64      Adjust
333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  )
343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRoutine Description:
373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Performs an IA-32 specific relocation fixup
393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangArguments:
413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Reloc      - Pointer to the relocation record
433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Fixup      - Pointer to the address to fix up
453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  FixupData  - Pointer to a buffer to log the fixups
473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Adjust     - The offset to adjust the fixup
493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangReturns:
513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  EFI_UNSUPPORTED   - relocate unsupported
533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  return EFI_UNSUPPORTED;
573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangBOOLEAN
603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPeCoffLoaderImageFormatSupported (
613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  IN  UINT16  Machine
623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  )
633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*++
643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangRoutine Description:
653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Returns TRUE if the machine type of PE/COFF image is supported. Supported
673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  does not mean the image can be executed it means the PE/COFF loader supports
683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  loading and relocating of the image type. It's up to the caller to support
693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  the entry point.
703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,
723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  & X64 images. Calling the entry point in a correct mannor is up to the
733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  consumer of this library.
743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangArguments:
763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  Machine   - Machine type from the PE Header.
783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangReturns:
803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  TRUE      - if this PE/COFF loader can load the image
823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  FALSE     - if this PE/COFF loader cannot load the image
833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang--*/
853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  if ((Machine == EFI_IMAGE_MACHINE_IA32) || (Machine == EFI_IMAGE_MACHINE_X64) ||
873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      (Machine ==  EFI_IMAGE_MACHINE_EBC)) {
883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    return TRUE;
893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  }
903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  return FALSE;
923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
94