2 C based implementation of IA32 interrupt handling only
3 requiring a minimal assembly interrupt entry point.
5 Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
14 // Global descriptor table (GDT) Template
16 STATIC GDT_ENTRIES mGdtTemplate
= {
25 0x0, // limit 19:16, flags
32 0x0FFFF, // limit 15:0
35 0x092, // present, ring 0, data, read/write
36 0x0CF, // page-granular, 32-bit
43 0x0FFFF, // limit 15:0
46 0x09F, // present, ring 0, code, execute/read, conforming, accessed
47 0x0CF, // page-granular, 32-bit
54 0x0FFFF, // limit 15:0
57 0x093, // present, ring 0, data, read/write, accessed
58 0x0CF, // page-granular, 32-bit
65 0x0FFFF, // limit 15:0
68 0x09A, // present, ring 0, code, execute/read
69 0x0CF, // page-granular, 32-bit
76 0x0FFFF, // limit 15:0
79 0x09A, // present, ring 0, code, execute/read
80 0x08F, // page-granular, 16-bit
87 0x0FFFF, // limit 15:0
90 0x092, // present, ring 0, data, read/write
91 0x0CF, // page-granular, 32-bit
98 0x0FFFF, // limit 15:0
101 0x09A, // present, ring 0, code, execute/read
102 0x0AF, // page-granular, 64-bit code
113 0x0, // limit 19:16, flags
119 Initialize Global Descriptor Table.
123 InitGlobalDescriptorTable (
129 IA32_DESCRIPTOR Gdtr
;
130 EFI_PHYSICAL_ADDRESS Memory
;
133 // Allocate Runtime Data below 4GB for the GDT
134 // AP uses the same GDT when it's waken up from real mode so
135 // the GDT needs to be below 4GB.
137 Memory
= SIZE_4GB
- 1;
138 Status
= gBS
->AllocatePages (
140 EfiRuntimeServicesData
,
141 EFI_SIZE_TO_PAGES (sizeof (mGdtTemplate
)),
144 ASSERT_EFI_ERROR (Status
);
145 ASSERT ((Memory
!= 0) && (Memory
< SIZE_4GB
));
146 Gdt
= (GDT_ENTRIES
*)(UINTN
)Memory
;
149 // Initialize all GDT entries
151 CopyMem (Gdt
, &mGdtTemplate
, sizeof (mGdtTemplate
));
154 // Write GDT register
156 Gdtr
.Base
= (UINT32
)(UINTN
)Gdt
;
157 Gdtr
.Limit
= (UINT16
)(sizeof (mGdtTemplate
) - 1);
158 AsmWriteGdtr (&Gdtr
);
161 // Update selector (segment) registers base on new GDT
163 SetCodeSelector ((UINT16
)CPU_CODE_SEL
);
164 SetDataSelectors ((UINT16
)CPU_DATA_SEL
);