/*
 * 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 <start_task_arch.h>

/*
 * 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 */
