1 /******************************************************************************/
2 /* src/kernel/TaskMng/TaskMngTask.c */
4 /* Copyright (C) 2017-2018 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
13 #include <hardware/IA32/IA32Instruction.h>
14 #include <MLib/Basic/MLibBasic.h>
15 #include <kernel/config.h>
16 #include <kernel/types.h>
25 #include "TaskMngElf.h"
26 #include "TaskMngProc.h"
27 #include "TaskMngSched.h"
28 #include "TaskMngTask.h"
29 #include "TaskMngTss.h"
32 /******************************************************************************/
34 /******************************************************************************/
36 #ifdef DEBUG_LOG_ENABLE
37 #define DEBUG_LOG( ... ) \
38 DebugLogOutput( CMN_MODULE_TASKMNG_TASK, \
42 #define DEBUG_LOG( ... )
47 void *pTopAddr; /**< 先頭アドレス */
48 void *pBottomAddr; /**< 終端アドレス */
49 size_t size; /**< サイズ */
54 uint8_t used; /**< 使用フラグ */
55 uint8_t state; /**< タスク状態 */
56 uint8_t reserved[ 2 ]; /**< パディング */
57 MkPid_t pid; /**< プロセスID */
58 MkTid_t tid; /**< スレッドID */
59 TaskStackInfo_t aplStackInfo; /**< アプリスタックアドレス */
60 TaskStackInfo_t kernelStackInfo; /**< カーネルスタックアドレス */
61 TaskMngTaskContext_t context; /**< コンテキスト */
65 /******************************************************************************/
67 /******************************************************************************/
69 static TaskTbl_t gTaskTbl[ MK_CONFIG_TASKID_NUM ];
72 /******************************************************************************/
74 /******************************************************************************/
75 /******************************************************************************/
80 * @param[in] pid プロセスID
81 * @param[in] tid スレッドID
82 * @param[in] pageDirId ページディレクトリID
83 * @param[in] *pAddr 実行アドレス
86 * @retval MK_CONFIG_TASKID_NULL 失敗
87 * @retval MK_CONFIG_TASKID_MIN タスクID最小値
88 * @retval MK_CONFIG_TASKID_MAX タスクID最大値
90 /******************************************************************************/
91 MkTaskId_t TaskMngTaskAdd( MkPid_t pid,
96 void *pAplStack; /* アプリスタック */
97 void *pKernelStack; /* カーネルスタック */
98 CmnRet_t ret; /* 関数戻り値 */
99 MkTaskId_t taskId; /* タスクID */
100 TaskStackInfo_t *pStackInfo; /* スタック情報 */
106 taskId = MK_CONFIG_TASKID_MIN;
110 DEBUG_LOG( "%s() start.", __func__ );
111 DEBUG_LOG( " pid=%u, tid=%u, pageDirId=%u, pAddr=%010p",
118 for ( taskId = MK_CONFIG_TASKID_MIN;
119 taskId < MK_CONFIG_TASKID_MAX;
122 if ( gTaskTbl[ taskId ].used == CMN_UNUSED ) {
126 gTaskTbl[ taskId ].used = CMN_USED;
127 gTaskTbl[ taskId ].state = 0;
128 gTaskTbl[ taskId ].pid = pid;
129 gTaskTbl[ taskId ].tid = tid;
130 gTaskTbl[ taskId ].context.eip = ( uint32_t ) pAddr;
131 gTaskTbl[ taskId ].context.esp = MK_CONFIG_ADDR_KERNEL_STACK +
132 MK_CONFIG_SIZE_KERNEL_STACK -
136 pStackInfo = &( gTaskTbl[ taskId ].kernelStackInfo );
137 pStackInfo->pTopAddr = ( void * ) MK_CONFIG_ADDR_KERNEL_STACK;
138 pStackInfo->pBottomAddr = ( void * )
139 ( MK_CONFIG_ADDR_KERNEL_STACK +
140 MK_CONFIG_SIZE_KERNEL_STACK -
141 sizeof ( uint32_t ) );
142 pStackInfo->size = MK_CONFIG_SIZE_KERNEL_STACK;
145 pStackInfo = &( gTaskTbl[ taskId ].aplStackInfo );
146 pStackInfo->pTopAddr = ( void * ) MK_CONFIG_ADDR_APL_STACK;
147 pStackInfo->pBottomAddr = ( void * )
148 ( MK_CONFIG_ADDR_APL_STACK +
149 MK_CONFIG_SIZE_APL_STACK -
150 sizeof ( uint32_t ) );
151 pStackInfo->size = MK_CONFIG_SIZE_APL_STACK;
154 pKernelStack = MemMngPhysAlloc( MK_CONFIG_SIZE_KERNEL_STACK );
157 if ( pKernelStack == NULL ) {
162 return MK_CONFIG_TASKID_NULL;
166 pAplStack = MemMngPhysAlloc( MK_CONFIG_SIZE_APL_STACK );
169 if ( pAplStack == NULL ) {
174 return MK_CONFIG_TASKID_NULL;
177 /* カーネルスタックページマップ設定 */
178 ret = MemMngPageSet( pageDirId,
179 ( void * ) MK_CONFIG_ADDR_KERNEL_STACK,
181 MK_CONFIG_SIZE_KERNEL_STACK,
187 if ( ret != CMN_SUCCESS ) {
192 return MK_CONFIG_TASKID_NULL;
195 /* アプリスタックページマップ設定 */
196 ret = MemMngPageSet( pageDirId,
197 ( void * ) MK_CONFIG_ADDR_APL_STACK,
199 MK_CONFIG_SIZE_APL_STACK,
205 if ( ret != CMN_SUCCESS ) {
210 return MK_CONFIG_TASKID_NULL;
214 DEBUG_LOG( "%s() end. ret=%u", __func__, taskId );
221 DEBUG_LOG( "%s() end. ret=%u", __func__, MK_CONFIG_TASKID_NULL );
223 return MK_CONFIG_TASKID_NULL;
227 /******************************************************************************/
230 * @details 指定したタスクIDのタスクが存在するか確認する。
232 * @param[in] taskId タスクID
238 /******************************************************************************/
239 bool TaskMngTaskCheckExist( MkTaskId_t taskId )
241 return gTaskTbl[ taskId ].used == CMN_USED;
245 /******************************************************************************/
247 * @brief アプリスタックアドレス取得
248 * @details 指定したタスクIDの終端アプリスタックアドレスを取得する。
250 * @param[in] taskId タスクID
251 * - MK_CONFIG_TASKID_MIN タスクID最小値
252 * - MK_CONFIG_TASKID_MAX タスクID最大値
254 * @return 終端アプリスタックアドレス
256 /******************************************************************************/
257 void *TaskMngTaskGetAplStack( MkTaskId_t taskId )
260 return gTaskTbl[ taskId ].aplStackInfo.pBottomAddr;
264 /******************************************************************************/
267 * @details 指定したタスクIDのコンテキストを取得する。
269 * @param[in] taskId タスクID
270 * - MK_CONFIG_TASKID_MIN タスクID最小値
271 * - MK_CONFIG_TASKID_MAX タスクID最大値
275 /******************************************************************************/
276 TaskMngTaskContext_t TaskMngTaskGetContext( MkTaskId_t taskId )
279 return gTaskTbl[ taskId ].context;
283 /******************************************************************************/
285 * @brief カーネルスタックアドレス取得
286 * @details 指定したタスクIDの終端カーネルスタックアドレスを取得する。
288 * @param[in] taskId タスクID
289 * - MK_CONFIG_TASKID_MIN タスクID最小値
290 * - MK_CONFIG_TASKID_MAX タスクID最大値
292 * @return 終端カーネルスタックアドレス
294 /******************************************************************************/
295 void *TaskMngTaskGetKernelStack( MkTaskId_t taskId )
298 return gTaskTbl[ taskId ].kernelStackInfo.pBottomAddr;
302 /******************************************************************************/
304 * @brief ページディレクトリID取得
305 * @details 指定したタスクIDのページディレクトリIDを取得する。
307 * @param[in] taskId タスクID
308 * - MK_CONFIG_TASKID_MIN タスクID最小値
309 * - MK_CONFIG_TASKID_MAX タスクID最大値
311 * @return ページディレクトリID
313 /******************************************************************************/
314 uint32_t TaskMngTaskGetPageDirId( MkTaskId_t taskId )
317 return TaskMngProcGetPageDirId( gTaskTbl[ taskId ].pid );
321 /******************************************************************************/
324 * @details 指定したタスクIDのプロセスIDを取得する。
326 * @param[in] taskId タスクID
327 * - MK_CONFIG_TASKID_MIN タスクID最小値
328 * - MK_CONFIG_TASKID_MAX タスクID最大値
331 * @retval MK_CONFIG_PID_MIN プロセスID最小値
332 * @retval MK_CONFIG_PID_MAX プロセスID最大値
334 /******************************************************************************/
335 MkPid_t TaskMngTaskGetPid( MkTaskId_t taskId )
338 return gTaskTbl[ taskId ].pid;
342 /******************************************************************************/
345 * @details 指定したタスクIDのプロセスタイプを取得する。
347 * @param[in] taskId タスクID
348 * - MK_CONFIG_TASKID_MIN タスクID最小値
349 * - MK_CONFIG_TASKID_MAX タスクID最大値
352 * @retval TASKMNG_PROC_TYPE_KERNEL カーネル
353 * @retval TASKMNG_PROC_TYPE_DRIVER ドライバ
354 * @retval TASKMNG_PROC_TYPE_SERVER サーバ
355 * @retval TASKMNG_PROC_TYPE_USER ユーザ
357 /******************************************************************************/
358 uint8_t TaskMngTaskGetType( MkTaskId_t taskId )
361 return TaskMngProcGetType( gTaskTbl[ taskId ].pid );
365 /******************************************************************************/
368 * @details 指定したタスクIDのプロセスタイプを比較し階層差を取得する。
370 * @param[in] taskId1 タスクID
371 * @param[in] taskId2 タスクID
379 /******************************************************************************/
380 uint8_t TaskMngTaskGetTypeDiff( MkTaskId_t taskId1,
383 uint8_t type1; /* プロセスタイプ */
384 uint8_t type2; /* プロセスタイプ */
387 type1 = TaskMngProcGetType( taskId1 );
388 type2 = TaskMngProcGetType( taskId2 );
390 return MLIB_BASIC_MAX( type1, type2 ) - MLIB_BASIC_MIN( type1, type2 );
394 /******************************************************************************/
397 * @details タスク管理サブモジュールの初期化を行う。
399 /******************************************************************************/
400 void TaskMngTaskInit( void )
403 DEBUG_LOG( "%s() start.", __func__ );
406 memset( gTaskTbl, 0, sizeof ( gTaskTbl ) );
409 gTaskTbl[ TASKMNG_TASKID_IDLE ].used = CMN_USED;
410 gTaskTbl[ TASKMNG_TASKID_IDLE ].pid = TASKMNG_PID_IDLE;
411 gTaskTbl[ TASKMNG_TASKID_IDLE ].tid = 0;
414 DEBUG_LOG( "%s() end.", __func__ );
420 /******************************************************************************/
423 * @details 指定したタスクIDのコンテキストを設定する。
425 * @param[in] taskId 設定先タスクID
426 * - MK_CONFIG_TASKID_MIN タスクID最小値
427 * - MK_CONFIG_TASKID_MAX タスクID最大値
428 * @param[in] *pContext コンテキスト
430 /******************************************************************************/
431 void TaskMngTaskSetContext( MkTaskId_t taskId,
432 TaskMngTaskContext_t *pContext )
435 gTaskTbl[ taskId ].context = *pContext;
441 /******************************************************************************/