fd8f739a85e36bc96445fea9bc1f163818aac08a
[mirror_edk2.git] / Nt32Pkg / Library / EdkNt32PeiPeCoffGetEntryPointLib / PeCoffGetEntryPoint.c
1 /*++
2
3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 PeCoffGetEntryPoint.c
15
16 Abstract:
17
18 Tiano PE/COFF loader
19
20 Revision History
21
22 --*/
23
24
25 //
26 // Include common header file for this module.
27 //
28 #include "CommonHeader.h"
29
30 RETURN_STATUS
31 EFIAPI
32 PeCoffLoaderGetEntryPoint (
33 IN VOID *Pe32Data,
34 IN OUT VOID **EntryPoint
35 )
36 /*++
37
38 Routine Description:
39
40 Loads a PE/COFF image into memory, this is not follow the original purpose of
41 PeCoffGetEntryPoint library class. But it's ok that Unix package not run on a real
42 platform and this is for source level debug.
43
44 Arguments:
45
46 Pe32Data - Pointer to a PE/COFF Image
47
48 EntryPoint - Pointer to the entry point of the PE/COFF image
49
50 Returns:
51
52 EFI_SUCCESS if the EntryPoint was returned
53 EFI_INVALID_PARAMETER if the EntryPoint could not be found from Pe32Data
54
55 --*/
56 {
57 EFI_STATUS Status;
58 EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;
59 NT_PEI_LOAD_FILE_PPI *PeiNtService;
60 EFI_PHYSICAL_ADDRESS ImageAddress;
61 UINT64 ImageSize;
62 EFI_PHYSICAL_ADDRESS ImageEntryPoint;
63
64 Status = PeiServicesLocatePpi (
65 &gNtPeiLoadFilePpiGuid,
66 0,
67 &PpiDescriptor,
68 &PeiNtService
69 );
70 if (EFI_ERROR (Status)) {
71 return Status;
72 }
73
74 Status = PeiNtService->PeiLoadFileService (
75 Pe32Data,
76 &ImageAddress,
77 &ImageSize,
78 &ImageEntryPoint
79 );
80 *EntryPoint = (VOID*)(UINTN)ImageEntryPoint;
81 return Status;
82 }
83
84 /**
85 Returns the machine type of PE/COFF image.
86 This is copied from MDE BasePeCoffGetEntryPointLib, the code should be sync with it.
87 The reason is NT32 package needs to load the image to memory to support source
88 level debug.
89
90
91 @param Image Pointer to a PE/COFF header
92
93 @return Machine type or zero if not a valid iamge
94
95 **/
96 UINT16
97 EFIAPI
98 PeCoffLoaderGetMachineType (
99 IN VOID *Pe32Data
100 )
101 {
102 EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
103 EFI_IMAGE_DOS_HEADER *DosHdr;
104
105 DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
106 if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
107 Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + DosHdr->e_lfanew);
108 } else {
109 Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data);
110 }
111
112 if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
113 return Hdr.Pe32->FileHeader.Machine;
114 }
115
116 return 0x0000;
117 }
118