Mar 24, 1999 frc7v-cl1: Server Solaris 2.6、cc ドライバのテスト --- クライアントシステム上での cc ドライバのデバッグ#01(その12) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/onl8v1-sol2.6-serv/ Cli1-CAMAC/debug-step12.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()ルーチンでやらないようにしてみたが 症状は変わらない。 (2). ここでやるべきこと Soft State Managementルーチンを使ってみる。 (3). Soft State Managementルーチンとは Soft State Management これらのインタフェースは soft-state allocator から構成されている。 ドライバ・インスタンスのために前もって決めた構造体の管理を単純化 する能力を持っている。 最も良い結果を得るためにこれらのルーチンを 使う。これらはインスタンス毎のデータの追跡を維持することができる。 int ddi_soft_state_init(void **state_p, size_t size, size_t n_items); void ddi_soft_state_fini(void **state_p); int ddi_soft_state_zalloc(void *state, int item); void *ddi_get_soft_state(void *state, int item); void ddi_soft_state_free(void *state, int item); (4). cc.cファイルを修正する 高橋さんからのメール。 >古いファイルを送ってしまったようです。 >また送りますの宜しくお願い致します。 frc7v-cl1[70]% uudecode t46r.dat frc7v-cl1[71]% ls -l total 368 -rw-rw-rw- 1 inoue staff 73216 Mar 23 1999 cc.tar -rw------- 1 inoue staff 103338 Mar 23 11:42 t46r.dat frc7v-cl1[72]% tar xvf cc.tar x cc.c, 71537 bytes, 140 tape blocks frc7v-cl1[73]% ls -l total 508 -rwxr----- 1 inoue staff 71537 Mar 17 13:51 cc.c* -rw-rw-rw- 1 inoue staff 73216 Mar 23 1999 cc.tar -rw------- 1 inoue staff 103338 Mar 23 11:42 t46r.dat frc7v-cl1[74]% cc.cファイルをチェック。 frc7v-cl1[60]% diff cc.c-org cc.c 35a36,39 > /* By E.Inoue begin > #define uprintf(x) cmn_err(CE_NOTE,x) > end */ > 57a62,63 > static void *cc_state; > 205c211,220 < return (mod_install(&modlinkage)); --- > int error; > > if((error = ddi_soft_state_init(&cc_state,sizeof(cc_device),1)) != 0){ > return(error); > } > if((error = mod_install(&modlinkage)) != 0){ > ddi_soft_state_fini(&cc_state); > } > > return(error); 215c230,235 < return (mod_remove(&modlinkage)); --- > int error; > > if((error = mod_remove(&modlinkage)) == 0){ > ddi_soft_state_fini(&cc_state); > } > return (error); 236a257 > int instance; 238,239c259,261 < register struct cc_device *cc = &ccdevice[0]; < --- > register struct cc_device *cc; > /* register struct cc_device *cc = &ccdevice[0]; */ > 242a265,277 > instance = ddi_get_instance(dip); > > /* initialize cc_device */ > > if((cc = ddi_get_soft_state(cc_state,instance)) == NULL){ > cmn_err(CE_WARN,"cc_probe: ddi_get_soft_state failed"); > goto failure; > } > > /* bzero((char *)cc, sizeof(struct cc_device)); */ > cc->dip = dip; > /* cc->k = (struct K_REG *)reg; */ > 244c279 < if (ddi_map_regs(dip, (u_int)0, (caddr_t *)®, (off_t)0, 0)) { --- > if (ddi_map_regs(dip, (u_int)0, (caddr_t *)&cc->k, (off_t)0, 0)) { 249,253d283 < /* initialize cc_device */ < bzero((char *)cc, sizeof(struct cc_device)); < cc->dip = dip; < cc->k = (struct K_REG *)reg; < 267c297 < ddi_unmap_regs(dip, 0, (caddr_t *)®, (off_t) 0, (off_t) 0); --- > ddi_unmap_regs(dip, 0, (caddr_t *)&cc->k, (off_t) 0, (off_t) 0); 277a308,320 > instance = ddi_get_instance(dip); > > if(ddi_soft_state_zalloc(cc_state,instance) != DDI_SUCCESS){ > cmn_err(CE_WARN,"cc_probe: ddi_soft_state_zalloc failed"); > goto failure; > } > > if((cc = ddi_get_soft_state(cc_state,instance)) == NULL){ > cmn_err(CE_WARN,"cc_probe: ddi_get_soft_state failed"); > ddi_soft_state_free(cc_state,instance); > goto failure; > } > 301c344 < (caddr_t) NULL) != DDI_SUCCESS) { --- > (caddr_t) instance) != DDI_SUCCESS) { 328c371,373 < register struct cc_device *cc = &ccdevice[0]; --- > register struct cc_device *cc; > /* register struct cc_device *cc = &ccdevice[0]; */ > int instance; 330a376,379 > > instance = ddi_get_instance(dip); > > cc = ddi_get_soft_state(cc_state,instance); 339a389 > ddi_soft_state_free(cc_state,instance); 351c401 < register dev_t dev = (dev_t) arg; --- > /* register dev_t dev = (dev_t) arg; */ 353c403,404 < register struct cc_device *cc = &ccdevice[0]; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; 357,358c408,412 < *result = (void *) cc->dip; < error = DDI_SUCCESS; --- > instance = getminor((dev_t)arg); > if((cc = ddi_get_soft_state(cc_state,instance)) != NULL){ > *result = (void *)cc->dip; > error = DDI_SUCCESS; > } 361c415,416 < instance = 0; --- > /* instance = 0; */ > instance = getminor((dev_t)arg); 365a421 > *result = NULL; 485c541,542 < register struct cc_device *cc = &ccdevice[0]; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; 488c545 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 490a548,549 > cc = ddi_get_soft_state(cc_state,unit); > 528c587,588 < register struct cc_device *cc = &ccdevice[0]; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; 529a590 > cc = ddi_get_soft_state(cc_state,unit); 545c606,607 < register struct cc_device *cc = &ccdevice[0]; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; 552a615 > minor_t unit; 553a617,619 > unit = getminor(dev); > cc = ddi_get_soft_state(cc_state,unit); > 775c841 < void cc_timeout() --- > void cc_timeout(int unit) 777c843,844 < register struct cc_device *cc = &ccdevice[0]; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; 778a846,847 > cc = ddi_get_soft_state(cc_state,unit); > 807c876 < cc_intr() --- > cc_intr(int unit) 809,810c878,880 < register struct cc_device *cc = &ccdevice[0]; < register struct K_REG *k = cc->k; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; > /* register struct K_REG *k = cc->k; */ 811a882,883 > cc = ddi_get_soft_state(cc_state,unit); > 813a886,889 > /* E.Inoue: from */ > cmn_err(CE_NOTE," cc_intr: debug step06. --- enter cc_intr()"); > /* E.Inoue: end */ > 815c891 < if ((k->csr & CC_LAM) != 0) --- > if ((cc->k->csr & CC_LAM) != 0) 817c893 < if ((k->csr & CC_DONE) != 0) --- > if ((cc->k->csr & CC_DONE) != 0) 819c895 < if ((k->empc & CC_INT_ENABLE) == 0) --- > if ((cc->k->empc & CC_INT_ENABLE) == 0) 821c897 < if ((k->aboc & CC_INT_ENABLE) == 0) --- > if ((cc->k->aboc & CC_INT_ENABLE) == 0) 823a900,903 > /* E.Inoue: from */ > cmn_err(CE_NOTE," cc_intr: debug step06a. --- cc->interrupt=0x%x", cc->interrupt); > /* E.Inoue: end */ > 826a907,911 > /* E.Inoue: from */ > cmn_err(CE_NOTE," cc_intr: debug step06b. --- cc->executing_dma_flag != 0"); > /* E.Inoue: end */ > > 839a925,927 > /* E.Inoue: from */ > cmn_err(CE_NOTE," cc_intr: debug step06c. --- reject interrupt: return cc_intr()"); > /* E.Inoue: end */ 846a935,937 > /* E.Inoue: from */ > cmn_err(CE_NOTE," cc_intr: debug step06d. --- accept interrupt: return cc_intr()"); > /* E.Inoue: end */ 858,859c949,951 < register struct cc_device *cc = &ccdevice[0]; < register struct K_REG *k = cc->k; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; > /* register struct K_REG *k = cc->k; */ 862c954 < int s; --- > int s, unit; 863a956,958 > unit = getminor(dev); > cc = ddi_get_soft_state(cc_state,unit); > 878c973 < k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; --- > cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; 888c983 < cc->timeout_id = timeout(cc_timeout, NULL, *(int *)data * hz); --- > cc->timeout_id = timeout(cc_timeout, unit, *(int *)data * hz); 921c1016 < k->lamc = CC_INT_AUTO_CLEAR | intrpri; --- > cc->k->lamc = CC_INT_AUTO_CLEAR | intrpri; 952c1047 < k->csr = CC_RST; --- > cc->k->csr = CC_RST; 1194a1290 > 1490c1586,1587 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1496c1593,1594 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1502c1600,1601 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1508c1607,1608 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1514c1614,1615 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1520c1621,1622 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1561c1663 < register int status; --- > register int status; 1681c1783 < int cc_swap_a(cc) --- > int cc_swap_a() 1696c1798,1799 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1702c1805,1806 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1722c1826,1827 < struct cc_device *cc; { --- > struct cc_device *cc; > { 1728c1833,1834 < struct cc_device *cc; { --- > struct cc_device *cc; > { 2057c2163 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2071c2177 < k->cma = ptr_cma; --- > cc->k->cma = ptr_cma; 2148c2254 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2165c2271 < k->cma = klist[i].cma; --- > cc->k->cma = klist[i].cma; 2181c2287 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2195c2301 < k->cma = ptr_cma; --- > cc->k->cma = ptr_cma; 2198c2304 < k->cmr = data[ptr++]; --- > cc->k->cmr = data[ptr++]; 2201c2307 < k->cmr = data[ptr++]; --- > cc->k->cmr = data[ptr++]; 2219c2325 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2221c2327 < k->cmr = CC_HALT; --- > cc->k->cmr = CC_HALT; 2228c2334 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2230,2231c2336,2337 < k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; --- > cc->k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; 2240c2346 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2242,2243c2348,2349 < k->cmr = CC_AD | CC_BIT24 | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; --- > cc->k->cmr = CC_AD | CC_BIT24 | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; 2252c2358 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2254,2257c2360,2363 < k->cmr = CC_AD | CC_INLINE | CC_BIT16 | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = cc->ptr_list[2]; < k->cmr = 0; --- > cc->k->cmr = CC_AD | CC_INLINE | CC_BIT16 | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = cc->ptr_list[2]; > cc->k->cmr = 0; 2265c2371 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2267,2270c2373,2376 < k->cmr = CC_AD | CC_INLINE | CC_BIT24 | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = cc->ptr_list[2]; < k->cmr = cc->ptr_list[3]; --- > cc->k->cmr = CC_AD | CC_INLINE | CC_BIT24 | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = cc->ptr_list[2]; > cc->k->cmr = cc->ptr_list[3]; 2278c2384 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2280,2281c2386,2387 < k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; --- > cc->k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; 2289c2395 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2291,2294c2397,2400 < k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSTOP | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2]; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSTOP | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2]; > cc->k->cmr = 0xFFFF; 2303c2409 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2305,2308c2411,2414 < k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSTOP | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2] * 2; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSTOP | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2] * 2; > cc->k->cmr = 0xFFFF; 2317c2423 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2319,2322c2425,2428 < k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSCAN | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2]; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSCAN | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2]; > cc->k->cmr = 0xFFFF; 2331c2437 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2333,2336c2439,2442 < k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSCAN | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2] * 2; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSCAN | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2] * 2; > cc->k->cmr = 0xFFFF; 2345c2451 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2347,2350c2453,2456 < k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QIGNO | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2]; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QIGNO | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2]; > cc->k->cmr = 0xFFFF; 2359c2465 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2361,2364c2467,2470 < k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QIGNO | (cc->cur_crate << 8); < k->cmr = cc->ptr_list[1]; < k->cmr = - cc->ptr_list[2] * 2; < k->cmr = 0xFFFF; --- > cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QIGNO | (cc->cur_crate << 8); > cc->k->cmr = cc->ptr_list[1]; > cc->k->cmr = - cc->ptr_list[2] * 2; > cc->k->cmr = 0xFFFF; 2382c2488 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2390,2394c2496,2500 < k->cma = CC_CMA_INIT; /* Initialize memory pointer */ < k->cmr = mode | (cc->cur_crate << 8); /* Write command list */ < k->cmr = naf; < k->cmr = CC_HALT; < k->cma = CC_CMA_INIT; /* Reset memory pointer */ --- > cc->k->cma = CC_CMA_INIT; /* Initialize memory pointer */ > cc->k->cmr = mode | (cc->cur_crate << 8); /* Write command list */ > cc->k->cmr = naf; > cc->k->cmr = CC_HALT; > cc->k->cma = CC_CMA_INIT; /* Reset memory pointer */ 2399,2401c2505,2507 < k->csr &= ~CC_WRITE; < k->csr |= CC_GO; /* Go! */ < while ((k->csr & (CC_RDY|CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) --- > cc->k->csr &= ~CC_WRITE; > cc->k->csr |= CC_GO; /* Go! */ > while ((cc->k->csr & (CC_RDY|CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) 2403c2509 < if ((k->csr & CC_RDY) != 0) { --- > if ((cc->k->csr & CC_RDY) != 0) { 2405,2406c2511,2512 < *dat = k->dhr & 0x00FF; < *(dat + 1) = k->dlr; --- > *dat = cc->k->dhr & 0x00FF; > *(dat + 1) = cc->k->dlr; 2409c2515 < *dat = k->dlr; --- > *dat = cc->k->dlr; 2414,2416c2520,2522 < k->csr |= CC_WRITE; < k->csr |= CC_GO; /* Go! */ < while ((k->csr & (CC_RDY|CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) --- > cc->k->csr |= CC_WRITE; > cc->k->csr |= CC_GO; /* Go! */ > while ((cc->k->csr & (CC_RDY|CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) 2418c2524 < if ((k->csr & CC_RDY) != 0) { --- > if ((cc->k->csr & CC_RDY) != 0) { 2420,2421c2526,2527 < k->dhr = *dat; < k->dlr = *(dat + 1); --- > cc->k->dhr = *dat; > cc->k->dlr = *(dat + 1); 2424c2530 < k->dlr = *dat; --- > cc->k->dlr = *dat; 2429c2535 < k->csr |= CC_GO; /* Go! */ --- > cc->k->csr |= CC_GO; /* Go! */ 2433c2539 < while ((k->csr & (CC_DONE | CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) --- > while ((cc->k->csr & (CC_DONE | CC_ERR)) == 0 && counter < CC_TIMEOUT_SINGLE) 2436c2542 < cc->camac_qx = k->csr; --- > cc->camac_qx = cc->k->csr; 2481,2482c2587,2589 < register struct cc_device *cc = &ccdevice[0]; < register struct K_REG *k = cc->k; --- > /* register struct cc_device *cc = &ccdevice[0]; */ > register struct cc_device *cc; > /* register struct K_REG *k = cc->k; */ 2487a2595 > register int unit; 2488a2597,2598 > cc = ddi_get_soft_state(cc_state, getminor(bp->b_edev)); > 2490c2600 < uprintf(" cc_strategy: debug step03. --- enter cc_strategy()\n"); --- > cmn_err(CE_NOTE," cc_strategy: debug step03. --- enter cc_strategy()"); 2495c2605 < case 0x0000: /* CAMAC read */ --- > case 0x0000: /* CAMAC read */ 2497c2607 < uprintf(" cc_strategy: debug step04. --- found the camac read\n"); --- > cmn_err(CE_NOTE," cc_strategy: debug step04. --- found the camac read"); 2499,2506c2609,2616 < flags = DDI_DMA_READ; < break; < case 0x0010: /* CAMAC write */ < flags = DDI_DMA_WRITE; < break; < default: < cc->status = CC_STA_BLOCK_INVFUNC; < return 0; --- > flags = DDI_DMA_READ; > break; > case 0x0010: /* CAMAC write */ > flags = DDI_DMA_WRITE; > break; > default: > cc->status = CC_STA_BLOCK_INVFUNC; > return 0; 2524,2527c2634,2637 < &dma_lim, &cc->handle) != DDI_DMA_MAPPED) { < bp->b_error |= EIO; < bp->b_flags |= B_ERROR; < return bp->b_flags; --- > &dma_lim, &cc->handle) != DDI_DMA_MAPPED) { > bp->b_error |= EIO; > bp->b_flags |= B_ERROR; > return bp->b_flags; 2533,2535c2643,2645 < bp->b_error |= EIO; < bp->b_flags |= B_ERROR; < return bp->b_flags; --- > bp->b_error |= EIO; > bp->b_flags |= B_ERROR; > return bp->b_flags; 2541a2652 > 2546c2657,2658 < uprintf(" cc_strategy: debug step04-1. --- dma_addr = 0x%x\n", dma_addr); --- > cmn_err(CE_NOTE," cc_strategy: debug step04-1. --- dma_addr = 0x%x", > dma_addr); 2550c2662,2663 < uprintf("count in 32bit=%d\n", cc->dma_cookie.dmac_size); --- > /* uprintf("count in 32bit=%d\n", cc->dma_cookie.dmac_size); */ > cmn_err(CE_NOTE,"count in 32bit=%d", cc->dma_cookie.dmac_size); 2557c2670,2671 < k->cma = CC_CMA_INIT; /* Initialize memory pointer */ --- > cc->k->cma = CC_CMA_INIT; /* Initialize memory pointer > */ 2559,2569c2673,2683 < k->cmr = mode | (cc->cur_crate << 8); < k->cmr = naf; < k->cmr = -(cc->len & 0xFFFF); /* Max len = 1MWord */ < k->cmr = 0xFFFF; < k->cmr = CC_HALT; < k->cma = CC_CMA_INIT; /* Reset memory pointer */ < k->maclo = dma_addr & 0xFFFF; /* Set DMA base address */ < k->machi = dma_addr >> 16; < k->amr = CC_AMR_INIT; /* Set VME AM code */ < k->mtc = wc; < k->cser = CC_DMA_RESET; /* DMA reset */ --- > 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 */ 2571,2577c2685,2691 < switch (cc->naf & 0x0018) { < case 0x0000: /* CAMAC read */ < k->docr = CC_DOCR_INIT | CC_DMA_READ; < k->sccr = CC_DMA_START; < k->csr |= CC_DMA; /* DMA mode */ < k->csr &= ~CC_WRITE; < break; --- > 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; 2579,2584c2693,2698 < case 0x0010: /* CAMAC write */ < k->docr = CC_DOCR_INIT | CC_DMA_WRITE; < k->sccr = CC_DMA_START; < k->csr |= CC_DMA; /* DMA mode */ < 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; 2586,2589c2700,2703 < default: /* ERROR */ < cc->status = CC_STA_BLOCK_INVFUNC; < return 0; < } --- > default: /* ERROR */ > cc->status = CC_STA_BLOCK_INVFUNC; > return 0; > } 2593,2598c2707,2713 < k->cma = now_cma; /* Initialize memory pointer */ < k->maclo = dma_addr & 0xFFFF; /* Set DMA base address */ < k->machi = dma_addr >> 16; < k->amr = CC_AMR_INIT; /* Set VME AM code */ < k->mtc = now_wc; < k->cser = CC_DMA_RESET; /* DMA reset */ --- > 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 */ 2600,2603c2715,2718 < k->docr = CC_DOCR_INIT | CC_DMA_READ; < k->sccr = CC_DMA_START; < k->csr |= CC_DMA; /* DMA mode */ < k->csr &= ~CC_WRITE; --- > 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; 2606c2721 < uprintf(" cc_strategy: debug step05. --- start DMA\n"); --- > cmn_err(CE_NOTE," cc_strategy: debug step05. --- start DMA"); 2611,2613c2726,2728 < cc->timeout_id = timeout(cc_timeout, NULL, CC_TIMEOUT_DMA * hz); < k->csr |= CC_GO; /* Go! */ < k->donc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; --- > cc->timeout_id = timeout(cc_timeout, unit, CC_TIMEOUT_DMA * hz); > cc->k->csr |= CC_GO; /* Go! */ > cc->k->donc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; 2615c2730 < uprintf(" cc_strategy: debug step06. --- return\n"); --- > cmn_err(CE_NOTE," cc_strategy: debug step07. --- return DMA"); 2620,2633d2734 < /* E.Inoue: from */ < /* mutex_enter(&cc->mutex); */ /* start MUTEX */ < < /* while(cc->executing_dma_flag){ */ < /* cv_wait_sig(&cc->cv, &cc->mutex); */ < /* if (cv_wait_sig(&cc->cv, &cc->mutex) == 0) { */ < /* untimeout(cc->timeout_id); */ < /* mutex_exit(&cc->mutex); */ /* end MUTEX */ < /* return EINTR; */ < /* } */ < /* } */ < /* mutex_exit(&cc->mutex); */ /* end MUTEX */ < /* E.Inoue: end */ < 2636a2738 > 2641c2743 < register struct K_REG *k = cc->k; --- > /* register struct K_REG *k = cc->k; */ 2645c2747 < uprintf(" camac_b: debug step01. --- enter camac_b()\n"); --- > cmn_err(CE_NOTE," camac_b: debug step01. --- enter camac_b()"); 2661a2764 > /* 2668a2772,2779 > */ > 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); 2675c2786 < uprintf(" camac_b: debug step02. --- call physio()\n"); --- > cmn_err(CE_NOTE," camac_b: debug step02. --- call physio()"); 2679c2790 < uprintf(" camac_b: debug step07. --- return physio()\n"); --- > cmn_err(CE_NOTE," camac_b: debug step07. --- return physio()"); 2690,2691c2801,2802 < k->donc = CC_INT_AUTO_CLEAR | intrpri; < cc->camac_qx = k->csr; --- > cc->k->donc = CC_INT_AUTO_CLEAR | intrpri; > cc->camac_qx = cc->k->csr; 2695c2806 < uprintf(" camac_b: debug step08. --- cc_sys_status = 0x%x\n", cc_sys_status); --- > cmn_err(CE_NOTE," camac_b: debug step08. --- cc_sys_status = 0x%x", cc_sys_status); 2705a2817 > /* 2711a2824,2830 > */ > 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); 2714c2833 < if ((mode & CC_QSCAN) == 0 || (k->csr & CC_ERR) == 0) { --- > if ((mode & CC_QSCAN) == 0 || (cc->k->csr & CC_ERR) == 0) { 2716,2717c2835,2836 < cc->retlen = cc->len - k->mtc / 2; /* retlen=number of transfer */ < if ((mode & CC_QSCAN) == 0 && (k->csr & CC_ERR) != 0) /* Q-STOP */ --- > 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 */ 2723,2724c2842,2843 < cc->retlen = cc->len - k->mtc; < if ((mode & CC_QSCAN) == 0 && (k->csr & CC_ERR) != 0) /* Q-STOP */ --- > cc->retlen = cc->len - cc->k->mtc; > if ((mode & CC_QSCAN) == 0 && (cc->k->csr & CC_ERR) != 0) /* Q-STOP */ 2731c2850 < uprintf(" camac_b: debug step09. --- return\n"); --- > cmn_err(CE_NOTE," camac_b: debug step09. --- return"); frc7v-cl1[61]% cc.cファイルをコンパイルする。 frc7v-cl1[73]% make ./script/cc_build.sh [Building for sun4m] "cc.c", line 213: undefined symbol: cc_device "cc.c", line 308: undefined symbol: instance "cc.c", line 366: undefined label: failure "cc.c", line 565: undefined symbol: k "cc.c", line 565: left operand of "->" must be pointer to struct/union "cc.c", line 590: undefined symbol: unit "cc.c", line 983: warning: improper pointer/integer combination: arg #2 "cc.c", line 1784: parameter not in identifier list: cc "cc.c", line 2272: undefined symbol: k "cc.c", line 2272: left operand of "->" must be pointer to struct/union "cc.c", line 2726: warning: improper pointer/integer combination: arg #2 cc: acomp failed for cc.c ld: fatal: file cc.o: open failed: No such file or directory *** Error code 1 make: Fatal error: Command failed for target `cc' frc7v-cl1[74]% 高橋さんからのメール(その2)。 >これで試して頂けますか? frc7v-cl1[48]% ls -l total 0 frc7v-cl1[49]% rcp onlsun1:/export/home/onlsun1/inoue/workstation/onl8v1/Server-Sol2.6/Cli1-CAMAC/t48r.dat . frc7v-cl1[50]% ls -l total 224 -rw------- 1 inoue staff 103929 Mar 24 1999 t48r.dat frc7v-cl1[51]% uudecode t48r.dat frc7v-cl1[52]% ls -l total 368 -rw-rw-rw- 1 inoue staff 73216 Mar 24 1999 cc.tar -rw------- 1 inoue staff 103929 Mar 24 1999 t48r.dat frc7v-cl1[53]% tar xvf cc.tar x cc.c, 71660 bytes, 140 tape blocks frc7v-cl1[54]% ls -l total 508 -rw-r--r-- 1 inoue staff 71660 Mar 17 14:13 cc.c -rw-rw-rw- 1 inoue staff 73216 Mar 24 1999 cc.tar -rw------- 1 inoue staff 103929 Mar 24 1999 t48r.dat frc7v-cl1[55]% frc7v-cl1[55]% diff ../../cc.c cc.c 213c213 < if((error = ddi_soft_state_init(&cc_state,sizeof(cc_device),1)) != 0){ --- > if((error = ddi_soft_state_init(&cc_state,sizeof(struct cc_device),1)) != 0){ 268a269,273 > if(ddi_soft_state_zalloc(cc_state,instance) != DDI_SUCCESS){ > cmn_err(CE_WARN,"cc_probe: ddi_soft_state_zalloc failed"); > return (DDI_FAILURE); > } > 270a276 > ddi_soft_state_free(cc_state,instance); 306a313 > int instance; 310,314d316 < if(ddi_soft_state_zalloc(cc_state,instance) != DDI_SUCCESS){ < cmn_err(CE_WARN,"cc_probe: ddi_soft_state_zalloc failed"); < goto failure; < } < 317,318c319 < ddi_soft_state_free(cc_state,instance); < goto failure; --- > return (DDI_FAILURE); 565c566 < k->csr = CC_RST; /* K2917 Reset */ --- > cc->k->csr = CC_RST; /* K2917 Reset */ 588a590 > minor_t unit; 589a592,593 > unit = getminor(dev); > 954c958,959 < int s, unit; --- > int s; > minor_t unit; 983c988 < cc->timeout_id = timeout(cc_timeout, unit, *(int *)data * hz); --- > cc->timeout_id = timeout(cc_timeout, (caddr_t)&unit, *(int *)data * hz); 1783c1788 < int cc_swap_a() --- > int cc_swap_a(cc) 2272c2277 < while ((save = k->cmr) != CC_HALT) --- > while ((save = cc->k->cmr) != CC_HALT) 2595c2600 < register int unit; --- > minor_t unit; 2726c2731 < cc->timeout_id = timeout(cc_timeout, unit, CC_TIMEOUT_DMA * hz); --- > cc->timeout_id = timeout(cc_timeout, (caddr_t)&unit, CC_TIMEOUT_DMA * hz); frc7v-cl1[58]% cc.cファイルをコンパイルする。 frc7v-cl1[64]% make ./script/cc_build.sh [Building for sun4m] rm -f cc.o frc7v-cl1[65]% cc および cc.confファイルをコピーする。 frc8vt# pwd /usr/kernel/drv frc8vt# ls -l cc* -rwxr-xr-x 1 root sys 56252 Mar 19 16:50 cc* -rwxr-xr-x 1 root sys 288 Mar 19 16:50 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 59860 Mar 24 09:43 cc* -rwxr-xr-x 1 root sys 288 Mar 24 09:43 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] cc_attach: unable to reset K2917 drvconfig: Driver (cc) failed to attach Warning: Driver (cc) successfully added to system but failed to attach [Configuring CAMAC device driver] cc_attach: unable to reset K2917 [Making CAMAC device files] frc7v-cl1# K2917をリセットできないといっている。 cam2プログラムを実行する。 frc7v-cl1[39]% 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= 0 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 >^C *** TERMINATING cam2 *** Received signal 2 SIGINT frc7v-cl1[40]% ls -l /dev/cc lrwxrwxrwx 1 root other 69 Mar 24 09:45 /dev/cc -> /devices/iommu@ 0,10000000/sbus@0,10001000/VME@5,ffffe00/cc@2d,ff00:cc frc7v-cl1[41]% cam2プログラムのフリーズは起っていない。 システムのパニックも起っていない。 camacオペレーションは実行されていない。 camacシングルアクションを実行してみる。 frc7v-cl1[43]% cam1 Open error: : No such file or directory frc7v-cl1[44]% camacデバイスをオープンできない。 camac割り込み処理を実行。 frc7v-cl1[44]% cam3 INIT. ERROR! frc7v-cl1[45]% エラー。 高橋さんからのメール(その3)。 >変更前&k->csr から 変更後&cc->k->csr へ変更されていませんでした。 frc7v-cl1[95]% diff cc.c-old cc.c.new 307d306 < static int 311,312c310,312 < register struct cc_device *cc = &ccdevice[0]; < register struct K_REG *k = cc->k; --- > register struct cc_device *cc; > /* register struct cc_device *cc = &ccdevice[0]; */ > /* register struct K_REG *k = cc->k; */ 327,328c327,328 < ddi_pokes(dip, (short *)&k->csr, (short)value); < ddi_peeks(dip, (short *)&k->csr, (short *)&value); --- > ddi_pokes(dip, (short *)&cc->k->csr, (short)value); > ddi_peeks(dip, (short *)&cc->k->csr, (short *)&value); 330c330 < uprintf("cc_attach: unable to reset K2917\n"); --- > uprintf("cc_attach: unable to reset K2917\n"); 336,338c336,338 < NULL, NULL) == DDI_FAILURE) { < ddi_remove_minor_node(dip, NULL); < uprintf("cc_attach: unable to create minor node\n"); --- > NULL, NULL) == DDI_FAILURE) { > ddi_remove_minor_node(dip, NULL); > uprintf("cc_attach: unable to create minor node\n"); 344,347c344,347 < (ddi_idevice_cookie_t *) NULL, cc_intr, < (caddr_t) instance) != DDI_SUCCESS) { < ddi_remove_minor_node(dip, NULL); < uprintf("cc_attach: unable to install high-interrupt handler\n"); --- > (ddi_idevice_cookie_t *) NULL, cc_intr, > (caddr_t) instance) != DDI_SUCCESS) { > ddi_remove_minor_node(dip, NULL); > uprintf("cc_attach: unable to install high-interrupt handler\n"); 350c350 < --- > 353c353 < MUTEX_DRIVER, (void *)&cc->iblock_cookie); --- > MUTEX_DRIVER, (void *)&cc->iblock_cookie); 357c357 < --- > 365c365,366 < --- > > 368a370 > frc7v-cl1[96]% cc.cファイルをコンパイルする。 frc7v-cl1[98]% make ./script/cc_build.sh [Building for sun4m] rm -f cc.o frc7v-cl1[99]% cc および cc.confファイルをコピーする。 frc8vt# pwd /usr/kernel/drv frc8vt# ls -l cc* -rwxr-xr-x 1 root sys 59860 Mar 24 09:43 cc* -rwxr-xr-x 1 root sys 288 Mar 24 09:43 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 59828 Mar 24 14:00 cc* -rwxr-xr-x 1 root sys 288 Mar 24 14:00 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# camacシングルアクション、cam1プログラムを実行する。 frc7v-cl1[47]% pwd /export/home/frc7v-cl1/inoue/CAMAC/Driver/FORCE-5V-sol2.5 frc7v-cl1[48]% 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 5555 N=3 A=0 F=16 Q=1 X=1 Data:0015B3(Hex) 00005555(Dec) Input n a f (data)>3 0 0 N=3 A=0 F=0 Q=1 X=1 Data:0015B3(Hex) 00005555(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[49]% frc7v-cl1[49]% ok. 正常に実行できた。 camac割り込み処理、cam3プログラムを実行。 frc7v-cl1[49]% 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 Interrupted !! count=8 Interrupted !! count=9 Interrupted !! count=10 *** cam3 nomal end. frc7v-cl1[50]% ok. 正常に実行できた。 この時のコンソール上のメッセージを以下に示す。 NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() NOTICE: cc_intr: debug step06. --- enter cc_intr() NOTICE: cc_intr: debug step06a. --- cc->interrupt=0xf NOTICE: cc_intr: debug step06d. --- accept interrupt: return cc_intr() camacブロック転送、cam2プログラムを実行。 frc7v-cl1[50]% 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 cam2プログラムはここでフリーズした。 システムはパニックを起こしてリブートしてしまった。 この時のコンソール上のメッセージを以下に示す。 pNeTICE: i=:9 xrfp3c0 10=1 34 fb0eaDac T: dRbug sAep01. P-- e:ter camacty() NOTICE4 cam0c_b: 8ebugdstep02. --- call phcs io() NOTICad dc_srrategy: d=fug 6tep03.1c-7 efte5 cc_ctr temy() sNOTI1E: ccsr=ategy: debug st3p246 --- rownd the camac read cam2: Data fault kernel read fault at addr=0xf61c7f5c, pme=0x0 MMU sfsr=326: Invalid Address on supv data fetch at level 3 pte addr = 0xf60e5d1c, level = 3 wrong ctx/as ctx 0, as 0xf59143d0 wrong ctx/as 2 ctx 0, as 0xf8 pid=1478, pc=0xf6110cf8, sp=0xfbe40928, psr=0x44010c6, context=0 g1-g7: f026de48, 54273, f5d98778, c00, 200, 1, f5ee2b60 rateBy: debeg step04-1. --- dmina dr =t0r3a0c : cc_intr =_strategy: dfbeg4step05. ---0sta9t DMAc: couk. in.32bi.=10 debug sCea06. l-- entlr cc_end ()f rOom Ef cc6in10:9debug 0tepcca. -- - cc-, ntefpupt=0xe= NfbICe: cc_4nt09 debug step98b. --- cc->exe, tang_dma_rlag !=g0 acO00C0: caastrdtegy: deb8 step07. --- fet0rn DMApt0 r tu5n ccfintr(b bC dabul ltep07ed--- retfrnrphosim() f00bd3ac, fp=fbe40a70, args=f00000 5 600 2a fbe40b08 f5bf1588 Called from f0068900, fp=fbe40b80, args=f5938bd0 f5a81b74 22 3 22 3 Called from 11f30, fp=effff8c0, args=1 600 3f53c0 5 24a70 24a80 End traceback... panic: Data fault syncing file systems... 2 done 2936 static and sysmap kernel pages 80 dynamic kernel data pages 496 kernel-pageable pages 0 segkmap kernel pages 0 segvn kernel pages 287 current user process pages 3799 total pages (3799 chunks) dumping to vp f59444dc, offset 137584 3799 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 Boot device: /iommu/sbus/ledma@5,8400010/le@5,8c00000 File and args: 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 Mar 24 14:02:21 1999 Saving 3799 pages of image in vmcore.33 3799 pages saved. Processing modules: Done. Constructing Namelist file: /var/crash/frc7v-cl1/unix.33 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[35]% !! rlogin frc7v-cl1 Password: No directory! Logging in with home=/ Last login: Wed Mar 24 10:13: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[36]% !! rlogin frc7v-cl1 Last login: Wed Mar 24 14:20:19 from onlsun1.kek.jp Sun Microsystems Inc. SunOS 5.6 Generic August 1997 frc7v-cl1[33]% ls -l total 8 drwxr-xr-x 3 inoue staff 512 Feb 9 15:34 CAMAC/ 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]% 先の cam2プログラム実行時のクラッシュ・ダンプ・ファイルをチェック。 frc7v-cl1[38]% adb -k unix.33 vmcore.33 physmem 3e2d $c complete_panic(0x0,0x4401ce1,0x0,0x44010e1,0x0,0xf5ae8f40) + 5c do_panic(0x1,0xfbe4078c,0x0,0x48010e1,0x8,0xf00) + a8 vcmn_err(0x3,0xf0269878,0xfbe4078c,0x3,0xffeec000,0x0) + 180 cmn_err(0x3,0xf0269878,0xfbe41,0x53,0x53,0xf025e400) + 1c die(0x9,0xfbe408dc,0xf61c7f5c,0x326,0x1,0xf0269878) + bc trap(0x0,0xfbe408dc,0xf0000000,0x0,0x6,0x1) + 930 fault(?) + 84 cmn_err(0x1,0xf6111860,0xa,0x40,0xf59143d0,0xfbe40ad8) camac_b(0x0,0x2a,0x600,0x5,0xfbe40ad8,0xf00000) + 1f8 cc_write(0xf00000,0x5,0x600,0x2a,0xfbe40b08,0xf5bf1588) + 424 writev(0xf5938bd0) + 2b0 $ dump on /dev/dsk/c0t3d0s1 size 83988K pem: no event handler FRCvme V2.3.1 VME Nexus (FGA-5000 FGA-5100) NOTICE: VME: slavewin at vme=0x0, size=0x100000 space=0x2d020617 VME0 at sbus0: SBus slot 5 0xffffe00 sparc ipl 15, SBus level 1 sparc ipl 2, SBus level 2 sparc ipl 3, SBus level 3 sparc ipl 5, SBus level 4 sparc ipl 7, SBus level 5 sparc ipl 9, SBus level 6 sparc ipl 11, SBus level 7 sparc ipl 13 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 cc0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/cc@2d,ff0 0 vmemem0 at VME0: vme32d16 0x0 vmemem0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@d,0 vmemem1 at VME0: vme16d16 0x0 vmemem1 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@2d,0 vmemem2 at VME0: vme24d16 0x0 vmemem2 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@3d,0 vmemem3 at VME0: vme32d32 0x0 vmemem3 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@4d,0 vmemem4 at VME0: vme16d32 0x0 vmemem4 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@6d,0 vmemem5 at VME0: vme24d32 0x0 vmemem5 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmeme m@7d,0 sbusmem0 at sbus0: SBus slot 0 0x0 sbusmem0 is /iommu@0,10000000/sbus@0,10001000/sbusmem@0,0 sbusmem1 at sbus0: SBus slot 1 0x0 sbusmem1 is /iommu@0,10000000/sbus@0,10001000/sbusmem@1,0 sbusmem2 at sbus0: SBus slot 2 0x0 sbusmem2 is /iommu@0,10000000/sbus@0,10001000/sbusmem@2,0 sbusmem3 at sbus0: SBus slot 3 0x0 sbusmem3 is /iommu@0,10000000/sbus@0,10001000/sbusmem@3,0 sbusmem4 at sbus0: SBus slot 4 0x0 sbusmem4 is /iommu@0,10000000/sbus@0,10001000/sbusmem@4,0 sbusmem5 at sbus0: SBus slot 5 0x0 sbusmem5 is /iommu@0,10000000/sbus@0,10001000/sbusmem@5,0 SUNW,bpp0 at sbus0: SBus slot 5 0xc800000 SBus level 2 sparc ipl 3 SUNW,bpp0 is /iommu@0,10000000/sbus@0,10001000/SUNW,bpp@5,c80000 0 pseudo-device: winlock0 winlock0 is /pseudo/winlock@0 pseudo-device: lockstat0 lockstat0 is /pseudo/lockstat@0 pseudo-device: vol0 vol0 is /pseudo/vol@0 pseudo-device: llc10 llc10 is /pseudo/llc1@0 vmeplus0 at VME0: vme16d16 0x0 and vme24d16 0x0 and vme32d16 0x0 and vme16d32 0x0 and vme24d32 0x0 and vme32d32 0x0 and space 0x 2f 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 vmeplus0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmep lus@2d,0 pseudo-device: pm0 pm0 is /pseudo/pm@0 vmedma0 at VME0 vmedma0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmedm a vmefdma0 at VME0 vmefdma0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmef dma vmedvma0 at VME0 vmedvma0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmed vma vmectl0 at VME0 vmectl0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/vmect l sysconfig0: LCA is XC4003 compatible sysconfig0 at root: obio 0x71380000 sysconfig0 is /sysconfig@0,71380000 BAD TRAP: type=9 rp=fbe408dc addr=f61c7f5c mmu_fsr=326 rw=1 cam2: Data fault kernel read fault at addr=0xf61c7f5c, pme=0x0 MMU sfsr=326: Invalid Address on supv data fetch at level 3 pte addr = 0xf60e5d1c, level = 3 wrong ctx/as ctx 0, as 0xf59143d0 wrong ctx/as 2 ctx 0, as 0xf8 pid=1478, pc=0xf6110cf8, sp=0xfbe40928, psr=0x44010c6, context=0 g1-g7: f026de48, 54273, f5d98778, c00, 200, 1, f5ee2b60 Begin traceback... sp = fbe40928 Called from f61090cc, fp=fbe40998, args=0 2a 600 5 fbe40ad8 f000 00 Called from f00bd3ac, fp=fbe40a70, args=f00000 5 600 2a fbe40b08 f5bf1588 Called from f0068900, fp=fbe40b80, args=f5938bd0 f5a81b74 22 3 2 2 3 Called from 11f30, fp=effff8c0, args=1 600 3f53c0 5 24a70 24a80 End traceback... panic: Data fault syncing file systems... 2 done 2936 static and sysmap kernel pages 80 dynamic kernel data pages 496 kernel-pageable pages 0 segkmap kernel pages 0 segvn kernel pages 287 current user process pages 3799 total pages (3799 chunks) dumping to vp f59444dc, offset $q frc7v-cl1[39]% camac_()ルーチンで、cmn_err()を実行した時にエラーを起こしている。 ---xxxx ここまでやった。  (継続中) --- (6). セクション (6-1). サブセクション (6-1-1). サブサブセクション