summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler/switch.S
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/scheduler/switch.S')
-rw-r--r--kernel/src/scheduler/switch.S44
1 files changed, 32 insertions, 12 deletions
diff --git a/kernel/src/scheduler/switch.S b/kernel/src/scheduler/switch.S
index f4d0e79..4e216e0 100644
--- a/kernel/src/scheduler/switch.S
+++ b/kernel/src/scheduler/switch.S
@@ -1,18 +1,38 @@
#include "x86_64_regs.S"
-.global context_switch
-context_switch:
- /* switch rsp to old task's %rsp */
+/* %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)
- /* save all old task's registers */
- push_caller_saved
- push_callee_saved
-
- /* save old task's rsp & rip */
- call schedule
- /* get new task's rsp & rip */
-
- /* restore all new task's registers */
+/* %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