]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c
OvmfPkg/ResetSystemLib: rename to BaseResetSystemLib
[mirror_edk2.git] / OvmfPkg / Library / LoadLinuxLib / LinuxGdt.c
1 /** @file
2 Initialize GDT for Linux.
3
4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include "LoadLinuxLib.h"
10
11
12 //
13 // Local structure definitions
14 //
15
16 #pragma pack (1)
17
18 //
19 // Global Descriptor Entry structures
20 //
21
22 typedef struct _GDT_ENTRY {
23 UINT16 Limit15_0;
24 UINT16 Base15_0;
25 UINT8 Base23_16;
26 UINT8 Type;
27 UINT8 Limit19_16_and_flags;
28 UINT8 Base31_24;
29 } GDT_ENTRY;
30
31 typedef
32 struct _GDT_ENTRIES {
33 GDT_ENTRY Null;
34 GDT_ENTRY Null2;
35 GDT_ENTRY Linear;
36 GDT_ENTRY LinearCode;
37 GDT_ENTRY TaskSegment;
38 GDT_ENTRY Spare4;
39 GDT_ENTRY Spare5;
40 } GDT_ENTRIES;
41
42 #pragma pack ()
43
44 STATIC GDT_ENTRIES *mGdt = NULL;
45
46 //
47 // Global descriptor table (GDT) Template
48 //
49 STATIC GDT_ENTRIES GdtTemplate = {
50 //
51 // Null
52 //
53 {
54 0x0, // limit 15:0
55 0x0, // base 15:0
56 0x0, // base 23:16
57 0x0, // type
58 0x0, // limit 19:16, flags
59 0x0, // base 31:24
60 },
61 //
62 // Null2
63 //
64 {
65 0x0, // limit 15:0
66 0x0, // base 15:0
67 0x0, // base 23:16
68 0x0, // type
69 0x0, // limit 19:16, flags
70 0x0, // base 31:24
71 },
72 //
73 // Linear
74 //
75 {
76 0x0FFFF, // limit 0xFFFFF
77 0x0, // base 0
78 0x0,
79 0x09A, // present, ring 0, data, expand-up, writable
80 0x0CF, // page-granular, 32-bit
81 0x0,
82 },
83 //
84 // LinearCode
85 //
86 {
87 0x0FFFF, // limit 0xFFFFF
88 0x0, // base 0
89 0x0,
90 0x092, // present, ring 0, data, expand-up, writable
91 0x0CF, // page-granular, 32-bit
92 0x0,
93 },
94 //
95 // TaskSegment
96 //
97 {
98 0x0, // limit 0
99 0x0, // base 0
100 0x0,
101 0x089, // ?
102 0x080, // ?
103 0x0,
104 },
105 //
106 // Spare4
107 //
108 {
109 0x0, // limit 0
110 0x0, // base 0
111 0x0,
112 0x0, // present, ring 0, data, expand-up, writable
113 0x0, // page-granular, 32-bit
114 0x0,
115 },
116 //
117 // Spare5
118 //
119 {
120 0x0, // limit 0
121 0x0, // base 0
122 0x0,
123 0x0, // present, ring 0, data, expand-up, writable
124 0x0, // page-granular, 32-bit
125 0x0,
126 },
127 };
128
129 /**
130 Initialize Global Descriptor Table.
131
132 **/
133 VOID
134 InitLinuxDescriptorTables (
135 VOID
136 )
137 {
138 //
139 // Allocate Runtime Data for the GDT
140 //
141 mGdt = AllocateRuntimePool (sizeof (GdtTemplate) + 8);
142 ASSERT (mGdt != NULL);
143 mGdt = ALIGN_POINTER (mGdt, 8);
144
145 //
146 // Initialize all GDT entries
147 //
148 CopyMem (mGdt, &GdtTemplate, sizeof (GdtTemplate));
149
150 }
151
152 /**
153 Initialize Global Descriptor Table.
154
155 **/
156 VOID
157 SetLinuxDescriptorTables (
158 VOID
159 )
160 {
161 IA32_DESCRIPTOR GdtPtr;
162 IA32_DESCRIPTOR IdtPtr;
163
164 //
165 // Write GDT register
166 //
167 GdtPtr.Base = (UINT32)(UINTN)(VOID*) mGdt;
168 GdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);
169 AsmWriteGdtr (&GdtPtr);
170
171 IdtPtr.Base = (UINT32) 0;
172 IdtPtr.Limit = (UINT16) 0;
173 AsmWriteIdtr (&IdtPtr);
174 }
175