OSDN Git Service

MochiBooterの大幅改造(ATA-PIOreadによるカーネルロード)、VMイメージ作成ツール追加など
[mochi/master.git] / src / include / hardware / IA32 / IA32Instruction.h
@@ -1,6 +1,6 @@
 /******************************************************************************/
 /* src/kernel/include/hardware/IA32/IA32Instruction.h                         */
-/*                                                                 2017/06/16 */
+/*                                                                 2017/07/07 */
 /* Copyright (C) 2016-2017 Mochi.                                             */
 /******************************************************************************/
 #ifndef IA32_INSTRUCTION_H
@@ -8,6 +8,7 @@
 /******************************************************************************/
 /* インクルード                                                               */
 /******************************************************************************/
+#include <stddef.h>
 #include <stdint.h>
 #include "IA32Descriptor.h"
 #include "IA32Paging.h"
@@ -603,6 +604,38 @@ static inline void IA32InstructionPushGs( void )
 
 /******************************************************************************/
 /**
+ * @brief       rep insw命令実行
+ * @details     rep insw命令を実行して、指定I/Oポートから16bitの値を読み込み、
+ *              指定アドレスに格納する処理をアドレスを進めながら指定回数分繰り
+ *              返す。
+ * 
+ * @param[out]  *pAddr 格納先アドレス
+ * @param[in]   port   I/Oポート番号
+ * @param[in]   count  繰り返し回数
+ */
+/******************************************************************************/
+static inline void IA32InstructionRepInsw( void     *pAddr,
+                                           uint16_t port,
+                                           size_t   count   )
+{
+    /* insw命令実行 */
+    __asm__ __volatile__ ( "mov edi, %0;"   /* edi 格納先アドレス設定 */
+                           "cld;"           /* 増加設定               */
+                           "rep insw"       /* insw命令実行           */
+                           :                /* 出力無し               */
+                           : "m" ( pAddr ), /* edi 格納先アドレス     */
+                             "d" ( port  ), /* dx  I/Oポート番号設定  */
+                             "c" ( count )  /* ecx 繰り返し回数設定   */
+                           : "edi",         /* ediレジスタ破壊指定    */
+                             //"cx",         /* ecxレジスタ破壊指定    */
+                             "cc" );        /* EFLAGSレジスタ破壊指定 */
+    
+    return;
+}
+
+
+/******************************************************************************/
+/**
  * @brief       cr0レジスタ設定
  * @details     cr0レジスタにシステム制御フラグを設定する。
  * 
@@ -770,4 +803,19 @@ static inline void IA32InstructionSwitchTask( IA32PagingPDBR_t pdbr,
 
 
 /******************************************************************************/
+/**
+ * @brief       wbinvd命令実行
+ * @details     キャッシュをメモリにライトバックし、キャッシュを無効化する。
+ */
+/******************************************************************************/
+static inline void IA32InstructionWbinvd( void )
+{
+    /* wbinvd命令実行 */
+    __asm__ __volatile__ ( "wbinvd" );
+    
+    return;
+}
+
+
+/******************************************************************************/
 #endif