-
Notifications
You must be signed in to change notification settings - Fork 0
/
init_gdt.inc
91 lines (74 loc) · 2.48 KB
/
init_gdt.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
%ifndef INIT_GDT__INC
%define INIT_GDT__INC
%include "gdt.inc"
bits 16
system_code_selector equ (gdt_system_code - gdt)
system_data_selector equ (gdt_system_data - gdt)
setGdt_rm:
XOR EAX, EAX
MOV AX, DS
SHL EAX, 4
ADD EAX, gdt
MOV [gdtr + 2], eax
MOV EAX, gdt_end
SUB EAX, gdt
MOV [gdtr], AX
LGDT [gdtr]
RET
align 8
gdtr:
istruc GDT_R
at GDT_R.limit, dw gdt
at GDT_R.base, dd (GDT_ENTRY_size * 32)
iend
gdt:
gdt_null: dq 0
gdt_system_code:
istruc GDT_ENTRY
at GDT_ENTRY.limit_low, dw 0xffff
at GDT_ENTRY.base_low, dw 0
at GDT_ENTRY.base_mid, db 0
at GDT_ENTRY.access, db Seg_Present | Seg_Kernel | Seg_Desc_Gen | Seg_Code | Seg_Conforming | Seg_Readable
at GDT_ENTRY.limit_and_flags, db 0x0f | ((Granularity_Page | Word_Size_32) << 4)
at GDT_ENTRY.base_high, db 0
iend
gdt_system_data:
istruc GDT_ENTRY
at GDT_ENTRY.limit_low, dw 0xffff
at GDT_ENTRY.base_low, dw 0
at GDT_ENTRY.base_mid, db 0
at GDT_ENTRY.access, db Seg_Present | Seg_Kernel | Seg_Desc_Gen | Seg_Data | Seg_Conforming | Seg_Writeable
at GDT_ENTRY.limit_and_flags, db 0x0f | ((Granularity_Page | Word_Size_32) << 4)
at GDT_ENTRY.base_high, db 0
iend
gdt_system_tss:
istruc GDT_ENTRY
at GDT_ENTRY.limit_low, dw TSS_size
at GDT_ENTRY.base_low, dw default_tss
at GDT_ENTRY.base_mid, db 0
at GDT_ENTRY.access, db Seg_Present | Seg_Kernel | Seg_Desc_System | Seg_Sys_TSS32_Available
at GDT_ENTRY.limit_and_flags, db 0x0f | ((Granularity_Page | Word_Size_32) << 4)
at GDT_ENTRY.base_high, db 0
iend
gdt_user0_code:
istruc GDT_ENTRY
at GDT_ENTRY.limit_low, dw 0xffff
at GDT_ENTRY.base_low, dw 0
at GDT_ENTRY.base_mid, db 0
at GDT_ENTRY.access, db Seg_Present | Seg_User | Seg_Desc_Gen | Seg_Code | Seg_Conforming | Seg_Readable
at GDT_ENTRY.limit_and_flags, db 0x08 | ((Granularity_Page | Word_Size_32) << 4)
at GDT_ENTRY.base_high, db 0
iend
gdt_user0_data:
istruc GDT_ENTRY
at GDT_ENTRY.limit_low, dw 0xffff
at GDT_ENTRY.base_low, dw 0
at GDT_ENTRY.base_mid, db 0
at GDT_ENTRY.access, db Seg_Present | Seg_User | Seg_Desc_Gen | Seg_Data | Seg_Conforming | Seg_Writeable
at GDT_ENTRY.limit_and_flags, db 0x08 | ((Granularity_Page | Word_Size_32) << 4)
at GDT_ENTRY.base_high, db 0
iend
; space for additional GDT entries
gdt_Array resq 26 ; for a total of 32 entries
gdt_end:
%endif