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
|
.global asm_setup_gdt
gdt_descriptor:
.int 0
.int 0
asm_setup_gdt:
// re-fill gdt_descriptor with new GDT location and size
movl 4(%esp),%eax
movl %eax, gdt_descriptor+2
movw 8(%esp),%ax
movw %ax, gdt_descriptor
//
lgdt gdt_descriptor #load new descriptor table!
// reload to take effect
reloadSegments:
#Reload CS register containing code selector:
jmp $0x08,$reload_CS # 0x08 points at the new code selector
reload_CS:
mov $0x10, %ax #0x10 points at the new data selector
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
tss_flush:
movw $0x2B,%ax # Load the index of our TSS structure - The index is
# 0x28, as it is the 5th selector and each is 8 bytes
# long, but we set the bottom two bits (making 0x2B)
# so that it has an RPL of 3, not zero.
ltr %ax # Load 0x2B into the task state register.
ret
ret
|