PatchworkOS
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
7
9{
10 gdt_segment_t entry;
11 entry.limitLow = 0;
12 entry.baseLow = 0;
13 entry.baseMiddle = 0;
14 entry.access = access;
15 entry.flagsAndLimitHigh = (flags << 4);
16 entry.baseHigh = 0;
17 return entry;
18}
19
21 uint32_t limit)
22{
24 entry.limitLow = (uint16_t)(limit & 0xFFFF);
25 entry.baseLow = (uint16_t)(base & 0xFFFF);
26 entry.baseLowerMiddle = (uint8_t)((base >> 16) & 0xFF);
27 entry.access = access;
28 entry.flagsAndLimitHigh = ((flags << 4) & 0xF0) | ((limit >> 16) & 0x0F);
29 entry.baseUpperMiddle = (uint8_t)((base >> 24) & 0xFF);
30 entry.baseHigh = (uint32_t)((base >> 32) & 0xFFFFFFFF);
31 entry.reserved = 0;
32 return entry;
33}
34
54
55void gdt_cpu_load(void)
56{
57 gdt_desc_t gdtDesc;
58 gdtDesc.size = sizeof(gdt_t) - 1;
59 gdtDesc.offset = (uint64_t)&gdt;
60 gdt_load_descriptor(&gdtDesc);
61}
62
static gdt_long_system_segment_t gdt_long_system_segment(gdt_access_t access, gdt_flags_t flags, uint64_t base, uint32_t limit)
Definition gdt.c:20
static gdt_segment_t gdt_segment(gdt_access_t access, gdt_flags_t flags)
Definition gdt.c:8
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:63
gdt_flags_t
Flags byte.
Definition gdt.h:83
gdt_access_t
Access byte.
Definition gdt.h:57
void gdt_init(void)
Initialize the GDT.
Definition gdt.c:35
void gdt_load_descriptor(gdt_desc_t *descriptor)
Loads a GDT descriptor.
void gdt_cpu_load(void)
Load the GDT on the current CPU.
Definition gdt.c:55
@ GDT_FLAGS_4KB
If set, the limit is in 4KiB blocks. If clear, the limit is in bytes.
Definition gdt.h:88
@ GDT_FLAGS_NONE
No flags set.
Definition gdt.h:84
@ GDT_FLAGS_LONG_MODE
If set, its a 64-bit code segment.
Definition gdt.h:86
@ GDT_ACCESS_RING0
Descriptor Privilege Level 0 (kernel).
Definition gdt.h:70
@ GDT_ACCESS_ACCESSED
Will be set to 1 when accessed, but its best to set it to 1 manually.
Definition gdt.h:58
@ GDT_ACCESS_EXEC
If set, the segment is a code segment. If clear, its a data segment.
Definition gdt.h:62
@ GDT_ACCESS_SYSTEM
Is a system segment.
Definition gdt.h:63
@ GDT_ACCESS_READ_WRITE
If set on a code segment, its readable. If set on a data segment, its writable.
Definition gdt.h:59
@ GDT_ACCESS_PRESENT
Must be 1 for all valid segments.
Definition gdt.h:75
@ GDT_ACCESS_DATA_CODE
Is a data or code segment.
Definition gdt.h:64
@ GDT_ACCESS_RING3
Descriptor Privilege Level 3 (user).
Definition gdt.h:73
@ GDT_ACCESS_TYPE_TSS_AVAILABLE
Available 64-bit Task State Segment. Only used if the SYSTEM bit is 0.
Definition gdt.h:67
void tss_load(void)
Load the TSS.
#define ALIGNED(alignment)
GCC aligned attribute.
Definition defs.h:22
#define PAGE_SIZE
Memory page size.
Definition proc.h:140
__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:97
uint64_t offset
Address of the GDT.
Definition gdt.h:99
uint16_t size
Size of the GDT - 1.
Definition gdt.h:98
A long mode system segment descriptor, used for TSS and LDT.
Definition gdt.h:125
uint8_t baseUpperMiddle
Definition gdt.h:131
uint8_t baseLowerMiddle
Definition gdt.h:128
uint8_t flagsAndLimitHigh
Definition gdt.h:130
A single GDT segment descriptor.
Definition gdt.h:109
uint16_t baseLow
Definition gdt.h:111
uint8_t baseHigh
Definition gdt.h:115
uint16_t limitLow
Definition gdt.h:110
uint8_t baseMiddle
Definition gdt.h:112
uint8_t flagsAndLimitHigh
Definition gdt.h:114
uint8_t access
Definition gdt.h:113
The actual GDT structure.
Definition gdt.h:144
Task State Segment structure.
Definition tss.h:88