PatchworkOS  dbbdc99
A non-POSIX operating system.
Loading...
Searching...
No Matches
gdt.c
Go to the documentation of this file.
1#include <kernel/cpu/gdt.h>
2
3#include <kernel/cpu/tss.h>
4#include <kernel/mem/pmm.h>
5
6#include <sys/proc.h>
7
9
11{
12 gdt_segment_t entry;
13 entry.limitLow = 0;
14 entry.baseLow = 0;
15 entry.baseMiddle = 0;
16 entry.access = access;
17 entry.flagsAndLimitHigh = (flags << 4);
18 entry.baseHigh = 0;
19 return entry;
20}
21
23{
25 entry.limitLow = (uint16_t)(limit & 0xFFFF);
26 entry.baseLow = (uint16_t)(base & 0xFFFF);
27 entry.baseLowerMiddle = (uint8_t)((base >> 16) & 0xFF);
28 entry.access = access;
29 entry.flagsAndLimitHigh = ((flags << 4) & 0xF0) | ((limit >> 16) & 0x0F);
30 entry.baseUpperMiddle = (uint8_t)((base >> 24) & 0xFF);
31 entry.baseHigh = (uint32_t)((base >> 32) & 0xFFFFFFFF);
32 entry.reserved = 0;
33 return entry;
34}
35
55
56void gdt_cpu_load(void)
57{
58 gdt_desc_t gdtDesc;
59 gdtDesc.size = sizeof(gdt_t) - 1;
60 gdtDesc.offset = (uint64_t)&gdt;
61 gdt_load_descriptor(&gdtDesc);
62}
63
static gdt_segment_t gdt_segment(uint16_t access, uint16_t flags)
Definition gdt.c:10
static gdt_long_system_segment_t gdt_long_system_segment(uint16_t access, uint16_t flags, uint64_t base, uint32_t limit)
Definition gdt.c:22
#define GDT_FLAGS_LONG_MODE
If set, its a 64-bit code segment.
Definition gdt.h:63
#define GDT_ACCESS_DATA_CODE
Is a data or code segment.
Definition gdt.h:48
#define GDT_ACCESS_READ_WRITE
If set on a code segment, its readable. If set on a data segment, its writable./*#end#*‍/.
Definition gdt.h:42
#define GDT_ACCESS_PRESENT
Must be 1 for all valid segments.
Definition gdt.h:59
void gdt_cpu_tss_load(tss_t *tss)
Load a TSS into the GDT and load it using the ltr instruction on the current CPU.
Definition gdt.c:64
#define GDT_ACCESS_EXEC
If set, the segment is a code segment. If clear, its a data segment.
Definition gdt.h:46
#define GDT_ACCESS_RING0
Descriptor Privilege Level 0 (kernel).
Definition gdt.h:54
#define GDT_ACCESS_RING3
Descriptor Privilege Level 3 (user).
Definition gdt.h:57
#define GDT_ACCESS_ACCESSED
Will be set to 1 when accessed, but its best to set it to 1 manually.
Definition gdt.h:41
#define GDT_ACCESS_SYSTEM
Is a system segment.
Definition gdt.h:47
#define GDT_FLAGS_NONE
No flags set.
Definition gdt.h:61
void gdt_init(void)
Initialize the GDT.
Definition gdt.c:36
void gdt_load_descriptor(gdt_desc_t *descriptor)
Loads a GDT descriptor.
#define GDT_ACCESS_TYPE_TSS_AVAILABLE
Available 64-bit Task State Segment. Only used if the SYSTEM bit is 0.
Definition gdt.h:51
#define GDT_FLAGS_4KB
If set, the limit is in 4KiB blocks. If clear, the limit is in bytes.
Definition gdt.h:66
void gdt_cpu_load(void)
Load the GDT on the current CPU.
Definition gdt.c:56
void tss_load(void)
Load the TSS.
#define ALIGNED(alignment)
GCC aligned attribute.
Definition defs.h:23
#define PAGE_SIZE
The size of a memory page in bytes.
Definition PAGE_SIZE.h:8
static const path_flag_t flags[]
Definition path.c:47
__UINT32_TYPE__ uint32_t
Definition stdint.h:15
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
__UINT16_TYPE__ uint16_t
Definition stdint.h:13
GDT descriptor structure.
Definition gdt.h:76
uint64_t offset
Address of the GDT.
Definition gdt.h:78
uint16_t size
Size of the GDT - 1.
Definition gdt.h:77
A long mode system segment descriptor, used for TSS and LDT.
Definition gdt.h:104
uint8_t baseUpperMiddle
Definition gdt.h:110
uint8_t baseLowerMiddle
Definition gdt.h:107
uint8_t flagsAndLimitHigh
Definition gdt.h:109
A single GDT segment descriptor.
Definition gdt.h:88
uint16_t baseLow
Definition gdt.h:90
uint8_t baseHigh
Definition gdt.h:94
uint16_t limitLow
Definition gdt.h:89
uint8_t baseMiddle
Definition gdt.h:91
uint8_t flagsAndLimitHigh
Definition gdt.h:93
uint8_t access
Definition gdt.h:92
The actual GDT structure.
Definition gdt.h:123
Task State Segment structure.
Definition tss.h:94