/* * Copyright (c) 2010-2014 Wind River Systems, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file * @brief Intel nanokernel APIs to start a task * * Intel-specific parts of start_task(). Only FP functionality currently. */ #ifdef CONFIG_MICROKERNEL #include /* * The following IA-32-specific task group is used for tasks that use SSE * instructions. It is *not* formally reserved by SysGen for this purpose. * See comments in thread.c regarding the use of SSE_GROUP, and comments * in task.h regarding task groups reserved by SysGen. * * This identifier corresponds to the first user-defined task group. * It must be updated if any changes are made to the reserved groups. */ #define SSE_GROUP 0x10 /** * @brief Intel-specific parts of task initialization * * @param X pointer to task control block * @param pOpt thread options container * * @return N/A */ void _StartTaskArch(struct k_task *X, unsigned int *pOpt) { /* * The IA-32 nanokernel implementation uses the USE_FP bit in the * struct tcs->flags structure as a "dirty bit". The USE_FP flag bit * will be set whenever a thread uses any non-integer capability, * whether it's just the x87 FPU capability, SSE instructions, or a * combination of both. The USE_SSE flag bit will only be set if a * thread uses SSE instructions. * * However, callers of fiber_fiber_start(), task_fiber_start(), or even * _new_thread() don't need to follow the protocol used by the IA-32 * nanokernel w.r.t. managing the struct tcs->flags field. If a thread * will be utilizing just the x87 FPU capability, then the USE_FP * option bit is specified. If a thread will be utilizing SSE * instructions (and possibly x87 FPU capability), then only the * USE_SSE option bit needs to be specified. * * Likewise, the placement of tasks into "groups" doesn't need to follow * the protocol used by the IA-32 nanokernel w.r.t. managing the * struct tcs->flags field. If a task will utilize just the x87 FPU * capability, then the task only needs to be placed in the FPU_GROUP * group. If a task utilizes SSE instructions (and possibly x87 FPU * capability), then the task only needs to be placed in the SSE_GROUP * group. */ *pOpt |= (X->group & SSE_GROUP) ? USE_SSE : (X->group & FPU_GROUP) ? USE_FP : 0; } #endif /* CONFIG_MICROKERNEL */