-#### 0(%esp) - old registers
-#### 16(%esp) - return address
-#### 20(%esp) - current thread
-#### 24(%esp) - new thread
+#include "switch.h"
- .globl thread_switch
-thread_switch:
+ .globl switch_threads
+switch_threads:
# Save caller's register state.
# Note that the SVR4 ABI allows us to destroy %eax, %ecx, %edx.
# This stack frame must match the one set up by thread_create().
mov thread_stack_ofs, %edx
# Save current stack pointer to old thread's stack, if any.
- movl 20(%esp), %eax
+ movl SWITCH_CUR(%esp), %eax
test %eax, %eax
jz 1f
movl %esp, (%eax,%edx,1)
1:
# Restore stack pointer from new thread's stack.
- movl 24(%esp), %ecx
+ movl SWITCH_NEXT(%esp), %ecx
movl (%ecx,%edx,1), %esp
# Restore caller's register state.
popl %ebp
popl %ebx
ret
+
+ .globl switch_thunk
+switch_thunk:
+ addl $8, %esp
+ ret