More clean up stack frame handling.
[pintos-anon] / src / threads / switch.S
index a7c27fb03eb8fc3cb73ccee19f07ef21438d61ea..b00823af50044cd4e2cfb0a1f73fbd5802d18fd5 100644 (file)
@@ -1,10 +1,7 @@
-#### 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().
@@ -18,14 +15,14 @@ thread_switch:
        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.
@@ -34,3 +31,8 @@ thread_switch:
        popl %ebp
        popl %ebx
         ret
+
+       .globl switch_thunk
+switch_thunk:
+       addl $8, %esp
+       ret