mirror of https://github.com/acidanthera/audk.git
223 lines
5.7 KiB
NASM
223 lines
5.7 KiB
NASM
;------------------------------------------------------------------------------
|
|
;
|
|
; Copyright (c) 2008, Intel Corporation
|
|
; All rights reserved. This program and the accompanying materials
|
|
; are licensed and made available under the terms and conditions of the BSD License
|
|
; which accompanies this distribution. The full text of the license may be found at
|
|
; http://opensource.org/licenses/bsd-license.php
|
|
;
|
|
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
;
|
|
; Module Name:
|
|
;
|
|
; SearchForSecAndPeiEntry.asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; Search for the SEC Core and PEI Core entry points
|
|
;
|
|
;------------------------------------------------------------------------------
|
|
|
|
BITS 32
|
|
|
|
%define EFI_FV_FILETYPE_SECURITY_CORE 0x03
|
|
%define EFI_FV_FILETYPE_PEI_CORE 0x04
|
|
|
|
;
|
|
; Input:
|
|
; EBP - BFV Base Address
|
|
;
|
|
; Output:
|
|
; ESI - SEC Core Entry Point Address (or 0 if not found)
|
|
; EDI - PEI Core Entry Point Address (or 0 if not found)
|
|
;
|
|
; Modified:
|
|
; EAX, EBX, ECX
|
|
;
|
|
Flat32SearchForSecAndPeiEntries:
|
|
|
|
;
|
|
; Initialize EBP and ESI to 0
|
|
;
|
|
xor ebx, ebx
|
|
mov esi, ebx
|
|
mov edi, ebx
|
|
|
|
;
|
|
; Pass over the BFV header
|
|
;
|
|
mov eax, ebp
|
|
mov bx, [ebp + 0x30]
|
|
add eax, ebx
|
|
jc doneSeachingForSecAndPeiEntries
|
|
|
|
jmp searchingForFfsFileHeaderLoop
|
|
|
|
moveForwardWhileSearchingForFfsFileHeaderLoop:
|
|
;
|
|
; Make forward progress in the search
|
|
;
|
|
inc eax
|
|
jc doneSeachingForSecAndPeiEntries
|
|
|
|
searchingForFfsFileHeaderLoop:
|
|
test eax, eax
|
|
jz doneSeachingForSecAndPeiEntries
|
|
|
|
;
|
|
; Ensure 8 byte alignment
|
|
;
|
|
add eax, 7
|
|
jc doneSeachingForSecAndPeiEntries
|
|
and al, 0xf8
|
|
|
|
;
|
|
; Look to see if there is an FFS file at eax
|
|
;
|
|
mov bl, [eax + 0x17]
|
|
test bl, 0x20
|
|
jz moveForwardWhileSearchingForFfsFileHeaderLoop
|
|
mov ecx, [eax + 0x14]
|
|
and ecx, 0x00ffffff
|
|
or ecx, ecx
|
|
jz moveForwardWhileSearchingForFfsFileHeaderLoop
|
|
; jmp $
|
|
add ecx, eax
|
|
jz jumpSinceWeFoundTheLastFfsFile
|
|
jc moveForwardWhileSearchingForFfsFileHeaderLoop
|
|
jumpSinceWeFoundTheLastFfsFile:
|
|
|
|
;
|
|
; There seems to be a valid file at eax
|
|
;
|
|
mov bl, [eax + 0x12] ; BL - File Type
|
|
cmp bl, EFI_FV_FILETYPE_PEI_CORE
|
|
je fileTypeIsPeiCore
|
|
cmp bl, EFI_FV_FILETYPE_SECURITY_CORE
|
|
jne readyToTryFfsFileAtEcx
|
|
|
|
fileTypeIsSecCore:
|
|
callEdx GetEntryPointOfFfsFileReturnEdx
|
|
test eax, eax
|
|
jz readyToTryFfsFileAtEcx
|
|
|
|
mov esi, eax
|
|
jmp readyToTryFfsFileAtEcx
|
|
|
|
fileTypeIsPeiCore:
|
|
callEdx GetEntryPointOfFfsFileReturnEdx
|
|
test eax, eax
|
|
jz readyToTryFfsFileAtEcx
|
|
|
|
mov edi, eax
|
|
|
|
readyToTryFfsFileAtEcx:
|
|
mov eax, ecx
|
|
jmp searchingForFfsFileHeaderLoop
|
|
|
|
doneSeachingForSecAndPeiEntries:
|
|
|
|
test esi, esi
|
|
jnz secCoreEntryPointWasFound
|
|
writeToSerialPort '!'
|
|
secCoreEntryPointWasFound:
|
|
writeToSerialPort 'S'
|
|
writeToSerialPort 'E'
|
|
writeToSerialPort 'C'
|
|
writeToSerialPort ' '
|
|
|
|
test edi, edi
|
|
jnz peiCoreEntryPointWasFound
|
|
writeToSerialPort '!'
|
|
peiCoreEntryPointWasFound:
|
|
writeToSerialPort 'P'
|
|
writeToSerialPort 'E'
|
|
writeToSerialPort 'I'
|
|
writeToSerialPort ' '
|
|
|
|
OneTimeCallRet Flat32SearchForSecAndPeiEntries
|
|
|
|
|
|
%define EFI_SECTION_PE32 0x10
|
|
|
|
;
|
|
; Input:
|
|
; EAX - Start of FFS file
|
|
; ECX - End of FFS file
|
|
;
|
|
; Output:
|
|
; EAX - Entry point of PE32 (or 0 if not found)
|
|
;
|
|
; Modified:
|
|
; EBX
|
|
;
|
|
GetEntryPointOfFfsFileReturnEdx:
|
|
test eax, eax
|
|
jz getEntryPointOfFfsFileErrorReturn
|
|
add eax, 0x18 ; EAX = Start of section
|
|
|
|
getEntryPointOfFfsFileLoopForSections:
|
|
cmp eax, ecx
|
|
jae getEntryPointOfFfsFileErrorReturn
|
|
|
|
cmp byte [eax + 3], EFI_SECTION_PE32
|
|
je getEntryPointOfFfsFileFoundPe32Section
|
|
|
|
;
|
|
; The section type was not PE32, so move to next section
|
|
;
|
|
mov ebx, dword [eax]
|
|
and ebx, 0x00ffffff
|
|
add eax, ebx
|
|
jc getEntryPointOfFfsFileErrorReturn
|
|
|
|
;
|
|
; Ensure that FFS section is 32-bit aligned
|
|
;
|
|
add eax, 3
|
|
jc getEntryPointOfFfsFileErrorReturn
|
|
and al, 0xfc
|
|
jmp getEntryPointOfFfsFileLoopForSections
|
|
|
|
getEntryPointOfFfsFileFoundPe32Section:
|
|
add eax, 4 ; EAX = Start of PE32 image
|
|
|
|
mov ebx, eax
|
|
cmp word [eax], 'MZ'
|
|
jne thereIsNotAnMzSignature
|
|
movzx ebx, word [eax + 0x3c]
|
|
add ebx, eax
|
|
thereIsNotAnMzSignature:
|
|
|
|
; if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE)
|
|
cmp word [ebx], 'VZ'
|
|
jne thereIsNoVzSignature
|
|
; *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
|
|
|
|
thereIsNoVzSignature:
|
|
|
|
; if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)
|
|
cmp dword [ebx], `PE\x00\x00`
|
|
jne getEntryPointOfFfsFileErrorReturn
|
|
|
|
; *EntryPoint = (VOID *)((UINTN)Pe32Data +
|
|
; (UINTN)(Hdr.Pe32->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));
|
|
add eax, [ebx + 0x4 + 0x14 + 0x10]
|
|
jmp getEntryPointOfFfsFileReturn
|
|
|
|
getEntryPointOfFfsFileErrorReturn:
|
|
mov eax, 0
|
|
|
|
getEntryPointOfFfsFileReturn:
|
|
jmp edx
|
|
|
|
|