2 Initialize GDT for Linux.
4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "LoadLinuxLib.h"
13 // Local structure definitions
19 // Global Descriptor Entry structures
22 typedef struct _GDT_ENTRY
{
27 UINT8 Limit19_16_and_flags
;
37 GDT_ENTRY TaskSegment
;
44 STATIC GDT_ENTRIES
*mGdt
= NULL
;
47 // Global descriptor table (GDT) Template
49 STATIC GDT_ENTRIES GdtTemplate
= {
58 0x0, // limit 19:16, flags
69 0x0, // limit 19:16, flags
76 0x0FFFF, // limit 0xFFFFF
79 0x09A, // present, ring 0, data, expand-up, writable
80 0x0CF, // page-granular, 32-bit
87 0x0FFFF, // limit 0xFFFFF
90 0x092, // present, ring 0, data, expand-up, writable
91 0x0CF, // page-granular, 32-bit
112 0x0, // present, ring 0, data, expand-up, writable
113 0x0, // page-granular, 32-bit
123 0x0, // present, ring 0, data, expand-up, writable
124 0x0, // page-granular, 32-bit
130 Initialize Global Descriptor Table.
134 InitLinuxDescriptorTables (
139 // Allocate Runtime Data for the GDT
141 mGdt
= AllocateRuntimePool (sizeof (GdtTemplate
) + 8);
142 ASSERT (mGdt
!= NULL
);
143 mGdt
= ALIGN_POINTER (mGdt
, 8);
146 // Initialize all GDT entries
148 CopyMem (mGdt
, &GdtTemplate
, sizeof (GdtTemplate
));
153 Initialize Global Descriptor Table.
157 SetLinuxDescriptorTables (
161 IA32_DESCRIPTOR GdtPtr
;
162 IA32_DESCRIPTOR IdtPtr
;
165 // Write GDT register
167 GdtPtr
.Base
= (UINT32
)(UINTN
)(VOID
*) mGdt
;
168 GdtPtr
.Limit
= (UINT16
) (sizeof (GdtTemplate
) - 1);
169 AsmWriteGdtr (&GdtPtr
);
171 IdtPtr
.Base
= (UINT32
) 0;
172 IdtPtr
.Limit
= (UINT16
) 0;
173 AsmWriteIdtr (&IdtPtr
);