diff options
Diffstat (limited to 'asm/gdt.s')
| -rw-r--r-- | asm/gdt.s | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/asm/gdt.s b/asm/gdt.s new file mode 100644 index 0000000..698dcf6 --- /dev/null +++ b/asm/gdt.s @@ -0,0 +1,44 @@ +//http://wiki.osdev.org/GDT_Tutorial +.global asm_setup_gdt +//.global tss_flush + +// call as setup_gdt(GDT,sizeof(GDT)) +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 |
