VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/Firmware/OvmfPkg/Library/LoadLinuxLib/LinuxGdt.c@ 61497

Last change on this file since 61497 was 58464, checked in by vboxsync, 9 years ago

EFI/Firmware: Export new files and directories.

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette