/******************************************************************************/
/* src/kernel/include/hardware/IA32/IA32Instruction.h */
-/* 2017/06/16 */
+/* 2017/07/07 */
/* Copyright (C) 2016-2017 Mochi. */
/******************************************************************************/
#ifndef IA32_INSTRUCTION_H
/******************************************************************************/
/* インクルード */
/******************************************************************************/
+#include <stddef.h>
#include <stdint.h>
#include "IA32Descriptor.h"
#include "IA32Paging.h"
/******************************************************************************/
/**
+ * @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レジスタにシステム制御フラグを設定する。
*
/******************************************************************************/
+/**
+ * @brief wbinvd命令実行
+ * @details キャッシュをメモリにライトバックし、キャッシュを無効化する。
+ */
+/******************************************************************************/
+static inline void IA32InstructionWbinvd( void )
+{
+ /* wbinvd命令実行 */
+ __asm__ __volatile__ ( "wbinvd" );
+
+ return;
+}
+
+
+/******************************************************************************/
#endif