xref: /xv6-public/swtch.S (revision 6710e558)
1# Context switch
2#
3#   void swtch(struct context **old, struct context *new);
4#
5# Save the current registers on the stack, creating
6# a struct context, and save its address in *old.
7# Switch stacks to new and pop previously-saved registers.
8
9.globl swtch
10swtch:
11  movl 4(%esp), %eax
12  movl 8(%esp), %edx
13
14  # Save old callee-saved registers
15  pushl %ebp
16  pushl %ebx
17  pushl %esi
18  pushl %edi
19
20  # Switch stacks
21  movl %esp, (%eax)
22  movl %edx, %esp
23
24  # Load new callee-saved registers
25  popl %edi
26  popl %esi
27  popl %ebx
28  popl %ebp
29  ret
30