X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/de355530ae67247cbd0da700edb3a2a1dae884c2..91447636331957f3d9b5ca5b508f07c526b0074d:/osfmk/i386/cswitch.s diff --git a/osfmk/i386/cswitch.s b/osfmk/i386/cswitch.s index dd8254390..107bc26af 100644 --- a/osfmk/i386/cswitch.s +++ b/osfmk/i386/cswitch.s @@ -50,32 +50,22 @@ /* */ -#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 */ - /* * Context switch routines for i386. */ @@ -85,17 +75,15 @@ 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 @@ -103,8 +91,7 @@ Entry(Load_context) */ Entry(Switch_context) - CPU_NUMBER(%edx) - movl CX(EXT(active_stacks),%edx),%ecx /* get old kernel stack */ + movl %gs:CPU_ACTIVE_STACK,%ecx /* get old kernel stack */ movl %ebx,KSS_EBX(%ecx) /* save registers */ movl %ebp,KSS_EBP(%ecx) @@ -113,29 +100,19 @@ Entry(Switch_context) popl 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 */ + 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 $0,%gs:CPU_ACTIVE_KLOADED + movl KSS_ESP(%ecx),%esp /* switch stacks */ movl KSS_ESI(%ecx),%esi /* restore registers */ movl KSS_EDI(%ecx),%edi @@ -148,9 +125,8 @@ 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 machine_processor_shutdown(thread_t thread, * void (*routine)(processor_t), * processor_t processor) * @@ -162,9 +138,8 @@ Entry(Thread_continue) * 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(machine_processor_shutdown) + 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,23 +148,16 @@ 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