# Context switch # # void swtch(struct context **old, struct context *new); # # Save current register context in old # and then load register context from new. .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 # Jump on a new stack, fake C calling conventions .globl jstack jstack: movl 4(%esp), %esp subl $16, %esp # space for arguments movl $0, %ebp # terminate functions that follow ebp's call mainc # continue at mainc