audk/OvmfPkg/ResetVector/Ia32/SearchForSecAndPeiEntries.asm

223 lines
5.7 KiB
NASM
Raw Normal View History

;------------------------------------------------------------------------------
;
; 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