Apr 6, 1999 frc7v-cl1: Server Solaris 2.6、cc ドライバのテスト --- クライアントシステム上での cc ドライバのデバッグ#01(その20) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/onl8v1-sol2.6-serv/ Cli1-CAMAC/debug-step20.txt) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). 株式会社ロジックハウスの白田様より SPARC CPU-8VT と、VMEドライバ v2.3.1 を借用した。 (B). 株式会社ロジックハウスの白田様より Server Solaris 2.6 のシステム がインストールされているハードディスクを借用した。 (C). 借用したハードディスクのサーバ側のシステム設定を変更して、KEK の FP クラスタ上で立ち上げた。 (D). ファイルを直接修正する方法で、クライアント(その1)側のシステム 設定を変更したがクライアントは立ち上がれなかった。 (E). Solsticeを起動してホストマネージャを使って、frc7v-cl1ディスクレス クライアントの設定をやり直した。 (F). ディスクレス・クライアントのシステム、frc7v-cl1 が起動できること を確認した。 (G). frc7v-cl1 のシステムにVMEドライバ、FRCvme-2.3.1 をインストールし、 その後、frc7v-cl1 のシステム設定をやり直した。 (H). Solsticeを起動してホストマネージャを使って、frc7v-cl2ディスクレス クライアントの設定をやり直した。 (I). ディスクレス・クライアントのシステム、frc7v-cl2 が起動できること を確認した。 (J). frc7v-cl1、クライアントのシステムに ccドライバをインストールした。 (K). frc7v-cl1、クライアントのシステム上でサンプル・プログラムを実行 シングルアクションの 24ビットread/write は ok. LAM割り込み処理は、ok. ブロック転送 read/write は NG. (L). CPU-7Vのボードで FRCvme2.3.1 が正しく動作できることを確認した。 (M). frc8vt、サーバ・システムに ccドライバをインストールした。 (N). frc8vt、サーバ・システム上でンプル・プログラムを実行 シングルアクションの 24ビットread/write は ok. LAM割り込み処理は、ok. ブロック転送 read/write は 16 および 24ビットとも、ok. (O). 株式会社ロジックハウスの高橋様の修正された ccドライバを実行したが 状況に変化はなかった。 (P). 株式会社ロジックハウスの白田様の提案より、デスクレス・クライアント のシステムにローカル・ディスクをつなぎ、マウントした後で ccドライバ を実行したが状況に変化はなかった。 (Q). cam2 プログラムを実行すると、 cc.cプログラム中のどの命令を実行 した時にパニックを起こすのか調べた。 (R). 株式会社ロジックハウスの高橋様の提案より、savecore について調べる。 savecoreコマンドにより、vmcore.x および unix.x ファイルを入手した。 (S). ドライバ・プログラムが DMA完了の待ち状態のままになっているのを 確認 (T). cam2プログラムを frc8vt、frc7v-cl1上で実行して結果を調べた。    frc8vt上での実行: (1). cv_wait_sig()コールが入っていると、そこで待ち状態が続く。 (2). cv_wait_sig()コールが入っていないと、正常終了する。    frc7v-cl1上での実行: (1). cv_wait_sig()コールが入っていると、そこで待ち状態が続く。 (U). cv_wait_sig() を while文でループさせることで、シグナルを受け取れた (V). DMA 開始前に以前の割り込み信号が残って影響を与えていないことを 確認した。 (W). バーチャル・アドレス・スペースの割り当てを追加して動作させてみたが 症状は変わらない。 (X). cc->bp へのアクセスを camac_b()ルーチンでやらないようにしてみたが 症状は変わらない。 (Y). Soft State Managementルーチンを使ってみたが症状は変わらない。 (Z). minphys のバッファサイズを大きくして試してみたが症状は変わらない。 (2-A). camac_b()を呼び出す箇所で渡す値をチェックしたが症状は変わらない。 (2-B). クラッシュダンプのチェック。 physio()でエラー。 (2-C). cc_strategy()ルーチンをチェック。 physio()でエラー。 (2-D). cc_strategy()ルーチンのcv_wait() を mutexロックした。変化なし。 (2-E). クラッシュダンプのチェック。 camac_b+0x2d0アドレスでエラー。 0xf60b5080?i camac_b+0x2d0: ld [%l0], %l1 $q (2-F). cc_device構造体へ cc_sys_statusを付加して調べた。 変化なし。 (2). ここでやるべきこと cc->cc_sys_status = bp->b_error; の行をcc_intr()ルーチンへ持って いって動作させる。 (3). cc->cc_sys_status = bp->b_error; の行をcc_intr()ルーチンへ持って いって動作させる 高橋さんからのメール ---ここから bp->b_errorのところですが、弊社のドライバーにて read()ルーチンに同じような行を入れてやってみましたが、 全く同じ問題が発生しました。 また、起きたのはディスクレスだけでスタンドアローンでは起きませんでした。 <変更したルーチン> /* xxread() */ static int pvme311_read(dev_t dev,struct uio *uiop,cred_t *credp) { register pvme311device *pvme311; minor_t unit; int rc,err; unit = getminor(dev); pvme311 = ddi_get_soft_state(pvme311_state,unit); #ifdef PVME311_DEBUG cmn_err(CE_NOTE,"pvme311_read called"); #endif mutex_enter(&pvme311->mutex); pvme311->pv_flag |= PVME311_READ | PVME311_BUSY; mutex_exit(&pvme311->mutex); rc = pvme311_start(unit); if(rc != 0){ #ifdef PVME311_DEBUG1 cmn_err(CE_NOTE,"pvme311_read(): pvme311_start failed"); cmn_err(CE_NOTE,"pvme311_read rc=%d",rc); #endif return(rc); } #ifdef PVME311_DEBUG3 cmn_err(CE_NOTE,"pvme311_read uio->uiov->iov_len=0x%x",uiop->uio_iov->iov_ba se); cmn_err(CE_NOTE,"pvme311_read uio->uiov->iov_len=0x%x",uiop->uio_iov->iov_le n); #endif uiop->uio_iov->iov_len *= 2; rc = physio(pvme311_strategy,NULL,dev,B_READ,pvme311_minphys,uiop); err = pvme311->bp->b_error; <--- ここでphysio()の後にbp->b_errorを読み 込む cmn_err(CE_NOTE,"pvme311_read err=%d",err); if(rc != 0){ #ifdef PVME311_DEBUG1 cmn_err(CE_NOTE,"pvme311_read(): pvme311_strategy failed"); cmn_err(CE_NOTE,"pvme311_read rc=%d",rc); #endif return(rc); } return(rc); } <パニック後、kadbにて確認した結果> BAD TRAP: type=9 rp=fbfc09bc addr=f5fd4f5c mmu_fsr=326 rw=1 dlytrg_test: Data fault kernel read fault at addr=0xf5fd4f5c, pme=0x0 MMU sfsr=326: Invalid Address on supv data fetch at level 3 pte addr = 0xf5c0e550, level = 3 wrong ctx/as ctx 0, as 0xf5914830 wrong ctx/as 2 ctx 0, as 0x70 pid=329, pc=0xf5d45068, sp=0xfbfc0a08, psr=0x44010c1, context=0 g1-g7: f5900000, f026f0bc, a00, c00, 200, 1, f5ebd360 Begin traceback... sp = fbfc0a08 Called from f00bbac4, fp=fbfc0a88, args=f00000 fbfc0af0 f5970488 f5d46d10 f5f7acf8 ffffffff Called from f0068900, fp=fbfc0b80, args=3 100000 100000 1 f5f46d60 100000 Called from 109d0, fp=effffd80, args=1 10 effffdf0 21cf4 0 0 End traceback... panic: Data fault stopped at Syslimit+0x1028: ta 0x7d kadb[0]: $c Syslimit() + 1028 debug_enter(0x0,0x4401ce4,0x0,0x44010e4,0x0,0xf5bea06c) + c0 do_panic(0xf0269878,0xfbfc086c,0x0,0x48010e4,0x0,0x0) + 94 vcmn_err(0x3,0xf0269878,0xfbfc086c,0x3,0xffeec000,0x0) + 180 cmn_err(0x3,0xf0269878,0xfbfc1,0x53,0x53,0xf025e400) + 1c die(0x9,0xfbfc09bc,0xf5fd4f5c,0x326,0x1,0xf0269878) + bc trap(0xf0000000,0xfbfc09bc,0x0,0x6,0x1,0xf5f42468) + 930 fault(0xf5fd4f08,0xf028a47c,0x8000,0x40,0xf5914830,0xfbfc0af0) + 84 pvme311_read(0xf00000,0xfbfc0af0,0xf5970488,0xf5d46d10,0xf5f7acf8,0xffffffff ) +d4 read(0x3) + 274 kadb[0]: 0xfbfc09bc$b_errorの箇所を、camac_b()ルーチンに 入れると問題が発生するようです。 以前にbp_mapin()を追加して行った際にも気になっていたのですが どうやら、biodone(bp)を呼び出してbufを使用済みにした後に、bp->b_error へアクセスを 行ったのが問題のようです。 しかし、スタンドアローンで起きないのは未だ分かりません??? 何か、OSに潜んでいるバグの可能性も考えられると思います。 弊社のドライバにてbp->b_errorの箇所をintr()ルーチンへ持っていって 確認したところ大丈夫でした。 cc->cc_sys_status = bp->b_error; の行をcc_intr()ルーチンへ持っていって 動作確認を宜しくお願い致します。 : ---ここまで cc.cファイルの修正 frc7v-cl1[51]% ls -l total 240 -rw-r--r-- 1 inoue staff 109798 Apr 6 10:52 t69r.dat frc7v-cl1[52]% uudecode t69r.dat frc7v-cl1[53]% ls -l total 386 -rw-rw-rw- 1 inoue staff 74752 Apr 6 1999 cc.tar -rw-r--r-- 1 inoue staff 109798 Apr 6 10:52 t69r.dat frc7v-cl1[54]% tar xvf cc.tar x cc.c, 73164 bytes, 143 tape blocks frc7v-cl1[55]% ls -l total 530 -rw-r--r-- 1 inoue staff 73164 Apr 5 20:45 cc.c -rw-rw-rw- 1 inoue staff 74752 Apr 6 1999 cc.tar -rw-r--r-- 1 inoue staff 109798 Apr 6 10:52 t69r.dat frc7v-cl1[56]% mv ../../cc.c ../../cc.c-Apr-6-1999 frc7v-cl1[57]% cp cc.c ../.. frc7v-cl1[58]% cd ../.. /export/home/frc7v-cl1/inoue/CAMAC/Driver/FORCE-5V-sol2.5 frc7v-cl1[59]% ls Makefile camlib.c cc.c-org forlib.o README camlib.h cc.conf k2917.h cam1* camlib.o cc.h ktaka/ cam1.c cc cc.h-Apr-5-1999 libcamac.a cam2* cc.c cc.h-org out cam2.f cc.c-Apr-5-1999 cc.new.c* out1 cam2.nm cc.c-Apr-6-1999* cc_common.h out2 cam3* cc.c-bak/ cc_config.h script/ cam3.c cc.c-debug* forlib.c frc7v-cl1[60]% diff cc.c-Apr-6-1999 cc.c 107c107 < int cc_sys_status; /* temporally system status storage */ --- > int cc_sys_status; /* temporally system status storage */ 864a865 > cc->cc_sys_status = cc->bp->b_error; 924a926 > cc->cc_sys_status = cc->bp->b_error; 2846c2848 < cc->cc_sys_status = cc->bp->b_error; --- > /* cc->cc_sys_status = cc->bp->b_error; */ frc7v-cl1[61]% cc.cファイルをコンパイルする。 frc7v-cl1[63]% make ./script/cc_build.sh [Building for sun4m] rm -f cc.o frc7v-cl1[64]% cc および cc.confファイルをコピーし直す。 frc8vt# pwd /usr/kernel/drv frc8vt# ls -l cc* -rwxr-xr-x 1 root sys 60832 Apr 5 14:45 cc* -rwxr-xr-x 1 root sys 288 Apr 5 14:45 cc.conf* frc8vt# rcp frc7v-cl1:/export/home/frc7v-cl1/inoue/CAMAC/Driver/FORCE-5V-sol2.5/cc . frc8vt# rcp frc7v-cl1:/export/home/frc7v-cl1/inoue/CAMAC/Driver/FORCE-5V-sol2.5/cc.conf . frc8vt# ls -l cc* -rwxr-xr-x 1 root sys 60856 Apr 6 11:29 cc* -rwxr-xr-x 1 root sys 288 Apr 6 11:29 cc.conf* frc8vt# ccドライバをロードし直す。 frc7v-cl1# make unload ./script/cc_unload.sh [Removing CAMAC device driver] [Removing CAMAC device driver from system] [Deleting CAMAC device files] frc7v-cl1# make load ./script/cc_load.sh [Installing CAMAC device driver] cp: cannot create /usr/kernel/drv/cc: Read-only file system cp: cannot create /usr/kernel/drv/cc.conf: Read-only file system [Adding CAMAC device driver to system] [Configuring CAMAC device driver] [Making CAMAC device files] frc7v-cl1# cam2プログラムを実行する。 frc7v-cl1[54]% cam2 Input transfer mode (1:word 2:long word) >1 Input loop >5 Input mode (0:QSTOP 1:QIGNORE 2:QREPEAT 3:QSCAN) >1 Input data counts >5 Input n a f >3 0 0 MODE=1 N= 3 A= 0 F= 0 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 0 0x 0(Hex) Data( 2)= 0 0x 0(Hex) Data( 3)= 0 0x 0(Hex) Data( 4)= 0 0x 0(Hex) Data( 5)= 0 0x 0(Hex) Data( 6)= 0 0x 0(Hex) Data( 7)= 0 0x 0(Hex) Data( 8)= 0 0x 0(Hex) Data( 9)= 0 0x 0(Hex) Data(10)= 0 0x 0(Hex) Input n a f >3 0 16 Input data >555 MODE=1 N= 3 A= 0 F=16 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 555 0x 22B(Hex) Data( 2)= 555 0x 22B(Hex) Data( 3)= 555 0x 22B(Hex) Data( 4)= 555 0x 22B(Hex) Data( 5)= 555 0x 22B(Hex) Data( 6)= 0 0x 0(Hex) Data( 7)= 0 0x 0(Hex) Data( 8)= 0 0x 0(Hex) Data( 9)= 0 0x 0(Hex) Data(10)= 0 0x 0(Hex) Input n a f >3 0 0 MODE=1 N= 3 A= 0 F= 0 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 555 0x 22B(Hex) Data( 2)= 555 0x 22B(Hex) Data( 3)= 555 0x 22B(Hex) Data( 4)= 555 0x 22B(Hex) Data( 5)= 555 0x 22B(Hex) Data( 6)= 0 0x 0(Hex) Data( 7)= 0 0x 0(Hex) Data( 8)= 0 0x 0(Hex) Data( 9)= 0 0x 0(Hex) Data(10)= 0 0x 0(Hex) Input n a f >3 0 16 Input data >0 MODE=1 N= 3 A= 0 F=16 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 0 0x 0(Hex) Data( 2)= 0 0x 0(Hex) Data( 3)= 0 0x 0(Hex) Data( 4)= 0 0x 0(Hex) Data( 5)= 0 0x 0(Hex) Data( 6)= 0 0x 0(Hex) Data( 7)= 0 0x 0(Hex) Data( 8)= 0 0x 0(Hex) Data( 9)= 0 0x 0(Hex) Data(10)= 0 0x 0(Hex) Input n a f >3 0 0 MODE=1 N= 3 A= 0 F= 0 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 0 0x 0(Hex) Data( 2)= 0 0x 0(Hex) Data( 3)= 0 0x 0(Hex) Data( 4)= 0 0x 0(Hex) Data( 5)= 0 0x 0(Hex) Data( 6)= 0 0x 0(Hex) Data( 7)= 0 0x 0(Hex) Data( 8)= 0 0x 0(Hex) Data( 9)= 0 0x 0(Hex) Data(10)= 0 0x 0(Hex) frc7v-cl1[55]% ok. 正常に実行できた。 この時のコンソール上のメッセージは次の通り。 NOTICE: camac_b: debug step01. --- enter camac_b() NOTICE: in: 0x3f53c0 10 1 34 0 0 NOTICE: camac_b: debug step02. --- call physio() NOTICE: cc_strategy: debug step03. --- enter cc_strategy() NOTICE: cc_strategy: debug step04. --- found the camac read NOTICE: cc_strategy: debug step04-1. --- dma_addr = 0x3c0 NOTICE: count in 32bit=10 NOTICE: cc_strategy: debug step05. --- start DMA NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xe NOTICE: cc_intr: debug step06b. --- cc->executing_dma_flag != 0 NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_strategy: debug step07. --- return DMA NOTICE: camac_b: debug step08. --- cc_sys_status = 0x0 NOTICE: out: 1 0 24 0 10 NOTICE: camac_b: debug step09. --- return NOTICE: camac_b: debug step01. --- enter camac_b() NOTICE: in: 0x3f53c0 10 1 34 0 0 NOTICE: cc_strategy: debug step03. --- enter cc_strategy() NOTICE: cc_strategy: debug step04-1. --- dma_addr = 0x3c0 NOTICE: count in 32bit=10 NOTICE: cc_strategy: debug step05. --- start DMA NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xe NOTICE: cc_intr: debug step06b. --- cc->executing_dma_flag != 0 NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_strategy: debug step07. --- return DMA NOTICE: camac_b: debug step08. --- cc_sys_status = 0x0 NOTICE: out: 1 0 24 0 10 NOTICE: camac_b: debug step09. --- return NOTICE: camac_b: debug step01. --- enter camac_b() NOTICE: in: 0x3f53c0 10 1 34 0 0 NOTICE: camac_b: debug step02. --- call physio() NOTICE: cc_strategy: debug step03. --- enter cc_strategy() NOTICE: cc_strategy: debug step04. --- found the camac read NOTICE: cc_strategy: debug step04-1. --- dma_addr = 0x3c0 NOTICE: count in 32bit=10 NOTICE: cc_strategy: debug step05. --- start DMA NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xe NOTICE: cc_intr: debug step06b. --- cc->executing_dma_flag != 0 NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_strategy: debug step07. --- return DMA NOTICE: camac_b: debug step08. --- cc_sys_status = 0x0 NOTICE: out: 1 0 24 0 10 NOTICE: camac_b: debug step09. --- return NOTICE: camac_b: debug step01. --- enter camac_b() NOTICE: in: 0x3f53c0 10 1 34 0 0 NOTICE: cc_strategy: debug step03. --- enter cc_strategy() NOTICE: cc_strategy: debug step04-1. --- dma_addr = 0x3c0 NOTICE: count in 32bit=10 NOTICE: cc_strategy: debug step05. --- start DMA NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xe NOTICE: cc_intr: debug step06b. --- cc->executing_dma_flag != 0 NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_strategy: debug step07. --- return DMA NOTICE: camac_b: debug step08. --- cc_sys_status = 0x0 NOTICE: out: 1 0 24 0 10 NOTICE: camac_b: debug step09. --- return NOTICE: camac_b: debug step01. --- enter camac_b() NOTICE: in: 0x3f53c0 10 1 34 0 0 NOTICE: camac_b: debug step02. --- call physio() NOTICE: cc_strategy: debug step03. --- enter cc_strategy() NOTICE: cc_strategy: debug step04. --- found the camac read NOTICE: cc_strategy: debug step04-1. --- dma_addr = 0x3c0 NOTICE: count in 32bit=10 NOTICE: cc_strategy: debug step05. --- start DMA NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xe NOTICE: cc_intr: debug step06b. --- cc->executing_dma_flag != 0 NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_strategy: debug step07. --- return DMA NOTICE: camac_b: debug step08. --- cc_sys_status = 0x0 NOTICE: out: 1 0 24 0 10 NOTICE: camac_b: debug step09. --- return cam2、camacブロック転送は正常に実行できた。 ---xxx ここまでやった(継続中) --- (6). セクション (6-1). サブセクション (6-1-1). サブサブセクション