Home | History | Annotate | Download | only in LoadLinuxLib
      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 
     28 typedef 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 
     37 typedef
     38 struct _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 
     50 STATIC GDT_ENTRIES *mGdt = NULL;
     51 
     52 //
     53 // Global descriptor table (GDT) Template
     54 //
     55 STATIC 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 **/
    139 VOID
    140 InitLinuxDescriptorTables (
    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 **/
    162 VOID
    163 SetLinuxDescriptorTables (
    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 
    182