X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..593a1d5fd87cdf5b46dd5fcb84467b432cea0f91:/osfmk/i386/cswitch.s diff --git a/osfmk/i386/cswitch.s b/osfmk/i386/cswitch.s index 00f69024d..0668c465e 100644 --- a/osfmk/i386/cswitch.s +++ b/osfmk/i386/cswitch.s @@ -1,23 +1,29 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2006 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ @@ -50,32 +56,23 @@ /* */ -#include #include #include #include #include -#if NCPUS > 1 - #ifdef SYMMETRY #include #endif #if AT386 -#include +#include #endif /* AT386 */ #define CX(addr, reg) addr(,reg,4) -#else /* NCPUS == 1 */ - -#define CPU_NUMBER(reg) -#define CX(addr,reg) addr - -#endif /* NCPUS == 1 */ - + .text /* * Context switch routines for i386. */ @@ -85,57 +82,46 @@ Entry(Load_context) movl TH_KERNEL_STACK(%ecx),%ecx /* get kernel stack */ lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%edx /* point to stack top */ - CPU_NUMBER(%eax) - movl %ecx,CX(EXT(active_stacks),%eax) /* store stack address */ - movl %edx,CX(EXT(kernel_stack),%eax) /* store stack top */ + movl %ecx,%gs:CPU_ACTIVE_STACK /* store stack address */ + movl %edx,%gs:CPU_KERNEL_STACK /* store stack top */ + + movl %edx,%esp + movl %edx,%ebp - movl KSS_ESP(%ecx),%esp /* switch stacks */ - movl KSS_ESI(%ecx),%esi /* restore registers */ - movl KSS_EDI(%ecx),%edi - movl KSS_EBP(%ecx),%ebp - movl KSS_EBX(%ecx),%ebx xorl %eax,%eax /* return zero (no old thread) */ - jmp *KSS_EIP(%ecx) /* resume thread */ + pushl %eax + 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) - CPU_NUMBER(%edx) - movl CX(EXT(active_stacks),%edx),%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 */ - - movl 0(%esp),%eax /* get old thread */ - movl 4(%esp),%ebx /* get continuation */ - movl %ebx,TH_CONTINUATION(%eax) /* save continuation */ - movl %ecx,TH_KERNEL_STACK(%eax) /* save kernel stack */ - - movl 8(%esp),%esi /* get new thread */ - movl $CPD_ACTIVE_THREAD,%ecx - movl %esi,%gs:(%ecx) /* new thread is active */ - movl TH_KERNEL_STACK(%esi),%ecx /* get its kernel stack */ +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 TH_KERNEL_STACK(%ebx),%ecx /* get its kernel stack */ lea KERNEL_STACK_SIZE-IKS_SIZE-IEL_SIZE(%ecx),%ebx /* point to stack top */ - movl %ecx,CX(EXT(active_stacks),%edx) /* set current stack */ - movl %ebx,CX(EXT(kernel_stack),%edx) /* set stack top */ - - movl TH_TOP_ACT(%esi),%esi /* get new_thread->top_act */ - cmpl $0,ACT_KLOADED(%esi) /* check kernel-loaded flag */ - je 0f - movl %esi,CX(EXT(active_kloaded),%edx) - jmp 1f -0: - movl $0,CX(EXT(active_kloaded),%edx) -1: + movl %ecx,%gs:CPU_ACTIVE_STACK /* set current stack */ + movl %ebx,%gs:CPU_KERNEL_STACK /* set stack top */ + + movl KSS_ESP(%ecx),%esp /* switch stacks */ movl KSS_ESI(%ecx),%esi /* restore registers */ movl KSS_EDI(%ecx),%edi @@ -148,23 +134,19 @@ Entry(Thread_continue) xorl %ebp,%ebp /* zero frame pointer */ call *%ebx /* call real continuation */ -#if NCPUS > 1 /* - * void switch_to_shutdown_context(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(switch_to_shutdown_context) - CPU_NUMBER(%edx) - movl EXT(active_stacks)(,%edx,4),%ecx /* get old kernel stack */ +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) movl %edi,KSS_EDI(%ecx) @@ -173,26 +155,12 @@ Entry(switch_to_shutdown_context) movl %esp,KSS_ESP(%ecx) /* save SP */ movl 0(%esp),%eax /* get old thread */ - movl $0,TH_CONTINUATION(%eax) /* clear continuation */ movl %ecx,TH_KERNEL_STACK(%eax) /* save old stack */ movl 4(%esp),%ebx /* get routine to run next */ movl 8(%esp),%esi /* get its argument */ - movl CX(EXT(interrupt_stack),%edx),%ecx /* point to its intr stack */ - lea INTSTACK_SIZE(%ecx),%esp /* switch to it (top) */ - - pushl %eax /* push thread */ - call EXT(thread_dispatch) /* reschedule thread */ - addl $4,%esp /* clean stack */ + movl %gs:CPU_INT_STACK_TOP,%esp /* switch to interrupt stack */ pushl %esi /* push argument */ call *%ebx /* call routine to run */ hlt /* (should never return) */ - -#endif /* NCPUS > 1 */ - - .text - - .globl EXT(locore_end) -LEXT(locore_end) -