aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/gdt.h
blob: c0ba677800a829ec70bec52660b3fc3d649b1527 (plain) (blame)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once

#include <stdint.h>

typedef struct __attribute__((packed))
{
    uint16_t size;
    uint64_t ptr;
}  gdt_load;

typedef struct __attribute__((packed))
{
    uint64_t limit: 16;
    uint64_t base_low: 16;
    uint64_t base_mid: 8;
    uint64_t A: 1;
    uint64_t R: 1;
    uint64_t C: 1;
    uint64_t one0: 1;
    uint64_t one1: 1;
    uint64_t DPL: 2;
    uint64_t P: 1;
    uint64_t limit_high: 4;
    uint64_t AVL: 1;
    uint64_t L: 1;
    uint64_t D: 1;
    uint64_t G: 1;
    uint64_t base_high: 8;
} code_segment;

typedef struct __attribute__((packed))
{
    uint64_t limit: 16;
    uint64_t base_low: 16;
    uint64_t base_mid: 8;
    uint64_t A: 1;
    uint64_t W: 1;
    uint64_t E: 1;
    uint64_t zero: 1;
    uint64_t one: 1;
    uint64_t DPL: 2;
    uint64_t P: 1;
    uint64_t limit_high: 4;
    uint64_t AVL: 1;
    uint64_t L: 1;
    uint64_t D: 1;
    uint64_t G: 1;
    uint64_t base_high: 8;
} data_segment;

typedef struct __attribute__((packed))
{
    uint64_t limit_low: 16;
    uint64_t base_low: 24;
    uint64_t type: 4;
    uint64_t zero0: 1;
    uint64_t DPL: 2;
    uint64_t P: 1;
    uint64_t limit_high: 4;
    uint64_t AVL: 1;
    uint64_t zero1: 1;
    uint64_t zero2: 1;
    uint64_t G: 1;
    uint64_t base_high: 40;
    uint64_t rsv1: 8;
    uint64_t zero3: 5;
    uint64_t rsv2: 19;
} tss_segment;

typedef struct __attribute__((packed))
{
    uint32_t rsv0;
    uint64_t rsp0;
    uint64_t rsp1;
    uint64_t rsp2;
    uint64_t rsv1;
    uint64_t ist1;
    uint64_t ist2;
    uint64_t ist3;
    uint64_t ist4;
    uint64_t ist5;
    uint64_t ist6;
    uint64_t ist7;
    uint64_t rsv2;
    uint16_t rsv3;
    uint16_t io_base;
} tss;

int init_gdt();
uint64_t create_descriptor(uint32_t base, uint32_t limit, uint8_t access_byte, uint16_t flag);
uint64_t convert_code_segment(code_segment* segment);
uint64_t convert_data_segment(data_segment* segment);
void create_system_segment_descriptor();