30 lines
540 B
ArmAsm
30 lines
540 B
ArmAsm
# Context switch
|
|
#
|
|
# void swtch(struct context **old, struct context *new);
|
|
#
|
|
# Save the current registers on the stack, creating
|
|
# a struct context, and save its address in *old.
|
|
# Switch stacks to new and pop previously-saved registers.
|
|
|
|
.globl swtch
|
|
swtch:
|
|
movl 4(%esp), %eax
|
|
movl 8(%esp), %edx
|
|
|
|
# Save old callee-save registers
|
|
pushl %ebp
|
|
pushl %ebx
|
|
pushl %esi
|
|
pushl %edi
|
|
|
|
# Switch stacks
|
|
movl %esp, (%eax)
|
|
movl %edx, %esp
|
|
|
|
# Load new callee-save registers
|
|
popl %edi
|
|
popl %esi
|
|
popl %ebx
|
|
popl %ebp
|
|
ret
|