53 lines
1.4 KiB
ArmAsm
53 lines
1.4 KiB
ArmAsm
/*
|
||
* 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
|