この節では、th_define(1M) コマンドと th_manage(1M) コマンドを使用して、障害を作成し投入する方法を説明します。
th_define(1M) ユーティリティは、errdef を定義するための、bofi デバイスドライバへのインタフェースを提供します。1 つの errdef が、デバイスドライバのハードウェアへのアクセスを破壊する方法に関する 1 つの仕様に対応しています。th_define のコマンド行引数によって、投入する障害の正確な種類を指定します。指定した引数によって矛盾のない errdef が定義される場合は、th_define プロセスは bofi ドライバに errdef を格納します。errdef で定められている基準に達するまで、プロセスは停止状態になります。実際には、アクセスカウントがゼロ (0) になると、停止状態が終了します。
テストハーネスはデータアクセスのレベルで動作します。データアクセスには次のような特性があります。
アクセスしているハードウェアの種類 (ドライバ名)
アクセスしているハードウェアのインスタンス (ドライバインスタンス)
テストを行っているレジスタセット
目標となるレジスタセットのサブセット
転送の方向 (読み取りまたは書き込み)
アクセスの種類 (PIO または DMA)
テストハーネスはデータのアクセスを横取りし、該当する障害をドライバに投入します。th_define(1M)コマンドで指定された errdef によって、次の情報がエンコードされます。
テストを行っているドライバインスタンスとレジスタセット(-n name、 -i instance、および -r reg_number)
破壊の対象となるレジスタセットのサブセット。レジスタセット内のオフセットとそのオフセットからの長さを指定することで、このサブセットを指定します (-l offset [len])
横取りするアクセスの種類: log、pio、dma、pio_r、pio_w、dma_r、dma_w、intr (-a acc_types)
障害が発生するアクセスの数 (-c count [failcount])
該当するアクセスに適用する破壊の種類 (-o operator [operand]):
データを固定値に置き換える (EQUAL)
データをビットごとに操作する (AND、OR、XOR)
転送を無視する (ホストから I/O へのアクセス NO_TRANSFER)
割り込みを失う、遅らせる、または偽の割り込みを投入する (LOSE、DELAY、EXTRA)
-a acc_chk オプションを使用すると、errdef でフレームワーク障害をシミュレートできます。
障害を投入するプロセスには、次の 2 つの段階があります。
th_define コマンドを使用して errdef を作成します。
テストの定義を bofi ドライバに渡して、errdef を作成します。bofi ドライバは定義を保持するので、th_manage(1M) を使用して定義にアクセスできます。
作業負荷を作成し、th_manage を使用して errdef を起動し管理します。
th_manage(1M) コマンドは、bofi ハーネスドライバが認知するさまざまな ioctl に対するユーザーインタフェースです。th_manage はドライバ名とインスタンスのレベルで動作します。th_manage には、アクセスハンドルを一覧表示する get_handles、errdef を起動する start、errdef を中止する stop などのコマンドがあります。
errdef を起動すると、対象となるデータのアクセスに障害が発生します。th_manage ユーティリティでは、errdef の現在の状態を表示する broadcast や errdef をクリアする clear_errors などのコマンドがサポートされています。
詳細は、th_define(1M) および th_manage(1M) のマニュアルページを参照してください。
テストハーネスは、警告メッセージを次の方法で処理するように設定できます。
警告メッセージをコンソールに書き込む
警告メッセージをコンソールに書き込んでから、システムをパニック状態にする
2 つめの方法を取ると、問題の根本原因を突き止めやすくなります。
bofi-range-check 属性値を warn に設定すると、ドライバによる DDI 関数の範囲違反をハーネスが検出したときに、次のメッセージが出力されます(panic に設定されている場合はパニック状態になります)。
ddi_getX() out of range addr %x not in %x ddi_putX() out of range addr %x not in %x ddi_rep_getX() out of range addr %x not in %x ddi_rep_putX() out of range addr %x not in %x |
X は 8、16、32、または 64 です。
ハーネスが 1000 を超える割り込みを挿入するように要求された場合には、ドライバが割り込みジャバーを検出しなかった場合に、次のメッセージが出力されます。
undetected interrupt jabber - %s %d |