Apr 8, 1999 frc7v-cl1: Server Solaris 2.6、cc ドライバのテスト --- クライアントシステム上での cc ドライバのデバッグ#01(その21) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/onl8v1-sol2.6-serv/ Cli1-CAMAC/debug-step21.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-G). cc->cc_sys_status = bp->b_error; の行をcc_intr()ルーチンへ持って いって動作させた。 ok. cam2、camacブロック転送は正常に実行できた。 (2). ここでやるべきこと デバッグ用に付加した部分で実行上必要のない文を削除する。 (3). デバッグ用に付加した部分で実行上必要のない文を削除する (3-1). cam2プログラムを実行した時のメッセージを確認する --- ここから debug-step20.txt の再掲 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ブロック転送は正常に実行できた。 --- ここまで debug-step20.txt の再掲 メッセージを出力している文を削除する。 frc7v-cl1[46]% vi cc.c : static u_int cc_intr(int unit) { /* register struct cc_device *cc = &ccdevice[0]; */ register struct cc_device *cc; /* register struct K_REG *k = cc->k; */ cc = ddi_get_soft_state(cc_state,unit); mutex_enter(&cc->mutex); /* start MUTEX */ /* E.Inoue: from cmn_err(CE_NOTE," cc_intr: debug step06. --- enter cc_intr()"); E.Inoue: end */ /* check K2917 register */ if ((cc->k->csr & CC_LAM) != 0) cc->interrupt |= CC_INT_LAM; if ((cc->k->csr & CC_DONE) != 0) cc->interrupt |= CC_INT_DONE; if ((cc->k->empc & CC_INT_ENABLE) == 0) cc->interrupt |= CC_INT_EMPTY; if ((cc->k->aboc & CC_INT_ENABLE) == 0) cc->interrupt |= CC_INT_ABORT; /* E.Inoue: from cmn_err(CE_NOTE," cc_intr: debug step06a. --- cc->interrupt=0x%x", cc->inter rupt); E.Inoue: end */ /* free DMA resources */ if (cc->executing_dma_flag != 0) { /* E.Inoue: from cmn_err(CE_NOTE," cc_intr: debug step06b. --- cc->executing_dma_flag != 0"); E.Inoue: end */ /* change logichouse */ /* ddi_dma_free(cc->handle); */ ddi_dma_unbind_handle(cc->handle); /* end */ cc->cc_sys_status = cc->bp->b_error; biodone(cc->bp); cc->executing_dma_flag = 0; } if (cc->interrupt == 0) { /* reject interrupt, then return */ mutex_exit(&cc->mutex); /* end MUTEX */ /* E.Inoue: from cmn_err(CE_NOTE," cc_intr: debug step06c. --- reject interrupt: return cc_in tr()"); E.Inoue: end */ return DDI_INTR_UNCLAIMED; } else { /* accept interrupt, then wake up waiting process, then return */ untimeout(cc->timeout_id); cv_signal(&cc->cv); mutex_exit(&cc->mutex); /* end MUTEX */ /* E.Inoue: from cmn_err(CE_NOTE," cc_intr: debug step06d. --- accept interrupt: return cc_in tr()"); E.Inoue: end */ return DDI_INTR_CLAIMED; } } : : static int cc_strategy(struct buf *bp) { /* register struct cc_device *cc = &ccdevice[0]; */ register struct cc_device *cc; /* register struct K_REG *k = cc->k; */ register u_long dma_addr; /* register mode = cc->mode; register naf = cc->naf; register int wc = (mode & CC_BIT16) ? cc->len : cc->len * 2; */ register mode; register naf; register int wc; register u_int flags; minor_t unit; cc = ddi_get_soft_state(cc_state, getminor(bp->b_edev)); mode = cc->mode; naf = cc->naf; wc = (mode & CC_BIT16) ? cc->len : cc->len * 2; /* E.Inoue: from cmn_err(CE_NOTE," cc_strategy: debug step03. --- enter cc_strategy()"); E.Inoue: end */ /* check DMA mode and set flags */ switch (cc->naf & 0x0018) { case 0x0000: /* CAMAC read */ /* E.Inoue: from cmn_err(CE_NOTE," cc_strategy: debug step04. --- found the camac read"); E.Inoue: end */ flags = DDI_DMA_READ; break; case 0x0010: /* CAMAC write */ flags = DDI_DMA_WRITE; break; default: cc->status = CC_STA_BLOCK_INVFUNC; return 0; } mutex_enter(&cc->mutex); while(cc->executing_dma_flag){ cv_wait(&cc->cv,&cc->mutex); } mutex_exit(&cc->mutex); /* change logichouse */ /* setup DMA bufer */ if((ddi_dma_buf_bind_handle(cc->handle, bp , flags | DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, (caddr_t)0, &cc->dma_cookie, &cc->ccount) != DDI_DMA_MAPPED)){ cmn_err(CE_WARN,"cc_strategy: ddi_dma_buf_bind_handle failed"); bp->b_flags |= B_ERROR; bp->b_error = EIO; return bp->b_flags; } /* if (ddi_dma_buf_setup(cc->dip, bp, flags, DDI_DMA_SLEEP, NULL, &dma_lim, &cc->handle) != DDI_DMA_MAPPED) { bp->b_error |= EIO; bp->b_flags |= B_ERROR; return bp->b_flags; } */ /* get a virtual address to hand to our device */ /* if (ddi_dma_htoc(cc->handle, NULL, &cc->dma_cookie) != DDI_SUCCESS) { bp->b_error |= EIO; bp->b_flags |= B_ERROR; return bp->b_flags; } */ /* end */ /* set up variables */ cc->bp = bp; dma_addr = cc->dma_cookie.dmac_address; /* count = cc->dma_cookie.dmac_size; */ /* E.Inoue: from cmn_err(CE_NOTE," cc_strategy: debug step04-1. --- dma_addr = 0x%x", dma_addr); E.Inoue: end */ /* */ /* uprintf("count in 32bit=%d\n", cc->dma_cookie.dmac_size); */ /* cmn_err(CE_NOTE,"count in 32bit=%d", cc->dma_cookie.dmac_size); */ /* */ cc->retlen = 0; /* k->csr = CC_RST; */ /* K2917 Reset */ if (cc->klist == CC_KLIST_NO) { cc->k->cma = CC_CMA_INIT; /* Initialize memory pointer */ cc->k->cmr = mode | (cc->cur_crate << 8); cc->k->cmr = naf; cc->k->cmr = -(cc->len & 0xFFFF); /* Max len = 1MWord */ cc->k->cmr = 0xFFFF; cc->k->cmr = CC_HALT; cc->k->cma = CC_CMA_INIT; /* Reset memory pointer */ cc->k->maclo = dma_addr & 0xFFFF; /* Set DMA base address */ cc->k->machi = dma_addr >> 16; cc->k->amr = CC_AMR_INIT; /* Set VME AM code */ cc->k->mtc = wc; cc->k->cser = CC_DMA_RESET; /* DMA reset */ switch (cc->naf & 0x0018) { case 0x0000: /* CAMAC read */ cc->k->docr = CC_DOCR_INIT | CC_DMA_READ; cc->k->sccr = CC_DMA_START; cc->k->csr |= CC_DMA; /* DMA mode */ cc->k->csr &= ~CC_WRITE; break; case 0x0010: /* CAMAC write */ cc->k->docr = CC_DOCR_INIT | CC_DMA_WRITE; cc->k->sccr = CC_DMA_START; cc->k->csr |= CC_DMA; /* DMA mode */ cc->k->csr |= CC_WRITE; break; default: /* ERROR */ cc->status = CC_STA_BLOCK_INVFUNC; return 0; } } /* Kinetic list-processing */ else { cc->k->cma = now_cma; /* Initialize memory pointer */ cc->k->maclo = dma_addr & 0xFFFF; /* Set DMA base address */ cc->k->machi = dma_addr >> 16; cc->k->amr = CC_AMR_INIT; /* Set VME AM code */ cc->k->mtc = now_wc; cc->k->cser = CC_DMA_RESET; /* DMA reset */ cc->k->docr = CC_DOCR_INIT | CC_DMA_READ; cc->k->sccr = CC_DMA_START; cc->k->csr |= CC_DMA; /* DMA mode */ cc->k->csr &= ~CC_WRITE; } /* E.Inoue: from cmn_err(CE_NOTE," cc_strategy: debug step05. --- start DMA"); E.Inoue: end */ /* start DMA */ cc->executing_dma_flag = 1; cc->timeout_id = timeout(cc_timeout, (caddr_t)&unit, CC_TIMEOUT_DMA * hz); cc->k->csr |= CC_GO; /* Go! */ cc->k->donc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* E.Inoue: from cmn_err(CE_NOTE," cc_strategy: debug step07. --- return DMA"); E.Inoue: end */ /* wait at physio() */ return 0; } static int camac_b(int unit, u_short mode, u_short naf, int len, int *retlen) { register struct cc_device *cc; register dev_t dev; /* register struct K_REG *k = cc->k; */ /* register struct uio *uio = cc->uio; */ register struct uio *uio; cc = ddi_get_soft_state(cc_state,unit); /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step01. --- enter camac_b()"); E.Inoue: end */ dev = cc->dev; uio = cc->uio; cc->klist = CC_KLIST_NO; cc->mode = mode; cc->naf = naf; cc->len = len; /* set uio for DMA */ uio->uio_iov->iov_base = (caddr_t)cc->ptr_udata; uio->uio_iov->iov_len = (mode & CC_BIT16) ? len * 2: len * 4; uio->uio_iovcnt = 1; uio->uio_segflg = UIO_USERSPACE; uio->uio_offset = 0; /* */ /* uprintf(" in: 0x%x %d %d %d %d %d\n", uio->uio_iov->iov_base, uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ /* cmn_err(CE_NOTE," in: 0x%x %d %d %d %d %d", uio->uio_iov->iov_base, uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ /* */ /* execute DMA transfer */ switch (cc->naf & 0x0018) { case 0x0000: /* CAMAC read */ /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step02. --- call physio()"); E.Inoue: end */ physio(cc_strategy, NULL, dev, B_READ, cc_minphys, uio); /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step07. --- return physio()"); E.Inoue: end */ break; case 0x0010: /* CAMAC write */ physio(cc_strategy, NULL, dev, B_WRITE, cc_minphys, uio); break; default: cc->status = CC_STA_BLOCK_INVFUNC; return 0; } /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step07. --- return physio()"); E.Inoue: end */ cc->k->donc = CC_INT_AUTO_CLEAR | intrpri; cc->camac_qx = cc->k->csr; /* cc->cc_sys_status = cc->bp->b_error; */ /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step08. --- cc_sys_status = 0x%x", cc->cc_s ys_status); E.Inoue: end */ /* check timeout */ if (cc->interrupt & CC_INT_TIMEOUT ) { cc->interrupt &= ~CC_INT_TIMEOUT; cc->status = CC_STA_BLOCK_TIMEOUT; *retlen = 0; return cc->status; } /* */ /* uprintf("out: %d %d %d %d %d\n", uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ /* cmn_err(CE_NOTE,"out: %d %d %d %d %d", uio->uio_iov->iov_len, uio->uio_iovcnt, uio->uio_resid, uio->uio_segflg, uio->uio_offset); */ /* */ /* Q-STOP mode or no error */ if ((mode & CC_QSCAN) == 0 || (cc->k->csr & CC_ERR) == 0) { if ((mode & CC_BIT16) == 0) { cc->retlen = cc->len - cc->k->mtc / 2; /* retlen=number of transfer */ if ((mode & CC_QSCAN) == 0 && (cc->k->csr & CC_ERR) != 0) /* Q-STOP */ cc->retlen = cc->retlen - 2; /* delete the data of Q=0 */ cc->ptr_udata += cc->retlen * 2; /* ptr(2bytes),retlen(4bytes) */ cc->len_udata += cc->retlen * 2; } else { cc->retlen = cc->len - cc->k->mtc; if ((mode & CC_QSCAN) == 0 && (cc->k->csr & CC_ERR) != 0) /* Q-STOP */ cc->retlen--; /* delete the data of Q=0 */ cc->ptr_udata += cc->retlen; /* ptr(2bytes),retlen(2bytes) */ cc->len_udata += cc->retlen; } } /* E.Inoue: from cmn_err(CE_NOTE," camac_b: debug step09. --- return"); E.Inoue: end */ /* return */ *retlen = cc->retlen; return cc->status; } cc.cファイルをコンパイルする。 frc7v-cl1[50]% make ./script/cc_build.sh [Building for sun4m] rm -f cc.o frc7v-cl1[51]% cc および cc.confファイルをコピーし直す。 frc8vt# pwd /usr/kernel/drv 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# 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 58808 Apr 7 14:41 cc* -rwxr-xr-x 1 root sys 288 Apr 7 14:42 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[59]% 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 >777 MODE=1 N= 3 A= 0 F=16 len= 5 lenr= 5 error= 0(Hex) Data( 1)= 777 0x 309(Hex) Data( 2)= 777 0x 309(Hex) Data( 3)= 777 0x 309(Hex) Data( 4)= 777 0x 309(Hex) Data( 5)= 777 0x 309(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)= 777 0x 309(Hex) Data( 2)= 777 0x 309(Hex) Data( 3)= 777 0x 309(Hex) Data( 4)= 777 0x 309(Hex) Data( 5)= 777 0x 309(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[60]% ok. 正常に実行できた。 cam1、camacシングルアクションを実行する。 frc7v-cl1[60]% cam1 Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 16 555 N=3 A=0 F=16 Q=1 X=1 Data:00022B(Hex) 00000555(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:00022B(Hex) 00000555(Dec) Input n a f (data)>3 0 16 0 N=3 A=0 F=16 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:000000(Hex) 00000000(Dec) Input n a f (data)>^Cfrc7v-cl1[61]% frc7v-cl1[61]% ok. 正常に実行できた。 cam3、camac割り込み処理を実行する。 frc7v-cl1[61]% cam3 *** Now waiting LAM ... N=3 Loop=10 Timeout=0 sec Interrupted !! count=1 Interrupted !! count=2 Interrupted !! count=3 Interrupted !! count=4 Interrupted !! count=5 Interrupted !! count=6 Interrupted !! count=7 ここで故意にタイムアウトを起こしてみた。 システムはパニックを起こしてリブートしてしまった。 BAD TRAP: type=9 rp=fbe25cb4 addr=70 mmu_fsr=1a6 rw=2 sched: Data fault kernel write fault at addr=0x70, pme=0x0 MMU sfsr=1a6: Invalid Address on supv data store at level 1 pte addr = 0xf5981000, level = 1 pid=0, pc=0xf0067430, sp=0xfbe25d00, psr=0x48000c5, context=0 g1-g7: 8, f02368c0, fbe25e80, 0, 0, 1, fbe25e80 Begin traceback... sp = fbe25d00 Called from f0092a38, fp=fbe25d60, args=fc08da30 f6087a68 20 f0274e38 a91 0 Called from f0092b44, fp=fbe25dc0, args=f5927aa0 f59282c0 107dd33 f5927ac0 40000 000 f592878c Called from f005fc58, fp=fbe25e20, args=f5927aa0 f5927ab4 f0274e38 f0274e38 f59b b4ac 4400ae2 Called from f0092afc, fp=0, args=f5927aa0 0 a0000 2d50b 63b5025c 1 End traceback... panic: Data fault syncing file systems... 2 done 2864 static and sysmap kernel pages 84 dynamic kernel data pages 494 kernel-pageable pages 0 segkmap kernel pages 0 segvn kernel pages 0 current user process pages 3442 total pages (3442 chunks) dumping to vp f59444dc, offset 140440 3442 total pages, dump succeeded rebooting... Resetting ... screen not found. Can't open input device. Keyboard not present. Using tty for input and output. SPARC CPU-7V, No Keyboard ROM Rev. 2.15.1, 64 MB memory installed, Serial #9157050. Ethernet address 0:80:42:b:49:ba, Host ID: 808bb9ba. apply failed. Initializing Memory - Type help for more information ok ok boot net -r Boot device: /iommu/sbus/ledma@5,8400010/le@5,8c00000 File and args: -r 2dc00 hostname: frc7v-cl1 domainname: kek.jp root server: frc8vt root directory: /export/root/frc7v-cl1 SunOS Release 5.6 Version Generic_105181-05 [UNIX(R) System V Release 4.0] Copyright (c) 1983-1997, Sun Microsystems, Inc. configuring network interfaces: le0. Hostname: frc7v-cl1 Configuring the /devices directory FRCvme V2.3.1 VME Nexus (FGA-5000 FGA-5100) NOTICE: VME: slavewin at vme=0x0, size=0x100000 space=0x2d020617 CAMAC device driver V1.3x, 1991-1993 by Y.TAKEUCHI (T.I.T.) cc0 at VME0: vme16d16 0xff00 VME level 4 vector 0xff sparc ipl 7 vmemem0 at VME0: vme32d16 0x0 vmemem1 at VME0: vme16d16 0x0 vmemem2 at VME0: vme24d16 0x0 vmemem3 at VME0: vme32d32 0x0 vmemem4 at VME0: vme16d32 0x0 vmemem5 at VME0: vme24d32 0x0 vmeplus0 at VME0: vme16d16 0x0 and vme24d16 0x0 and vme32d16 0x0 and vme16d32 0x 0 and vme24d32 0x0 and vme32d32 0x0 and space 0x2f offset 0x0 and space 0x6f offset 0x0 and space 0x10 offset 0x0 and space 0x11 offset 0x0 and space 0x50 offset 0x0 and space 0x51 offset 0x0 vmedma0 at VME0 vmefdma0 at VME0 vmedvma0 at VME0 vmectl0 at VME0 Configuring the /dev directory Configuring the /dev directory (compatibility devices) The system is coming up. Please wait. checking for crash dump...System went down at Wed Apr 7 14:52:09 1999 Saving 3442 pages of image in vmcore.44 3442 pages saved. Processing modules: Done. Constructing Namelist file: /var/crash/frc7v-cl1/unix.44 Namelist file complete. default ICCFP1.kek.jp done add net default: gateway ICCFP1 NIS domainname is kek.jp starting rpc services: rpcbind keyserv done. Setting netmask of le0 to 255.255.252.0 Setting default interface for multicast: add net 224.0.0.0: gateway frc7v-cl1 "/dev/swap" is not valid for swapping. It must be a block device or a regular file with the "save user text on execution" bit set. syslog service starting. syslogd: line 24: unexpected getnetconfig failure Print services started. volume management starting. Wnn6: Key License Server started.... Nihongo Multi Client Server (Wnn6 R2.30) Finished Reading Files The system is ready. frc7v-cl1 console login: ホームディレクトリをマウントする。 onlsun1[59]% !! rlogin frc7v-cl1 Password: No directory! Logging in with home=/ Last login: Wed Apr 7 11:37:39 from onlsun1.kek.jp Sun Microsystems Inc. SunOS 5.6 Generic August 1997 frc7v-cl1% su Password: # mount frc8vt:/export/home/frc8vt /export/home/frc7v-cl1 # frc7v-cl1% logout Connection closed. onlsun1[60]% !! rlogin frc7v-cl1 Last login: Wed Apr 7 15:00:06 from onlsun1.kek.jp Sun Microsystems Inc. SunOS 5.6 Generic August 1997 frc7v-cl1[33]% ls -l total 10 drwxr-xr-x 3 inoue staff 512 Feb 9 15:34 CAMAC/ drwxr-xr-x 3 inoue staff 512 Apr 5 17:47 Driver-samples-2.6/ drwxr-xr-x 3 inoue staff 512 Nov 6 11:07 FORCE/ drwxr-xr-x 2 inoue staff 512 Feb 18 10:29 Ktaka/ -rw------- 1 inoue staff 592 Feb 26 16:49 mbox frc7v-cl1[34]% クラッシュ・ファイルをチェックする。 frc7v-cl1[40]% adb -k unix.44 vmcore.44 physmem 3e2d $c complete_panic(0x0,0x4400ce0,0x0,0x44000e0,0x0,0xf00) + 5c do_panic(0x1,0xfbe25b64,0x0,0x48000e0,0x1,0xf5bc9400) + a8 vcmn_err(0x3,0xf0269878,0xfbe25b64,0x3,0xffeec000,0x0) + 180 cmn_err(0x3,0xf0269878,0xfbe26,0x53,0x53,0xf025e400) + 1c die(0x9,0xfbe25cb4,0x70,0x1a6,0x2,0xf0269878) + bc trap(0x0,0xfbe25cb4,0xf0000000,0x0,0x2,0x1) + 7e4 fault(?) + 84 mutex_enter(0x70,0xfc08da30,0xf026de48,0xf026de8c,0xf026f050,0xf005faa0) cc_timeout(0xfc08da30,0xf6087a68,0x20,0xf0274e38,0xa91,0x0) + 38 callout_execute(0xf5927aa0,0xf59282c0,0x107dd33,0xf5927ac0,0x40000000,0xf592878c ) + b8 callout_thread(0xf5927aa0,0xf5927ab4,0xf0274e38,0xf0274e38,0xf59bb4ac,0x4400ae2) + 48 0xf0067430?i mutex_enter: mutex_enter: ldstub [%o0], %o1 cc_timeout,50?ai cc_timeout: cc_timeout: save %sp, -0x60, %sp cc_timeout+4: st %i0, [%fp + 0x44] cc_timeout+8: sethi %hi(0xf608f400), %l0 cc_timeout+0xc: or %l0, 0x264, %l0 cc_timeout+0x10: ld [%l0], %l0 cc_timeout+0x14: ld [%fp + 0x44], %l1 cc_timeout+0x18: or %l0, %g0, %o0 cc_timeout+0x1c: or %l1, %g0, %o1 cc_timeout+0x20: call ddi_get_soft_state cc_timeout+0x24: nop cc_timeout+0x28: or %o0, %g0, %l0 cc_timeout+0x2c: or %l0, %g0, %i5 cc_timeout+0x30: add %i5, 0x70, %l0 cc_timeout+0x34: or %l0, %g0, %o0 cc_timeout+0x38: call mutex_enter cc_timeout+0x3c: nop cc_timeout+0x40: add %i5, 0xa0, %l0 cc_timeout+0x44: ld [%l0], %l0 cc_timeout+0x48: cmp %l0, 0x0 cc_timeout+0x4c: be cc_timeout+0xa0 cc_timeout+0x50: nop cc_timeout+0x54: add %i5, 0x90, %l0 cc_timeout+0x58: ld [%l0], %l0 cc_timeout+0x5c: or %l0, %g0, %o0 cc_timeout+0x60: call ddi_dma_unbind_handle cc_timeout+0x64: nop cc_timeout+0x68: add %i5, 0x9c, %l0 cc_timeout+0x6c: ld [%l0], %l0 cc_timeout+0x70: add %l0, 0x54, %l0 cc_timeout+0x74: ld [%l0], %l1 cc_timeout+0x78: add %i5, 0xa4, %l0 cc_timeout+0x7c: st %l1, [%l0] cc_timeout+0x80: add %i5, 0x9c, %l0 cc_timeout+0x84: ld [%l0], %l0 cc_timeout+0x88: or %l0, %g0, %o0 cc_timeout+0x8c: call biodone cc_timeout+0x90: nop cc_timeout+0x94: clr %l1 cc_timeout+0x98: add %i5, 0xa0, %l0 cc_timeout+0x9c: st %l1, [%l0] cc_timeout+0xa0: add %i5, 0x50, %l0 cc_timeout+0xa4: ld [%l0], %l0 cc_timeout+0xa8: sethi %hi(0x8000), %l1 cc_timeout+0xac: or %l0, %l1, %l1 cc_timeout+0xb0: add %i5, 0x50, %l0 cc_timeout+0xb4: st %l1, [%l0] cc_timeout+0xb8: add %i5, 0x78, %l0 cc_timeout+0xbc: or %l0, %g0, %o0 cc_timeout+0xc0: call cv_signal cc_timeout+0xc4: nop cc_timeout+0xc8: add %i5, 0x70, %l0 cc_timeout+0xcc: or %l0, %g0, %o0 cc_timeout+0xd0: call mutex_exit cc_timeout+0xd4: nop cc_timeout+0xd8: ba cc_timeout+0xe0 cc_timeout+0xdc: nop cc_timeout+0xe0: ret cc_timeout+0xe4: restore cc_timeout+0xe8: unimp 0x10000 cc_timeout+0xec: unimp 0x10000 cc_timeout+0xf0: unimp 0x10000 cc_timeout+0xf4: unimp 0x10000 cc_intr: save %sp, -0x68, %sp cc_intr+4: st %i0, [%fp + 0x44] cc_intr+8: sethi %hi(0xf608f400), %l0 cc_intr+0xc: or %l0, 0x264, %l0 cc_intr+0x10: ld [%l0], %l0 cc_intr+0x14: ld [%fp + 0x44], %l1 cc_intr+0x18: or %l0, %g0, %o0 cc_intr+0x1c: or %l1, %g0, %o1 cc_intr+0x20: call ddi_get_soft_state cc_intr+0x24: nop cc_intr+0x28: or %o0, %g0, %l0 cc_intr+0x2c: or %l0, %g0, %i5 cc_intr+0x30: add %i5, 0x70, %l0 cc_intr+0x34: or %l0, %g0, %o0 cc_intr+0x38: call mutex_enter cc_intr+0x3c: nop cc_intr+0x40: add %i5, 0x8, %l0 cc_intr+0x44: ld [%l0], %l0 $