/******************************************************************************/
/* src/booter/Initctrl/InitctrlA20.s */
-/* 2016/12/04 */
-/* Copyright (C) 2016 Mochi. */
+/* 2017/03/12 */
+/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
.intel_syntax noprefix
.code16
/******************************************************************************/
-/* \83O\83\8d\81[\83o\83\8b\90é\8c¾ */
+/* グローバル宣言 */
/******************************************************************************/
.global A20Enable
/******************************************************************************/
-/* TEXT\83Z\83N\83V\83\87\83\93 */
+/* TEXTセクション */
/******************************************************************************/
.section .text
/******************************************************************************/
-/* \83O\83\8d\81[\83o\83\8b\8aÖ\90\94 */
+/* グローバル関数 */
/******************************************************************************/
A20Enable:
- /* A20\83\89\83C\83\93\97L\8cø\89»\94»\92è */
+ /* A20ライン有効化判定 */
call CheckA20
cmp ax, 0
je A20Enable_0
- /* System Port A\82ð\97p\82¢\82Ä\97L\8cø\89» */
+ /* System Port Aを用いて有効化 */
in al, 0x92
- or al, 0x02 /* \97L\8cø\89» */
- and al, 0xFE /* \83V\83X\83e\83\80\83\8a\83Z\83b\83g\82ð\8am\8eÀ\82É\96h\82® */
- out 0x92, al /* \90Ý\92è */
+ or al, 0x02 /* 有効化 */
+ and al, 0xFE /* システムリセットを確実に防ぐ */
+ out 0x92, al /* 設定 */
- /* A20\83\89\83C\83\93\97L\8cø\89»\94»\92è */
+ /* A20ライン有効化判定 */
call CheckA20
cmp ax, 0
je A20Enable_0
- /* \83L\81[\83{\81[\83h\83R\83\93\83g\83\8d\81[\83\89\82ð\97p\82¢\82Ä\97L\8cø\89» */
- call waitKBC /* \93ü\97Í\8eó\95t\8am\94F */
+ /* キーボードコントローラを用いて有効化 */
+ call waitKBC /* 入力受付確認 */
mov al, 0xD1
- out 0x64, al /* \83R\83}\83\93\83h\8f\91\8d\9e\82Ý */
- call waitKBC /* \93ü\97Í\8eó\95t\8am\94F */
+ out 0x64, al /* コマンド書込み */
+ call waitKBC /* 入力受付確認 */
mov al, 0xDF
- out 0x60, al /* \97L\8cø\89» */
- call waitKBC /* \93ü\97Í\8eó\95t\8am\94F */
+ out 0x60, al /* 有効化 */
+ call waitKBC /* 入力受付確認 */
- /* A20\83\89\83C\83\93\97L\8cø\89»\94»\92è */
+ /* A20ライン有効化判定 */
call CheckA20
cmp ax, 0
je A20Enable_0
- /* BIOS\82ð\97p\82¢\82Ä\97L\8cø\89» */
+ /* BIOSを用いて有効化 */
mov ax, 0x2401
int 0x15
- /* A20\83\89\83C\83\93\97L\8cø\89»\94»\92è */
+ /* A20ライン有効化判定 */
call CheckA20
cmp ax, 0
je A20Enable_0
A20Enable_0:
- /* A20\83\89\83C\83\93\97L\8cø\89»\8e¸\94s */
+ /* A20ライン有効化失敗 */
mov ax, -1
ret
A20Enable_M1:
- /* A20\83\89\83C\83\93\97L\8cø\89»\90¬\8c÷ */
+ /* A20ライン有効化成功 */
xor ax, ax
ret
/******************************************************************************/
-/* \83\8d\81[\83J\83\8b\8aÖ\90\94 */
+/* ローカル関数 */
/******************************************************************************/
CheckA20:
- /* 0xFFFF:0x0010(0x0010_0000)\82ð\83o\83b\83N\83A\83b\83v */
+ /* 0xFFFF:0x0010(0x0010_0000)をバックアップ */
mov ax, 0xFFFF
mov fs, ax
mov ax, [ fs:0x0010 ]
push ax
- /* CPU\83L\83\83\83b\83V\83\93\83O\96³\8cø\89» */
- mov eax, cr0 /* CR0\83\8c\83W\83X\83^\8eæ\93¾ */
- or eax, 0x40000000 /* CD\83r\83b\83g\82ð1\82É\90Ý\92è */
- and eax, 0xD0000000 /* NW\83r\83b\83g\82ð0\82É\90Ý\92è */
- mov cr0, eax /* CR0\83\8c\83W\83X\83^\82É\90Ý\92è\82µ\82Ä\96³\8cø\89» */
- wbinvd /* \83L\83\83\83b\83V\83\85\83\81\83\82\83\8a\83\89\83C\83g\83o\83b\83N */
+ /* CPUキャッシング無効化 */
+ mov eax, cr0 /* CR0レジスタ取得 */
+ or eax, 0x40000000 /* CDビットを1に設定 */
+ and eax, 0xD0000000 /* NWビットを0に設定 */
+ mov cr0, eax /* CR0レジスタに設定して無効化 */
+ wbinvd /* キャッシュメモリライトバック */
- /* 0xFFFF:0x0010(0x0010_0000)\82É\92l0xC0DE\8f\91\82«\8d\9e\82Ý */
+ /* 0xFFFF:0x0010(0x0010_0000)に値0xC0DE書き込み */
mov word ptr [ fs:0x0010 ], 0xC0DE
- /* 0x0000:0x0000(0x0000_0000)\82Ì\92l\82ð\93Ç\82Ý\8d\9e\82Þ */
+ /* 0x0000:0x0000(0x0000_0000)の値を読み込む */
xor ax, ax
mov gs, ax
mov bx, [ gs:0x0000 ]
- /* 0xFFFF:0x0010(0x0010_0000)\82ð\83\8a\83X\83g\83A */
+ /* 0xFFFF:0x0010(0x0010_0000)をリストア */
pop ax
mov [ fs:0x0010 ], ax
- /* CPU\83L\83\83\83b\83V\83\93\83O\97L\8cø\89» */
- mov eax, cr0 /* CR0\83\8c\83W\83X\83^\8eæ\93¾ */
- or eax, 0x60000000 /* CD,NW\83r\83b\83g\82ð1\82É\90Ý\92è */
- mov cr0, eax /* CR0\83\8c\83W\83X\83^\82É\90Ý\92è\82µ\82Ä\97L\8cø\89» */
+ /* CPUキャッシング有効化 */
+ mov eax, cr0 /* CR0レジスタ取得 */
+ or eax, 0x60000000 /* CD,NWビットを1に設定 */
+ mov cr0, eax /* CR0レジスタに設定して有効化 */
- /* \93Ç\82Ý\8d\9e\82ñ\82¾\92l\82Æ\94ä\8ar */
+ /* 読み込んだ値と比較 */
cmp bx, 0xC0DE
je checkA20_M1
- /* A20\83\89\83C\83\93\82Í\97L\8cø */
+ /* A20ラインは有効 */
xor ax, ax
ret
checkA20_M1:
- /* A20\83\89\83C\83\93\82Í\96³\8cø */
+ /* A20ラインは無効 */
mov ax, -1
ret
waitKBC:
- /* IBF\83`\83F\83b\83N */
+ /* IBFチェック */
in al, 0x64
test al, 0x02
jnz waitKBC
/******************************************************************************/
/* src/booter/Initctrl/InitctrlCpu.s */
-/* 2016/12/04 */
-/* Copyright (C) 2016 Mochi. */
+/* 2017/03/12 */
+/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
.intel_syntax noprefix
.code16
/******************************************************************************/
-/* \83O\83\8d\81[\83o\83\8b\90é\8c¾ */
+/* グローバル宣言 */
/******************************************************************************/
.global CpuSwitchMode
/******************************************************************************/
-/* TEXT\83Z\83N\83V\83\87\83\93 */
+/* TEXTセクション */
/******************************************************************************/
.section .text
CpuSwitchMode:
- /* \8a\84\82è\8d\9e\82Ý\96³\8cø\89» */
+ /* 割り込み無効化 */
mov al, 0xFF
- out 0xA1, al /* PIC2\8a\84\82è\8d\9e\82Ý\96³\8cø\89» */
+ out 0xA1, al /* PIC2割り込み無効化 */
nop
- out 0x21, al /* PIC1\8a\84\82è\8d\9e\82Ý\96³\8cø\89» */
- cli /* CPU\8a\84\82è\8d\9e\82Ý\96³\8cø\89» */
+ out 0x21, al /* PIC1割り込み無効化 */
+ cli /* CPU割り込み無効化 */
- /* GDT\90Ý\92è */
+ /* GDT設定 */
lgdt [ pGDTR ]
- /* CR0\83\8c\83W\83X\83^\90Ý\92è */
+ /* CR0レジスタ設定 */
mov eax, cr0
- or eax, 0x00000001 /* PE\83r\83b\83gON */
- mov cr0, eax /* \95Û\8cì\83\82\81[\83h\97L\8cø\89» */
+ or eax, 0x00000001 /* PEビットON */
+ mov cr0, eax /* 保護モード有効化 */
- /* \95Û\8cì\83\82\81[\83h\88Ú\8ds\81ifar jump\81j */
+ /* 保護モード移行(far jump) */
jmp 0x8:setSegment
.code32
setSegment:
- /* \83f\81[\83^\83Z\83O\83\81\83\93\83g\8f\89\8aú\89» */
+ /* データセグメント初期化 */
mov ax, 2 * 8
mov ds, ax
mov es, ax
mov gs, ax
mov ss, ax
- /* \83X\83^\83b\83N\83|\83C\83\93\83^\95Ï\8dX */
- mov esp, 0x200000
+ /* スタックポインタ変更 */
+ mov esp, 0x03000000
- /* \83J\81[\83l\83\8b\8eÀ\8ds */
+ /* カーネル実行 */
jmp 0x00100000
/******************************************************************************/
-/* DATA\83Z\83N\83V\83\87\83\93 */
+/* DATAセクション */
/******************************************************************************/
.section .data
/* GDT */
.align 8
pGDT:
- .word 0x0000, 0x0000, 0x0000, 0x0000 /* \83i\83\8b\83Z\83O\83\81\83\93\83g */
- .word 0xFFFF, 0x0000, 0x9800, 0x00CF /* \83R\81[\83h\83Z\83O\83\81\83\93\83g */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF /* \83f\81[\83^\83Z\83O\83\81\83\93\83g */
+ .word 0x0000, 0x0000, 0x0000, 0x0000 /* ナルセグメント */
+ .word 0xFFFF, 0x0000, 0x9800, 0x00CF /* コードセグメント */
+ .word 0xFFFF, 0x0000, 0x9200, 0x00CF /* データセグメント */
/* GDTR */
pGDTR:
- .word . - pGDT - 1 /* \83\8a\83~\83b\83g */
- .long pGDT /* GDT\83x\81[\83X\83A\83h\83\8c\83X */
+ .word . - pGDT - 1 /* リミット */
+ .long pGDT /* GDTベースアドレス */
/******************************************************************************/
/******************************************************************************/
/* src/booter/Initctrl/InitctrlMain.s */
-/* 2016/12/04 */
-/* Copyright (C) 2016 Mochi. */
+/* 2017/03/12 */
+/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
.intel_syntax noprefix
.code16
/******************************************************************************/
-/* \83O\83\8d\81[\83o\83\8b\90é\8c¾ */
+/* グローバル宣言 */
/******************************************************************************/
.global InitctrlMain
/******************************************************************************/
-/* \8aO\95\94\8aÖ\90\94\90é\8c¾ */
+/* 外部関数宣言 */
/******************************************************************************/
.extern A20Enable
.extern LoaderKernel
/******************************************************************************/
-/* TEXT\83Z\83N\83V\83\87\83\93 */
+/* TEXTセクション */
/******************************************************************************/
.section .text
InitctrlMain:
- /* \83r\83f\83I\83\82\81[\83h\90Ý\92è */
+ /* ビデオモード設定 */
mov ax, 0x0003
int 0x10
- /* A20\83\89\83C\83\93\97L\8cø\89» */
+ /* A20ライン有効化 */
call A20Enable
- /* \83J\81[\83l\83\8b\93Ç\8d\9e\82Ý */
+ /* カーネル読込み */
call LoaderLoadKernel
- /* CPU\83\82\81[\83h\95Ï\8dX */
+ /* CPUモード変更 */
call CpuSwitchMode
Stop:
/******************************************************************************/
/* src/kernel/Debug/DebugLog.c */
-/* 2017/03/11 */
+/* 2017/03/12 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
{ CMN_MODULE_INTMNG_IDT, "INT-IDT " }, /* 割込管理(IDT管理) */
{ CMN_MODULE_INTMNG_HDL, "INT-HDL " }, /* 割込管理(ハンドラ管理) */
{ CMN_MODULE_TIMERMNG_INIT, "TIM-INIT" }, /* タイマ管理(初期化) */
- { CMN_MODUlE_TIMERMNG_PIT, "TIM-PIT " }, /* タイマ管理(PIT管理) */
+ { CMN_MODULE_TIMERMNG_PIT, "TIM-PIT " }, /* タイマ管理(PIT管理) */
{ CMN_MODULE_PROCMNG_INIT, "PRC-INIT" }, /* プロセス管理(初期化) */
{ CMN_MODULE_PROCMNG_TSS, "PRC-TSS " }, /* プロセス管理(TSS管理) */
{ CMN_MODULE_PROCMNG_SCHED, "PRC-SCHD" }, /* プロセス管理(スケジューラ) */
* - CMN_MODULE_INTMNG_IDT 割込管理(IDT管理)
* - CMN_MODULE_INTMNG_HDL 割込管理(ハンドラ管理)
* - CMN_MODULE_TIMERMNG_INIT タイマ管理(初期化)
- * - CMN_MODUlE_TIMERMNG_PIT タイマ管理(PIT管理)
+ * - CMN_MODULE_TIMERMNG_PIT タイマ管理(PIT管理)
* - CMN_MODULE_PROCMNG_INIT プロセス管理(初期化)
* - CMN_MODULE_PROCMNG_TSS プロセス管理(TSS管理)
* - CMN_MODULE_PROCMNG_SCHED プロセス管理(スケジューラ)
{
/* [TODO]カーネル起動引数対応まで仮 */
MochiKernelMemoryMap_t map = {
- ( void * ) 0x200000,
+ ( void * ) 0x03000000,
0x500000,
MOCHIKERNEL_MEMORY_TYPE_AVAILABLE };
TimerMngInit();
/* デバッグトレースログ出力 */
- DEBUG_LOG( "hlt!!!" );
+ DEBUG_LOG( "Idle running." );
/* アイドル(仮) */
while ( 1 ) {
/******************************************************************************/
/* デバッグトレースログ出力マクロ */
#ifdef DEBUG_LOG_ENABLE
-#define DEBUG_LOG( ... ) \
- DebugLogOutput( CMN_MODULE_INT_HDL, \
- __LINE__, \
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_INTMNG_HDL, \
+ __LINE__, \
__VA_ARGS__ )
#else
#define DEBUG_LOG( ... )
{
uint32_t intNo; /* 割込み番号 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 全割込み番号毎に繰り返し */
for ( intNo = INTMNG_INT_NO_MIN;
intNo <= INTMNG_INT_NO_MAX;
IA32_DESCRIPTOR_DPL_3 ); /* 特権レベル */
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
/* src/kernel/IntMng/IntMngIdt.c */
-/* 2017/03/11 */
+/* 2017/03/12 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/* デバッグトレースログ出力マクロ */
#ifdef DEBUG_LOG_ENABLE
-#define DEBUG_LOG( ... ) \
- DebugLogOutput( CMN_MODULE_INT_IDT, \
- __LINE__, \
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_INTMNG_IDT, \
+ __LINE__, \
__VA_ARGS__ )
#else
#define DEBUG_LOG( ... )
/******************************************************************************/
void IntMngIdtInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* IDT初期化 */
memset( gIdt, 0, sizeof ( gIdt ) );
/* IDTR設定 */
IA32InstructionLidt( ( IA32Descriptor_t * ) gIdt, sizeof ( gIdt ) - 1 );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
uint8_t type,
uint8_t level )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. index=%#x, selector=%u, ",
+ __func__,
+ index,
+ selector );
+ DEBUG_LOG( " pOffset=%010p, count=%u, type=%#x, level=%u",
+ pOffset,
+ count,
+ type,
+ level );
+
/* ディスクリプタ設定 */
gIdt[ index ].offset_low = IA32_DESCRIPTOR_OFFSET_LOW( pOffset );
gIdt[ index ].selector = selector;
gIdt[ index ].attr_p = IA32_DESCRIPTOR_P_YES;
gIdt[ index ].offset_high = IA32_DESCRIPTOR_OFFSET_HIGH( pOffset );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/* デバッグトレースログ出力マクロ */
#ifdef DEBUG_LOG_ENABLE
#define DEBUG_LOG( ... ) \
- DebugLogOutput( CMN_MODULE_INT_INIT, \
+ DebugLogOutput( CMN_MODULE_INTMNG_INIT, \
__LINE__, \
__VA_ARGS__ )
#else
/******************************************************************************/
void IntMngInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* IDT管理サブモジュール初期化 */
IntMngIdtInit();
/* PIC管理サブモジュール初期化 */
IntMngPicInit();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
return;
}
/* デバッグトレースログ出力マクロ */
#ifdef DEBUG_LOG_ENABLE
#define DEBUG_LOG( ... ) \
- DebugLogOutput( CMN_MODULE_INI_INIT, \
+ DebugLogOutput( CMN_MODULE_INTMNG_INIT, \
__LINE__, \
__VA_ARGS__ )
#else
/******************************************************************************/
void IntMngPicInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* PIC2(スレーブ)設定 */
IA32InstructionOutByte( I8259A_S_PORT_ICW1, 0x11 );
IA32InstructionOutByte( I8259A_S_PORT_ICW2, 0x28 );
/* 割込み無効化 */
IntMngPicDisable();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void IntMngPicAllowIrq( uint8_t irqNo )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. irqNo=%u", __func__, irqNo );
+
/* PIC割込み番号判定 */
if ( ( irqNo >= I8259A_IRQ0 ) &&
( irqNo <= I8259A_IRQ7 ) ) {
IntMngPicEnable();
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void IntMngPicDenyIrq( uint8_t irqNo )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. irqNo=%u", __func__, irqNo );
+
/* PIC割込み番号判定 */
if ( ( irqNo >= I8259A_IRQ0 ) &&
( irqNo <= I8259A_IRQ7 ) ) {
IntMngPicEnable();
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void IntMngPicDisable( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 割込みマスク状態変更 */
gPicTbl.maskState = PIC_MASK_STATE_DISABLE;
/* PIC2(スレーブ)割込みマスク設定 */
IA32InstructionOutByte( I8259A_S_PORT_OCW1, 0xFF );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void IntMngPicEnable( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 割込みマスク状態変更 */
gPicTbl.maskState = PIC_MASK_STATE_ENABLE;
/* PIC2(スレーブ)割込みマスク設定 */
IA32InstructionOutByte( I8259A_S_PORT_OCW1, gPicTbl.mask[ PIC_SLAVE ] );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void IntMngPicEoi( uint8_t irqNo )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. irqNo=%u", __func__, irqNo );
+
/* PIC割込み番号判定 */
if ( ( irqNo >= I8259A_IRQ0 ) &&
( irqNo <= I8259A_IRQ7 ) ) {
I8259A_IRQ2 );
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
/* src/kernel/MemMng/MemMngArea.c */
-/* 2017/03/11 */
+/* 2017/03/12 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
pAddr = NULL;
pFree = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. size=%#x", __func__, size );
+
/* サイズチェック */
if ( size == 0 ) {
/* 不正 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
} else {
if ( pFree == NULL ) {
/* メモリ領域情報無 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
}
pAddr = AreaAllocPartially( pFree, size );
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%010p", __func__, pAddr );
+
return pAddr;
}
pFree = NULL;
pInfo = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pAddr=%010p", __func__, pAddr );
+
/* 引数チェック */
if ( pAddr == NULL ) {
/* 不正 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
if ( pInfo == NULL ) {
/* メモリ領域情報無 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
break;
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, ret );
+
return ret;
}
void MemMngAreaInit( MochiKernelMemoryMap_t *pMap,
size_t mapSize )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 空メモリ領域情報リスト初期化 */
AreaInitEmptyList();
/* 使用中メモリ領域リスト初期化 */
AreaInitUsedList();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
{
MLibRet_t retMLib; /* MLib関数戻り値 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pFree=%010p", __func__, pFree );
+
/* 未使用メモリ領域リストから削除 */
retMLib = MLibBasicListRemove( &( gAreaTbl.freeList ),
( MLibBasicListNode_t * ) pFree );
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
}
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%010p", __func__, pFree->pAddr );
+
/* メモリ領域先頭アドレス返却 */
return pFree->pAddr;
}
/* 初期化 */
retMLib = MLIB_FAILURE;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pFree=%010p, size=%#x", __func__, pFree, size );
+
/* 空メモリ領域情報リストからメモリ領域情報取得 */
pEmpty = ( AreaInfo_t * )
MLibBasicListRemoveTail( &( gAreaTbl.emptyList ) );
if ( pEmpty == NULL ) {
/* メモリ領域情報無 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
}
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=NULL", __func__ );
+
return NULL;
}
pFree->pAddr += size; /* 先頭アドレス */
pFree->size -= size; /* サイズ */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%010p", __func__, pEmpty->pAddr );
+
/* メモリ領域先頭アドレス返却 */
return pEmpty->pAddr;
}
retMLib = MLIB_FAILURE;
pNext = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pFree=%010p, pUsed=%010p", __func__, pFree, pUsed );
+
/* メモリ領域位置関係比較 */
if ( pUsed->pAddr > pFree->pAddr ) {
/* 使用中メモリ領域が未使用メモリ領域の前 */
if ( pNext == NULL ) {
/* メモリ領域情報無 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_SUCCESS );
+
return CMN_SUCCESS;
}
/* 未使用メモリ領域サイズ復元 */
pFree->size = size;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
}
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_SUCCESS );
+
return CMN_SUCCESS;
}
{
MLibRet_t retMLib; /* MLib関数戻り値 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pUsed=%010p", __func__, pUsed );
+
/* 最後尾挿入 */
retMLib = MLibBasicListInsertTail( &( gAreaTbl.freeList ),
( MLibBasicListNode_t * ) pUsed );
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_SUCCESS );
+
return CMN_SUCCESS;
}
{
MLibRet_t retMLib; /* MLib関数戻り値 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pFree=%010p, pUsed=%010p", __func__, pFree, pUsed );
+
/* 指定した未使用メモリ領域の前に挿入 */
retMLib = MLibBasicListInsertPrev( &( gAreaTbl.freeList ),
( MLibBasicListNode_t * ) pFree,
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_SUCCESS );
+
return CMN_SUCCESS;
}
MLibRet_t retMLib; /* MLIB関数戻り値 */
MLibBasicListNode_t *pEmpty; /* 空メモリ領域情報ノード */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 空メモリ領域情報リスト初期化 */
retMLib = MLibBasicListInit( &( gAreaTbl.emptyList ) );
/* 失敗 */
/* [TODO]カーネルパニック */
+ DEBUG_LOG( "ERROR!!! retMLib=%d", retMLib );
}
/* メモリ領域情報初期化 */
/* 失敗 */
/* [TODO]カーネルパニック */
+ DEBUG_LOG( "ERROR!!! retMLib=%d", retMLib );
}
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
pEmpty = NULL;
pEntry = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pMap=%010p, mapSize=%u", __func__, pMap, mapSize );
+
/* 未使用メモリ領域リスト初期化 */
retMLib = MLibBasicListInit( &( gAreaTbl.freeList ) );
}
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
{
MLibRet_t retMLib; /* MLIB関数戻り値 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 使用中メモリ領域リスト初期化 */
retMLib = MLibBasicListInit( &( gAreaTbl.usedList ) );
/* 失敗 */
/* [TODO]カーネルパニック */
+ DEBUG_LOG( "ERROR!!! retMLib=%d", retMLib );
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void MemMngGdtInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* GDTR設定 */
IA32InstructionLgdt( gGdt, sizeof ( gGdt ) - 1 );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
uint16_t index; /* GDTエントリ番号 */
IA32DescriptorSeg_t *pDescriptor; /* セグメントディスクリプタ */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pBase=%010p, limit=%u, ",
+ __func__,
+ pBase,
+ limit );
+ DEBUG_LOG( " limitG=%u, sysFlg=%u, type=%u, level=%u, opSize=%u",
+ limitG,
+ sysFlg,
+ type,
+ level,
+ opSize );
+
/* 空きディスクリプタ検索 */
- for ( index = MEMMNG_GDT_ENTRY_MIN;
- index < MEMMNG_GDT_ENTRY_MAX;
+ for ( index = MEMMNG_GDT_ENTRY_MIN;
+ index <= MEMMNG_GDT_ENTRY_MAX;
index++ ) {
/* 参照変数設定 */
pDescriptor = &( gGdt[ index ].seg );
pDescriptor->attr_g = limitG;
pDescriptor->base_high = IA32_DESCRIPTOR_BASE_HIGH( pBase );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%#x", __func__, index );
+
return index;
}
}
+ /* デバッグトレースログ */
+ DEBUG_LOG( "%s() end. ret=%#x", __func__, MEMMNG_GDT_ENTRY_FULL );
+
/* 空き無しによる追加失敗 */
return MEMMNG_GDT_ENTRY_FULL;
}
void MemMngInit( MochiKernelMemoryMap_t *pMap,
size_t mapSize )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* GDT管理サブモジュール初期化 */
MemMngGdtInit();
/* メモリ領域管理サブモジュール初期化 */
MemMngAreaInit( pMap, mapSize );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void ProcMngInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* TSS管理サブモジュール初期化 */
ProcMngTssInit();
/* スケジューラサブモジュール初期化 */
ProcMngSchedInit();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngSched.c */
-/* 2017/03/11 */
+/* 2017/03/12 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
{
schedTaskInfo_t *pTaskInfo; /* タスク情報 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. taskId=%u", __func__, taskId );
+
/* 空タスクキューから空タスク情報取得 */
pTaskInfo =
( schedTaskInfo_t * ) MLibBasicListRemoveTail( &( gSchedTbl.freeQ ) );
if ( pTaskInfo == NULL ) {
/* 空タスク情報無し */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_FAILURE );
+
return CMN_FAILURE;
}
/* 実行予約タスクグループにエンキュー */
SchedEnqueueToReservedGrp( pTaskInfo );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%d", __func__, CMN_SUCCESS );
+
return CMN_SUCCESS;
}
pRunningGrp = NULL;
pTaskInfo = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* 実行中タスク判定 */
if ( nowTaskId == PROCMNG_TASK_ID_IDLE ) {
/* アイドルタスク */
/* 再スケジューリング */
ProcMngSchedExec();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
}
/* タスクスイッチ */
SchedSwitchTask( nowTaskId, pTaskInfo->taskId );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
MLibRet_t retMLib; /* MLib関数戻り値 */
schedTaskInfo_t *pIdleTaskInfo; /* アイドルタスク情報 */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* スケジューラテーブル0初期化 */
memset( &gSchedTbl, 0, sizeof ( schedTbl_t ) );
/* エンキュー */
retMLib = MLibBasicListInsertHead( &( gSchedTbl.freeQ ),
&( gSchedTbl.taskInfo[ i ].node ) );
-
/* エンキュー結果判定 */
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
}
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
pReservedGrp = &gSchedTbl.runGrp[ gSchedTbl.reservedGrpIdx ];
retMLib = MLIB_FAILURE;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pTaskInfo=%010p", __func__, pTaskInfo );
+
/* タスクタイプ取得 */
taskType = ProcMngTaskGetType( pTaskInfo->taskId );
/* [TODO] トレース出力 */
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
static void SchedSwitchRunGrpRole( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* グループ役割切替 */
gSchedTbl.runningGrpIdx ^= 1;
gSchedTbl.reservedGrpIdx ^= 1;
/* タスク実行済みフラグ初期化 */
gSchedTbl.runFlg = false;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
void *pKernelStack; /* カーネルスタック */
ProcMngTaskContext_t context; /* コンテキスト */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. nowTaskId=%u, nextTaskId=%u",
+ __func__,
+ nowTaskId,
+ nextTaskId );
+
/* 初期化 */
memset( &context, 0, sizeof ( ProcMngTaskContext_t ) );
/* ラベル */
__asm__ __volatile__ ( "SchedSwitchTaskEnd:" );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
taskId = PROCMNG_TASK_ID_MIN;
pStackInfo = NULL;
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. taskType=%u, pEntryPoint=%010p",
+ __func__,
+ taskType,
+ pEntryPoint );
+
/* 空タスク検索 */
for ( ; taskId < PROCMNG_TASK_ID_MAX; taskId++ ) {
/* 使用フラグ判定 */
return PROCMNG_TASK_ID_NULL;
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%u", __func__, taskId );
+
return taskId;
}
}
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=%u", __func__, PROCMNG_TASK_ID_NULL );
+
return PROCMNG_TASK_ID_NULL;
}
/******************************************************************************/
void ProcMngTaskInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* タスク管理テーブル初期化 */
memset( gTaskTbl, 0, sizeof ( gTaskTbl ) );
/* アイドルタスク設定 */
gTaskTbl[ PROCMNG_TASK_ID_IDLE ].used = TASK_ID_USED; /* 使用フラグ */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
pStack = pTask->stackInfo.pBottomAddr; /* スタックアドレス */
taskType = pTask->type; /* タスクタイプ */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* タスクタイプ判定 */
if ( taskType == PROCMNG_TASK_TYPE_DRIVER ) {
/* ドライバ */
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTss.c */
-/* 2017/03/11 */
+/* 2017/03/12 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
uint16_t index; /* GDTエントリ番号 */
uint16_t selector; /* セグメントセレクタ */
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* TSS初期化 */
memset( &gTss, 0, sizeof ( IA32Tss_t ) );
/* TR設定 */
IA32InstructionLtr( selector );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void TimerMngInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* PIT管理サブモジュール初期化 */
TimerMngPitInit();
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
void TimerMngPitInit( void )
{
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+
/* PIT(カウンタ0)初期化 */
IA32InstructionOutByte( I8254_PORT_CTRLW,
( I8254_CTRLW_SC_CNTR0 |
/* 割込み許可設定 */
IntMngPicAllowIrq( I8259A_IRQ0 );
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
return;
}
/******************************************************************************/
/* src/kernel/include/Cmn.h */
-/* 2017/03/06 */
+/* 2017/03/11 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef CMN_H
#define CMN_MODULE_INTMNG_IDT ( 0x0303 ) /**< 割込管理(IDT管理) */
#define CMN_MODULE_INTMNG_HDL ( 0x0304 ) /**< 割込管理(ハンドラ管理) */
#define CMN_MODULE_TIMERMNG_INIT ( 0x0401 ) /**< タイマ管理(初期化) */
-#define CMN_MODUlE_TIMERMNG_PIT ( 0x0402 ) /**< タイマ管理(PIT管理) */
+#define CMN_MODULE_TIMERMNG_PIT ( 0x0402 ) /**< タイマ管理(PIT管理) */
#define CMN_MODULE_PROCMNG_INIT ( 0x0501 ) /**< プロセス管理(初期化) */
#define CMN_MODULE_PROCMNG_TSS ( 0x0502 ) /**< プロセス管理(TSS管理) */
#define CMN_MODULE_PROCMNG_SCHED ( 0x0503 ) /**< プロセス管理(スケジューラ) */
/** セグメントセレクタマクロ */
#define IA32_SEGMENT_SELECTOR( _INDEX, _TI, _RPL ) \
- ( ( uint16_t ) ( ( ( _INDEX ) << 3 ) + ( ( _TI ) << 2 ) + ( _RPL ) ) )
+ ( ( uint16_t ) ( ( ( _INDEX ) << 3 ) | ( ( _TI ) << 2 ) | ( _RPL ) ) )
/* EFLAGSレジスタ */
#define IA32_EFLAGS_ID ( 0x00200000 )
/******************************************************************************/
/* src/libraries/libc/string/memset.c */
-/* 2016/12/13 */
-/* Copyright (C) 2016 Mochi. */
+/* 2017/03/12 */
+/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* インクルード */
{
/* 1バイト毎に終端バイトから繰り返し */
while ( n > 0 ) {
+ /* コピーカウント更新 */
+ n--;
+
/* コピー値代入 */
*( ( uint8_t * ) s + n ) = ( uint8_t ) c;
- n--;
}
return s;
#******************************************************************************#\r
#* vm/vmware/mochi.vmx *#\r
-#* 2016/12/04 *#\r
-#* Copyright (C) 2016 Mochi. *#\r
+#* 2017/03/11 *#\r
+#* Copyright (C) 2016-2017 Mochi. *#\r
#******************************************************************************#\r
# VMware基本設定\r
.encoding = "UTF-8"\r
gui.exitOnCLIHLT = "FALSE"\r
\r
# メモリサイズ (MB)\r
-memsize = "32"\r
+memsize = "64"\r
\r
# IDE\r
ide0:0.present = "TRUE"\r