]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFspPkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.s
Update IntelFspPkg to support FSP1.1
[mirror_edk2.git] / IntelFspPkg / Library / SecFspSecPlatformLibNull / Ia32 / Flat32.s
1 #------------------------------------------------------------------------------
2 #
3 # Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
4 # This program and the accompanying materials
5 # are licensed and made available under the terms and conditions of the BSD License
6 # which accompanies this distribution. The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php.
8 #
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 #
12 # Abstract:
13 #
14 # This is the code that goes from real-mode to protected mode.
15 # It consumes the reset vector, configures the stack.
16 #
17 #------------------------------------------------------------------------------
18
19
20 #
21 # Contrary to the name, this file contains 16 bit code as well.
22 #
23 .text
24 #----------------------------------------------------------------------------
25 #
26 # Procedure: _ModuleEntryPoint
27 #
28 # Input: None
29 #
30 # Output: None
31 #
32 # Destroys: Assume all registers
33 #
34 # Description:
35 #
36 # Transition to non-paged flat-model protected mode from a
37 # hard-coded GDT that provides exactly two descriptors.
38 # This is a bare bones transition to protected mode only
39 # used for a while in PEI and possibly DXE.
40 #
41 # After enabling protected mode, a far jump is executed to
42 # transfer to PEI using the newly loaded GDT.
43 #
44 # Return: None
45 #
46 #----------------------------------------------------------------------------
47 ASM_GLOBAL ASM_PFX(_ModuleEntryPoint)
48 ASM_PFX(_ModuleEntryPoint):
49
50 #
51 # Load the GDT table in GdtDesc
52 #
53 .byte 0x66,0xbe #movl $GdtDesc, %esi
54 .long GdtDesc
55
56 .byte 0x66,0x2e,0x0f,0x01,0x14 #lgdt %cs:(%si)
57
58 #
59 # Transition to 16 bit protected mode
60 #
61 .byte 0x0f,0x20,0xc0 #movl %cr0, %eax # Get control register 0
62 .byte 0x66,0x83,0xc8,0x03 #orl $0x0000003, %eax # Set PE bit (bit #0) & MP bit (bit #1)
63 .byte 0x0f,0x22,0xc0 #movl %eax, %cr0 # Activate protected mode
64
65 #
66 # Now we're in 16 bit protected mode
67 # Set up the selectors for 32 bit protected mode entry
68 #
69 .byte 0xb8 #movw SYS_DATA_SEL, %ax
70 .word SYS_DATA_SEL
71
72 .byte 0x8e,0xd8 #movw %ax, %ds
73 .byte 0x8e,0xc0 #movw %ax, %es
74 .byte 0x8e,0xe0 #movw %ax, %fs
75 .byte 0x8e,0xe8 #movw %ax, %gs
76 .byte 0x8e,0xd0 #movw %ax, %ss
77
78 #
79 # Transition to Flat 32 bit protected mode
80 # The jump to a far pointer causes the transition to 32 bit mode
81 #
82 .byte 0x66,0xbe #movl ProtectedModeEntryLinearAddress, %esi
83 .long ProtectedModeEntryLinearAddress
84 .byte 0x66,0x2e,0xff,0x2c #jmp %cs:(%esi)
85
86 #
87 # Protected mode portion initializes stack, configures cache, and calls C entry point
88 #
89
90 #----------------------------------------------------------------------------
91 #
92 # Procedure: ProtectedModeEntryPoint
93 #
94 # Input: Executing in 32 Bit Protected (flat) mode
95 # cs: 0-4GB
96 # ds: 0-4GB
97 # es: 0-4GB
98 # fs: 0-4GB
99 # gs: 0-4GB
100 # ss: 0-4GB
101 #
102 # Output: This function never returns
103 #
104 # Destroys:
105 # ecx
106 # edi
107 # esi
108 # esp
109 #
110 # Description:
111 # Perform any essential early platform initilaisation
112 # Setup a stack
113 #
114 #----------------------------------------------------------------------------
115 ProtectedModeEntryPoint:
116 #
117 # Dummy function. Consume 2 API to make sure they can be linked.
118 #
119 movl ASM_PFX(TempRamInitApi), %eax
120 movl ASM_PFX(FspInitApi), %eax
121 #
122 # Should never return
123 #
124 jmp . #'$'
125
126 #
127 # ROM-based Global-Descriptor Table for the PEI Phase
128 #
129 .align 16
130 #
131 # GDT[0]: 000h: Null entry, never used.
132 #
133 .equ NULL_SEL, . - GDT_BASE # Selector [0]
134 GDT_BASE:
135 BootGdtTable:
136 .long 0
137 .long 0
138 #
139 # Linear code segment descriptor
140 #
141 .equ LINEAR_CODE_SEL, . - GDT_BASE # Selector [08h]
142 .word 0xFFFF # limit 0FFFFh
143 .word 0 # base 0
144 .byte 0
145 .byte 0x9B # present, ring 0, data, expand-up, not-writable
146 .byte 0xCF # page-granular, 32-bit
147 .byte 0
148 #
149 # System data segment descriptor
150 #
151 .equ SYS_DATA_SEL, . - GDT_BASE # Selector [010h]
152 .word 0xFFFF # limit 0FFFFh
153 .word 0 # base 0
154 .byte 0
155 .byte 0x93 # present, ring 0, data, expand-up, not-writable
156 .byte 0xCF # page-granular, 32-bit
157 .byte 0
158
159 .equ GDT_SIZE, . - BootGdtTable # Size, in bytes
160
161 #
162 # GDT Descriptor
163 #
164 GdtDesc: # GDT descriptor
165 .word GDT_SIZE - 1
166 .long BootGdtTable
167
168 ProtectedModeEntryLinearAddress:
169 ProtectedModeEntryLinearOffset:
170 .long ProtectedModeEntryPoint
171 .word LINEAR_CODE_SEL