kern

annotate src/segm-asm.S @ 54:4eaecb14fe31

bringing the task switching thing into shape with proper per-process kernel stacks and shit
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 14 Aug 2011 16:57:23 +0300
parents 78d5c304ddd0
children 88a6c4e192f9
rev   line source
nuclear@7 1 .data
nuclear@8 2 .align 4
nuclear@8 3 /* memory reserved for setup_selectors */
nuclear@7 4 off:.long 0
nuclear@7 5 seg:.short 0
nuclear@8 6 /* memory reserved for set_gdt */
nuclear@8 7 lim:.short 0
nuclear@8 8 addr:.long 0
nuclear@7 9
nuclear@7 10 .text
nuclear@7 11 /* setup_selectors(uint16_t code, uint16_t data)
nuclear@7 12 * loads the requested selectors to all the selector registers */
nuclear@7 13 .globl setup_selectors
nuclear@7 14 setup_selectors:
nuclear@8 15 /* set data selectors directly */
nuclear@7 16 movl 8(%esp), %eax
nuclear@7 17 movw %ax, %ss
nuclear@7 18 movw %ax, %es
nuclear@7 19 movw %ax, %ds
nuclear@7 20 movw %ax, %gs
nuclear@7 21 movw %ax, %fs
nuclear@8 22 /* set cs using a long jump */
nuclear@7 23 movl 4(%esp), %eax
nuclear@7 24 movw %ax, (seg)
nuclear@7 25 movl $ldcs, (off)
nuclear@7 26 ljmp *off
nuclear@7 27 ldcs:
nuclear@7 28 ret
nuclear@7 29
nuclear@7 30 /* set_gdt(uint32_t addr, uint16_t limit)
nuclear@7 31 * loads the GDTR with the new address and limit for the GDT */
nuclear@7 32 .globl set_gdt
nuclear@7 33 set_gdt:
nuclear@7 34 movl 4(%esp), %eax
nuclear@8 35 movl %eax, (addr)
nuclear@7 36 movw 8(%esp), %ax
nuclear@8 37 movw %ax, (lim)
nuclear@8 38 lgdt (lim)
nuclear@7 39 ret
nuclear@54 40
nuclear@54 41 /* set_task_reg(uint16_t tss_selector)
nuclear@54 42 * loads the TSS selector in the task register */
nuclear@54 43 .globl set_task_reg
nuclear@54 44 set_task_reg:
nuclear@54 45 ltr 4(%esp)
nuclear@54 46 ret