MOS Source Code
Loading...
Searching...
No Matches
descriptors.h
Go to the documentation of this file.
1
// SPDX-License-Identifier: GPL-3.0-or-later
2
3
#pragma once
4
5
#include <
mos/platform/platform.h
>
6
#include <
mos/types.h
>
7
8
#define GDT_NULL 0x00
9
#define GDT_SEGMENT 0x10
10
#define GDT_PRESENT 0x80
11
12
#define GDT_GRANULARITY_BYTE 0x40
13
#define GDT_GRANULARITY_PAGE 0xC0
14
15
#define GDT_SEGMENT_NULL 0x00
16
17
#define GDT_SEGMENT_KCODE 0x10
18
#define GDT_SEGMENT_KDATA 0x20
19
#define GDT_SEGMENT_USERCODE 0x30
20
#define GDT_SEGMENT_USERDATA 0x40
21
#define GDT_SEGMENT_TSS 0x50
22
23
#define GDT_ENTRY_COUNT 6
24
25
typedef
struct
26
{
27
u32
limit_low
: 16;
//
28
u32
base_low
: 24;
//
29
u32
accessed
: 1;
//
30
u32
read_write
: 1;
// readable for code, writable for data
31
u32
conforming_expand_down
: 1;
// conforming for code, expand down for data
32
u32
executable
: 1;
// 1 for code, 0 for data
33
u32
code_data_segment
: 1;
// should be 1 for everything but TSS and LDT
34
u32
dpl
: 2;
// privilege level
35
u32
present
: 1;
//
36
u32
limit_high
: 4;
//
37
u32
available
: 1;
// only used in software; has no effect on hardware
38
u32
long_mode_code
: 1;
// long-mode code segment
39
u32
pm32_segment
: 1;
// 32-bit opcodes for code, uint32_t stack for data
40
u32
granularity
: 1;
// 1 to use 4k page addressing, 0 for byte addressing
41
u32
base_high
: 8;
42
u32
base_veryhigh
;
// upper 32 bits of base address
43
u32
reserved
;
44
}
__packed
gdt_entry_t
;
45
46
MOS_STATIC_ASSERT
(
sizeof
(
gdt_entry_t
) == 16,
"gdt_entry_t is not 16 bytes"
);
47
48
typedef
struct
49
{
50
u16
limit
;
51
gdt_entry_t
*
base
;
52
}
__packed
gdt_ptr_t
;
53
54
MOS_STATIC_ASSERT
(
sizeof
(
gdt_ptr_t
) == 2 +
sizeof
(
void
*),
"gdt_ptr_t is not 6 bytes"
);
55
56
typedef
struct
57
{
58
u32
reserved1
;
59
u64
rsp0
;
60
u64
rsp1
;
61
u64
rsp2
;
62
u64
reserved2
;
63
u64
ist1
;
64
u64
ist2
;
65
u64
ist3
;
66
u64
ist4
;
67
u64
ist5
;
68
u64
ist6
;
69
u64
ist7
;
70
u64
reserved3
;
71
u16
reserved4
;
72
u16
iomap
;
73
}
__packed
tss64_t
;
74
75
MOS_STATIC_ASSERT
(
sizeof
(
tss64_t
) == 0x68,
"tss64_t is not 0x68 bytes"
);
76
77
typedef
struct
78
{
79
tss64_t
tss
__aligned
(32);
80
gdt_entry_t
gdt[
GDT_ENTRY_COUNT
]
__aligned
(32);
81
gdt_ptr_t
gdt_ptr
__aligned
(32);
82
}
__packed
x86_cpu_descriptor_t
;
83
84
extern
PER_CPU_DECLARE
(
x86_cpu_descriptor_t
, x86_cpu_descriptor);
85
86
typedef
struct
87
{
88
u16
isr_low
;
// The lower 16 bits of the ISR's address
89
u16
segment
;
// The GDT segment selector that the CPU will load into CS before calling the ISR
90
u32
reserved
: 8;
91
u32
type
: 4;
// The type of interrupt
92
u32
zero
: 1;
93
u32
dpl
: 2;
94
u32
present
: 1;
95
u32
isr_high
: 16;
// The upper 16 bits of the ISR's address
96
u32
isr_veryhigh
;
// The upper 32 bits of the ISR's address
97
u32
reserved2
;
98
}
__packed
idt_entry_t
;
99
100
typedef
struct
101
{
102
u16
limit
;
103
idt_entry_t
*
base
;
104
}
__packed
idtr_t
;
105
106
MOS_STATIC_ASSERT
(
sizeof
(
idt_entry_t
) == 16,
"idt_entry_t is not 16 bytes"
);
107
108
MOS_STATIC_ASSERT
(
sizeof
(
idtr_t
) == 2 +
sizeof
(
void
*),
"idtr32_t is not 6 bytes"
);
109
110
void
x86_init_percpu_gdt
(
void
);
111
void
x86_init_percpu_tss
(
void
);
112
void
x86_init_percpu_idt
(
void
);
113
114
void
x86_idt_init
(
void
);
115
116
// The following 5 symbols are defined in the descriptor_flush.asm file.
117
extern
void
gdt_flush
(
gdt_ptr_t
*gdt_ptr);
118
extern
void
tss_flush
(
u32
tss_selector);
119
extern
void
gdt_flush_only
(
gdt_ptr_t
*gdt_ptr);
x86_init_percpu_idt
void x86_init_percpu_idt(void)
Definition
idt.c:36
x86_idt_init
void x86_idt_init(void)
Definition
idt.c:41
GDT_ENTRY_COUNT
#define GDT_ENTRY_COUNT
Definition
descriptors.h:23
gdt_flush
void gdt_flush(gdt_ptr_t *gdt_ptr)
gdt_flush_only
void gdt_flush_only(gdt_ptr_t *gdt_ptr)
x86_init_percpu_tss
void x86_init_percpu_tss(void)
Definition
descriptors.c:86
tss_flush
void tss_flush(u32 tss_selector)
x86_init_percpu_gdt
void x86_init_percpu_gdt(void)
Definition
descriptors.c:59
__packed
#define __packed
Definition
mos_global.h:29
MOS_STATIC_ASSERT
#define MOS_STATIC_ASSERT
Definition
mos_global.h:14
platform.h
PER_CPU_DECLARE
#define PER_CPU_DECLARE(type, name)
Definition
platform.h:23
gdt_entry_t
Definition
descriptors.h:26
gdt_entry_t::long_mode_code
u32 long_mode_code
Definition
descriptors.h:38
gdt_entry_t::limit_high
u32 limit_high
Definition
descriptors.h:36
gdt_entry_t::base_veryhigh
u32 base_veryhigh
Definition
descriptors.h:42
gdt_entry_t::code_data_segment
u32 code_data_segment
Definition
descriptors.h:33
gdt_entry_t::pm32_segment
u32 pm32_segment
Definition
descriptors.h:39
gdt_entry_t::dpl
u32 dpl
Definition
descriptors.h:34
gdt_entry_t::accessed
u32 accessed
Definition
descriptors.h:29
gdt_entry_t::executable
u32 executable
Definition
descriptors.h:32
gdt_entry_t::available
u32 available
Definition
descriptors.h:37
gdt_entry_t::base_low
u32 base_low
Definition
descriptors.h:28
gdt_entry_t::conforming_expand_down
u32 conforming_expand_down
Definition
descriptors.h:31
gdt_entry_t::read_write
u32 read_write
Definition
descriptors.h:30
gdt_entry_t::base_high
u32 base_high
Definition
descriptors.h:41
gdt_entry_t::reserved
u32 reserved
Definition
descriptors.h:43
gdt_entry_t::present
u32 present
Definition
descriptors.h:35
gdt_entry_t::limit_low
u32 limit_low
Definition
descriptors.h:27
gdt_entry_t::granularity
u32 granularity
Definition
descriptors.h:40
gdt_ptr_t
Definition
descriptors.h:49
gdt_ptr_t::limit
u16 limit
Definition
descriptors.h:50
gdt_ptr_t::base
gdt_entry_t * base
Definition
descriptors.h:51
idt_entry_t
Definition
descriptors.h:87
idt_entry_t::zero
u32 zero
Definition
descriptors.h:92
idt_entry_t::segment
u16 segment
Definition
descriptors.h:89
idt_entry_t::isr_veryhigh
u32 isr_veryhigh
Definition
descriptors.h:96
idt_entry_t::reserved2
u32 reserved2
Definition
descriptors.h:97
idt_entry_t::isr_low
u16 isr_low
Definition
descriptors.h:88
idt_entry_t::dpl
u32 dpl
Definition
descriptors.h:93
idt_entry_t::isr_high
u32 isr_high
Definition
descriptors.h:95
idt_entry_t::reserved
u32 reserved
Definition
descriptors.h:90
idt_entry_t::present
u32 present
Definition
descriptors.h:94
idt_entry_t::type
u32 type
Definition
descriptors.h:91
idtr_t
Definition
descriptors.h:101
idtr_t::limit
u16 limit
Definition
descriptors.h:102
idtr_t::base
idt_entry_t * base
Definition
descriptors.h:103
tss64_t
Definition
descriptors.h:57
tss64_t::ist7
u64 ist7
Definition
descriptors.h:69
tss64_t::reserved1
u32 reserved1
Definition
descriptors.h:58
tss64_t::reserved3
u64 reserved3
Definition
descriptors.h:70
tss64_t::iomap
u16 iomap
Definition
descriptors.h:72
tss64_t::ist1
u64 ist1
Definition
descriptors.h:63
tss64_t::ist4
u64 ist4
Definition
descriptors.h:66
tss64_t::ist5
u64 ist5
Definition
descriptors.h:67
tss64_t::reserved2
u64 reserved2
Definition
descriptors.h:62
tss64_t::ist3
u64 ist3
Definition
descriptors.h:65
tss64_t::reserved4
u16 reserved4
Definition
descriptors.h:71
tss64_t::ist2
u64 ist2
Definition
descriptors.h:64
tss64_t::rsp0
u64 rsp0
Definition
descriptors.h:59
tss64_t::rsp1
u64 rsp1
Definition
descriptors.h:60
tss64_t::rsp2
u64 rsp2
Definition
descriptors.h:61
tss64_t::ist6
u64 ist6
Definition
descriptors.h:68
x86_cpu_descriptor_t
Definition
descriptors.h:78
x86_cpu_descriptor_t::__aligned
gdt_entry_t gdt[6] __aligned(32)
x86_cpu_descriptor_t::__aligned
tss64_t tss __aligned(32)
x86_cpu_descriptor_t::__aligned
gdt_ptr_t gdt_ptr __aligned(32)
types.h
u32
unsigned int u32
Definition
types.h:21
u16
unsigned short u16
Definition
types.h:20
u64
unsigned long long u64
Definition
types.h:23
kernel
arch
x86_64
include
private
mos
x86
descriptors
descriptors.h
Generated on Sun Sep 1 2024 18:22:52 for MOS Source Code by
1.12.0