AquilaOS documentation
How it works, and its code
Toggle main menu visibility
Loading...
Searching...
No Matches
idt.c
Go to the documentation of this file.
1
5
6
#include <
core/system.h
>
7
#include "
cpu.h
"
8
9
#if __pragma_pack
10
#pragma pack(1)
11
#endif
12
static
struct
idt_entry
{
13
uint32_t
offset_lo
: 16;
/* the handler's address, bits 0 to 15 */
14
uint32_t
selector
: 16;
/* the code segment it runs in */
15
uint32_t
_unused
: 8;
/* unused, 0 */
16
uint32_t
flags
: 5;
/* 01110: an interrupt gate */
17
uint32_t
dpl
: 2;
/* the privilege level that may use int on it */
18
uint32_t
p
: 1;
/* present */
19
uint16_t
offset_hi
: 16;
/* the handler's address, bits 16 to 31 */
20
#if ARCH_BITS==64
21
uint32_t
offset_ext
: 32;
/* the handler's address, bits 32 to 63 */
22
uint32_t
: 32;
/* reserved */
23
#endif
24
}
__packed
idt
[256];
25
26
struct
idt_ptr
{
27
uint16_t
limit
;
28
uintptr_t
base
;
29
}
__packed
idt_pointer
;
30
#if __pragma_pack
31
#pragma pack()
32
#endif
33
34
#define DPL0 0
35
#define DPL3 3
36
45
void
x86_idt_gate_set
(
uint32_t
id
,
uintptr_t
offset)
46
{
47
idt
[id].
offset_lo
= (offset >> 0x00) & 0xFFFF;
48
idt
[id].
offset_hi
= (offset >> 0x10) & 0xFFFF;
49
#if ARCH_BITS==64
50
idt
[id].
offset_ext
= (offset >> 0x20) & 0xFFFFFFFF;
51
#endif
52
53
idt
[id].
selector
= 0x8;
54
idt
[id].
p
= 1;
55
idt
[id].
dpl
=
DPL0
;
56
idt
[id].
flags
= 0x0E;
57
}
58
67
void
x86_idt_gate_user_set
(
uint32_t
id
,
uintptr_t
offset)
68
{
69
idt
[id].
offset_lo
= (offset >> 0x00) & 0xFFFF;
70
idt
[id].
offset_hi
= (offset >> 0x10) & 0xFFFF;
71
#if ARCH_BITS==64
72
idt
[id].
offset_ext
= (offset >> 0x20) & 0xFFFFFFFF;
73
#endif
74
75
idt
[id].
selector
= 0x8;
76
idt
[id].
p
= 1;
77
idt
[id].
dpl
=
DPL3
;
78
idt
[id].
flags
= 0x0E;
79
}
80
82
void
x86_idt_setup
()
83
{
84
idt_pointer
.
limit
=
sizeof
(
idt
) - 1;
85
idt_pointer
.
base
= (
uintptr_t
) &
idt
;
86
x86_lidt
((
uintptr_t
) &
idt_pointer
);
87
}
cpu.h
x86_lidt
void x86_lidt(uintptr_t)
DPL0
#define DPL0
Definition
gdt.c:28
DPL3
#define DPL3
Definition
gdt.c:29
idt_pointer
struct idt_ptr idt_pointer
x86_idt_gate_user_set
void x86_idt_gate_user_set(uint32_t id, uintptr_t offset)
Sets an interrupt gate that user mode may raise with int too: the system call vector.
Definition
idt.c:67
x86_idt_gate_set
void x86_idt_gate_set(uint32_t id, uintptr_t offset)
Sets an interrupt gate that only the hardware (and the kernel) can raise: an exception or a device in...
Definition
idt.c:45
x86_idt_setup
void x86_idt_setup()
Loads the IDT on the running CPU.
Definition
idt.c:82
idt
static struct idt_entry idt[256]
system.h
__packed
#define __packed
Definition
system.h:30
uintptr_t
__SIZE_TYPE__ uintptr_t
Definition
stddef.h:12
uint32_t
unsigned int uint32_t
Definition
stddef.h:22
uint16_t
unsigned short int uint16_t
Definition
stddef.h:21
idt_entry
Definition
idt.c:12
idt_entry::flags
uint32_t flags
Definition
idt.c:16
idt_entry::_unused
uint32_t _unused
Definition
idt.c:15
idt_entry::offset_ext
uint32_t offset_ext
Definition
idt.c:21
idt_entry::offset_hi
uint16_t offset_hi
Definition
idt.c:19
idt_entry::dpl
uint32_t dpl
Definition
idt.c:17
idt_entry::offset_lo
uint32_t offset_lo
Definition
idt.c:13
idt_entry::p
uint32_t p
Definition
idt.c:18
idt_entry::selector
uint32_t selector
Definition
idt.c:14
idt_ptr
Definition
idt.c:26
idt_ptr::base
uintptr_t base
Definition
idt.c:28
idt_ptr::limit
uint16_t limit
Definition
idt.c:27
kernel
arch
i386
cpu
idt.c
Generated by
1.18.0