Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

SPARC システムの PROM

一部のプラットフォームには、オペレーティングシステムなしでデバイスのデバッグを行うためのサポートを提供する PROM モニターがあります。このセクションでは、SPARC システムで PROM を使してデバイスレジスタをマッピングし、それらのデバイスレジスタにアクセスできるようにする方法について説明します。通常、デバイスは、PROM コマンドを使って十分に動作テストを実行し、正しく動作するかどうかを判定できます。

x86 のブートサブシステムについては、boot(1M)のマニュアルページを参照してください。

PROM には、次のようないくつかの目的があります。

  • 電源を入れてから、またはハードリセットの PROM reset コマンドからシステムを起動する

  • メモリー、デバイスレジスタ、およびメモリーマッピングを調べたり設定したりする対話型のツールを提供する

  • Oracle Solaris システムのブート。

    単にコンピュータを拡張し、その PROM を使用してデバイスレジスタを調べようとしても、失敗することがあります。デバイスが正しく取り付けられていても、マッピングは Oracle Solaris OS 固有のものであり、Oracle Solaris カーネルがブートされるまではアクティブになりません。拡張時に、PROM は、キーボードなどの基本的なシステムデバイスだけをマッピングします。

  • sync コマンドを使用して、システムクラッシュダンプを実行する

Open Boot PROM 3

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 (前) を使用します。

Forth コマンド

Open Boot PROM では、Forth というプログラミング言語を使用します。Forth は、スタックベースの言語です。引数は、正しいコマンドを実行する前にスタック (ワードと呼ばれる) にプッシュする必要があります。結果はスタックに残ります。

数値をスタックに配置するには、その値を入力します。

ok 57
ok 68

上の 2 つの値をスタックに追加するには、+ 演算子を使用します。

ok +

結果はスタックに残ります。スタックは .s ワードで表示されます。

ok .s
bf

デフォルトの基数は 16 進数です。hexdecimal の各ワードを使用すると、基数を切り替えることができます。

ok decimal
ok .s
191

詳細は、Forth のユーザーガイドを参照してください。

PROM デバイスツリーの調査

コマンド pwdcd、および 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 から限定的にでもデバイスを操作できる場合は、ドライバもデバイスを操作できるはずです。

初期テスト用にデバイスを設定するには、次の手順を実行します。

  1. デバイスが存在する SBus スロット番号を判定します。

    この例では、cgsix デバイスはスロット 2 にあります。

  2. デバイスが使用する物理アドレス空間内のオフセットを判定します。

    使用されるオフセットは、デバイスに固有です。cgsix の例では、ビデオメモリーは 0x800000 のオフセットから始まっています。

  3. 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

デバイスにクエリーしようとするときは注意してください。マッピングが正しく設定されていない場合は、読み取りまたは書き込みを行おうとすると、エラーが発生することがあります。このようなケースを扱うときは、特殊なワードを指定します。たとえば、cprobewprobe、および 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