/******************************************************************************/
/* src/include/MLib/Basic/MLibBasic.h */
-/* 2017/02/11 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi */
/******************************************************************************/
#ifndef _MLIB_BASIC_H_
/* 定義 */
/******************************************************************************/
/** アライメント計算マクロ */
-#define MLIB_BASIC_ALIGN( _VALUE, _ALIGNMENT ) \
+#define MLIB_BASIC_ALIGN( _VALUE, _ALIGNMENT ) \
( ( ( _VALUE ) + ( ( _ALIGNMENT ) - 1 ) ) & ~( ( _ALIGNMENT ) - 1 ) )
+/** フラグ判定マクロ */
+#define MLIB_BASIC_IS_FLAG( _VALUE, _FLAG ) \
+ ( ( ( _VALUE ) & ( _FLAG ) ) == ( _FLAG ) )
+
/******************************************************************************/
#endif
--- /dev/null
+/******************************************************************************/
+/* src/include/elf.h */
+/* 2017/06/16 */
+/* Copyright (C) 2017 Mochi */
+/******************************************************************************/
+#ifndef _ELF_H_
+#define _ELF_H_
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stdint.h>
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* ELF識別インデックス */
+#define EI_MAG0 ( 0 ) /** ファイル識別 */
+#define EI_MAG1 ( 1 ) /** ファイル識別 */
+#define EI_MAG2 ( 2 ) /** ファイル識別 */
+#define EI_MAG3 ( 3 ) /** ファイル識別 */
+#define EI_CLASS ( 4 ) /** ファイルクラス */
+#define EI_DATA ( 5 ) /** データエンコーディング */
+#define EI_VERSION ( 6 ) /** ファイルバージョン */
+#define EI_OSABI ( 7 ) /** OS/ABI識別 */
+#define EI_ABIVERSION ( 8 ) /** ABIバージョン */
+#define EI_PAD ( 9 ) /** パディング開始 */
+#define EI_NIDENT ( 16 ) /** ELF識別フィールド長 */
+
+/* ファイル識別 */
+#define ELFMAG0 ( 0x7F ) /** ファイル識別子 */
+#define ELFMAG1 ( 'E' ) /** ファイル識別子 */
+#define ELFMAG2 ( 'L' ) /** ファイル識別子 */
+#define ELFMAG3 ( 'F' ) /** ファイル識別子 */
+
+/* ファイルクラス */
+#define ELFCLASSNONE ( 0 ) /** 無効クラス */
+#define ELFCLASS32 ( 1 ) /** 32bitオブジェクト */
+#define ELFCLASS64 ( 2 ) /** 64bitオブジェクト */
+
+/* データエンコーディング */
+#define ELFDATANONE ( 0 ) /** 無効データエンコーディング */
+#define ELFDATA2LSB ( 1 ) /** 2の補数、リトルエンディアン */
+#define ELFDATA2MSB ( 2 ) /** 2の補数、ビッグエンディアン */
+
+/* オブジェクトファイルタイプ */
+#define ET_NONE ( 0 ) /** ファイルタイプ無し */
+#define ET_REL ( 1 ) /** 再配置可能ファイル */
+#define ET_EXEC ( 2 ) /** 実行可能ファイル */
+#define ET_DYN ( 3 ) /** 共有オブジェクトファイル */
+#define ET_CORE ( 4 ) /** コアファイル */
+#define ET_LOOS ( 0xFE00 ) /** OS固有(最小値) */
+#define ET_HIOS ( 0xFEFF ) /** OS固有(最大値) */
+#define ET_LOPROC ( 0xFF00 ) /** プロセッサ固有(最小値) */
+#define ET_HIPROC ( 0xFFFF ) /** プロセッサ固有(最大値) */
+
+/* マシンアーキテクチャ */
+#define EM_NONE ( 0 ) /** マシンアーキテクチャ未定義 */
+#define EM_M32 ( 1 ) /** AT&T WE 32100 */
+#define EM_SPARC ( 2 ) /** SPARC */
+#define EM_386 ( 3 ) /** Intelアーキテクチャ */
+#define EM_68K ( 4 ) /** Motorola 68000 */
+#define EM_88K ( 5 ) /** Motorola 88000 */
+#define EM_860 ( 7 ) /** Intel 80860 */
+#define EM_MIPS ( 8 ) /** MIPS R3000 ビッグエンディアン */
+
+/* オブジェクトファイルバージョン */
+#define EV_NONE ( 0 ) /** 不正バージョン */
+#define EV_CURRENT ( 1 ) /** カレントバージョン */
+
+/* セグメントタイプ */
+#define PT_NULL ( 0 ) /** 未使用セグメント */
+#define PT_LOAD ( 1 ) /** ロード可能セグメント */
+#define PT_DYNAMIC ( 2 ) /** 動的リンク情報 */
+#define PT_INTERP ( 3 ) /** インタプリタ情報 */
+#define PT_NOTE ( 4 ) /** 補足情報 */
+#define PT_SHLIB ( 5 ) /** 未定義セグメント */
+#define PT_PHDR ( 6 ) /** プログラムヘッダテーブル */
+
+/* フラグ */
+#define PF_X ( 0x00000001 ) /** 実行可能セグメント */
+#define PF_W ( 0x00000002 ) /** 書込み可能セグメント */
+#define PF_R ( 0x00000004 ) /** 読込み可能セグメント */
+
+/* 32bitデータ型 */
+typedef uint32_t Elf32_Addr; /** プログラムアドレス */
+typedef uint16_t Elf32_Half; /** 符号無2バイト整数 */
+typedef uint32_t Elf32_Off; /** ファイルオフセット */
+typedef int32_t Elf32_Sword; /** 符号有4バイト整数 */
+typedef uint32_t Elf32_Word; /** 符号無4バイト整数 */
+
+/** ELFヘッダ */
+typedef struct {
+ unsigned char e_ident[ EI_NIDENT ]; /**< ELF識別 */
+ Elf32_Half e_type; /**< オブジェクトファイルタイプ */
+ Elf32_Half e_machine; /**< マシンアーキテクチャ */
+ Elf32_Word e_version; /**< オブジェクトファイルバージョン */
+ Elf32_Addr e_entry; /**< エントリポイント(仮想アドレス) */
+ Elf32_Off e_phoff; /**< PHTファイルオフセット */
+ Elf32_Off e_shoff; /**< SHTファイルオフセット */
+ Elf32_Word e_flags; /**< プロセッサ固有フラグ */
+ Elf32_Half e_ehsize; /**< ELFヘッダサイズ */
+ Elf32_Half e_phentsize; /**< PHTエントリサイズ */
+ Elf32_Half e_phnum; /**< PHTエントリ数 */
+ Elf32_Half e_shentsize; /**< SHTエントリサイズ */
+ Elf32_Half e_shnum; /**< SHTエントリ数 */
+ Elf32_Half e_shstrndx; /**< SHTインデックス */
+} Elf32_Ehdr;
+
+/** プログラムヘッダ */
+typedef struct {
+ Elf32_Word p_type; /**< セグメントタイプ */
+ Elf32_Off p_offset; /**< ファイルオフセット */
+ Elf32_Addr p_vaddr; /**< 仮想メモリアドレス */
+ Elf32_Addr p_paddr; /**< 物理メモリアドレス */
+ Elf32_Word p_filesz; /**< ファイルサイズ */
+ Elf32_Word p_memsz; /**< メモリサイズ */
+ Elf32_Word p_flags; /**< フラグ */
+ Elf32_Word p_align; /**< アライメント値 */
+} Elf32_Phdr;
+
+
+/******************************************************************************/
+#endif
/******************************************************************************/
/* src/kernel/Debug/DebugLog.c */
-/* 2017/05/24 */
+/* 2017/05/31 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
{ CMN_MODULE_PROCMNG_TSS, "PRC-TSS " }, /* プロセス管理(TSS管理) */
{ CMN_MODULE_PROCMNG_SCHED, "PRC-SCHD" }, /* プロセス管理(スケジューラ) */
{ CMN_MODULE_PROCMNG_TASK, "PRC-TASK" }, /* プロセス管理(タスク管理) */
+ { CMN_MODULE_PROCMNG_ELF, "PRC-ELF " }, /* プロセス管理(ELFローダ) */
{ CMN_MODULE_DEBUG_INIT, "DBG-INIT" }, /* デバッグ制御(初期化) */
{ CMN_MODULE_DEBUG_LOG, "DBG-LOG " }, /* デバッグ制御(ログ管理) */
{ 0, "UNKNOWN " } };/* 終端 */
#******************************************************************************#
#* src/kernel/Makefile *#
-#* 2017/05/18 *#
+#* 2017/06/01 *#
#* Copyright (C) 2016-2017 Mochi. *#
#******************************************************************************#
#******************************************************************************#
ProcMng/ProcMngTss.c \
ProcMng/ProcMngTask.c \
ProcMng/ProcMngSched.c \
+ ProcMng/ProcMngElf.c \
Debug/DebugInit.c \
Debug/DebugLog.c
/******************************************************************************/
/* src/kernel/MemMng/MemMngCtrl.c */
-/* 2017/05/19 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
#include <stdint.h>
#include <string.h>
#include <hardware/IA32/IA32Paging.h>
+#include <MLib/Basic/MLibBasic.h>
/* 外部モジュールヘッダ */
#include <Cmn.h>
+#include <Config.h>
#include <Debug.h>
#include <MemMng.h>
/******************************************************************************/
/* デバッグトレースログ出力マクロ */
#ifdef DEBUG_LOG_ENABLE
-#define DEBUG_LOG( ... ) \
- DebugLogOutput( CMN_MODULE_MEMMNG_CTRL, \
- __LINE__, \
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_MEMMNG_CTRL, \
+ __LINE__, \
__VA_ARGS__ )
#else
#define DEBUG_LOG( ... )
#endif
-/* 物理マッピング用領域定義 */
-#define CTRL_MAP_ADDR1 ( 0x3F000000 ) /** 物理マッピング用領域1先頭アドレス */
-#define CTRL_MAP_ADDR2 ( 0x3F800000 ) /** 物理マッピング用領域2先頭アドレス */
-#define CTRL_MAP_SIZE ( 0x01000000 ) /** 物理マッピング用領域全サイズ */
-#define CTRL_MAP_SIZE1 ( 0x00800000 ) /** 物理マッピング用領域1サイズ */
-#define CTRL_MAP_SIZE2 ( 0x00800000 ) /** 物理マッピング用領域2サイズ */
-
/******************************************************************************/
/* グローバル関数定義 */
* @param[in] pVAddr コピー元仮想アドレス
* @param[in] size コピーサイズ
*
- * @attention 引数pPhysAddrは4KiBアライメントであること。
+ * @attention 引数pPAddrは4KiBアライメントであること。
*/
/******************************************************************************/
void MemMngCtrlCopyVirtToPhys( void *pPAddr,
void *pVAddr,
size_t size )
{
- uint32_t dirId; /* ページディレクトリID */
- uint32_t idx; /* インデックス */
- size_t count; /* コピーサイズ */
+ size_t count; /* コピーサイズ */
+ uint32_t pageDirId; /* ページディレクトリID */
+ uint32_t idx; /* インデックス */
+ CmnRet_t ret; /* 関数戻り値 */
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() start.", __func__ );
size );
/* ページディレクトリID取得 */
- dirId = MemMngPageGetDirId();
+ pageDirId = MemMngPageGetDirId();
/* 物理マッピング用領域サイズ毎に繰り返し */
- for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
+ for ( idx = 0; idx < size; idx += CONFIG_MEM_KERNEL_MAP_SIZE ) {
/* 次コピー有無判定 */
- if ( ( size - idx ) > CTRL_MAP_SIZE ) {
+ if ( ( size - idx ) > CONFIG_MEM_KERNEL_MAP_SIZE ) {
/* 次コピー有 */
/* コピーサイズ設定 */
- count = CTRL_MAP_SIZE;
+ count = CONFIG_MEM_KERNEL_MAP_SIZE;
} else {
/* 次コピー無 */
/* コピーサイズ設定 */
- count = size - idx;
+ count = MLIB_BASIC_ALIGN( size - idx,
+ IA32_PAGING_PAGE_SIZE );
}
/* ページマッピング設定 */
- MemMngPageSet( dirId,
- ( void * ) CTRL_MAP_ADDR1,
- pPAddr + idx,
- count,
- IA32_PAGING_G_NO,
- IA32_PAGING_US_SV,
- IA32_PAGING_RW_RW );
+ ret = MemMngPageSet( pageDirId,
+ ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1,
+ pPAddr + idx,
+ count,
+ IA32_PAGING_G_NO,
+ IA32_PAGING_US_SV,
+ IA32_PAGING_RW_RW );
+
+ /* 設定結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* [TODO] */
+ }
/* コピー */
- memcpy( ( void * ) CTRL_MAP_ADDR1, pVAddr + idx, count );
+ memcpy( ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1, pVAddr + idx, count );
}
/* ページマッピング解除 */
- MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
+ MemMngPageUnset( pageDirId,
+ ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1,
+ CONFIG_MEM_KERNEL_MAP_SIZE );
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() end.", __func__ );
uint8_t value,
size_t size )
{
- uint32_t dirId; /* ページディレクトリID */
- uint32_t idx; /* インデックス */
- size_t count; /* コピーサイズ */
+ size_t count; /* コピーサイズ */
+ uint32_t pageDirId; /* ページディレクトリID */
+ uint32_t idx; /* インデックス */
+ CmnRet_t ret; /* 関数戻り値 */
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() start. pPAddr=%010p, value=%0#4X, size=%#X",
size );
/* ページディレクトリID取得 */
- dirId = MemMngPageGetDirId();
+ pageDirId = MemMngPageGetDirId();
/* 物理マッピング用領域サイズ毎に繰り返し */
- for ( idx = 0; idx < size; idx += CTRL_MAP_SIZE ) {
+ for ( idx = 0; idx < size; idx += CONFIG_MEM_KERNEL_MAP_SIZE ) {
/* 次設定有無判定 */
- if ( ( size - idx ) > CTRL_MAP_SIZE ) {
+ if ( ( size - idx ) > CONFIG_MEM_KERNEL_MAP_SIZE ) {
/* 次設定有 */
/* サイズ設定 */
- count = CTRL_MAP_SIZE;
+ count = CONFIG_MEM_KERNEL_MAP_SIZE;
} else {
/* 次設定無 */
/* サイズ設定 */
- count = size - idx;
+ count = MLIB_BASIC_ALIGN( size - idx,
+ IA32_PAGING_PAGE_SIZE );
}
/* ページマッピング設定 */
- MemMngPageSet( dirId,
- ( void * ) CTRL_MAP_ADDR1,
- pPAddr + idx,
- count,
- IA32_PAGING_G_NO,
- IA32_PAGING_US_SV,
- IA32_PAGING_RW_RW );
+ ret = MemMngPageSet( pageDirId,
+ ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1,
+ pPAddr + idx,
+ count,
+ IA32_PAGING_G_NO,
+ IA32_PAGING_US_SV,
+ IA32_PAGING_RW_RW );
+
+ /* 設定結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* [TODO] */
+ }
/* メモリ設定 */
- memset( ( void * ) CTRL_MAP_ADDR1, value, count );
+ memset( ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1, value, count );
}
/* ページマッピング解除 */
- MemMngPageUnset( dirId, ( void * ) CTRL_MAP_ADDR1, CTRL_MAP_SIZE );
+ MemMngPageUnset( pageDirId,
+ ( void * ) CONFIG_MEM_KERNEL_MAP_ADDR1,
+ CONFIG_MEM_KERNEL_MAP_SIZE );
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() end.", __func__ );
/******************************************************************************/
/* src/kernel/MemMng/MemMngPage.c */
-/* 2017/05/21 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
#endif
/* テーブル使用フラグ */
-#define PAGE_UNUSED ( 0 ) /**< 未使用テーブル */
-#define PAGE_USED ( 1 ) /**< 使用中テーブル */
+#define PAGE_UNUSED ( 0 ) /** 未使用テーブル */
+#define PAGE_USED ( 1 ) /** 使用中テーブル */
/** ページ管理テーブル構造体 */
typedef struct {
/******************************************************************************/
/**
* @brief ページディレクトリ切替
- * @details æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\82\92CPUã\81«è¨å®\9aã\81\99る。
+ * @details æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81«å\88\87ã\82\8aæ\9b¿ã\81\88る。
*
- * @param[in] id ページディレクトリID
+ * @param[in] pageDirId ページディレクトリID
+ *
+ * @return ページディレクトリベースレジスタ
*/
/******************************************************************************/
-void MemMngPageSwitchDir( uint32_t id )
+IA32PagingPDBR_t MemMngPageSwitchDir( uint32_t pageDirId )
{
- /* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start. id=%u", __func__, id );
+ IA32PagingPDBR_t pdbr; /* 戻り値 */
- /* CPU設定 */
- IA32InstructionSetCr3( &gPageDir[ id ],
- IA32_PAGING_PCD_ENABLE,
- IA32_PAGING_PWT_WB );
+ /* デバッグトレースログ出力 *//*
+ DEBUG_LOG( "%s() start. pageDirId=%u", __func__, pageDirId );*/
/* 現ページディレクトリID設定 */
- gPageMngTbl.nowDirId = id;
+ gPageMngTbl.nowDirId = pageDirId;
- /* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() end.", __func__ );
+ /* PDBR作成 */
+ IA32_PAGING_SET_PDBR( pdbr,
+ &gPageDir[ pageDirId ],
+ IA32_PAGING_PCD_ENABLE,
+ IA32_PAGING_PWT_WB );
- return;
+ /* デバッグトレースログ出力 *//*
+ DEBUG_LOG( "%s() end.", __func__ );*/
+
+ return pdbr;
}
/******************************************************************************/
void MemMngPageInit( void )
{
- CmnRet_t ret; /* 戻り値 */
+ CmnRet_t ret; /* 戻り値 */
+ IA32PagingPDBR_t pdbr; /* PDBR */
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() start.", __func__ );
/* [TODO] */
}
+ /* ページディレクトリ切替 */
+ pdbr = MemMngPageSwitchDir( MEMMNG_PAGE_DIR_ID_IDLE );
+
/* ページディレクトリ設定 */
- MemMngPageSwitchDir( MEMMNG_PAGE_DIR_ID_IDLE );
+ IA32InstructionSetCr3( pdbr );
/* ページング有効化 */
IA32InstructionSetCr0( IA32_CR0_PG, IA32_CR0_PG );
size -= IA32_PAGING_PAGE_SIZE;
}
-
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() end.", __func__ );
--- /dev/null
+/******************************************************************************/
+/* src/kernel/ProcMng/ProcMngElf.c */
+/* 2017/06/13 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <elf.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <hardware/IA32/IA32Paging.h>
+#include <MLib/Basic/MLibBasic.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+#include <Config.h>
+#include <Debug.h>
+#include <MemMng.h>
+#include <ProcMng.h>
+
+/* 内部モジュールヘッダ */
+#include "ProcMngTask.h"
+
+
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* デバッグトレースログ出力マクロ */
+#ifdef DEBUG_LOG_ENABLE
+#define DEBUG_LOG( ... ) \
+ DebugLogOutput( CMN_MODULE_PROCMNG_ELF, \
+ __LINE__, \
+ __VA_ARGS__ )
+#else
+#define DEBUG_LOG( ... )
+#endif
+
+
+/******************************************************************************/
+/* ローカル関数プロトタイプ宣言 */
+/******************************************************************************/
+/* ELFヘッダチェック */
+static CmnRet_t ElfCheckElfHeader( void *pAddr,
+ size_t size );
+
+/* プログラムヘッダチェック */
+static CmnRet_t ElfCheckPrgHeader( void *pAddr,
+ size_t size );
+
+
+/******************************************************************************/
+/* グローバル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief ELFファイル読込
+ * @details ELFファイルをメモリを読み込む。
+ *
+ * @param[in] *pAddr ELFファイルアドレス
+ * @param[in] size ELFファイルサイズ
+ * @param[out] *pTaskInfo タスク情報
+ *
+ * @retval CMN_SUCCESS 正常終了
+ * @retval CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+CmnRet_t ProcMngElfLoad( void *pAddr,
+ size_t size,
+ ProcMngTaskTbl_t *pTaskInfo )
+{
+ void *pPhyAddr; /* 物理アドレス */
+ uint32_t index; /* インデックス */
+ uint32_t attrRw; /* 読込/書込許可属性 */
+ CmnRet_t ret; /* 関数戻り値 */
+ Elf32_Ehdr *pElfHdr; /* ELFヘッダ */
+ Elf32_Phdr *pPrgHdr; /* プログラムヘッダテーブル */
+ Elf32_Phdr *pEntry; /* プログラムヘッダテーブルエントリ */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start.", __func__ );
+ DEBUG_LOG( " pAddr=%010p, size=%u, pTaskInfo=%010p",
+ pAddr,
+ size,
+ pTaskInfo );
+
+ /* 初期化 */
+ pElfHdr = ( Elf32_Ehdr * ) pAddr;
+ pPrgHdr = ( Elf32_Phdr * ) ( ( uint32_t ) pAddr + pElfHdr->e_phoff );
+
+ /* ELFヘッダチェック */
+ ret = ElfCheckElfHeader( pAddr, size );
+
+ /* チェック結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 不正 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+
+ return CMN_FAILURE;
+ }
+
+ /* プログラムヘッダチェック */
+ ret = ElfCheckPrgHeader( pAddr, size );
+
+ /* チェック結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 不正 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+
+ return CMN_FAILURE;
+ }
+
+ /* プログラムヘッダテーブル1エントリ毎に繰り返し */
+ for ( index = 0; index < pElfHdr->e_phnum; index++ ) {
+ /* プログラムヘッダ参照変数設定 */
+ pEntry = ( Elf32_Phdr * ) ( ( uint32_t ) pPrgHdr +
+ pElfHdr->e_phentsize * index );
+
+ /* セグメントタイプ判定 */
+ if ( pEntry->p_type != PT_LOAD ) {
+ /* ロード可能セグメント以外 */
+
+ /* 次のプログラムヘッダテーブルエントリ */
+ continue;
+ }
+
+ /* セグメントサイズ取得 */
+ size = MLIB_BASIC_ALIGN( pEntry->p_memsz, IA32_PAGING_PAGE_SIZE );
+
+ /* メモリ領域割当 */
+ pPhyAddr = MemMngAreaAlloc( size );
+
+ /* メモリ領域割当結果判定 */
+ if ( pPhyAddr == NULL ) {
+ /* 失敗 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+
+ return CMN_FAILURE;
+ }
+
+ /* 0初期化 */
+ MemMngCtrlSet( pPhyAddr, 0, size );
+
+ /* セグメントコピー */
+ MemMngCtrlCopyVirtToPhys(
+ pPhyAddr,
+ ( void * ) ( ( uint32_t ) pAddr + pEntry->p_offset ),
+ pEntry->p_filesz );
+
+ /* フラグ判定 */
+ if ( MLIB_BASIC_IS_FLAG( pEntry->p_flags, PF_R | PF_W ) ) {
+ /* 読書可能セグメント */
+
+ attrRw = IA32_PAGING_RW_RW;
+
+ } else {
+ /* 読込専用セグメント */
+
+ attrRw = IA32_PAGING_RW_R;
+ }
+
+ /* ページマッピング設定 */
+ ret = MemMngPageSet( pTaskInfo->pageDirId,
+ ( void * ) pEntry->p_vaddr,
+ pPhyAddr,
+ size,
+ IA32_PAGING_G_NO,
+ IA32_PAGING_US_USER,
+ attrRw );
+
+ /* 設定結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+
+ return CMN_FAILURE;
+ }
+ }
+
+ /* エントリポイント設定 */
+ pTaskInfo->pEntryPoint = ( void * ) pElfHdr->e_entry;
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );
+
+ return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
+/* ローカル関数定義 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief ELFヘッダチェック
+ * @details ELFファイルのELFヘッダが許容される内容かチェックする。
+ *
+ * @param[in] *pAddr ELFファイルアドレス
+ * @param[in] size ELFファイルサイズ
+ *
+ * @retval CMN_SUCCESS 正常終了
+ * @retval CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+static CmnRet_t ElfCheckElfHeader( void *pAddr,
+ size_t size )
+{
+ Elf32_Ehdr *pHdr; /* ELFヘッダ */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pAddr=%010p, size=%u",
+ __func__,
+ pAddr,
+ size );
+
+ /* 初期化 */
+ pHdr = ( Elf32_Ehdr * ) pAddr;
+
+ /* ELFヘッダサイズチェック */
+ if ( size < sizeof ( Elf32_Ehdr ) ) {
+ /* 不正 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end.", __func__ );
+
+ return CMN_FAILURE;
+ }
+
+ /* ファイル識別子チェック */
+ if ( ( pHdr->e_ident[ EI_MAG0 ] != ELFMAG0 ) ||
+ ( pHdr->e_ident[ EI_MAG1 ] != ELFMAG1 ) ||
+ ( pHdr->e_ident[ EI_MAG2 ] != ELFMAG2 ) ||
+ ( pHdr->e_ident[ EI_MAG3 ] != ELFMAG3 ) ) {
+ /* 不正ファイル識別子 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+ DEBUG_LOG( " e_ident[ EI_MAG0 ]=%02X %02X %02X %02X",
+ pHdr->e_ident[ EI_MAG0 ],
+ pHdr->e_ident[ EI_MAG1 ],
+ pHdr->e_ident[ EI_MAG2 ],
+ pHdr->e_ident[ EI_MAG3 ] );
+
+ return CMN_FAILURE;
+ }
+
+ /* ファイルクラスチェック */
+ if ( pHdr->e_ident[ EI_CLASS ] != ELFCLASS32 ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_ident[ EI_CLASS ]=0x%02X",
+ __func__,
+ pHdr->e_ident[ EI_CLASS ] );
+
+ return CMN_FAILURE;
+ }
+
+ /* データエンコーディングチェック */
+ if ( pHdr->e_ident[ EI_DATA ] != ELFDATA2LSB ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_ident[ EI_DATA ]=0x%02X",
+ __func__,
+ pHdr->e_ident[ EI_DATA ] );
+
+ return CMN_FAILURE;
+ }
+
+ /* ファイルバージョンチェック */
+ if ( pHdr->e_ident[ EI_VERSION ] != EV_CURRENT ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_ident[ EI_VERSION ]=0x%02X",
+ __func__,
+ pHdr->e_ident[ EI_VERSION ] );
+
+ return CMN_FAILURE;
+ }
+
+ /* オブジェクトファイルタイプチェック */
+ if ( pHdr->e_type != ET_EXEC ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_type=0x%04X",
+ __func__,
+ pHdr->e_type );
+
+ return CMN_FAILURE;
+ }
+
+ /* マシンアーキテクチャチェック */
+ if ( pHdr->e_machine != EM_386 ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_machine=0x%04X",
+ __func__,
+ pHdr->e_machine );
+
+ return CMN_FAILURE;
+ }
+
+ /* ファイルバージョンチェック */
+ if ( pHdr->e_version != EV_CURRENT ) {
+ /* 無効値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_version=0x%08X",
+ __func__,
+ pHdr->e_version );
+
+ return CMN_FAILURE;
+ }
+
+ /* エントリポイントチェック */
+ if ( ( pHdr->e_entry < CONFIG_MEM_TASK_START_ADDR ) &&
+ ( pHdr->e_entry >= CONFIG_MEM_TASK_STACK_ADDR ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_entry=0x%08X",
+ __func__,
+ pHdr->e_entry );
+
+ return CMN_FAILURE;
+ }
+
+ /* ELFヘッダサイズチェック */
+ if ( pHdr->e_ehsize != sizeof ( Elf32_Ehdr ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, e_ehsize=0x%04X",
+ __func__,
+ pHdr->e_ehsize );
+
+ return CMN_FAILURE;
+ }
+
+ /* プログラムヘッダテーブルサイズチェック */
+ if ( size < ( pHdr->e_phoff + pHdr->e_phentsize * pHdr->e_phnum ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+ DEBUG_LOG( " e_phoff=0x%08X, e_phentsize=0x%04X, e_phnum=0x%04X",
+ pHdr->e_phoff,
+ pHdr->e_phentsize,
+ pHdr->e_phnum );
+
+ return CMN_FAILURE;
+ }
+
+ /* セクションヘッダテーブルサイズチェック */
+ if ( size < ( pHdr->e_shoff + pHdr->e_shentsize * pHdr->e_shnum ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE", __func__ );
+ DEBUG_LOG( " e_shoff=0x%08X, e_shentsize=0x%04X, e_shnum=%04X",
+ pHdr->e_shoff,
+ pHdr->e_shentsize,
+ pHdr->e_shnum );
+
+ return CMN_FAILURE;
+ }
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );
+
+ return CMN_SUCCESS;
+}
+
+
+
+/******************************************************************************/
+/**
+ * @brief プログラムヘッダチェック
+ * @details ELFファイルのプログラムヘッダが許容される内容かチェックする。
+ *
+ * @param[in] *pAddr ELFファイルアドレス
+ * @param[in] size ELFファイルサイズ
+ *
+ * @retval CMN_SUCCESS 正常終了
+ * @retval CMN_FAILURE 異常終了
+ */
+/******************************************************************************/
+static CmnRet_t ElfCheckPrgHeader( void *pAddr,
+ size_t size )
+{
+ uint32_t index; /* プログラムヘッダテーブルインデックス */
+ Elf32_Ehdr *pElfHdr; /* ELFヘッダ */
+ Elf32_Phdr *pPrgHdr; /* プログラムヘッダテーブル */
+ Elf32_Phdr *pEntry; /* プログラムヘッダテーブルエントリ */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() start. pAddr=%010p, size=%u",
+ __func__,
+ pAddr,
+ size );
+
+ /* 初期化 */
+ pElfHdr = ( Elf32_Ehdr * ) pAddr;
+ pPrgHdr = ( Elf32_Phdr * ) ( ( uint32_t ) pAddr + pElfHdr->e_phoff );
+
+ /* 1エントリ毎に繰り返し */
+ for ( index = 0; index < pElfHdr->e_phnum; index++ ) {
+ /* エントリ参照変数設定 */
+ pEntry = ( Elf32_Phdr * ) ( ( uint32_t ) pPrgHdr +
+ pElfHdr->e_phentsize * index );
+
+ /* セグメントタイプチェック */
+ if ( pEntry->p_type != PT_LOAD ) {
+ /* ロード可能セグメント以外 */
+
+ /* 次のプログラムヘッダテーブルエントリ */
+ continue;
+ }
+
+ /* ファイルサイズチェック */
+ if ( ( pEntry->p_offset + pEntry->p_filesz ) >= size ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, size=%d",
+ __func__,
+ pEntry->p_offset + pEntry->p_filesz );
+
+ return CMN_FAILURE;
+ }
+
+ /* 仮想メモリチェック */
+ if ( ( pEntry->p_vaddr < CONFIG_MEM_TASK_START_ADDR ) ||
+ ( ( pEntry->p_vaddr + pEntry->p_memsz ) >=
+ CONFIG_MEM_TASK_STACK_ADDR ) ||
+ ( ( pEntry->p_vaddr % IA32_PAGING_PAGE_SIZE ) != 0 ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, vaddr=%#010X, end=%#010X",
+ __func__,
+ pEntry->p_vaddr,
+ ( pEntry->p_vaddr + pEntry->p_memsz ) );
+
+ return CMN_FAILURE;
+ }
+
+ /* フラグチェック */
+ if ( !( MLIB_BASIC_IS_FLAG( pEntry->p_flags, PF_X ) ||
+ MLIB_BASIC_IS_FLAG( pEntry->p_flags, PF_W ) ||
+ MLIB_BASIC_IS_FLAG( pEntry->p_flags, PF_R ) ) ) {
+ /* 不正値 */
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_FAILURE, p_flags=%x",
+ __func__,
+ pEntry->p_flags );
+
+ return CMN_FAILURE;
+ }
+ }
+
+ /* デバッグトレースログ出力 */
+ DEBUG_LOG( "%s() end. ret=CMN_SUCCESS", __func__ );
+
+ return CMN_SUCCESS;
+}
+
+
+/******************************************************************************/
--- /dev/null
+/******************************************************************************/
+/* src/kernel/ProcMng/ProcMngElf.h */
+/* 2017/06/09 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+#ifndef PROCMNG_ELF_H
+#define PROCMNG_ELF_H
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stddef.h>
+
+/* 外部モジュールヘッダ */
+#include <Cmn.h>
+
+/* 内部モジュールヘッダ */
+#include "ProcMngTask.h"
+
+
+/******************************************************************************/
+/* グローバル関数プロトタイプ宣言 */
+/******************************************************************************/
+/* ELFファイル読込 */
+extern CmnRet_t ProcMngElfLoad( void *pAddr,
+ size_t size,
+ ProcMngTaskTbl_t *pTaskInfo );
+
+
+/******************************************************************************/
+#endif
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngSched.c */
-/* 2017/05/19 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
#define SCHED_IDLE_IDX ( 0 )
/* タスク情報使用フラグ */
-#define SCHED_TASK_INFO_UNUSED ( 0 ) /**< 未使用 */
-#define SCHED_TASK_INFO_USED ( 1 ) /**< 使用中 */
+#define SCHED_TASK_INFO_UNUSED ( 0 ) /** 未使用 */
+#define SCHED_TASK_INFO_USED ( 1 ) /** 使用中 */
/* スケジューラ実行中レベル */
-#define SCHED_LEVEL_DRIVER ( 0 ) /**< ドライバレベル */
-#define SCHED_LEVEL_SERVER ( 1 ) /**< サーバレベル */
-#define SCHED_LEVEL_USER ( 2 ) /**< ユーザレベル */
+#define SCHED_LEVEL_DRIVER ( 0 ) /** ドライバレベル */
+#define SCHED_LEVEL_SERVER ( 1 ) /** サーバレベル */
+#define SCHED_LEVEL_USER ( 2 ) /** ユーザレベル */
/** タスク情報構造体 */
typedef struct {
* @retval CMN_FAILURE 失敗
*/
/******************************************************************************/
-int32_t ProcMngSchedAdd( uint32_t taskId )
+CmnRet_t ProcMngSchedAdd( uint32_t taskId )
{
schedTaskInfo_t *pTaskInfo; /* タスク情報 */
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
- /* [TODO] トレース出力 */
+ /* [TODO] */
}
}
if ( retMLib != MLIB_SUCCESS ) {
/* 失敗 */
- /* [TODO] トレース出力 */
+ /* [TODO] */
}
/* デバッグトレースログ出力 */
return;
}
-
+uint32_t __test__ = 0;
/******************************************************************************/
/**
* @brief タスクスイッチ
uint32_t nextTaskId )
{
void *pKernelStack; /* カーネルスタック */
- uint32_t pdId; /* ページディレクトリID */
+ uint32_t pageDirId; /* ページディレクトリID */
+ IA32PagingPDBR_t pdbr; /* PDBR */
ProcMngTaskContext_t context; /* コンテキスト */
/* デバッグトレースログ出力 *//*
ProcMngTssSetEsp0( ( uint32_t ) pKernelStack );
/* ページディレクトリID取得 */
- pdId = ProcMngTaskGetPageDirId( nextTaskId );
+ pageDirId = ProcMngTaskGetPageDirId( nextTaskId );
/* ページディレクトリ切替 */
- MemMngPageSwitchDir( pdId );
+ pdbr = MemMngPageSwitchDir( pageDirId );
/* タスクスイッチ */
- IA32InstructionSwitchTask( ( void * ) context.eip,
+ IA32InstructionSwitchTask( pdbr,
+ ( void * ) context.eip,
( void * ) context.esp,
( void * ) context.ebp );
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngSched.h */
-/* 2017/03/01 */
+/* 2017/06/09 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef PROCMNG_SCHED_H
/* グローバル関数プロトタイプ宣言 */
/******************************************************************************/
/* スケジュール追加 */
-extern int32_t ProcMngSchedAdd( uint32_t taskId );
+extern CmnRet_t ProcMngSchedAdd( uint32_t taskId );
/* タスクID取得 */
extern uint32_t ProcMngSchedGetTaskId( void );
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.c */
-/* 2017/04/16 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/* 外部モジュールヘッダ */
#include <Cmn.h>
+#include <Config.h>
#include <Debug.h>
#include <MemMng.h>
#include <ProcMng.h>
/* 内部モジュールヘッダ */
+#include "ProcMngElf.h"
#include "ProcMngSched.h"
#include "ProcMngTask.h"
#include "ProcMngTss.h"
#define TASK_ID_UNUSED ( 0 ) /** 未使用 */
#define TASK_ID_USED ( 1 ) /** 使用済 */
-/* スタックサイズ */
-#define TASK_KERNEL_STACK_SIZE ( 1024000 ) /**< カーネルスタックサイズ */
-#define TASK_STACK_SIZE ( 1024000 ) /**< スタックサイズ */
-
-/** タスクスタック情報 */
-typedef struct {
- void *pTopAddr; /**< 先頭アドレス */
- void *pBottomAddr; /**< 後尾アドレス */
- size_t size; /**< サイズ */
-} taskStackInfo_t;
-
-/** タスク管理テーブル構造体 */
-typedef struct {
- uint8_t used; /**< 使用フラグ */
- uint8_t type; /**< タスクタイプ */
- uint8_t state; /**< タスク状態 */
- uint8_t reserved; /**< パディング */
- ProcMngTaskContext_t context; /**< コンテキスト */
- uint32_t pageDirId; /**< ページディレクトリID */
- void *pEntryPoint; /**< エントリポイント */
- taskStackInfo_t kernelStackInfo; /**< カーネルスタックアドレス */
- taskStackInfo_t stackInfo; /**< スタックアドレス */
-} taskTbl_t;
-
/******************************************************************************/
/* 変数定義 */
/******************************************************************************/
/** タスク管理テーブル */
-static taskTbl_t gTaskTbl[ PROCMNG_TASK_ID_NUM ];
+static ProcMngTaskTbl_t gTaskTbl[ PROCMNG_TASK_ID_NUM ];
/******************************************************************************/
* @brief タスク追加
* @details タスク追加を行う。
*
- * @param[in] taskType タスクタイプ
+ * @param[in] taskType タスクタイプ
* - PROCMNG_TASK_TYPE_DRIVER ドライバ
* - PROCMNG_TASK_TYPE_SERVER サーバ
* - PROCMNG_TASK_TYPE_USER ユーザ
- * @param[in] *pEntryPoint エントリポイント
+ * @param[in] *pAddr 実行ファイル
+ * @param[in] size 実行ファイルサイズ
*
* @retval PROCMNG_TASK_ID_NULL 失敗
* @retval PROCMNG_TASK_ID_MIN タスクID最小値
*/
/******************************************************************************/
uint32_t ProcMngTaskAdd( uint8_t taskType,
- void *pEntryPoint )
+ void *pAddr,
+ size_t size )
{
- void *pKernelStack; /* カーネルスタック */
- void *pStack; /* スタック */
- int32_t ret; /* 関数戻り値 */
- uint32_t taskId; /* タスクID */
- uint32_t pageDirId; /* ページディレクトリID */
- taskStackInfo_t *pStackInfo; /* スタック情報 */
+ void *pKernelStack; /* カーネルスタック */
+ void *pStack; /* スタック */
+ CmnRet_t ret; /* 関数戻り値 */
+ uint32_t taskId; /* タスクID */
+ uint32_t pageDirId; /* ページディレクトリID */
+ ProcMngTaskStackInfo_t *pStackInfo; /* スタック情報 */
/* 初期化 */
pKernelStack = NULL;
pStackInfo = NULL;
/* デバッグトレースログ出力 */
- DEBUG_LOG( "%s() start. taskType=%u, pEntryPoint=%010p",
+ DEBUG_LOG( "%s() start. taskType=%u, pAddr=%010p, size=%d",
__func__,
taskType,
- pEntryPoint );
+ pAddr,
+ size );
/* 空タスク検索 */
for ( ; taskId < PROCMNG_TASK_ID_MAX; taskId++ ) {
/* 失敗 */
/* [TODO] */
- /* 設定したタスクを初期化する処理。異常処理はちょっと後回し */
+
+ return PROCMNG_TASK_ID_NULL;
+ }
+
+ /* PDBR設定 */
+
+ /* タスク基本設定 */
+ gTaskTbl[ taskId ].used = TASK_ID_USED;
+ gTaskTbl[ taskId ].type = taskType;
+ gTaskTbl[ taskId ].state = 0;
+ gTaskTbl[ taskId ].context.eip = ( uint32_t ) ProcMngTaskStart;
+ gTaskTbl[ taskId ].context.esp = CONFIG_MEM_KERNEL_STACK_ADDR +
+ CONFIG_MEM_KERNEL_STACK_SIZE -
+ sizeof ( uint32_t );
+ gTaskTbl[ taskId ].pageDirId = pageDirId;
+
+ /* カーネルスタック情報設定 */
+ pStackInfo = &( gTaskTbl[ taskId ].kernelStackInfo );
+ pStackInfo->pTopAddr = ( void * ) CONFIG_MEM_KERNEL_STACK_ADDR;
+ pStackInfo->pBottomAddr = ( void * )
+ ( CONFIG_MEM_KERNEL_STACK_ADDR +
+ CONFIG_MEM_KERNEL_STACK_SIZE -
+ sizeof ( uint32_t ) );
+ pStackInfo->size = CONFIG_MEM_KERNEL_STACK_SIZE;
+
+ /* スタック情報設定 */
+ pStackInfo = &( gTaskTbl[ taskId ].stackInfo );
+ pStackInfo->pTopAddr = ( void * ) CONFIG_MEM_TASK_STACK_ADDR;
+ pStackInfo->pBottomAddr = ( void * )
+ ( CONFIG_MEM_TASK_STACK_ADDR +
+ CONFIG_MEM_TASK_STACK_SIZE -
+ sizeof ( uint32_t ) );
+ pStackInfo->size = CONFIG_MEM_TASK_STACK_SIZE;
+
+ /* ELFファイル読込 */
+ ret = ProcMngElfLoad( pAddr, size, &gTaskTbl[ taskId ] );
+
+ /* ELFファイル読込結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* [TODO] */
return PROCMNG_TASK_ID_NULL;
}
/* カーネルスタック領域割り当て */
- pKernelStack = MemMngAreaAlloc( TASK_KERNEL_STACK_SIZE );
+ pKernelStack = MemMngAreaAlloc( CONFIG_MEM_KERNEL_STACK_SIZE );
+
+ /* 割り当て結果判定 */
+ if ( pKernelStack == NULL ) {
+ /* 失敗 */
+
+ /* [TODO] */
+
+ return PROCMNG_TASK_ID_NULL;
+ }
/* スタック領域割り当て */
- pStack = MemMngAreaAlloc( TASK_STACK_SIZE );
+ pStack = MemMngAreaAlloc( CONFIG_MEM_TASK_STACK_SIZE );
/* 割り当て結果判定 */
- if ( ( pKernelStack == NULL ) ||
- ( pStack == NULL ) ) {
+ if ( pStack == NULL ) {
/* 失敗 */
/* [TODO] */
- /* 設定したタスクを初期化する処理。異常処理はちょっと後回し */
return PROCMNG_TASK_ID_NULL;
}
- /* ページマッピング(仮) */
- MemMngPageMap( pageDirId,
- pKernelStack,
- pKernelStack,
- TASK_KERNEL_STACK_SIZE,
- IA32_PAGING_G_NO,
- IA32_PAGING_US_SV,
- IA32_PAGING_RW_RW );
- MemMngPageMap( pageDirId,
- pStack,
- pStack,
- TASK_STACK_SIZE,
- IA32_PAGING_G_NO,
- IA32_PAGING_US_USER,
- IA32_PAGING_RW_RW );
+ /* カーネルスタックページマップ設定 */
+ ret = MemMngPageSet( pageDirId,
+ ( void * ) CONFIG_MEM_KERNEL_STACK_ADDR,
+ pKernelStack,
+ CONFIG_MEM_KERNEL_STACK_SIZE,
+ IA32_PAGING_G_NO,
+ IA32_PAGING_US_SV,
+ IA32_PAGING_RW_RW );
- /* タスク基本設定 */
- gTaskTbl[ taskId ].used = TASK_ID_USED;
- gTaskTbl[ taskId ].type = taskType;
- gTaskTbl[ taskId ].state = 0;
- gTaskTbl[ taskId ].context.eip = ( uint32_t ) ProcMngTaskStart;
- gTaskTbl[ taskId ].context.esp = ( uint32_t ) pKernelStack +
- TASK_KERNEL_STACK_SIZE;
- gTaskTbl[ taskId ].pEntryPoint = pEntryPoint;
- gTaskTbl[ taskId ].pageDirId = pageDirId;
+ /* ページマップ設定結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* [TODO] */
+
+ return PROCMNG_TASK_ID_NULL;
+ }
- /* カーネルスタック情報設定 */
- pStackInfo = &( gTaskTbl[ taskId ].kernelStackInfo );
- pStackInfo->pTopAddr = pKernelStack;
- pStackInfo->pBottomAddr = pKernelStack + TASK_KERNEL_STACK_SIZE;
- pStackInfo->size = TASK_KERNEL_STACK_SIZE;
+ /* スタックページマップ設定 */
+ ret = MemMngPageSet( pageDirId,
+ ( void * ) CONFIG_MEM_TASK_STACK_ADDR,
+ pStack,
+ CONFIG_MEM_TASK_STACK_SIZE,
+ IA32_PAGING_G_NO,
+ IA32_PAGING_US_USER,
+ IA32_PAGING_RW_RW );
- /* スタック情報設定 */
- pStackInfo = &( gTaskTbl[ taskId ].stackInfo );
- pStackInfo->pTopAddr = pStack;
- pStackInfo->pBottomAddr = pStack + TASK_STACK_SIZE;
- pStackInfo->size = TASK_STACK_SIZE;
+ /* ページマップ設定結果判定 */
+ if ( ret != CMN_SUCCESS ) {
+ /* 失敗 */
+
+ /* [TODO] */
+
+ return PROCMNG_TASK_ID_NULL;
+ }
/* スケジューラ追加 */
ret = ProcMngSchedAdd( taskId );
/* 失敗 */
/* [TODO] */
- /* 設定したタスクを初期化する処理。異常処理はちょっと後回し */
return PROCMNG_TASK_ID_NULL;
}
/******************************************************************************/
void ProcMngTaskStart( void )
{
- void *pEntryPoint; /* エントリポイント */
- void *pStack; /* スタックアドレス */
- uint8_t taskType; /* タスクタイプ */
- uint32_t taskId; /* タスクID */
- uint32_t codeSegSel; /* コードセグメントセレクタ */
- uint32_t dataSegSel; /* データセグメントセレクタ */
- taskTbl_t *pTask; /* タスク管理情報 */
+ void *pEntryPoint; /* エントリポイント */
+ void *pStack; /* スタックアドレス */
+ uint8_t taskType; /* タスクタイプ */
+ uint32_t taskId; /* タスクID */
+ uint32_t codeSegSel; /* コードセグメントセレクタ */
+ uint32_t dataSegSel; /* データセグメントセレクタ */
+ ProcMngTaskTbl_t *pTask; /* タスク管理情報 */
/* デバッグトレースログ出力 */
DEBUG_LOG( "%s() start.", __func__ );
/******************************************************************************/
/* src/kernel/ProcMng/ProcMngTask.h */
-/* 2017/04/16 */
+/* 2017/06/15 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef PROCMNG_TASK_H
/* インクルード */
/******************************************************************************/
/* 共通ヘッダ */
+#include <stddef.h>
#include <stdint.h>
+#include <hardware/IA32/IA32Paging.h>
/* 外部モジュールヘッダ */
#include <ProcMng.h>
/******************************************************************************/
/** コンテキスト構造体 */
typedef struct {
- uint32_t eip; /**< eipレジスタ */
- uint32_t esp; /**< espレジスタ */
- uint32_t ebp; /**< ebpレジスタ */
+ uint32_t eip; /**< eipレジスタ */
+ uint32_t esp; /**< espレジスタ */
+ uint32_t ebp; /**< ebpレジスタ */
} ProcMngTaskContext_t;
+/** タスクスタック情報 */
+typedef struct {
+ void *pTopAddr; /**< 先頭アドレス */
+ void *pBottomAddr; /**< 後尾アドレス */
+ size_t size; /**< サイズ */
+} ProcMngTaskStackInfo_t;
+
+/** タスク管理テーブル構造体 */
+typedef struct {
+ uint8_t used; /**< 使用フラグ */
+ uint8_t type; /**< タスクタイプ */
+ uint8_t state; /**< タスク状態 */
+ uint8_t reserved; /**< パディング */
+ ProcMngTaskContext_t context; /**< コンテキスト */
+ uint32_t pageDirId; /**< ページディレクトリID */
+ void *pEntryPoint; /**< エントリポイント */
+ ProcMngTaskStackInfo_t kernelStackInfo; /**< カーネルスタックアドレス */
+ ProcMngTaskStackInfo_t stackInfo; /**< スタックアドレス */
+} ProcMngTaskTbl_t;
+
/******************************************************************************/
/* グローバル関数プロトタイプ宣言 */
/******************************************************************************/
/* src/kernel/include/Cmn.h */
-/* 2017/05/16 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef CMN_H
#define CMN_FAILURE ( -1 ) /** 失敗 */
/* モジュール・サブモジュール識別子 */
-#define CMN_MODULE_INIT_INIT ( 0x0101 ) /**< 初期化制御(初期化) */
-#define CMN_MODULE_MEMMNG_INIT ( 0x0201 ) /**< メモリ管理(初期化) */
-#define CMN_MODULE_MEMMNG_GDT ( 0x0202 ) /**< メモリ管理(GDT管理) */
-#define CMN_MODULE_MEMMNG_AREA ( 0x0203 ) /**< メモリ管理(メモリ領域管理) */
-#define CMN_MODULE_MEMMNG_PAGE ( 0x0204 ) /**< メモリ管理(ページ管理) */
-#define CMN_MODULE_MEMMNG_CTRL ( 0x0205 ) /**< メモリ管理(メモリ制御) */
-#define CMN_MODULE_INTMNG_INIT ( 0x0301 ) /**< 割込管理(初期化) */
-#define CMN_MODULE_INTMNG_PIC ( 0x0302 ) /**< 割込管理(PIC管理) */
-#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_PROCMNG_INIT ( 0x0501 ) /**< プロセス管理(初期化) */
-#define CMN_MODULE_PROCMNG_TSS ( 0x0502 ) /**< プロセス管理(TSS管理) */
-#define CMN_MODULE_PROCMNG_SCHED ( 0x0503 ) /**< プロセス管理(スケジューラ) */
-#define CMN_MODULE_PROCMNG_TASK ( 0x0504 ) /**< プロセス管理(タスク管理) */
-#define CMN_MODULE_DEBUG_INIT ( 0x0601 ) /**< デバッグ制御(初期化) */
-#define CMN_MODULE_DEBUG_LOG ( 0x0602 ) /**< デバッグ制御(ログ管理) */
+#define CMN_MODULE_INIT_INIT ( 0x0101 ) /** 初期化制御(初期化) */
+#define CMN_MODULE_MEMMNG_INIT ( 0x0201 ) /** メモリ管理(初期化) */
+#define CMN_MODULE_MEMMNG_GDT ( 0x0202 ) /** メモリ管理(GDT管理) */
+#define CMN_MODULE_MEMMNG_AREA ( 0x0203 ) /** メモリ管理(メモリ領域管理) */
+#define CMN_MODULE_MEMMNG_PAGE ( 0x0204 ) /** メモリ管理(ページ管理) */
+#define CMN_MODULE_MEMMNG_CTRL ( 0x0205 ) /** メモリ管理(メモリ制御) */
+#define CMN_MODULE_INTMNG_INIT ( 0x0301 ) /** 割込管理(初期化) */
+#define CMN_MODULE_INTMNG_PIC ( 0x0302 ) /** 割込管理(PIC管理) */
+#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_PROCMNG_INIT ( 0x0501 ) /** プロセス管理(初期化) */
+#define CMN_MODULE_PROCMNG_TSS ( 0x0502 ) /** プロセス管理(TSS管理) */
+#define CMN_MODULE_PROCMNG_SCHED ( 0x0503 ) /** プロセス管理(スケジューラ) */
+#define CMN_MODULE_PROCMNG_TASK ( 0x0504 ) /** プロセス管理(タスク管理) */
+#define CMN_MODULE_PROCMNG_ELF ( 0x0505 ) /** プロセス管理(ELFローダ) */
+#define CMN_MODULE_DEBUG_INIT ( 0x0601 ) /** デバッグ制御(初期化) */
+#define CMN_MODULE_DEBUG_LOG ( 0x0602 ) /** デバッグ制御(ログ管理) */
/** モジュール・サブモジュール数 */
-#define CMN_MODULE_NUM ( 18 )
+#define CMN_MODULE_NUM ( 19 )
/* 処理結果構造体 */
typedef int32_t CmnRet_t;
--- /dev/null
+/******************************************************************************/
+/* src/kernel/include/Config.h */
+/* 2017/06/04 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+#ifndef CONFIG_H
+#define CONFIG_H
+/******************************************************************************/
+/* 定義 */
+/******************************************************************************/
+/* 仮想メモリマップ定義 */
+#define CONFIG_MEM_KERNEL_START_ADDR ( 0x00100000 ) /** カーネル領域先頭アドレス */
+#define CONFIG_MEM_KERNEL_STACK_ADDR ( 0x3EFFE000 ) /** カーネル用スタック領域先頭アドレス */
+#define CONFIG_MEM_KERNEL_STACK_SIZE ( 0x00002000 ) /** カーネル用スタック領域サイズ */
+#define CONFIG_MEM_KERNEL_MAP_ADDR1 ( 0x3F000000 ) /** メモリ制御用領域1先頭アドレス */
+#define CONFIG_MEM_KERNEL_MAP_SIZE1 ( 0x00800000 ) /** メモリ制御用領域1サイズ */
+#define CONFIG_MEM_KERNEL_MAP_ADDR2 ( 0x3F800000 ) /** メモリ制御用領域2先頭アドレス */
+#define CONFIG_MEM_KERNEL_MAP_SIZE2 ( 0x00800000 ) /** メモリ制御用領域2サイズ */
+#define CONFIG_MEM_KERNEL_MAP_SIZE ( 0x01000000 ) /** メモリ制御用領域全サイズ */
+#define CONFIG_MEM_TASK_START_ADDR ( 0x40000000 ) /** タスク領域先頭アドレス */
+#define CONFIG_MEM_TASK_STACK_ADDR ( 0xFFFFE000 ) /** タスク用スタック領域先頭アドレス */
+#define CONFIG_MEM_TASK_STACK_SIZE ( 0x00002000 ) /** タスク用スタック領域サイズ */
+
+
+/******************************************************************************/
+#endif
/******************************************************************************/
/* src/kernel/include/MemMng.h */
-/* 2017/05/24 */
+/* 2017/06/16 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
#ifndef MEMMNG_H
/* 共通ヘッダ */
#include <stddef.h>
#include <stdint.h>
+#include <hardware/IA32/IA32Paging.h>
#include <kernel/MochiKernel.h>
/* 外部モジュールヘッダ */
/* 定義 */
/******************************************************************************/
/* GDT定義 */
-#define MEMMNG_GDT_ENTRY_FULL ( 0 ) /**< GDTエントリ空き無し */
-#define MEMMNG_GDT_ENTRY_MIN ( 1 ) /**< GDTエントリ番号最小値 */
-#define MEMMNG_GDT_ENTRY_MAX ( 9 ) /**< GDTエントリ番号最大値 */
-#define MEMMNG_GDT_ENTRY_NUM \
- ( MEMMNG_GDT_ENTRY_MAX + 1 ) /**< GDTエントリ数 */
+#define MEMMNG_GDT_ENTRY_FULL ( 0 ) /** GDTエントリ空き無し */
+#define MEMMNG_GDT_ENTRY_MIN ( 1 ) /** GDTエントリ番号最小値 */
+#define MEMMNG_GDT_ENTRY_MAX ( 9 ) /** GDTエントリ番号最大値 */
+#define MEMMNG_GDT_ENTRY_NUM \
+ ( MEMMNG_GDT_ENTRY_MAX + 1 ) /** GDTエントリ数 */
/* セグメントセレクタ定義 */
-#define MEMMNG_SEGSEL_KERNEL_CODE ( 1 * 8 ) /**< カーネルコードセグメント */
-#define MEMMNG_SEGSEL_KERNEL_DATA ( 2 * 8 ) /**< カーネルデータセグメント */
-#define MEMMNG_SEGSEL_DRIVER_CODE ( 3 * 8 + 1 ) /**< ドライバコードセグメント */
-#define MEMMNG_SEGSEL_DRIVER_DATA ( 4 * 8 + 1 ) /**< ドライバデータセグメント */
-#define MEMMNG_SEGSEL_SERVER_CODE ( 5 * 8 + 2 ) /**< サーバコードセグメント */
-#define MEMMNG_SEGSEL_SERVER_DATA ( 6 * 8 + 2 ) /**< サーバデータセグメント */
-#define MEMMNG_SEGSEL_USER_CODE ( 7 * 8 + 3 ) /**< ユーザコードセグメント */
-#define MEMMNG_SEGSEL_USER_DATA ( 8 * 8 + 3 ) /**< ユーザデータセグメント */
+#define MEMMNG_SEGSEL_KERNEL_CODE ( 1 * 8 ) /** カーネルコードセグメント */
+#define MEMMNG_SEGSEL_KERNEL_DATA ( 2 * 8 ) /** カーネルデータセグメント */
+#define MEMMNG_SEGSEL_DRIVER_CODE ( 3 * 8 + 1 ) /** ドライバコードセグメント */
+#define MEMMNG_SEGSEL_DRIVER_DATA ( 4 * 8 + 1 ) /** ドライバデータセグメント */
+#define MEMMNG_SEGSEL_SERVER_CODE ( 5 * 8 + 2 ) /** サーバコードセグメント */
+#define MEMMNG_SEGSEL_SERVER_DATA ( 6 * 8 + 2 ) /** サーバデータセグメント */
+#define MEMMNG_SEGSEL_USER_CODE ( 7 * 8 + 3 ) /** ユーザコードセグメント */
+#define MEMMNG_SEGSEL_USER_DATA ( 8 * 8 + 3 ) /** ユーザデータセグメント */
/** ページディレクトリID */
-#define MEMMNG_PAGE_DIR_ID_IDLE ( 0 ) /**< アイドルプロセス用PDID */
-#define MEMMNG_PAGE_DIR_ID_MIN ( 1 ) /**< PDID最小値 */
+#define MEMMNG_PAGE_DIR_ID_IDLE ( 0 ) /** アイドルプロセス用PDID */
+#define MEMMNG_PAGE_DIR_ID_MIN ( 1 ) /** PDID最小値 */
/* ページディレクトリ定義 */
#define MEMMNG_PAGE_DIR_NUM PROCMNG_TASK_ID_NUM /** PD管理数 */
extern uint32_t MemMngPageGetDirId( void );
/* ページディレクトリ切替 */
-extern void MemMngPageSwitchDir( uint32_t id );
+extern IA32PagingPDBR_t MemMngPageSwitchDir( uint32_t pageDirId );
/* ページマッピング設定 */
extern CmnRet_t MemMngPageSet( uint32_t dirId,
/******************************************************************************/
/* src/kernel/include/ProcMng.h */
-/* 2017/03/03 */
+/* 2017/06/09 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef PROCMNG_H
#define PROCMNG_H
/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+/* 共通ヘッダ */
+#include <stddef.h>
+#include <stdint.h>
+
+
+/******************************************************************************/
/* 定義 */
/******************************************************************************/
/* タスクID */
/* タスク追加 */
extern uint32_t ProcMngTaskAdd( uint8_t taskType,
- void *pEntryPoint );
+ void *pAddr,
+ size_t size );
+
/******************************************************************************/
#endif
/******************************************************************************/
/* src/kernel/include/hardware/IA32/IA32Instruction.h */
-/* 2017/03/30 */
+/* 2017/06/16 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
#ifndef IA32_INSTRUCTION_H
* @brief cr3レジスタ設定
* @details cr3レジスタにページディレクトリのベースアドレスを設定する。
*
- * @param[in] *pBase ベースアドレス
- * @param[in] attrPcd ページレベルキャッシュディスエーブルフラグ
- * - IA32_PAGING_PCD_ENABLE キャッシング有効
- * - IA32_PAGING_PCD_DISABLE キャッシング無効
- * @param[in] attrPwt ページレベルライトスルーフラグ
- * - IA32_PAGING_PWT_WB ライトバックキャッシング
- * - IA32_PAGING_PWT_WT ライトスルーキャッシング
+ * @param[in] pdbr ページディレクトリベースレジスタ
*/
/******************************************************************************/
-static inline void IA32InstructionSetCr3( void *pBase,
- uint32_t attrPcd,
- uint32_t attrPwt )
+static inline void IA32InstructionSetCr3( IA32PagingPDBR_t pdbr )
{
- IA32PagingPDBR_t pdbr; /* 設定値 */
-
- /* 値設定 */
- *( ( uint32_t * ) &pdbr ) = ( ( uint32_t ) pBase ) & 0xFFFFF000;
- pdbr.attr_pcd = attrPcd;
- pdbr.attr_pwt = attrPwt;
-
/* cr3レジスタ設定 */
__asm__ __volatile__ ( "mov cr3, %0"
:
/**
* @brief タスクスイッチ
* @details 指定したスタックポインタをespレジスタに、ベースポインタをebpレ
- * ジスタに設定し、jmp命令を用いて指定したアドレスを実行する。
+ * ジスタに、ページディレクトリベースをpdbrレジスタに設定し、jmp命
+ * 令を用いて指定したアドレスを実行する。
*
- * @param[in] *pEip 移動先アドレス
- * @param[in] *pEsp スタックポインタ
- * @param[in] *pEbp ベースポインタ
+ * @param[in] pdbr ページディレクトリベースレジスタ
+ * @param[in] *pEip 移動先アドレス
+ * @param[in] *pEsp スタックポインタ
+ * @param[in] *pEbp ベースポインタ
*/
/******************************************************************************/
-static inline void IA32InstructionSwitchTask( void *pEip,
- void *pEsp,
- void *pEbp )
+static inline void IA32InstructionSwitchTask( IA32PagingPDBR_t pdbr,
+ void *pEip,
+ void *pEsp,
+ void *pEbp )
{
/* タスクスイッチ */
__asm__ __volatile__ ( "mov eax, %0\n"
- "mov esp, %1\n"
- "mov ebp, %2\n"
- "jmp eax"
+ "mov ebx, %1\n"
+ "mov esp, %2\n"
+ "mov ebp, %3\n"
+ "mov cr3, eax\n"
+ "jmp ebx"
:
- : "m" ( pEip ), "m" ( pEsp ), "m" ( pEbp )
- : );
+ : "a" ( pdbr ),
+ "m" ( pEip ),
+ "m" ( pEsp ),
+ "m" ( pEbp )
+ : );
}
/******************************************************************************/
/* src/kernel/include/hardware/IA32/IA32Paging.h */
-/* 2017/03/30 */
+/* 2017/06/16 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
#ifndef IA32_PAGING_H
/******************************************************************************/
/* 定義 */
/******************************************************************************/
+/** PDBR設定マクロ */
+#define IA32_PAGING_SET_PDBR( _PDBR, _PBASE, _PCD, _PWT ) \
+ { \
+ *( ( uint32_t * ) &( _PDBR ) ) = \
+ ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000; \
+ ( _PDBR ).attr_pcd = ( _PCD ); \
+ ( _PDBR ).attr_pwt = ( _PWT ); \
+ }
+
/** ページディレクトリエントリインデックス取得マクロ */
-#define IA32_PAGING_GET_PDE_IDX( _PADDR ) \
+#define IA32_PAGING_GET_PDE_IDX( _PADDR ) \
( ( ( ( uint32_t ) ( _PADDR ) ) >> 22 ) & 0x3FF )
/** ページテーブルエントリインデックス取得マクロ */
-#define IA32_PAGING_GET_PTE_IDX( _PADDR ) \
+#define IA32_PAGING_GET_PTE_IDX( _PADDR ) \
( ( ( ( uint32_t ) ( _PADDR ) ) >> 12 ) & 0x3FF )
/** ページテーブル・ページベースアドレス設定マクロ */
-#define IA32_PAGING_SET_BASE( _PENTRY, _PBASE ) \
- ( *( ( uint32_t * ) ( _PENTRY ) ) = \
- ( ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000 ) | \
+#define IA32_PAGING_SET_BASE( _PENTRY, _PBASE ) \
+ ( *( ( uint32_t * ) ( _PENTRY ) ) = \
+ ( ( ( uint32_t ) ( _PBASE ) ) & 0xFFFFF000 ) | \
( *( ( uint32_t * ) ( _PENTRY ) ) & 0x00000FFF ) )
/** ページテーブル・ページベースアドレス取得マクロ */
-#define IA32_PAGING_GET_BASE( _PENTRY ) \
+#define IA32_PAGING_GET_BASE( _PENTRY ) \
( ( void * ) ( *( ( uint32_t * ) ( _PENTRY ) ) & 0xFFFFF000 ) )
/* ページテーブル・ページ存在フラグ */
/** PDBR */
typedef struct {
uint32_t reserved2:3; /**< 予約済み */
- uint32_t attr_pwt:1; /**< ページレベルライトスルーフラグ */
- uint32_t attr_pcd:1; /**< ページレベルキャッシュディスエーブルフラグ */
+ uint32_t attr_pwt :1; /**< ページレベルライトスルーフラグ */
+ uint32_t attr_pcd :1; /**< ページレベルキャッシュディスエーブルフラグ */
uint32_t reserved1:7; /**< 予約済み */
uint32_t base :20; /**< ページディレクトリベースアドレス */
} IA32PagingPDBR_t;