ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
一部のプラットフォームには、オペレーティングシステムなしでデバイスのデバッグを行うためのサポートを提供する PROM モニターがあります。このセクションでは、SPARC マシンで PROM を使してデバイスレジスタをマッピングし、それらのデバイスレジスタにアクセスできるようにする方法について説明します。通常、デバイスは、PROM コマンドを使って十分に動作テストを実行し、正しく動作するかどうかを判定できます。
x86 のブートサブシステムについては、boot(1M)のマニュアルページを参照してください。
PROM には、次のようないくつかの目的があります。
電源を入れてから、またはハードリセットの PROM reset コマンドからマシンを起動する
メモリー、デバイスレジスタ、およびメモリーマッピングを調べたり設定したりする対話型のツールを提供する
Oracle Solaris システムのブート。
単にコンピュータを拡張し、その PROM を使用してデバイスレジスタを調べようとしても、失敗することがあります。デバイスが正しく取り付けられていても、マッピングは Oracle Solaris OS 固有のものであり、Oracle Solaris カーネルがブートされるまではアクティブになりません。拡張時に、PROM は、キーボードなどの基本的なシステムデバイスだけをマッピングします。
sync コマンドを使用して、システムクラッシュダンプを実行する
Open Boot PROM の完全なドキュメントについては、『Open Boot PROM Toolkit User's Guide』およびmonitor(1M)のマニュアルページを参照してください。このセクションの例では、Sun4U アーキテクチャーを参照しています。ほかのアーキテクチャーでは、アクションの実行に別のコマンドが必要になることがあります。
注 - Open Boot PROM は現在、SBus または UPA/PCI を搭載した Sun マシンで使用されています。Open Boot PROM では、「ok」プロンプトを使用します。古いマシンでは、「n」を入力して「ok」プロンプトを表示する必要が生じる場合があります。
PROM がセキュアモード (security-mode パラメータがなしに設定されていない) になっている場合、PROM パスワードを要求されることがあります (security-password パラメータで設定)。
printenv コマンドは、すべてのパラメータとその値を表示します。
ヘルプは、help コマンドで利用できます。
EMACS スタイルのコマンド行履歴を利用できます。履歴リストをたどるときは、Control + N (次) および Control + P (前) を使用します。
Open Boot PROM では、Forth というプログラミング言語を使用します。Forth は、スタックベースの言語です。引数は、正しいコマンドを実行する前にスタック (ワードと呼ばれる) にプッシュする必要があります。結果はスタックに残ります。
数値をスタックに配置するには、その値を入力します。
ok 57 ok 68
上の 2 つの値をスタックに追加するには、+ 演算子を使用します。
ok +
結果はスタックに残ります。スタックは .s ワードで表示されます。
ok .s bf
デフォルトの基数は 16 進数です。hex と decimal の各ワードを使用すると、基数を切り替えることができます。
ok decimal ok .s 191
詳細は、Forth のユーザーガイドを参照してください。
コマンド pwd、cd、および ls は、PROM デバイスツリーを調べてデバイスに到達します。pwd が機能する前にツリー内の位置を確立するには、cd コマンドを使用する必要があります。次の例は、SBus で cgsix フレームバッファーを使用する Ultra 1 ワークステーションのものです。
ok cd /
ツリー内の現在のノードに接続されているデバイスを表示するには、ls を使用します。
ok ls f006a064 SUNW,UltraSPARC@0,0 f00598b0 sbus@1f,0 f00592dc counter-timer@1f,3c00 f004eec8 virtual-memory f004e8e8 memory@0,0 f002ca28 aliases f002c9b8 options f002c880 openprom f002c814 chosen f002c7a4 packages
完全なノード名を使用できます。
ok cd sbus@1f,0 ok ls f006a4e4 cgsix@2,0 f0068194 SUNW,bpp@e,c800000 f0065370 ledma@e,8400010 f006120c espdma@e,8400000 f005a448 SUNW,pll@f,1304000 f005a394 sc@f,1300000 f005a24c zs@f,1000000 f005a174 zs@f,1100000 f005a0c0 eeprom@f,1200000 f0059f8c SUNW,fdtwo@f,1400000 f0059ec4 flashprom@f,0 f0059e34 auxio@f,1900000 f0059d28 SUNW,CS4231@d,c000000
前の例で完全なノード名を使用する代わりに、省略名を使用することもできます。省略したコマンド行エントリは、次の例のようになります。
ok cd sbus
この名前は、実際には device@slot,offset (SBus デバイスの場合) です。cgsix デバイスはスロット 2 にあり、オフセット 0 から始まります。SBus デバイスがこのツリーに表示される場合、そのデバイスは PROM に認識されています。
.properties コマンドは、デバイスの PROM プロパティーを表示します。これらのプロパティーを調べることで、デバイスがエクスポートするプロパティーを判定できます。この情報は、あとでドライバが正しいハードウェアプロパティーを検索していることを確認するときに役立ちます。これらのプロパティーは、ddi_getprop(9F) で取得できるプロパティーと同じです。
ok cd cgsix ok .properties character-set ISO8859-1 intr 00000005 00000000 interrupts 00000005 reg 00000002 00000000 01000000 dblbuf 00 00 00 00 vmsize 00 00 00 01 ...
reg プロパティーは、次のフィールドを含むレジスタ記述構造体の配列を定義します。
uint_t bustype; /* cookie for related bus type*/ uint_t addr; /* address of reg relative to bus */ uint_t size; /* size of this register set */
cgsix の例の場合、アドレスは 0 です。
デバイスは、テストするメモリーにマッピングする必要があります。次に、PROM を使用して、データ転送コマンドを使用し、バイト、ワード、およびロングワードを転送することで、デバイスの適切な動作を確認できます。PROM から限定的にでもデバイスを操作できる場合は、ドライバもデバイスを操作できるはずです。
初期テスト用にデバイスを設定するには、次の手順を実行します。
デバイスが存在する SBus スロット番号を判定します。
この例では、cgsix デバイスはスロット 2 にあります。
デバイスが使用する物理アドレス空間内のオフセットを判定します。
使用されるオフセットは、デバイスに固有です。cgsix の例では、ビデオメモリーは 0x800000 のオフセットから始まっています。
Sbus デバイスを選択するには、select-dev ワードを使用し、デバイスを内部にマッピングするには、map-in ワードを使用します。
select-dev ワードは、デバイスパスの文字列をその引数と見なします。map-in ワードは、オフセット、スロット番号、およびサイズを、マッピングする引数と見なします。オフセットと同様、バイト転送のサイズはデバイスに固有です。cgsix の例では、サイズは 0x100000 バイトに設定されています。
次のコード例では、Sbus のパスが select-dev ワードの引数として表示されており、フレームバッファーのオフセット、スロット番号、およびサイズの値が map-in ワードの引数として表示されています。select-dev 引数内の開始引用符と / の間の空白に注意してください。使用する仮想アドレスは、スタックの上位に残っています。スタックは .s ワードを使って表示されます。スタックには、constant 処理で名前を割り当てることができます。
ok " sbus@1f,0" select-dev ok 800000 2 100000 map-in ok .s ffe98000 ok constant fb
PROM には、8 ビット、16 ビット、および 32 ビットのさまざまな処理が用意されています。一般に、c (文字) 接頭辞は 8 ビット (1 バイト) の処理、w (ワード) 接頭辞は 16 ビット (2 バイト) の処理、L (ロングワード) 接頭辞は 32 ビット (4 バイト) の処理を示します。
接頭辞 ! は、書き込み処理を示します。書き込み処理では、スタックの最初の 2 つの項目を使用します。最初の項目はアドレスで、2 番目の項目は値です。
ok 55 ffe98000 c!
接頭辞 @ は、読み取り処理を示します。読み取り処理では、スタックのアドレスを使用します。
ok ffe98000 c@ ok .s 55
接頭辞 ? は、スタックに影響を与えないように値を表示するときに使用します。
ok ffe98000 c? 55
デバイスにクエリーしようとするときは注意してください。マッピングが正しく設定されていない場合は、読み取りまたは書き込みを行おうとすると、エラーが発生することがあります。このようなケースを扱うときは、特殊なワードを指定します。たとえば、cprobe、wprobe、および lprobe は、指定されたアドレスから読み取りますが、その場所から応答がない場合はゼロを返し、応答がある場合はゼロ以外を返します。
ok fffa4000 c@ Data Access Error ok fffa4000 cprobe ok .s0 ok ffe98000 cprobe ok .s 0 ffffffffffffffff
メモリーの領域は、dump ワードで表示できます。このワードではアドレスと長さを使用し、メモリー領域の内容をバイト単位で表示します。
次の例では、fill ワードを使用してビデオメモリーをパターンで埋めます。fill では、アドレス、埋めるバイト数、および使用するバイトを使います。ワードおよびロングワードの場合は、wfill および Lfill を使用します。次の fill の例では、cgsix によって、渡されたバイトに基づいて単純なパターンが表示されます。
ok " /sbus" select-dev ok 800000 2 100000 map-in ok constant fb ok fb 10000 ff fill ok fb 20000 0 fill ok fb 18000 55 fill ok fb 15000 3 fill ok fb 10000 5 fillok fb 5000 f9 fill