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