Drop support for the TE format

This commit is contained in:
Mikhail Krichanov 2023-04-20 16:10:12 +03:00
parent c82eacb202
commit a828c6cedf
57 changed files with 206 additions and 1272 deletions

View File

@ -192,7 +192,7 @@ GetImageContext (
return EFI_VOLUME_CORRUPTED; return EFI_VOLUME_CORRUPTED;
} }
if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) { if (Section->Type == EFI_SECTION_PE32) {
EfiImage = (Section + 1); EfiImage = (Section + 1);
break; break;
} }

View File

@ -14,7 +14,6 @@ import edk2_debugger
class EfiFileSection(object): class EfiFileSection(object):
EFI_SECTION_PE32 = 0x10 EFI_SECTION_PE32 = 0x10
EFI_SECTION_PIC = 0x11 EFI_SECTION_PIC = 0x11
EFI_SECTION_TE = 0x12
EFI_IMAGE_DEBUG_TYPE_CODEVIEW = 0x2 EFI_IMAGE_DEBUG_TYPE_CODEVIEW = 0x2
@ -38,58 +37,12 @@ class EfiFileSection(object):
def get_debug_filepath(self): def get_debug_filepath(self):
type = self.get_type() type = self.get_type()
if type == EfiFileSection.EFI_SECTION_TE: if type == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionTE(self, ec, self.base + 0x4)
elif type == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionPE32(self, ec, self.base + 0x4) section = EfiSectionPE32(self, ec, self.base + 0x4)
else: else:
raise Exception("EfiFileSection", "No debug section") raise Exception("EfiFileSection", "No debug section")
return section.get_debug_filepath() return section.get_debug_filepath()
class EfiSectionTE:
SIZEOF_EFI_TE_IMAGE_HEADER = 0x28
EFI_TE_IMAGE_SIGNATURE = ('V','Z')
def __init__(self, ec, base_te):
self.ec = ec
self.base_te = int(base_te)
te_sig = struct.unpack("cc", self.ec.getMemoryService().read(self.base_te, 2, 32))
if te_sig != EfiSectionTE.EFI_TE_IMAGE_SIGNATURE:
raise Exception("EfiFileSectionTE","TE Signature incorrect")
def get_debug_filepath(self):
stripped_size = struct.unpack("<H", self.ec.getMemoryService().read(self.base_te + 0x6, 2, 32))[0]
stripped_size -= EfiSectionTE.SIZEOF_EFI_TE_IMAGE_HEADER
debug_dir_entry_rva = self.ec.getMemoryService().readMemory32(self.base_te + 0x20)
if debug_dir_entry_rva == 0:
raise Exception("EfiFileSectionTE","No debug directory for image")
debug_dir_entry_rva -= stripped_size
debug_type = self.ec.getMemoryService().readMemory32(self.base_te + debug_dir_entry_rva + 0xC)
if (debug_type != 0xdf) and (debug_type != EfiFileSection.EFI_IMAGE_DEBUG_TYPE_CODEVIEW):
raise Exception("EfiFileSectionTE","Debug type is not dwarf")
debug_rva = self.ec.getMemoryService().readMemory32(self.base_te + debug_dir_entry_rva + 0x14)
debug_rva -= stripped_size
dwarf_sig = struct.unpack("cccc", self.ec.getMemoryService().read(self.base_te + debug_rva, 4, 32))
if (dwarf_sig != 0x66727764) and (dwarf_sig != FirmwareFile.CONST_NB10_SIGNATURE):
raise Exception("EfiFileSectionTE","Dwarf debug signature not found")
if dwarf_sig == 0x66727764:
filename = self.base_te + debug_rva + 0xc
else:
filename = self.base_te + debug_rva + 0x10
filename = struct.unpack("400s", self.ec.getMemoryService().read(filename, 400, 32))[0]
return filename[0:string.find(filename,'\0')]
def get_debug_elfbase(self):
stripped_size = struct.unpack("<H", self.ec.getMemoryService().read(self.base_te + 0x6, 2, 32))[0]
stripped_size -= EfiSectionTE.SIZEOF_EFI_TE_IMAGE_HEADER
return self.base_te - stripped_size
class EfiSectionPE32: class EfiSectionPE32:
def __init__(self, ec, base_pe32): def __init__(self, ec, base_pe32):
self.ec = ec self.ec = ec
@ -282,7 +235,7 @@ class FirmwareVolume:
section = ffs.get_next_section() section = ffs.get_next_section()
while section != None: while section != None:
type = section.get_type() type = section.get_type()
if (type == EfiFileSection.EFI_SECTION_TE) or (type == EfiFileSection.EFI_SECTION_PE32): if (type == EfiFileSection.EFI_SECTION_PE32):
self.DebugInfos.append((section.get_base(), section.get_size(), section.get_type())) self.DebugInfos.append((section.get_base(), section.get_size(), section.get_type()))
section = ffs.get_next_section(section) section = ffs.get_next_section(section)
ffs = self.get_next_ffs(ffs) ffs = self.get_next_ffs(ffs)
@ -293,9 +246,7 @@ class FirmwareVolume:
for debug_info in self.DebugInfos: for debug_info in self.DebugInfos:
if (addr >= debug_info[0]) and (addr < debug_info[0] + debug_info[1]): if (addr >= debug_info[0]) and (addr < debug_info[0] + debug_info[1]):
if debug_info[2] == EfiFileSection.EFI_SECTION_TE: if debug_info[2] == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionTE(self.ec, debug_info[0] + 0x4)
elif debug_info[2] == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionPE32(self.ec, debug_info[0] + 0x4) section = EfiSectionPE32(self.ec, debug_info[0] + 0x4)
else: else:
raise Exception('FirmwareVolume','Section Type not supported') raise Exception('FirmwareVolume','Section Type not supported')
@ -313,9 +264,7 @@ class FirmwareVolume:
self.get_debug_info() self.get_debug_info()
for debug_info in self.DebugInfos: for debug_info in self.DebugInfos:
if debug_info[2] == EfiFileSection.EFI_SECTION_TE: if debug_info[2] == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionTE(self.ec, debug_info[0] + 0x4)
elif debug_info[2] == EfiFileSection.EFI_SECTION_PE32:
section = EfiSectionPE32(self.ec, debug_info[0] + 0x4) section = EfiSectionPE32(self.ec, debug_info[0] + 0x4)
else: else:
continue continue

View File

@ -36,24 +36,24 @@
[Rule.Common.SEC] [Rule.Common.SEC]
FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED FIXED { FILE SEC = $(NAMED_GUID) RELOCS_STRIPPED FIXED {
TE TE Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi
} }
[Rule.Common.SEC.SELF_RELOC] [Rule.Common.SEC.SELF_RELOC]
FILE SEC = $(NAMED_GUID) { FILE SEC = $(NAMED_GUID) {
TE TE Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi
} }
[Rule.Common.PEI_CORE] [Rule.Common.PEI_CORE]
FILE PEI_CORE = $(NAMED_GUID) FIXED { FILE PEI_CORE = $(NAMED_GUID) FIXED {
TE TE Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi
UI STRING ="$(MODULE_NAME)" Optional UI STRING ="$(MODULE_NAME)" Optional
} }
[Rule.Common.PEIM] [Rule.Common.PEIM]
FILE PEIM = $(NAMED_GUID) FIXED { FILE PEIM = $(NAMED_GUID) FIXED {
PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex PEI_DEPEX PEI_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
TE TE Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi PE32 PE32 Align = Auto $(INF_OUTPUT)/$(MODULE_NAME).efi
UI STRING="$(MODULE_NAME)" Optional UI STRING="$(MODULE_NAME)" Optional
} }

View File

@ -156,10 +156,6 @@ RelocateUefiImage (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SectionData, &SectionSize); Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &SectionData, &SectionSize);
if (EFI_ERROR (Status)) {
Status = FfsFindSectionData (EFI_SECTION_TE, FileHandle, &SectionData, &SectionSize);
}
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = UefiImageInitializeContext (&ImageContext, SectionData, SectionSize); Status = UefiImageInitializeContext (&ImageContext, SectionData, SectionSize);

View File

@ -496,7 +496,6 @@ class EfiSectionHeader(BinaryItem):
0x02: 'EFI_SECTION_GUID_DEFINED', 0x02: 'EFI_SECTION_GUID_DEFINED',
0x10: 'EFI_SECTION_PE32', 0x10: 'EFI_SECTION_PE32',
0x11: 'EFI_SECTION_PIC', 0x11: 'EFI_SECTION_PIC',
0x12: 'EFI_SECTION_TE',
0x13: 'EFI_SECTION_DXE_DEPEX', 0x13: 'EFI_SECTION_DXE_DEPEX',
0x14: 'EFI_SECTION_VERSION', 0x14: 'EFI_SECTION_VERSION',
0x15: 'EFI_SECTION_USER_INTERFACE', 0x15: 'EFI_SECTION_USER_INTERFACE',

View File

@ -167,21 +167,6 @@ class EFI_IMAGE_DATA_DIRECTORY(LittleEndianStructure):
] ]
class EFI_TE_IMAGE_HEADER(LittleEndianStructure):
_fields_ = [
('Signature', ARRAY(c_char, 2)),
('Machine', c_uint16),
('NumberOfSections', c_uint8),
('Subsystem', c_uint8),
('StrippedSize', c_uint16),
('AddressOfEntryPoint', c_uint32),
('BaseOfCode', c_uint32),
('ImageBase', c_uint64),
('DataDirectoryBaseReloc', EFI_IMAGE_DATA_DIRECTORY),
('DataDirectoryDebug', EFI_IMAGE_DATA_DIRECTORY)
]
class EFI_IMAGE_DOS_HEADER(LittleEndianStructure): class EFI_IMAGE_DOS_HEADER(LittleEndianStructure):
_fields_ = [ _fields_ = [
('e_magic', c_uint16), ('e_magic', c_uint16),
@ -1837,9 +1822,9 @@ class EfiConfigurationTable:
return ImageLoad return ImageLoad
class PeTeImage: class PeImage:
''' '''
A class to abstract PE/COFF or TE image processing via passing in a A class to abstract PE/COFF image processing via passing in a
Python file like object. If you pass in an address the PE/COFF is parsed, Python file like object. If you pass in an address the PE/COFF is parsed,
if you pass in NULL for an address then you get a class instance you can if you pass in NULL for an address then you get a class instance you can
use to search memory for a PE/COFF hader given a pc value. use to search memory for a PE/COFF hader given a pc value.
@ -1872,7 +1857,6 @@ class PeTeImage:
# book keeping, but public # book keeping, but public
self.PeHdr = None self.PeHdr = None
self.TeHdr = None
self.Machine = None self.Machine = None
self.Subsystem = None self.Subsystem = None
self.CodeViewSig = None self.CodeViewSig = None
@ -1888,7 +1872,6 @@ class PeTeImage:
self.DataAddress = 0 self.DataAddress = 0
self.CodeViewPdb = None self.CodeViewPdb = None
self.CodeViewUuid = None self.CodeViewUuid = None
self.TeAdjust = 0
self.dir_name = { self.dir_name = {
0: 'Export Table', 0: 'Export Table',
@ -1914,9 +1897,9 @@ class PeTeImage:
self.parse() self.parse()
def __str__(self): def __str__(self):
if self.PeHdr is None and self.TeHdr is None: if self.PeHdr is None:
# no PE/COFF header found # no PE/COFF header found
return "<class: PeTeImage>" return "<class: PeImage>"
if self.CodeViewPdb: if self.CodeViewPdb:
pdb = f'{self.Machine}`{self.CodeViewPdb}' pdb = f'{self.Machine}`{self.CodeViewPdb}'
@ -1928,8 +1911,7 @@ class PeTeImage:
else: else:
guid = '' guid = ''
slide = f'slide = {self.TeAdjust:d} ' if self.TeAdjust != 0 else ' ' res = guid + f'{pdb} load = 0x{self.LoadAddress:08x} '
res = guid + f'{pdb} load = 0x{self.LoadAddress:08x} ' + slide
return res return res
def _seek(self, offset): def _seek(self, offset):
@ -1989,60 +1971,46 @@ class PeTeImage:
return False return False
def maybe(self, offset=None): def maybe(self, offset=None):
"""Probe to see if this offset is likely a PE/COFF or TE file """ """Probe to see if this offset is likely a PE/COFF file """
self.LoadAddress = 0 self.LoadAddress = 0
e_magic = self._read_offset(2, offset) e_magic = self._read_offset(2, offset)
header_ok = e_magic == b'MZ' or e_magic == b'VZ' header_ok = e_magic == b'MZ'
if offset is not None and header_ok: if offset is not None and header_ok:
self.LoadAddress = offset self.LoadAddress = offset
return header_ok return header_ok
def parse(self): def parse(self):
"""Parse PE/COFF (TE) debug directory entry """ """Parse PE/COFF debug directory entry """
DosHdr = self._read_ctype(EFI_IMAGE_DOS_HEADER, 0) DosHdr = self._read_ctype(EFI_IMAGE_DOS_HEADER, 0)
if DosHdr.e_magic == self._unsigned(b'VZ'): if DosHdr.e_magic == self._unsigned(b'MZ'):
# TE image self.e_lfanew = DosHdr.e_lfanew
self.TeHdr = self._read_ctype(EFI_TE_IMAGE_HEADER, 0)
self.TeAdjust = sizeof(self.TeHdr) - self.TeHdr.StrippedSize
self.Machine = image_machine_dict.get(self.TeHdr.Machine, None)
self.Subsystem = self.TeHdr.Subsystem
self.AddressOfEntryPoint = self.TeHdr.AddressOfEntryPoint
debug_dir_size = self.TeHdr.DataDirectoryDebug.Size
debug_dir_offset = (self.TeAdjust +
self.TeHdr.DataDirectoryDebug.VirtualAddress)
else: else:
if DosHdr.e_magic == self._unsigned(b'MZ'): self.e_lfanew = 0
self.e_lfanew = DosHdr.e_lfanew
else:
self.e_lfanew = 0
self.PeHdr = self._read_ctype(
EFI_IMAGE_NT_HEADERS64, self.e_lfanew)
if self.PeHdr.Signature != self._unsigned(b'PE\0\0'):
return False
if self.PeHdr.OptionalHeader.Magic == \
EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC:
self.PeHdr = self._read_ctype( self.PeHdr = self._read_ctype(
EFI_IMAGE_NT_HEADERS64, self.e_lfanew) EFI_IMAGE_NT_HEADERS32, self.e_lfanew)
if self.PeHdr.Signature != self._unsigned(b'PE\0\0'):
return False
if self.PeHdr.OptionalHeader.Magic == \ if self.PeHdr.OptionalHeader.NumberOfRvaAndSizes <= \
EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: DIRECTORY_DEBUG:
self.PeHdr = self._read_ctype( return False
EFI_IMAGE_NT_HEADERS32, self.e_lfanew)
if self.PeHdr.OptionalHeader.NumberOfRvaAndSizes <= \ self.Machine = image_machine_dict.get(
DIRECTORY_DEBUG: self.PeHdr.FileHeader.Machine, None)
return False self.Subsystem = self.PeHdr.OptionalHeader.Subsystem
self.AddressOfEntryPoint = \
self.PeHdr.OptionalHeader.AddressOfEntryPoint
self.Machine = image_machine_dict.get( debug_dir_size = self.PeHdr.OptionalHeader.DataDirectory[
self.PeHdr.FileHeader.Machine, None) DIRECTORY_DEBUG].Size
self.Subsystem = self.PeHdr.OptionalHeader.Subsystem debug_dir_offset = self.PeHdr.OptionalHeader.DataDirectory[
self.AddressOfEntryPoint = \ DIRECTORY_DEBUG].VirtualAddress
self.PeHdr.OptionalHeader.AddressOfEntryPoint
self.TeAdjust = 0
debug_dir_size = self.PeHdr.OptionalHeader.DataDirectory[
DIRECTORY_DEBUG].Size
debug_dir_offset = self.PeHdr.OptionalHeader.DataDirectory[
DIRECTORY_DEBUG].VirtualAddress
if self.Machine is None or self.Subsystem not in [0, 10, 11, 12]: if self.Machine is None or self.Subsystem not in [0, 10, 11, 12]:
return False return False
@ -2056,10 +2024,7 @@ class PeTeImage:
'''Parse the PE/COFF (TE) section table''' '''Parse the PE/COFF (TE) section table'''
if self.Sections is not None: if self.Sections is not None:
return return
elif self.TeHdr is not None: if self.PeHdr is not None:
self.NumberOfSections = self.TeHdr.NumberOfSections
offset = sizeof(EFI_TE_IMAGE_HEADER)
elif self.PeHdr is not None:
self.NumberOfSections = self.PeHdr.FileHeader.NumberOfSections self.NumberOfSections = self.PeHdr.FileHeader.NumberOfSections
offset = sizeof(c_uint32) + \ offset = sizeof(c_uint32) + \
sizeof(EFI_IMAGE_FILE_HEADER) sizeof(EFI_IMAGE_FILE_HEADER)
@ -2074,7 +2039,7 @@ class PeTeImage:
for i in range(self.NumberOfSections): for i in range(self.NumberOfSections):
name = str(self.Sections[i].Name, 'ascii', 'ignore') name = str(self.Sections[i].Name, 'ascii', 'ignore')
addr = self.Sections[i].VirtualAddress addr = self.Sections[i].VirtualAddress
addr += self.LoadAddress + self.TeAdjust addr += self.LoadAddress
if name == '.text': if name == '.text':
self.TextAddress = addr self.TextAddress = addr
elif name == '.data': elif name == '.data':
@ -2099,22 +2064,7 @@ class PeTeImage:
def directory_to_str(self): def directory_to_str(self):
result = '' result = ''
if self.TeHdr: if self.PeHdr:
debug_size = self.TeHdr.DataDirectoryDebug.Size
if debug_size > 0:
debug_offset = (self.TeAdjust
+ self.TeHdr.DataDirectoryDebug.VirtualAddress)
result += f"Debug 0x{debug_offset:08X} 0x{debug_size}\n"
relocation_size = self.TeHdr.DataDirectoryBaseReloc.Size
if relocation_size > 0:
relocation_offset = (
self.TeAdjust
+ self.TeHdr.DataDirectoryBaseReloc.VirtualAddress)
result += f'Relocation 0x{relocation_offset:08X} '
result += f' 0x{relocation_size}\n'
elif self.PeHdr:
for i in range(self.PeHdr.OptionalHeader.NumberOfRvaAndSizes): for i in range(self.PeHdr.OptionalHeader.NumberOfRvaAndSizes):
size = self.PeHdr.OptionalHeader.DataDirectory[i].Size size = self.PeHdr.OptionalHeader.DataDirectory[i].Size
if size == 0: if size == 0:
@ -2143,7 +2093,7 @@ class PeTeImage:
continue continue
entry = self._read_offset( entry = self._read_offset(
DirectoryEntry.SizeOfData, DirectoryEntry.RVA + self.TeAdjust) DirectoryEntry.SizeOfData, DirectoryEntry.RVA)
self.CodeViewSig = entry[:4] self.CodeViewSig = entry[:4]
if self.CodeViewSig == b'MTOC': if self.CodeViewSig == b'MTOC':
self.CodeViewUuid = uuid.UUID(bytes_le=entry[4:4+16]) self.CodeViewUuid = uuid.UUID(bytes_le=entry[4:4+16])
@ -2170,7 +2120,7 @@ def main():
'''Process arguments as PE/COFF files''' '''Process arguments as PE/COFF files'''
for fname in sys.argv[1:]: for fname in sys.argv[1:]:
with open(fname, 'rb') as f: with open(fname, 'rb') as f:
image = PeTeImage(f) image = PeImage(f)
print(image) print(image)
res = f'EntryPoint = 0x{image.AddressOfEntryPoint:08x} ' res = f'EntryPoint = 0x{image.AddressOfEntryPoint:08x} '
res += f'TextAddress = 0x{image.TextAddress:08x} ' res += f'TextAddress = 0x{image.TextAddress:08x} '

View File

@ -41,7 +41,7 @@ import shlex
# so lets fix that for gdb... # so lets fix that for gdb...
sys.path.append(os.path.dirname(os.path.abspath(__file__))) sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from efi_debugging import PeTeImage, patch_ctypes # noqa: E402 from efi_debugging import PeImage, patch_ctypes # noqa: E402
from efi_debugging import EfiHob, GuidNames, EfiStatusClass # noqa: E402 from efi_debugging import EfiHob, GuidNames, EfiStatusClass # noqa: E402
from efi_debugging import EfiBootMode, EfiDevicePath # noqa: E402 from efi_debugging import EfiBootMode, EfiDevicePath # noqa: E402
from efi_debugging import EfiConfigurationTable, EfiTpl # noqa: E402 from efi_debugging import EfiConfigurationTable, EfiTpl # noqa: E402
@ -155,7 +155,7 @@ class EfiSymbols:
@ classmethod @ classmethod
def address_to_symbols(cls, address, reprobe=False): def address_to_symbols(cls, address, reprobe=False):
''' '''
Given an address search backwards for a PE/COFF (or TE) header Given an address search backwards for a PE/COFF header
and load symbols. Return a status string. and load symbols. Return a status string.
''' '''
if not isinstance(address, int): if not isinstance(address, int):
@ -166,12 +166,12 @@ class EfiSymbols:
# skip the probe of the remote # skip the probe of the remote
return f'{pecoff} is already loaded' return f'{pecoff} is already loaded'
pecoff = PeTeImage(cls.file, None) pecoff = PeImage(cls.file, None)
if pecoff.pcToPeCoff(address, cls.stride, cls.range): if pecoff.pcToPeCoff(address, cls.stride, cls.range):
res = cls.add_symbols_for_pecoff(pecoff) res = cls.add_symbols_for_pecoff(pecoff)
return f'{res}{pecoff}' return f'{res}{pecoff}'
else: else:
return f'0x{address:08x} not in a PE/COFF (or TE) image' return f'0x{address:08x} not in a PE/COFF image'
@ classmethod @ classmethod
def address_in_loaded_pecoff(cls, address): def address_in_loaded_pecoff(cls, address):
@ -289,7 +289,7 @@ class EfiDevicePathCmd (gdb.Command):
def create_options(self, arg, from_tty): def create_options(self, arg, from_tty):
usage = "usage: %prog [options] [arg]" usage = "usage: %prog [options] [arg]"
description = ( description = (
"Command that can load EFI PE/COFF and TE image symbols. ") "Command that can load EFI PE/COFF image symbols. ")
self.parser = optparse.OptionParser( self.parser = optparse.OptionParser(
description=description, description=description,
@ -461,7 +461,7 @@ class EfiHobCmd (gdb.Command):
def create_options(self, arg, from_tty): def create_options(self, arg, from_tty):
usage = "usage: %prog [options] [arg]" usage = "usage: %prog [options] [arg]"
description = ( description = (
"Command that can load EFI PE/COFF and TE image symbols. ") "Command that can load EFI PE/COFF image symbols. ")
self.parser = optparse.OptionParser( self.parser = optparse.OptionParser(
description=description, description=description,
@ -595,9 +595,9 @@ class EfiSymbolsCmd (gdb.Command):
def create_options(self, arg, from_tty): def create_options(self, arg, from_tty):
usage = "usage: %prog [options]" usage = "usage: %prog [options]"
description = ( description = (
"Command that can load EFI PE/COFF and TE image symbols. " "Command that can load EFI PE/COFF image symbols. "
"If you are having trouble in PEI try adding --pei. " "If you are having trouble in PEI try adding --pei. "
"Given any address search backward for the PE/COFF (or TE header) " "Given any address search backward for the PE/COFF "
"and then parse the PE/COFF image to get debug info. " "and then parse the PE/COFF image to get debug info. "
"The address can come from the current pc, pc values in the " "The address can come from the current pc, pc values in the "
"frame, or an address provided to the command" "frame, or an address provided to the command"

View File

@ -17,7 +17,7 @@ import os
from pathlib import Path from pathlib import Path
from efi_debugging import EfiDevicePath, EfiConfigurationTable, EfiTpl from efi_debugging import EfiDevicePath, EfiConfigurationTable, EfiTpl
from efi_debugging import EfiHob, GuidNames, EfiStatusClass, EfiBootMode from efi_debugging import EfiHob, GuidNames, EfiStatusClass, EfiBootMode
from efi_debugging import PeTeImage, patch_ctypes from efi_debugging import PeImage, patch_ctypes
try: try:
# Just try for LLDB in case PYTHONPATH is already correctly setup # Just try for LLDB in case PYTHONPATH is already correctly setup
@ -144,7 +144,7 @@ class EfiSymbols:
str(pecoff.CodeViewUuid)) str(pecoff.CodeViewUuid))
if module.IsValid(): if module.IsValid():
SBError = cls.target.SetModuleLoadAddress( SBError = cls.target.SetModuleLoadAddress(
module, pecoff.LoadAddress + pecoff.TeAdjust) module, pecoff.LoadAddress)
if SBError.success: if SBError.success:
cls.loaded[pecoff.LoadAddress] = (pecoff, module) cls.loaded[pecoff.LoadAddress] = (pecoff, module)
return '' return ''
@ -154,7 +154,7 @@ class EfiSymbols:
@ classmethod @ classmethod
def address_to_symbols(cls, address, reprobe=False): def address_to_symbols(cls, address, reprobe=False):
''' '''
Given an address search backwards for a PE/COFF (or TE) header Given an address search backwards for a PE/COFF header
and load symbols. Return a status string. and load symbols. Return a status string.
''' '''
if not isinstance(address, int): if not isinstance(address, int):
@ -165,12 +165,12 @@ class EfiSymbols:
# skip the probe of the remote # skip the probe of the remote
return f'{pecoff} is already loaded' return f'{pecoff} is already loaded'
pecoff = PeTeImage(cls._file, None) pecoff = PeImage(cls._file, None)
if pecoff.pcToPeCoff(address, cls.stride, cls.range): if pecoff.pcToPeCoff(address, cls.stride, cls.range):
res = cls.add_symbols_for_pecoff(pecoff) res = cls.add_symbols_for_pecoff(pecoff)
return f'{res}{pecoff}' return f'{res}{pecoff}'
else: else:
return f'0x{address:08x} not in a PE/COFF (or TE) image' return f'0x{address:08x} not in a PE/COFF image'
@ classmethod @ classmethod
def address_in_loaded_pecoff(cls, address): def address_in_loaded_pecoff(cls, address):
@ -596,7 +596,7 @@ class EfiSymbolicateCommand(object):
def create_options(self): def create_options(self):
''' standard lldb command help/options parser''' ''' standard lldb command help/options parser'''
usage = "usage: %prog [options]" usage = "usage: %prog [options]"
description = '''Command that can load EFI PE/COFF and TE image description = '''Command that can load EFI PE/COFF image
symbols. If you are having trouble in PEI try adding --pei. symbols. If you are having trouble in PEI try adding --pei.
''' '''

View File

@ -285,7 +285,7 @@ Arguments:
MaxAlignment - The max alignment required by all the input file datas. MaxAlignment - The max alignment required by all the input file datas.
PeSectionNum - Calculate the number of Pe/Te Section in this FFS file. PeSectionNum - Calculate the number of Pe Section in this FFS file.
Returns: Returns:
@ -302,8 +302,6 @@ Returns:
FILE *InFile; FILE *InFile;
EFI_FREEFORM_SUBTYPE_GUID_SECTION *SectHeader; EFI_FREEFORM_SUBTYPE_GUID_SECTION *SectHeader;
EFI_COMMON_SECTION_HEADER2 TempSectHeader; EFI_COMMON_SECTION_HEADER2 TempSectHeader;
EFI_TE_IMAGE_HEADER TeHeader;
UINT32 TeOffset;
EFI_GUID_DEFINED_SECTION GuidSectHeader; EFI_GUID_DEFINED_SECTION GuidSectHeader;
EFI_GUID_DEFINED_SECTION2 GuidSectHeader2; EFI_GUID_DEFINED_SECTION2 GuidSectHeader2;
UINT32 HeaderSize; UINT32 HeaderSize;
@ -311,7 +309,6 @@ Returns:
Size = 0; Size = 0;
Offset = 0; Offset = 0;
TeOffset = 0;
MaxEncounteredAlignment = 1; MaxEncounteredAlignment = 1;
// //
@ -342,22 +339,15 @@ Returns:
"the input section name is %s and the size is %u bytes", InputFileName[Index], (unsigned) FileSize); "the input section name is %s and the size is %u bytes", InputFileName[Index], (unsigned) FileSize);
// //
// Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section. // Check this section is Pe section, and Calculate the numbers of Pe section.
// //
TeOffset = 0;
if (FileSize >= MAX_FFS_SIZE) { if (FileSize >= MAX_FFS_SIZE) {
HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER2); HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER2);
} else { } else {
HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER); HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);
} }
fread (&TempSectHeader, 1, HeaderSize, InFile); fread (&TempSectHeader, 1, HeaderSize, InFile);
if (TempSectHeader.Type == EFI_SECTION_TE) { if (TempSectHeader.Type == EFI_SECTION_PE32) {
(*PESectionNum) ++;
fread (&TeHeader, 1, sizeof (TeHeader), InFile);
if (TeHeader.Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
TeOffset = TeHeader.StrippedSize - sizeof (TeHeader);
}
} else if (TempSectHeader.Type == EFI_SECTION_PE32) {
(*PESectionNum) ++; (*PESectionNum) ++;
} else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) { } else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {
fseek (InFile, 0, SEEK_SET); fseek (InFile, 0, SEEK_SET);
@ -376,30 +366,21 @@ Returns:
} else if (TempSectHeader.Type == EFI_SECTION_COMPRESSION || } else if (TempSectHeader.Type == EFI_SECTION_COMPRESSION ||
TempSectHeader.Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) { TempSectHeader.Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) {
// //
// for the encapsulated section, assume it contains Pe/Te section // for the encapsulated section, assume it contains Pe section
// //
(*PESectionNum) ++; (*PESectionNum) ++;
} }
fseek (InFile, 0, SEEK_SET); fseek (InFile, 0, SEEK_SET);
//
// Revert TeOffset to the converse value relative to Alignment
// This is to assure the original PeImage Header at Alignment.
//
if ((TeOffset != 0) && (InputFileAlign [Index] != 0)) {
TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);
TeOffset = TeOffset % InputFileAlign [Index];
}
// //
// make sure section data meet its alignment requirement by adding one pad section. // make sure section data meet its alignment requirement by adding one pad section.
// But the different sections have the different section header. Necessary or not? // But the different sections have the different section header. Necessary or not?
// Based on section type to adjust offset? Todo // Based on section type to adjust offset? Todo
// //
if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize + TeOffset) % InputFileAlign [Index]) != 0)) { if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize) % InputFileAlign [Index]) != 0)) {
Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1); Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);
Offset = Offset - Size - HeaderSize - TeOffset; Offset = Offset - Size - HeaderSize;
if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) { if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {
// //
@ -959,7 +940,7 @@ Returns:
if ((FfsFiletype == EFI_FV_FILETYPE_SECURITY_CORE || if ((FfsFiletype == EFI_FV_FILETYPE_SECURITY_CORE ||
FfsFiletype == EFI_FV_FILETYPE_PEI_CORE || FfsFiletype == EFI_FV_FILETYPE_PEI_CORE ||
FfsFiletype == EFI_FV_FILETYPE_DXE_CORE) && (PeSectionNum != 1)) { FfsFiletype == EFI_FV_FILETYPE_DXE_CORE) && (PeSectionNum != 1)) {
Error (NULL, 0, 2000, "Invalid parameter", "Fv File type %s must have one and only one Pe or Te section, but %u Pe/Te section are input", mFfsFileType [FfsFiletype], PeSectionNum); Error (NULL, 0, 2000, "Invalid parameter", "Fv File type %s must have one and only one Pe section, but %u Pe section are input", mFfsFileType [FfsFiletype], PeSectionNum);
goto Finish; goto Finish;
} }
@ -967,7 +948,7 @@ Returns:
FfsFiletype == EFI_FV_FILETYPE_DRIVER || FfsFiletype == EFI_FV_FILETYPE_DRIVER ||
FfsFiletype == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER || FfsFiletype == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER ||
FfsFiletype == EFI_FV_FILETYPE_APPLICATION) && (PeSectionNum < 1)) { FfsFiletype == EFI_FV_FILETYPE_APPLICATION) && (PeSectionNum < 1)) {
Error (NULL, 0, 2000, "Invalid parameter", "Fv File type %s must have at least one Pe or Te section, but no Pe/Te section is input", mFfsFileType [FfsFiletype]); Error (NULL, 0, 2000, "Invalid parameter", "Fv File type %s must have at least one Pe section, but no Pe section is input", mFfsFileType [FfsFiletype]);
goto Finish; goto Finish;
} }

View File

@ -759,7 +759,6 @@ Returns:
UINT32 AddressOfEntryPoint; UINT32 AddressOfEntryPoint;
UINT32 Offset; UINT32 Offset;
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr; EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
EFI_TE_IMAGE_HEADER *TEImageHeader;
EFI_IMAGE_SECTION_HEADER *SectionHeader; EFI_IMAGE_SECTION_HEADER *SectionHeader;
long long TempLongAddress; long long TempLongAddress;
UINT32 TextVirtualAddress; UINT32 TextVirtualAddress;
@ -830,24 +829,18 @@ Returns:
// //
// AddressOfEntryPoint and Offset in Image // AddressOfEntryPoint and Offset in Image
// //
if (!pImageContext->IsTeImage) { assert (!pImageContext->IsTeImage);
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINT8 *) pImageContext->Handle + pImageContext->PeCoffHeaderOffset);
AddressOfEntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint; ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINT8 *) pImageContext->Handle + pImageContext->PeCoffHeaderOffset);
Offset = 0; AddressOfEntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ( Offset = 0;
(UINT8 *) ImgHdr + SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (
sizeof (UINT32) + (UINT8 *) ImgHdr +
sizeof (EFI_IMAGE_FILE_HEADER) + sizeof (UINT32) +
ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader sizeof (EFI_IMAGE_FILE_HEADER) +
); ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader
Index = ImgHdr->Pe32.FileHeader.NumberOfSections; );
} else { Index = ImgHdr->Pe32.FileHeader.NumberOfSections;
TEImageHeader = (EFI_TE_IMAGE_HEADER *) pImageContext->Handle;
AddressOfEntryPoint = TEImageHeader->AddressOfEntryPoint;
Offset = TEImageHeader->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (TEImageHeader + 1);
Index = TEImageHeader->NumberOfSections;
}
// //
// module information output // module information output
@ -861,11 +854,7 @@ Returns:
} }
fprintf (FvMapFile, "EntryPoint=0x%010llx, ", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint)); fprintf (FvMapFile, "EntryPoint=0x%010llx, ", (unsigned long long) (ImageBaseAddress + AddressOfEntryPoint));
if (!pImageContext->IsTeImage) { fprintf (FvMapFile, "Type=PE");
fprintf (FvMapFile, "Type=PE");
} else {
fprintf (FvMapFile, "Type=TE");
}
fprintf (FvMapFile, ")\n"); fprintf (FvMapFile, ")\n");
fprintf (FvMapFile, "(GUID=%s", FileGuidName); fprintf (FvMapFile, "(GUID=%s", FileGuidName);
@ -1296,7 +1285,7 @@ Returns:
return EFI_ABORTED; return EFI_ABORTED;
} }
// //
// Rebase the PE or TE image in FileBuffer of FFS file for XIP // Rebase the PE image in FileBuffer of FFS file for XIP
// Rebase for the debug genfvmap tool // Rebase for the debug genfvmap tool
// //
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage, FvMapFile); Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) *VtfFileImage - (UINTN) FvImage->FileImage, FvMapFile);
@ -1348,7 +1337,7 @@ Returns:
// //
if ((UINTN) (FvImage->CurrentFilePointer + FileSize) <= (UINTN) (*VtfFileImage)) { if ((UINTN) (FvImage->CurrentFilePointer + FileSize) <= (UINTN) (*VtfFileImage)) {
// //
// Rebase the PE or TE image in FileBuffer of FFS file for XIP. // Rebase the PE image in FileBuffer of FFS file for XIP.
// Rebase Bs and Rt drivers for the debug genfvmap tool. // Rebase Bs and Rt drivers for the debug genfvmap tool.
// //
Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage, FvMapFile); Status = FfsRebase (FvInfo, FvInfo->FvFiles[Index], (EFI_FFS_FILE_HEADER **)&FileBuffer, &FileSize, (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage, FvMapFile);
@ -1579,10 +1568,6 @@ Returns:
// Sec Core found, now find PE32 section // Sec Core found, now find PE32 section
// //
Status = GetSectionByType (SecCoreFile, EFI_SECTION_PE32, 1, &Pe32Section); Status = GetSectionByType (SecCoreFile, EFI_SECTION_PE32, 1, &Pe32Section);
if (Status == EFI_NOT_FOUND) {
Status = GetSectionByType (SecCoreFile, EFI_SECTION_TE, 1, &Pe32Section);
}
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid", "could not find a PE32 section in the SEC core file."); Error (NULL, 0, 3000, "Invalid", "could not find a PE32 section in the SEC core file.");
return EFI_ABORTED; return EFI_ABORTED;
@ -1628,15 +1613,11 @@ Returns:
Status = GetFileByType (EFI_FV_FILETYPE_PEI_CORE, 1, &PeiCoreFile); Status = GetFileByType (EFI_FV_FILETYPE_PEI_CORE, 1, &PeiCoreFile);
if (!EFI_ERROR (Status) && (PeiCoreFile != NULL)) { if (!EFI_ERROR (Status) && (PeiCoreFile != NULL)) {
// //
// PEI Core found, now find PE32 or TE section // PEI Core found, now find PE32 section
// //
Status = GetSectionByType (PeiCoreFile, EFI_SECTION_PE32, 1, &Pe32Section); Status = GetSectionByType (PeiCoreFile, EFI_SECTION_PE32, 1, &Pe32Section);
if (Status == EFI_NOT_FOUND) {
Status = GetSectionByType (PeiCoreFile, EFI_SECTION_TE, 1, &Pe32Section);
}
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid", "could not find either a PE32 or a TE section in PEI core file."); Error (NULL, 0, 3000, "Invalid", "could not find either a PE32 section in PEI core file.");
return EFI_ABORTED; return EFI_ABORTED;
} }
@ -1785,13 +1766,9 @@ Returns:
if (!EFI_ERROR(Status) && (CoreFfsFile != NULL) ) { if (!EFI_ERROR(Status) && (CoreFfsFile != NULL) ) {
// //
// Core found, now find PE32 or TE section // Core found, now find PE32 section
// //
Status = GetSectionByType(CoreFfsFile, EFI_SECTION_PE32, 1, Pe32Section); Status = GetSectionByType(CoreFfsFile, EFI_SECTION_PE32, 1, Pe32Section);
if (EFI_ERROR(Status)) {
Status = GetSectionByType(CoreFfsFile, EFI_SECTION_TE, 1, Pe32Section);
}
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
Error(NULL, 0, 3000, "Invalid", "could not find a PE32 section in the core file."); Error(NULL, 0, 3000, "Invalid", "could not find a PE32 section in the core file.");
return EFI_ABORTED; return EFI_ABORTED;
@ -2418,7 +2395,6 @@ Returns:
{ {
EFI_IMAGE_DOS_HEADER *DosHeader; EFI_IMAGE_DOS_HEADER *DosHeader;
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr; EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
EFI_TE_IMAGE_HEADER *TeHeader;
// //
// Verify input parameters // Verify input parameters
@ -2428,48 +2404,35 @@ Returns:
} }
// //
// First check whether it is one TE Image. // Check whether
// First is the DOS header
// //
TeHeader = (EFI_TE_IMAGE_HEADER *) Pe32; DosHeader = (EFI_IMAGE_DOS_HEADER *) Pe32;
if (TeHeader->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
//
// By TeImage Header to get output
//
*EntryPoint = TeHeader->AddressOfEntryPoint + sizeof (EFI_TE_IMAGE_HEADER) - TeHeader->StrippedSize;
*MachineType = TeHeader->Machine;
} else {
// //
// Then check whether // Verify DOS header is expected
// First is the DOS header //
// if (DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
DosHeader = (EFI_IMAGE_DOS_HEADER *) Pe32; Error (NULL, 0, 3000, "Invalid", "Unknown magic number in the DOS header, 0x%04X.", DosHeader->e_magic);
return EFI_UNSUPPORTED;
//
// Verify DOS header is expected
//
if (DosHeader->e_magic != EFI_IMAGE_DOS_SIGNATURE) {
Error (NULL, 0, 3000, "Invalid", "Unknown magic number in the DOS header, 0x%04X.", DosHeader->e_magic);
return EFI_UNSUPPORTED;
}
//
// Immediately following is the NT header.
//
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINTN) Pe32 + DosHeader->e_lfanew);
//
// Verify NT header is expected
//
if (ImgHdr->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
Error (NULL, 0, 3000, "Invalid", "Unrecognized image signature 0x%08X.", (unsigned) ImgHdr->Pe32.Signature);
return EFI_UNSUPPORTED;
}
//
// Get output
//
*EntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
*MachineType = ImgHdr->Pe32.FileHeader.Machine;
} }
//
// Immediately following is the NT header.
//
ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *) ((UINTN) Pe32 + DosHeader->e_lfanew);
//
// Verify NT header is expected
//
if (ImgHdr->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE) {
Error (NULL, 0, 3000, "Invalid", "Unrecognized image signature 0x%08X.", (unsigned) ImgHdr->Pe32.Signature);
return EFI_UNSUPPORTED;
}
//
// Get output
//
*EntryPoint = ImgHdr->Pe32.OptionalHeader.AddressOfEntryPoint;
*MachineType = ImgHdr->Pe32.FileHeader.Machine;
// //
// Verify machine type is supported // Verify machine type is supported
@ -3589,7 +3552,6 @@ Returns:
EFI_FILE_SECTION_POINTER CurrentPe32Section; EFI_FILE_SECTION_POINTER CurrentPe32Section;
EFI_FFS_FILE_STATE SavedState; EFI_FFS_FILE_STATE SavedState;
EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr; EFI_IMAGE_OPTIONAL_HEADER_UNION *ImgHdr;
EFI_TE_IMAGE_HEADER *TEImageHeader;
UINT8 *MemoryImagePointer; UINT8 *MemoryImagePointer;
EFI_IMAGE_SECTION_HEADER *SectionHeader; EFI_IMAGE_SECTION_HEADER *SectionHeader;
CHAR8 PeFileName [MAX_LONG_FILE_PATH]; CHAR8 PeFileName [MAX_LONG_FILE_PATH];
@ -3603,7 +3565,6 @@ Returns:
Index = 0; Index = 0;
MemoryImagePointer = NULL; MemoryImagePointer = NULL;
TEImageHeader = NULL;
ImgHdr = NULL; ImgHdr = NULL;
SectionHeader = NULL; SectionHeader = NULL;
Cptr = NULL; Cptr = NULL;
@ -3936,248 +3897,6 @@ Returns:
WriteMapFile (FvMapFile, PdbPointer, *FfsFile, NewPe32BaseAddress, &ImageContext); WriteMapFile (FvMapFile, PdbPointer, *FfsFile, NewPe32BaseAddress, &ImageContext);
} }
if ((*FfsFile)->Type != EFI_FV_FILETYPE_SECURITY_CORE &&
(*FfsFile)->Type != EFI_FV_FILETYPE_PEI_CORE &&
(*FfsFile)->Type != EFI_FV_FILETYPE_PEIM &&
(*FfsFile)->Type != EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER &&
(*FfsFile)->Type != EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE
) {
//
// Only Peim code may have a TE section
//
return EFI_SUCCESS;
}
//
// Now process TE sections
//
for (Index = 1;; Index++) {
NewPe32BaseAddress = 0;
//
// Find Te Image
//
Status = GetSectionByType (*FfsFile, EFI_SECTION_TE, Index, &CurrentPe32Section);
if (EFI_ERROR (Status)) {
break;
}
CurSecHdrSize = GetSectionHeaderLength(CurrentPe32Section.CommonHeader);
//
// Calculate the TE base address, the FFS file base plus the offset of the TE section less the size stripped off
// by GenTEImage
//
TEImageHeader = (EFI_TE_IMAGE_HEADER *) ((UINT8 *) CurrentPe32Section.Pe32Section + CurSecHdrSize);
//
// Initialize context, load image info.
//
memset (&ImageContext, 0, sizeof (ImageContext));
ImageContext.Handle = (VOID *) TEImageHeader;
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) FfsRebaseImageRead;
Status = PeCoffLoaderGetImageInfo (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid TeImage", "The input file is %s and the return status is %x", FileName, (int) Status);
return Status;
}
if ( (ImageContext.Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED) ||
(ImageContext.Machine == IMAGE_FILE_MACHINE_ARM64) ) {
mArm = TRUE;
}
if (ImageContext.Machine == IMAGE_FILE_MACHINE_LOONGARCH64) {
mLoongArch = TRUE;
}
//
// Keep Image Context for TE image in FV
//
memcpy (&OrigImageContext, &ImageContext, sizeof (ImageContext));
//
// Get File PdbPointer
//
PdbPointer = PeCoffLoaderGetPdbPointer (ImageContext.Handle);
//
// Set new rebased address.
//
NewPe32BaseAddress = XipBase + (UINTN) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) \
- TEImageHeader->StrippedSize - (UINTN) (*FfsFile);
//
// if reloc is stripped, try to get the original efi image to get reloc info.
//
if (ImageContext.RelocationsStripped) {
//
// Construct the original efi file name
//
if (strlen (FileName) >= MAX_LONG_FILE_PATH) {
Error (NULL, 0, 2000, "Invalid", "The file name %s is too long.", FileName);
return EFI_ABORTED;
}
strncpy (PeFileName, FileName, MAX_LONG_FILE_PATH - 1);
PeFileName[MAX_LONG_FILE_PATH - 1] = 0;
Cptr = PeFileName + strlen (PeFileName);
while (*Cptr != '.') {
Cptr --;
}
if (*Cptr != '.') {
Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
return EFI_ABORTED;
} else {
*(Cptr + 1) = 'e';
*(Cptr + 2) = 'f';
*(Cptr + 3) = 'i';
*(Cptr + 4) = '\0';
}
PeFile = fopen (LongFilePath (PeFileName), "rb");
if (PeFile == NULL) {
Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);
//Error (NULL, 0, 3000, "Invalid", "The file %s has no .reloc section.", FileName);
//return EFI_ABORTED;
} else {
//
// Get the file size
//
PeFileSize = _filelength (fileno (PeFile));
PeFileBuffer = (UINT8 *) malloc (PeFileSize);
if (PeFileBuffer == NULL) {
fclose (PeFile);
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
return EFI_OUT_OF_RESOURCES;
}
//
// Read Pe File
//
fread (PeFileBuffer, sizeof (UINT8), PeFileSize, PeFile);
//
// close file
//
fclose (PeFile);
//
// Append reloc section into TeImage
//
ImageContext.Handle = PeFileBuffer;
Status = PeCoffLoaderGetImageInfo (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid TeImage", "The input file is %s and the return status is %x", FileName, (int) Status);
return Status;
}
ImageContext.RelocationsStripped = FALSE;
}
}
//
// Relocation doesn't exist
//
if (ImageContext.RelocationsStripped) {
Warning (NULL, 0, 0, "Invalid", "The file %s has no .reloc section.", FileName);
continue;
}
//
// Relocation exist and rebase
//
//
// Load and Relocate Image Data
//
MemoryImagePointer = (UINT8 *) malloc ((UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);
if (MemoryImagePointer == NULL) {
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated on rebase of %s", FileName);
return EFI_OUT_OF_RESOURCES;
}
memset ((VOID *) MemoryImagePointer, 0, (UINTN) ImageContext.ImageSize + ImageContext.SectionAlignment);
ImageContext.ImageAddress = ((UINTN) MemoryImagePointer + ImageContext.SectionAlignment - 1) & (~((UINTN) ImageContext.SectionAlignment - 1));
Status = PeCoffLoaderLoadImage (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid", "LocateImage() call failed on rebase of %s", FileName);
free ((VOID *) MemoryImagePointer);
return Status;
}
//
// Reloacate TeImage
//
ImageContext.DestinationAddress = NewPe32BaseAddress;
Status = PeCoffLoaderRelocateImage (&ImageContext);
if (EFI_ERROR (Status)) {
Error (NULL, 0, 3000, "Invalid", "RelocateImage() call failed on rebase of TE image %s", FileName);
free ((VOID *) MemoryImagePointer);
return Status;
}
//
// Copy the relocated image into raw image file.
//
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (TEImageHeader + 1);
for (Index = 0; Index < TEImageHeader->NumberOfSections; Index ++, SectionHeader ++) {
if (!ImageContext.IsTeImage) {
CopyMem (
(UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData,
(VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress),
SectionHeader->SizeOfRawData
);
} else {
CopyMem (
(UINT8 *) TEImageHeader + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->PointerToRawData,
(VOID*) (UINTN) (ImageContext.ImageAddress + sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize + SectionHeader->VirtualAddress),
SectionHeader->SizeOfRawData
);
}
}
//
// Free the allocated memory resource
//
free ((VOID *) MemoryImagePointer);
MemoryImagePointer = NULL;
if (PeFileBuffer != NULL) {
free (PeFileBuffer);
PeFileBuffer = NULL;
}
//
// Update Image Base Address
//
TEImageHeader->ImageBase = NewPe32BaseAddress;
//
// Now update file checksum
//
if ((*FfsFile)->Attributes & FFS_ATTRIB_CHECKSUM) {
SavedState = (*FfsFile)->State;
(*FfsFile)->IntegrityCheck.Checksum.File = 0;
(*FfsFile)->State = 0;
(*FfsFile)->IntegrityCheck.Checksum.File = CalculateChecksum8 (
(UINT8 *)((UINT8 *)(*FfsFile) + FfsHeaderSize),
GetFfsFileLength (*FfsFile) - FfsHeaderSize
);
(*FfsFile)->State = SavedState;
}
//
// Get this module function address from ModulePeMapFile and add them into FvMap file
//
//
// Default use FileName as map file path
//
if (PdbPointer == NULL) {
PdbPointer = FileName;
}
WriteMapFile (
FvMapFile,
PdbPointer,
*FfsFile,
NewPe32BaseAddress,
&OrigImageContext
);
}
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -58,7 +58,7 @@ STATIC CHAR8 *mSectionTypeName[] = {
NULL, // 0x0F - reserved NULL, // 0x0F - reserved
"EFI_SECTION_PE32", // 0x10 "EFI_SECTION_PE32", // 0x10
"EFI_SECTION_PIC", // 0x11 "EFI_SECTION_PIC", // 0x11
"EFI_SECTION_TE", // 0x12 NULL, // 0x12 - formerly TE
"EFI_SECTION_DXE_DEPEX", // 0x13 "EFI_SECTION_DXE_DEPEX", // 0x13
"EFI_SECTION_VERSION", // 0x14 "EFI_SECTION_VERSION", // 0x14
"EFI_SECTION_USER_INTERFACE", // 0x15 "EFI_SECTION_USER_INTERFACE", // 0x15
@ -162,7 +162,7 @@ Returns:
fprintf (stdout, " -s [SectionType], --sectiontype [SectionType]\n\ fprintf (stdout, " -s [SectionType], --sectiontype [SectionType]\n\
SectionType defined in PI spec is one type of\n\ SectionType defined in PI spec is one type of\n\
EFI_SECTION_COMPRESSION, EFI_SECTION_GUID_DEFINED,\n\ EFI_SECTION_COMPRESSION, EFI_SECTION_GUID_DEFINED,\n\
EFI_SECTION_PE32, EFI_SECTION_PIC, EFI_SECTION_TE,\n\ EFI_SECTION_PE32, EFI_SECTION_PIC,\n\
EFI_SECTION_DXE_DEPEX, EFI_SECTION_COMPATIBILITY16,\n\ EFI_SECTION_DXE_DEPEX, EFI_SECTION_COMPATIBILITY16,\n\
EFI_SECTION_USER_INTERFACE, EFI_SECTION_VERSION,\n\ EFI_SECTION_USER_INTERFACE, EFI_SECTION_VERSION,\n\
EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_RAW,\n\ EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_RAW,\n\
@ -438,8 +438,6 @@ Returns:
FILE *InFile; FILE *InFile;
EFI_COMMON_SECTION_HEADER *SectHeader; EFI_COMMON_SECTION_HEADER *SectHeader;
EFI_COMMON_SECTION_HEADER2 TempSectHeader; EFI_COMMON_SECTION_HEADER2 TempSectHeader;
EFI_TE_IMAGE_HEADER TeHeader;
UINT32 TeOffset;
EFI_GUID_DEFINED_SECTION GuidSectHeader; EFI_GUID_DEFINED_SECTION GuidSectHeader;
EFI_GUID_DEFINED_SECTION2 GuidSectHeader2; EFI_GUID_DEFINED_SECTION2 GuidSectHeader2;
UINT32 HeaderSize; UINT32 HeaderSize;
@ -456,7 +454,6 @@ Returns:
Size = 0; Size = 0;
Offset = 0; Offset = 0;
TeOffset = 0;
// //
// Go through our array of file names and copy their contents // Go through our array of file names and copy their contents
// to the output buffer. // to the output buffer.
@ -490,9 +487,8 @@ Returns:
// //
if (InputFileAlign != NULL) { if (InputFileAlign != NULL) {
// //
// Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section. // Check this section is Pe section, and Calculate the numbers of Pe section.
// //
TeOffset = 0;
// //
// The section might be EFI_COMMON_SECTION_HEADER2 // The section might be EFI_COMMON_SECTION_HEADER2
// But only Type needs to be checked // But only Type needs to be checked
@ -503,12 +499,7 @@ Returns:
HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER); HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);
} }
fread (&TempSectHeader, 1, HeaderSize, InFile); fread (&TempSectHeader, 1, HeaderSize, InFile);
if (TempSectHeader.Type == EFI_SECTION_TE) { if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {
fread (&TeHeader, 1, sizeof (TeHeader), InFile);
if (TeHeader.Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
TeOffset = TeHeader.StrippedSize - sizeof (TeHeader);
}
} else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {
fseek (InFile, 0, SEEK_SET); fseek (InFile, 0, SEEK_SET);
if (FileSize >= MAX_SECTION_SIZE) { if (FileSize >= MAX_SECTION_SIZE) {
fread (&GuidSectHeader2, 1, sizeof (GuidSectHeader2), InFile); fread (&GuidSectHeader2, 1, sizeof (GuidSectHeader2), InFile);
@ -525,21 +516,12 @@ Returns:
fseek (InFile, 0, SEEK_SET); fseek (InFile, 0, SEEK_SET);
//
// Revert TeOffset to the converse value relative to Alignment
// This is to assure the original PeImage Header at Alignment.
//
if (TeOffset != 0) {
TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);
TeOffset = TeOffset % InputFileAlign [Index];
}
// //
// make sure section data meet its alignment requirement by adding one raw pad section. // make sure section data meet its alignment requirement by adding one raw pad section.
// //
if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize + TeOffset) % InputFileAlign [Index]) != 0)) { if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize) % InputFileAlign [Index]) != 0)) {
Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1); Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);
Offset = Offset - Size - HeaderSize - TeOffset; Offset = Offset - Size - HeaderSize;
if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) { if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {
// //
@ -1713,8 +1695,6 @@ Returns:
SectType = EFI_SECTION_PE32; SectType = EFI_SECTION_PE32;
} else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_PIC]) == 0) { } else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_PIC]) == 0) {
SectType = EFI_SECTION_PIC; SectType = EFI_SECTION_PIC;
} else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_TE]) == 0) {
SectType = EFI_SECTION_TE;
} else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_DXE_DEPEX]) == 0) { } else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_DXE_DEPEX]) == 0) {
SectType = EFI_SECTION_DXE_DEPEX; SectType = EFI_SECTION_DXE_DEPEX;
} else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_SMM_DEPEX]) == 0) { } else if (stricmp (SectionName, mSectionTypeName[EFI_SECTION_SMM_DEPEX]) == 0) {

View File

@ -665,7 +665,7 @@ Returns:
// //
// 0x12 // 0x12
// //
"EFI_SECTION_TE", "Unsupported section type - formerly TE",
// //
// 0x13 // 0x13
// //
@ -1788,7 +1788,6 @@ Returns:
switch (Type) { switch (Type) {
case EFI_SECTION_RAW: case EFI_SECTION_RAW:
case EFI_SECTION_PIC: case EFI_SECTION_PIC:
case EFI_SECTION_TE:
// default is no more information // default is no more information
break; break;

View File

@ -122,7 +122,6 @@ BINARY_FILE_TYPE_PIC = 'PIC'
BINARY_FILE_TYPE_PEI_DEPEX = 'PEI_DEPEX' BINARY_FILE_TYPE_PEI_DEPEX = 'PEI_DEPEX'
BINARY_FILE_TYPE_DXE_DEPEX = 'DXE_DEPEX' BINARY_FILE_TYPE_DXE_DEPEX = 'DXE_DEPEX'
BINARY_FILE_TYPE_SMM_DEPEX = 'SMM_DEPEX' BINARY_FILE_TYPE_SMM_DEPEX = 'SMM_DEPEX'
BINARY_FILE_TYPE_TE = 'TE'
BINARY_FILE_TYPE_VER = 'VER' BINARY_FILE_TYPE_VER = 'VER'
BINARY_FILE_TYPE_UI = 'UI' BINARY_FILE_TYPE_UI = 'UI'
BINARY_FILE_TYPE_BIN = 'BIN' BINARY_FILE_TYPE_BIN = 'BIN'

View File

@ -17,7 +17,6 @@ SectionHeaderType = {
0x03:'EFI_SECTION_DISPOSABLE', 0x03:'EFI_SECTION_DISPOSABLE',
0x10:'EFI_SECTION_PE32', 0x10:'EFI_SECTION_PE32',
0x11:'EFI_SECTION_PIC', 0x11:'EFI_SECTION_PIC',
0x12:'EFI_SECTION_TE',
0x13:'EFI_SECTION_DXE_DEPEX', 0x13:'EFI_SECTION_DXE_DEPEX',
0x14:'EFI_SECTION_VERSION', 0x14:'EFI_SECTION_VERSION',
0x15:'EFI_SECTION_USER_INTERFACE', 0x15:'EFI_SECTION_USER_INTERFACE',

View File

@ -79,10 +79,10 @@ class DataSection (DataSectionClassObject):
CopyLongFilePath(MapFile, CopyMapFile) CopyLongFilePath(MapFile, CopyMapFile)
#Get PE Section alignment when align is set to AUTO #Get PE Section alignment when align is set to AUTO
if self.Alignment == 'Auto' and self.SecType in (BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32): if self.Alignment == 'Auto' and self.SecType in (BINARY_FILE_TYPE_PE32):
self.Alignment = "0" self.Alignment = "0"
NoStrip = True NoStrip = True
if self.SecType in (BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32): if self.SecType in (BINARY_FILE_TYPE_PE32):
if self.KeepReloc is not None: if self.KeepReloc is not None:
NoStrip = self.KeepReloc NoStrip = self.KeepReloc
@ -100,16 +100,6 @@ class DataSection (DataSectionClassObject):
) )
self.SectFileName = StrippedFile self.SectFileName = StrippedFile
if self.SecType == BINARY_FILE_TYPE_TE:
TeFile = os.path.join( OutputPath, ModuleName + 'Te.raw')
GenFdsGlobalVariable.GenerateFirmwareImage(
TeFile,
[GenFdsGlobalVariable.MacroExtend(self.SectFileName, Dict)],
Type='te',
IsMakefile = IsMakefile
)
self.SectFileName = TeFile
OutputFile = os.path.join (OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + SectionSuffix.get(self.SecType)) OutputFile = os.path.join (OutputPath, ModuleName + SUP_MODULE_SEC + SecNum + SectionSuffix.get(self.SecType))
OutputFile = os.path.normpath(OutputFile) OutputFile = os.path.normpath(OutputFile)
GenFdsGlobalVariable.GenerateSection(OutputFile, [self.SectFileName], Section.Section.SectionType.get(self.SecType), IsMakefile = IsMakefile) GenFdsGlobalVariable.GenerateSection(OutputFile, [self.SectFileName], Section.Section.SectionType.get(self.SecType), IsMakefile = IsMakefile)

View File

@ -62,7 +62,7 @@ class EfiSection (EfiSectionClassObject):
StringData = FfsInf.__ExtendMacro__(self.StringData) StringData = FfsInf.__ExtendMacro__(self.StringData)
ModuleNameStr = FfsInf.__ExtendMacro__('$(MODULE_NAME)') ModuleNameStr = FfsInf.__ExtendMacro__('$(MODULE_NAME)')
NoStrip = True NoStrip = True
if FfsInf.ModuleType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_MM_CORE_STANDALONE) and SectionType in (BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32): if FfsInf.ModuleType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_MM_CORE_STANDALONE) and SectionType in (BINARY_FILE_TYPE_PE32):
if FfsInf.KeepReloc is not None: if FfsInf.KeepReloc is not None:
NoStrip = FfsInf.KeepReloc NoStrip = FfsInf.KeepReloc
elif FfsInf.KeepRelocFromRule is not None: elif FfsInf.KeepRelocFromRule is not None:
@ -259,7 +259,7 @@ class EfiSection (EfiSectionClassObject):
File = GenFdsGlobalVariable.MacroExtend(File, Dict) File = GenFdsGlobalVariable.MacroExtend(File, Dict)
#Get PE Section alignment when align is set to AUTO #Get PE Section alignment when align is set to AUTO
if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32 or SectionType == BINARY_FILE_TYPE_TE): if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32):
Align = "0" Align = "0"
if File[(len(File)-4):] == '.efi' and FfsInf.InfModule.BaseName == os.path.basename(File)[:-4]: if File[(len(File)-4):] == '.efi' and FfsInf.InfModule.BaseName == os.path.basename(File)[:-4]:
MapFile = File.replace('.efi', '.map') MapFile = File.replace('.efi', '.map')
@ -295,18 +295,6 @@ class EfiSection (EfiSectionClassObject):
) )
File = StrippedFile File = StrippedFile
"""For TE Section call GenFw to generate TE image"""
if SectionType == BINARY_FILE_TYPE_TE:
TeFile = os.path.join( OutputPath, ModuleName + 'Te.raw')
GenFdsGlobalVariable.GenerateFirmwareImage(
TeFile,
[File],
Type='te',
IsMakefile = IsMakefile
)
File = TeFile
"""Call GenSection""" """Call GenSection"""
GenFdsGlobalVariable.GenerateSection(OutputFile, GenFdsGlobalVariable.GenerateSection(OutputFile,
[File], [File],

View File

@ -2597,7 +2597,7 @@ class FdfParser:
# #
@staticmethod @staticmethod
def _SectionCouldHaveRelocFlag (SectionType): def _SectionCouldHaveRelocFlag (SectionType):
if SectionType in {BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32}: if SectionType in {BINARY_FILE_TYPE_PE32}:
return True return True
else: else:
return False return False
@ -2806,7 +2806,7 @@ class FdfParser:
if self._IsKeyword("VERSION"): if self._IsKeyword("VERSION"):
if AlignValue == 'Auto': if AlignValue == 'Auto':
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
if not self._IsToken(TAB_EQUAL_SPLIT): if not self._IsToken(TAB_EQUAL_SPLIT):
raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)
if not self._GetNextToken(): if not self._GetNextToken():
@ -2822,7 +2822,7 @@ class FdfParser:
elif self._IsKeyword(BINARY_FILE_TYPE_UI): elif self._IsKeyword(BINARY_FILE_TYPE_UI):
if AlignValue == 'Auto': if AlignValue == 'Auto':
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
if not self._IsToken(TAB_EQUAL_SPLIT): if not self._IsToken(TAB_EQUAL_SPLIT):
raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)
if not self._GetNextToken(): if not self._GetNextToken():
@ -2837,7 +2837,7 @@ class FdfParser:
elif self._IsKeyword("FV_IMAGE"): elif self._IsKeyword("FV_IMAGE"):
if AlignValue == 'Auto': if AlignValue == 'Auto':
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
if not self._IsToken(TAB_EQUAL_SPLIT): if not self._IsToken(TAB_EQUAL_SPLIT):
raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber) raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)
if not self._GetNextToken(): if not self._GetNextToken():
@ -2878,7 +2878,7 @@ class FdfParser:
elif self._IsKeyword("PEI_DEPEX_EXP") or self._IsKeyword("DXE_DEPEX_EXP") or self._IsKeyword("SMM_DEPEX_EXP"): elif self._IsKeyword("PEI_DEPEX_EXP") or self._IsKeyword("DXE_DEPEX_EXP") or self._IsKeyword("SMM_DEPEX_EXP"):
if AlignValue == 'Auto': if AlignValue == 'Auto':
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
DepexSectionObj = DepexSection() DepexSectionObj = DepexSection()
DepexSectionObj.Alignment = AlignValue DepexSectionObj.Alignment = AlignValue
DepexSectionObj.DepexType = self._Token DepexSectionObj.DepexType = self._Token
@ -2895,7 +2895,7 @@ class FdfParser:
elif self._IsKeyword("SUBTYPE_GUID"): elif self._IsKeyword("SUBTYPE_GUID"):
if AlignValue == 'Auto': if AlignValue == 'Auto':
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
SubTypeGuidValue = None SubTypeGuidValue = None
if not self._GetNextGuid(): if not self._GetNextGuid():
raise Warning.Expected("GUID", self.FileName, self.CurrentLineNumber) raise Warning.Expected("GUID", self.FileName, self.CurrentLineNumber)
@ -2923,11 +2923,11 @@ class FdfParser:
self.SetFileBufferPos(OldPos) self.SetFileBufferPos(OldPos)
return False return False
if self._Token not in {"COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\ if self._Token not in {"COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\
BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX}: BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX}:
raise Warning("Unknown section type '%s'" % self._Token, self.FileName, self.CurrentLineNumber) raise Warning("Unknown section type '%s'" % self._Token, self.FileName, self.CurrentLineNumber)
if AlignValue == 'Auto'and (not self._Token == BINARY_FILE_TYPE_PE32) and (not self._Token == BINARY_FILE_TYPE_TE): if AlignValue == 'Auto'and (not self._Token == BINARY_FILE_TYPE_PE32):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
# DataSection # DataSection
DataSectionObj = DataSection() DataSectionObj = DataSection()
@ -3726,7 +3726,7 @@ class FdfParser:
if SectionName not in { if SectionName not in {
"COMPAT16", BINARY_FILE_TYPE_PE32, "COMPAT16", BINARY_FILE_TYPE_PE32,
BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", BINARY_FILE_TYPE_PIC, "FV_IMAGE",
"RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, "RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI,
BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID",
BINARY_FILE_TYPE_SMM_DEPEX}: BINARY_FILE_TYPE_SMM_DEPEX}:
@ -3743,8 +3743,8 @@ class FdfParser:
if self._GetAlignment(): if self._GetAlignment():
if self._Token not in ALIGNMENTS: if self._Token not in ALIGNMENTS:
raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber)
if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE): if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
SectAlignment = self._Token SectAlignment = self._Token
Ext = None Ext = None
@ -3796,7 +3796,7 @@ class FdfParser:
if SectionName not in { if SectionName not in {
"COMPAT16", BINARY_FILE_TYPE_PE32, "COMPAT16", BINARY_FILE_TYPE_PE32,
BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", BINARY_FILE_TYPE_PIC, "FV_IMAGE",
"RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, "RAW",BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI,
BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID",
BINARY_FILE_TYPE_SMM_DEPEX, BINARY_FILE_TYPE_GUID}: BINARY_FILE_TYPE_SMM_DEPEX, BINARY_FILE_TYPE_GUID}:
@ -3843,7 +3843,7 @@ class FdfParser:
elif self._GetNextToken(): elif self._GetNextToken():
if self._Token not in { if self._Token not in {
T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32, T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32,
BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PIC,
"FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,
BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_UI, "VERSION",
BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID,
@ -3907,8 +3907,8 @@ class FdfParser:
if self._GetAlignment(): if self._GetAlignment():
if self._Token not in ALIGNMENTS: if self._Token not in ALIGNMENTS:
raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self._Token, self.FileName, self.CurrentLineNumber)
if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE): if self._Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 section ", self.FileName, self.CurrentLineNumber)
EfiSectionObj.Alignment = self._Token EfiSectionObj.Alignment = self._Token
if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'): if self._IsKeyword('RELOCS_STRIPPED') or self._IsKeyword('RELOCS_RETAINED'):
@ -3928,7 +3928,7 @@ class FdfParser:
elif self._GetNextToken(): elif self._GetNextToken():
if self._Token not in { if self._Token not in {
T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32, T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32,
BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PIC,
"FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,
BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_UI, "VERSION",
BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID,
@ -4020,9 +4020,6 @@ class FdfParser:
elif SectionType == BINARY_FILE_TYPE_PIC: elif SectionType == BINARY_FILE_TYPE_PIC:
if FileType not in {BINARY_FILE_TYPE_PIC, "SEC_PIC"}: if FileType not in {BINARY_FILE_TYPE_PIC, "SEC_PIC"}:
raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)
elif SectionType == BINARY_FILE_TYPE_TE:
if FileType not in {BINARY_FILE_TYPE_TE, "SEC_TE"}:
raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)
elif SectionType == "RAW": elif SectionType == "RAW":
if FileType not in {BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"}: if FileType not in {BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"}:
raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber) raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)

View File

@ -33,7 +33,6 @@ FdfFvFileTypeToFileType = {
SectionSuffix = { SectionSuffix = {
BINARY_FILE_TYPE_PE32 : '.pe32', BINARY_FILE_TYPE_PE32 : '.pe32',
BINARY_FILE_TYPE_PIC : '.pic', BINARY_FILE_TYPE_PIC : '.pic',
BINARY_FILE_TYPE_TE : '.te',
BINARY_FILE_TYPE_DXE_DEPEX : '.dpx', BINARY_FILE_TYPE_DXE_DEPEX : '.dpx',
'VERSION' : '.ver', 'VERSION' : '.ver',
BINARY_FILE_TYPE_UI : '.ui', BINARY_FILE_TYPE_UI : '.ui',

View File

@ -769,7 +769,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
File = GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch) File = GenFdsGlobalVariable.MacroExtend(File, Dict, self.CurrentArch)
#Get PE Section alignment when align is set to AUTO #Get PE Section alignment when align is set to AUTO
if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32 or SectionType == BINARY_FILE_TYPE_TE): if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32):
ImageObj = PeImageClass (File) ImageObj = PeImageClass (File)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
self.Alignment = str (ImageObj.SectionAlignment) self.Alignment = str (ImageObj.SectionAlignment)
@ -792,15 +792,6 @@ class FfsInfStatement(FfsInfStatementClassObject):
) )
File = StrippedFile File = StrippedFile
if SectionType == BINARY_FILE_TYPE_TE:
TeFile = os.path.join( self.OutputPath, self.ModuleGuid + 'Te.raw')
GenFdsGlobalVariable.GenerateFirmwareImage(
TeFile,
[File],
Type='te',
IsMakefile=IsMakefile
)
File = TeFile
GenFdsGlobalVariable.GenerateSection(OutputFile, [File], Section.Section.SectionType[SectionType], IsMakefile=IsMakefile) GenFdsGlobalVariable.GenerateSection(OutputFile, [File], Section.Section.SectionType[SectionType], IsMakefile=IsMakefile)
OutputFileList.append(OutputFile) OutputFileList.append(OutputFile)
else: else:
@ -811,7 +802,7 @@ class FfsInfStatement(FfsInfStatementClassObject):
GenSecInputFile = GenFdsGlobalVariable.MacroExtend(GenSecInputFile, Dict, self.CurrentArch) GenSecInputFile = GenFdsGlobalVariable.MacroExtend(GenSecInputFile, Dict, self.CurrentArch)
#Get PE Section alignment when align is set to AUTO #Get PE Section alignment when align is set to AUTO
if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32 or SectionType == BINARY_FILE_TYPE_TE): if self.Alignment == 'Auto' and (SectionType == BINARY_FILE_TYPE_PE32):
ImageObj = PeImageClass (GenSecInputFile) ImageObj = PeImageClass (GenSecInputFile)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
self.Alignment = str (ImageObj.SectionAlignment) self.Alignment = str (ImageObj.SectionAlignment)
@ -835,15 +826,6 @@ class FfsInfStatement(FfsInfStatementClassObject):
) )
GenSecInputFile = StrippedFile GenSecInputFile = StrippedFile
if SectionType == BINARY_FILE_TYPE_TE:
TeFile = os.path.join( self.OutputPath, self.ModuleGuid + 'Te.raw')
GenFdsGlobalVariable.GenerateFirmwareImage(
TeFile,
[GenSecInputFile],
Type='te',
IsMakefile=IsMakefile
)
GenSecInputFile = TeFile
GenFdsGlobalVariable.GenerateSection(OutputFile, [GenSecInputFile], Section.Section.SectionType[SectionType], IsMakefile=IsMakefile) GenFdsGlobalVariable.GenerateSection(OutputFile, [GenSecInputFile], Section.Section.SectionType[SectionType], IsMakefile=IsMakefile)
OutputFileList.append(OutputFile) OutputFileList.append(OutputFile)

View File

@ -733,12 +733,12 @@ class GenFds(object):
if not os.path.exists(FfsPath[0]): if not os.path.exists(FfsPath[0]):
continue continue
MatchDict = {} MatchDict = {}
ReFileEnds = compile('\S+(.ui)$|\S+(fv.sec.txt)$|\S+(.pe32.txt)$|\S+(.te.txt)$|\S+(.pic.txt)$|\S+(.raw.txt)$|\S+(.ffs.txt)$') ReFileEnds = compile('\S+(.ui)$|\S+(fv.sec.txt)$|\S+(.pe32.txt)$|\S+(.pic.txt)$|\S+(.raw.txt)$|\S+(.ffs.txt)$')
FileList = os.listdir(FfsPath[0]) FileList = os.listdir(FfsPath[0])
for File in FileList: for File in FileList:
Match = ReFileEnds.search(File) Match = ReFileEnds.search(File)
if Match: if Match:
for Index in range(1, 8): for Index in range(1, 7):
if Match.group(Index) and Match.group(Index) in MatchDict: if Match.group(Index) and Match.group(Index) in MatchDict:
MatchDict[Match.group(Index)].append(File) MatchDict[Match.group(Index)].append(File)
elif Match.group(Index): elif Match.group(Index):
@ -759,8 +759,6 @@ class GenFds(object):
FileList = MatchDict['fv.sec.txt'] FileList = MatchDict['fv.sec.txt']
elif '.pe32.txt' in MatchDict: elif '.pe32.txt' in MatchDict:
FileList = MatchDict['.pe32.txt'] FileList = MatchDict['.pe32.txt']
elif '.te.txt' in MatchDict:
FileList = MatchDict['.te.txt']
elif '.pic.txt' in MatchDict: elif '.pic.txt' in MatchDict:
FileList = MatchDict['.pic.txt'] FileList = MatchDict['.pic.txt']
elif '.raw.txt' in MatchDict: elif '.raw.txt' in MatchDict:

View File

@ -26,7 +26,6 @@ class Section (SectionClassObject):
'FREEFORM' : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID', 'FREEFORM' : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID',
BINARY_FILE_TYPE_PE32 : 'EFI_SECTION_PE32', BINARY_FILE_TYPE_PE32 : 'EFI_SECTION_PE32',
BINARY_FILE_TYPE_PIC : 'EFI_SECTION_PIC', BINARY_FILE_TYPE_PIC : 'EFI_SECTION_PIC',
BINARY_FILE_TYPE_TE : 'EFI_SECTION_TE',
'FV_IMAGE' : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', 'FV_IMAGE' : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE',
'COMPAT16' : 'EFI_SECTION_COMPATIBILITY16', 'COMPAT16' : 'EFI_SECTION_COMPATIBILITY16',
BINARY_FILE_TYPE_DXE_DEPEX : 'EFI_SECTION_DXE_DEPEX', BINARY_FILE_TYPE_DXE_DEPEX : 'EFI_SECTION_DXE_DEPEX',
@ -47,7 +46,6 @@ class Section (SectionClassObject):
BINARY_FILE_TYPE_PIC : '.pic', BINARY_FILE_TYPE_PIC : '.pic',
BINARY_FILE_TYPE_PEI_DEPEX : '.depex', BINARY_FILE_TYPE_PEI_DEPEX : '.depex',
'SEC_PEI_DEPEX' : '.depex', 'SEC_PEI_DEPEX' : '.depex',
BINARY_FILE_TYPE_TE : '.te',
BINARY_FILE_TYPE_UNI_VER : '.ver', BINARY_FILE_TYPE_UNI_VER : '.ver',
BINARY_FILE_TYPE_VER : '.ver', BINARY_FILE_TYPE_VER : '.ver',
BINARY_FILE_TYPE_UNI_UI : '.ui', BINARY_FILE_TYPE_UNI_UI : '.ui',
@ -62,7 +60,6 @@ class Section (SectionClassObject):
'SEC_GUID' : '.sec' , 'SEC_GUID' : '.sec' ,
'SEC_PE32' : '.sec' , 'SEC_PE32' : '.sec' ,
'SEC_PIC' : '.sec', 'SEC_PIC' : '.sec',
'SEC_TE' : '.sec',
'SEC_VER' : '.sec', 'SEC_VER' : '.sec',
'SEC_UI' : '.sec', 'SEC_UI' : '.sec',
'SEC_COMPAT16' : '.sec', 'SEC_COMPAT16' : '.sec',
@ -124,8 +121,7 @@ class Section (SectionClassObject):
for File in FfsInf.BinFileList: for File in FfsInf.BinFileList:
if File.Arch == TAB_ARCH_COMMON or FfsInf.CurrentArch == File.Arch: if File.Arch == TAB_ARCH_COMMON or FfsInf.CurrentArch == File.Arch:
if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \ if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \
and FileType == 'DXE_DPEX' and File.Type == BINARY_FILE_TYPE_SMM_DEPEX) \ and FileType == 'DXE_DPEX' and File.Type == BINARY_FILE_TYPE_SMM_DEPEX):
or (FileType == BINARY_FILE_TYPE_TE and File.Type == BINARY_FILE_TYPE_PE32):
if TAB_STAR in FfsInf.TargetOverrideList or File.Target == TAB_STAR or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []: if TAB_STAR in FfsInf.TargetOverrideList or File.Target == TAB_STAR or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:
FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type)) FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type))
else: else:

View File

@ -424,7 +424,6 @@ BINARY_FILE_TYPE_PIC = 'PIC'
BINARY_FILE_TYPE_PEI_DEPEX = 'PEI_DEPEX' BINARY_FILE_TYPE_PEI_DEPEX = 'PEI_DEPEX'
BINARY_FILE_TYPE_DXE_DEPEX = 'DXE_DEPEX' BINARY_FILE_TYPE_DXE_DEPEX = 'DXE_DEPEX'
BINARY_FILE_TYPE_SMM_DEPEX = 'SMM_DEPEX' BINARY_FILE_TYPE_SMM_DEPEX = 'SMM_DEPEX'
BINARY_FILE_TYPE_TE = 'TE'
BINARY_FILE_TYPE_VER = 'VER' BINARY_FILE_TYPE_VER = 'VER'
BINARY_FILE_TYPE_UI = 'UI' BINARY_FILE_TYPE_UI = 'UI'
BINARY_FILE_TYPE_BIN = 'BIN' BINARY_FILE_TYPE_BIN = 'BIN'

View File

@ -175,13 +175,13 @@ COMPAT16\cell \hich\af4\dbch\af31505\loch\f4 EFI_SECTION_COMPATIBILITY16\cell }\
\ltrch\fcs0 \fs18\cf1\insrsid15798865\charrsid12198464 \hich\af43\dbch\af31505\loch\f43 If no options ar}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid15798865 \hich\af43\dbch\af31505\loch\f43 e specified, tool prints usage.}{\rtlch\fcs1 \ltrch\fcs0 \fs18\cf1\insrsid15798865\charrsid12198464 \hich\af43\dbch\af31505\loch\f43 If no options ar}{\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid15798865 \hich\af43\dbch\af31505\loch\f43 e specified, tool prints usage.}{\rtlch\fcs1
\ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid13127309 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid13127309
\par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Filename1 [FilenameN] \par }{\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Filename1 [FilenameN]
\par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Input PE/PE32+ image, or TE image, or other binary files. \par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Input PE/PE32+ image or other binary files.
\par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -o FileName, --outputfile FileName \par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -o FileName, --outputfile FileName
\par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 The PI section file is created. This option is required. \par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 The PI section file is created. This option is required.
\par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -s SectionType, --sectiontype SectionType \par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -s SectionType, --sectiontype SectionType
\par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 SectionType defined in PI spec is one type of EFI_SECTION_COMPRE \par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 SectionType defined in PI spec is one type of EFI_SECTION_COMPRE
\hich\af43\dbch\af31505\loch\f43 \hich\af43\dbch\af31505\loch\f43
SSION, EFI_SECTION_GUID_DEFINED, EFI_SECTION_PE32, EFI_SECTION_PIC, EFI_SECTION_TE, EFI_SECTION_DXE_DEPEX, EFI_SECTION_COMPATIBILITY16, EFI_SECTION_USER_INTERFACE, EFI_SECTION_VERSION, EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_RAW, EFI_SECTION_FREEFO SSION, EFI_SECTION_GUID_DEFINED, EFI_SECTION_PE32, EFI_SECTION_PIC, EFI_SECTION_DXE_DEPEX, EFI_SECTION_COMPATIBILITY16, EFI_SECTION_USER_INTERFACE, EFI_SECTION_VERSION, EFI_SECTION_FIRMWARE_VOLUME_IMAGE, EFI_SECTION_RAW, EFI_SECTION_FREEFO
\hich\af43\dbch\af31505\loch\f43 R\hich\af43\dbch\af31505\loch\f43 M_SUBTYPE_GUID, EFI_SECTION_PEI_DEPEX. If sectiontype is not given, EFI_SECTION_ALL is default type to contain the input all sections to one section file. \hich\af43\dbch\af31505\loch\f43 R\hich\af43\dbch\af31505\loch\f43 M_SUBTYPE_GUID, EFI_SECTION_PEI_DEPEX. If sectiontype is not given, EFI_SECTION_ALL is default type to contain the input all sections to one section file.
\par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -c [Type], --compress [Type] \par }\pard \ltrpar\ql \li0\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af43\afs18 \ltrch\fcs0 \b\fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 -c [Type], --compress [Type]
\par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Compress method type can be PI_NONE, PI_STD or TIANO. If Type is not given, PI_ \par }\pard \ltrpar\ql \li360\ri0\sb200\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0 {\rtlch\fcs1 \af43\afs18 \ltrch\fcs0 \fs18\cf1\insrsid11342878 \hich\af43\dbch\af31505\loch\f43 Compress method type can be PI_NONE, PI_STD or TIANO. If Type is not given, PI_

View File

@ -112,14 +112,7 @@ ProcessFvSection:
) )
else else
( (
if &sectiontype==0x12 ; TE print "unknown section type"
(
do EfiProcessTeImage (&secstart+0x4)
)
else
(
print "unknown section type"
)
) )
return return

View File

@ -1,64 +0,0 @@
;
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>
;
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
LOCAL &imgstart &strippedsize &debugdirentryrva &debugtype &debugrva &dwarfsig &elfbase &elfpath &pathoffset
ENTRY &imgstart
&imgstart=&imgstart
print "TE image found at &imgstart"
; determine pe header bytes removed to account for in rva references
&strippedsize=(Data.Long(a:&imgstart+0x4)&0xffff0000)>>16.
&strippedsize=&strippedsize-0x28
&debugdirentryrva=Data.Long(a:&imgstart+0x20)
if &debugdirentryrva==0
(
print "no debug dir for image at &imgstart"
enddo
)
&debugdirentryrva=&debugdirentryrva-&strippedsize
&debugtype=Data.Long(a:&imgstart+&debugdirentryrva+0xc)
if (&debugtype!=0xdf)&&(&debugtype!=0x02)
(
print "debug type is not dwarf for image at &imgstart, it's &debugtype"
enddo
)
&debugrva=Data.Long(a:&imgstart+&debugdirentryrva+0x14)
&debugrva=&debugrva-&strippedsize;
&dwarfsig=Data.Long(a:&imgstart+&debugrva);
if &dwarfsig==0x66727764
(
&pathoffset=0xc
)
else
(
if &dwarfsig==0x3031424E
(
&pathoffset=0x10
)
else
(
print "debug signature not found for image at &imgstart, its &dwarfsig"
enddo
)
)
&elfpath=Data.String(c:&imgstart+&debugrva+&pathoffset)
; elf base is baseofcode (we hope that for TE images it's not baseofdata)
&elfbase=&imgstart+Data.Long(a:&imgstart+0xc)-&strippedsize
print "found path &elfpath"
; $fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;
ON ERROR GOSUB
return
data.load.elf &elfpath &elfbase /NOCODE /NOCLEAR
ON error
enddo

View File

@ -210,7 +210,6 @@
[PcdsFeatureFlag] [PcdsFeatureFlag]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|FALSE
[PcdsFixedAtBuild] [PcdsFixedAtBuild]

View File

@ -419,7 +419,6 @@ class EFI_SECTION_TYPE:
DISPOSABLE = 0x03 DISPOSABLE = 0x03
PE32 = 0x10 PE32 = 0x10
PIC = 0x11 PIC = 0x11
TE = 0x12
DXE_DEPEX = 0x13 DXE_DEPEX = 0x13
VERSION = 0x14 VERSION = 0x14
USER_INTERFACE = 0x15 USER_INTERFACE = 0x15

View File

@ -145,20 +145,6 @@ class EFI_IMAGE_DATA_DIRECTORY(Structure):
('Size', c_uint32) ('Size', c_uint32)
] ]
class EFI_TE_IMAGE_HEADER(Structure):
_fields_ = [
('Signature', ARRAY(c_char, 2)),
('Machine', c_uint16),
('NumberOfSections', c_uint8),
('Subsystem', c_uint8),
('StrippedSize', c_uint16),
('AddressOfEntryPoint', c_uint32),
('BaseOfCode', c_uint32),
('ImageBase', c_uint64),
('DataDirectoryBaseReloc', EFI_IMAGE_DATA_DIRECTORY),
('DataDirectoryDebug', EFI_IMAGE_DATA_DIRECTORY)
]
class EFI_IMAGE_DOS_HEADER(Structure): class EFI_IMAGE_DOS_HEADER(Structure):
_fields_ = [ _fields_ = [
('e_magic', c_uint16), ('e_magic', c_uint16),
@ -326,7 +312,6 @@ class EFI_SECTION_TYPE:
DISPOSABLE = 0x03 DISPOSABLE = 0x03
PE32 = 0x10 PE32 = 0x10
PIC = 0x11 PIC = 0x11
TE = 0x12
DXE_DEPEX = 0x13 DXE_DEPEX = 0x13
VERSION = 0x14 VERSION = 0x14
USER_INTERFACE = 0x15 USER_INTERFACE = 0x15
@ -633,11 +618,8 @@ class FirmwareDevice:
class PeTeImage: class PeTeImage:
def __init__(self, offset, data): def __init__(self, offset, data):
self.Offset = offset self.Offset = offset
tehdr = EFI_TE_IMAGE_HEADER.from_buffer (data, 0) doshdr = EFI_IMAGE_DOS_HEADER.from_buffer (data, 0)
if tehdr.Signature == b'VZ': # TE image elif doshdr.e_magic == b'MZ': # PE image
self.TeHdr = tehdr
elif tehdr.Signature == b'MZ': # PE image
self.TeHdr = None
self.DosHdr = EFI_IMAGE_DOS_HEADER.from_buffer (data, 0) self.DosHdr = EFI_IMAGE_DOS_HEADER.from_buffer (data, 0)
self.PeHdr = EFI_IMAGE_NT_HEADERS32.from_buffer (data, self.DosHdr.e_lfanew) self.PeHdr = EFI_IMAGE_NT_HEADERS32.from_buffer (data, self.DosHdr.e_lfanew)
if self.PeHdr.Signature != 0x4550: if self.PeHdr.Signature != 0x4550:
@ -658,20 +640,13 @@ class PeTeImage:
self.Data = data self.Data = data
self.RelocList = [] self.RelocList = []
def IsTeImage(self):
return self.TeHdr is not None
def ParseReloc(self): def ParseReloc(self):
if self.IsTeImage(): # Assuming PE32 image type (self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b)
rsize = self.TeHdr.DataDirectoryBaseReloc.Size rsize = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size
roffset = sizeof(self.TeHdr) - self.TeHdr.StrippedSize + self.TeHdr.DataDirectoryBaseReloc.VirtualAddress roffset = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress
else: if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image
# Assuming PE32 image type (self.PeHdr.OptionalHeader.PeOptHdr.Magic == 0x10b) rsize = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size
rsize = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size roffset = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress
roffset = self.PeHdr.OptionalHeader.PeOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress
if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image
rsize = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].Size
roffset = self.PeHdr.OptionalHeader.PePlusOptHdr.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY.BASERELOC].VirtualAddress
alignment = 4 alignment = 4
offset = roffset offset = roffset
@ -692,8 +667,6 @@ class PeTeImage:
raise Exception("ERROR: Unsupported relocation type %d!" % rtype) raise Exception("ERROR: Unsupported relocation type %d!" % rtype)
# Calculate the offset of the relocation # Calculate the offset of the relocation
aoff = blkhdr.PageRVA + roff aoff = blkhdr.PageRVA + roff
if self.IsTeImage():
aoff += sizeof(self.TeHdr) - self.TeHdr.StrippedSize
self.RelocList.append((rtype, aoff)) self.RelocList.append((rtype, aoff))
offset += sizeof(rdata) offset += sizeof(rdata)
@ -718,18 +691,14 @@ class PeTeImage:
else: else:
raise Exception('ERROR: Unknown relocation type %d !' % rtype) raise Exception('ERROR: Unknown relocation type %d !' % rtype)
if self.IsTeImage(): offset = self.Offset + self.DosHdr.e_lfanew
offset = self.Offset + EFI_TE_IMAGE_HEADER.ImageBase.offset offset += EFI_IMAGE_NT_HEADERS32.OptionalHeader.offset
size = EFI_TE_IMAGE_HEADER.ImageBase.size if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image
offset += EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.offset
size = EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.size
else: else:
offset = self.Offset + self.DosHdr.e_lfanew offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset
offset += EFI_IMAGE_NT_HEADERS32.OptionalHeader.offset size = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size
if self.PeHdr.OptionalHeader.PePlusOptHdr.Magic == 0x20b: # PE32+ image
offset += EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.offset
size = EFI_IMAGE_OPTIONAL_HEADER32_PLUS.ImageBase.size
else:
offset += EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.offset
size = EFI_IMAGE_OPTIONAL_HEADER32.ImageBase.size
value = Bytes2Val(fdbin[offset:offset+size]) + delta value = Bytes2Val(fdbin[offset:offset+size]) + delta
fdbin[offset:offset+size] = Val2Bytes(value, size) fdbin[offset:offset+size] = Val2Bytes(value, size)
@ -815,7 +784,7 @@ def SplitFspBin (fspfile, outdir, nametemplate):
def GetImageFromFv (fd, parentfvoffset, fv, imglist): def GetImageFromFv (fd, parentfvoffset, fv, imglist):
for ffs in fv.FfsList: for ffs in fv.FfsList:
for sec in ffs.SecList: for sec in ffs.SecList:
if sec.SecHdr.Type in [EFI_SECTION_TYPE.TE, EFI_SECTION_TYPE.PE32]: # TE or PE32 if sec.SecHdr.Type in [EFI_SECTION_TYPE.PE32]: # PE32
offset = fd.Offset + parentfvoffset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr) offset = fd.Offset + parentfvoffset + fv.Offset + ffs.Offset + sec.Offset + sizeof(sec.SecHdr)
imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr))) imglist.append ((offset, len(sec.SecData) - sizeof(sec.SecHdr)))

View File

@ -394,47 +394,22 @@ PeiGetPe32Data (
OUT UINT32 *Pe32DataSize OUT UINT32 *Pe32DataSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SECTION_TYPE SearchType1; UINT32 AuthenticationState;
EFI_SECTION_TYPE SearchType2;
UINT32 AuthenticationState;
*Pe32Data = NULL; *Pe32Data = NULL;
if (FeaturePcdGet (PcdPeiCoreImageLoaderSearchTeSectionFirst)) {
SearchType1 = EFI_SECTION_TE;
SearchType2 = EFI_SECTION_PE32;
} else {
SearchType1 = EFI_SECTION_PE32;
SearchType2 = EFI_SECTION_TE;
}
// //
// Try to find a first exe section (if PcdPeiCoreImageLoaderSearchTeSectionFirst // Try to find the exe section.
// is true, TE will be searched first).
// //
Status = PeiServicesFfsFindSectionData4 ( Status = PeiServicesFfsFindSectionData4 (
SearchType1, EFI_SECTION_PE32,
0, 0,
FileHandle, FileHandle,
Pe32Data, Pe32Data,
Pe32DataSize, Pe32DataSize,
&AuthenticationState &AuthenticationState
); );
//
// If we didn't find a first exe section, try to find the second exe section.
//
if (EFI_ERROR (Status)) {
Status = PeiServicesFfsFindSectionData4 (
SearchType2,
0,
FileHandle,
Pe32Data,
Pe32DataSize,
&AuthenticationState
);
}
return Status; return Status;
} }
@ -472,52 +447,28 @@ PeiLoadImageLoadImage (
VOID *Pe32Data; VOID *Pe32Data;
UINT32 Pe32DataSize; UINT32 Pe32DataSize;
EFI_PHYSICAL_ADDRESS ImageAddress; EFI_PHYSICAL_ADDRESS ImageAddress;
EFI_SECTION_TYPE SearchType1;
EFI_SECTION_TYPE SearchType2;
UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext; UEFI_IMAGE_LOADER_IMAGE_CONTEXT ImageContext;
*EntryPoint = 0; *EntryPoint = 0;
*AuthenticationState = 0; *AuthenticationState = 0;
if (FeaturePcdGet (PcdPeiCoreImageLoaderSearchTeSectionFirst)) {
SearchType1 = EFI_SECTION_TE;
SearchType2 = EFI_SECTION_PE32;
} else {
SearchType1 = EFI_SECTION_PE32;
SearchType2 = EFI_SECTION_TE;
}
// //
// Try to find a first exe section (if PcdPeiCoreImageLoaderSearchTeSectionFirst // Try to find the exe section.
// is true, TE will be searched first).
// //
Status = PeiServicesFfsFindSectionData4 ( Status = PeiServicesFfsFindSectionData4 (
SearchType1, EFI_SECTION_PE32,
0, 0,
FileHandle, FileHandle,
&Pe32Data, &Pe32Data,
&Pe32DataSize, &Pe32DataSize,
AuthenticationState AuthenticationState
); );
//
// If we didn't find a first exe section, try to find the second exe section.
//
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = PeiServicesFfsFindSectionData4 ( //
SearchType2, // PEI core only carry the loader function for PE32 executables
0, // If this two section does not exist, just return.
FileHandle, //
&Pe32Data, return Status;
&Pe32DataSize,
AuthenticationState
);
if (EFI_ERROR (Status)) {
//
// PEI core only carry the loader function for TE and PE32 executables
// If this two section does not exist, just return.
//
return Status;
}
} }
DEBUG ((DEBUG_INFO, "Loading PEIM %g\n", FileHandle)); DEBUG ((DEBUG_INFO, "Loading PEIM %g\n", FileHandle));
@ -625,7 +576,7 @@ PeiLoadImageLoadImageWrapper (
/** /**
Check whether the input image has the relocation. Check whether the input image has the relocation.
@param Pe32Data Pointer to the PE/COFF or TE image. @param Pe32Data Pointer to the PE/COFF image.
@retval TRUE Relocation is stripped. @retval TRUE Relocation is stripped.
@retval FALSE Relocation is not stripped. @retval FALSE Relocation is not stripped.
@ -665,13 +616,7 @@ RelocationIsStrip (
// Look at the file header to determine if relocations have been stripped, and // Look at the file header to determine if relocations have been stripped, and
// save this info in the image context for later use. // save this info in the image context for later use.
// //
if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) { if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
if ((Hdr.Te->DataDirectory[0].Size == 0) && (Hdr.Te->DataDirectory[0].VirtualAddress == 0)) {
return TRUE;
} else {
return FALSE;
}
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
if ((Hdr.Pe32->FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) { if ((Hdr.Pe32->FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0) {
return TRUE; return TRUE;
} else { } else {

View File

@ -102,7 +102,6 @@
[Pcd] [Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeiStackSize ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressPeiCodePageNumber ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressPeiCodePageNumber ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressBootTimeCodePageNumber ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressBootTimeCodePageNumber ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressRuntimeCodePageNumber ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressRuntimeCodePageNumber ## SOMETIMES_CONSUMES

View File

@ -328,24 +328,6 @@ SmmLoadImage (
&Size, &Size,
&AuthenticationStatus &AuthenticationStatus
); );
if (EFI_ERROR (Status)) {
//
// Try reading TE section secondly
//
Buffer = NULL;
Size = 0;
Status = Fv->ReadSection (
Fv,
NameGuid,
EFI_SECTION_TE,
0,
&Buffer,
&Size,
&AuthenticationStatus
);
}
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
if (Buffer != NULL) { if (Buffer != NULL) {
gBS->FreePool (Buffer); gBS->FreePool (Buffer);

View File

@ -772,14 +772,6 @@
# @Prompt Enable ConOut UGA support. # @Prompt Enable ConOut UGA support.
gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|TRUE|BOOLEAN|0x00010043 gEfiMdeModulePkgTokenSpaceGuid.PcdConOutUgaSupport|TRUE|BOOLEAN|0x00010043
## Indicates PeiCore will first search TE section from the PEIM to load the image, or PE32 section, when PeiCore dispatches a PEI module.
# This PCD is used to tune PEI phase performance to reduce the search image time.
# It can be set according to the generated image section type.<BR><BR>
# TRUE - PeiCore will first search TE section from PEIM to load the image, if TE section is not found, then PeiCore will search PE section.<BR>
# FALSE - PeiCore will first search PE section from PEIM to load the image.<BR>
# @Prompt PeiCore search TE section first.
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreImageLoaderSearchTeSectionFirst|TRUE|BOOLEAN|0x00010044
## Indicates if to turn off the support of legacy usb. So legacy usb device driver can not make use of SMI ## Indicates if to turn off the support of legacy usb. So legacy usb device driver can not make use of SMI
# interrupt to access usb device in the case of absence of usb stack. # interrupt to access usb device in the case of absence of usb stack.
# DUET platform requires the token to be TRUE.<BR><BR> # DUET platform requires the token to be TRUE.<BR><BR>

View File

@ -715,12 +715,6 @@
"TRUE - Installs UGA Draw Protocol on virtual handle created by ConsplitterDxe.<BR>\n" "TRUE - Installs UGA Draw Protocol on virtual handle created by ConsplitterDxe.<BR>\n"
"FALSE - Does not install UGA Draw Protocol on virtual handle created by ConsplitterDxe.<BR>" "FALSE - Does not install UGA Draw Protocol on virtual handle created by ConsplitterDxe.<BR>"
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdPeiCoreImageLoaderSearchTeSectionFirst_PROMPT #language en-US "PeiCore search TE section first"
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdPeiCoreImageLoaderSearchTeSectionFirst_HELP #language en-US "Indicates PeiCore will first search TE section from the PEIM to load the image, or PE32 section, when PeiCore dispatches a PEI module. This PCD is used to tune PEI phase performance to reduce the search image time. It can be set according to the generated image section type.<BR><BR>\n"
"TRUE - PeiCore will first search TE section from PEIM to load the image, if TE section is not found, then PeiCore will search PE section.<BR>\n"
"FALSE - PeiCore will first search PE section from PEIM to load the image.<BR>"
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTurnOffUsbLegacySupport_PROMPT #language en-US "Turn off USB legacy support" #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTurnOffUsbLegacySupport_PROMPT #language en-US "Turn off USB legacy support"
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTurnOffUsbLegacySupport_HELP #language en-US "Disable legacy USB? If disabled, legacy USB device driver cannot make use of SMI interrupt to access USB device in the case of absence of a USB stack. TRUE - disable<BR>\n" #string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdTurnOffUsbLegacySupport_HELP #language en-US "Disable legacy USB? If disabled, legacy USB device driver cannot make use of SMI interrupt to access USB device in the case of absence of a USB stack. TRUE - disable<BR>\n"

View File

@ -78,7 +78,7 @@ FvFsFindExecutableSection (
UINT32 AuthenticationStatus; UINT32 AuthenticationStatus;
EFI_STATUS Status; EFI_STATUS Status;
for (SectionType = EFI_SECTION_PE32; SectionType <= EFI_SECTION_TE; SectionType++) { for (SectionType = EFI_SECTION_PE32; SectionType <= EFI_SECTION_PIC; SectionType++) {
Status = FvProtocol->ReadSection ( Status = FvProtocol->ReadSection (
FvProtocol, FvProtocol,
&FvFileInfo->NameGuid, &FvFileInfo->NameGuid,

View File

@ -724,38 +724,12 @@ typedef struct {
} EFI_IMAGE_RESOURCE_DATA_ENTRY; } EFI_IMAGE_RESOURCE_DATA_ENTRY;
/// ///
/// Header format for TE images, defined in the PI Specification, 1.0. /// Union of PE32 and PE32+ headers.
///
typedef struct {
UINT16 Signature; ///< The signature for TE format = "VZ".
UINT16 Machine; ///< From the original file header.
UINT8 NumberOfSections; ///< From the original file header.
UINT8 Subsystem; ///< From original optional header.
UINT16 StrippedSize; ///< Number of bytes we removed from the header.
UINT32 AddressOfEntryPoint; ///< Offset to entry point -- from original optional header.
UINT32 BaseOfCode; ///< From original image -- required for ITP debug.
UINT64 ImageBase; ///< From original file header.
EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]; ///< Only base relocation and debug directory.
} EFI_TE_IMAGE_HEADER;
#define EFI_TE_IMAGE_HEADER_SIGNATURE SIGNATURE_16('V', 'Z')
//
// Data directory indexes in our TE image header
//
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC 0
#define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG 1
///
/// Union of PE32, PE32+, and TE headers.
/// ///
typedef union { typedef union {
EFI_IMAGE_NT_HEADERS_COMMON_HDR PeCommon; EFI_IMAGE_NT_HEADERS_COMMON_HDR PeCommon;
EFI_IMAGE_NT_HEADERS32 Pe32; EFI_IMAGE_NT_HEADERS32 Pe32;
EFI_IMAGE_NT_HEADERS64 Pe32Plus; EFI_IMAGE_NT_HEADERS64 Pe32Plus;
EFI_TE_IMAGE_HEADER Te;
} EFI_IMAGE_OPTIONAL_HEADER_UNION; } EFI_IMAGE_OPTIONAL_HEADER_UNION;
#endif // PE_COFF_IMAGE2_H_ #endif // PE_COFF_IMAGE2_H_

View File

@ -25,8 +25,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections
are retrieved from an FFS file based on SectionType and SectionInstance. are retrieved from an FFS file based on SectionType and SectionInstance.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -73,8 +71,6 @@ GetSectionFromAnyFvByFileType (
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections
are retrieved from an FFS file based on SectionType and SectionInstance. are retrieved from an FFS file based on SectionType and SectionInstance.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().
@ -126,10 +122,6 @@ GetSectionFromAnyFv (
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections are retrieved from See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections are retrieved from
an FFS file based on SectionType and SectionInstance. an FFS file based on SectionType and SectionInstance.
If the currently executing module was not loaded from a firmware volume, then EFI_NOT_FOUND is returned.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -179,9 +171,6 @@ GetSectionFromFv (
to use FreePool() to free the allocated buffer. See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for to use FreePool() to free the allocated buffer. See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for
details on how sections are retrieved from an FFS file based on SectionType and SectionInstance. details on how sections are retrieved from an FFS file based on SectionType and SectionInstance.
If the currently executing module was not loaded from an FFS file, then EFI_NOT_FOUND is returned.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -263,8 +252,6 @@ GetFileBufferByFilePath (
The order that the firmware volumes is searched is not deterministic. For each FFS file found a search The order that the firmware volumes is searched is not deterministic. For each FFS file found a search
is made for FFS sections of type SectionType. is made for FFS sections of type SectionType.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().

View File

@ -55,7 +55,6 @@
/// Image type enumeration for Image format identification from the context. /// Image type enumeration for Image format identification from the context.
/// ///
typedef enum { typedef enum {
PeCoffLoaderTypeTe,
PeCoffLoaderTypePe32, PeCoffLoaderTypePe32,
PeCoffLoaderTypePe32Plus, PeCoffLoaderTypePe32Plus,
PeCoffLoaderTypeMax PeCoffLoaderTypeMax
@ -128,11 +127,6 @@ typedef struct {
/// ///
UINT16 Machine; UINT16 Machine;
/// ///
/// The size, in Bytes, stripped from the beginning of the Image raw file
/// during TE file generation. Always 0 for PE Images.
///
UINT16 TeStrippedOffset;
///
/// The RVA of the Relocation Directory. /// The RVA of the Relocation Directory.
/// ///
UINT32 RelocDirRva; UINT32 RelocDirRva;
@ -182,7 +176,7 @@ BOOLEAN
FileBuffer must remain valid for the entire lifetime of Context. FileBuffer must remain valid for the entire lifetime of Context.
@param[out] Context The context describing the Image. @param[out] Context The context describing the Image.
@param[in] FileBuffer The file data to parse as TE or PE Image. @param[in] FileBuffer The file data to parse as PE Image.
@param[in] FileSize The size, in Bytes, of FileBuffer. @param[in] FileSize The size, in Bytes, of FileBuffer.
@retval RETURN_SUCCESS The Image context has been initialised successfully. @retval RETURN_SUCCESS The Image context has been initialised successfully.

View File

@ -212,7 +212,6 @@ typedef UINT8 EFI_SECTION_TYPE;
/// ///
#define EFI_SECTION_PE32 0x10 #define EFI_SECTION_PE32 0x10
#define EFI_SECTION_PIC 0x11 #define EFI_SECTION_PIC 0x11
#define EFI_SECTION_TE 0x12
#define EFI_SECTION_DXE_DEPEX 0x13 #define EFI_SECTION_DXE_DEPEX 0x13
#define EFI_SECTION_VERSION 0x14 #define EFI_SECTION_VERSION 0x14
#define EFI_SECTION_USER_INTERFACE 0x15 #define EFI_SECTION_USER_INTERFACE 0x15

View File

@ -43,7 +43,6 @@
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderWXorX gEfiMdePkgTokenSpaceGuid.PcdImageLoaderWXorX
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderDebugSupport gEfiMdePkgTokenSpaceGuid.PcdImageLoaderDebugSupport
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderProhibitTe
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAllowMisalignedOffset gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAllowMisalignedOffset
gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderRemoveXForWX gEfiMdePkgTokenSpaceGuid.PcdImageLoaderRemoveXForWX

View File

@ -7,7 +7,6 @@ An Image Section Table is considered well-formed if and only if:
1. The Image Section Table is sorted by Image section RVA in ascending order. 1. The Image Section Table is sorted by Image section RVA in ascending order.
2. All Image sections are disjoint in the Image memory space. 2. All Image sections are disjoint in the Image memory space.
3. For PE/COFF Images, all Image sections are in bounds of the Image memory space defined by the Image headers. 3. For PE/COFF Images, all Image sections are in bounds of the Image memory space defined by the Image headers.
* For TE Images, the Image memory space is implicitly defined by the Image Section Table.
4. All Image sections are in bounds of the raw file. 4. All Image sections are in bounds of the raw file.
Additionally, based on PCD policy values, the following constraints may be added: Additionally, based on PCD policy values, the following constraints may be added:

View File

@ -34,7 +34,6 @@ PeCoffGetPdbPath (
BOOLEAN Overflow; BOOLEAN Overflow;
CONST EFI_IMAGE_DATA_DIRECTORY *DebugDir; CONST EFI_IMAGE_DATA_DIRECTORY *DebugDir;
CONST EFI_TE_IMAGE_HEADER *TeHdr;
CONST EFI_IMAGE_NT_HEADERS32 *Pe32Hdr; CONST EFI_IMAGE_NT_HEADERS32 *Pe32Hdr;
CONST EFI_IMAGE_NT_HEADERS64 *Pe32PlusHdr; CONST EFI_IMAGE_NT_HEADERS64 *Pe32PlusHdr;
@ -63,19 +62,6 @@ PeCoffGetPdbPath (
// Retrieve the Debug Directory of the Image. // Retrieve the Debug Directory of the Image.
// //
switch (Context->ImageType) { switch (Context->ImageType) {
case PeCoffLoaderTypeTe:
if (PcdGetBool (PcdImageLoaderProhibitTe)) {
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
TeHdr = (CONST EFI_TE_IMAGE_HEADER *) (CONST VOID *) (
(CONST CHAR8 *) Context->FileBuffer
);
DebugDir = &TeHdr->DataDirectory[1];
break;
case PeCoffLoaderTypePe32: case PeCoffLoaderTypePe32:
Pe32Hdr = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) ( Pe32Hdr = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) (
(CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset (CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset
@ -170,20 +156,6 @@ PeCoffGetPdbPath (
} }
DebugEntryFileOffset = CodeViewEntry->FileOffset; DebugEntryFileOffset = CodeViewEntry->FileOffset;
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
Overflow = BaseOverflowSubU32 (
DebugEntryFileOffset,
Context->TeStrippedOffset,
&DebugEntryFileOffset
);
if (Overflow) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
} else {
ASSERT (Context->TeStrippedOffset == 0);
}
// //
// Verify the CodeView entry is in bounds of the raw file, and the // Verify the CodeView entry is in bounds of the raw file, and the
// CodeView entry raw file offset is sufficiently aligned. // CodeView entry raw file offset is sufficiently aligned.

View File

@ -95,7 +95,6 @@ InternalHashSections (
// //
// 13. Repeat steps 11 and 12 for all of the sections in the sorted table. // 13. Repeat steps 11 and 12 for all of the sections in the sorted table.
// //
ASSERT (Context->TeStrippedOffset == 0);
for (SectionIndex = 0; SectionIndex < Context->NumberOfSections; ++SectionIndex) { for (SectionIndex = 0; SectionIndex < Context->NumberOfSections; ++SectionIndex) {
// //
// Verify the Image section does not overlap with the previous one if the // Verify the Image section does not overlap with the previous one if the
@ -196,17 +195,6 @@ PeCoffHashImageAuthenticode (
// Additionally, retrieve important offsets for later steps. // Additionally, retrieve important offsets for later steps.
// //
switch (Context->ImageType) { switch (Context->ImageType) {
case PeCoffLoaderTypeTe:
if (PcdGetBool (PcdImageLoaderProhibitTe)) {
ASSERT (FALSE);
return FALSE;
}
//
// Authenticode does not define a hashing algorithm for TE Images.
//
DEBUG_RAISE ();
return FALSE;
case PeCoffLoaderTypePe32: case PeCoffLoaderTypePe32:
Pe32 = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) ( Pe32 = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) (
(CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset (CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset

View File

@ -50,16 +50,6 @@ PeCoffGetHiiDataRva (
// Retrieve the Image's Resource Directory Table. // Retrieve the Image's Resource Directory Table.
// //
switch (Context->ImageType) { switch (Context->ImageType) {
case PeCoffLoaderTypeTe:
if (PcdGetBool (PcdImageLoaderProhibitTe)) {
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
//
// TE Images do not contain a Resource Directory Table.
//
return RETURN_NOT_FOUND;
case PeCoffLoaderTypePe32: case PeCoffLoaderTypePe32:
Pe32Hdr = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) ( Pe32Hdr = (CONST EFI_IMAGE_NT_HEADERS32 *) (CONST VOID *) (
(CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset (CONST CHAR8 *) Context->FileBuffer + Context->ExeHdrOffset

View File

@ -75,23 +75,9 @@ PeCoffGetSizeOfImageInplace (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *Context IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *Context
) )
{ {
UINT32 SizeOfImage;
ASSERT (Context != NULL); ASSERT (Context != NULL);
SizeOfImage = Context->SizeOfImage; return Context->SizeOfImage;
//
// SizeOfImage is defined with the full Image header size pre-stripping. As
// XIP TE Images always have a stripped Image header, subtract the difference.
//
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
ASSERT (Context->TeStrippedOffset < SizeOfImage);
SizeOfImage -= Context->TeStrippedOffset;
} else {
ASSERT (Context->TeStrippedOffset == 0);
}
return SizeOfImage;
} }
UINT64 UINT64

View File

@ -58,12 +58,10 @@ InternalVerifySections (
BOOLEAN Overflow; BOOLEAN Overflow;
UINT32 NextSectRva; UINT32 NextSectRva;
UINT32 SectRawEnd; UINT32 SectRawEnd;
UINT32 EffectiveSectRawEnd;
UINT16 SectionIndex; UINT16 SectionIndex;
CONST EFI_IMAGE_SECTION_HEADER *Sections; CONST EFI_IMAGE_SECTION_HEADER *Sections;
ASSERT (Context != NULL); ASSERT (Context != NULL);
ASSERT (Context->TeStrippedOffset <= Context->SizeOfHeaders);
ASSERT (IS_POW2 (Context->SectionAlignment)); ASSERT (IS_POW2 (Context->SectionAlignment));
ASSERT (StartAddress != NULL); ASSERT (StartAddress != NULL);
// //
@ -83,19 +81,6 @@ InternalVerifySections (
// //
if (Sections[0].VirtualAddress == 0) { if (Sections[0].VirtualAddress == 0) {
// FIXME: Add PCD to disallow. // FIXME: Add PCD to disallow.
//
// TE Images cannot support loading the Image Headers as part of the first
// Image section due to its StrippedSize sematics.
//
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
if (Context->ImageType == PeCoffLoaderTypeTe) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
} else {
ASSERT (Context->ImageType != PeCoffLoaderTypeTe);
}
NextSectRva = 0; NextSectRva = 0;
} else { } else {
// //
@ -174,15 +159,6 @@ InternalVerifySections (
// Verify the Image sections with data are in bounds of the file buffer. // Verify the Image sections with data are in bounds of the file buffer.
// //
if (Sections[SectionIndex].SizeOfRawData > 0) { if (Sections[SectionIndex].SizeOfRawData > 0) {
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
if (Context->TeStrippedOffset > Sections[SectionIndex].PointerToRawData) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
} else {
ASSERT (Context->TeStrippedOffset == 0);
}
Overflow = BaseOverflowAddU32 ( Overflow = BaseOverflowAddU32 (
Sections[SectionIndex].PointerToRawData, Sections[SectionIndex].PointerToRawData,
Sections[SectionIndex].SizeOfRawData, Sections[SectionIndex].SizeOfRawData,
@ -193,14 +169,7 @@ InternalVerifySections (
return RETURN_VOLUME_CORRUPTED; return RETURN_VOLUME_CORRUPTED;
} }
if (!PcdGetBool (PcdImageLoaderProhibitTe)) { if (SectRawEnd > FileSize) {
EffectiveSectRawEnd = SectRawEnd - Context->TeStrippedOffset;
} else {
ASSERT (Context->TeStrippedOffset == 0);
EffectiveSectRawEnd = SectRawEnd;
}
if (EffectiveSectRawEnd > FileSize) {
DEBUG_RAISE (); DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED; return RETURN_VOLUME_CORRUPTED;
} }
@ -353,131 +322,6 @@ InternalValidateRelocInfo (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
/**
Verify the TE Image and initialise Context.
Used offsets and ranges must be aligned and in the bounds of the raw file.
Image section Headers and basic Relocation information must be well-formed.
@param[in,out] Context The context describing the Image. Must have been
initialised by PeCoffInitializeContext().
@param[in] FileSize The size, in Bytes, of Context->FileBuffer.
@retval RETURN_SUCCESS The TE Image is well-formed.
@retval other The TE Image is malformed.
**/
STATIC
RETURN_STATUS
InternalInitializeTe (
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *Context,
IN UINT32 FileSize
)
{
RETURN_STATUS Status;
BOOLEAN Overflow;
CONST EFI_TE_IMAGE_HEADER *TeHdr;
UINT32 StartAddress;
ASSERT (Context != NULL);
ASSERT (Context->ExeHdrOffset == 0);
ASSERT (sizeof (EFI_TE_IMAGE_HEADER) <= FileSize);
if (PcdGetBool (PcdImageLoaderProhibitTe)) {
ASSERT (FALSE);
return RETURN_UNSUPPORTED;
}
TeHdr = (CONST EFI_TE_IMAGE_HEADER *) (CONST VOID *) (
(CONST CHAR8 *) Context->FileBuffer
);
Context->ImageType = PeCoffLoaderTypeTe;
//
// Calculate the size, in Bytes, stripped from the Image Headers.
//
Overflow = BaseOverflowSubU16 (
TeHdr->StrippedSize,
sizeof (*TeHdr),
&Context->TeStrippedOffset
);
if (Overflow) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
STATIC_ASSERT (
MAX_UINT8 * sizeof (EFI_IMAGE_SECTION_HEADER) <= MAX_UINT32 - MAX_UINT16,
"The following arithmetic may overflow."
);
//
// Calculate SizeOfHeaders in a way that is equivalent to what the size would
// be if this was the original (unstripped) PE32 binary. As the TE image
// creation doesn't fix fields up, values work the same way as for PE32.
// When referencing raw data however, the TE stripped size must be subracted.
//
Context->SizeOfHeaders = (UINT32) TeHdr->StrippedSize + (UINT32) TeHdr->NumberOfSections * sizeof (EFI_IMAGE_SECTION_HEADER);
//
// Verify that the Image Headers are in bounds of the file buffer.
//
if (Context->SizeOfHeaders - Context->TeStrippedOffset > FileSize) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
STATIC_ASSERT (
IS_ALIGNED (sizeof (*TeHdr), ALIGNOF (EFI_IMAGE_SECTION_HEADER)),
"The Image section alignment requirements are violated."
);
//
// TE Image sections start right after the Image Headers.
//
Context->SectionsOffset = sizeof (EFI_TE_IMAGE_HEADER);
//
// TE Images do not store their section alignment. Assume the UEFI Page size
// by default, as it is the minimum to guarantee memory permission support.
//
Context->SectionAlignment = EFI_PAGE_SIZE;
Context->NumberOfSections = TeHdr->NumberOfSections;
//
// Validate the sections.
// TE images do not have a field to explicitly describe the image size.
// Set it to the top of the Image's memory space.
//
Status = InternalVerifySections (
Context,
FileSize,
&StartAddress
);
if (Status != RETURN_SUCCESS) {
DEBUG_RAISE ();
return Status;
}
//
// Verify the Image entry point is in bounds of the Image buffer.
//
if (TeHdr->AddressOfEntryPoint >= Context->SizeOfImage) {
DEBUG_RAISE ();
return RETURN_VOLUME_CORRUPTED;
}
Context->Machine = TeHdr->Machine;
Context->Subsystem = TeHdr->Subsystem;
Context->ImageBase = TeHdr->ImageBase;
Context->AddressOfEntryPoint = TeHdr->AddressOfEntryPoint;
Context->RelocDirRva = TeHdr->DataDirectory[0].VirtualAddress;
Context->RelocDirSize = TeHdr->DataDirectory[0].Size;
//
// TE Images do not explicitly store whether their Relocations have been
// stripped. Relocations have been stripped if and only if both the RVA and
// size of the Relocation Directory are zero.
//
Context->RelocsStripped = TeHdr->DataDirectory[0].VirtualAddress == 0 && TeHdr->DataDirectory[0].Size == 0;
//
// Verify basic sanity of the Relocation Directory.
//
return InternalValidateRelocInfo (Context, StartAddress);
}
/** /**
Verify the PE32 or PE32+ Image and initialise Context. Verify the PE32 or PE32+ Image and initialise Context.
@ -771,8 +615,6 @@ InternalInitializePe (
ASSERT (Context->SecDirOffset == 0); ASSERT (Context->SecDirOffset == 0);
ASSERT (Context->SecDirSize == 0); ASSERT (Context->SecDirSize == 0);
} }
ASSERT (Context->TeStrippedOffset == 0);
// //
// Verify the Image sections are Well-formed. // Verify the Image sections are Well-formed.
// //
@ -848,24 +690,6 @@ PeCoffInitializeContext (
&& !IS_ALIGNED (Context->ExeHdrOffset, ALIGNOF (EFI_IMAGE_NT_HEADERS_COMMON_HDR))) { && !IS_ALIGNED (Context->ExeHdrOffset, ALIGNOF (EFI_IMAGE_NT_HEADERS_COMMON_HDR))) {
return RETURN_UNSUPPORTED; return RETURN_UNSUPPORTED;
} }
} else if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
//
// Assume the Image starts with the Executable Header, determine whether it
// is a TE Image.
//
if (sizeof (EFI_TE_IMAGE_HEADER) <= FileSize
&& *(CONST UINT16 *) (CONST VOID *) FileBuffer == EFI_TE_IMAGE_HEADER_SIGNATURE) {
//
// Verify the TE Image Header is well-formed.
//
Status = InternalInitializeTe (Context, FileSize);
if (Status != RETURN_SUCCESS) {
DEBUG_RAISE ();
return Status;
}
return RETURN_SUCCESS;
}
} }
// //
// Verify the file buffer can hold a PE Common Header. // Verify the file buffer can hold a PE Common Header.

View File

@ -75,12 +75,7 @@ InternalLoadSections (
// //
// Load the current Image section into the memory space. // Load the current Image section into the memory space.
// //
if (!PcdGetBool (PcdImageLoaderProhibitTe)) { EffectivePointerToRawData = Sections[SectionIndex].PointerToRawData;
EffectivePointerToRawData = Sections[SectionIndex].PointerToRawData - Context->TeStrippedOffset;
} else {
ASSERT (Context->TeStrippedOffset == 0);
EffectivePointerToRawData = Sections[SectionIndex].PointerToRawData;
}
CopyMem ( CopyMem (
(CHAR8 *) Context->ImageBuffer + Sections[SectionIndex].VirtualAddress, (CHAR8 *) Context->ImageBuffer + Sections[SectionIndex].VirtualAddress,
@ -122,7 +117,7 @@ PeCoffLoadImage (
(CONST CHAR8 *) Context->FileBuffer + Context->SectionsOffset (CONST CHAR8 *) Context->FileBuffer + Context->SectionsOffset
); );
if (PcdGetBool (PcdImageLoaderLoadHeader) && Sections[0].VirtualAddress != 0) { if (PcdGetBool (PcdImageLoaderLoadHeader) && Sections[0].VirtualAddress != 0) {
LoadedHeaderSize = Context->SizeOfHeaders - Context->TeStrippedOffset; LoadedHeaderSize = Context->SizeOfHeaders;
CopyMem (Context->ImageBuffer, Context->FileBuffer, LoadedHeaderSize); CopyMem (Context->ImageBuffer, Context->FileBuffer, LoadedHeaderSize);
} else { } else {
LoadedHeaderSize = 0; LoadedHeaderSize = 0;
@ -144,7 +139,6 @@ PeCoffLoadImageInplaceNoBase (
CONST EFI_IMAGE_SECTION_HEADER *Sections; CONST EFI_IMAGE_SECTION_HEADER *Sections;
UINT32 AlignedSize; UINT32 AlignedSize;
UINT16 SectionIndex; UINT16 SectionIndex;
CHAR8 *ImageBuffer;
ASSERT (Context != NULL); ASSERT (Context != NULL);
@ -164,22 +158,7 @@ PeCoffLoadImageInplaceNoBase (
} }
} }
ImageBuffer = (CHAR8 *) Context->FileBuffer; Context->ImageBuffer = (CHAR8 *) Context->FileBuffer;
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
// FIXME: Abstract all accesses to ImageBuffer for safety?
//
// TE XIP Images are padded to be aligned such that their Image sections
// are correctly aligned. ImageBuffer is used exclusively to accesses RVAs,
// which for TE XIP Images are always off by Context->TeStrippedOffset.
// There is no other way but to treat the data in front of the TE Image
// Header as a part of the TE Image Header.
//
ImageBuffer -= Context->TeStrippedOffset;
} else {
ASSERT (Context->ImageType != PeCoffLoaderTypeTe);
}
Context->ImageBuffer = ImageBuffer;
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
@ -194,12 +173,6 @@ PeCoffImageIsInplace (
ASSERT (Context != NULL); ASSERT (Context != NULL);
ImageBase = PeCoffGetImageBase (Context); ImageBase = PeCoffGetImageBase (Context);
if (!PcdGetBool (PcdImageLoaderProhibitTe)) {
ImageBase += Context->TeStrippedOffset;
} else {
ASSERT (Context->TeStrippedOffset == 0);
}
// //
// Verify the Image is located at its preferred load address. // Verify the Image is located at its preferred load address.
// //

View File

@ -1,5 +1,5 @@
## @file ## @file
# UEFI Image Loader library implementation for PE/COFF and TE Images. # UEFI Image Loader library implementation for PE/COFF Images.
# #
# Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR> # Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR>
# #
@ -37,6 +37,5 @@
[FixedPcd] [FixedPcd]
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderLoadHeader gEfiMdePkgTokenSpaceGuid.PcdImageLoaderLoadHeader
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderProhibitTe
gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask gEfiMdePkgTokenSpaceGuid.PcdDebugRaisePropertyMask
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderRemoveXForWX gEfiMdePkgTokenSpaceGuid.PcdImageLoaderRemoveXForWX

View File

@ -1,5 +1,5 @@
/** @file /** @file
UEFI Image Loader library implementation for PE/COFF and TE Images. UEFI Image Loader library implementation for PE/COFF Images.
Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR> Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR>
@ -318,16 +318,14 @@ InternalDebugLocateImage (
// //
// Search for the Image Header in 4 Byte steps. All dynamically loaded // Search for the Image Header in 4 Byte steps. All dynamically loaded
// Images start at a page boundary to allow for Image section protection, // Images start at a page boundary to allow for Image section protection,
// but XIP Images may not. As all Image Headers are at least 4 Byte aligned // but XIP Images may not.
// due to natural alignment, even XIP TE Image Headers should start at a
// 4 Byte boundary.
// //
// Do not attempt to access memory of the first page as it may be protected as // Do not attempt to access memory of the first page as it may be protected as
// part of NULL dereference detection. // part of NULL dereference detection.
// //
for (; EFI_PAGE_SIZE <= (UINTN) Buffer; Buffer -= 4) { for (; EFI_PAGE_SIZE <= (UINTN) Buffer; Buffer -= 4) {
// //
// Try to parse the current memory as PE/COFF or TE Image. Pass MAX_UINT32 // Try to parse the current memory as PE/COFF Image. Pass MAX_UINT32
// as the file size as there isn't any more information available. Only the // as the file size as there isn't any more information available. Only the
// Image Header memory will be accessed as part of initialisation. // Image Header memory will be accessed as part of initialisation.
// //
@ -348,11 +346,7 @@ InternalDebugLocateImage (
// is a part of, if existent. Allow one level of recursion to find a lower // is a part of, if existent. Allow one level of recursion to find a lower
// Image Base including the DOS Image Header. // Image Base including the DOS Image Header.
// //
if ((PcdGetBool (PcdImageLoaderProhibitTe) if (Context->ExeHdrOffset == 0) {
|| Context->ImageType != PeCoffLoaderTypeTe)
&& Context->ExeHdrOffset == 0) {
ASSERT (Context->ImageType != PeCoffLoaderTypeTe);
DosStatus = InternalDebugLocateImage ( DosStatus = InternalDebugLocateImage (
&DosContext, &DosContext,
Buffer - 4, Buffer - 4,
@ -368,7 +362,6 @@ InternalDebugLocateImage (
// //
// We know that (UINTN) Buffer <= Address from the initialisation. // We know that (UINTN) Buffer <= Address from the initialisation.
// //
// FIXME: Set to non-stripped base for XIP TE Images.
if (Address < (UINTN) Buffer + PeCoffGetSizeOfImage (Context)) { if (Address < (UINTN) Buffer + PeCoffGetSizeOfImage (Context)) {
Context->ImageBuffer = Buffer; Context->ImageBuffer = Buffer;
// //
@ -381,7 +374,7 @@ InternalDebugLocateImage (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
// //
// Continue for the unlikely case that a PE/COFF or TE Image embeds another // Continue for the unlikely case that a PE/COFF Image embeds another
// one within its data, the outer Image may still follow. // one within its data, the outer Image may still follow.
// //
} }

View File

@ -1,5 +1,5 @@
/** @file /** @file
UEFI Image Loader library implementation for PE/COFF and TE Images. UEFI Image Loader library implementation for PE/COFF Images.
Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR> Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR>

View File

@ -1,5 +1,5 @@
/** @file /** @file
UEFI Image Loader library implementation for PE/COFF and TE Images. UEFI Image Loader library implementation for PE/COFF Images.
Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR> Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR>

View File

@ -76,10 +76,6 @@ InternalImageHandleToFvHandle (
The details of this search order is defined in description of EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection () The details of this search order is defined in description of EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection ()
found in PI Specification. found in PI Specification.
If SectionType is EFI_SECTION_TE, EFI_SECTION_TE is used as section type to start the search. If EFI_SECTION_TE section
is not found, EFI_SECTION_PE32 will be used to try the search again. If no EFI_SECTION_PE32 section is found, EFI_NOT_FOUND
is returned.
The data and size is returned by Buffer and Size. The caller is responsible to free the Buffer allocated The data and size is returned by Buffer and Size. The caller is responsible to free the Buffer allocated
by this function. This function can be only called at TPL_NOTIFY and below. by this function. This function can be only called at TPL_NOTIFY and below.
@ -157,23 +153,6 @@ InternalGetSectionFromFv (
&AuthenticationStatus &AuthenticationStatus
); );
if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) {
//
// Try reading PE32 section, if the required section is TE type
//
*Buffer = NULL;
*Size = 0;
Status = Fv->ReadSection (
Fv,
NameGuid,
EFI_SECTION_PE32,
SectionInstance,
Buffer,
Size,
&AuthenticationStatus
);
}
return Status; return Status;
} }
@ -191,8 +170,6 @@ InternalGetSectionFromFv (
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections
are retrieved from an FFS file based on SectionType and SectionInstance. are retrieved from an FFS file based on SectionType and SectionInstance.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -338,8 +315,6 @@ Done:
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections
are retrieved from an FFS file based on SectionType and SectionInstance. are retrieved from an FFS file based on SectionType and SectionInstance.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().
@ -461,10 +436,6 @@ Done:
See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections are retrieved from See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections are retrieved from
an FFS file based on SectionType and SectionInstance. an FFS file based on SectionType and SectionInstance.
If the currently executing module was not loaded from a firmware volume, then EFI_NOT_FOUND is returned.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -524,9 +495,6 @@ GetSectionFromFv (
to use FreePool() to free the allocated buffer. See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for to use FreePool() to free the allocated buffer. See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for
details on how sections are retrieved from an FFS file based on SectionType and SectionInstance. details on how sections are retrieved from an FFS file based on SectionType and SectionInstance.
If the currently executing module was not loaded from an FFS file, then EFI_NOT_FOUND is returned.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If Buffer is NULL, then ASSERT(). If Buffer is NULL, then ASSERT().
@ -951,8 +919,6 @@ Finish:
The order that the firmware volumes is searched is not deterministic. For each FFS file found a search The order that the firmware volumes is searched is not deterministic. For each FFS file found a search
is made for FFS sections of type SectionType. is made for FFS sections of type SectionType.
If SectionType is EFI_SECTION_TE, and the search with an FFS file fails,
the search will be retried with a section type of EFI_SECTION_PE32.
This function must be called with a TPL <= TPL_NOTIFY. This function must be called with a TPL <= TPL_NOTIFY.
If NameGuid is NULL, then ASSERT(). If NameGuid is NULL, then ASSERT().

View File

@ -2289,12 +2289,6 @@
# @Prompt Image Loader Alignment Policy. # @Prompt Image Loader Alignment Policy.
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy|0xFFFFFFFF|UINT32|0x4000101E gEfiMdePkgTokenSpaceGuid.PcdImageLoaderAlignmentPolicy|0xFFFFFFFF|UINT32|0x4000101E
## Indicates whether TE Images are allowed.<BR><BR>
# TRUE - TE Images are forbidden.<BR>
# FALSE - TE Images are allowed.<BR>
# @Prompt Prohibit TE Images Loading.
gEfiMdePkgTokenSpaceGuid.PcdImageLoaderProhibitTe|FALSE|BOOLEAN|0x4000101F
## Indicates whether PE32+ header offset is sufficiently aligned.<BR><BR> ## Indicates whether PE32+ header offset is sufficiently aligned.<BR><BR>
# TRUE - Execution Header offset may be not aligned.<BR> # TRUE - Execution Header offset may be not aligned.<BR>
# FALSE - Execution Header offset must be sufficiently aligned.<BR> # FALSE - Execution Header offset must be sufficiently aligned.<BR>

View File

@ -502,16 +502,8 @@ FindPeiCoreImageBaseInFv (
&Section &Section
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = FindFfsFileAndSection ( DEBUG ((DEBUG_ERROR, "Unable to find PEI Core image\n"));
Fv, return Status;
EFI_FV_FILETYPE_PEI_CORE,
EFI_SECTION_TE,
&Section
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Unable to find PEI Core image\n"));
return Status;
}
} }
*PeiCoreImageBase = (EFI_PHYSICAL_ADDRESS)(UINTN)(Section + 1); *PeiCoreImageBase = (EFI_PHYSICAL_ADDRESS)(UINTN)(Section + 1);
@ -681,7 +673,7 @@ FindImageBase (
// //
// Look for executable sections // Look for executable sections
// //
if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) { if (Section->Type == EFI_SECTION_PE32) {
if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) { if (File->Type == EFI_FV_FILETYPE_SECURITY_CORE) {
*SecCoreImageBase = (PHYSICAL_ADDRESS)(UINTN)(Section + 1); *SecCoreImageBase = (PHYSICAL_ADDRESS)(UINTN)(Section + 1);
*SecCoreImageSize = Size - sizeof (*Section); *SecCoreImageSize = Size - sizeof (*Section);

View File

@ -205,7 +205,7 @@ GetExportDirectoryInPeCoffImage (
); );
// //
// Check the PE/COFF Header Signature. Determine if the image is valid and/or a TE image. // Check the PE/COFF Header Signature. Determine if the image is valid image.
// //
if (OptionalHeaderPtrUnion.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) { if (OptionalHeaderPtrUnion.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {
DEBUG ((DEBUG_ERROR, "%a %a: The PE signature is not valid for the current image.\n", _DBGMSGID_, __func__)); DEBUG ((DEBUG_ERROR, "%a %a: The PE signature is not valid for the current image.\n", _DBGMSGID_, __func__));
@ -330,7 +330,7 @@ GetImageVersionInPeCoffImage (
PeCoffLoaderImageContext->PeCoffHeaderOffset PeCoffLoaderImageContext->PeCoffHeaderOffset
); );
// //
// Check the PE/COFF Header Signature. Determine if the image is valid and/or a TE image. // Check the PE/COFF Header Signature. Determine if the image is valid image.
// //
if (OptionalHeaderPtrUnion.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) { if (OptionalHeaderPtrUnion.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {
DEBUG ((DEBUG_ERROR, "%a %a: The PE signature is not valid for the current image.\n", _DBGMSGID_, __func__)); DEBUG ((DEBUG_ERROR, "%a %a: The PE signature is not valid for the current image.\n", _DBGMSGID_, __func__));

View File

@ -64,15 +64,12 @@ LocateStandaloneMmCoreUefiImage (
Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, UefiImage, UefiImageSize); Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, UefiImage, UefiImageSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, UefiImage, UefiImageSize); DEBUG ((
if (EFI_ERROR (Status)) { DEBUG_ERROR,
DEBUG (( "Unable to locate Standalone MM Section data - %r\n",
DEBUG_ERROR, Status
"Unable to locate Standalone MM Section data - %r\n", ));
Status return Status;
));
return Status;
}
} }
DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", *UefiImage)); DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", *UefiImage));

View File

@ -109,7 +109,6 @@ secCoreEntryPointWasFound:
OneTimeCallRet Flat32SearchForSecEntryPoint OneTimeCallRet Flat32SearchForSecEntryPoint
%define EFI_SECTION_PE32 0x10 %define EFI_SECTION_PE32 0x10
%define EFI_SECTION_TE 0x12
; ;
; Input: ; Input:
@ -134,9 +133,6 @@ getEntryPointOfFfsFileLoopForSections:
cmp byte [eax + 3], EFI_SECTION_PE32 cmp byte [eax + 3], EFI_SECTION_PE32
je getEntryPointOfFfsFileFoundPe32Section je getEntryPointOfFfsFileFoundPe32Section
cmp byte [eax + 3], EFI_SECTION_TE
je getEntryPointOfFfsFileFoundTeSection
; ;
; The section type was not PE32 or TE, so move to next section ; The section type was not PE32 or TE, so move to next section
; ;
@ -170,22 +166,6 @@ getEntryPointOfFfsFileFoundPe32Section:
add eax, [ebx + 0x4 + 0x14 + 0x10] add eax, [ebx + 0x4 + 0x14 + 0x10]
jmp getEntryPointOfFfsFileReturn jmp getEntryPointOfFfsFileReturn
getEntryPointOfFfsFileFoundTeSection:
add eax, 4 ; EAX = Start of TE image
mov ebx, eax
; if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE)
cmp word [ebx], 'VZ'
jne getEntryPointOfFfsFileErrorReturn
; *EntryPoint = (VOID *)((UINTN)Pe32Data +
; (UINTN)(Hdr.Te->AddressOfEntryPoint & 0x0ffffffff) +
; sizeof(EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize);
add eax, [ebx + 0x8]
add eax, 0x28
movzx ebx, word [ebx + 0x6]
sub eax, ebx
jmp getEntryPointOfFfsFileReturn
getEntryPointOfFfsFileErrorReturn: getEntryPointOfFfsFileErrorReturn:
mov eax, 0 mov eax, 0

View File

@ -107,7 +107,7 @@ FindImageBase (
// //
// Look for executable sections // Look for executable sections
// //
if ((Section->Type == EFI_SECTION_PE32) || (Section->Type == EFI_SECTION_TE)) { if (Section->Type == EFI_SECTION_PE32) {
if (File->Type == FileType) { if (File->Type == FileType) {
if (IS_SECTION2 (Section)) { if (IS_SECTION2 (Section)) {
*CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2)); *CoreImageBase = (PHYSICAL_ADDRESS)(UINTN)((UINT8 *)Section + sizeof (EFI_COMMON_SECTION_HEADER2));