1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include "../common/types.h"
#include "gdt.h"
#include "x86.h"
// TODO: déclarer la table GDT
// Pointeur sur la table GDT
static gdt_ptr_t gdt_ptr;
// Build and return a GDT entry given the various arguments (see Intel manuals).
static gdt_entry_t build_entry(uint32_t base, uint32_t limit, uint8_t type, uint8_t s, uint8_t db, uint8_t granularity, uint8_t dpl) {
gdt_entry_t entry;
// For a TSS and LDT, base is the addresse of the TSS/LDT structure
// and limit is the size of the structure.
entry.lim15_0 = limit & 0xffff;
entry.base15_0 = base & 0xffff;
entry.base23_16 = (base >> 16) & 0xff;
entry.type = type; // See TYPE_xxx flags
entry.s = s; // 1 for segments; 0 for system (TSS, LDT, gates)
entry.dpl = dpl; // privilege level
entry.present = 1; // present in memory
entry.lim19_16 = (limit >> 16) & 0xf;
entry.avl = 0; // available for use
entry.l = 0; // should be 0 (64-bit code segment)
entry.db = db; // 1 for 32-bit code and data segments; 0 for system (TSS, LDT, gate)
entry.granularity = granularity; // granularity of the limit value: 0 = 1 byte; 1 = 4096 bytes
entry.base31_24 = (base >> 24) & 0xff;
return entry;
}
// Return a NULL entry.
static gdt_entry_t null_segment() {
gdt_entry_t entry;
//memset(&entry, 0, sizeof(gdt_entry_t));
return entry;
}
// Return a code segment specified by the base, limit and privilege level passed in arguments.
static gdt_entry_t code_segment(uint32_t base, uint32_t limit, uint8_t dpl) {
return build_entry(base, limit, TYPE_CODE_EXECREAD, S_CODE_OR_DATA, DB_SEG, 1, dpl);
}
// Return a data segment specified by the base, limit and privilege level passed in arguments.
static gdt_entry_t data_segment(uint32_t base, uint32_t limit, uint8_t dpl) {
return build_entry(base, limit, TYPE_DATA_READWRITE, S_CODE_OR_DATA, DB_SEG, 1, dpl);
}
// Initialize the GDT
void gdt_init() {
// TODO: fixer la limite de gdt_ptr, puis la faire pointer sur la GDT
// TODO: initialisation des trois descripteurs de segment: NULL, segment code, segment data
// Les descripteurs de code et data doivent avoir un DPL de 0.
// Load the GDT
gdt_flush(&gdt_ptr);
}
|