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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
global switch_to
extern ctask
extern tss
switch_to:
push ebp
mov ebp, esp
mov eax, [ebp+8]
mov [ctask], eax
mov esi, [ebp+12]
mov ecx, 13
.loop:
lodsd
push eax
dec ecx
jz .end
jmp .loop
.end:
mov ax, 0x23
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
popa
iret
; uint32_t ss;
; uint32_t esp;
; uint32_t eflags;
; uint32_t cs;
; uint32_t eip;
; uint32_t eax;
; uint32_t ecx;
; uint32_t edx;
; uint32_t ebx;
; uint32_t esp_garbage;
; uint32_t ebp;
; uint32_t esi;
; uint32_t edi;
; switch_to:
; push ebp
; mov ebp, esp
; cli
; mov ax, 0x23
; mov ds, ax
; mov es, ax
; mov fs, ax
; mov gs, ax
; mov eax, esp
; ; save ESP in the TSS
; mov [tss+4], eax
; push dword 0x23
; push dword 0x00180000
; pushf
; push dword 0x1B
; push dword 0x00100000
; iret
; pop ebp
; ret
|