Files
Operator-system/context_switch.S

53 lines
1.4 KiB
ArmAsm
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* context_switch.S Cooperative context switch for x86-64.
*
* void context_switch(UINT64 *old_rsp, UINT64 new_rsp);
*
* %rdi = pointer to save current RSP (old task's PCB field)
* %rsi = RSP value to restore (new task's saved RSP)
*
* Saves callee-saved registers (rbp, rbx, r12-r15) and RFLAGS on
* the current stack, stores RSP into *old_rsp, loads new_rsp into
* RSP, restores registers, and returns into the new task's context.
*
* This is a standard cooperative switch: only callee-saved state
* needs preserving because the C calling convention guarantees that
* caller-saved registers are already handled by the compiler.
*/
.text
.global context_switch
/* ----------------------------------------------------------------
* Entry: save old context, load new context, return
* ---------------------------------------------------------------- */
context_switch:
/* Save callee-saved registers and flags on the current stack */
pushq %rbp
pushq %rbx
pushq %r12
pushq %r13
pushq %r14
pushq %r15
pushfq
/* Store current RSP into *old_rsp */
movq %rsp, (%rdi)
/* Switch to the new task's stack */
movq %rsi, %rsp
/* Restore callee-saved registers and flags from the new stack */
popfq
popq %r15
popq %r14
popq %r13
popq %r12
popq %rbx
popq %rbp
ret
.section .note.GNU-stack,"",@progbits