(57)【要約】      （修正有）【課題】投機実行されたメモリアクセス命令に起因するセキュリティ脆弱性の防止方法を提供する。【解決手段】演算処理装置は、命令発行部と、メモリアクセス命令に応答してＬ１キャッシュのヒット／ミス判定を行い、ミスの場合Ｌ２キャッシュにデータ要求を発行するＬ１キャッシュ制御部を有するＬ１キャッシュユニットと、Ｌ１キャッシュ制御部によるデータ要求に応答してデータ要求を制御するＬ２キャッシュ制御部を有するＬ２キャッシュユニットと、を有する。命令発行部は、投機実行した分岐命令により投機実行されるメモリアクセス命令に、有効な禁止フラグと分岐命令の命令識別子を付加して発行する。Ｌ１キャッシュ制御部は、キャッシュヒット判定がミスの場合、発行されたメモリアクセス命令の禁止フラグが有効であれば、Ｌ２キャッシュユニットにデータ要求を発行せず、ヒットの場合、Ｌ１キャッシュからデータを取得して応答する。【選択図】図３
2019212127.tif 000002
【特許請求の範囲】
【請求項１】
命令を発行する命令発行部と、
メモリ内の一部のデータを記憶する第１レベルのキャッシュメモリと、前記命令発行部が発行したメモリアクセス命令に応答して、前記第１レベルのキャッシュメモリのキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合、第２レベルのキャッシュユニットにデータ要求を発行する第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、
メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行する前記データ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有し、
前記命令発行部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な禁止フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して発行し、
前記第１レベルのキャッシュ制御部は、前記キャッシュヒット判定がキャッシュミスの場合、発行された前記メモリアクセス命令の前記禁止フラグが有効であれば、前記第２レベルのキャッシュユニットに前記データ要求を発行せず、前記キャッシュヒット判定がキャッシュヒットの場合、前記第１レベルのキャッシュメモリからデータを取得して応答する、演算処理装置。
【請求項２】
前記第１レベルのキャッシュメモリは、データが登録されるデータキャッシュメモリと、アドレス変換テーブルの一部が記憶されるTLB（Translation Lookaside Buffer）キャッシュのうち、いずれか一方または両方である、請求項１に記載の演算処理装置。
【請求項３】
前記命令発行部は、前記メモリアクセス命令が分岐命令の分岐先確定後に実行される非投機実行のメモリアクセス命令の場合、無効な前記禁止フラグを前記メモリアクセス命令に付加して発行し、
前記第１レベルのキャッシュ制御部は、前記キャッシュヒット判定がキャッシュミスの場合、前記禁止フラグが無効であれば、前記第２レベルのキャッシュユニットに前記データ要求を発行し、その結果前記第１レベルのキャッシュメモリを更新する、請求項１に記載の演算処理装置。
【請求項４】
前記第１レベルのキャッシュ制御部は、前記命令発行部から発行されたメモリアクセス命令を記憶するメモリアクセスキューを有し、
前記命令発行部は、前記分岐命令の分岐先が確定した場合、分岐予測が成功か否かの情報と前記分岐命令の識別子とを付加した分岐確定通知を前記第１レベルのキャッシュ制御部に発行し、
前記第１レベルのキャッシュ制御部は、
前記分岐確定通知に応答して、
前記分岐予測が成功の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致する分岐命令の識別子を有する前記メモリアクセスキューに記憶されたメモリアクセス命令の前記禁止フラグを無効化し、
前記分岐予測が失敗の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致するまたは後続する分岐命令の識別子を有する前記メモリアクセスキューに記憶されたメモリアクセス命令を無効化する、請求項１に記載の演算処理装置。
【請求項５】
前記第１レベルのキャッシュ制御部は、前記キャッシュヒット判定がキャッシュミスの場合、前記禁止フラグが無効であれば、前記メモリアクセス命令に応じて前記第１レベルのキャッシュメモリを更新する、請求項４に記載の演算処理装置。
【請求項６】
前記第１レベルのキャッシュ制御部は、
前記メモリアクセスキューから発行された前記メモリアクセス命令に対する、前記第１レベルのキャッシュメモリへのアクセス制御を実行し、
前記メモリアクセスキューから発行された前記メモリアクセス命令が、前記キャッシュミスし、前記禁止フラグが有効であれば、前記キャッシュミスの後前記禁止フラグが無効化されるまで、前記メモリアクセスキューから発行しない、請求項４に記載の演算処理装置。
【請求項７】
前記命令発行部は、命令をデコードする命令デコーダと、前記命令デコーダから発行された命令を前記第１レベルのキャッシュ制御部に発行するリザベーションステーションとを有し、
前記命令デコーダが、前記禁止フラグと前記分岐命令の命令識別子を付加して前記メモリアクセス命令を前記リザベーションステーションに発行し、
前記リザベーションステーションは、前記命令デコーダから発行された前記メモリアクセス命令を記憶するリザベーションステーションキューを有し、
前記リザベーションステーションは、
前記分岐確定通知に応答して、
前記分岐予測が成功の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致する分岐命令の識別子を有する前記リザベーションステーションキューに記憶されたメモリアクセス命令の前記禁止フラグを無効化し、
前記分岐予測が失敗の場合、前記分岐確定通知に付加された前記分岐命令の識別子と一致するまたは後続する分岐命令の識別子を有する前記リザベーションステーションキューに記憶されたメモリアクセス命令を無効化する、請求項４に記載の演算処理装置。
【請求項８】
命令を発行する命令発行部と、
メモリ内の一部のデータを記憶する第１レベルのキャッシュメモリと、前記命令発行部が発行したメモリアクセス命令に応答して、前記第１レベルのキャッシュメモリのキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合、第２レベルのキャッシュユニットにデータ要求を発行する第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、
メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行する前記データ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有する演算処理装置の制御方法であって、
前記命令発行部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な禁止フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して発行し、
前記第１レベルのキャッシュ制御部は、前記キャッシュヒット判定がキャッシュミスの場合、発行された前記メモリアクセス命令の前記禁止フラグが有効であれば、前記第２レベルのキャッシュユニットに前記データ要求を発行せず、前記キャッシュヒット判定がキャッシュヒットの場合、前記第１レベルのキャッシュメモリからデータを取得して応答する、演算処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，演算処理装置及び演算処理装置の制御方法に関する。
【背景技術】
【０００２】
演算処理装置は、プロセッサまたはCPU（Central Processing Unit）チップである。以下、演算処理装置をプロセッサと称する。プロセッサは、プログラムの命令を効率的に実行するために、様々な構成上または制御上の特徴を有する。その一つは、分岐命令の分岐条件が確定する前に分岐予測先の命令を投機的に実行する構成または制御である。
【０００３】
分岐命令の分岐先が確定するまで後続の命令を実行しない制御の場合、分岐先が確定するまでに必要とする時間が長くなればなるほど、何も実行できない状態が長くなる。そこで、分岐命令の後続の命令を投機実行する場合、分岐先が確定し分岐予測が正しいときには、性能向上につながる。分岐予測が誤りのときは、分岐命令の後続の命令の実行を全てキャンセルして、正しい分岐先の命令を実行することにより、プログラムは正常に動作する。投機実行の命令をキャンセルできるのは、投機実行された命令は、分岐先が確定するまで完了処理されず、命令セットで定義されたアーキテクチャレジスタを更新することがないからである。
【０００４】
プロセッサの投機実行やキャッシュメモリの制御などについては、以下の特許文献に記載されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平０７−１１４４６９号公報
【特許文献２】特開２００１−２６５６５１号公報
【特許文献３】特開２００７−１１６８９号公報
【特許文献４】特開２０１２−１２８６５６号公報
【非特許文献】
【０００６】
【非特許文献１】Jann Horn, “Reading privileged memory with a side-channel”, [online], [searched on May 9, 2018], internet <https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html?m=1>
【発明の概要】
【発明が解決しようとする課題】
【０００７】
前述のとおり、投機実行された命令は、命令セットで定義されたアーキテクチャレジスタを更新することはない。しかし、投機実行されたメモリアクセス命令が、第１レベルのデータキャッシュでキャッシュミスしたり、第１レベルのTLB(Translation Lookaside Buffer)でTLBキャッシュミスすると、第２レベルのキャッシュにデータを要求し、第１レベルのデータキャッシュや第１レベルのTLBの状態を更新する。この場合、分岐命令が分岐予測失敗で分岐先が確定すると、投機実行されたメモリアクセス命令がキャンセルされるが、第１レベルのデータキャッシュや第１レベルのTLBの更新状態は、キャンセルされず残ってしまう。
【０００８】
この投機実行のメモリアクセス命令によるキャッシュの更新状態が残ることを利用した悪意のあるプログラムが、プロセッサのセキュリティの脆弱性を招くことが報告されている。例えば、分岐命令の分岐先が未確定の間、誤った分岐先の悪意のあるメモリアクセス命令を投機実行し、保護されたメモリ領域を第１レベルのデータキャッシュに格納した後に、第１レベルのデータキャッシュの状態から保護されたメモリ領域の内容が明らかにされるというセキュリティ上の問題点が指摘されている。
【０００９】
そこで，本実施の形態の第１の側面の目的は，投機実行されたメモリアクセス命令が第１レベルのデータキャッシュやTLBを更新することでプロセッサのセキュリティが脆弱になることを防止した演算処理装置及び演算処理装置の制御方法を提供することにある。  
【課題を解決するための手段】
【００１０】
本実施の形態の第１の側面は，命令を発行する命令発行部と、メモリ内の一部のデータを記憶する第１レベルのキャッシュメモリと、前記命令発行部が発行したメモリアクセス命令に応答して、前記第１レベルのキャッシュメモリのキャッシュヒット判定を行い、前記キャッシュヒット判定がキャッシュミスの場合、第２レベルのキャッシュユニットにデータ要求を発行する第１レベルのキャッシュ制御部とを有する、第１レベルのキャッシュユニットと、メモリ内の一部のデータを記憶する第２レベルのキャッシュメモリと、前記第１レベルのキャッシュ制御部が発行する前記データ要求に応答して、前記データ要求を制御する第２レベルのキャッシュ制御部とを有する、前記第２レベルのキャッシュユニットとを有し、
前記命令発行部は、前記メモリアクセス命令が分岐命令の分岐先未確定中に投機的に実行される投機実行のメモリアクセス命令の場合、有効な禁止フラグと前記分岐命令の命令識別子を、前記メモリアクセス命令に付加して発行し、
前記第１レベルのキャッシュ制御部は、前記キャッシュヒット判定がキャッシュミスの場合、発行された前記メモリアクセス命令の前記禁止フラグが有効であれば、前記第２レベルのキャッシュユニットに前記データ要求を発行せず、前記キャッシュヒット判定がキャッシュヒットの場合、前記第１レベルのキャッシュメモリからデータを取得して応答する、演算処理装置である。
【発明の効果】
【００１１】
第１の側面によれば，投機実行されたメモリアクセス命令が第１レベルのデータキャッシュやTLBを更新することでプロセッサのセキュリティが脆弱になることを防止できる。
【図面の簡単な説明】
【００１２】
【図１】分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。
【図２】図１の分岐命令とロード命令の処理のフローチャート図である。
【図３】本実施の形態における演算処理装置の概略的な構成を示す図である。
【図４】本実施の形態における分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。
【図５】本実施の形態における分岐命令とロード命令の処理のフローチャート図である。
【図６】本実施の形態のプロセッサを搭載する情報処理装置の概略図である。
【図７】本実施の形態におけるプロセッサの構成例を示す図である。
【図８】本実施の形態における命令デコーダの構成例を示す図である。
【図９】RSAの構成例を示す図である。
【図１０】分岐確定した場合のRSA内の各エントリの禁止フラグL2$_INHに対する制御を示すフローチャート図である。
【図１１】L1データキャッシュユニットの構成を示す図である。
【図１２】メモリアクセスキューの構成を示す図である。
【図１３】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【図１４】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【図１５】L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。
【図１６】分岐命令が分岐未確定中に投機実行されるメモリアクセス命令に対するプロセッサ内の処理を示すシーケンスチャート図である。
【図１７】分岐命令が分岐予測成功で分岐確定後の非投機実行のメモリアクセス命令に対するプロセッサ内の処理を示すシーケンスチャート図である。
【図１８】L1キャッシュのメモリアクセス命令の実行処理の第２の例のフローチャート図である。
【図１９】L1キャッシュのメモリアクセス命令の実行処理の第２の例のフローチャート図である。
【図２０】L1キャッシュのメモリアクセス命令の実行処理の第２の例のフローチャート図である。
【図２１】プロセッサの脆弱性を説明する図である。
【発明を実施するための形態】
【００１３】
図１は、分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。図１の横軸は時間を、縦軸はプログラムの順番を示す。図１では、分岐命令BRと、それに後続するロード命令LOAD_A及びロード命令LOAD_Bとが順番に発行される。
【００１４】
図２は、図１の分岐命令とロード命令の処理のフローチャート図である。図２を参照して、図１の分岐命令、ロード命令の処理について説明する。
【００１５】
分岐命令BRは、命令デコーダでデコードされ、実行可能な分岐命令にされて実行される（S1）。分岐命令BRは、分岐命令のソースデータを演算器などから受信した後、分岐先が確定され、命令が完了する。分岐命令がデコードされてから分岐先が確定するまでの分岐未確定の間にデコードされて発行される命令は、投機実行の命令となる。図１中のロード命令LOAD_AとLOAD_Bは、いずれも分岐未確定中に発行されるので、投機実行のメモリアクセス命令である。
【００１６】
先発のロード命令LOAD_Aと後発のロード命令LOAD_Bは、共に、命令デコードされ（S2）、メモリアクセス命令を処理するストレージユニットのリザベーションステーションであるRSA（Reservation Station for Address generation）から第１レベル（以下L1(Level 1)と称する）キャッシュに発行される（S3）。ロード命令LOAD_AはL1データキャッシュL1D$でキャッシュミスし、一方、ロード命令LOAD_BはL1データキャッシュでキャッシュヒットする命令である。
【００１７】
この場合、先発のロード命令LOAD_Aは、デコード後（S2）、RSAから発行され（S3）、L1データキャッシュでキャッシュミスし（S4のNO）、第２レベル（以下L2と称する）のキャッシュL2$にデータ要求が発行される。そして、L2キャッシュがデータ要求を実行してロードデータを読み出してL1データキャッシュに応答し（S7）、応答されたデータでL1データキャッシュが更新され（S8）、命令実行を終了する（S6）。そして、直前の分岐命令BRの命令が完了した後、ロード命令LOAD_Aが命令完了処理をする。命令完了処理は命令をインオーダーで完了する制御であり、例えば、ロードデータが格納されたレジスタをアーキテクチャレジスタとして扱う処理を伴う。
【００１８】
一方、後発のロード命令LOAD_Bは、RSAから発行され（S3）、L1データキャッシュでキャッシュヒットし（S4のYES）、ロードデータを読み出し（S5）、命令実行を終了する（S6）。そして、直前のロード命令LOAD_Aが命令完了処理された後、ロード命令LOAD_Bが命令完了処理される。
【００１９】
図１に示されたロード命令LOAD_A,LOAD_Bは、いずれも分岐命令BRの分岐予測が正しかった（分岐予測成功）場合である。分岐命令の分岐予測が正しくなかった（分岐予測失敗）の場合、投機実行された２つのロード命令LOAD_A,LOAD_Bは、命令完了処理を行うことなく、キャンセルされる。分岐予測失敗に伴うロード命令のキャンセルにより、命令デコーダから発行されたRSA内またはキャッシュ制御部内の投機実行のロード命令は無効化され、リネーミングレジスタに格納されていたロードデータも無効化される。
【００２０】
［プロセッサのセキュリティの脆弱性の例］
図２１は、プロセッサの脆弱性を説明する図である。プロセッサのセキュリティの脆弱性は、例えば、以下の不正な命令列が実行された場合に生じる場合がある。
JMP C                        //分岐先Cに分岐する分岐命令//
B LOAD1 R0 [秘密値格納のアドレス] //秘密値が格納されたアドレスで投機的にロードし
レジスタR0に秘密値を格納//
A LOAD2 *[100+R0]           //レジスタR0内のアドレス（秘密値）で投機的にロードする//
【００２１】
上記の命令列には、不正なロード命令“LOAD1”“LOAD2”が追加されている。不正なプログラムは、最初にキャッシュメモリをクリアしておき、特権モード（OSモード）に遷移する（S91）。そして、プロセッサが、特権モードで、分岐命令JMP Cを実行するが、分岐命令の分岐先Cが確定する前に、分岐予測先Bのロード命令LOAD1を投機的に実行する（S92）。この分岐予測先Bは分岐予測情報として不正に登録されていて、分岐命令の正しい分岐先はCであるとする。
【００２２】
プロセッサが、この誤った分岐予測先Bのロード命令LOAD1を投機的に実行すると、特権モードでしかアクセスが許可されていないプロテクトされたメモリ領域内の秘密値Xを読み出し、レジスタR0に格納する。
【００２３】
更に、秘密値Xをアクセス許可領域の先頭アドレス「100」に加算し（S93）、次のロード命令A LOAD2を投機的に実行する（S94）。すると、先頭アドレス[100]にレジスタR0内の秘密値Xを加算したアドレス100+Xのロード命令LOAD2が、L1キャッシュでキャッシュミスし、L2キャッシュにデータ要求を発行する。このデータ要求で、ユーザモードでアクセスが許可されているメモリ領域M1内のアドレス100+XのデータDA1が読み出される。この結果、プロセッサのL1キャッシュメモリ内のアドレス100+XのエントリにデータDA1が登録され、L1キャッシュの更新が行われる（S95）。
【００２４】
その後、プロセッサが、アドレスを変更しながら図示しないロード命令LOAD3を繰り返すと（S96）、データDA1が登録されているアドレス100+Xへのロード命令のアクセスレイテンシが他のアドレス100よりも短くなり、アドレス100+Xの内容を知ることができる。これにより、秘密値Xのセキュリティが低下する。
【００２５】
２つのロード命令LOAD1, LOAD2が投機的に実行された後、分岐命令JMP Cの実行が完了して分岐先が確定すると、分岐予測先Bが分岐予測ミスであったことが判明する。その結果、プロセッサ内のパイプライン回路で投機的に実行されたロード命令LOAD1, LOAD2が無効化され、レジスタR0の内容がクリアされる。投機実行の命令は命令未完了であり、リネーミングレジスタであるレジスタR0はクリアされる。しかし、キャッシュメモリはクリアされないため、キャッシュメモリのレイテンシに基づいて秘密値Xを獲得することができる。
【００２６】
このように、分岐命令JMPの分岐先が確定する前に、誤った分岐予測先の投機実行のロード命令LOAD1,LOAD2が実行されることと、LOAD2の実行によりキャッシュ登録状態が維持されることが、プロセッサの脆弱性の原因の一つである。
【００２７】
［本実施の形態の概略］
図３は、本実施の形態における演算処理装置の概略的な構成を示す図である。図３に示した演算処理装置は、命令発行部を構成する命令デコーダI_DECと、命令デコーダが発行するメモリアクセス命令をキューインするRSAと、命令デコーダが発行する分岐命令をキューインするRSBR（Reservation Station for Branch）を有する。
【００２８】
更に、演算処理装置は、ストレージユニットSUを構成するオペランドアドレス生成器OP_ADD_GENと、L1データキャッシュL1D$とを有する。L1データキャッシュL1D$は、L2キャッシュL2$に接続される。また、固定小数点物理レジスタファイルFX_REGは、オペランドアドレス生成器が生成したアドレスや、L1データキャッシュL1D$から応答されるデータが格納される。固定小数点物理レジスタは、命令の完了処理前に処理結果が格納されるリネーミングレジスタと、命令の完了処理で処理結果が格納されるアーキテクチャレジスタを含む。
【００２９】
図４は、本実施の形態における分岐命令と後続の投機実行のメモリアクセス命令の動作例を示す図である。また、図５は、本実施の形態における分岐命令とロード命令の処理のフローチャート図である。図３，図５を参照して、図４の分岐命令、ロード命令の処理について説明する。
【００３０】
まず、命令デコーダI_DECは、分岐命令をデコードするとき（S11）、分岐命令に割り当てた命令識別子（IID：Instruction ID）を保持し（S12）、分岐命令が分岐未確定中に有効になる禁止フラグを保持する（S13）。そして、命令デコーダは、メモリアクセス命令であるロード命令をデコードするとき、分岐命令が分岐未確定中に実行される投機実行のメモリアクセス命令に、その直前の分岐命令のIIDと禁止フラグを付加する（S14）。更に、命令デコーダは、メモリアクセス命令を、RSAに発行し、RSAの命令の発行キューにキューインする。
【００３１】
RSAは、メモリアクセス命令のオペランドアドレスの準備ができるなど実行可能になると、発行キュー内のメモリアクセス命令をストレージユニットSUに発行する（S15）。発行されたメモリアクセス命令は、オペランドアドレス生成器OP_ADD_GENでオペランドアドレスを生成された後、L1データキャッシュL1D$に送られる。L1データキャッシュには、メモリアクセス命令がキューインされるメモリアクセスキューを有する。このとき、メモリアクセス命令は分岐命令のIIDと禁止フラグが付加されてL1データキャッシュに送られ、メモリアクセスキューに記憶される。
【００３２】
L1データキャッシュL1D$は、メモリアクセス命令（ロード命令）が、L1データキャッシュメモリにアクセス先アドレスのデータが登録されていないことによりデータキャッシュミスするか、L1TLBキャッシュにアクセス先アドレスのアドレス変換情報が登録されていないことによりL1TLBキャッシュミスすると（S16のNO）、L2キャッシュL2$にデータを要求するデータ要求を発行するか否か判断する（S19）。L1TLBはメインメモリ内のアドレス変換データの一部が登録される一種のキャッシュメモリである。
【００３３】
ここで、L1データキャッシュメモリにアクセス先アドレスのデータが登録されているか否かを判定するデータキャッシュヒット判定と、L1TLBにアクセス先アドレスのアドレス変換情報が登録されているか否かを判定するTLBキャッシュヒット判定を、総称して、L1データキャッシュでのキャッシュヒット判定と称する。したがって、L1データキャッシュでのキャッシュミスは、データキャッシュミスまたはTLBキャッシュミスのいずれかが発生したことを意味する。
【００３４】
メモリアクセス命令の禁止フラグが有効であれば（S19のNO）、分岐命令は分岐先未確定の状態であり、メモリアクセス命令が投機実行命令である。そこで、本実施の形態では、L1データキャッシュは、L2キャッシュL2$にデータ要求を発行しない。そして、L1データキャッシュは、メモリアクセス命令をメモリアクセスキューに差し戻し、分岐命令の分岐先が確定するまでL2キャッシュにデータ要求を発行することを抑止する。L2キャッシュにデータ要求を発行しないことで、L1データキャッシュがL2キャッシュからデータ要求で取得したデータで更新されることが抑止される。結局、禁止フラグが有効な場合、L1データキャッシュは、L2キャッシュにデータ要求を発行せず、L1データキャッシュ（またはL1TLB）が更新されることを抑止する。
【００３５】
分岐命令の分岐先が確定すると（S19のYES）、分岐命令の分岐予測が正しい場合（S20のYES）、L1データキャッシュは、L2キャッシュにデータ要求を発行し、L2キャッシュL2$からロードデータを読み出し（S21）、L1データキャッシュL1D$をロードデータで更新する。分岐先が確定し且つ分岐予測が正しい場合、メモリアクセス命令に付加されていた禁止フラグは無効化される。禁止フラグが無効化されることにより、L1データキャッシュは、メモリアクセス命令に対して、L2キャッシュへのデータ要求を発行する。
【００３６】
逆に、分岐命令の分岐先が確定し（S19のYES）、分岐命令の分岐予測が誤りの場合（S20のNO）、投機実行のメモリアクセス命令は実行されない命令となるため、L1データキャッシュは、分岐命令の確定後、投機実行されていたメモリアクセス命令を全て無効化してキャンセルする（S23）。
【００３７】
以上の制御により、分岐命令が分岐未確定中に投機実行されるメモリアクセス命令により、L1データキャッシュ内のL1データキャッシュメモリとL1TLBキャッシュが更新されることがないので、プロセッサの脆弱性をなくすことができる。
【００３８】
一方、投機実行のメモリアクセス命令が、L1データキャッシュでキャッシュヒット（データキャッシュヒットとTLBキャッシュヒットの両方が発生したことを意味する）した場合（S16のYES）、投機実行のメモリアクセス命令を実行してもL1データキャッシュL1D$やL1TLBキャッシュを更新することはない。したがって、L1データキャッシュは、通常通り投機実行のメモリアクセス命令を実行する（S17）。
【００３９】
図４に示したとおり、先発のロード命令LOAD_Aは、L1データキャッシュでキャッシュミス（データキャッシュミスまたはL1TLBミスが発生）するが、L1データキャッシュは、L2キャッシュへのデータ要求の発行を抑止し、L1データキャッシュが更新されることを抑止する。そして、分岐命令の分岐確定まで待機し、分岐命令が分岐確定し且つ分岐予測が正しい場合、L1データキャッシュは、L2キャッシュにデータ要求を発行し、それにより獲得したロードデータでL1データキャッシュまたはL1TLBキャッシュを更新する。
【００４０】
一方、後発のロード命令LOAD_Bは、L1データキャッシュでキャッシュヒット（データキャッシュヒットまたはL1TLBヒット）するので、非投機実行のメモリアクセス命令と同様に、L1データキャッシュからロードデータを読み出し、または、L1TLBキャッシュによりアドレス変換する。
【００４１】
図４の例では、分岐命令が分岐確定し且つ分岐予測が正しかったため、２つのロード命令LOAD_A、LOAD_Bに対して、L1データキャッシュは、L2キャッシュからデータを取得し、L1データキャッシュまたはL1TLBキャッシュを更新している。もし、分岐予測が誤りであった場合、ロード命令LOAD_Aは、L2キャッシュにデータ要求することはなく無効化されると共に、ロード命令LOAD_Bも、命令の実行は終了しているが、命令の完了処理をされることなく、無効化される。
【００４２】
尚、分岐命令が分岐確定後にメモリアクセス命令がL1データキャッシュで実行される場合、メモリアクセス命令の禁止フラグは無効にされているので、従来と同じキャッシュ制御が行われる。すなわち、L1データキャッシュは、L1データキャッシュメモリとL1TLBにアクセス先アドレス（オペランドアドレス）に対するデータが存在するか否かをチェックし、両方ヒットの場合、L1データキャッシュメモリからデータを取得する。一方、いずれかミスする場合、L1データキャッシュは、L2キャッシュにデータを要求するデータ要求を発行し、L2キャッシュからデータの応答が有ると、L1データキャッシュメモリまたはL1TLBを、応答されたデータで更新する。そして、L1データキャッシュメモリからデータを取得して、CSEにメモリアクセス命令の実行終了を報告し、メモリアクセスキュー内のメモリアクセス命令のエントリを解放する。
【００４３】
［本実施の形態のプロセッサ及びそれを有する情報処理装置］
図６は、本実施の形態のプロセッサを搭載する情報処理装置の概略図である。情報処理装置、HPC：High Performance Computerやスーパーコンピュータは、複数のノードそれぞれに、プロセッサCPU（Central Processing Unit）と、メインメモリM_MEMと、入出力部I/Oとを有する。各ノードのプロセッサCPUは、プロセッサ内に設けたインターコネクトを介して相互にパケット通信する。
【００４４】
演算処理装置であるプロセッサCPUは、複数のコアCORE_0〜CORE_nと、複数のコアで共有されるラストレベルキャッシュLL$（Last Level Cache）と、メモリへのアクセスを制御するメモリアクセス制御部MACと、他のノードのプロセッサとの間のパケット通信を制御するインターコネクトI_CNCTとを有する。各コアCOREは、後述するとおり、命令発行部と、演算器と、L1キャッシュとを有する。そして、図７のラストレベルキャッシュLL$は、例えば第２レベルキャッシュまたはL2キャッシュである。
【００４５】
図７は、本実施の形態におけるプロセッサの構成例を示す図である。図７のプロセッサは、命令発行部として、命令フェッチアドレス生成器I_F_ADD_GENと、L1命令キャッシュL1_ICACHEと、L2命令キャッシュL2_ICACHEと、命令バッファI_BUFと、命令デコーダI_DECと、複数の命令を演算器に発行する命令発行部である、リザベーションステーションRSA, RSE, RSFを有する。また、命令発行部は、分岐命令用リザベーションステーションRSBRと、コミットスタックエントリCSEを有する。
【００４６】
更に、プロセッサは、複数の演算器として、ストレージユニットSU、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCを有する。これらの演算器は、それぞれ単一または複数個を有する。
【００４７】
ストレージユニットSUは、アドレス計算するための加減算回路を含むオペランドアドレス生成器OP_ADD_GENと、L1データキャッシュL1_DCACHEを有する。L1データキャッシュは、キャッシュメモリに加えて、キャッシュメモリに対する制御を行うL1キャッシュ制御部L1$_CNTを有する。
【００４８】
また、固定小数点演算器FX_EXC、浮動小数点演算器FL_EXCは、例えば、加減算回路と論理演算器と乗算器などを有する。浮動小数点演算器は、例えば、SIMD（Single Instruction Multiple Data）演算ができるように、SIMD幅に対応した数の演算器を有する。プロセッサは、これらの演算器の処理結果を格納する固定小数点レジスタファイルFX_REGと、浮動小数点用レジスタファイルFL_REGを有する。これらのレジスタファイルは、複数のレジスタを有し、その一部は命令完了処理前に処理結果が格納されるリネーミングレジスタと、命令完了処理時に処理結果が格納されるアーキテクチャレジスタである。アーキテクチャレジスタは、ソフトウエアからアクセス可能なレジスタであり、汎用レジスタである。
【００４９】
プロセッサは、更に、複数のコアで共有されるL2キャッシュL2$を有し、図示しないメモリコントローラを介してメインメモリM_MEMに接続される。また、L2命令キャッシュL2_ICACHEもメモリコントローラを介してメインメモリM_MEMに接続される。L2キャッシュL2$は、前述のラストレベルキャッシュである。
【００５０】
プロセッサ全体の構成について、命令の処理の流れに沿って以下概略を説明する。命令フェッチアドレス生成器I_F_ADD_GENがフェッチアドレスを生成し、プログラム内の実行順に（インオーダーで）、L1命令キャッシュL1_ICACHEからフェッチ命令を一旦命令バッファI_BUFに格納する。そして、命令デコーダI_DECが、命令バッファ内のフェッチ命令をインオーダーで入力しデコードし、実行に必要な情報を付加した実行可能命令（実行命令）を生成する。
【００５１】
次に、命令デコーダで生成された実行命令は、インオーダーで、リザベーションステーションと呼ばれるキュー構造のストレージにキューインされ蓄積される。リザベーションステーションは、実行命令をキューに蓄積する実行キューであり、命令を実行する演算器毎に設けられる。
【００５２】
リザベーションステーションは、例えば、L1データキャッシュL1$を含むストレージユニットSUに設けられた、RSA（Reservation Station for Address generation）と、固定小数点演算器FX_EXCに設けられたRSE(Reservation Station for Execution)と、浮動小数点演算器FL_EXCに設けられたRSF（Reservation Station for Floating point）とを有する。さらに、分岐予測ユニットBR_PRDに対応するRSBR(Reservation Station for Branch)を有する。
【００５３】
以下、リザベーションステーションは、適宜、省略してRSと称する。
【００５４】
そして、各ＲＳにキューインされた実行命令は、命令実行に必要な入力オペランドが前の命令の演算処理の完了処理により汎用レジスタファイルから読み出し可能であるか否か（リードアフターライト（RAW）制約が満たされるか否か）や、演算器の回路資源を使用できるか否かなど、命令の実行条件が整ったものから、順不同で（アウトオブオーダーで）演算器に発行され演算器で実行される。
【００５５】
一方、命令デコーダI_DECは、フェッチ命令をデコードして生成した実行命令に、そのプログラム内の実行順に命令識別子（Instruction Identification: IID）を割り振り、実行命令をインオーダーでコミットスタックエントリCSE（Commit Stack Entry、以下CSEと称する）に送信する。CSEは、送信されてきた実行命令をインオーダーで格納するキュー構造のストレージと、演算器のパイプライン回路からの命令の処理完了報告に応答してキュー内の情報等に基づき各命令のコミット処理（完了処理）を行う命令コミット処理ユニットとを有する。したがって、CSEは命令の完了処理を行う完了処理回路（完了処理部）である。
【００５６】
実行命令は、CSE内のキューにインオーダーで格納され、各演算器からの命令の処理完了報告を待つ。そして、上記したとおり、各ＲＳから実行命令がアウトオブオーダーで演算器に送信され、演算器により実行される。その後、命令の処理完了報告がCSEに送られると、CSEの命令コミット処理ユニットが、キューに格納された処理完了報告待ちの命令の中から処理完了報告に対応する実行命令をインオーダーで完了処理し、レジスタなどの回路資源の更新を行う。CSEは、完了処理でプログラムカウンタPCをインクリメントする。
【００５７】
分岐処理用のRSBRにキューインされた分岐命令は、分岐予測ユニットBR_PRDによって分岐予測され、予測結果に基づいて命令フェッチアドレス生成器I_F_ADD_GENが分岐先アドレスを生成する。その結果、分岐予測に基づく命令が、命令キャッシュから読み出され、命令バッファ、命令デコーダを経由して、演算器により投機的に実行される。RSBRは、分岐命令をインオーダーで実行する。また、分岐命令の分岐先が確定する前に、分岐先を予測し、予測分岐先の命令を投機的に実行することが行われる。分岐予測が正しければ処理効率が上がり、一方、誤りであれば投機実行した命令はパイプライン内でキャンセルされるため処理効率が下がる。
【００５８】
［命令デコーダ］
図８は、本実施の形態における命令デコーダの構成例を示す図である。命令デコーダI_DECは、命令バッファI_BUF内の命令をインオーダーで入力し、命令をデコードし、分岐命令をRSBRに発行し、メモリアクセス命令をRSAに発行する。
【００５９】
命令デコーダI_DECは、フェッチ命令をデコードするデコーダ１０と、分岐命令の命令識別子IIDとそのバリッドビットVを格納する分岐命令バッファ１２と、比較回路１４とを有する。命令デコーダ内のデコーダ１０は、分岐命令をデコードすると、分岐命令にIIDを割り当てて、分岐命令バッファ１２に格納し、そのバリッドビットVを有効「１」にする。そして、デコーダ１０は、分岐命令をRSBRに発行する。
【００６０】
RSBRは、分岐命令の分岐先が確定すると、分岐確定を示す分岐確定通知信号と分岐命令のIIDとを命令デコーダI_DECに送信する。命令デコーダ内の比較回路１４は、分岐命令バッファ１２内のIIDとRSBRから分岐確定通知に付加されたIIDとを比較し、一致すると、分岐命令バッファ１２のバリッドビットVを無効「０」にする。これにより、分岐確定状態となる。
【００６１】
そして、デコーダ１０は、新たに分岐命令をデコードすると、その分岐命令の命令識別子IIDで分岐命令バッファ１２を更新する。このようにして、分岐命令バッファ１２には、最後にデコードした分岐命令のIIDと、分岐未確定状態（バリッドビットVが「１」）か、分岐確定状態（バリッドビットVが「０」）かを示すバリッドビットVが格納される。
【００６２】
命令デコーダは、分岐命令が分岐未確定中に発行するメモリアクセス命令に、L1データキャッシュでのキャッシュミス時のL2キャッシュへのデータ要求の発行を禁止し、それによりL1データキャッシュの更新を禁止する禁止フラグL2$_INHと、未確定の分岐命令の命令識別子IID（Instruction ID）とを付加して、RSAに発行する。禁止フラグL2$_INHは、分岐命令バッファ１２のバリッドビットVと同じである。
【００６３】
一方、命令デコーダは、分岐命令が分岐確定後に発行するメモリアクセス命令に、分岐確定により無効なバリッド信号「０」に基づき、無効な禁止フラグ「０」を付加して、RSAに発行する。このメモリアクセス命令が実行されると、L1データキャッシュでキャッシュミスした場合、L2キャッシュにデータを要求するデータ要求が発行され、L2キャッシュからデータを取得され、L1データキャッシュが更新される。
【００６４】
上記の通り、命令デコーダI_DECは、分岐命令が分岐未確定中に発行するメモリアクセス命令に、有効な禁止フラグL2$_INHとその分岐命令のIIDとを付加して、RSAに発行する。一方、分岐確定後に発行するメモリアクセス命令には、無効な禁止フラグL2$_INHを付加してRSAに発行する。
【００６５】
後述する通り、メモリアクセス命令は、RSAの発行キューに作成されたエントリに格納される。さらに、RSAがメモリアクセス命令を発行すると、発行されたメモリアクセス命令は、L1キャッシュ制御部内のメモリアクセスキューに作成されたエントリに格納される。そして、RSBRが分岐命令の分岐確定通知信号を分岐命令の命令識別子IIDと共にRSAとL1キャッシュ制御部に送信すると、分岐予測が正しい場合は、RSA内の発行キューに格納されているメモリアクセス命令の禁止フラグL2$_INHが無効化され、L1キャッシュ制御部のメモリアクセスキューに格納されているメモリアクセス命令の禁止フラグL2$_INHも無効化される。
【００６６】
［RSA］
図９は、RSAの構成例を示す図である。RSAは、発行キューRSA_QUEを有し、発行キューにエントリENTRY_0〜ENTRY_nを作成して、命令デコーダから発行されたメモリアクセス命令MA_Iをエントリに登録してキューインする。各エントリに登録（記憶）される情報は、エントリのバリッドビットVと、メモリアクセス命令MA_Iの情報（ロードかストアの種別、アクセス先アドレスに関する情報等）と、禁止フラグL2$_INHと、分岐命令のIIDである。
【００６７】
RSA内の発行キューの各エントリは、オペランドアドレスを生成するためのデータが揃ったら、そして、オペランドアドレス生成器やL1データキャッシュの資源が利用可能になると、ストレージユニットSUに発行される。また、各エントリが発行待ちの間にエントリ内のIIDに対応する分岐命令の分岐先が確定すると、RSBRから分岐確定通知BR_DTRが、分岐先確定した分岐命令のIIDと分岐予測が成功か失敗かの情報と共に、全エントリに送られる。各エントリには、分岐確定通知BR_DTRのIIDと、エントリ内のIIDとを比較し比較結果CMPを出力する比較回路２０が設けられる。
【００６８】
図１０は、分岐確定した場合のRSA内の各エントリの禁止フラグL2$_INHに対する制御を示すフローチャート図である。図１０を参照しながら、図９のRSAの分岐確定時の禁止フラグに対する制御を説明する。
【００６９】
分岐命令が確定していなければ（S30のNO）、RSBRから分岐命令の分岐先が確定したことを通知する分岐確定通知がなく、エントリ内の禁止フラグL2$_INHは現状の状態のまま保持される（S31）。一方、分岐命令が確定すると（S30のYES）、RSBRから分岐確定通知BR_DTRが送信される。
【００７０】
分岐確定通知の分岐予測が正しかった場合（S32のYES）、RSAは、各エントリの禁止フラグが有効「１」の場合（S33のYES）、比較回路２０により分岐確定通知に付加された分岐先確定した分岐命令のIIDとエントリ内の分岐命令のIIDとが一致すると判定されると、そのエントリの禁止フラグL2$_INHを無効「０」に変更する（S36）。これにより、エントリのメモリアクセス命令は非投機実行の命令となる。また、不一致のエントリの禁止フラグは有効のまま保持される（S37）。
【００７１】
一方、分岐確定通知の分岐予測が誤りであった場合（S32のNO）、RSAは、比較回路２０により分岐確定通知に付加された分岐先確定した分岐命令のIIDとエントリ内の分岐命令のIIDとが比較され（S38）、エントリの分岐命令のIIDが、分岐確定した分岐命令のIIDと一致またはそれの後続の分岐命令のIIDと一致する場合（S39のYES）、投機失敗を意味するので、エントリのバリッドビットVを無効化する（S40）。これにより無効化されたエントリの命令はキャンセルされる。また、RSAは、エントリの分岐命令のIIDが、分岐確定した分岐命令のIIDと不一致またはそれの後続の分岐命令のIIDと不一致の場合（S39のNO）、エントリの禁止フラグを現状の状態のまま保持する（S41）。
【００７２】
［L1データキャッシュとそのメモリアクセスキュー］
図１１は、L1データキャッシュユニットの構成を示す図である。L1データキャッシュユニット（以下簡略してL1データキャッシュと称する）L1D$は、オペランドアドレス生成器OP_ADD_GENと共にストレージユニットSUを構成する。RSAから発行されたメモリアクセス命令は、オペランドアドレス生成器によりオペランドアドレスを生成され、L1データキャッシュ内のメモリアクセスキューMA_QUEにエントリを作成する。このエントリには、メモリアクセス命令の情報と、禁止フラグL2$_INHと、分岐命令のIIDと、後述するL1データキャッシュでキャッシュミスしたことを示すL1データキャッシュミスフラグL1D$_MISSとが登録（記憶）される。
【００７３】
L1データキャッシュL1D$内には、L1データキャッシュメモリ３４と、L1TLB３５とを有する。L1データキャッシュメモリ３４には、メモリ内のデータの一部がそのタグ情報と共に記憶される。また、L1TLB３５には、メモリ内のアドレス変換テーブルの一部が記憶される。従って、L1データキャッシュメモリ３４とL1TLB３５は、共に、メモリ内のデータの一部を記憶する一種のキャッシュメモリである。そのため、L1データキャッシュメモリ３４とL1TLB３５はいずれも、メモリアクセス命令のオペランドアドレスに基づいて検索され、キャッシュヒット判定される。キャッシュヒット判定が、キャッシュミスの場合（L1データキャッシュメモリ３４がキャッシュミスまたはL1TLB３５がキャッシュミス）、L2キャッシュにデータを要求するデータ要求が発行され、L2キャッシュから取得したデータで更新される。
【００７４】
L1データキャッシュユニットL1D$は、メモリアクセスキューから投入されたエントリのメモリアクセス命令に対してキャッシュ制御するL1データキャッシュ制御部L1D$_CNTを有する。L1データキャッシュ制御部L1D$_CNTは、L1TLBキャッシュヒット判定回路３１と、L1データキャッシュヒット判定回路３０と、L1TLB実行制御部３３と、L1データキャッシュ実行制御部３２とを有する。
【００７５】
メモリアクセスキューMA_QUE内のエントリがL1データキャッシュ制御部L1D$_CNTのパイプライン回路に投入（入力）されると、L1データキャッシュ制御部L1D$_CNTは、オペランドアドレスに基づいてL1TLB３５からタグデータを読み出す。そして、読み出されたデータは、L1TLBキャッシュヒット判定回路３１に送られ、L1TLBキャッシュヒット判定される。
【００７６】
L1TLBキャッシュミスと判定されると、L1TLB実行制御部３３は、L2キャッシュにアドレス変換データを要求するデータ要求を発行するか否かを判断する。
【００７７】
L1TLB実行制御部３３は、投入されたエントリの禁止フラグL2$_INHが有効「１」であれば、L2キャッシュへのデータ要求を発行せず、エントリの実行を中断して、エントリをメモリアクセスキューMA_QUEに差し戻す。禁止フラグL2$_INHが無効「０」であれば、L2キャッシュへのデータ要求を発行し、L2キャッシュから獲得したアドレス変換データでL1TLB３５を更新する。L1TLBの更新処理が完了すると、L1TLB実行制御部は、実行中のエントリをメモリアクセスキューに差し戻す。
【００７８】
一方、L1TLBキャッシュヒットと判定されると、L1TLB３５からオペランドアドレスに対する変換後アドレスが読み出され、L1データキャッシュヒット判定回路３０に送られる。そして、データキャッシュヒット判定回路３０が、オペランドアドレスに基づいてL1データキャッシュメモリ３４からタグデータを読み出し、タグデータと変換後アドレスに基づいて、L1データキャッシュヒット判定を行う。
【００７９】
データキャッシュヒットの場合、L1データキャッシュ実行制御部３２は、通常通りL1データキャッシュメモリ３４からデータを読み出して、データ応答する。このデータ応答により、読み出したデータは固定小数点物理レジスタファイルFX_REG内のリネーミングレジスタに記憶される。
【００８０】
一方、データキャッシュミスの場合、L1データキャッシュ実行制御部３２は、L2キャッシュにデータを要求するデータ要求を発行するか否かを判断する。
【００８１】
L1データキャッシュ実行制御部３２は、投入されたエントリの禁止フラグL2$_INHが有効「１」であれば、L2キャッシュへのデータ要求を発行せず、エントリの実行を中断して、エントリをメモリアクセスキューMA_QUEに差し戻す。禁止フラグL2$_INHが無効「０」であれば、L2キャッシュへのデータ要求を発行し、L2キャッシュから獲得したデータでL1データキャッシュメモリ３４を更新する。L1データキャッシュメモリの更新処理が完了すると、L1データキャッシュ実行制御部３２は、実行中のエントリをメモリアクセスキューに差し戻す。再度、エントリが入力されると、L1データキャッシュ制御部は、L1データキャッシュメモリ３４でデータキャッシュヒットし、L1データキャッシュメモリからデータを読み出し、データ応答する。これにより、固定小数点物理レジスタファイルFX_REG内のリネーミングレジスタにデータが記憶される。
【００８２】
L2キャッシュユニットL2$は、L2キャッシュメモリ３６と、L2キャッシュ制御部L2$_CNTを有する。L2キャッシュ制御部は、L1データキャッシュ制御部が発行するデータ要求を処理して、L2キャッシュヒットならL2キャッシュメモリ３６から、L2キャッシュミスならメインメモリからデータを読み出して、L1データキャッシュ制御部のL1データキャッシュ実行制御部３２またはL1TLB実行制御部３３にデータ応答する。
【００８３】
図１２は、メモリアクセスキューの構成を示す図である。メモリアクセスキューMA_QUEは、RSAのキューと同様に、複数のエントリENTRY_0〜ENTRY_nを有する。但し、図１２には、一つのエントリENTRY_0のみが示され、その他のエントリENTRY_1〜ENTRY_nはまとめて示される。また、メモリアクセスキューの各エントリには、RSBRからの分岐確定通知BR_DTRに付加されるIIDとエントリ内のIIDとを比較する比較回路２２が設けられる。
【００８４】
メモリアクセスキューの各エントリには、バリッドビットVと、メモリアクセス命令MA_Iのデータと、禁止フラグL2$_INHと、分岐命令のIIDとが記憶され、更に、RSAのキューと異なり、エントリがL1データキャッシュでキャッシュミスしたことを示すL1データキャッシュミスフラグL1D$_MISSが記憶される。
【００８５】
メモリアクセスキューにエントリが作成されるとき、バリッドビットVは有効「１」にされ、エントリの実行処理が終了するとバリッドビットVは無効「０」にされる。また、メモリアクセス命令MA_Iのデータと、禁止フラグL2$_INHと、分岐命令のIIDとは、RSAから発行されたときの状態で記憶される。一方、L1データキャッシュミスフラグL1D$_MISSは、エントリ作成時は無効「０」の状態である。そして、エントリを実行したとき、TLBキャッシュミスするとL1TLB実行制御部３３により、また、データキャッシュミスするとL1データキャッシュ実行制御部３２により、それぞれ、L1データキャッシュミスフラグL1D$_MISSは有効「１」に変更される。
【００８６】
一旦、L1データキャッシュミスフラグL1D$_MISSが有効になると、禁止フラグL2$_INHが有効である限り、そのエントリはメモリアクセスキューから発行されない。理由は、発行しても再度キャッシュミスとなりL2キャッシュへのデータ要求は抑止されメモリアクセスキューに差し戻されるからである。そして、分岐命令が分岐予測成功で分岐確定して禁止フラグが無効になると、エントリはメモリアクセスキューから発行される。
【００８７】
メモリアクセスキューのエントリは、RSAの発行キューのエントリと同様に、RSBRからの分岐確定通知BR_DTRにより、その禁止フラグL2$_INHが制御される。分岐命令の分岐確定によるメモリアクセスキューのエントリの禁止フラグの制御は、RSAの発行キューのエントリと同様に、図１０のフローチャートにより行われる。
【００８８】
図１０のフローチャートを参照して詳細に説明することは繰り返しになるので行わず、以下簡単に説明する。メモリアクセスキューでは、RSBRから分岐命令の分岐先確定通知を受信すると、分岐予測が正しかった場合（S32のYES）、各エントリの比較回路２２が分岐確定通知の分岐命令のIIDとエントリの分岐命令のIIDと比較し、一致すれば（S35のYES）、一致したエントリの禁止フラグL2$_INHが有効「１」から無効「０」にされる（S36）。また、分岐予測が誤りであった場合（S32のNO）、各エントリの比較回路２２が分岐確定通知の分岐命令のIIDとエントリの分岐命令のIIDと比較し、エントリの分岐命令のIIDが分岐確定通知の分岐命令のIIDと一致またはその後続の分岐命令のIIDと一致すれば（S39のYES）、一致したエントリのバリッドビットVを無効「０」にして、エントリのメモリアクセス命令をキャンセルする（S40）。
【００８９】
［L1キャッシュのメモリアクセス命令の実行処理（第１の例）］
図１３、図１４、図１５は、L1キャッシュのメモリアクセス命令の実行処理の第１の例を示すフローチャート図である。図１３は、L1キャッシュのメモリアクセスキューでのエントリの投入制御を示し、図１４は、L1データキャッシュ制御部でのL1TLBキャッシュヒット判定とTLBキャッシュミスした場合の処理を示し、図１５は、L1データキャッシュ制御部でのL1データキャッシュヒット判定とL1データキャッシュメモリに対する処理を示す。
【００９０】
図１３を参照して、L1データキャッシュのメモリアクセスキューでのエントリの投入制御を説明する。メモリアクセスキューのエントリについて（S50）、禁止フラグL2$_INHが有効「１」で（S51のYES）、L1データキャッシュミスフラグL1D$_MISSが有効「１」の場合（S52のYES）、そのエントリは実行不可であり（S53）、そのエントリはメモリアクセスキュー内に留まる（滞留する）（S54）。そのエントリは、L1データキャッシュで実行しても、再度L1データキャッシュでキャッシュミスし、メモリアクセスキューに差し戻されるので、分岐確定で禁止フラグが無効化されるまで、メモリアクセスキューから投入されない。
【００９１】
一方、メモリアクセスキューのエントリについて（S50）、禁止フラグL2$_INHが無効「０」（S51のNO）、または、L1データキャッシュミスフラグL1D$_MISSが無効「０」（S52のNO）の場合、そのエントリはメモリアクセスキューから実行可能である（S55）。そこで、メモリアクセスキューから実行可能なエントリを選択できる場合（S56のYES）、選択したエントリをL1データキャッシュ制御部に投入（入力）する（S58）。選択できない場合（S56のNO）、そのエントリはメモリアクセスキューに滞留する（S57）。ここで、実行可能なエントリを選択できる場合とは、実行可能なエントリが複数存在し、自分より古いエントリが選択されるなどの場合である。
【００９２】
次に、図１４，図１５を参照して、L1データキャッシュ制御部での制御を説明する。図１４で、L1データキャッシュ制御部は、メモリアクセスキューから投入されたエントリの実行を開始する（S60）。まず、L1データキャッシュ制御部のL1TLBキャッシュヒット判定回路３１は、L1TLB３５のTLBキャッシュヒット判定を行い（S61）、TLBキャッシュヒットの場合は図１５のL1データキャッシュメモリに対するデータキャッシュヒット判定に進む（S69）。
【００９３】
TLBキャッシュミスの場合（S61のNO）、L1TLB実行制御部３３は、投入されたエントリの禁止フラグL2$_INHが有効の場合（S62のYES）、L2キャッシュへのデータ要求を発行せず、エントリの実行処理を中断し（S63）、L1データキャッシュミスフラグL1D$_MISSを有効にし（S64）、エントリをメモリアクセスキューに差し戻す（S65）。
【００９４】
一方、L1TLB実行制御部３３は、禁止フラグL2$_INHが無効の場合（S62のNO）、L2キャッシュへのデータ要求を発行し、L2キャッシュから読み出したデータ（アドレス変換テーブルのデータ）でL1TLB３５を更新する（S66）。そして、一旦、エントリをメモリアクセスキューに差し戻す（S67）。この場合、再度エントリがメモリアクセスキューから投入されると、L1TLB３５でTLBキャッシュヒットする。
【００９５】
L1データキャッシュでTLBキャッシュヒットした後、図１５で、L1データキャッシュヒット判定回路３０が、L1データキャッシュメモリのタグ情報を読み出し、データキャッシュヒット判定を行う（S71）。データキャッシュヒットと判定されると（S71のYES）、L1データキャッシュ実行制御部３２が、L1データキャッシュメモリからデータを読み出し、データ応答する（S80）。これにより、エントリの実行処理が終了し（S81）、そのエントリはバリッドビットVを無効にされ、メモリアクセスキューから解放される（S82）。
【００９６】
一方、データキャッシュミスと判定されると（S71のNO）、L1データキャッシュ実行制御部３２は、エントリの禁止フラグL2$_INHが有効であれば（S72のYES）、L2キャッシュへのデータ要求を発行しない。そして、エントリの実行処理を中断し（S73）、L1データキャッシュミスフラグL1D$_MISSを有効にし（S74）、エントリをメモリアクセスキューに差し戻す（S75）。
【００９７】
禁止フラグが無効であれば（S72のNO）、L1データキャッシュ実行制御部３２は、L2キャッシュへのデータ要求を発行し、L2キャッシュから読み出したデータ（アクセス先データ）でL1データキャッシュメモリ３４を更新する（S76）。そして、一旦、エントリをメモリアクセスキューに差し戻す（S77）。この場合、再度エントリがメモリアクセスキューから投入されると、L1データキャッシュメモリでデータキャッシュヒットし、L1データキャッシュメモリからデータを読み出してデータ応答し、処理を終了する。
【００９８】
図１６は、分岐命令が分岐未確定中に投機実行されるメモリアクセス命令に対するプロセッサ内の処理を示すシーケンスチャート図である。図１６には、図１３−１５の処理番号が追記されている。また、メモリアクセス命令が投機実行される前に、L1データキャッシュとL1TLBは共にフラッシュされ、全てのエントリが無効状態とされていると仮定する。そして、投機実行されるメモリアクセス命令は、前述した投機実行されるロード命令LOAD2であると仮定する。
【００９９】
最初に、命令デコーダI_DECが投機実行のメモリアクセス命令SP_MAをRSAに発行し、RSAの発行キューにエントリが生成される。更に、RSAが、L1データキャッシュL1D$に、投機実行のメモリアクセス命令SP_MAを発行し、L1データキャッシュのメモリアクセスキューMA_QUEにエントリが生成される。RSA内のエントリと、メモリアクセスキューMA_QUE内のエントリには、メモリアクセス命令の情報と、禁止フラグL2$_INHと分岐命令のIIDが、登録される。また、メモリアクセスキューのエントリには、L1データキャッシュミスフラグL1D$_MISSが無効「０」で登録される。
【０１００】
メモリアクセスキューMA_QUEでは、エントリの禁止フラグL2$_INHが有効であるが（S51のYES）、L1データキャッシュミスフラグL1D$_MISSが無効であるので（S52のNO）、投機実行のメモリアクセス命令のエントリが選択され（S56のYES）、L1データキャッシュ制御部に投入される（S58）。
【０１０１】
L1データキャッシュ制御部は、L1TLBについてTLBキャッシュヒット判定して、TLBキャッシュミスする（S61のNO）。禁止フラグL2$_INHが有効で投機実行であるため（S62のYES）、L2キャッシュへのデータ要求を発行せず、処理を中断し、その結果L1TLB３５を更新しない（S63）。さらに、L1データキャッシュ制御部は、エントリのL1データキャッシュミスフラグL1D$_MISSを有効にし（S64）、エントリをメモリアクセスキューに差し戻す（S65）。その結果、エントリは、分岐命令が分岐予測成功で確定してエントリの禁止フラグL2$_INHが無効になるまで、メモリアクセスキューに滞留し発行されない（S51のYES,S52のYES,S53,S54）。
【０１０２】
前述のTLBキャッシュヒット判定で、TLBキャッシュヒットする場合（S61のYES）、L1データキャッシュヒット判定回路３０が、データキャッシュヒット判定を行い、データキャッシュミスする（S71のNO）。この場合、禁止フラグL2$_INHが有効であるため（S72のYES）、L2キャッシュへのデータ要求を発行せず、処理を中断し、その結果L1データキャッシュメモリ３４を更新しない（S73）。さらに、L1データキャッシュ制御部は、エントリのL1データキャッシュミスフラグL1D$_MISSを有効にし（S74）、エントリをメモリアクセスキューに差し戻す（S75）。この場合も、エントリは、分岐命令が分岐予測成功で確定してエントリの禁止フラグL2$_INHが無効になるまで、メモリアクセスキューから発行されない（S51のYES,S52のYES,S53,S54）。
【０１０３】
上記の通り、投機的に実行されるロード命令LOAD2が実行されても、L1データキャッシュ制御部は、禁止フラグL2$_INHが有効であることに基づいて、TLBキャッシュミスまたはデータキャッシュミスした場合、L2キャッシュへのデータ要求を発行せず、処理を中断し、L1TLBまたはL1データキャッシュメモリを更新しない。これにより、ロード命令LOAD2の後に、アドレスを変更しながらロード命令LOAD3を繰り返しても、ロード命令LOAD2によりL1データキャッシュ内のL1データキャッシュメモリとL1TLBが更新されていないので、ロード命令LOAD3は、TLBキャッシュヒット及びデータキャッシュヒットとならない。そして、キャッシュミスによりL2キャッシュにデータ要求が発行されて、ロード命令LOAD3に対するレイテンシが長くなる。その結果、投機実行のロード命令LOAD2と同じアドレス宛のロード命令LOAD3と異なるアドレス宛のロード命令LOAD3のレイテンシの違いが隠蔽される。そのため、秘密値Xのアドレスへのロード命令とそれ以外のアドレスへのロード命令を区別できず、秘密値Xが不正に取得されることが回避される。
【０１０４】
図１７は、分岐命令が分岐予測成功で分岐確定後の非投機実行のメモリアクセス命令に対するプロセッサ内の処理を示すシーケンスチャート図である。前提として、RSBRが分岐予測成功の分岐確定通知を命令デコーダとRSAの発行キューとL1データキャッシュのメモリアクセスキューに送信する。このとき、RSAがメモリアクセス命令のエントリをL1データキャッシュのメモリアクセスキューに発行済とする。その場合、メモリアクセスキューのエントリのうち、分岐確定通知の分岐命令のIIDと一致する分岐命令のIIDを有するエントリの禁止フラグL2$_INHは無効化「０」される（S36）。
【０１０５】
この状態で、メモリアクセスキューのエントリは非投機実行のメモリアクセス命令であり、禁止フラグが無効であるので（S51のNO）、エントリがL1データキャッシュ制御部に投入される（S58）。そして、L1データキャッシュ制御部では、L1TLBキャッシュヒット判定部がTLBキャッシュミスすると（S61のNO）、禁止フラグが無効であるので（S62のNO）、L2キャッシュにデータ要求が発行され（S66）、L1TLBが更新され（S67）、メモリアクセスキューに差し戻される（S68）。
【０１０６】
その後、再度、エントリが投入され（S58）、今度はTLBキャッシュヒットする（S61のYES）。そして、L1データキャッシュメモリでデータキャッシュミスすると（S71のNO）、禁止フラグが無効であるので（S72のNO）、L2キャッシュにデータ要求が発行され（S76）、L1データキャッシュメモリが更新され（S77）、メモリアクセスキューに差し戻される（S78）。
【０１０７】
さらに、再度、エントリが投入され（S58）、今度は、TLBキャッシュヒット（S61のYES）、データキャッシュヒット（S71のYES）、L1データキャッシュメモリからデータが読み出され、データ応答される（S80）。その結果、エントリの処理が終了し（S81）、メモリアクセスキューのエントリが解放される（S82）。
【０１０８】
命令デコーダがメモリアクセス命令をデコードするとき分岐未確定中でない場合、禁止フラグL2$_INHは無効でメモリデータ要求が発行される。その場合の動作は、図１７と同じになる。
【０１０９】
［L1キャッシュのメモリアクセス命令の実行処理（第２の例）］
図１８、図１９、図２０は、L1キャッシュのメモリアクセス命令の実行処理の第２の例のフローチャート図である。図１８は、L1キャッシュのメモリアクセスキューでのエントリの投入制御を示し、図１９は、L1キャッシュ制御部でのL1TLBキャッシュヒット判定とTLBキャッシュミスした場合の処理を示し、図２０は、L1キャッシュ制御部でのL1データキャッシュヒット判定とL1データキャッシュメモリに対する処理を示す。
【０１１０】
第２の例では、L1データキャッシュのメモリアクセスキューのエントリに、L1データキャッシュミスフラグを記憶せず、L1データキャッシュでTLBキャッシュミスまたはデータキャッシュミスしても、L1データキャッシュミスフラグを有効にして、その後メモリアクセスキュー内にエントリを滞留させる制御を行わない。
【０１１１】
図１８、図１９、図２０において、図１３、図１４、図１５と異なる処理についてのみ説明する。図１８では、図１３の禁止フラグL2$_INHが有効（S51）且つL1データキャッシュミスフラグL1D$_MISSが有効（S52）の場合に、エントリをメモリアクセスキュー内に滞留させて、発行させない処理がない。したがって、メモリアクセスキュー内のエントリは、禁止フラグL2$_INHが有効でも無効でも、実行可能である。
【０１１２】
また、図１９では、図１４のL1データキャッシュミスフラグを有効にする処理S64がなく、同様に、図２０では、図１５のL1データキャッシュミスフラグを有効にする処理S74がない。それ以外は、図１８、図１９、図２０は、図１３、図１４、図１５と同じである。
【０１１３】
第２の例では、メモリアクセスキューのエントリにL1データキャッシュミスフラグが記憶されず、前述の処理S64,S74がないので、L1データキャッシュ制御部の処理は簡素化される。但し、投機実行のメモリアクセス命令のエントリが、メモリアクセスキューからL1データキャッシュ制御部に投入されては、メモリアクセスキューに差し戻される処理が繰り返されるので、L1データキャッシュのパイプライン回路の処理が増えるデメリットがある。
【０１１４】
以上説明したとおり、本実施の形態によれば、分岐命令が分岐未確定中に投機実行されるメモリアクセス命令に対して、L1データキャッシュでキャッシュミスしても、L2キャッシュへのデータ要求の発行を抑止し、L1データキャッシュのL1TLBやL1データキャッシュメモリの更新を抑止する。これにより、悪意で投機実行されるロード命令LOAD2によりL1データキャッシュのL1TLBやL1データキャッシュメモリが更新されること、を利用した攻撃により、プロセッサのセキュリティの脆弱性が高まることを抑止することができる。
【０１１５】
一方、分岐命令が分岐未確定中に投機実行されるメモリアクセス命令に対して、L1データキャッシュでキャッシュヒットする場合は、L1TLBでアドレス変換を行い、L1D$メモリからロードデータを読み出しまたはストアデータを書き込む。この場合は、投機実行されるメモリアクセス命令を通常と同様に実行できるので、投機実行のメモリアクセス命令に対する性能低下を回避できる。
【符号の説明】
【０１１６】
I_DEC：命令デコーダ
RSA：主記憶オペランドアドレス生成用リザベーションステーション
RSBR：分岐命令用リザベーションステーション
L1D$：L1データキャッシュユニット
L1D$_CNT：L1データキャッシュ制御部
３４：L1データキャッシュメモリ
３５：L1TLBキャッシュ
L2$：L2キャッシュユニット
３６：L2キャッシュメモリ
L2$_CNT：L2キャッシュ制御部
MA_I：メモリアクセス命令
IID：分岐命令の命令識別子
L2$_INH：禁止フラグ（L2$へのデータ要求禁止フラグ）
V：バリッドビット
RSA_QUE：RSAの発行キュー
MA_QUE：L1キャッシュユニットのメモリアクセスキュー
ENTRY：エントリ
【図１】
2019212127.tif 000003
【図２】
2019212127.tif 000004
【図３】
2019212127.tif 000005
【図４】
2019212127.tif 000006
【図５】
2019212127.tif 000007
【図６】
2019212127.tif 000008
【図７】
2019212127.tif 000009
【図８】
2019212127.tif 000010
【図９】
2019212127.tif 000011
【図１０】
2019212127.tif 000012
【図１１】
2019212127.tif 000013
【図１２】
2019212127.tif 000014
【図１３】
2019212127.tif 000015
【図１４】
2019212127.tif 000016
【図１５】
2019212127.tif 000017
【図１６】
2019212127.tif 000018
【図１７】
2019212127.tif 000019
【図１８】
2019212127.tif 000020
【図１９】
2019212127.tif 000021
【図２０】
2019212127.tif 000022
【図２１】
2019212127.tif 000023