@@ -4,6 +4,18 @@ use core::mem::size_of;
4
4
static GDT_SIZE : uint = 5 ;
5
5
type GdtTable = [ GdtEntry , ..GDT_SIZE ] ;
6
6
7
+ static GRANULARITY : u8 = 0xc0 ; // 4kb blocks and 32-bit protected
8
+
9
+ static RW : u8 = 1 << 1 ;
10
+ static EXECUTE : u8 = 1 << 3 ;
11
+ static ALWAYS1 : u8 = 1 << 4 ;
12
+ static PRESENT : u8 = 1 << 7 ;
13
+
14
+ static USER : u8 = 3 << 5 ; // Ring 3
15
+
16
+ static CODE : u8 = PRESENT | ALWAYS1 | EXECUTE | RW ;
17
+ static DATA : u8 = PRESENT | ALWAYS1 | RW ;
18
+
7
19
#[ packed]
8
20
struct GdtEntry {
9
21
limit_low : u16 ,
@@ -57,11 +69,11 @@ static mut table: GdtPtr = GdtPtr { limit: 0, base: 0 as *GdtTable };
57
69
58
70
pub fn init ( ) {
59
71
unsafe {
60
- entries[ 0 ] = GdtEntry :: new ( 0 , 0 , 0 , 0 ) ;
61
- entries[ 1 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , 0x9A , 0xCF ) ;
62
- entries[ 2 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , 0x92 , 0xCF ) ;
63
- entries[ 3 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , 0xFA , 0xCF ) ;
64
- entries[ 4 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , 0xF2 , 0xCF ) ;
72
+ entries[ 0 ] = GdtEntry :: new ( 0 , 0 , 0 , 0 ) ; // Null
73
+ entries[ 1 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , CODE , GRANULARITY ) ;
74
+ entries[ 2 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , DATA , GRANULARITY ) ;
75
+ entries[ 3 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , USER | CODE , GRANULARITY ) ;
76
+ entries[ 4 ] = GdtEntry :: new ( 0 , 0xFFFFFFFF , USER | DATA , GRANULARITY ) ;
65
77
66
78
table = GdtPtr :: new ( & entries) ;
67
79
0 commit comments