about summary refs log tree commit diff stats
path: root/tools/iso/kernel.soso/task.asm
blob: f0f2b464560e4f7ceab6284f7aa92b645d3425a4 (plain) (blame)
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
global switchTask

switchTask:
        mov esi, [esp]
        pop eax			; *current thread

        ; get values from thread->regs structure

        push dword [esi+4]	; eax
        push dword [esi+8]	; ecx
        push dword [esi+12]	; edx
        push dword [esi+16]	; ebx
        push dword [esi+24]	; ebp
        push dword [esi+28]	; esi
        push dword [esi+32]	; edi
        push dword [esi+48]	; ds
        push dword [esi+50]	; es
        push dword [esi+52]	; fs
        push dword [esi+54]	; gs

        mov al, 0x20
        out 0x20, al

        mov eax, [esi+56]
        mov cr3, eax

        pop gs
        pop fs
        pop es
        pop ds
        pop edi
        pop esi
        pop ebp
        pop ebx
        pop edx
        pop ecx
        pop eax

        iret