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