X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..935ed37a5c468c8a1c07408573c08b8b7ef80e8b:/osfmk/i386/cswitch.s diff --git a/osfmk/i386/cswitch.s b/osfmk/i386/cswitch.s index c61d9ad36..0668c465e 100644 --- a/osfmk/i386/cswitch.s +++ b/osfmk/i386/cswitch.s @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -72,6 +72,7 @@ #define CX(addr, reg) addr(,reg,4) + .text /* * Context switch routines for i386. */ @@ -92,23 +93,27 @@ Entry(Load_context) call EXT(thread_continue) /* - * This really only has to save registers + * This has to save registers only * when there is no explicit continuation. */ Entry(Switch_context) - movl %gs:CPU_ACTIVE_STACK,%ecx /* get old kernel stack */ + popl %eax /* pop return PC */ + /* Test for a continuation and skip all state saving if so... */ + cmpl $0,4(%esp) + jne 5f + movl %gs:CPU_ACTIVE_STACK,%ecx /* get old kernel stack */ movl %ebx,KSS_EBX(%ecx) /* save registers */ movl %ebp,KSS_EBP(%ecx) movl %edi,KSS_EDI(%ecx) movl %esi,KSS_ESI(%ecx) - popl KSS_EIP(%ecx) /* save return PC */ + movl %eax,KSS_EIP(%ecx) /* save return PC */ movl %esp,KSS_ESP(%ecx) /* save SP */ - +5: movl 0(%esp),%eax /* return old thread */ movl 8(%esp),%ebx /* get new thread */ - movl %ebx,%gs:CPU_ACTIVE_THREAD /* new thread is active */ + movl %ebx,%gs:CPU_ACTIVE_THREAD /* new thread is active */ movl TH_KERNEL_STACK(%ebx),%ecx /* get its kernel stack */ lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%ebx /* point to stack top */ @@ -116,9 +121,7 @@ Entry(Switch_context) movl %ecx,%gs:CPU_ACTIVE_STACK /* set current stack */ movl %ebx,%gs:CPU_KERNEL_STACK /* set stack top */ - - movl $0,%gs:CPU_ACTIVE_KLOADED - + movl KSS_ESP(%ecx),%esp /* switch stacks */ movl KSS_ESI(%ecx),%esi /* restore registers */ movl KSS_EDI(%ecx),%edi @@ -132,19 +135,17 @@ Entry(Thread_continue) call *%ebx /* call real continuation */ /* - * void machine_processor_shutdown(thread_t thread, - * void (*routine)(processor_t), - * processor_t processor) + * thread_t Shutdown_context(thread_t thread, + * void (*routine)(processor_t), + * processor_t processor) * * saves the kernel context of the thread, * switches to the interrupt stack, * continues the thread (with thread_continue), * then runs routine on the interrupt stack. * - * Assumes that the thread is a kernel thread (thus - * has no FPU state) */ -Entry(machine_processor_shutdown) +Entry(Shutdown_context) movl %gs:CPU_ACTIVE_STACK,%ecx /* get old kernel stack */ movl %ebx,KSS_EBX(%ecx) /* save registers */ movl %ebp,KSS_EBP(%ecx) @@ -163,10 +164,3 @@ Entry(machine_processor_shutdown) pushl %esi /* push argument */ call *%ebx /* call routine to run */ hlt /* (should never return) */ - - - .text - - .globl EXT(locore_end) -LEXT(locore_end) -