summaryrefslogtreecommitdiff
path: root/asm/asm_gdt.s
blob: a35854dedd3c18c94f9e767603f1b4e2e1b2f984 (plain)
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