Skip to content

Commit 4cb2efb

Browse files
committed
Clearify GDT setup
1 parent 2e97820 commit 4cb2efb

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

rost/arch/gdt.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ use core::mem::size_of;
44
static GDT_SIZE: uint = 5;
55
type GdtTable = [GdtEntry, ..GDT_SIZE];
66

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+
719
#[packed]
820
struct GdtEntry {
921
limit_low: u16,
@@ -57,11 +69,11 @@ static mut table: GdtPtr = GdtPtr { limit: 0, base: 0 as *GdtTable };
5769

5870
pub fn init() {
5971
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);
6577

6678
table = GdtPtr::new(&entries);
6779

0 commit comments

Comments
 (0)