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