(54)【発明の名称】安全なドメインとより安全性の低いドメインの間で切り替えるときに安全ではないアクセスから安全なデータ及びプログラム・コードを保護するためのデータ処理装置及び方法
【文献】
Cortex-M3 テクニカルリファレンスマニュアル,ARM Limited,2007年 6月13日,リビジョン:r1p1,pp.5-1 - 5-36,[2017年7月31日検索],インターネット,URL,http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337ej/DDI0337ej_cortex_m3_trm.pdf
【文献】
セクション23. CodeGuardセキュリティ,Michrochip Technology Inc.,2011年 3月31日,pp.23-1 - 23-40,URL,http://ww1.microchip.com/downloads/jp/devicedoc/70199c_jp.pdf
(58)【調査した分野】(Int.Cl.,DB名)
前記事象が前記第1の事象タイプである場合に、前記処理回路が、前記第1の事象タイプを処理するために使用される前記より安全性の低いドメイン内の前記プログラム・コードにダミー戻りアドレスを提供するように構成され、前記ダミー戻りアドレスは、プログラム・コードの有効なアドレスではなく、
前記第1の事象タイプを処理するために使用される前記より安全性の低いドメイン内の前記プログラム・コードの完成時に、前記ダミー戻りアドレスが、前記戻りアドレスを前記安全なスタックからフェッチさせる、請求項1及び2のいずれか一項に記載のデータ処理装置。
前記第1の障害条件及び第2の障害条件の両方が、前記所定の署名を使用して検出可能となるように、前記所定の署名が、前記所定の相対的位置で記憶された前記第1の値を形成する、請求項4に記載のデータ処理装置。
前記事象が関数呼出しである場合に、前記処理回路が、前記関数呼出しによって識別される前記より安全性の低いドメイン内の前記プログラム・コードにダミー関数呼出し戻りアドレスを提供するように構成され、前記ダミー関数呼出し戻りアドレスが、プログラム・コードの有効なアドレスではないアドレスの範囲から選択され、そして、
前記所定の署名が、前記ダミー関数呼出し戻りアドレスとは異なる値を有する、請求項4及び5のいずれか一項に記載のデータ処理装置。
前記事象が例外である場合に、前記処理回路が、前記例外を処理するために使用される前記より安全性の低いドメイン内の前記プログラム・コードにダミー例外戻りアドレスを提供するように構成され、前記ダミー例外戻りアドレスが、プログラム・コードの有効なアドレスではないアドレスの範囲から選択され、そして、
前記所定の署名が、前記ダミー例外戻りアドレスとは異なる値を有する、請求項4、5及び6のいずれか一項に記載のデータ処理装置。
前記処理回路が、前記第2の障害条件に応答して前記安全なドメイン内で障害処理プログラム・コードを実行する、請求項4から7までのいずれか一項に記載のデータ処理装置。
前記例外戻りの繰り返しが再び、前記第2の障害条件が識別される原因となるように、前記第2の障害条件が識別された場合にスタック・ポインタ値が調節されない、請求項4から8までのいずれか一項に記載のデータ処理装置。
前記所定の相対的位置が、前記スタック・アクセス回路によって使用されるスタック・フレーム内の所定の位置である、請求項1から9までのいずれか一項に記載のデータ処理装置。
前記処理回路が、前記第1の障害条件に応答して前記安全なドメイン内で障害処理プログラム・コードを実行する、請求項1から11までのいずれか一項に記載のデータ処理装置。
前記第1の事象タイプの戻りの繰り返しが再び、前記第1の障害条件が識別される原因となるように、前記第1の障害条件が識別された場合にスタック・ポインタ値が調整されない、請求項1から12までのいずれか一項に記載のデータ処理装置。
前記安全なスタックの初期化時に、第2の値が前記安全なスタックの前記所定の相対的位置で記憶され、前記第2の値が、前記第1の値とは異なり、またプログラム・コードの有効なアドレスではなく、そして、
前記障害チェック回路が、前記所定の相対的位置で記憶された前記データが前記第2の値である場合に、前記より安全性の低いドメインから前記安全なドメインへの戻りの受信時に第3の障害条件を識別するように構成された、請求項1から13までのいずれか一項に記載のデータ処理装置。
データ処理装置でデータを処理する方法であって、前記データ処理装置が、プログラム・コードに応答してデータ処理動作を実行するための処理回路と、データを記憶するためのデータ・ストアとを備え、前記データ・ストアが、安全な領域及びより安全性の低い領域を含む複数の領域を備え、前記安全な領域が、安全なドメインで動作するときに前記処理回路によってアクセス可能であり、より安全性の低いドメインで動作するときに前記処理回路によってアクセス可能でない極秘データを記憶するように構成され、前記データ・ストアが、前記安全な領域内の安全なスタックを含む複数のスタックを備え、
前記安全なドメインから前記より安全性の低いドメインへの遷移を必要とする事象に応答して所定の処理状態を前記安全なスタックに記憶するステップと、
前記事象が第1の事象タイプである場合に、前記安全なスタックで所定の相対的位置に記憶された少なくとも1つの戻りアドレスを前記所定の処理状態として記憶するステップと、
前記事象が第2の事象タイプである場合に、前記所定の相対的位置で記憶された少なくとも1つの第1の値であって、プログラム・コードの有効なアドレスではない前記第1の値を前記所定の処理状態として記憶するステップと、
前記より安全性の低いドメインから前記安全なドメインへの第1の事象タイプの戻りの受信時に、前記所定の相対的位置で記憶された前記データが前記第1の値である場合に、第1の障害条件を識別するステップと
を含む、方法。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】米国特許第7966466号
【特許文献2】米国特許出願公開第2008/0250216号
【0008】
(発明の概要)
第1の態様から見ると、本発明はデータ処理装置を提供し、前記データ処理装置は以下を備える:プログラム・コードに応答してデータ処理動作を実行するように構成された処理回路、データを記憶するように構成されたデータ・ストア、前記データ・ストアは、安全な領域及びより安全性の低い領域を含む複数の領域を備え、その安全な領域は、安全なドメインで動作するときに前記処理回路によってアクセス可能であり、より安全性の低いドメインで動作するときに前記処理回路によってアクセス可能でない極秘データを記憶するように構成され、前記データ・ストアは、前記安全な領域内の安全なスタックを含む複数のスタックを備え、その処理回路は安全なドメインからより安全性の低いドメインへの遷移を必要とする事象に応答して安全なスタックに所定の処理状態を記憶するように構成されたスタック・アクセス回路を含み、前記事象が第1の事象タイプである場合には、スタック・アクセス回路によって記憶される所定の処理状態は、安全なスタックで所定の相対的位置に記憶された少なくとも1つの戻りアドレスを含み、その事象が第2の事象タイプである場合には、スタック・アクセス回路によって記憶される所定の処理状態は、前記所定の相対的位置で記憶された少なくとも1つの第1の値を含み、前記第1の値はプログラム・コードの有効なアドレスではなく、そして、その処理回路は、より安全性の低いドメインから安全なドメインへの第1の事象タイプの戻りの受信時に前記所定の相対的位置で記憶されたデータが前記第1の値である場合に第1の障害条件を識別するように構成された障害チェック回路をさらに備える。
【0009】
本発明によれば、複数の事象タイプが安全なドメインとより安全性の低いドメインの間の遷移を引き起こすことが可能にされる。事象が、安全なドメインからより安全性の低いドメインへの遷移を必要とする場合、スタック・アクセス回路は、より安全性の低いドメインへの遷移が起こる前に安全なスタックである種の所定の処理状態を記憶するように構成される。その所定の処理状態として安全なスタックで記憶されるものは、事象タイプに依存することになり、より安全性の低いプログラム・コードが、異なる事象タイプに関連する戻りを使用し、安全なドメインに戻ろうとする場合には、これが検出されることを確実にするように選択される。
【0010】
具体的には、安全なドメインからより安全性の低いドメインへの遷移を引き起こす事象が第1の事象タイプである場合、スタック・アクセス回路が安全なスタックで記憶する所定の処理状態は、少なくとも1つの戻りアドレスを含み、その戻りアドレスは安全なスタックで所定の相対的位置に記憶される(たとえば、所定の処理状態を記憶するためにスタック・アクセス回路によって使用されるスタック・フレームの下部の入力で、又は、その下部の入力に関連する何らかの所定のオフセットで)。
【0011】
同様に、事象が第2の事象タイプである場合、その事象においてスタック・アクセス回路によって記憶される所定の処理状態は、その所定の相対的位置で記憶される少なくとも1つの第1の値を含む。
【0012】
第1の事象タイプの戻りが、その後、より安全性の低いドメインから安全なドメインに受信される場合、障害チェック回路は、所定の相対的位置からデータを検索することになる。第1の事象タイプの戻りが使用されているので、その場合、その所定の相対的位置は、スタック・アクセス回路によって前に記憶された戻りアドレスを記憶するはずである。しかし、そうではなくて、それが第1の値を記憶する場合、これは、安全なドメインからより安全性の低いドメインへの最初の遷移が第2の事象タイプによったという事実にかかわらず、より安全性の低いプログラム・コードが第1の事象タイプの戻りを介して戻ろうとしているシナリオを示し、この状況で、障害チェック回路は、第1の障害条件を識別することになり、したがって、そのような活動にフラグを立てる。したがって、この機構は、安全なドメインからより安全性の低いドメインへの遷移を前に引き起こした事象タイプを前提として使用されるべきものではなくて安全なドメインへの異なる事象タイプの戻りを使用することによって安全なコードへの任意の分岐を間接的に実行しようとすることを含む、様々な攻撃を悪意のあるユーザが行なうのを防ぐ。
【0013】
第1の事象タイプ及び第2の事象タイプは、様々な形をとり得る。しかし、一実施例で、第1の事象タイプは関数呼出しであり、そして、第2の事象タイプは例外である。したがって、前述の機構は、安全なドメインからより安全性の低いドメインへの例外分岐に続いて安全なドメインへの関数呼出し戻りを実行しようと試みる悪意のある攻撃が防がれることになることを確実にすることになる。
【0014】
一実施例で、事象が前記第1の事象タイプである場合、処理回路は、前記第1の事象タイプを処理するために使用される前記より安全性の低いドメイン内のプログラム・コードにダミー戻りアドレスを提供するように構成され、そのダミー戻りアドレスはプログラム・コードの有効なアドレスではない。次いで、前記第1の事象タイプを処理するために使用されるより安全性の低いドメイン内のプログラム・コードを完成するときに、そのダミー戻りアドレスが、前記戻りアドレス(すなわち、実際の戻りアドレス)が安全なスタックからフェッチされるようにする。具体的には、ダミー戻りアドレスを見るとき、スタック・アクセス回路は安全なスタックから所定の相対的位置で保持されたデータをロードするように構成され、したがって、障害チェック回路は、そのデータが予期された戻りアドレスを指定するか、或いはそうではなくて障害条件を示す前述の第1の値であるかをチェックすることができる。
【0015】
一実施例で、ダミー戻りアドレスはまた、事象が安全なドメインからより安全性の低いドメインへの遷移を引き起こすときに、その後の戻り(そのダミー戻りアドレスを使用する)が安全なドメインに戻る遷移を引き起こすことになることを確実にするために使用することができ、したがって、障害チェック回路が所望のチェックを実行できるようにする。
【0016】
一実施例で、事象が例外である場合、スタック・アクセス回路によって記憶される所定の処理状態は所定の署名を含み、そして、障害チェック回路は、より安全性の低いドメインから安全なドメインへの例外戻りの受信時に所定の署名がスタック・アクセス回路によって記憶される所定の処理状態内に存在しない場合には第2の障害条件を識別するように構成される。
【0017】
そのような手法によって、例外戻りが、関数呼出しを介して起こる安全なドメインからより安全性の低いドメインへの遷移に続いてより安全性の低いドメインから発行される場合、そのとき、スタック・アクセス回路によって安全なスタックで記憶された所定の処理状態は、その所定の署名を含まないことになり、したがって、これは、不正な戻りを使用する企てられた攻撃を示すことになる。
【0018】
所定の署名は、安全なスタック内の任意の適切な位置に置くことができ、任意の所望の形をとることができる。しかし、特に効率的な一実施例で、所定の署名は、所定の相対的位置で記憶された前述の第1の値を形成する。結果として、その単一の所定の署名は、第1の障害条件及び第2の障害条件の両方が障害チェック回路によって検出可能になることを可能にする。
【0019】
一実施例で、事象が関数呼出しである場合、処理回路は、前記関数呼出しによって識別される前記より安全性の低いドメインのプログラム・コードにダミー関数呼出し戻りアドレスを提供するように構成され、そのダミー関数呼出し戻りアドレスはプログラム・コードの有効なアドレスではない範囲のアドレスから選択され、そして、前記所定の署名は前記ダミー関数呼出し戻りアドレスとは異なる値を有する。所定の署名がダミー関数呼出し戻りアドレスとは異なる値を有することを確実にすることによって、実行されることになる必要なアクションは分析されている値のみから判定することができ、その値が関数呼出し戻りに由来するか又はスタックから読み取られたかとは無関係であるので、これは、処理回路の実装を簡略化する。
【0020】
別法として、又は追加で、事象が例外である場合、処理回路は、前記例外を処理するために使用される前記より安全性の低いドメイン内のプログラム・コードにダミー例外戻りアドレスを提供するように構成され、そのダミー例外戻りアドレスはプログラム・コードの有効なアドレスではないアドレスの範囲から選択され、そして、前記所定の署名は前記ダミー例外戻りアドレスとは異なる値を有する。さらに、実装の効率性が、所定の署名をダミー例外戻りアドレスとは異なるようにすることによって、実現され得る。
【0021】
一実施例で、所定の相対的位置は、スタック・アクセス回路によって使用されるスタック・フレーム内の所定の位置である。その位置は、原則として、スタック・フレーム内の任意の位置でもよいが、一実施例では、所定の位置は、スタック・フレームの下部の位置、すなわちスタック・ポインタによって指される位置、である。
【0022】
第1の障害条件が生じさせられた後にはそれが処理され得る、いくつかの方法が存在する。しかし、一実施例では、処理回路は、前記第1の障害条件に応答して前記安全なドメイン内で障害処理プログラム・コードを実行する。障害処理プログラム・コードが安全なドメイン内で実行されることを確実にすることによって、これは、より安全性の低いドメインの攻撃者が制御を取り戻すことを防ぎ、その結果、攻撃を再試行するのを防ぐ。
【0023】
攻撃の再試行を阻止するための代替機構として、第1の事象タイプの戻りの繰り返しもまた前記第1の障害条件が識別されるように、データ処理装置は、前記第1の障害条件が識別される場合にスタック・ポインタ値が調整されないように構成され得る。その結果、スタック・ポインタを調整しないことによって、攻撃者は、安全なスタックの最後の位置を単に破壊し、次いで安全なスタック内の異なる場所で入力するために攻撃を再試行することはできない。
【0024】
一実施例で、前述の機構は両方とも、より安全性の低いドメインからの攻撃の再試行に対する頑強性を実現するために使用することができる。前述の機構は、第1の障害条件の処理に関して説明されたが、それらはまた、第2の障害条件の処理にも同等に適用され得る。
【0025】
一実施例で、安全ではないドメインからの潜在的攻撃を生じさせ得るもう1つのシナリオが、安全なスタックの初期化に続いて生じる。この時点で、安全なスタックは空であることになる。その時に、実行されているプログラム・コードがより安全性の低いドメイン内である場合、そのプログラム・コードが安全なドメインに戻ろうと試み得ることが起こり得る。合法的にそこから戻られることになる安全なドメインからより安全性の低いドメインへの元の遷移は存在しないので、そのような戻りは防がれるべきである。一実施例で、データ処理装置は、安全なスタックの初期化時に、第2の値が安全なスタックで前記所定の相対的位置で記憶され、前記第2の値が前記第1の値とは異なり、プログラム・コードの有効なアドレスではないことを確実にすることによって、そのようなシナリオからの保護を実現する。障害チェック回路は、その場合、より安全性の低いドメインから安全なドメインへの戻りの受信時に、前記所定の相対的位置で記憶されたデータが前記第2の値である場合に第3の障害条件を識別するように構成される。本実施例によれば、より安全性の低いドメインからの戻りは、安全なスタックで所定の相対的位置に記憶されたデータを障害チェック回路にロードさせることになり、本シナリオでは、そのデータは前述の第2の値を識別することになり、第3の障害条件を検出させる。第3の障害条件の処理は、第1の障害条件及び第2の障害条件について前述したのと同じ方法で、攻撃の再試行もまた防がれることを確実にしつつ、行われ得る。
【0026】
一実施例で、第3の障害条件は第1の障害条件と同じであり、したがって、同じ障害処理コードがこれらの障害条件の両方に使用される。したがって、そのような実施例では、障害チェック回路が第1の値と第2の値を区別する必要はない。
【0027】
一実施例で、データ処理装置は複数のレジスタをさらに備え、事象が例外である場合、スタック・アクセス回路によって記憶される所定の処理状態は、少なくとも1つのサブセットの前記レジスタの内容をさらに備える。1つの特定の実施例で、その内容がスタック・アクセス回路によって記憶されるレジスタの数は、例外が安全なドメインによって処理されることになるか又はより安全性の低いドメインによって処理されることになるかに依存することになる。
【0028】
一実施例で、その複数のスタックは、前記より安全性の低い領域内のより安全性の低いスタックをさらに含み、そして、処理回路は、バックグラウンド処理が実行されていたドメインに基づいて、どのスタックにデータを記憶するか、又はどのスタックからデータをロードするかを判定するように構成される。本願で、「バックグラウンド処理」という用語は、関数呼出し又は例外によって中断された処理を示すために使用される。少なくとも例外では、より優先度の高い例外が既に処理中のより優先度の低い例外に割り込むことが可能である。したがって、例外処理ルーチン自体が、より優先度の高い例外(本明細書では先制する例外という)によって割り込まれた場合、次いで、割り込まれた例外処理ルーチン自体は、先制する例外の「バックグラウンド処理」になり得る。
【0029】
第2の態様から見ると、本発明は、データ処理装置でデータを処理する方法を提供し、前記データ処理装置は、プログラム・コードに応答してデータ処理動作を実行するための処理回路と、データを記憶するためのデータ・ストアとを備え、前記データ・ストアは安全な領域及びより安全性の低い領域を含む複数の領域を備え、安全な領域は、安全なドメインで動作するときに前記処理回路によってアクセス可能であり、より安全性の低いドメインで動作するときに前記処理回路によってアクセス可能でない極秘データを記憶するように構成され、前記データ・ストアは、前記安全な領域内の安全なスタックを含む複数のスタックを備え、そして、前記方法は、以下を含む:安全なドメインからより安全性の低いドメインへの遷移を必要とする事象に応答して所定の処理状態を安全なスタックに記憶するステップと、前記事象が第1の事象タイプである場合に、安全なスタックで所定の相対的位置に記憶された少なくとも1つの戻りアドレスを所定の処理状態として記憶するステップと、その事象が第2の事象タイプである場合に、前記所定の相対的位置で記憶された少なくとも1つの第1の値を所定の処理状態として記憶するステップであって、前記第1の値がプログラム・コードの有効なアドレスではないステップと、より安全性の低いドメインから安全なドメインへの第1の事象タイプの戻りの受信時に、前記所定の相対的位置で記憶されたデータが前記第1の値である場合に第1の障害条件を識別するステップ。
【0030】
第3の態様から見ると、本発明は、データ処理装置を提供し、前記データ処理装置は、以下を備える:プログラム・コードに応答してデータ処理動作を実行するための処理手段、データを記憶するためのデータ記憶手段、前記データ記憶手段は安全な領域及びより安全性の低い領域を含む複数の領域を備え、その安全な領域が、安全なドメインで動作するときに前記処理手段によってアクセス可能であり、より安全性の低いドメインで動作するときに前記処理手段によってアクセス可能でない極秘データを記憶するように構成され、前記データ記憶手段が、前記安全な領域内の安全なスタックを含む複数のスタックを備え、その処理手段は、安全なドメインからより安全性の低いドメインへの遷移を必要とする事象に応答して所定の処理状態を安全なスタックに記憶するためのスタック・アクセス手段を含み、前記事象が第1の事象タイプである場合には、スタック・アクセス手段によって記憶される所定の処理状態が、安全なスタックで所定の相対的位置に記憶された少なくとも1つの戻りアドレスを含み、その事象が第2の事象タイプである場合には、スタック・アクセス手段によって記憶される所定の処理状態が、前記所定の相対的位置で記憶された少なくとも1つの第1の値であって、プログラム・コードの有効なアドレスではない前記第1の値を含み、そして、その処理手段はさらに、より安全性の低いドメインから安全なドメインへの第1の事象タイプの戻りの受信に応答して前記所定の相対的位置で記憶されたデータが前記第1の値である場合に第1の障害条件を識別するための障害チェック手段を備える。
【発明を実施するための形態】
【0032】
図1は、たとえばマイクロコントローラでもよいデータ処理装置10を示す。それは、命令を処理するための処理回路20と、処理回路20によって処理されたデータを記憶するための、及びまたは処理回路20が実行するプログラム・コードを記憶するためのデータ・ストア30とを備える。
【0033】
データ・ストア30は、異なるセキュリティの2つの領域、安全な領域32及び安全ではない領域34(本明細書では、より安全性の低い領域とも呼ばれる)、を有する。安全な領域32で記憶されたデータは、それが実行しているときに安全ではない領域34に記憶されたコードにアクセスすることはできない。
【0034】
データ処理装置10はまた、安全な領域32及び安全ではない領域34へのアクセスを制御するメモリ保護ユニットMPU(memory protection unit)40を有する。この制御はメモリ保護ユニットを介して実行され得るが、他の実施例では、それは、現在実行されている領域コードが記憶されることを監視する及びこれに基づいてそのメモリの異なる領域へのアクセスを制御する処理装置内の回路によって、より分散された形で行われ得る。
【0035】
この実施例では、処理回路20が実行しているドメインのセキュリティは、現在実行されているコードが記憶された領域から判定することができる。したがって、安全なデータ・ストア32に記憶された安全なプログラム・コードは、安全なドメインで実行され、安全なスタック36を使用してデータ値を記憶する。同様に、安全ではないデータ・ストア34に記憶された安全ではないコードは、安全ではないドメインで実行され、実行中にデータ値を記憶するために安全ではないスタック38を使用する。動作中の現在のドメインを判定するための他の技法もまた、たとえば制御フロー変更命令に従ってどのドメインでプロセッサが動作すべきかを識別する目標ドメイン値に基づいて、可能である。
【0036】
処理回路20は、実行されることになる命令をフェッチするためのフェッチ回路22を有する。処理回路20はまた、これらの命令を復号するための復号回路24と、それらを実行するための実行回路26とを有する。実行されることになる命令は、メモリ保護ユニットMPU40を介してデータ・ストア30からフェッチ回路22によってフェッチされる。それらの命令及びデータは、安全な領域及び安全ではない領域へのアクセスを制御し、安全なデータを安全ではない側から隔離する、MPU40を介して検索される。
【0037】
本実施例では、データ処理中に使用される汎用レジスタを有するレジスタ・バンク60が存在する。これらの汎用レジスタは、どの命令が次に実行されるものであるかを指示するプログラム・カウンタPC(program counter)と、スタック内のどのポイントで次のデータ・アクセスが行われるべきかを指示するスタック・ポインタSP(stack pointer)とを有する。本実施例では、安全な側のスタックと安全ではない側のスタックが存在するので、安全なスタック・ポインタSSP(secure stack pointer)と安全ではないスタック・ポインタNSP(non−secure stack pointer)とが存在するが、これらのうちの1つのみがどの時点においても実行されているプログラムに直接に可視である。いくつかの実施例では、各スタックのための複数のスタック・ポインタが存在し得るが、やはりどの時点においても1つのみが可視であることになることに留意されたい。処理回路20によって処理されているデータ値を記憶するためのレジスタ・バンク60内の汎用レジスタもまた存在する。本実施例で、これらはR0からR12の印を付される。
【0038】
レジスタ・バンク60はまた、例外が取得される又は関数が呼び出されるときに戻り値を記憶するために使用され得るリンク・レジスタ65を備える。戻り値は、システムが戻りが例外戻り又は関数戻りであるかどうかを判定すること及び例外又は関数から戻るときに何の処理が必要とされるかを判定することを可能にする。関数の完了に続いて処理されることになるプログラム命令のアドレスを指示する関数戻りアドレスと、実際の関数アドレスがより安全性の低いドメインからそれを隠すために安全なスタックに記憶された関数戻りを指示するダミー関数戻り値と、例外戻りを指示し、その例外戻りをどのように処理するか、たとえば、状態を復元するときにどのスタックにアクセスするか、及びいくつのレジスタがロードされる必要があるか、をプロセッサが判定することを可能にすることができる、バックグラウンド処理が処理されたドメインのセキュリティ・レベルの指示などの情報を含み得る、例外戻り(EXC_RETURN)値とを含む、異なる種類の戻り値が使用され得る。異なる形の戻り値が、後で説明されることになる。
【0039】
図1はまた、浮動小数点レジスタなどの追加の特定目的レジスタを有する追加のレジスタ・バンク64を示す。一実施例で、値は、安全なコンフィギュレーション・レジスタ(SCR:secure configuration register)62で設定されて、追加のレジスタ・バンク64内のレジスタのいずれかが安全なデータを記憶し得るかどうかを識別し、そうである場合、レジスタは、安全なドメインからより安全性の低いドメインへの及びその逆の遷移を制御するときに管理される必要がある1セットのレジスタの部分を(レジスタ・バンク60のレジスタとともに)形成すると考えられることになる。
【0040】
安全なドメインからより安全性の低いドメインへの及びその逆の遷移を引き起こし得るいくつかの機構が存在する。記載の実施例によれば、セキュリティ・ドメイン間で遷移するための1つの許容される機構は、関数呼出し機構であり、それによって関数呼出しが発行されて、その関数呼出しによって識別される別のソフトウェア・ルーチンへの遷移を可能にするために、現在のソフトウェア・ルーチンの実行を一時的に停止させることができ、安全なドメイン又はより安全性の低いドメインのいずれかで実行されることになるこの他方のソフトウェア・ルーチンは、その他方のソフトウェア・ルーチンがデータ・ストア30内のどこに記憶されるかに依存する。その他方のソフトウェア・ルーチンが実行された後には、次いで、関数呼出し戻りが、一時的に停止された最初のソフトウェア・ルーチンの実行に戻るために、実行される。いくつかの関数呼出しが、現在のソフトウェア・ルーチンと同じドメイン内で実行されることになる目標ソフトウェア・ルーチンを識別することになるが、他の例では、目標ソフトウェア・ルーチンは、現在のソフトウェア・ルーチンが実行しているドメインと異なるドメインでの実行を必要とし得る。
【0041】
前述の実施例によれば、セキュリティ・ドメイン間での遷移に使用され得るもう1つの機構は、例外機構である。この機構によれば、例外の発生時に、現在のソフトウェア・ルーチンの実行は、一時的に停止されることになり、その代わりに、実行は、例外を処理するために使用される例外処理ルーチンに分岐することになり、使用される例外処理ルーチンは、生じる例外のタイプに依存する。例外処理ルーチンが実行された後は、例外戻りが次いで使用されて、生じる例外の結果として一時的に停止された最初のソフトウェア・ルーチンに戻ることになる。
【0042】
例外制御回路28が、例外の取得を制御するために提供され、これらの例外は、より安全なドメインからより安全性の低いドメインへの遷移をもたらし、極秘データを記憶することができるレジスタのセットは、これらのレジスタに記憶されたデータがより安全性の低い側に使用可能になるのを避けるために、その例外の取得に先立ってクリアされることになる。これらのレジスタのうちのいくつか又はすべてに記憶された状態は、例外から戻るときにその状態が復元され得るように、スタック・アクセス回路70の制御の下で安全なスタックに記憶されることになる。例外処理を目的として、適切なスタックへのレジスタ内容の記憶を制御するために使用されるスタック・アクセス回路70は、例外制御回路28の部分を形成すると考えることができる。しかし、より一般的には、安全なドメインからより安全性の低いドメインへの遷移を必要とする関数呼出しの発生時に安全なスタックへの所定の処理状態の記憶に関連する何らかのスタック・アクセス回路70もまた存在し、したがって、スタック・アクセス回路70は、
図1で例外制御回路28に対して別個に識別される。
【0043】
さらに、
図1に示すように、障害チェック回路75が、より安全性の低いドメイン内のソフトウェアが安全なドメインからより安全性の低いドメインに遷移するために使用される最初の機構とは異なるタイプである戻り機構を介して安全なドメインに戻ろうとする(たとえば、例外から戻るための関数呼出し戻り、又は関数呼出しから戻るための例外戻りを使用することによって)状況を検出するために提供される。障害チェック回路75の部分は、例外制御回路28内に含まれる(すなわち、例外戻りをチェックする責任を有する部分)と考えることができるが、障害チェック回路75の他の部分は、処理回路のハードウェア内の他の場所に分散することができる。たとえば、関数呼出し戻りをチェックする責任を有する部分は、一実施例で、フェッチ回路22と関連付けられ得る。障害チェック回路75の動作は、後でより詳細に論じられることになる。
【0044】
図1で、データ・ストア30は単一の安全な領域及び単一のより安全性の低い領域を含むが、本明細書に記載の技法は、3つ以上の異なるセキュリティ領域を備える異なる実装形態にも同様に適用可能である。
【0045】
また、
図1は、実行ステージ26などの処理回路20の他の部分とは別個なものとして例外制御回路28及びスタック・アクセス回路70を示すが、実際には、例外制御回路28及びスタック・アクセス回路70は、処理回路20のいくつかの要素を少なくとも部分的に再使用して例外の処理及びスタック動作を制御することができる。
【0046】
図2は、一実施例で使用され得るメモリ・アドレス空間を概略的に示す。メモリ・アドレス空間100は、分割されて1つ又は複数の安全な領域及び1つ又は複数のより安全性の低い領域を形成することになる。簡単にするために、
図2では、単一の安全な領域及び単一のより安全性の低い領域が存在すると仮定される。安全なアドレス空間102の一部分が、安全なドメインで実行されることになるプログラム・コードの記憶のために確実にされることになる一方で、安全なアドレス空間104の別の部分は安全なスタック36に割り当てられることになる。安全なアドレス空間106の残りは、たとえば、メモリ・ヒープとして、実行中に割り当てられる空きスペースとしてなど、様々な目的で使用されることになる。より安全性の低いアドレス空間もまた、同様の方法で分割されることになり、それにより、より安全性の低いドメインで実行されることになるプログラム・コードの記憶のための部分110、より安全性の低いスタック38に割り当てられる部分112、及び残りの部分114を提供する。
【0047】
記載の実施例によれば、メモリ・アドレス空間はまた、この領域内のアドレスがプログラム・コードのための有効なアドレスではない、予約された領域120を含む。以下にさらに詳細に論じるように、これらの予約されたアドレスのうちのいくつかは、記載の実施例のための所望の機能を提供するために使用される。
【0048】
速度及び効率の改善を目的として、前述の実施例は、安全なドメインとより安全性の低いドメイン、すなわち関数呼出し機構と例外機構、の間で遷移するための2つの機構を提供する。しかし、複数のドメイン遷移機構の使用は、悪意ある攻撃への脆弱性を高め、たとえば、より安全性の低いドメイン内のソフトウェアが、安全なドメインからより安全性の低いドメインに遷移するために使用される最初の機構とは異なるタイプの戻り機構を介して安全なドメインに戻ろうとすることを可能にする。2つの特定の攻撃シナリオが、
図3A及び3Bに示される。
図3Aに示すように、何らかの安全なコードがポイント145で実行し、そして、ポイント150で関数呼出しが、より安全性の低いドメイン内に存在する関数に対して行われると仮定される。その関数は、次いで、ポイント155で実行されるが、ポイント160で、より安全性の低いソフトウェアが、例外戻り機構を使用することによって安全なコードへの任意の分岐を試みる。
【0049】
同様に、
図3Bでは、何らかの安全なコードがポイント175で実行し、そして、ポイント180で、例外(たとえば、割込み)が生じ、より安全性の低いドメインにおける例外処理ルーチンへの分岐を引き起こすと仮定される。この例外処理ルーチンは、ポイント185で実行されるが、その後にポイント190で、より安全性の低いドメイン内のソフトウェアが安全なドメインへの関数戻りを行おうと試みる。
【0050】
システムのセキュリティが維持されることになる場合、そのようなシナリオが起こることが許された場合、これは、安全なデータへのアクセスを得るための機構を提供することができる安全なコードへの任意の分岐をより安全性の低いソフトウェアが行おうとすることを可能にすることになるので、前述の攻撃シナリオの両方が防がれる必要がある。
【0051】
そのような攻撃から保護するために、スタック・アクセス回路70が、
図4A及び4Bを参照してより詳細に論じられるように、安全なドメインからより安全性の低いドメインへの遷移を引き起こす関数呼出し又は例外が生じるときに安全なスタックのスタック・フレームに所定の処理状態を格納するように構成される。
図4Aでは、安全なプログラムFOOは安全なドメインで現在実行していて、次いで、関数呼出し又は例外が、FOOが完了する前に生じると仮定される。関数呼出し又は例外の発生に先立って、FOOは、通常は、FOOによって使用される一時的データを記憶するために、安全なスタック200で割り当てられたスタック・フレーム205を使用することになる。関数呼出し又は例外の発生時に、別個のスタック・フレーム210が、次いで、スタック・アクセス回路70のために割り当てられることになり、そして、そのスタック・アクセス回路は、次いで、関数呼出しによって識別される必要のあるソフトウェア・ルーチンへの又は例外を処理するために必要とされる例外処理ルーチンへの分岐に先立って、スタック・フレーム210内で所定の処理状態を記憶することになる。
【0052】
例外が生じる状況を第1に考えると、そのとき、例外処理ルーチンが安全なドメイン内で実行されようとする場合、スタック・フレーム210内のスタック・アクセス回路によって記憶される所定の処理状態は、
図4Bによって識別されるレジスタ215の内容を含む。これらのレジスタは、本明細書で、「発呼側」レジスタと呼ばれ、それらは、スタック・アクセス回路70(又は例外制御回路28)が、例外処理ルーチンが実行されることになるドメインに関わらず、スタックへの状態保存の責任を常に取ることになる、レジスタである。デフォルトで、例外処理ルーチンは、その場合、レジスタ(本明細書で「被発呼側」レジスタと呼ばれる)の残りの状態保存の責任を有することになる。具体的には、例外処理ルーチンは、その場合、例外処理ルーチンの本体におけるレジスタの再使用に先立って、例外処理ルーチンが実行しているドメインに関連するスタックに被発呼側レジスタの状態を保存することになる。さらに、例外処理ルーチンが完了された後には、例外処理ルーチンは、次いで、例外戻りの発行に先立ってそれらの被発呼側レジスタの状態を復元する(通常は、それらをスタックから関連レジスタにコピーして戻すことによって)責任を有することになる。
【0053】
しかし、前述の実施例によれば、例外が安全なドメインからより安全性の低いドメインへの遷移を必要とすることになる、前のバックグラウンド処理が安全なドメインにおいてであった状況で、スタック・アクセス回路70は、さらに、処理回路を例外処理ルーチンの実行に遷移させる前に、スタック・フレーム210内での被発呼側レジスタの状態保存の責任を取る。したがって、
図4Bに示すように、この状況で、スタック・フレーム210内に記憶された所定の処理状態は、220の形を取る。
図4Bで具体的に識別された発呼側及び被発呼側レジスタは、単に、どのように発呼側及び被発呼側レジスタが分割され得るかの一例であり、厳密にどのレジスタが発呼側レジスタ又は被発呼側レジスタであると考えられるかは、実装形態に応じて変わることになる。
【0054】
図4Bにやはり示すように、例外処理ルーチンがより安全性の低いドメイン内にあり、したがって安全なドメインからより安全性の低いドメインへの遷移を必要とする状況で、スタック・アクセス回路はまた、スタック・フレーム210内の所定の相対的位置で所定の署名222を記憶するように構成され、図示された実施例では、この所定の相対的位置はスタック・フレーム内の下部の位置である。この所定の署名は、様々な形を取り得るが、一実施例では、プログラム・コードの有効なアドレスに対応しない値を有するように選択される。一実施例で、その所定の署名は、メモリ・アドレス空間の予約された部分内のアドレス値120のうちの1つを有するように選択される。1つの特定の実施例で、その所定の署名は、値0xF0A5125Aを有する。
【0055】
通常は、関数呼出しの発生時に、スタック・アクセス回路70は、通常は、スタック・フレーム210内で所定の処理状態を記憶しないことになる。したがって、関数呼出しが、やはり安全なドメイン内にある目標コードを識別する場合、所定の処理状態は記憶されない。しかし、関数呼出しがより安全性の低いドメイン内で目標コードを識別する場合、そのとき、スタック・アクセス回路70は、関数呼出しが完了された後にFOOの実行を再開するために必要とされることになる戻りアドレス225をスタック・フレーム210内に記憶するように構成される。この戻りアドレス225は、より安全性の低いドメインへの遷移を必要とする例外発生の場合に所定の署名222が記憶されるときと同じ所定の相対的位置、すなわち、スタック・フレーム内の下部の位置、で記憶される。
【0056】
安全なスタック内に記憶された実際の戻りアドレス225の代わりに、より安全性の低いドメイン内の目標コードが、実際にはプログラム・コードの有効なアドレスではないダミー関数呼出し戻りアドレス内で提供される。一実施例で、そのダミー関数呼出し戻りアドレスは、予約されたアドレス120のうちの1つから選択され、前述の所定の署名222とは異なる値を有するようにさらに選択される。
【0057】
関数呼出しの発生時に、ソフトウェアは、たとえ状態保存が
図4Bに示すスタック・フレームによるハードウェアによって必要とされない場合でも、やはりレジスタ状態の状態保存を実行することができる。レジスタの発呼側及び被発呼側レジスタへの分割は、それが、関数呼出しの前に実行されるソフトウェア(発呼側ソフトウェア)及び関数呼出しの後に実行されるソフトウェア(被発呼側ソフトウェア)の両方がどのレジスタが状態保存を受けるかに影響を及ぼすことを可能にするので、そのような関数呼出しに有用である。たとえば、発呼側ソフトウェアが、それがある特定の発呼側レジスタを使用しなかった、又はいくつかの発呼側レジスタ内のデータの使用を終了したと認識した場合、そのとき、それらのレジスタ内の値は関数呼出しの後に保持される必要はないことになり、したがって、これらのレジスタは状態保存を受ける必要はない。同様に、被発呼側ソフトウェアがある特定の被発呼側レジスタを使用していないことになる場合、そのとき、被発呼側ソフトウェアはこれらのレジスタの状態保存を実行する必要はない。したがって、発呼側及び被発呼側ソフトウェアの両方が状態保存のためのレジスタの選択に影響を及ぼすことを可能にすることで、適切な場合に状態保存の量を低減することによってパフォーマンスの改善を可能にする。相対的に、発呼側ソフトウェアのみ又は被発呼側ソフトウェアのみが状態保存の責任を有する場合、そのとき、他方のソフトウェアがそのレジスタが保存されることを必要とする場合に備えて、いくつかのレジスタが余計に保存されることがある。
図5は、一実施例による、関数呼出しの発生時に処理回路によって実行されるステップを示す流れ図である。ステップ300で、現在実行しているコードが安全なドメインで実行されているかどうかが判定される。そうでない場合、次いで、本処理はステップ310に直接進み、そこで、リンク・レジスタ(LR:link register)が戻りアドレスと等しく設定される。その後、本処理はステップ325に進み、そこで、分岐が新しい関数(すなわち、関数呼出しの目標として識別されるプログラム・コード)に実行される。戻りアドレスはリンク・レジスタ内で設定されてあるので、新しい関数が完了したとき、正しい戻りアドレスが関数呼出し戻り内で指定され得る。
【0058】
ステップ300で現在実行しているコードが安全なドメイン内で実行されていると判定された場合、次いで、ステップ305で、関数呼出しの宛先である新しい関数がより安全性の低いドメイン内で実行されることになるかどうかが判定される。これが判定され得るいくつかの方法が存在するが、一実施例で、これは、関数呼出しの目標アドレスが安全なメモリ領域又はより安全性の低いメモリ領域に関連するアドレスであるかどうかを判定することによって単純に達成される。それがより安全性の低いメモリ領域に関連する場合、これは、その関数呼出しの宛先がより安全性の低いドメイン内であることを示す。関数呼出しの宛先がより安全性の低いドメイン内でない場合、次いで、再び、本処理はステップ310に進む。
【0059】
しかし、関数呼出しの宛先がより安全性の低いドメイン内である場合、そのとき、これは、安全なドメインからより安全性の低いドメインへの遷移の必要性を示し、そして、この時点で、本処理はステップ315に進み、そこで、リンク・レジスタが、前述のようにダミー関数呼出し戻りアドレスに設定される。加えて、ステップ320で、実際の戻りアドレスが、スタック・アクセス回路70によって安全なスタックにプッシュされる。その後、本処理はステップ325に進み、そこで、分岐が、関数呼出しの目標である新しい関数に実行される。
【0060】
図5に示すハードウェア動作と同様に、関数呼出しの前に実行するソフトウェアはまた、レジスタからデータの状態保存を実行することができ、関数呼出しの後に実行するソフトウェアはまた、被発呼側レジスタからデータの状態保存を実行することができる。
【0061】
図6は、例外の発生時の処理回路の動作(割込みである例外の一例)を示す流れ図である。ステップ400で、リンク・レジスタは、ダミー例外戻りアドレスを選択するように設定され、一実施例では、選択することができる複数の異なるダミー例外戻りアドレスが存在する。一実施例で、起こり得るダミー例外戻りアドレスの各々は、プログラム・コードの有効なアドレスではないアドレスであることになる。ステップ400のさらなる詳細は、後で説明されることになる。その後、ステップ405で、発呼側の保存されたレジスタが、バックグラウンド処理ドメイン、すなわち、そこでバックグラウンド・コードが実行されていたドメイン、のスタックにプッシュされる。
【0062】
その後、ステップ408で、バックグラウンド処理が安全なドメイン内であったかどうかが判定され、そうでない場合、本処理はステップ432に直接進む。以下に記載のように、バックグラウンド処理が安全なドメイン内であったかどうかは、リンク・レジスタ65内に置かれた例外戻り値に基づいて判定され得る。バックグラウンド処理が安全なドメイン内であった場合、次いで、ステップ410で、現在実行しているコードが安全なドメインで実行されているかどうかが判定され、そうでない場合、本処理は再びステップ432に直接進む。しかし、現在実行しているコード(バックグラウンド処理でもよく、又は前の末尾連鎖式例外でもよい)が安全なドメインで実行されているとステップ410で判定された場合、次いで、ステップ412で、宛先がより安全性の低いドメイン内であるかどうか、すなわち、例外を処理するために必要とされる例外処理コードがより安全性の低いドメイン内で実行されることになるかどうかが、判定される。そうでない場合、次いで、再び、本処理はステップ432に直接進む。しかし、宛先がより安全性の低いドメイン内である場合、そのとき、これは、バックグラウンド処理が安全なドメイン内であった、安全なドメインからより安全性の低いドメインへの遷移が存在することになる状況を示す。したがって、本処理はステップ420に進み、そこで、被発呼側の保存されたレジスタがバックグラウンド・ドメインのスタックにプッシュされ、前述の所定の署名がスタック・フレームの下部に書き込まれる。バックグラウンド処理に関連するスタックは、リンク・レジスタ65内に置かれた例外戻り値から判定することができる。本ステップのさらなる詳細は、後から提供されることになる。
【0063】
ステップ430で、例外制御回路28は、すべてのレジスタがクリアされることを確実にする。一例で、すべてのレジスタが、ステップ430でクリアされ得る。一代替実施例では、レジスタがスタックにプッシュされるときにそれらのレジスタがクリアされることが可能であり、したがって、発呼側レジスタはステップ405の間にクリアすることができ、被発呼側レジスタはステップ420又は430の間にクリアすることができる。
【0064】
ステップ430に続いて、又はステップ408、410及び412でチェックされた条件のいずれも生じなかった場合、そのとき、本処理は、ステップ432に進む。例外入力が末尾連鎖式例外である場合、そのとき、リンク・レジスタ65は新しい例外戻り値で更新される。本ステップは、
図12Bに関して以下にさらに詳しく論じられることになる。
【0065】
ステップ435で、本処理は、例外処理ルーチンに分岐する。
【0066】
例外処理ルーチンは、次いで、被発呼側レジスタの状態保存を実行することができる。一実施例で、例外処理ルーチンは、たとえ被発呼側レジスタ内のデータがステップ420で既にスタックにプッシュされ、クリアされた場合でも(この場合、ハードウェアは、被発呼側レジスタからデータを安全なスタックに格納したことになり、一方、ソフトウェアは、より安全性の低いスタックに被発呼側レジスタからクリアされた値を格納することになる)、被発呼側レジスタの状態保存をいつも実行することができる。別法として、例外処理ルーチンは、被発呼側レジスタの状態保存が既に実行されたかどうかを検出することができ、そうである場合、被発呼側レジスタの状態保存を省略することができる。
【0067】
図7は、どのように分岐動作が処理されるかを示す流れ図である。そのような分岐動作は、正規の分岐処理動作、関数呼出し戻り及び例外戻りを含み得る。
図7は分岐動作について示されるが、代替実施例で、同様の機構は、命令フローでの変更を引き起こし得る任意の命令、たとえば、宛先レジスタとしてプログラム・カウンタを有するロード命令、との関連で使用され得る。
【0068】
ステップ500で、分岐動作によって指定された目標アドレスが予約されたアドレス範囲120内であるかどうかが判定され、この特定の実施例で、これは、目標アドレスが0xF0000000以上である場合に当てはまる。そうでない場合、そのとき、これは正規の分岐活動を示し、そして、本処理はステップ505に進み、そこで、正規の分岐処理が実行される。分岐動作の処理は当業者によく知られているので、正規の分岐処理のさらなる詳細は本明細書では提供されない。
【0069】
ステップ500で目標アドレスが予約されたアドレス範囲120内であると判定された場合、次いで、ステップ510で、目標アドレスがダミー関数呼出し戻りアドレスに対応するかどうかが判定される。1つの特定の実施例で、ダミー関数呼出し戻りアドレスは0xF7FFFFFFである。目標アドレスがダミー関数呼出し戻りアドレスに対応しない場合、次いで、ステップ515で、安全なスタック内のスタック・フレーム210の前述の所定の相対的位置が、安全なスタックから戻りアドレスを読み取るために、アクセスされる。その後、本処理はステップ500に戻り、そこで、関数呼出し戻りが前の関数呼出しから戻るために正しく使用されたとみなし、ステップ515で読み取られた戻りアドレスは、プログラム・コードの実アドレスであることになり、したがって、本処理は、ステップ505で正規の分岐処理に分岐することになる。しかし、そうではなくて関数呼出し戻りが、例外から戻るための機構として不正確に使用された場合、次いで、スタック・フレーム220がステップ515でアクセスされるときに、所定の署名222が、実際の戻りアドレスとして検索されることになる。そのアドレスが、次いで、ステップ500で分析されるとき、それが予約された範囲内であることが判定されることになるが、ステップ510で、そのアドレスがダミー関数呼出し戻りアドレスではないことが判定されることになる。本処理は、次いで、ステップ520に進み、そこで、アドレスが有効な例外戻りアドレスのうちの1つではないことが判定されることになり、それに応じて、本処理は、ステップ525に分岐することになり、そこで、障害が、関数呼出し戻りが不正確に使用されたことを識別するために、作成されることになる。
【0070】
例外戻りが指定される状況をここで考えると、そのとき、この例外戻りが、安全なドメインからより安全性の低いドメインへの遷移を引き起こす前の例外に関連する場合、これは、目標アドレスとしていくつかの異なる有効な例外戻りアドレスのうちの1つを識別することになり、それらの起こり得る例外戻りアドレスの各々は、予約された範囲120内にあり、所定の署名及びダミー関数呼出し戻りアドレスの両方と異なる。したがって、本処理は、ステップ500からステップ510に、そして、そこからステップ520に進むことになり、そこで、はい(yes)経路が、次いで、ステップ530まで辿られることになる。例外戻り処理ステップ530の詳細は、後で説明されることになる。現在の例外より低い又は同等の優先度の及びバックグラウンド処理より高い優先度の新しい例外が、この現在の例外が戻る時点で実行を待っている状況では、その場合、その新しいより優先度の低い例外が、末尾連鎖式例外として選ばれることになり(すなわち、その新しい例外が、現在の例外が選ばれるより前に起こっていたバックグラウンド処理に戻るより前に、現在の例外の完了に続いて直ちに処理されることになる)、そして、本処理は、
図7に示すように、
図6のステップ408に分岐して戻ることになる。
【0071】
ステップ530の例外戻り処理が実行され、さらなる末尾連鎖式例外が保留されていない後は、本処理はステップ535に進み、そこで、例外戻り処理ステップ530が、所定の署名がスタック・フレーム210内に記憶された処理状態内で予期されるべきであると指示したかどうかが判定される。前述のように、これは、例外が安全なドメインからより安全性の低いドメインへの遷移を引き起こし、バックグラウンド・コードが安全なドメインで実行された場合に、当てはまることになる。所定の署名が予期されない場合、次いで、本処理は、ステップ540に単に進み、そこで、関連レジスタ値がスタック・フレームから積み重ねを解除される。この処理は、
図13に関して後でより詳細に説明されることになる。
【0072】
しかし、ステップ535で、所定の署名が予期されると判定された場合、次いで、本処理はステップ545に進み、そこで、スタック・フレーム210の下部が読み取られ、検索された値が所定の署名と比較される。ステップ550で、マッチがあるかどうかが判定され、そうである場合、本処理はステップ540に進む。しかし、マッチが存在しない場合、次いで、本処理は、ステップ555に進み、そこで、例外戻りが関数呼出しから戻ろうとして不正確に使用されたことを示す、障害が作成される。具体的には、例外戻りが不正確に使用されて関数呼出しから戻ろうと試みた場合、ステップ545での安全なスタックの読取りは、所定の署名と一致しないことになる、戻りアドレス225が検索される結果をもたらすことになり、それによって、ステップ555で障害を作成させることになる。
【0073】
ステップ525又はステップ555で作成された障害が処理され得るいくつかの方法が存在する。一実施例で、処理回路は、いずれかの障害条件に応答して、安全なドメイン内で適切な障害処理プログラム・コードを実行する。障害処理プログラム・コードが安全なドメイン内で実行されることを確実にすることによって、これは、より安全性の低いドメインで攻撃者が制御を取り戻すこと、したがって攻撃を再試行することを防ぐ。
【0074】
攻撃の再試行を阻止するための代替機構として、データ処理装置は、いずれかの障害条件が識別された場合にスタック・ポインタ値が調整されないように、戻りの再生がまた同障害条件を識別させることになるように、構成され得る。したがって、スタック・ポインタを調整しないことによって、攻撃者は、安全なスタックの最後の位置を単に破壊することができず、次いで、安全なスタック内の異なる場所で入力するために、攻撃を再試行する。一実施例で、前述の機構の両方が、より安全性の低いドメインからの攻撃の再試行に対する頑強性を実現するために使用され得る。
【0075】
一実施例で、より安全性の低いドメインからの潜在的攻撃を引き起こし得るもう1つのシナリオは、安全なスタックの初期化に続いて生じる。この時点で、安全なスタックは、空であることになる。その時点で、実行されているプログラム・コードがより安全性の低いドメイン内である場合、プログラム・コードは、安全なドメインに戻ろうと試み得ることが起こり得る。安全なドメインからより安全性の低いドメインへ合法的に戻されることになる、元の遷移は存在しないので、そのような戻りは防がれるべきである。
図8A及び8Bは、そのような戻りが成功するのを防ぐために使用することができる機構を示す。
図8Aに示すように、安全なスタック600が初期化されるとき、所定の署名値602が、安全なスタックに記憶される(一実施例で、この値は、スタックが初期化されるときにソフトウェアによって記憶される)。この所定の署名値は、通常は、
図4Bを参照して前述された所定の署名222とは異なることになるが、やはりプログラム・コードの有効なアドレスに対応しない値であることになる。1つの特定の実施例で、所定の署名602は、値0xF05AEDA5を有する。
【0076】
図8Bに示すように、ソフトウェアがポイント605でより安全性の低いドメインで実行していて、次いで、ポイント610で、安全なドメインに戻ろうと試みる場合、障害チェック回路は、ポイント615で、安全なスタックから所定の署名値602を読み取り、それがプログラム・コードの有効なアドレスに対応しないと判定し、それに応じて、障害を作成することになる。その結果、より安全性の低いドメインからの戻りは、防がれることになる。
【0077】
具体的には、ポイント610での戻りが関数呼出し戻りである場合、ポイント615で生成される障害は、
図7のステップ525で作成された障害と同じであり、そして、同じ障害処理コードが、その障害に応答して使用され得る。したがって、その実施例で、障害チェック回路は、所定の署名602と前述の所定の署名222を区別する必要はない。そうではなくて、ポイント610での戻りが例外戻りである場合、そのとき、所定の署名値602が所定の署名値222とは異なるという事実は、
図7のステップ550でマッチが検出されないことになることを意味することになり、したがって、障害がステップ555で発生させられることになる。
【0078】
図7のステップ530に関して説明したように、1つの例外から戻るとき、第2の例外は、保留でもよく、第1の例外の前に実行されたバックグラウンド処理に戻る前に処理され得る。これは、末尾連鎖として知られる。
図9は、第1の例外に続いて、第2の及び第3の例外が、バックグラウンド処理に切り替えて戻る前に末尾連鎖式である、一例を示す。
【0079】
図4Bのスタック・フレーム220に示すように、バックグラウンド処理が安全なドメイン内であり、安全な処理からより安全性の低い状態の例外への遷移が存在する場合、そのとき、発呼側の保存されたレジスタ及び被発呼側の保存されたレジスタの両方が、例外制御回路28によって、安全なスタックにプッシュされる。しかし、通常は、安全なドメインで処理される例外は、発呼側の保存されたレジスタのみがスタックに保存されたことになることを予期することになり(
図4Bのスタック・フレーム215に示すように)、被発呼側の保存されたレジスタの保存は例外処理ルーチンに委ねられる。したがって、
図9に示すように、被発呼側レジスタの追加の状態保存が、第1の例外の入力時にポイント700で実行されたとき、次いで、ポイント705で安全なドメインで第2の例外に切り替わるときに、被発呼側の保存されたレジスタが、スタックからポップされて、末尾連鎖式の第2の例外が安全なドメインで処理されることが予期されるスタック・フレーム215を復元し得ることが起こり得る。
【0080】
しかし、より安全性の低いドメインで処理されることになる末尾連鎖式の第3の例外が生じた場合、安全なドメインからより安全性の低いドメインへの遷移は、被発呼側レジスタ内のデータがより安全性の低い処理から隠される必要があることを意味するので、次いで、ポイント710で、被発呼側レジスタは、スタックに再びプッシュされる必要がある。最後に、第3の例外が完了し、さらなる末尾連鎖式例外が存在しないとき、次いで、発呼側及び被発呼側の保存されたレジスタの両方が、
図9のポイント715でスタックからポップされる。
【0081】
図9は、末尾連鎖式例外の間で切り替えるときに実行されるいくつかの状態保存動作及び状態復元動作を示す。これらの動作は、時間を要し、したがって、入ってくる例外の処理を遅らせ、それにより処理パフォーマンスを下げる。したがって、これらの動作のうちのいくらかを回避することは有用である。本技法は、より安全性の低い例外から末尾連鎖式の安全な例外に切り替えるときに、被発呼側レジスタが安全なスタックからポップされることは必要ないことを認識する。被発呼側レジスタをスタックに残すことは、例外の処理に影響を及ぼさないので、これは受け入れ可能であり、すべての安全な被発呼側の保存された値は、そこで例外が処理されることになる安全なドメインからアクセスされることを許容される。したがって、被発呼側レジスタは、安全なドメインからより安全性の低いドメインへの遷移を引き起こす第1の例外に応答して、スタックに保存され得る。被発呼側レジスタの復元は、処理がより安全性の低い例外から安全な末尾連鎖式例外に切り替わるときに、省略することができる。安全なドメインからより安全性の低いドメインへの遷移を引き起こすさらなる例外について、ハードウェアによる被発呼側の保存されたレジスタの追加の状態保存は、省略することができる。
【0082】
図10は、例外に入るときにリンク・レジスタ内に記憶され得る例外戻り値の一例を示す。一実施例で、リンク・レジスタ65は、例外処理ルーチンが実行されている間中ずっと例外戻り値を保持する必要はなく、その代わりに、それは、最初にこの値に設定され、次いで、すぐ後にスタックに移動されてもよい。その例外が完了するとき、ソフトウェアは、そのアドレスが有効な命令アドレスではないのでCPUが特別な事象として見つける、例外戻り値によって指示されるアドレスに分岐する。一実施例で、前述のダミー関数呼出し戻りアドレスはまた、関数呼出しの発生時にリンク・レジスタ内に記憶され、同様の形で処理される。
【0083】
例外戻り値は、ハードウェアによる被発呼側の保存されたレジスタの保存が、安全なドメインからより安全性の低いドメインへの遷移を引き起こす例外に入るときに必要とされるかどうかを判定するための情報を含む。例外戻り値は、いくつかの異なる起こり得る値を有し、各々はアドレス空間の予約された領域120に対応し、ダミー関数戻りアドレスと前述の所定の署名222及び602とは異なる。例外戻りアドレスは、状態保存ステータス値フィールド720及びセキュリティ・フィールド725を含む。
【0084】
状態保存ステータス値フィールド720は、安全なドメインからより安全性の低いドメインへの遷移を引き起こす次の例外について、被発呼側の保存されたレジスタの追加の状態保存が必要とされるかどうかを指示する状態保存ステータス値SCRSを記憶する。
図10の例で、0の値は、追加の状態保存がスキップされ得ることを示し、一方、1の値は、追加の状態保存が必要とされることを示すが、ステータス値の他のマッピングもまた使用され得る。
【0085】
セキュリティ・フィールド725は、末尾連鎖式例外の現在の連鎖における最初の例外の前に実行されていたバックグラウンド処理がより安全性の低いドメイン内であったか安全なドメイン内であったかを指示するセキュリティ・ドメイン値Sを記憶する。末尾連鎖式例外の連鎖における各例外に入るときに、例外戻り値は、
図6のステップ432で新しい値に設定されることになる。例外戻り値を設定するとき、状態保存ステータス値フィールド720の値は、後で実行されることになる状態保存処理に影響を及ぼすように変更することができる。この方法で、情報が、1つの例外から別の例外に渡されて、追加の状態保存が例外間の次の遷移に必要とされるかどうかが指示され得る。これは、
図11から16を参照して説明されることになる。
【0086】
図11は、被発呼側の保存されたレジスタをプッシュするための及び安全なスタック36に所定の署名を書き込むための
図6のステップ420をより詳細に示す。この追加の状態保存は、例外戻り値の状態保存ステータス値フィールド720の値に依存する。ステップ750で、プロセッサが、例外戻り値の状態保存ステータス値フィールド720が0の値を有するかどうかを判定する。そうである場合、次いで、スタックへの被発呼側の保存されたレジスタのプッシュはスキップされ、本方法は
図6のステップ430を継続する。この場合、被発呼側の保存されたレジスタの状態保存は、これらのレジスタからのデータは、前の例外に応答してスタックに既に保存されていることになるので、必要ではないことになる。
【0087】
他方で、ステップ750で状態保存ステータス値が0の値を有さない場合、次いで、本方法はステップ755に進み、被発呼側の保存されたレジスタからのデータが安全なスタックにプッシュされる。被発呼側の保存されたレジスタはまた、それらの値がより安全性の低いドメインでのその後の処理にアクセスできないように、クリアされる。また、ステップ760で、所定の署名222がスタックの下部に書き込まれる。次いで、本方法は、
図6のステップ430に再び進む。したがって、
図11によれば、追加の状態保存が実行されるかどうかは、状態保存ステータス・フィールドの値を条件とする。
【0088】
図12Aは、バックグラウンド処理を実行する間に受信された最初の例外(末尾連鎖式例外の連鎖が存在する場合、これは本当に第1の例外である)についての
図6のステップ400での例外戻りレジスタの設定の一例を示す。ステップ770で、その中でプロセッサがバックグラウンド処理のために動作している現在のドメインが、判定される。現在のドメインが安全なドメインである場合、次いで、ステップ775で、セキュリティ・ドメイン・フィールド725が、安全なドメインを示すための1の値を有するように設定される。現在のドメインがより安全性の低いドメインである場合、次いで、ステップ780で、セキュリティ・ドメイン・フィールド725が、0の値に設定される。どのドメインが現在のドメインであるかに関わらず、ステップ790で、状態保存ステータス値フィールド720が、追加の状態保存がより安全性の低いドメインから安全なドメインへの次の遷移で必要とされ得ることを指示する1の値に初期化される。次いで、ステップ795で、例外戻り値が、リンク・レジスタ65に書き込まれ、状態保存ステータス値フィールド720及びセキュリティ・フィールド725は、前のステップで判定された値に設定される。本方法は、次いで、
図6のステップ405に戻って、例外入力処理を継続する。
【0089】
図12Bは、末尾連鎖式例外のための例外戻り値を設定するためのステップ432の一例をより詳細に示す。ステップ800で、本方法は、入力される例外が末尾連鎖式例外であるかどうかを判定する。そうでない場合、次いで、本方法は、
図6のステップ435に進んで、
図12Bの残りのステップを実行することなしに、例外処理ルーチンに分岐する。しかし、例外が末尾連鎖式例外である場合、次いで、ステップ802で、セキュリティ・ドメイン値S(連鎖で前の例外を終了させるために使用される
図10のEXC_RETURN値から)が1であるかどうかが判定される。そうでない場合、そのとき、S=0であり、本処理は、ステップ804に進んで状態保存ステータス値を1に設定する。バックグラウンド処理がより安全性が低かった場合(S=0によって示されるように)、追加の状態保存は実行されなかったことになる(
図6のステップ408は、追加の状態保存ステップ420を省略させたことになる)。状態保存ステータス値フィールド720は、この場合、状態保存に影響を及ぼさずに、状態保存ステータス値フィールド720からの情報をより安全性の低いドメインでの処理が取得することを防ぐことになり、ステップ804でそのフィールドを1のデフォルト値に設定することが最も安全である。
【0090】
他方で、ステップ802でセキュリティ・ドメイン値Sが1と等しい場合、次いで、本処理はステップ805に進み、そこで、新しい末尾連鎖式例外が安全なドメインで処理されようとしているかどうかが判定される。そうでない場合、次いで、再び、ステップ804で、状態保存ステータス値フィールド720が1に設定される。
【0091】
新しい例外が安全なドメインで処理されようとする場合、次いで、ステップ806で、現在の処理が安全なドメイン内かどうかが判定される。そうでない場合には、次いで、ステップ808で、状態保存ステータス値フィールド720が0に設定され、一方、現在の処理が安全である場合には、次いで、ステップ810で、状態保存ステータス値フィールド720は、それが前の例外について有したのと同じ値に設定される。ステップ812で、新しい例外戻り値がリンク・レジスタ65に書き込まれ、状態保存ステータス値フィールド720は、ステップ804、808又は810に従って設定される。本方法は、次いで、
図6のステップ435に進んで例外処理ルーチンに分岐する。
【0092】
図13は、レジスタの積み重ねを解除するための
図7のステップ540をより詳細に示す。例外処理の過去の履歴に応じて、スタックは、発呼側レジスタのみが復元される必要があるスタック・フレーム215、又は、発呼側の保存されたレジスタ及び被発呼側の保存されたレジスタの両方が復元される必要があるスタック・フレーム220のいずれかを含み得る。
図13は、プロセッサが、どのスタック・フレームがスタックに存在することになるかをどのように判定することができるかを示す。ステップ820で、現在の例外戻りがより安全性の低い例外から安全なバックグラウンド処理に切り替わっているかどうかが判定される。たとえば、セキュリティ・ドメイン・フィールド725が、バックグラウンド処理が安全か安全性が低いかを判定するために、使用され得る。処理が、より安全性の低い例外から安全なバックグラウンド処理に切り替わっていない場合、次いで、ステップ822で、本処理は、現在の例外戻りが安全な例外から安全なバックグラウンド処理に切り替わっていて、状態保存ステータス値フィールド720の値が0であるかどうかを判定する。ステップ820及び822で判定される条件のいずれも満たされない場合、次いで、ステップ824で、発呼側レジスタのみが、スタックから復元されたそれらの値を有する。しかし、ステップ820及び822でテストされた条件のいずれかが満たされる場合、次いで、ステップ826で、被発呼側の保存された値が、ステップ824で発呼側レジスタにデータを復元する前に被発呼側レジスタに復元される。したがって、本システムは、どのレジスタがそれらのレジスタ状態が復元されることを必要とするかを判定することができる。
【0093】
図14は、
図7の例外戻り処理ステップ530をより詳細に示す。ステップ830で、末尾連鎖式であるべき保留中の例外が存在するかどうかが判定される。その例外は、それの優先度が、完了したばかりの例外の優先度より低い又は同等であり、バックグラウンド処理の優先度より高い場合に、末尾連鎖式であるはずである。処理されるべき末尾連鎖式例外が存在する場合、次いで、本方法は、
図6のステップ408に戻って末尾連鎖式例外への入力を処理する。
【0094】
末尾連鎖式例外が存在しない場合、次いで、本方法は、ステップ840及び850に進み、そこで、(a)例外戻りがより安全性の低い例外から安全なバックグラウンド処理に切り替わっている、又は(b)例外戻りが安全な例外から安全なバックグラウンド処理に切り替わっていて状態保存ステータス値フィールドが0の値を有することのいずれかが判定される。これらの条件のいずれかが満たされる場合、次いで、ステップ860で、所定の署名222が予期されると判定される。これらの条件のいずれも満たされない場合、次いで、ステップ870で、所定の署名は予期されないと判定される。本方法は、次いで、
図7のステップ535に進み、そこで、処理が実行されて、例外戻りが不適切に使用されたかどうかが、所定の署名222が予期されるかどうかに基づいて、検出される。
図4Bのスタック・フレーム220に示すように、被発呼側の保存されたレジスタ値がスタックに存在するとき、その場合、所定の署名はまた予期されることになるので、ステップ840及び850は、
図13のステップ820及び822と同じ2つの条件をチェックすることに留意されたい。
【0095】
図15及び16は、
図9に示す不必要なスタック保存及び復元動作が、状態保存ステータス値を使用し、どのように回避され得るかの例を示す。
図15で、より安全性の低い例外がポイント900で生じるとき、バックグラウンド処理は安全なドメイン内である。
図12Aに示すように、セキュリティ・ドメイン値Sは、1に設定されて、バックグラウンド処理が安全なドメイン内であったことを指示し、状態保存ステータス値SCRSもまた1に設定される。第1の例外がポイント910で完了するとき、第1の例外と同等又はそれより低い優先度の及びバックグラウンド処理より高い優先度の保留の第2の例外が存在する。この例外は、それがバックグラウンド処理に戻る前に処理されるように、末尾連鎖式である。この時点で、被発呼側の保存されたレジスタの積み重ね解除は、スキップされる。第2の例外に切り替わるときに、バックグラウンド処理は安全なドメイン内であり(S=1)、宛先は安全であり、現在の処理はより安全性が低いので、状態保存ステータス値SCRSは、
図12Bのステップ808に示すように0に設定される。第2の例外がポイント920で処理を終了した後は、末尾連鎖式の第3の例外は保留され、より安全性の低いドメインで処理されることになる。状態保存ステータス値SCRSは0と等しいので、その場合、被発呼側の保存されたレジスタ状態はスタックに既に保存されてあるので、
図11のステップ750に従って、追加の状態保存は省略され得る。したがって、追加のスタック動作に関連する遅延は存在しないので、第3の例外は、より速く処理することができる。最後に、ポイント930で、本処理はバックグラウンドに戻り、
図13の本方法に従って、ステップ820での条件が満たされると判定され、そうして、被発呼側の保存されたレジスタ状態及び発呼側の保存されたレジスタ状態の両方がスタックからポップされ、対応するレジスタに復元される。
【0096】
図16は、追加のスタック保存動作が回避され得る、もう1つの例を示す。この場合、安全なバックグラウンド処理を実行する間に、安全なドメインで処理されることになる最初の例外がポイント1000で生じる。宛先はより安全性の低いドメインではないので、
図6のステップ412に従って、被発呼側の保存されたレジスタの保存は、省略されることになる。発呼側の保存されたレジスタ状態のみが、ポイント1000でハードウェアによってスタックにプッシュされる。状態保存ステータス値は、
図12Aに示すように、1に設定される。ポイント1005で、より安全性の低い第2の例外は、第1の例外に続く末尾連鎖式である。状態保存ステータス値SCRSが1と等しいとき、次いで、ポイント1005で、追加の状態保存が、
図11のステップ750及び755に従って実行され、そうして、被発呼側の保存されたレジスタ状態がスタックにプッシュされる。S=1であり、宛先は安全性がより低いので、次いで、
図12Bのステップ804で、状態保存ステータス値は、次の例外について1に設定される。ポイント1010で、より安全性の低い第2の例外から安全な第3の例外への末尾連鎖式遷移が生じ、被発呼側の保存されたレジスタの積み重ね解除はスキップされる。S=1であり、宛先は安全であり、現在の処理は安全性がより低いので、この時点で状態保存ステータス値SCRSは、
図12Bのステップ808に従って0に設定される。これは、状態保存ステータス値の値が0であるので、ポイント1015で次の末尾連鎖式例外で、被発呼側の保存されたレジスタのスタックがスキップされ得ることを意味する。
図16に示すように、たとえ最初の例外が、安全なドメインからより安全性の低いドメインへの切り替えを引き起こす遷移でなくても、安全なドメインからより安全性の低いドメインへの次の切り替えで実行される追加の状態保存は、一度実行することができ、その後の遷移で繰り返されないことになる。
【0097】
図14に示すように例外戻り値を設定するための機構は、例外がより安全性の低いドメインで処理されているときに、状態保存ステータス値SCRSは1の値を常に有することになり、一方で、安全な例外を処理するとき、状態保存ステータス値は、0又は1の変数値を有して、追加の状態保存が安全から安全性のより低いものへの次の遷移で必要とされることになるかどうかを指示することを意味することが、
図15及び16から理解されよう。より安全性の低いドメイン内にある間にその値を固定値の1に設定することは、より安全性の低いドメイン内のコードが、情報が例外処理の過去の履歴に関して推論されることを可能にし得る状態保存ステータス値からの任意の情報を取得することが可能になるのを防ぐので、これは有用である。これは、セキュリティを向上させる。
【0098】
また、より安全性の低いコードが状態保存ステータス値を改ざんし得る場合、これは、安全なドメイン内にある間のその後の状態保存動作に影響を及ぼすことがあり、セキュリティ侵害につながり得る。これを防ぐために、処理回路は、より安全性の低い例外から安全な例外への切り替え時に(たとえば、
図16のポイント1010)、状態保存ステータス値が、それがより安全性の低いドメインでの例外の入力時に設定された固定値をまだ有することを検出し、その値を変更した場合にエラーをトリガすることができる。別法として、エラーはトリガされ得ないが、安全なドメインに戻るときに、状態保存ステータス値は、より安全性の低いコードによる状態保存ステータス値フィールドの修正を無効にし、それが安全なドメイン内で有することになっている値にリセットされ得る。
【0099】
図17は、例外の先制の一例を示す。各例外は、優先度値に関連付けられ得る。より優先度の低い例外が実行されている間により高い優先度の例外が生じた場合、次いで、高い優先度の例外が、より優先度の低い例外に先制し、より優先度の低い例外を完了することなしに処理され得る。
図17は、優先度値のより大きな数値がより高い優先度を示す一例を示すが、より低い優先度値でより高い優先度を表すこと、たとえば優先度値の0が優先度値の1より高い優先度の例外を指示すること、もまた可能である。
【0100】
図17に示すように、先制が生じるとき、先制された例外は、次の例外のバックグラウンド処理として扱われ得る。たとえば、
図17のポイント1100で、バックグラウンド処理が、優先度値の1を有する第1の例外を処理するために、割り込まれる。ポイント1105で、第2の例外が、優先度値の4を有して生じる。これは現在の優先度レベルより高い優先度であるので、第2の例外が第1の例外に先制し、そのとき、第1の例外はバックグラウンド処理である。ポイント1110で第2の例外から戻るとき、状態復元が実行されて、第2の例外が生じた時点でバックグラウンド処理(すなわち、第1の例外)によって使用されていた状態を復元することになる。第1の例外がポイント1115で完了するとき、さらなる状態復元が実行されて、処理のために元のバックグラウンドによって使用された値を復元する。したがって、前の実施例で、「バックグラウンド処理」は、それ自体、より高い優先度の例外によって先制される例外の例外処理ルーチンに従って実行される処理でもよい。
【0101】
図18A及び18Bは、状態保存ステータス値が先制中に有用であり得る一例を示す。バックグラウンド処理が安全であり、より安全性の低い例外が生じた場合、次いで、前述のように発呼側の保存されたレジスタ及び被発呼側の保存されたレジスタの両方が、より安全性の低い例外ハンドラによる被発呼側レジスタ状態へのアクセスを防ぐために、スタックにプッシュされることになる。しかし、この状態保存動作が実行されている間により高い優先度の別の例外が生じ得ることが可能である。この場合、より高い優先度の例外が、最初のより安全性の低い例外を先制することになり、そうして、より安全性の低い例外は処理されないことになる。先制する例外が安全なドメインで処理されようとする場合、被発呼側の保存されたレジスタをスタックにプッシュすることは必要ではないことになる。
【0102】
図18Aは、発呼側の保存されたレジスタがスタックにプッシュされている間に、先制する例外が生じる、一例を示す。この場合、先制する例外は安全であるので、被発呼側レジスタの追加の状態保存を実行する必要はなく、したがって、発呼側レジスタのスタックが完了した後は、次いで、安全な例外の処理が開始し得る。これは、スタックに被発呼側レジスタ状態をプッシュすることによってもたらされる遅延を回避する。その後の末尾連鎖式のより安全性の低い例外が生じた場合、次いで、
図18Aに示すように、被発呼側レジスタ状態が、この時点でスタックにプッシュされ得る。
【0103】
他方で、
図18Bは、被発呼側レジスタが、最初のより安全性の低い例外の処理のために動作可能なスタックにプッシュされている間に、安全なドメイン内の先制する例外が生じる、一例を示す。この場合、被発呼側レジスタをプッシュし続けること、及び、被発呼側レジスタの状態保存が完了したときに安全な例外に切り替えることが、より効率的であり得る。これは、被発呼側レジスタの状態保存の停止、及び、既に完了した被発呼側レジスタのスタック動作の反転が、単にその状態保存を終了することよりも時間を要し得るからである。したがって、状態保存が完了された場合、遅延は少なくなることになる。被発呼側レジスタの保存が完了した場合、さらなる安全性の低い末尾連鎖式例外が生じるときに追加の状態保存がスキップされ得るように、状態保存ステータス値SCRSは、0にセットされて追加の状態保存が既に行われたことを指示することができる。したがって、状態保存ステータス値はまた、先制を処理するときにパフォーマンスの向上を可能にする。
【0104】
本願の主題は、同一出願人による同時係属の米国特許出願第13/368,419号及び英国特許出願第1217531.1号で論じられた主題に関連し、これらの文書の両方の全内容を参照によって本明細書に組み込む。
【0105】
特定の実施例が本明細書で説明されたが、本発明はそれらに限定されないこと、及び、それらへの多数の修正及び追加が本発明の範囲内で行われ得ることが理解されよう。たとえば、以下の従属請求項の特徴の様々な組合せが、本発明の範囲を逸脱することなしに独立請求項の特徴と行われ得る。