]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFsp2Pkg/Library/SecFspSecPlatformLibNull/Ia32/Flat32.nasm
0d75aae071bb140e843e00faf9650eb504e204f7
[mirror_edk2.git] / IntelFsp2Pkg / Library / SecFspSecPlatformLibNull / Ia32 / Flat32.nasm
1 ;; @file
2 ; This is the code that goes from real-mode to protected mode.
3 ; It consumes the reset vector, configures the stack.
4 ;
5 ; Copyright (c) 2015 - 2018, 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 ; Define assembler characteristics
17 ;
18
19 extern ASM_PFX(TempRamInitApi)
20
21 SECTION .text
22
23 %macro RET_ESI 0
24
25 movd esi, mm7 ; restore ESP from MM7
26 jmp esi
27
28 %endmacro
29
30 ;
31 ; Perform early platform initialization
32 ;
33 global ASM_PFX(SecPlatformInit)
34 ASM_PFX(SecPlatformInit):
35
36 RET_ESI
37
38 ;
39 ; Protected mode portion initializes stack, configures cache, and calls C entry point
40 ;
41
42 ;----------------------------------------------------------------------------
43 ;
44 ; Procedure: ProtectedModeEntryPoint
45 ;
46 ; Input: Executing in 32 Bit Protected (flat) mode
47 ; cs: 0-4GB
48 ; ds: 0-4GB
49 ; es: 0-4GB
50 ; fs: 0-4GB
51 ; gs: 0-4GB
52 ; ss: 0-4GB
53 ;
54 ; Output: This function never returns
55 ;
56 ; Destroys:
57 ; ecx
58 ; edi
59 ; esi
60 ; esp
61 ;
62 ; Description:
63 ; Perform any essential early platform initilaisation
64 ; Setup a stack
65 ;
66 ;----------------------------------------------------------------------------
67 global ASM_PFX(ProtectedModeEntryPoint)
68 ASM_PFX(ProtectedModeEntryPoint):
69 ;
70 ; Dummy function. Consume 2 API to make sure they can be linked.
71 ;
72 mov eax, ASM_PFX(TempRamInitApi)
73
74 ; Should never return
75 jmp $
76
77 ;
78 ; ROM-based Global-Descriptor Table for the PEI Phase
79 ;
80 align 16
81 global ASM_PFX(BootGdtTable)
82
83 ;
84 ; GDT[0]: 0x00: Null entry, never used.
85 ;
86 NULL_SEL equ $ - GDT_BASE ; Selector [0]
87 GDT_BASE:
88 ASM_PFX(BootGdtTable): DD 0
89 DD 0
90 ;
91 ; Linear code segment descriptor
92 ;
93 LINEAR_CODE_SEL equ $ - GDT_BASE ; Selector [0x8]
94 DW 0FFFFh ; limit 0xFFFF
95 DW 0 ; base 0
96 DB 0
97 DB 09Bh ; present, ring 0, data, expand-up, not-writable
98 DB 0CFh ; page-granular, 32-bit
99 DB 0
100 ;
101 ; System data segment descriptor
102 ;
103 SYS_DATA_SEL equ $ - GDT_BASE ; Selector [0x10]
104 DW 0FFFFh ; limit 0xFFFF
105 DW 0 ; base 0
106 DB 0
107 DB 093h ; present, ring 0, data, expand-up, not-writable
108 DB 0CFh ; page-granular, 32-bit
109 DB 0
110
111 GDT_SIZE EQU $ - GDT_BASE ; Size, in bytes
112
113 ;
114 ; GDT Descriptor
115 ;
116 GdtDesc: ; GDT descriptor
117 DW GDT_SIZE - 1 ; GDT limit
118 DD GDT_BASE ; GDT base address
119
120 global ASM_PFX(ProtectedModeEntryLinearAddress)
121 global ASM_PFX(ProtectedModeEntryLinearOffset)
122
123 ASM_PFX(ProtectedModeEntryLinearAddress):
124 ASM_PFX(ProtectedModeEntryLinearOffset):
125 DD ASM_PFX(ProtectedModeEntryPoint) ; Offset of our 32 bit code
126 DW LINEAR_CODE_SEL
127