summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler/switch.S
blob: 12593eca81220bcbc727ef94f2b3821e7a73af2f (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
39
40
41
42
43
44
45
46
47
#include "x86_64_regs.S"

/* %rdi - irq's rsp */
.global save_context_from_rsp
save_context_from_rsp:
	push %rbp
	mov %rsp, %rbp

	mov RSP_OFF(%rdi), %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)

	mov %rsp, %rax

	mov %rbp, %rsp
	pop %rbp
	ret

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