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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
.extern current_process
.extern schedule
.text
.set RAX, 0x0
.set RBX, 0x8
.set RCX, 0x10
.set RDX, 0x18
.set RSI, 0x20
.set RDI, 0x28
.set RSP, 0x30
.set RBP, 0x38
.set R8, 0x40
.set R9, 0x48
.set R10, 0x50
.set R11, 0x58
.set R12, 0x60
.set R13, 0x68
.set R14, 0x70
.set R15, 0x78
.set RIP, 0x80
.set RFLAGS, 0x88
.set CR3, 0x90
.set CS, 0x98
.set DS, 0x9c
.set SS, 0x100
.set ES, 0x104
.set FS, 0x108
.set GS, 0x10c
.macro save_regs
mov %rax, RAX(%rsp)
mov %rbx, RBX(%rsp)
mov %rax, RAX(%rsp)
mov %rbx, RBX(%rsp)
mov %rcx, RCX(%rsp)
mov %rdx, RDX(%rsp)
mov %rsi, RSI(%rsp)
mov %rdi, RDI(%rsp)
# mov %rsp, RSP(%rsp)
mov %rbp, RBP(%rsp)
mov %r8, R8(%rsp)
mov %r9, R9(%rsp)
mov %r10, R10(%rsp)
mov %r11, R11(%rsp)
mov %r12, R12(%rsp)
mov %r13, R13(%rsp)
mov %r14, R14(%rsp)
mov %r15, R15(%rsp)
# mov %rip, RIP(%rsp)
pushfq
pop %rax
mov %rax, RFLAGS(%rsp)
# mov %cr3, CR3(%rsp)
mov %cs, CS(%rsp)
mov %ds, DS(%rsp)
mov %ss, SS(%rsp)
mov %es, ES(%rsp)
mov %fs, FS(%rsp)
mov %gs, GS(%rsp)
.endm
.macro restore_regs
mov RBX(%rsp), %rbx
mov RAX(%rsp), %rax
mov RBX(%rsp), %rbx
mov RCX(%rsp), %rcx
mov RDX(%rsp), %rdx
mov RSI(%rsp), %rsi
mov RDI(%rsp), %rdi
# mov RSP(%rsp), %rsp
mov RBP(%rsp), %rbp
mov R8(%rsp), %r8
mov R9(%rsp), %r9
mov R10(%rsp), %r10
mov R11(%rsp), %r11
mov R12(%rsp), %r12
mov R13(%rsp), %r13
mov R14(%rsp), %r14
mov R15(%rsp), %r15
# mov RIP(%rsp), %rip
mov RFLAGS(%rsp), %rax
push %rax
popfq
mov RAX(%rsp), %rax
# mov CR3(%rsp), %cr3
mov CS(%rsp), %cs
mov DS(%rsp), %ds
mov SS(%rsp), %ss
mov ES(%rsp), %es
mov FS(%rsp), %fs
mov GS(%rsp), %gs
.endm
.global switch_process
switch_process:
# save current process context
mov current_process, %rsp
save_regs
# get which process is next
call schedule
# restore next process context
mov current_process, %rsp
restore_regs
|