4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Search for the Boot Firmware Volume (BFV) base address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;#define EFI_FIRMWARE_FILE_SYSTEM2_GUID \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; { 0x8c8ce578, 0x8a3d, 0x4f1c, { 0x99, 0x35, 0x89, 0x61, 0x85, 0xc3, 0x2d, 0xd3 } }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define FFS_GUID_DWORD0 0x8c8ce578
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define FFS_GUID_DWORD1 0x4f1c8a3d
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define FFS_GUID_DWORD2 0x61893599
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync%define FFS_GUID_DWORD3 0xd32dc385
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBITS 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Modified: EAX, EBX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; Preserved: EDI, ESP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync; @param[out] EBP Address of Boot Firmware Volume (BFV)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFlat32SearchForBfvBase:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync xor eax, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsearchingForBfvHeaderLoop:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; We check for a firmware volume at every 4KB address in the top 16MB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; just below 4GB. (Addresses at 0xffHHH000 where H is any hex digit.)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sub eax, 0x1000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp eax, 0xff000000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jb searchedForBfvHeaderButNotFound
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Check FFS GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp dword [eax + 0x10], FFS_GUID_DWORD0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jne searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp dword [eax + 0x14], FFS_GUID_DWORD1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jne searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp dword [eax + 0x18], FFS_GUID_DWORD2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jne searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp dword [eax + 0x1c], FFS_GUID_DWORD3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jne searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Check FV Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp dword [eax + 0x24], 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jne searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ebx, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add ebx, dword [eax + 0x20]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jnz searchingForBfvHeaderLoop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jmp searchedForBfvHeaderAndItWasFound
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsearchedForBfvHeaderButNotFound:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Hang if the SEC entry point was not found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync debugShowPostCode POSTCODE_BFV_NOT_FOUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; 0xbfbfbfbf in the EAX & EBP registers helps signal what failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; for debugging purposes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov eax, 0xBFBFBFBF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ebp, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync jmp $
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsearchedForBfvHeaderAndItWasFound:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ebp, eax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync debugShowPostCode POSTCODE_BFV_FOUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneTimeCallRet Flat32SearchForBfvBase
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync