1*818fc012Srsc# void swtch(struct context *old, struct context *new); 2*818fc012Srsc# 3*818fc012Srsc# Save current register context in old 4*818fc012Srsc# and then load register context from new. 5*818fc012Srsc 6*818fc012Srsc.globl swtch 7*818fc012Srscswtch: 8*818fc012Srsc # Save old registers 9*818fc012Srsc movl 4(%esp), %eax 10*818fc012Srsc 11*818fc012Srsc popl 0(%eax) # %eip 12*818fc012Srsc movl %esp, 4(%eax) 13*818fc012Srsc movl %ebx, 8(%eax) 14*818fc012Srsc movl %ecx, 12(%eax) 15*818fc012Srsc movl %edx, 16(%eax) 16*818fc012Srsc movl %esi, 20(%eax) 17*818fc012Srsc movl %edi, 24(%eax) 18*818fc012Srsc movl %ebp, 28(%eax) 19*818fc012Srsc 20*818fc012Srsc # Load new registers 21*818fc012Srsc movl 4(%esp), %eax # not 8(%esp) - popped return address above 22*818fc012Srsc 23*818fc012Srsc movl 28(%eax), %ebp 24*818fc012Srsc movl 24(%eax), %edi 25*818fc012Srsc movl 20(%eax), %esi 26*818fc012Srsc movl 16(%eax), %edx 27*818fc012Srsc movl 12(%eax), %ecx 28*818fc012Srsc movl 8(%eax), %ebx 29*818fc012Srsc movl 4(%eax), %esp 30*818fc012Srsc pushl 0(%eax) # %eip 31*818fc012Srsc 32*818fc012Srsc ret 33