Adding files from OvmfPkg to common location. This is so multiple packages can use pre-built reset vector code.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9911 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
geekboy15a
2010-02-02 17:56:00 +00:00
parent 0bf47d3ddf
commit bc252e8ea4
23 changed files with 1206 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
;------------------------------------------------------------------------------
; @file
; Transition from 32 bit flat protected mode into 64 bit flat protected mode
;
; Copyright (c) 2008 - 2009, 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.
;
;------------------------------------------------------------------------------
BITS 32
;
; Modified: EAX
;
Transition32FlatTo64Flat:
mov eax, ((ADDR_OF_START_OF_RESET_CODE & ~0xfff) - 0x1000)
mov cr3, eax
mov eax, cr4
bts eax, 5 ; enable PAE
mov cr4, eax
mov ecx, 0xc0000080
rdmsr
bts eax, 8 ; set LME
wrmsr
mov eax, cr0
bts eax, 31 ; set PG
mov cr0, eax ; enable paging
jmp LINEAR_CODE64_SEL:ADDR_OF(jumpTo64BitAndLandHere)
BITS 64
jumpTo64BitAndLandHere:
debugShowPostCode POSTCODE_64BIT_MODE
OneTimeCallRet Transition32FlatTo64Flat

View File

@@ -0,0 +1,86 @@
;------------------------------------------------------------------------------
; @file
; Search for the Boot Firmware Volume (BFV) base address
;
; Copyright (c) 2008 - 2009, 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.
;
;------------------------------------------------------------------------------
;#define EFI_FIRMWARE_FILE_SYSTEM2_GUID \
; { 0x8c8ce578, 0x8a3d, 0x4f1c, { 0x99, 0x35, 0x89, 0x61, 0x85, 0xc3, 0x2d, 0xd3 } }
%define FFS_GUID_DWORD0 0x8c8ce578
%define FFS_GUID_DWORD1 0x4f1c8a3d
%define FFS_GUID_DWORD2 0x61893599
%define FFS_GUID_DWORD3 0xd32dc385
BITS 32
;
; Modified: EAX, EBX
; Preserved: EDI, ESP
;
; @param[out] EBP Address of Boot Firmware Volume (BFV)
;
Flat32SearchForBfvBase:
xor eax, eax
searchingForBfvHeaderLoop:
;
; We check for a firmware volume at every 4KB address in the top 16MB
; just below 4GB. (Addresses at 0xffHHH000 where H is any hex digit.)
;
sub eax, 0x1000
cmp eax, 0xff000000
jb searchedForBfvHeaderButNotFound
;
; Check FFS GUID
;
cmp dword [eax + 0x10], FFS_GUID_DWORD0
jne searchingForBfvHeaderLoop
cmp dword [eax + 0x14], FFS_GUID_DWORD1
jne searchingForBfvHeaderLoop
cmp dword [eax + 0x18], FFS_GUID_DWORD2
jne searchingForBfvHeaderLoop
cmp dword [eax + 0x1c], FFS_GUID_DWORD3
jne searchingForBfvHeaderLoop
;
; Check FV Length
;
cmp dword [eax + 0x24], 0
jne searchingForBfvHeaderLoop
mov ebx, eax
add ebx, dword [eax + 0x20]
jnz searchingForBfvHeaderLoop
jmp searchedForBfvHeaderAndItWasFound
searchedForBfvHeaderButNotFound:
;
; Hang if the SEC entry point was not found
;
debugShowPostCode POSTCODE_BFV_NOT_FOUND
;
; 0xbfbfbfbf in the EAX & EBP registers helps signal what failed
; for debugging purposes.
;
mov eax, 0xBFBFBFBF
mov ebp, eax
jmp $
searchedForBfvHeaderAndItWasFound:
mov ebp, eax
debugShowPostCode POSTCODE_BFV_FOUND
OneTimeCallRet Flat32SearchForBfvBase

View File

@@ -0,0 +1,196 @@
;------------------------------------------------------------------------------
; @file
; Search for the SEC Core entry point
;
; Copyright (c) 2008 - 2009, 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.
;
;------------------------------------------------------------------------------
BITS 32
%define EFI_FV_FILETYPE_SECURITY_CORE 0x03
;
; Modified: EAX, EBX, ECX, EDX
; Preserved: EDI, EBP, ESP
;
; @param[in] EBP Address of Boot Firmware Volume (BFV)
; @param[out] ESI SEC Core Entry Point Address
;
Flat32SearchForSecEntryPoint:
;
; Initialize EBP and ESI to 0
;
xor ebx, ebx
mov esi, ebx
;
; Pass over the BFV header
;
mov eax, ebp
mov bx, [ebp + 0x30]
add eax, ebx
jc secEntryPointWasNotFound
jmp searchingForFfsFileHeaderLoop
moveForwardWhileSearchingForFfsFileHeaderLoop:
;
; Make forward progress in the search
;
inc eax
jc secEntryPointWasNotFound
searchingForFfsFileHeaderLoop:
test eax, eax
jz secEntryPointWasNotFound
;
; Ensure 8 byte alignment
;
add eax, 7
jc secEntryPointWasNotFound
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
add ecx, eax
jz jumpSinceWeFoundTheLastFfsFile
jc moveForwardWhileSearchingForFfsFileHeaderLoop
jumpSinceWeFoundTheLastFfsFile:
;
; There seems to be a valid file at eax
;
cmp byte [eax + 0x12], EFI_FV_FILETYPE_SECURITY_CORE ; Check File Type
jne readyToTryFfsFileAtEcx
fileTypeIsSecCore:
OneTimeCall GetEntryPointOfFfsFile
test eax, eax
jnz doneSeachingForSecEntryPoint
readyToTryFfsFileAtEcx:
;
; Try the next FFS file at ECX
;
mov eax, ecx
jmp searchingForFfsFileHeaderLoop
secEntryPointWasNotFound:
xor eax, eax
doneSeachingForSecEntryPoint:
mov esi, eax
test esi, esi
jnz secCoreEntryPointWasFound
secCoreEntryPointWasNotFound:
;
; Hang if the SEC entry point was not found
;
debugShowPostCode POSTCODE_SEC_NOT_FOUND
jz $
secCoreEntryPointWasFound:
debugShowPostCode POSTCODE_SEC_FOUND
OneTimeCallRet Flat32SearchForSecEntryPoint
%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
;
GetEntryPointOfFfsFile:
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:
OneTimeCallRet GetEntryPointOfFfsFile