//http://wiki.osdev.org/GDT_Tutorial .global setup_gdt // call as setup_gdt(GDT,sizeof(GDT)) 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