LinuxGdt.c 3.2 KB

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