diff options
Diffstat (limited to 'kernel/src/scheduler')
| -rw-r--r-- | kernel/src/scheduler/process.c | 0 | ||||
| -rw-r--r-- | kernel/src/scheduler/switch.S | 44 |
2 files changed, 32 insertions, 12 deletions
diff --git a/kernel/src/scheduler/process.c b/kernel/src/scheduler/process.c new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/kernel/src/scheduler/process.c 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 |
