2009-07-12 02:28:29 +00:00
|
|
|
# Context switch
|
|
|
|
#
|
|
|
|
# void swtch(struct context **old, struct context *new);
|
|
|
|
#
|
2007-08-28 12:48:33 +00:00
|
|
|
# Save current register context in old
|
|
|
|
# and then load register context from new.
|
|
|
|
|
|
|
|
.globl swtch
|
|
|
|
swtch:
|
|
|
|
movl 4(%esp), %eax
|
2008-10-15 05:14:10 +00:00
|
|
|
movl 8(%esp), %edx
|
2007-08-28 12:48:33 +00:00
|
|
|
|
2008-10-15 05:14:10 +00:00
|
|
|
# Save old callee-save registers
|
|
|
|
pushl %ebp
|
|
|
|
pushl %ebx
|
|
|
|
pushl %esi
|
|
|
|
pushl %edi
|
2007-08-28 12:48:33 +00:00
|
|
|
|
2008-10-15 05:14:10 +00:00
|
|
|
# Switch stacks
|
|
|
|
movl %esp, (%eax)
|
2009-07-12 02:28:29 +00:00
|
|
|
movl %edx, %esp
|
2007-08-28 12:48:33 +00:00
|
|
|
|
2008-10-15 05:14:10 +00:00
|
|
|
# Load new callee-save registers
|
|
|
|
popl %edi
|
|
|
|
popl %esi
|
|
|
|
popl %ebx
|
|
|
|
popl %ebp
|
2007-08-28 12:48:33 +00:00
|
|
|
ret
|