summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler/switch.S
blob: 4e216e0bb71b8a81f1b737f480c01b3fa27f59fd (plain)
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
#include "x86_64_regs.S"

/* %rdi - irq's rsp */
/* %rsi - task's rsp */
.global save_to_rsp
save_context_to_rsp:
	mov %rsi, %rsp
	push SS_OFF(%rdi)
	push RSP_OFF(%rdi)
	push RFLAGS_OFF(%rdi)
	push CS_OFF(%rdi)
	push RIP_OFF(%rdi)
	push $0
	push RAX_OFF(%rdi)
	push RCX_OFF(%rdi)
	push RDX_OFF(%rdi)
	push RSI_OFF(%rdi)
	push RDI_OFF(%rdi)
	push R8_OFF(%rdi)
	push R9_OFF(%rdi)
	push R10_OFF(%rdi)
	push R11_OFF(%rdi)
	push SEG_OFF(%rdi)
	push RBX_OFF(%rdi)
	push RBP_OFF(%rdi)
	push R12_OFF(%rdi)
	push R13_OFF(%rdi)
	push R14_OFF(%rdi)
	push R15_OFF(%rdi)

/* %rdi - task's rsp */
.global restore_from_rsp
restore_context_from_rsp:
	mov %rdi, %rsp
	pop_callee_saved
	pop_caller_saved
	add $8, %rsp
	iretq