summaryrefslogtreecommitdiff
path: root/kernel/src/scheduler
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 05:43:37 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 05:47:59 +0100
commitaaa23fffd02fb49cdbc56a480dbb5a8fa95bff38 (patch)
treecefd59478bb62a2edca523adc9f10cec605f57b0 /kernel/src/scheduler
parent4931f266a72dccfb439badfa1070563003c80ce3 (diff)
x86_64_regs.S: (push/pop)_(callee/caller)_regs
Diffstat (limited to 'kernel/src/scheduler')
-rw-r--r--kernel/src/scheduler/ap_init.S1
-rw-r--r--kernel/src/scheduler/switch.S18
2 files changed, 18 insertions, 1 deletions
diff --git a/kernel/src/scheduler/ap_init.S b/kernel/src/scheduler/ap_init.S
index 47efc6f..ac758c8 100644
--- a/kernel/src/scheduler/ap_init.S
+++ b/kernel/src/scheduler/ap_init.S
@@ -1,6 +1,5 @@
.section .apinit, "a"
-
.SET stack_top, 0x3008000
.SET stack_off, 0x8000
diff --git a/kernel/src/scheduler/switch.S b/kernel/src/scheduler/switch.S
new file mode 100644
index 0000000..f4d0e79
--- /dev/null
+++ b/kernel/src/scheduler/switch.S
@@ -0,0 +1,18 @@
+#include "x86_64_regs.S"
+
+.global context_switch
+context_switch:
+ /* switch rsp to old task's %rsp */
+
+ /* 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 */
+ pop_callee_saved
+ pop_caller_saved
+ iretq