(57)【要約】  入力データを受信する入力回路を含む装置が提供される。出力回路は、データ処理回路によって実行されるべき命令のシーケンスを出力し、命令のうちの少なくともいくつかは関数にグループ化され、生成回路は、入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行する。生成プロセスは、命令のシーケンス中の命令のうちの少なくとも１つに、命令のシーケンスの実行中に行われた制御フロー投機の状態を記憶させ、制御フロー投機の記憶された状態が関数間で維持される。
2021522562.tif 000002
【特許請求の範囲】
【請求項１】
入力データを受信するための入力回路と、
データ処理回路によって実行されるべき命令のシーケンスを出力するための出力回路であって、前記命令のうちの少なくともいくつかが関数にグループ化される、出力回路と、
前記入力データを使用して、命令の前記シーケンスを生成するための生成プロセスを実行するための生成回路と
を備える装置であって、
前記生成プロセスが、命令の前記シーケンス中の前記命令のうちの少なくとも１つに、命令の前記シーケンスの実行中に行われた制御フロー投機の状態を記憶させ、
制御フロー投機の前記記憶された状態が前記関数間で維持される、
装置。
【請求項２】
制御フロー投機の前記状態は、制御フロー投機が正しく行われたかどうかを示す、請求項１に記載のデータ処理装置。
【請求項３】
制御フロー投機の前記状態を記憶する、命令の前記シーケンス中の前記命令のうちの前記少なくとも１つが、前記データ処理回路によるデータ値投機を受けることを抑止される、請求項１又は２に記載のデータ処理装置。
【請求項４】
制御フロー投機の前記状態を記憶する、命令の前記シーケンス中の前記命令のうちの前記少なくとも１つが、前記データ処理回路に、比較を実行させ、前記比較の結果に応じて、制御フロー投機の前記状態を記憶させるように適応された、請求項１から３までのいずれか一項に記載の装置。
【請求項５】
前記入力データは、条件と、前記条件が満たされたときに分岐するためのターゲットとを備える条件付き分岐命令を備え、
命令の前記シーケンスが、前記ターゲットにおいて、制御フロー投機の前記状態を記憶する、命令の前記シーケンス中の前記命令のうちの前記少なくとも１つを備える、
請求項４に記載の装置。
【請求項６】
前記比較が前記条件と論理的に対応する、請求項５に記載の装置。
【請求項７】
前記比較の前記結果が、前記条件が満たされていないことと対応することに応答して、制御フロー投機の前記状態は、制御フロー投機が間違って行われたことを示す、請求項６に記載の装置。
【請求項８】
命令の前記シーケンスの少なくとも１つのサブセットがアプリケーション・バイナリ・インターフェースに準拠し、
前記アプリケーション・バイナリ・インターフェースに従って、記憶回路に不法値を記憶することによって、制御フロー投機の前記記憶された状態が前記関数間で維持される、
請求項１から７までのいずれか一項に記載の装置。
【請求項９】
前記アプリケーション・バイナリ・インターフェースに従って、合法値を記憶することによって、制御フロー投機の前記記憶された状態が前記関数のうちの少なくともいくつかの内で維持される、請求項８に記載の装置。
【請求項１０】
制御フロー投機の前記状態が、誤投機が行われたことを示していることに応答して、前記不法値が前記記憶回路に記憶される、請求項８又は９に記載の装置。
【請求項１１】
前記記憶回路がレジスタを備える、請求項８から１０までのいずれか一項に記載のデータ処理装置。
【請求項１２】
前記記憶回路がスタック・ポインタ・レジスタを備え、
前記不法値が０である、
請求項８から１１までのいずれか一項に記載のデータ処理装置。
【請求項１３】
命令の前記シーケンスが、アクセス・アドレスを備えるアクセス命令を備え、
前記アクセス命令の正しい実行が制御フロー投機の前記状態に依存する、
請求項１から１２までのいずれか一項に記載の装置。
【請求項１４】
命令の前記シーケンスが、前記アクセス命令の前に前記アクセス・アドレス上で演算を実行する命令を備え、
前記演算が制御フロー投機の前記状態に依存する、
請求項１３に記載の装置。
【請求項１５】
前記演算が、オペランドを備える論理ＡＮＤ演算であり、
制御フロー投機の前記状態が、誤投機が行われたことを示す場合、前記オペランドは０である、
請求項１４に記載の装置。
【請求項１６】
命令の前記シーケンスが、前記アクセス命令によって前記アクセス・アドレスから取り出されたデータに対して演算を実行する命令を備え、
前記演算が制御フロー投機の前記状態に依存する、
請求項１３から１５までのいずれか一項に記載の装置。
【請求項１７】
前記演算が、オペランドを備える論理ＡＮＤ演算であり、
制御フロー投機の前記状態が、誤投機が行われたことを示す場合、前記オペランドは０である、
請求項１６に記載の装置。
【請求項１８】
入力データを受信することと、
前記入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行することと、
データ処理回路によって実行されるべき命令の前記シーケンスを出力することであって、前記命令のうちの少なくともいくつかが関数にグループ化される、命令の前記シーケンスを出力することと
を含む方法であって、
前記生成プロセスが、命令の前記シーケンス中の前記命令のうちの少なくとも１つに、命令の前記シーケンスの実行中に行われた制御フロー投機の状態を記憶させ、
制御フロー投機の前記記憶された状態が前記関数間で維持される、
方法。
【請求項１９】
入力データを受信するための手段と、
データ処理回路によって実行されるべき命令のシーケンスを出力するための手段であって、前記命令のうちの少なくともいくつかが関数にグループ化される、命令のシーケンスを出力するための手段と、
前記入力データを使用して、命令の前記シーケンスを生成するための生成プロセスを実行するための手段と
を備える装置であって、
前記生成プロセスが、命令の前記シーケンス中の前記命令のうちの少なくとも１つに、命令の前記シーケンスの実行中に行われた制御フロー投機の状態を記憶させ、
制御フロー投機の前記記憶された状態が前記関数間で維持される、
装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技法はデータ処理に関する。特に、本技法は、投機的（ｓｐｅｃｕｌａｔｉｖｅ）実行の分野に関連性を有する。
【背景技術】
【０００２】
投機的実行は、命令のシリーズが実行されるべきであるかどうかが分かる前に、それらの命令が実行される技法である。ある後の時点において、投機的に実行された命令が実行されるべきであったかどうかが決定される。命令が実行されるべきであった場合、プロセスは継続する。命令が実行されるべきでなかった場合、実行は「リワインド（ｒｅｗｏｕｎｄ）」される。この形態の投機は制御フロー投機と呼ばれる。場合によっては、そのような投機的実行はセキュリティ・リークを引き起こすことが分かっている。たとえば、プロセッサは、セキュアにされたデータをキャッシュに不必要にロードするための特権（ｐｒｉｖｉｌｅｇｅｄ）コードを投機的に実行させられ得る。リワインドの後に、キャッシュがクリアされないことがあるので、要求されたデータが、サイドチャネル攻撃（ｓｉｄｅ−ｃｈａｎｎｅｌ  ａｔｔａｃｋ）を使用してプローブされ得る。別の形態の投機は、命令に対するすべての入力が分かる前に、命令によって生成された得られた値が投機（ｓｐｅｃｕｌａｔｅ）される、データ値投機である。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
本技法は、制御フロー投機が行われる場合、データをセキュアに保つことの要望があるということを認識している。
【課題を解決するための手段】
【０００４】
第１の例示的な構成から見ると、入力データを受信するための入力回路と、データ処理回路によって実行されるべき命令のシーケンスを出力するための出力回路であって、命令のうちの少なくともいくつかが関数にグループ化される、出力回路と、入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行するための生成回路とを備え、生成プロセスが、命令のシーケンス中の命令のうちの少なくとも１つに、命令のシーケンスの実行中に行われた制御フロー投機の状態を記憶させ、制御フロー投機の記憶された状態が関数間で維持される、装置が提供される。
【０００５】
第２の例示的な構成から見ると、入力データを受信することと、入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行することと、データ処理回路によって実行されるべき命令のシーケンスを出力することであって、命令のうちの少なくともいくつかが関数にグループ化される、命令のシーケンスを出力することとを含み、生成プロセスが、命令のシーケンス中の命令のうちの少なくとも１つに、命令のシーケンスの実行中に行われた制御フロー投機の状態を記憶させ、制御フロー投機の記憶された状態が関数間で維持される、方法が提供される。
【０００６】
第３の例示的な構成から見ると、入力データを受信するための手段と、データ処理回路によって実行されるべき命令のシーケンスを出力するための手段であって、命令のうちの少なくともいくつかが関数にグループ化される、命令のシーケンスを出力するための手段と、入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行するための手段とを備え、生成プロセスが、命令のシーケンス中の命令のうちの少なくとも１つに、命令のシーケンスの実行中に行われた制御フロー投機の状態を記憶させ、制御フロー投機の記憶された状態が関数間で維持される、装置が提供される。
【０００７】
添付の図面に示されている本技法の実施例を参照しながら、単に例として、本技法についてさらに説明する。
【図面の簡単な説明】
【０００８】
【図１】いくつかの実施例による、装置を示す図である。
【図２】分岐命令の挙動を示し、投機的実行の一形態を実証するために使用される図である。
【図３】条件付き選択命令の実例を示す図である。
【図４ａ】いくつかの実施例による、制御フロー誤投機（ｍｉｓｓ−ｓｐｅｃｕｌａｔｉｏｎ）追跡を可能にする、データ値投機限定命令（ｄａｔａ  ｖａｌｕｅ  ｓｐｅｃｕｌａｔｉｏｎ−ｌｉｍｉｔｉｎｇ  ｉｎｓｔｒｕｃｔｉｏｎ）を含んでいる出力命令のシーケンスへの入力データの変換を示す図である。
【図４ｂ】いくつかの実施例による、制御フロー誤投機追跡を可能にする、データ値投機限定命令を含んでいる出力命令のシーケンスへの入力データの変換を示す図である。
【図５ａ】いくつかの実施例による、関数呼出し境界（ｆｕｎｃｔｉｏｎ  ｃａｌｌ  ｂｏｕｎｄａｒｙ）を横断するＡＢＩ対応制御フロー誤投機追跡を含んでいる出力命令のシーケンスへの入力データの変換を示す図である。
【図５ｂ】いくつかの実施例による、関数呼出し境界を横断するＡＢＩ対応制御フロー誤投機追跡を含んでいる出力命令のシーケンスへの入力データの変換を示す図である。
【図５ｃ】いくつかの実施例による、関数呼出し境界を横断するＡＢＩ対応制御フロー誤投機追跡を含んでいる出力命令のシーケンスへの入力データの変換を示す図である。
【図６】変換を伴ういくつかの技法がどのように組み合わせられ得るかを示す図である。
【図７】いくつかの実施例による、装置を示す図である。
【図８】いくつかの実施例による、フロー・チャート形式でデータ処理の方法を示す図である。
【図９】いくつかの実施例による、フロー・チャート形式でデータ処理の方法を示す図である。
【発明を実施するための形態】
【０００９】
添付図を参照しながら実施例について説明する前に、実施例及び関連付けられた利点の以下の説明が与えられる。
【００１０】
一態様によれば、入力データを受信するための入力回路と、データ処理回路によって実行されるべき命令のシーケンスを出力するための出力回路であって、命令のうちの少なくともいくつかが関数にグループ化される、出力回路と、入力データを使用して、命令のシーケンスを生成するための生成プロセスを実行するための生成回路とを備え、生成プロセスが、命令のシーケンス中の命令のうちの少なくとも１つに、命令のシーケンスの実行中に行われた制御フロー投機の状態を記憶させ、制御フロー投機の記憶された状態が関数間で維持される、装置が提供される。
【００１１】
上記の装置は、入力命令を出力命令に変換するコンパイラの形態を取り得る。入力回路は入力データを受信し、出力回路は、データ処理回路によって実行されるべきである命令のシーケンスを出力する。生成回路は、命令のシーケンスを生成するために、入力データに対して生成プロセスを実行する。生成プロセスは、命令が実行されている間、出力される命令のうちの少なくとも１つに、制御フロー投機の状態を記憶させる。この状態は、たとえば、関数呼出し及び関数呼出しからのリターン中に、関数間で維持される。そのような場合、ある関数中で確立された投機状態が別の関数中でアクセスされることが可能であり得る。入力データは、生成プロセスによって、第１の言語から、（処理回路自体であり得る）データ処理回路によって実行可能である第２の言語に変換され得る。他の実施例では、入力データは、出力される命令のシーケンスと同じ言語であり得、生成プロセスは、制御フロー投機の状態を確立するために、追加の命令を追加させ得る。
【００１２】
いくつかの実施例では、制御フロー投機の状態は、制御フロー投機が正しく行われたかどうかを示す。制御フロー投機は、分岐の結果が分かるまで、その分岐が、フェッチング、復号、及びさらなる命令を実行することの開始に関してフォローされるべきであるかどうかを決定するために分岐予測が行われる、条件付き分岐命令の場合に行われ得る。これらの実施例では、投機が正しく行われたか否かを示す命令が与えられる。
【００１３】
いくつかの実施例では、制御フロー投機の状態を記憶する、命令のシーケンス中の命令のうちの少なくとも１つは、データ処理回路によるデータ値投機を受けることを抑止される。このことは、たとえば、投機されたデータ値が正しかったことが決定されるまで、それらの投機されたデータ値がさらなる命令中で使用されることを禁止する、「投機バリア」の提供によって達成され得る。前に説明したように、データ投機は、データの値を推定するために使用される技法である。したがって、制御フロー投機の状態を決定するときにデータ値投機が行われることを禁止することによって、分岐が実際にフォローされるべきであったか否かを決定することが可能である。
【００１４】
いくつかの実施例では、制御フロー投機の状態を記憶する、命令のシーケンス中の命令のうちの少なくとも１つは、データ処理回路に、比較を実行させ、比較の結果に応じて、制御フロー投機の状態を記憶させるように適応される。比較は、制御フロー投機が分岐を引き起こすべきであったか否かを決定するために実行される。制御フロー投機の状態は、次いで、それが他の場所における他の計算において参照されるか又は使用され得るように記憶される。
【００１５】
いくつかの実施例では、入力データは、条件と、条件が満たされたときに分岐するためのターゲットとを備える条件付き分岐命令を備え、命令のシーケンスは、ターゲットにおいて、制御フロー投機の状態を記憶する、命令のシーケンス中の命令のうちの少なくとも１つを備える。制御フロー投機の状態を記憶する命令は、制御フロー投機を受け得る分岐命令の後に行われる。したがって、制御フロー投機が行われた場合、分岐することの決定が正しかったか否かを決定することが可能である。
【００１６】
いくつかの実施例では、比較は条件と論理的に対応する。制御フロー投機の状態を決定する、命令によって実行された比較が、条件付き分岐命令中の条件に一致する場合、制御フロー投機の状態は、条件付き分岐が成立すべきであったか否かに一致することが諒解されよう。ここで、「と論理的に対応する」という用語は、条件と比較とが論理的等価性を有することを意味する。このことは、当業者によって知られているであろうブーリアン真理値表を使用して立証され得る。
【００１７】
いくつかの実施例では、比較の結果が、条件が満たされていないことと対応することに応答して、制御フロー投機の状態は、制御フロー投機が間違って行われたことを示す。
【００１８】
いくつかの実施例では、命令のシーケンスの少なくとも１つのサブセットはアプリケーション・バイナリ・インターフェースに準拠し、アプリケーション・バイナリ・インターフェースに従って、記憶回路に不法値を記憶することによって、制御フロー投機の記憶された状態が関数間で維持される。アプリケーション・バイナリ・インターフェース（ＡＢＩ：Ａｐｐｌｉｃａｔｉｏｎ  Ｂｉｎａｒｙ  Ｉｎｔｅｒｆａｃｅ）は、ソフトウェアがハードウェアのいくつかの要素をどのように使用すべきであるかを規定する。たとえば、ＡＢＩは、呼出し規約（たとえば、関数呼出しを実行するか又は関数呼出しから戻すために、異なる値がレジスタ及び／又はスタックにどのように記憶されるべきか）を規定し得る。したがって、ＡＢＩは、特定のレジスタが特定の値を記憶すべきである／すべきでないことを規定し得る。とにかく、そのような実施例では、ＡＢＩが複数の命令のうちの少なくとも１つのサブセットによって準拠されているにもかかわらず、制御フロー投機の状態を関数間で維持するために、（ＡＢＩに従った）「不法」（たとえば許容されない）値が記憶回路に記憶される。このようにして、記憶回路中の「不法」値の存在は効果を有しないべきであるので、既存のシステムとの両立性は維持され得る。
【００１９】
いくつかの実施例では、アプリケーション・バイナリ・インターフェースに従って、合法値を記憶することによって、制御フロー投機の記憶された状態が関数のうちの少なくともいくつかの内で維持される。いくつかの実施例では、合法値は、関数間で、不法値が記憶されるものと同じ記憶回路に記憶される。しかしながら、いくつかの実施例では、合法値は関数内で異なる記憶回路に記憶される。
【００２０】
いくつかの実施例では、制御フロー投機の状態が、誤投機が行われたことを示していることに応答して、不法値が記憶回路に記憶される。誤投機の結果として、「リワインド」が行われることが予想されるであろうことから、リワインドが行われるまで、不法値を記憶回路に記憶することが許容できることが考えられ得る。いくつかの他の実施例では、反対が真であり得ること、すなわち、制御フロー投機の状態が、誤投機が行われなかったことを示していることに応答して、不法値が記憶されることに留意されたい。
【００２１】
いくつかの実施例では、記憶回路はレジスタを備える。たとえば、いくつかの実施例では、記憶回路はスタック・ポインタ・レジスタを備え、不法値は０である。いくつかのＡＢＩでは、前のスタック・フレームの端部が記憶される、メモリ中のアドレスをポイントするために使用され得る、スタック・ポインタ・レジスタは、関数呼出しにわたって０であることを許可されない。したがって、スタック・ポインタ・レジスタに０の値を記憶することによって、誤投機が行われたことを示すことが可能である。さらに、そのような値はスタック・ポインタ・レジスタ中にあることが禁止されるので、そのような値をここに記憶することは全体的効果を有するべきでない。
【００２２】
いくつかの実施例では、命令のシーケンスは、アクセス・アドレスを備えるアクセス命令を備え、アクセス命令の正しい実行は制御フロー投機の状態に依存する。このようにして、制御フロー投機が起こるべきであったか否かに応じて、データへのアクセスを制御することが可能である。場合によっては、このようにして、制御フロー誤投機が行われ、データ値へのアクセスが不適切であるなど、セキュアでないシナリオにおいて、アクセス命令が実行されることを抑止することが可能であるので、アクセス命令の正しい実行はセキュアであると考えられ得る。誤投機が行われた場合、データは実際に取り出され得ないので、このことは、特権データが漏洩されることを抑止することを助けることができる。
【００２３】
いくつかの実施例では、命令のシーケンスは、アクセス命令の前にアクセス・アドレス上で演算を実行する命令を備え、演算は制御フロー投機の状態に依存する。制御フロー投機の状態に依存する、アドレス上での演算を実行することによって、制御フロー投機が正しかったか否かに応じて、アドレスに影響を及ぼすことが可能である。このことは、アクセスが不適切である場合、アクセスが行われず、それによって、データが取り出されることを防ぐように、アドレスを「化けさせる（ｃｏｒｒｕｐｔ）」ことを可能にすることができる。
【００２４】
演算が実行され得るいくつかの方法がある。いくつかの実施例では、演算は、オペランドを備える論理ＡＮＤ演算であり、制御フロー投機の状態が、誤投機が行われたことを示す場合、オペランドは０である。したがって、誤投機が行われたとき、ＡＮＤ演算を実行したことの結果は、アクセス・アドレスを効果的に「ヌルにし（ｎｕｌｌｉｆｙ）」（０にし）、それによって、アクセスが行われることを抑止することである。制御フロー投機の状態に従って、誤投機が行われなかった場合、アクセス・アドレスとのＡＮＤの結果、アクセス・アドレス自体が得られるように、オペランドはすべて１値（たとえば、適切なレジスタ中に記憶された各ビットについて「１」）であり得る。
【００２５】
データを保護する別の方法は、取り出された後のデータ自体に対して演算を実行することである。したがって、いくつかの実施例では、命令のシーケンスは、アクセス命令によってアクセス・アドレスから取り出されたデータに対して演算を実行する命令を備え、演算は制御フロー投機の状態に依存する。この場合も、たとえば、いくつかの実施例では、演算は、オペランドを備える論理ＡＮＤ演算であり、制御フロー投機の状態が、誤投機が行われたことを示す場合、オペランドは０である。したがって、データが取り出されると、誤投機が行われたことが示されている場合、データをヌルにする（０にする）ＡＮＤ演算の影響をすぐに受ける。
【００２６】
次に、図を参照しながら、特定の実施例について説明する。
【００２７】
図１は、いくつかの実施例による、装置１００を示す。装置は、たとえば、命令を実行するためのパイプラインの形態を取り得る。図１の実例では、命令フェッチャ１１０が与えられる。これは、たとえば、メモリから又は命令キャッシュから、実行されるべき命令を取得する。命令フェッチャは、次いで、フェッチされた命令を命令デコーダ１２０に渡し、命令デコーダ１２０は、フェッチされた命令を復号し、各命令について１つ又は複数の制御信号を生成する。制御信号は１つ又は複数の予約ステーション１３０ａ〜１３０ｄに渡される。各予約ステーションは、実行ユニット１４０ａ〜１４０ｄによる実行のための命令に対応するデータを記憶する。各予約ステーション１３０は、復号された命令に関するキューとして働き、所与の予約ステーション１３０ａ中の復号された命令は、任意の順序で、対応する実行ユニット１４０ａによって処理され得る。ここで、実行ユニット１４０は、２つの算術論理ユニット（ＡＬＵ：Ａｒｉｔｈｍｅｔｉｃ  Ｌｏｇｉｃ  Ｕｎｉｔ）１４０ａ、１４０ｂと、浮動小数点ユニット１４０ｃと、ロード／ストア・ユニット１４０ｄとを含む。復号された命令は適切な実行ユニット１４０に送られる。たとえば、浮動小数点命令は、対応する予約ステーション１３０ｃを介して浮動小数点ユニット１４０ｃに送られる。
【００２８】
図２は、分岐命令の挙動を示し、投機的実行の一形態を実証するために使用される。特に、命令２００の第１のグループは分岐命令Ａを備える。これはフローを命令２１０の第２のグループにジャンプさせる。条件付き分岐命令（分岐命令に関連付けられた条件を有する分岐命令）の場合、条件が満たされる場合のみ、分岐が行われる。分岐が行われた場合、分岐命令のターゲット、Ｂにおいて実行が継続する。この実例では、このことは、命令Ｄ、Ｅ、Ｆ、Ｇ、及びＨの実行を伴う。命令Ｈは、分岐を戻させるリターン命令として働く。フローは、次いで、そこで実行が再開する、命令２００の第１のブロック中の命令Ｃに戻る。
【００２９】
一般的な実行では、命令フェッチャ１１０が命令をフェッチするために１プロセッサ・サイクルかかり、命令デコーダが命令を復号するためにさらなる１プロセッサ・サイクルかかり得る。命令は、次いで、必要なデータが取得されるまで、予約ステーション１３０中で待ち得る。たとえば、命令がメモリ中のデータに対して演算する場合、メモリからデータを取り出すことに数プロセッサ・サイクルが費やされ得る。命令が渡されると、実行ユニット１４０において命令を実際に実行することにさらなる１プロセッサ・サイクルが費やされることがある。効率的に維持するために、一般的なデータ処理システムは、同時に他の命令の演算（たとえば、フェッチ、復号、及び実行）を継続する。条件が実際に評価されるまで、どの命令が次にフェッチ／復号／実行されるべきであるか分からないので、条件付き分岐命令は、理論上、ここで問題を引き起こすことがある。この問題を解決するのを助けるために、分岐予測が行われ、分岐がある特定の方向に進むことが仮定される。その方向における命令が、次いで、フェッチ／復号／実行される。予測が正しかった場合、効率が維持されている。予測が正しくなかった場合、「リワインド」が行われ、正しいロケーションから実行が再開する。この場合、分岐が実行されるまで実行が単に停止する状況と比較して、著しい時間が失われない。このことは投機的実行の実例である。したがって、図２の実例では、Ａにおける分岐命令に到達したとき、Ａにおける分岐がフォローされるべきであったかどうかが分かる前に、命令Ｂ〜Ｈのうちのいくつか又はすべてが（及びＨにおけるリターン命令が実行された場合、Ｃも）実行され得る。
【００３０】
図３は、条件付き選択命令３００の実例を示す。命令は、宛先３１０（たとえばレジスタｘ２０）と、第１のソース３２０（たとえば、値「０」を常に含んでいる特殊レジスタｘｚｒ）と、第２のソース３３０（たとえばレジスタｘ２０）と、条件３４０（たとえば、「以上（ｔｈｅ  ｇｒｅａｔｅｒ  ｔｈａｎ  ｏｒ  ｅｑｕａｌ）フラグが設定されたか」を示す「ｇｅ」）とを備える。以上フラグは、２つの値を比較する前の命令の結果として設定され得る。代替的に、いくつかの実施例では、条件付き選択命令を構成する条件３４０は直接２つの値の比較を含み得る。
【００３１】
この命令の実行は、以上フラグが設定されなかった場合、（ｘｚｒレジスタ中の）値０をレジスタｘ２０に記憶させる。さもなければ（以上フラグが設定された場合）、レジスタｘ２０中の値がレジスタｘ２０に記憶される（すなわち、レジスタｘ２０の値は同じままである）。条件付き選択命令中の条件３４０が条件付き分岐命令の条件と対応する場合、以下で示すように、レジスタｘ２０中に記憶される値は、制御フロー投機的実行が正しく行われたかどうかに応じて変更させられ得ることに留意されたい。
【００３２】
図４ａは、命令の入力セット４００を命令の出力セット４１０にコンパイルすること（たとえば変換すること）によって、誤投機が行われたかどうかを決定するために、条件付き選択命令がどのように使用され得るかを示す。入力命令４００はある言語であり得、出力命令４１０は、図１に示されたものなど、データ処理回路１００上での実行のためのものである第２の言語であり得ることに留意されたい。
【００３３】
入力命令は一般的な条件付き分岐シナリオを含んでいる。この実例では、分岐命令の条件４２０は、「以上フラグ」が設定されていることである。条件が満たされた場合、（命令ｉｎｓｔｒ２を含む）ターゲット・ラベルＢＢ２に分岐が行われる。条件が満たされなかった場合、（命令ｉｎｓｔｒ１を含む）ラベルＢＢ１において実行が継続する。出力命令において、レジスタｘ２０に最初に値「−１」がロードされる。次いで、入力命令の場合と同様に分岐が行われる。ターゲット・ラベルＢＢ２において、図３を参照しながら前に説明したように、条件付き選択命令が行われる。しかしながら、条件付き選択命令４３０の条件は分岐命令における条件４２０の反転であり、「ｌｔ」（「未満（ｌｅｓｓ  ｔｈａｎ）」）フラグが設定されていることに依拠している。結果として、条件付き選択命令の条件及び分岐命令の条件のそれは、それぞれ同じテストに依存しており、可能な結果に応じて異なるアクションを行うに過ぎないので、条件付き選択命令の条件は分岐命令の条件のそれと対応する。分岐ＢＢ２の残っている命令が、次いで、（ｉｎｓｔｒ２を含めて）実行される。同様に、分岐ＢＢ１において、条件付き選択命令４４０が行われる。このコードは、分岐命令４２０がフォローされなかった場合、実行される。この場合、条件付き選択命令４４０中の条件は分岐命令４２０の条件と同じである。
【００３４】
このようにして、分岐ＢＢ１において、レジスタｘ２０中の値は同じまま（「−１」）であるか、又は（「０」に）変更される。各条件付き選択命令４３０、４４０中の条件４２０は、その条件付き選択命令を含んでいるターゲットに到達するために必要とされる分岐命令４２０中の条件の反対であるので、レジスタｘ２０の値は、誤投機が行われた場合のみ変更される。さもなければ、レジスタｘ２０は同じままである。たとえば、ＢＢ２において投機が行われたと仮定する。これは、「ｇｅ」フラグが設定された場合、正しくなる。ここで、条件付き選択命令４２０は、「ｌｔ」フラグが設定されたかどうかを決定する。「ｇｅ」フラグと「ｌｔ」フラグとが相互排他的であると仮定すると、条件付き選択命令４２０は、分岐命令４２０中の条件が満たされた場合（すなわち、投機が正しく行われた場合）、（たとえば、レジスタｘ２０中の値をレジスタｘ２０に移動することによって）及び同様にＢＢ１における条件付き選択命令４４０について、レジスタｘ２０中の値を同じままにさせる。各場合において、分岐が正しく投機された場合、レジスタｘ２０は値「−１」を維持する。この実例では、ＣＳＤＢ命令は、ＣＳＥＬ命令上で起こり得るデータ値投機が、ＣＳＤＢ命令の後に実行する何らかの命令によって観測されることを抑止する。このことは、レジスタｘ２０中の値に、ＣＳＤＢが実行された後に実行する命令について、制御フロー予測の正しさを正確に表わさせる。ＣＳＤＢ命令は、ＣＳＤＢ命令の前に起こったデータ値誤投機が、ＣＳＤＢ命令の後に実行された命令によって参照されることを抑止するために使用される特殊命令である。したがって、ＣＳＥＬ命令の実際の結果は、データ値投機によって推定されるのではなく、確立される。もちろん、誤投機が行われた場合、ある将来の時点において、「リワインド」が行われる。しかしながら、そのときまで、特権データが漏洩されることを抑止するために、制御フロー誤投機が行われたことを関知していることは有用である。
【００３５】
関係する実例では、投機が正しく行われた場合、変更が行われるようになされ、分岐が誤投機された場合、同じままであり得ることが諒解されよう。同様に、特定の値（たとえば、「０」及び「−１」）が各結果のために任意に選択され得ることが諒解されよう。
【００３６】
図４ｂは、条件付き選択命令によって生成された出力が、特定のデータに対するアクセスを保護するためにどのように使用され得るかを示す。ここで、レジスタｘ２０は、投機が正しく行われたか（すべて１）、間違って行われたか（すべて０）の指示を含んでいると仮定される。入力データ４５０において、レジスタｘ１中に記憶されたメモリ・アドレスにおけるメモリに記憶されたデータを取得するために、ロードが行われる。データはレジスタｘ０にロードされる。ここで、レジスタｘ１中に記憶されたメモリ・アドレスはセキュアなデータに関係するので、そのメモリ・アドレスは特権情報を含んでいると考えられる。したがって、制御フロー誤投機が起こっているとき、すなわち、プログラマーがこのデータをロードすることを意図していなかったとき、データをレジスタｘ０にロードさせないことが望ましい。出力データ４６０は、レジスタｘ２０中に記憶された値をもつレジスタｘ１中のメモリ・アドレス上で論理ＡＮＤ演算を実行する。これにより、制御フロー誤投機の場合、ｘ１は値０を有し、したがって、ロードは、特権データのアドレスではなく、アドレス０からロードすることになる。
【００３７】
最後に、レジスタｘ１中に今記憶されているメモリ・アドレス上でロードが行われる。誤投機が行われた場合、レジスタｘ２０中のすべて０での値との論理ＡＮＤ演算は、レジスタｘ１中のメモリ・アドレスを消去させ、それによって、ロード命令によるそのメモリ・アドレスのアクセスを防ぐ。投機が正しく行われた場合、論理ＡＮＤ演算は、レジスタｘ２０中の値をそのままにし、それにより、その値がロード命令によってアクセスされることが可能になる。したがって、投機が正しく実行された場合のみロードが行われ得るように、ロードが保護される。
【００３８】
ＣＳＤＢ命令は、特権データをロードするロード命令を保護するために、レジスタｘ２０上の最後のＣＳＥＬ演算と、ＡＮＤ命令中のレジスタｘ２０の最初の使用との間のどこにでも配置され得ることに留意されたい。
【００３９】
誤投機が行われたかどうかの指示は関数呼出しにわたって持続することが望ましい。図５ａ、図５ｂ、及び図５ｃは、誤投機インジケータが関数呼出しにわたって持続することを可能にするために、さらなる変換がどのように実行され得るかを示す。
【００４０】
これらの実例では、出力命令５１０、５３０、５５０がアプリケーション・バイナリ・インターフェース（ＡＢＩ）に準拠することが仮定される。このＡＢＩは、ハードウェアが、基本となるソフトウェアによってどのように利用されるべきであるかを規定する。たとえば、ＡＢＩは、たとえば、呼び出された関数にパラメータを渡すために使用されるべきであるレジスタ、結果がどのように渡し戻されるべきであるか、プログラム・カウンタ及びスタック・ポインタがどのように、いつ変更されるべきであるかなど、関数呼出しがどのように実装されるべきであるかを指定する呼出し規約を規定し得る。本実例では、ＡＢＩは、値「０」が関数にわたって（たとえば呼出し又はリターン中に）スタック・ポインタに記憶されることを禁止することが（たいていの場合）仮定される。したがって、スタック・ポインタに値「０」を記憶することによって、制御フロー投機が正しく行われたこと、又は誤投機が行われたことのいずれかを関数にわたって通信する、上位互換性があるシステムを提供することが可能である。このことは、ＡＢＩによって禁止されている、レジスタ中の値を使用するので、そのことはいずれの既存のシステムとも問題を引き起こすべきでない。言い換えれば、スタック・ポインタ・レジスタ中の「０」の存在は効果を有しないべきである。本実例は、誤投機が行われたということを指すために値「０」を使用する。さらに、本実例は、前に使用されたレジスタｘ２０とは対照的に、誤投機が行われたかどうかを示す値を記憶するために、関数内でレジスタＩＰ１を使用する。
【００４１】
図５ａは、入力命令５００中の関数呼出しが、関数呼出しを実行する出力命令５１０にどのように変換されるかを示す。出力命令は現在のスタック・ポインタをテンポラリ・レジスタＩＰ０に移動する。次いで、ＩＰ０中のスタック・ポインタ値と、制御フロー誤投機値（制御フローが正しく投機されている場合はすべて１、制御フローが間違って投機されている場合は０）を含んでいるレジスタＩＰ１の値との間で論理ＡＮＤ演算が実行され、結果はテンポラリ・レジスタＩＰ０に記憶される。このＡＮＤ演算は、スタック・ポインタの値（正しい制御フロー投機の場合）か、又は０（間違った制御フロー投機の場合）のいずれかを含んでいるＩＰ０を生じる。結果は、次いで、スタック・ポインタにストアバック（ｓｔｏｒｅ  ｂａｃｋ）される。いくつかのアーキテクチャは、算術／論理演算がスタック・ポインタ上で直接行われることを禁止する。この実例では、ＭＯＶ命令は、スタック・ポインタの値が変更されることを可能にするために、スタック・ポインタの値をテンポラリ・レジスタに移動する。スタック・ポインタ上で直接演算を可能にする他のアーキテクチャ上では、ｍｏｖ命令を必要とすることなしに直接、制御フロー誤投機が起こったとき、スタック・ポインタの値を０に設定することが可能であり得る。
【００４２】
分岐及びリンク（ｂｒａｎｃｈ−ａｎｄ−ｌｉｎｋ）命令が次いで実行され、その命令がラベル「ｃａｌｌｅｅ」に対する無条件関数呼出しを行わせる。分岐及びリンク命令は条件付き分岐命令でなく、したがって、この分岐及びリンク命令自体の結果として、誤投機は行われないことに留意されたい。しかしながら、この分岐及びリンク命令を含んでいる関数は、誤投機が行われたことの結果として入力され得る。本技法は、関数にわたって制御フロー投機の状態を維持することを可能にし、したがって、この分岐及びリンク命令から入力された関数において、（図示されていない、前の条件付き分岐命令からの）誤投機が行われたがどうかが分かる。
【００４３】
図５ｂはｃａｌｌｅｅラベルにおける挙動を示す。入力命令５２０において、このことはラベル「ｃａｌｌｅｅ：」を備えるに過ぎないであろう。（たとえばコンパイル又は変換を介して）このことから生成された出力命令５３０において、スタック・ポインタと、条件付き選択命令の前の値「０」との間で比較が行われる。このコード・シーケンスは、スタック・ポインタが０であるとき、すなわち、制御フロー誤投機が起こったとき、すべて０を含んでいるレジスタＩＰ１を生じる。このポイントの前に制御フロー誤投機が起こらなかった場合、スタック・ポインタは非０値を有し、このコード・シーケンスは、すべて１の値を含んでいるＩＰ１を生じる。このようにして、ＩＰ１の値は、スタック・ポインタ中のＡＢＩ不法値「０」を使用することによって、「ｃａｌｌｅｅ」に対する関数呼出しの前から、関数「ｃａｌｌｅｅ」に転送されている。
【００４４】
図５ｃは、関数呼出しからのリターンを引き起こすリターン命令における挙動を示す。入力命令５４０において、このことは命令「ｒｅｔ」を備えるに過ぎないであろう。（たとえばコンパイル又は変換を介して）このことから生成される出力命令５５０において、スタック・ポインタがテンポラリ・レジスタＩＰ０に移動される。次いで、ＩＰ０及びＩＰ１のコンテンツに対して論理ＡＮＤ演算が実行される。最後に、結果がスタック・ポインタに戻され、呼出し元（ｃａｌｌｅｒ）へのリターンが行われる。上記のように、テンポラリ・レジスタＩＰ０は、スタック・ポインタ中に記憶された値に対する演算を実行するために使用される。
【００４５】
再び図５ａを参照すると、出力命令５１０の最後の２つのラインは、リターンの後に呼出し元において何が起こるかを示す。特に、スタック・ポインタは、この場合も、値「０」と比較される。スタック・ポインタが「０」に等しい場合、ＩＰ１に「０」が記憶され（すなわち、制御フロー誤投機が起こったことを示し）、他の場合、ＣＳＥＴＭ命令によってレジスタＩＰ１にすべて１の値が記憶される。図５ａ、図５ｂ及び図５ｃが組み合わされて、スタック・ポインタのためのＡＢＩ不法値を使用することによって、関数呼出し境界を横断してレジスタＩＰ１中の制御フロー誤投機値をどのように通信するかを実証する。
【００４６】
図６は、いくつかの技法がどのように組み合わせられ得るかを示す。ここで、入力データ５８０はラベル「ｆｕｎｃｔｉｏｎ」への分岐を引き起こす。ラベル「ｆｕｎｃｔｉｏｎ」において、レジスタｘ１中に記載されたアドレスにおけるメモリ中に保持されている値が、次いで、レジスタｘ０にロードされる。命令「ｉｎｓｔｒ１」が、次いで、リターンの前に、実行される。出力データ５９０において、レジスタＩＰ１は、この場合も、制御フロー誤投機が行われたかどうかを表すために関数内で使用される。この値は、その値をスタック・ポインタに入れることによって関数間で渡される。誤投機が行われた場合、ＩＰ１中の値は「０」であり、他の場合、すべて１の値である。スタック・ポインタについて、誤投機が行われたとき、値は「０」であり、他の場合、（ＡＢＩルールが「０」であることを禁止する）変更されていないスタック・ポインタ値である。前述のように、スタック・ポインタは、そのスタック・ポインタが調整され得るようにレジスタＩＰ０に移動される。スタック・ポインタは、次いでＩＰ１の現在値とＡＮＤ演算され、スタック・ポインタに戻される。この段階において、スタック・ポインタは、次に、制御フロー投機の状態を反映する。関数呼出し（ｂｌ命令）が次いで行われる。関数「ｆｕｎｃｔｉｏｎ」において、制御フロー投機の状態がＩＰ１に転送されて戻される。前述のように、制御フロー投機が正しく行われた場合、レジスタ「ｘ１」中のアクセス・アドレスは変更されないままであり、他の場合、この値は「化けさせられ」、それによってアクセスを防ぐ。ＡＮＤ命令のすぐ前のＣＳＤＢ命令は、ＩＰ１の値が、そのポイントにおいて（誤）投機されたデータ値にならないことを意味するので、ｘ１中のアドレスは、制御フロー誤投機が起こったときに化けさせられる。命令「ｉｎｓｔｒ１」が次いで実行される。最後に、制御フロー投機の状態が、リターンの前にスタック・ポインタにストアバックされる。呼出し関数中のリターンのポイントにおいて、スタック・ポインタ中の制御フロー誤投機指示（誤投機の場合は「０」、正しい投機の場合は任意の非０値）は、レジスタＩＰ１に（誤投機の場合は「０」、正しい投機の場合はすべて１）変換されて戻され、（図６中に「…」として示されている）残っている命令の実行が継続する。
【００４７】
図７は、いくつかの実施例による、入力データから出力命令を生成するための装置６００を示す。装置は、（おそらく出力命令と異なる言語の、命令の形態であり得る）入力データを受信する入力回路６１０を含む。入力回路はこれらの命令を生成回路６２０に渡し、生成回路６２０は出力命令のシーケンスを生成する。出力命令のシーケンスは入力命令に基づく。この実例では、出力命令は、入力命令と同じ効果を達成するが、たとえば、図４ａ、図４ｂ、図５ａ、図５ｂ、及び図５ｃのうちのいくつか又はすべてに関して実証されているように、制御フロー誤投機をレジスタ中で追跡させる、（データ値投機に対して追加された少なくともいくつかの制限をもつ）追加されたさらなる命令を有する。出力命令は、次いで、出力回路６３０によって出力される。出力回路６３０によって出力された命令のシーケンスは、処理回路１００上で実行されるように設計される。命令のシーケンスは、１つの特定の例外とともに、命令がＡＢＩを実装するようなものである。１つの例外は、スタック・ポインタ・レジスタなど、記憶回路６４０に関して、関数呼出しにわたって記憶回路に記憶されることが禁止される値が、誤投機が行われた（又は行われなかった）ということを表すために、関数呼出しにわたってその記憶回路に事実上記憶されることである。
【００４８】
図８は、いくつかの実施例による、データ処理の方法を示す。方法は、フロー・チャート７００の形態で示されており、たとえば、図１に示されているように、データ処理装置１００によって実行され得る。ステップ７１０において、命令が復号され、制御信号が生成される。ステップ７２０において、１つ又は複数のデータ処理演算を実行するために制御信号が使用される。ステップ７３０において、対応する命令のためにデータ値投機が実行されることを抑止するために、データ処理演算と対応する制御信号（したがってそれらの対応する命令）が何らかの方法でマーキングされたかどうかが決定される。マーキングされなかった場合、ステップ７４０において、それらのデータ処理演算のための投機が許可される。そうでない場合、ステップ７５０において、それらの命令のための投機が禁止される。
【００４９】
図９は、いくつかの実施例による、データ処理の方法を示す。方法は、フロー・チャート８００の形態で示されており、たとえば、図７に示されているように、装置６００を使用して実行され得る。ステップ８１０において、入力データが受信される。ステップ８２０において、生成プロセスが実行される。このことは、図４ａ、図４ｂ、図５ａ、図５ｂ、及び図５ｃに関して示されているプロセスのうちのいくつか又はすべてと対応し得る。出力命令のうちの１つ又は複数は、制御フロー投機の状態を実行中に記憶させる。最後に、ステップ８３０において、生成プロセスの出力（出力命令のシーケンス）が出力される。
【００５０】
本出願では、「…ように構成された」という文言は、装置の要素が、定義された演算を実行することが可能な構成を有することを意味するために使用される。この文脈では、「構成」は、ハードウェア又はソフトウェアの相互接続の配置又は様式を意味する。たとえば、装置は、定義された演算を与える専用のハードウェアを有し得るか、又はプロセッサ若しくは他の処理デバイスは、機能を実行するようにプログラムされ得る。「ように構成された」は、装置要素が、定義された演算を与えるために何らかの方法で変更される必要があることを暗示しない。
【００５１】
添付の図面を参照しながら、本発明の例示的な実施例について本明細書で詳細に説明したが、本発明はそれらの正確な実施例に限定されないこと、及び添付の特許請求の範囲によって定義されているように、本発明の範囲及び趣旨から逸脱することなく、様々な変更、追加及び修正がその中で当業者によって実施され得ることを理解されたい。たとえば、本発明の範囲から逸脱することなく、従属請求項の特徴の様々な組合せが、独立請求項の特徴を用いて行われ得る。
【図１】
2021522562.tif 000003
【図２】
2021522562.tif 000004
【図３】
2021522562.tif 000005
【図４ａ】
2021522562.tif 000006
【図４ｂ】
2021522562.tif 000007
【図５ａ】
2021522562.tif 000008
【図５ｂ】
2021522562.tif 000009
【図５ｃ】
2021522562.tif 000010
【図６】
2021522562.tif 000011
【図７】
2021522562.tif 000012
【図８】
2021522562.tif 000013
【図９】
2021522562.tif 000014
【国際調査報告】
2021522562.tif 000015
2021522562.tif 000016