nuclear@7: .data nuclear@8: .align 4 nuclear@8: /* memory reserved for setup_selectors */ nuclear@7: off:.long 0 nuclear@7: seg:.short 0 nuclear@8: /* memory reserved for set_gdt */ nuclear@8: lim:.short 0 nuclear@8: addr:.long 0 nuclear@7: nuclear@7: .text nuclear@7: /* setup_selectors(uint16_t code, uint16_t data) nuclear@7: * loads the requested selectors to all the selector registers */ nuclear@7: .globl setup_selectors nuclear@7: setup_selectors: nuclear@8: /* set data selectors directly */ nuclear@7: movl 8(%esp), %eax nuclear@7: movw %ax, %ss nuclear@7: movw %ax, %es nuclear@7: movw %ax, %ds nuclear@7: movw %ax, %gs nuclear@7: movw %ax, %fs nuclear@8: /* set cs using a long jump */ nuclear@7: movl 4(%esp), %eax nuclear@7: movw %ax, (seg) nuclear@7: movl $ldcs, (off) nuclear@7: ljmp *off nuclear@7: ldcs: nuclear@7: ret nuclear@7: nuclear@7: /* set_gdt(uint32_t addr, uint16_t limit) nuclear@7: * loads the GDTR with the new address and limit for the GDT */ nuclear@7: .globl set_gdt nuclear@7: set_gdt: nuclear@7: movl 4(%esp), %eax nuclear@8: movl %eax, (addr) nuclear@7: movw 8(%esp), %ax nuclear@8: movw %ax, (lim) nuclear@8: lgdt (lim) nuclear@7: ret nuclear@54: nuclear@54: /* set_task_reg(uint16_t tss_selector) nuclear@54: * loads the TSS selector in the task register */ nuclear@54: .globl set_task_reg nuclear@54: set_task_reg: nuclear@55: mov 4(%esp), %eax nuclear@54: ltr 4(%esp) nuclear@54: ret