My Kernel v0.1.0
gdt.h
1
24#ifndef KERNEL_ARCH_I686_GDT_H
25#define KERNEL_ARCH_I686_GDT_H
26
27#include <kernel/types.h>
28
29#include <utils/compiler.h>
30
31// Hard coded constant linear base 32-bits address for the TSS
32#define GDT_TSS_BASE_ADDRESS 0x00000000UL
33
37enum {
38 GDT_ENTRY_NULL = 0,
44};
45
50typedef struct gdtr gdtr;
51struct PACKED gdtr {
52 u16 size;
53 u32 offset;
54};
55
60typedef struct gdt_descriptor {
61 u32 base;
62 u32 limit : 20;
63 u8 access;
64 u8 flags : 4;
66
77typedef struct PACKED tss {
78 u16 link;
79 u16 _reserved1;
80 u32 esp0;
81 u16 ss0;
82 u16 _reserved2;
83 u32 esp1;
84 u16 ss1;
85 u16 _reserved3;
86 u32 esp2;
87 u16 ss2;
88 u16 _reserved4;
89 u32 cr3;
90 u32 eip;
91 u32 eflags;
92 u32 eax;
93 u32 ecx;
94 u32 edx;
95 u32 ebx;
96 u32 esp;
97 u32 ebp;
98 u32 esi;
99 u32 edi;
100 u16 es;
101 u16 _reserved5;
102 u16 cs;
103 u16 _reserved6;
104 u16 ss;
105 u16 _reserved7;
106 u16 ds;
107 u16 _reserved8;
108 u16 fs;
109 u16 _reserved9;
110 u16 gs;
111 u16 _reserved10;
112 u16 ldtr;
113 u16 _reserved11;
114 u16 _reserved12;
115 u16 iopb;
116 u32 ssp;
117} tss_t;
118
124typedef union {
125 u16 raw;
126 struct {
127 u8 rpl : 2;
128 u8 ti : 1;
129 u16 index : 13;
130 } PACKED;
132
140void gdt_init(void);
141
148void gdt_load_segment(gdt_descriptor, u16 index);
149
151void gdt_log(void);
152
154void gdt_set_esp0(u32);
155
156#endif /* KERNEL_ARCH_I686_GDT_H */
void gdt_load_segment(gdt_descriptor, u16 index)
Load a segment descriptor into the Global Descriptor Table.
Definition: gdt.c:67
void gdt_log(void)
Print the content of the GDT and GDTR.
Definition: gdt.c:85
void gdt_set_esp0(u32)
Modify the kernel stack pointer inside the current TSS.
Definition: gdt.c:116
void gdt_init(void)
Initialize the GDTR and GDT.
Definition: gdt.c:35
@ GDT_ENTRY_KERNEL_CODE
Required NULL segment.
Definition: gdt.h:39
@ GDT_ENTRY_TSS
User data segment.
Definition: gdt.h:43
@ GDT_ENTRY_USER_CODE
Kernel data segment.
Definition: gdt.h:41
@ GDT_ENTRY_USER_DATA
User code segment.
Definition: gdt.h:42
@ GDT_ENTRY_KERNEL_DATA
Kernel code segment.
Definition: gdt.h:40
Structure of the page fault's error code https://wiki.osdev.org/Exceptions#Page_Fault.
Definition: mmu.c:587
A single entry inside the GDT.
Definition: gdt.h:60
The GDT is pointed to by the value in the GDTR register.
Definition: gdt.h:51
Segment.
Definition: gdt.h:77
Identifies a segment inside the GDT or LDT.
Definition: gdt.h:124