1;------------------------------------------------------------------------------
2; @file
3; Main routine of the pre-SEC code up through the jump into SEC
4;
5; Copyright (c) 2008 - 2009, Intel Corporation. All rights reserved.<BR>
6; This program and the accompanying materials
7; are licensed and made available under the terms and conditions of the BSD License
8; which accompanies this distribution.  The full text of the license may be found at
9; http://opensource.org/licenses/bsd-license.php
10;
11; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13;
14;------------------------------------------------------------------------------
15
16
17BITS    16
18
19;
20; Modified:  EBX, ECX, EDX, EBP
21;
22; @param[in,out]  RAX/EAX  Initial value of the EAX register
23;                          (BIST: Built-in Self Test)
24; @param[in,out]  DI       'BP': boot-strap processor, or
25;                          'AP': application processor
26; @param[out]     RBP/EBP  Address of Boot Firmware Volume (BFV)
27;
28; @return         None  This routine jumps to SEC and does not return
29;
30Main16:
31    OneTimeCall EarlyInit16
32
33    ;
34    ; Transition the processor from 16-bit real mode to 32-bit flat mode
35    ;
36    OneTimeCall TransitionFromReal16To32BitFlat
37
38BITS    32
39
40    ;
41    ; Search for the Boot Firmware Volume (BFV)
42    ;
43    OneTimeCall Flat32SearchForBfvBase
44
45    ;
46    ; EBP - Start of BFV
47    ;
48
49    ;
50    ; Search for the SEC entry point
51    ;
52    OneTimeCall Flat32SearchForSecEntryPoint
53
54    ;
55    ; ESI - SEC Core entry point
56    ; EBP - Start of BFV
57    ;
58
59%ifdef ARCH_IA32
60
61    ;
62    ; Restore initial EAX value into the EAX register
63    ;
64    mov     eax, esp
65
66    ;
67    ; Jump to the 32-bit SEC entry point
68    ;
69    jmp     esi
70
71%else
72
73    ;
74    ; Transition the processor from 32-bit flat mode to 64-bit flat mode
75    ;
76    OneTimeCall Transition32FlatTo64Flat
77
78BITS    64
79
80    ;
81    ; Some values were calculated in 32-bit mode.  Make sure the upper
82    ; 32-bits of 64-bit registers are zero for these values.
83    ;
84    mov     rax, 0x00000000ffffffff
85    and     rsi, rax
86    and     rbp, rax
87    and     rsp, rax
88
89    ;
90    ; RSI - SEC Core entry point
91    ; RBP - Start of BFV
92    ;
93
94    ;
95    ; Restore initial EAX value into the RAX register
96    ;
97    mov     rax, rsp
98
99    ;
100    ; Jump to the 64-bit SEC entry point
101    ;
102    jmp     rsi
103
104%endif
105
106
107