/******************************************************************************/
/* src/kernel/InitCtrl/InitCtrlInit.c */
-/* 2017/03/11 */
+/* 2017/03/18 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* タイマ管理モジュール初期化 */
TimerMngInit();
+ /* 割込み有効化 */
+ IntMngPicEnable();
+ IA32InstructionSti();
+
/* デバッグトレースログ出力 */
DEBUG_LOG( "Idle running." );
/******************************************************************************/
/* src/kernel/IntMng/IntMngHdl.c */
-/* 2017/03/11 */
+/* 2017/03/16 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
gHdlCmnProcTbl[ intNo ], /* オフセット */
0, /* 引数コピーカウント */
IA32_DESCRIPTOR_TYPE_GATE32_INT, /* タイプ */
- IA32_DESCRIPTOR_DPL_3 ); /* 特権レベル */
+ IA32_DESCRIPTOR_DPL_0 ); /* 特権レベル */
}
/* デバッグトレースログ出力 */
/******************************************************************************/
static void HdlIgnore( uint32_t intNo )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() intNo=%d", __func__, intNo );__asm__ __volatile__("hlt");
+
/* 何もしない */
return;
}
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngSched.c */
-/* 2017/03/12 */
+/* 2017/03/18 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
pTaskInfo = NULL;
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start.", __func__ );
+ /*DEBUG_LOG( "%s() start.", __func__ );*/
/* 実行中タスク判定 */
if ( nowTaskId == PROCMNG_TASK_ID_IDLE ) {
} else {
/* アイドルタスク以外 */
+ /* タスク実行済みフラグ設定 */
+ gSchedTbl.runFlg = true;
+
/* 実行予約タスクグループにキューイング */
SchedEnqueueToReservedGrp( gSchedTbl.pRunningTaskInfo );
}
/* 実行可能タスクグループ役割切替 */
SchedSwitchRunGrpRole();
- /* å\86\8dã\82¹ã\82±ã\82¸ã\83¥ã\83¼ã\83ªã\83³ã\82° */
- ProcMngSchedExec();
+ /* å®\9fè¡\8cä¸ã\82¿ã\82¹ã\82¯ã\82°ã\83«ã\83¼ã\83\97è¨å®\9a */
+ pRunningGrp = &gSchedTbl.runGrp[ gSchedTbl.runningGrpIdx ];
- /* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /* 実行中レベル初期化 */
+ level = SCHED_LEVEL_DRIVER;
- return;
+ /* 再スケジューリング */
+ continue;
}
}
SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /*DEBUG_LOG( "%s() end.", __func__ );*/
return;
}
retMLib = MLIB_FAILURE;
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start. pTaskInfo=%010p", __func__, pTaskInfo );
+ /*DEBUG_LOG( "%s() start. pTaskInfo=%010p", __func__, pTaskInfo );*/
/* タスクタイプ取得 */
taskType = ProcMngTaskGetType( pTaskInfo->taskId );
}
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /*DEBUG_LOG( "%s() end.", __func__ );*/
return;
}
static void SchedSwitchRunGrpRole( void )
{
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start.", __func__ );
+ /*DEBUG_LOG( "%s() start.", __func__ );*/
/* グループ役割切替 */
gSchedTbl.runningGrpIdx ^= 1;
gSchedTbl.runFlg = false;
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /*DEBUG_LOG( "%s() end.", __func__ );*/
return;
}
* @param[in] nextTaskId タスクスイッチ先タスクID
*/
/******************************************************************************/
-static void SchedSwitchTask( uint32_t nowTaskId,
- uint32_t nextTaskId )
+static __attribute__ ( ( noinline ) )
+ void SchedSwitchTask( uint32_t nowTaskId,
+ uint32_t nextTaskId )
{
void *pKernelStack; /* カーネルスタック */
ProcMngTaskContext_t context; /* コンテキスト */
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
+ /*DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
__func__,
nowTaskId,
- nextTaskId );
+ nextTaskId );*/
/* 初期化 */
memset( &context, 0, sizeof ( ProcMngTaskContext_t ) );
/* コンテキスト退避 */
context.eip = ( uint32_t ) SchedSwitchTaskEnd;
context.esp = IA32InstructionGetEsp();
+ context.ebp = IA32InstructionGetEbp();
ProcMngTaskSetContext( nowTaskId, &context );
/* コンテキスト復旧 */
/* タスクスイッチ */
IA32InstructionSwitchTask( ( void * ) context.eip,
- ( void * ) context.esp );
+ ( void * ) context.esp,
+ ( void * ) context.ebp );
/* ラベル */
__asm__ __volatile__ ( "SchedSwitchTaskEnd:" );
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /*DEBUG_LOG( "%s() end.", __func__ );*/
return;
}
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.c */
-/* 2017/03/11 */
+/* 2017/03/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
#define TASK_ID_USED ( 1 ) /** 使用済 */
/* スタックサイズ */
-#define TASK_KERNEL_STACK_SIZE ( 8192 ) /**< カーネルスタックサイズ */
-#define TASK_STACK_SIZE ( 8192 ) /**< スタックサイズ */
+#define TASK_KERNEL_STACK_SIZE ( 1024000 ) /**< カーネルスタックサイズ */
+#define TASK_STACK_SIZE ( 1024000 ) /**< スタックサイズ */
/** タスクスタック情報 */
typedef struct {
gTaskTbl[ taskId ].type = taskType;
gTaskTbl[ taskId ].state = 0;
gTaskTbl[ taskId ].context.eip = ( uint32_t ) ProcMngTaskStart;
- gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack;
+ gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack + TASK_KERNEL_STACK_SIZE;
gTaskTbl[ taskId ].pEntryPoint = pEntryPoint;
/* カーネルスタック情報設定 */
uint32_t dataSegSel; /* データセグメントセレクタ */
taskTbl_t *pTask; /* タスク管理情報 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 初期化 */
taskId = ProcMngSchedGetTaskId(); /* タスクID */
pTask = &( gTaskTbl[ taskId ] ); /* タスク管理情報 */
taskType = pTask->type; /* タスクタイプ */
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start.", __func__ );
+ DEBUG_LOG( "taskId=%d, pEntryPoint=%p, pStack=%p",
+ taskId,
+ pEntryPoint,
+ pStack );
/* タスクタイプ判定 */
if ( taskType == PROCMNG_TASK_TYPE_DRIVER ) {
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.h */
-/* 2017/03/01 */
+/* 2017/03/18 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef PROCMNG_TASK_H
typedef struct {
uint32_t eip; /**< eipレジスタ */
uint32_t esp; /**< espレジスタ */
+ uint32_t ebp; /**< ebpレジスタ */
} ProcMngTaskContext_t;
/* TSS初期化 */
memset( &gTss, 0, sizeof ( IA32Tss_t ) );
+ /* TSS設定 */
+ gTss.ss0 = MEMMNG_SEGSEL_KERNEL_DATA;
+
/* TSSディスクリプタ設定 */
index = MemMngGdtAdd(
&gTss, /* セグメントベース */
/******************************************************************************/
/* src/kernel/include/hardware/IA32/IA32Instruction.h */
-/* 2017/01/09 */
+/* 2017/03/18 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
#ifndef IA32_INSTRUCTION_H
/******************************************************************************/
/**
+ * @brief ebpレジスタ値取得
+ * @details ebpレジスタの値を返す。
+ *
+ * @return ebpレジスタ値
+ */
+/******************************************************************************/
+static inline uint32_t IA32InstructionGetEbp( void )
+{
+ uint32_t ebp; /* ebpレジスタ値 */
+
+ /* mov命令実行 */
+ __asm__ __volatile__ ( "mov %0, ebp"
+ : "=m" ( *&ebp )
+ :
+ : );
+
+ return ebp;
+}
+
+
+/******************************************************************************/
+/**
* @brief espレジスタ値取得
* @details espレジスタの値を返す。
*
/******************************************************************************/
/**
* @brief タスクスイッチ
- * @details 指定したスタックポインタをespレジスタに設定し、jmp命令を用いて
- * 指定したアドレスを実行する。
+ * @details 指定したスタックポインタをespレジスタに、ベースポインタをebpレ
+ * ジスタに設定し、jmp命令を用いて指定したアドレスを実行する。
*
* @param[in] *pEip 移動先アドレス
* @param[in] *pEsp スタックポインタ
+ * @param[in] *pEbp ベースポインタ
*/
/******************************************************************************/
static inline void IA32InstructionSwitchTask( void *pEip,
- void *pEsp )
+ void *pEsp,
+ void *pEbp )
{
/* タスクスイッチ */
__asm__ __volatile__ ( "mov eax, %0\n"
"mov esp, %1\n"
+ "mov ebp, %2\n"
"jmp eax"
:
- : "m" ( pEip ), "m" ( pEsp )
- : );
+ : "m" ( pEip ), "m" ( pEsp ), "m" ( pEbp )
+ : );
}