mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-26 16:47:40 +01:00
107 lines
2.5 KiB
NASM
107 lines
2.5 KiB
NASM
|
;------------------------------------------------------------------------------
|
||
|
; @file
|
||
|
; Main routine of the pre-SEC code up through the jump into SEC
|
||
|
;
|
||
|
; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.<BR>
|
||
|
; 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 16
|
||
|
|
||
|
;
|
||
|
; Modified: EBX, ECX, EDX, EBP
|
||
|
;
|
||
|
; @param[in,out] RAX/EAX Initial value of the EAX register
|
||
|
; (BIST: Built-in Self Test)
|
||
|
; @param[in,out] DI 'BP': boot-strap processor, or
|
||
|
; 'AP': application processor
|
||
|
; @param[out] RBP/EBP Address of Boot Firmware Volume (BFV)
|
||
|
;
|
||
|
; @return None This routine jumps to SEC and does not return
|
||
|
;
|
||
|
Main16:
|
||
|
OneTimeCall EarlyInit16
|
||
|
|
||
|
;
|
||
|
; Transition the processor from 16-bit real mode to 32-bit flat mode
|
||
|
;
|
||
|
OneTimeCall TransitionFromReal16To32BitFlat
|
||
|
|
||
|
BITS 32
|
||
|
|
||
|
;
|
||
|
; Search for the Boot Firmware Volume (BFV)
|
||
|
;
|
||
|
OneTimeCall Flat32SearchForBfvBase
|
||
|
|
||
|
;
|
||
|
; EBP - Start of BFV
|
||
|
;
|
||
|
|
||
|
;
|
||
|
; Search for the SEC entry point
|
||
|
;
|
||
|
OneTimeCall Flat32SearchForSecEntryPoint
|
||
|
|
||
|
;
|
||
|
; ESI - SEC Core entry point
|
||
|
; EBP - Start of BFV
|
||
|
;
|
||
|
|
||
|
%ifdef ARCH_IA32
|
||
|
|
||
|
;
|
||
|
; Restore initial EAX value into the EAX register
|
||
|
;
|
||
|
mov eax, esp
|
||
|
|
||
|
;
|
||
|
; Jump to the 32-bit SEC entry point
|
||
|
;
|
||
|
jmp esi
|
||
|
|
||
|
%else
|
||
|
|
||
|
;
|
||
|
; Transition the processor from 32-bit flat mode to 64-bit flat mode
|
||
|
;
|
||
|
OneTimeCall Transition32FlatTo64Flat
|
||
|
|
||
|
BITS 64
|
||
|
|
||
|
;
|
||
|
; Some values were calculated in 32-bit mode. Make sure the upper
|
||
|
; 32-bits of 64-bit registers are zero for these values.
|
||
|
;
|
||
|
mov rax, 0x00000000ffffffff
|
||
|
and rsi, rax
|
||
|
and rbp, rax
|
||
|
and rsp, rax
|
||
|
|
||
|
;
|
||
|
; RSI - SEC Core entry point
|
||
|
; RBP - Start of BFV
|
||
|
;
|
||
|
|
||
|
;
|
||
|
; Restore initial EAX value into the RAX register
|
||
|
;
|
||
|
mov rax, rsp
|
||
|
|
||
|
;
|
||
|
; Jump to the 64-bit SEC entry point
|
||
|
;
|
||
|
jmp rsi
|
||
|
|
||
|
%endif
|
||
|
|
||
|
|