Skip to content

Commit c20af16

Browse files
committed
cleaned up all the descriptor flags mess
1 parent d5f1c1b commit c20af16

File tree

8 files changed

+105
-95
lines changed

8 files changed

+105
-95
lines changed

kernel/asm/descriptor_flags.inc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
attrib:
2+
.present equ 1 << 7
3+
.ring1 equ 1 << 5
4+
.ring2 equ 1 << 6
5+
.ring3 equ 1 << 5 | 1 << 6
6+
.user equ 1 << 4
7+
;user
8+
.code equ 1 << 3
9+
; code
10+
.conforming equ 1 << 2
11+
.readable equ 1 << 1
12+
; data
13+
.expand_down equ 1 << 2
14+
.writable equ 1 << 1
15+
.accessed equ 1 << 0
16+
;system
17+
; legacy
18+
.tssAvailabe16 equ 0x1
19+
.ldt equ 0x2
20+
.tssBusy16 equ 0x3
21+
.call16 equ 0x4
22+
.task equ 0x5
23+
.interrupt16 equ 0x6
24+
.trap16 equ 0x7
25+
.tssAvailabe32 equ 0x9
26+
.tssBusy32 equ 0xB
27+
.call32 equ 0xC
28+
.interrupt32 equ 0xE
29+
.trap32 equ 0xF
30+
; long mode
31+
.ldt32 equ 0x2
32+
.tssAvailabe64 equ 0x9
33+
.tssBusy64 equ 0xB
34+
.call64 equ 0xC
35+
.interrupt64 equ 0xE
36+
.trap64 equ 0xF
37+
38+
flags:
39+
.granularity equ 1 << 7
40+
.available equ 1 << 4
41+
;user
42+
.default_operand_size equ 1 << 6
43+
; code
44+
.long_mode equ 1 << 5
45+
; data
46+
.reserved equ 1 << 5

kernel/asm/gdt_entry.inc

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,7 @@ struc GDTEntry
22
.limitl resw 1
33
.basel resw 1
44
.basem resb 1
5-
.access resb 1
6-
;both
7-
.present equ 1 << 7
8-
.ring1 equ 1 << 5
9-
.ring2 equ 1 << 6
10-
.ring3 equ 1 << 5 | 1 << 6
11-
.user equ 1 << 4
12-
;user
13-
.code equ 1 << 3
14-
.code_conforming equ 1 << 2
15-
.code_readable equ 1 << 1
16-
.data_expand_down equ 1 << 2
17-
.data_writable equ 1 << 1
18-
.accessed equ 1 << 0
19-
;system
20-
.ldt32 equ 0x2
21-
.tssAvailabe64 equ 0x9
22-
.tssBusy64 equ 0xB
23-
.callGate64 equ 0xC
24-
.interrupt64 equ 0xE
25-
.trap64 equ 0xF
5+
.attribute resb 1
266
.flags__limith resb 1
27-
;both
28-
.granularity equ 1 << 7
29-
.available equ 1 << 4
30-
;user
31-
.default_operand_size equ 1 << 6
32-
.code_long_mode equ 1 << 5
33-
.data_reserved equ 1 << 5
347
.baseh resb 1
358
endstruc

kernel/asm/interrupts-i386.asm

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@ struc IDTEntry
33
.selector resw 1
44
.zero resb 1
55
.attribute resb 1
6-
.present equ 1 << 7
7-
.ring1 equ 1 << 5
8-
.ring2 equ 1 << 6
9-
.ring3 equ 1 << 5 | 1 << 6
10-
.task32 equ 0x5
11-
.interrupt16 equ 0x6
12-
.trap16 equ 0x7
13-
.interrupt32 equ 0xE
14-
.trap32 equ 0xF
156
.offseth resw 1
167
endstruc
178

@@ -82,7 +73,7 @@ idt:
8273
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
8374
at IDTEntry.selector, dw gdt.kernel_code
8475
at IDTEntry.zero, db 0
85-
at IDTEntry.attribute, db IDTEntry.present | IDTEntry.interrupt32
76+
at IDTEntry.attribute, db attrib.present | attrib.interrupt32
8677
at IDTEntry.offseth, dw 0
8778
iend
8879
%assign i i+1
@@ -93,7 +84,7 @@ istruc IDTEntry
9384
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
9485
at IDTEntry.selector, dw gdt.kernel_code
9586
at IDTEntry.zero, db 0
96-
at IDTEntry.attribute, db IDTEntry.ring3 | IDTEntry.present | IDTEntry.interrupt32
87+
at IDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.interrupt32
9788
at IDTEntry.offseth, dw 0
9889
iend
9990
%assign i i+1
@@ -104,7 +95,7 @@ iend
10495
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
10596
at IDTEntry.selector, dw gdt.kernel_code
10697
at IDTEntry.zero, db 0
107-
at IDTEntry.attribute, db IDTEntry.present | IDTEntry.interrupt32
98+
at IDTEntry.attribute, db attrib.present | attrib.interrupt32
10899
at IDTEntry.offseth, dw 0
109100
iend
110101
%assign i i+1

kernel/asm/interrupts-x86_64.asm

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@ struc IDTEntry
33
.selector resw 1
44
.ist resb 1
55
.attribute resb 1
6-
.present equ 1 << 7
7-
.ring1 equ 1 << 5
8-
.ring2 equ 1 << 6
9-
.ring3 equ 1 << 5 | 1 << 6
10-
.ldt32 equ 0x2
11-
.tssAvailabe64 equ 0x9
12-
.tssBusy64 equ 0xB
13-
.callGate64 equ 0xC
14-
.interrupt64 equ 0xE
15-
.trap64 equ 0xF
166
.offsetm resw 1
177
.offseth resd 1
188
.reserved resd 1
@@ -106,7 +96,7 @@ idt:
10696
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
10797
at IDTEntry.selector, dw gdt.kernel_code
10898
at IDTEntry.ist, db 0
109-
at IDTEntry.attribute, db IDTEntry.present | IDTEntry.interrupt64
99+
at IDTEntry.attribute, db attrib.present | attrib.interrupt64
110100
at IDTEntry.offsetm, dw 0
111101
at IDTEntry.offseth, dd 0
112102
at IDTEntry.reserved, dd 0
@@ -119,7 +109,7 @@ istruc IDTEntry
119109
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
120110
at IDTEntry.selector, dw gdt.kernel_code
121111
at IDTEntry.ist, db 0
122-
at IDTEntry.attribute, db IDTEntry.present | IDTEntry.interrupt64
112+
at IDTEntry.attribute, db attrib.present | attrib.interrupt64
123113
at IDTEntry.offsetm, dw 0
124114
at IDTEntry.offseth, dd 0
125115
at IDTEntry.reserved, dd 0
@@ -132,7 +122,7 @@ iend
132122
at IDTEntry.offsetl, dw interrupts+(interrupts.second-interrupts.first)*i
133123
at IDTEntry.selector, dw gdt.kernel_code
134124
at IDTEntry.ist, db 0
135-
at IDTEntry.attribute, db IDTEntry.present | IDTEntry.interrupt64
125+
at IDTEntry.attribute, db attrib.present | attrib.interrupt64
136126
at IDTEntry.offsetm, dw 0
137127
at IDTEntry.offseth, dd 0
138128
at IDTEntry.reserved, dd 0

kernel/asm/startup-common.asm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ finished_loading:
8181

8282
jmp startup_arch
8383

84+
%include "asm/descriptor_flags.inc"
8485
%include "asm/gdt_entry.inc"
8586
%include "asm/unreal.asm"
8687
%include "asm/memory_map.asm"

kernel/asm/startup-i386.asm

Lines changed: 40 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -48,45 +48,54 @@ gdt:
4848
dq 0
4949

5050
.kernel_code equ $ - gdt
51-
dw 0xffff ; limit 0:15
52-
dw 0x0000 ; base 0:15
53-
db 0x00 ; base 16:23
54-
db 0b10011010 ; access byte - code
55-
db 0xdf ; flags/(limit 16:19). flag is set to 32 bit protected mode
56-
db 0x00 ; base 24:31
51+
istruc GDTEntry
52+
at GDTEntry.limitl, dw 0xFFFF
53+
at GDTEntry.basel, dw 0
54+
at GDTEntry.basem, db 0
55+
at GDTEntry.attribute, db attrib.present | attrib.user | attrib.code | attrib.readable
56+
at GDTEntry.flags__limith, db 0xFF | flags.granularity | flags.default_operand_size
57+
at GDTEntry.baseh, db 0
58+
iend
5759

5860
.kernel_data equ $ - gdt
59-
dw 0xffff ; limit 0:15
60-
dw 0x0000 ; base 0:15
61-
db 0x00 ; base 16:23
62-
db 0b10010010 ; access byte - data
63-
db 0xdf ; flags/(limit 16:19). flag is set to 32 bit protected mode
64-
db 0x00 ; base 24:31
61+
istruc GDTEntry
62+
at GDTEntry.limitl, dw 0xFFFF
63+
at GDTEntry.basel, dw 0
64+
at GDTEntry.basem, db 0
65+
at GDTEntry.attribute, db attrib.present | attrib.user | attrib.writable
66+
at GDTEntry.flags__limith, db 0xFF | flags.granularity | flags.default_operand_size
67+
at GDTEntry.baseh, db 0
68+
iend
6569

6670
.user_code equ $ - gdt
67-
dw 0xffff ; limit 0:15
68-
dw 0x0000 ; base 0:15
69-
db 0x00 ; base 16:23
70-
db 0b11111010 ; access byte - code
71-
db 0xdf ; flags/(limit 16:19). flag is set to 32 bit protected mode
72-
db 0x00 ; base 24:31
71+
istruc GDTEntry
72+
at GDTEntry.limitl, dw 0xFFFF
73+
at GDTEntry.basel, dw 0
74+
at GDTEntry.basem, db 0
75+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.user | attrib.code | attrib.readable
76+
at GDTEntry.flags__limith, db 0xFF | flags.granularity | flags.default_operand_size
77+
at GDTEntry.baseh, db 0
78+
iend
7379

7480
.user_data equ $ - gdt
75-
dw 0xffff ; limit 0:15
76-
dw 0x0000 ; base 0:15
77-
db 0x00 ; base 16:23
78-
db 0b11110010 ; access byte - data
79-
db 0xdf ; flags/(limit 16:19). flag is set to 32 bit protected mode
80-
db 0x00 ; base 24:31
81+
istruc GDTEntry
82+
at GDTEntry.limitl, dw 0xFFFF
83+
at GDTEntry.basel, dw 0
84+
at GDTEntry.basem, db 0
85+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.user | attrib.writable
86+
at GDTEntry.flags__limith, db 0xFF | flags.granularity | flags.default_operand_size
87+
at GDTEntry.baseh, db 0
88+
iend
8189

8290
.tss equ $ - gdt
83-
dw (tss.end-tss) & 0xFFFF ; limit 0:15
84-
dw (tss-$$+0x7C00) & 0xFFFF ; base 0:15
85-
db ((tss-$$+0x7C00) >> 16) & 0xFF ; base 16:23
86-
db 0b11101001 ; access byte - data
87-
db 0x40 | ((tss.end-tss) >> 16) & 0xF ; flags/(limit 16:19). flag is set to 32 bit protected mode
88-
db ((tss-$$+0x7C00) >> 24) & 0xFF ; base 24:31
89-
91+
istruc GDTEntry
92+
at GDTEntry.limitl, dw (tss.end - tss) & 0xFFFF
93+
at GDTEntry.basel, dw (tss-$$+0x7C00) & 0xFFFF
94+
at GDTEntry.basem, db ((tss-$$+0x7C00) >> 16) & 0xFF
95+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.tssAvailabe32
96+
at GDTEntry.flags__limith, db ((tss.end - tss) >> 16) & 0xF
97+
at GDTEntry.baseh, db ((tss-$$+0x7C00) >> 24) & 0xFF
98+
iend
9099
.end equ $ - gdt
91100

92101
struc TSS

kernel/asm/startup-x86_64.asm

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ long_mode:
9898
at GDTEntry.limitl, dw 0
9999
at GDTEntry.basel, dw 0
100100
at GDTEntry.basem, db 0
101-
at GDTEntry.access, db GDTEntry.present | GDTEntry.user | GDTEntry.code
102-
at GDTEntry.flags__limith, db GDTEntry.code_long_mode
101+
at GDTEntry.attribute, db attrib.present | attrib.user | attrib.code
102+
at GDTEntry.flags__limith, db flags.long_mode
103103
at GDTEntry.baseh, db 0
104104
iend
105105

@@ -109,7 +109,7 @@ long_mode:
109109
at GDTEntry.basel, dw 0
110110
at GDTEntry.basem, db 0
111111
; AMD System Programming Manual states that the writeable bit is ignored in long mode, but ss can not be set to this descriptor without it
112-
at GDTEntry.access, db GDTEntry.present | GDTEntry.user | GDTEntry.data_writable
112+
at GDTEntry.attribute, db attrib.present | attrib.user | attrib.writable
113113
at GDTEntry.flags__limith, db 0
114114
at GDTEntry.baseh, db 0
115115
iend
@@ -119,8 +119,8 @@ long_mode:
119119
at GDTEntry.limitl, dw 0
120120
at GDTEntry.basel, dw 0
121121
at GDTEntry.basem, db 0
122-
at GDTEntry.access, db GDTEntry.present | GDTEntry.ring3 | GDTEntry.user | GDTEntry.code
123-
at GDTEntry.flags__limith, db GDTEntry.code_long_mode
122+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.user | attrib.code
123+
at GDTEntry.flags__limith, db flags.long_mode
124124
at GDTEntry.baseh, db 0
125125
iend
126126

@@ -130,18 +130,18 @@ long_mode:
130130
at GDTEntry.basel, dw 0
131131
at GDTEntry.basem, db 0
132132
; AMD System Programming Manual states that the writeable bit is ignored in long mode, but ss can not be set to this descriptor without it
133-
at GDTEntry.access, db GDTEntry.present | GDTEntry.ring3 | GDTEntry.user | GDTEntry.data_writable
133+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.user | attrib.writable
134134
at GDTEntry.flags__limith, db 0
135135
at GDTEntry.baseh, db 0
136136
iend
137137

138138
.tss equ $ - gdt
139139
istruc GDTEntry
140-
at GDTEntry.limitl, dw (tss.end-tss) & 0xFFFF
140+
at GDTEntry.limitl, dw (tss.end - tss) & 0xFFFF
141141
at GDTEntry.basel, dw (tss-$$+0x7C00) & 0xFFFF
142142
at GDTEntry.basem, db ((tss-$$+0x7C00) >> 16) & 0xFF
143-
at GDTEntry.access, db GDTEntry.present | GDTEntry.ring3 | GDTEntry.tssAvailabe64
144-
at GDTEntry.flags__limith, db ((tss.end-tss) >> 16) & 0xF
143+
at GDTEntry.attribute, db attrib.present | attrib.ring3 | attrib.tssAvailabe64
144+
at GDTEntry.flags__limith, db ((tss.end - tss) >> 16) & 0xF
145145
at GDTEntry.baseh, db ((tss-$$+0x7C00) >> 24) & 0xFF
146146
iend
147147
dq 0 ;tss descriptors are extended to 16 Bytes

kernel/asm/unreal.asm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ unreal_gdt:
4747
at GDTEntry.limitl, dw 0xFFFF
4848
at GDTEntry.basel, dw 0x0
4949
at GDTEntry.basem, db 0x0
50-
at GDTEntry.access, db GDTEntry.present | GDTEntry.user | GDTEntry.data_writable
51-
at GDTEntry.flags__limith, db 0xFF | GDTEntry.granularity | GDTEntry.default_operand_size
50+
at GDTEntry.attribute, db attrib.present | attrib.user | attrib.writable
51+
at GDTEntry.flags__limith, db 0xFF | flags.granularity | flags.default_operand_size
5252
at GDTEntry.baseh, db 0x0
5353
iend
5454
.end equ $ - unreal_gdt

0 commit comments

Comments
 (0)