]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c
OvmfPkg/PlatformBootManagerLib: rejuvenate old-style function comments
[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
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "LoadLinuxLib.h"\r
16\r
17\r
18//\r
19// Local structure definitions\r
20//\r
21\r
22#pragma pack (1)\r
23\r
24//\r
25// Global Descriptor Entry structures\r
26//\r
27\r
28typedef struct _GDT_ENTRY {\r
29 UINT16 Limit15_0;\r
30 UINT16 Base15_0;\r
31 UINT8 Base23_16;\r
32 UINT8 Type;\r
33 UINT8 Limit19_16_and_flags;\r
34 UINT8 Base31_24;\r
35} GDT_ENTRY;\r
36\r
37typedef\r
38struct _GDT_ENTRIES {\r
39 GDT_ENTRY Null;\r
40 GDT_ENTRY Null2;\r
41 GDT_ENTRY Linear;\r
42 GDT_ENTRY LinearCode;\r
43 GDT_ENTRY TaskSegment;\r
44 GDT_ENTRY Spare4;\r
45 GDT_ENTRY Spare5;\r
46} GDT_ENTRIES;\r
47\r
48#pragma pack ()\r
49\r
50STATIC GDT_ENTRIES *mGdt = NULL;\r
51\r
52//\r
53// Global descriptor table (GDT) Template\r
54//\r
55STATIC GDT_ENTRIES GdtTemplate = {\r
56 //\r
57 // Null\r
58 //\r
59 {\r
60 0x0, // limit 15:0\r
61 0x0, // base 15:0\r
62 0x0, // base 23:16\r
63 0x0, // type\r
64 0x0, // limit 19:16, flags\r
65 0x0, // base 31:24\r
66 },\r
67 //\r
68 // Null2\r
69 //\r
70 {\r
71 0x0, // limit 15:0\r
72 0x0, // base 15:0\r
73 0x0, // base 23:16\r
74 0x0, // type\r
75 0x0, // limit 19:16, flags\r
76 0x0, // base 31:24\r
77 },\r
78 //\r
79 // Linear\r
80 //\r
81 {\r
82 0x0FFFF, // limit 0xFFFFF\r
83 0x0, // base 0\r
84 0x0,\r
85 0x09A, // present, ring 0, data, expand-up, writable\r
86 0x0CF, // page-granular, 32-bit\r
87 0x0,\r
88 },\r
89 //\r
90 // LinearCode\r
91 //\r
92 {\r
93 0x0FFFF, // limit 0xFFFFF\r
94 0x0, // base 0\r
95 0x0,\r
96 0x092, // present, ring 0, data, expand-up, writable\r
97 0x0CF, // page-granular, 32-bit\r
98 0x0,\r
99 },\r
100 //\r
101 // TaskSegment\r
102 //\r
103 {\r
104 0x0, // limit 0\r
105 0x0, // base 0\r
106 0x0,\r
107 0x089, // ?\r
108 0x080, // ?\r
109 0x0,\r
110 },\r
111 //\r
112 // Spare4\r
113 //\r
114 {\r
115 0x0, // limit 0\r
116 0x0, // base 0\r
117 0x0,\r
118 0x0, // present, ring 0, data, expand-up, writable\r
119 0x0, // page-granular, 32-bit\r
120 0x0,\r
121 },\r
122 //\r
123 // Spare5\r
124 //\r
125 {\r
126 0x0, // limit 0\r
127 0x0, // base 0\r
128 0x0,\r
129 0x0, // present, ring 0, data, expand-up, writable\r
130 0x0, // page-granular, 32-bit\r
131 0x0,\r
132 },\r
133};\r
134\r
135/**\r
136 Initialize Global Descriptor Table.\r
137\r
138**/\r
139VOID\r
140InitLinuxDescriptorTables (\r
141 VOID\r
142 )\r
143{\r
144 //\r
145 // Allocate Runtime Data for the GDT\r
146 //\r
147 mGdt = AllocateRuntimePool (sizeof (GdtTemplate) + 8);\r
148 ASSERT (mGdt != NULL);\r
149 mGdt = ALIGN_POINTER (mGdt, 8);\r
150\r
151 //\r
152 // Initialize all GDT entries\r
153 //\r
154 CopyMem (mGdt, &GdtTemplate, sizeof (GdtTemplate));\r
155\r
156}\r
157\r
158/**\r
159 Initialize Global Descriptor Table.\r
160\r
161**/\r
162VOID\r
163SetLinuxDescriptorTables (\r
164 VOID\r
165 )\r
166{\r
167 IA32_DESCRIPTOR GdtPtr;\r
168 IA32_DESCRIPTOR IdtPtr;\r
169\r
170 //\r
171 // Write GDT register\r
172 //\r
173 GdtPtr.Base = (UINT32)(UINTN)(VOID*) mGdt;\r
174 GdtPtr.Limit = (UINT16) (sizeof (GdtTemplate) - 1);\r
175 AsmWriteGdtr (&GdtPtr);\r
176\r
177 IdtPtr.Base = (UINT32) 0;\r
178 IdtPtr.Limit = (UINT16) 0;\r
179 AsmWriteIdtr (&IdtPtr);\r
180}\r
181\r