Jul 18, 2000 onl50t: Solaris 2.6 cc ドライバのデバッグ. cc ドライバのデバッグ#04(その3) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/ onl50t-sol2.6/Desktop/debug-list-step03.txt) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). 株式会社ロジックハウスの白田様より SPARC CPU-50T を借用した。 (B). FORCE,CPU-50(UltraSPARC-IIi 300MHz)、に Solaris2.6 のシステムを インストールした。 (C). /etc の下の各設定、および /export/home の作成をやった。 (D). "Solaris2.6 Hardware: 5/98 SMCC Desktop 日本語版 SPARC版"では ディスクレス・クライアントを設定することはできないことを確認した。 (E). CPU-50T に Solaris2.6用の VMEドライバ、FRCvme-2.3.1 をインストール した。 (F). onl50t に ccドライバをインストールした。 (G). サンプル・プログラムを実行した。 (1). cam1、シングル・アクション 24ビット camac read/write の実行 NG. システムはパニックを起こしてリブートしてしまう。 (2). cam3、camac LAM割り込み処理の実行 NG. システムはパニックを起こしてリブートしてしまう。 (3). cam2、ブロック転送 16ビット read/write の実行 ok. 正常に実行できた。 (4). cam2、ブロック転送 24ビット read/write の実行 ok. 正常に実行できた。 (H). クラッシュ時の savecoreファイルを入手してデバッグを始めた。 (I). cam1プログラムのデバッグ、icc_ioctlルーチンを修正した。 ok. cam1プログラムは正常に実行できた。 (J). cam3プログラムのデバッグを始めた。 camac_s()ルーチンの中で "cc->k->dhr = *dat;" を実行したところでエラーになっている。 message構造体をcc_device構造体の中に入れてみたが改善されない。 (K). cam3プログラムは正常に動作できるようになった。 (L). cam3プログラムのデバッグ時に付加したゴミをはずして最終的な動作確認 をやった。 ok. (M). onl50t 上でデバッグしたcamacドライバをfrc7v-cl2 上で動作確認した。 ok. (N). onl50t 上でデバッグしたcamacドライバを onl7v2、スタンドアロン Solaris2.6 上で動作確認した。 ok. (O). onl50t 上でデバッグしたcamacドライバを frc8vt、ディスクレス・サーバ Solaris2.6 上で動作確認した。 ok. (P). onl50t 上でデバッグしたcamacドライバを onl8v1、スタンドアロン Solaris2.6 上で動作確認した。 ok. (Q). onl50t 上でデバッグしたcamacドライバを onl5v4、スタンドアロン Solaris2.6 上で動作確認した。 ok. (R). スタンドアロン Solaris2.6、onl50t 上で、シングルアクションの実行 速度を測定時に、camac_s()コールを連続実行すると不正割り込みが かかってしまった。 (S). camac_s()コールを連続実行しても不正割り込みはかからないように なった。 ok. -------------------- リスト処理 (A). 公開版のcamacドライバ、"FORCE-50T-sol2.6" を使ってリスト処理の テストを始める。 (B). KEKリスト処理で camacシングルアクション read/write、LAM割り込み 処理、DMA camacブロック転送の現状確認をした。 (C). Kineticリスト処理で camacシングルアクション read の現状確認をした。 (2). ここでやるべきこと camacドライバプログラムのデバッグをやる。 KEKリスト処理、Kineticリスト 処理両方をとおしてソースプログラム上で明らかに問題と思われる部分を修正 する。 (3). 現状確認 KEKリスト処理の現状は、次の URL を参照。 http://onlax2.kek.jp/~inoue/CAMAC/onl50t-sol2.6/ Desktop/debug-list-step01.txt Kineticリスト処理の現状は、次の URL を参照。 http://onlax2.kek.jp/~inoue/CAMAC/onl50t-sol2.6/ Desktop/debug-list-step02.txt (4). cc.cファイルの修正 (4-1). 修正すべき cc.cファイルの確認 onl50t[66]% pwd /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6 onl50t[67]% ls Makefile cam3* camlib.h cc.c-org forlib.o README cam3.c camlib.o cc.conf k2917.h cam1* cam3.c-int camlist/ cc.h libcamac.a cam1.c cam3.c-org camlist-kine/ cc_common.h script/ cam2* camasm/ cc cc_config.h cam2.f camlib.c cc.c forlib.c onl50t[68]% cp cc.c cc.c-Jul13-2000 (4-2). cc.cファイルを修正する onl50t[70]% vi cc.c : static int cc_write(dev_t dev, struct uio *uio, cred_t *cred_p) { : case CC_CMD_DOLIST: : /* E.Inoue cc->status = (*instruction_call)(cc); next_instruction(cc); end */ cc->status = (*instruction_call)(unit); next_instruction(unit); : /* E.Inoue flush_buf(cc); end */ flush_buf(unit); : /************************* * K2917 list processing * *************************/ case CC_CMD_ADDKLIST: : /* E.Inoue kladd(cc, klname); end */ kladd(unit, klname); : case CC_CMD_DELKLIST: copyin((caddr_t)cc->message.klname, (caddr_t)klname, sizeof(klname)); /* E.Inoue kldel(klname); end */ kldel(unit, klname); break; : case CC_CMD_EXEKLIST: : /* E.Inoue klexe(cc, klname); end */ klexe(unit, klname); : /* E.Inoue klsave(cc, cc->data_area); end */ klsave(unit, cc->data_area); : case CC_CMD_LOADKLIST: : /* E.Inoue klload(cc, cc->data_area); end */ klload(unit, cc->data_area); : /******************************************************************** * cclist.c 30-NOV-1991 Y.Takeuchi (TIT) * * * * original: cc.c on SUN4 by Y.Yasu (KEK) * * for SUN-SPARC SF-VME K2917 K3922 * * * * 24-JUN-1992 Y.Takeuchi fix bugs of cc_swap_a(), * * cc_head(), cc_move**_head(). * * 13-JUL-1992 Y.Takeuchi delete "NCC", modify "splx" etc. * * 30-NOV-1992 Y.Takeuchi modify waitint(), TIMEOUT_VALUE etc. * * 25-JAN-1993 Y.Takeuchi fix bug of ptr_prev_head[?] * * 5-MAR-1993 Y.Takeuchi modify for unified UNIX camlib * * 17-MAR-1993 Y.Takeuchi modify for re-execution * * 30-MAR-1993 Y.Takeuchi fix bugs of read24(), read16() (NOQ)) * ********************************************************************/ #define Tolong(i) (cc->ptr_list[(i)] + (cc->ptr_list[(i) + 1] << 16)) /* gloval variables for list processing */ static u_short *ptr_prev_head; /* next_instruction(cc) E.Inoue */ next_instruction(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->branch_flag) : /* flush_buf(cc) E.Inoue */ flush_buf(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->cc_sys_status = copyout((caddr_t)cc->data_area, (caddr_t)cc->ptr_udata, cc->len_kdata * sizeof(u_short)); : /* check_buf(cc, wc) E.Inoue */ check_buf(int unit, int wc) /* E.Inoue struct cc_device *cc; int wc; end */ /* wc: word counts */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->len_kdata + wc >= CC_LIST_MAX_DATA && cc->len_kdata + wc < cc->len_udata_t - cc->len_udata) /* flush_buf(cc); E.Inoue */ flush_buf(unit); if (cc->len_kdata + wc >= cc->len_udata_t - cc->len_udata) { : /* cc_stop(cc) E.Inoue */ cc_stop(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ return CC_STA_LIST_STOP; : /* cc_read16(cc) E.Inoue */ cc_read16(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 1)) */ if (status = check_buf(unit, 1)) return status; /* if (status = camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], cc->ptr _kdata)) E.Inoue */ if (status = camac_s(unit, CC_BIT16, cc->ptr_list[1], cc->ptr_kdata)) return status; : /* cc_read24(cc) E.Inoue */ cc_read24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 2)) E.Inoue */ if (status = check_buf(unit, 2)) return status; /* if (status = camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], cc->ptr _kdata)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, cc->ptr_list[1], cc->ptr_kdata)) return status; : /* cc_read16_a(cc) E.Inoue */ cc_read16_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = 0; /* return camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], ((u_short *)& cc->a_reg + 1)); */ return camac_s(unit, CC_BIT16, cc->ptr_list[1], ((u_short *)&cc->a_reg + 1)) ; } : /* cc_read24_a(cc) E.Inoue */ cc_read24_a(int unit) /* struct cc_device *cc; */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&c c->a_reg); */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&cc->a_reg); } : /* cc_write16(cc) E.Inoue */ cc_write16(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], &cc->ptr_list [2]); E.Inoue */ return camac_s(unit, CC_BIT16, cc->ptr_list[1], &cc->ptr_list[2]); } : /* cc_write24(cc) E.Inoue */ cc_write24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ dat = Tolong(2); /* return camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&d at); E.Inoue */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&dat); } : /* cc_write16_a(cc) E.Inoue */ cc_write16_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], ((u_short *)& cc->a_reg + 1)); E.Inoue */ return camac_s(unit, CC_BIT16, cc->ptr_list[1], ((u_short *)&cc->a_reg + 1)) ; } : /* cc_write24_a(cc) E.Inoue */ cc_write24_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&c c->a_reg); E.Inoue */ return camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&cc->a_reg); } : /* cc_ndt(cc) E.Inoue */ cc_ndt(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ u_short dummy; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* return camac_s(getminor(cc->dev), CC_BIT16, cc->ptr_list[1], &dummy); E.In oue */ return camac_s(unit, CC_BIT16, cc->ptr_list[1], &dummy); } : /* cc_setcrate_a(cc) E.Inoue */ cc_setcrate_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->a_reg >= 0 && cc->a_reg < MAX_CRATE) : /* cc_setcrate(cc) E.Inoue */ cc_setcrate(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->ptr_list[1] < MAX_CRATE) : /* cc_genz(cc) E.Inoue */ cc_genz(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat |= 1; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_genc(cc) E.Inoue */ cc_genc(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat |= 2; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_remi(cc) E.Inoue */ cc_remi(int unit) /* struct cc_device *cc; E.inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat &= ~4; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_seti(cc) E.Inoue */ cc_seti(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat |= 4; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_enbint(cc) E.Inoue */ cc_enbint(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cmn_err(CE_NOTE," cc_enbint: "); #ifdef CC_SPARC_LIST_EXTENSION dat = cc->a_reg; #else dat = 0xFFFFFF; /* mask */ #endif /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 13, 17), (u_shor t *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 13, 17), (u_short *)&dat)) return status; /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat |= 0x0100; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_dsbint(cc) E.Inoue */ cc_dsbint(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* disable LAM */ cc->k->lamc = CC_INT_AUTO_CLEAR | intrpri; dat = 0x0; /* mask */ /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 13, 17), (u_shor t *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 13, 17), (u_short *)&dat)) return status; /* if (status = camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) E.Inoue */ if (status = camac_s(unit, CC_BIT24, NAF(30, 0, 1), (u_short *)&dat)) return status; dat &= ~0x0100; /* return camac_s(getminor(cc->dev), CC_BIT24, NAF(30, 0, 17), (u_short *)&da t); E.Inoue */ return camac_s(unit, CC_BIT24, NAF(30, 0, 17), (u_short *)&dat); } : /* cc_qwait(cc) E.Inoue */ cc_qwait(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status, i; int dat; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->camac_qx = status = 0; for (i=0; status==0 && (cc->camac_qx & CC_NOQ)!=0 && iptr_list[2];i++) /* status = camac_s(getminor(cc->dev), CC_BIT24, cc->ptr_list[1], (u_short *)&dat); E.inoue */ status = camac_s(unit, CC_BIT24, cc->ptr_list[1], (u_short *)&dat); if (i >= cc->ptr_list[2]) : /* cc_qs16(cc) E.Inoue */ cc_qs16(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QSTOP; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.Inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_qs24(cc) E.Inoue */ cc_qs24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QSTOP; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_qs16_a(cc) E.Inoue */ cc_qs16_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QSTOP; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_qs24_a(cc) E.Inoue */ cc_qs24_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QSTOP; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_as16(cc) E.Inoue */ cc_as16(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QSCAN; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.Inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_as24(cc) E.Inoue */ cc_as24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QSCAN; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_as16_a(cc) E.inoue */ cc_as16_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QSCAN; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.Inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_as24_a(cc) E.Inoue */ cc_as24_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QSCAN; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_igq16(cc) E.Inoue */ cc_igq16(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QIGNO; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.Inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_igq24(cc) E.Inoue */ cc_igq24(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QIGNO; naf = cc->ptr_list[1]; len = cc->ptr_list[2]; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_igq16_a(cc) E.Inoue */ cc_igq16_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT16 | CC_QIGNO; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len)) E.Inoue */ if (status = check_buf(unit, len)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* cc_igq24_a(cc) E.Inoue */ cc_igq24_a(unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short mode, naf; register int status, len; int retlen; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ mode = CC_BLOCK | CC_BIT24 | CC_QIGNO; naf = cc->ptr_list[1]; len = cc->a_reg; /* flush_buf(cc); E.Inoue */ flush_buf(unit); /* if (status = check_buf(cc, len * 2)) E.Inoue */ if (status = check_buf(unit, len * 2)) return status; /* return camac_b(getminor(cc->dev), mode, naf, len, &retlen); E.Inoue */ return camac_b(unit, mode, naf, len, &retlen); } : /* int cc_move_as(cc) E.Inoue */ int cc_move_as(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->s_reg = cc->a_reg; return 0; } /* int cc_move_at(cc) E.Inoue */ int cc_move_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg = cc->a_reg; return 0; } /* int cc_move_sa(cc) */ int cc_move_sa(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->s_reg; return 0; } /* int cc_move_st(cc) E.Inoue */ int cc_move_st(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg = cc->s_reg; return 0; } /* int cc_move_ta(cc) E.Inoue */ int cc_move_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->t_reg; return 0; } /* int cc_move_ts(cc) E.Inoue */ int cc_move_ts(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->s_reg = cc->t_reg; return 0; } /* int cc_move32_a(cc) E.Inoue */ int cc_move32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = Tolong(1); return 0; } : /* int cc_move32_s(cc) E.Inoue */ int cc_move32_s(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->s_reg = Tolong(1); return 0; } /* int cc_move32_t(cc) E.Inoue */ int cc_move32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg = Tolong(1); return 0; } : /* int cc_move16_a_ptr(cc) E.Inoue */ int cc_move16_a_ptr(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 1)) E.Inoue */ if (status = check_buf(unit, 1)) return status; *cc->ptr_kdata++ = (u_short)cc->a_reg; cc->len_kdata++; return 0; } : /* int cc_move32_a_ptr(cc) E.Inoue */ int cc_move32_a_ptr(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 2)) E.Inoue */ if (status = check_buf(unit, 2)) return status; : /* int cc_move16_ptr(cc) E.Inoue */ int cc_move16_ptr(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 1)) E.inoue */ if (status = check_buf(unit, 1)) return status; *cc->ptr_kdata++ = cc->ptr_list[1]; cc->len_kdata++; return 0; } : /* int cc_move32_ptr(cc) E.Inoue */ int cc_move32_ptr(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* if (status = check_buf(cc, 2)) E.Inoue */ if (status = check_buf(unit, 2)) return status; *cc->ptr_kdata++ = cc->ptr_list[2]; *cc->ptr_kdata++ = cc->ptr_list[1]; cc->len_kdata += 2; return 0; } : /* int cc_move16_a_head(cc) E.Inoue */ int cc_move16_a_head(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->cc_sys_status = copyout((caddr_t)((u_short *)&cc->a_reg + 1), : /* int cc_move16_head_a(cc) E.Inoue */ int cc_move16_head_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = 0; : /* int cc_move16_head(cc) E.Inoue */ int cc_move16_head(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->cc_sys_status = copyout((caddr_t)&cc->ptr_list[2], (caddr_t)&ptr_prev_head[cc->ptr_list[1]-1], 2); : /* int cc_load_ptr(cc) E.Inoue */ int cc_load_ptr(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->len_udata + cc->len_kdata; : /* int cc_load_remain(cc) E.Inoue */ int cc_load_remain(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->len_udata_t - (cc->len_udata + cc->len_kdata); : /* int cc_load_timer(cc) E.Inoue */ int cc_load_timer(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ /* cc->a_reg = 0; return 0; */ /*** temporary ***/ /* return klexe(cc, cc->klist1[0].name); E.Inoue */ return klexe(unit, cc->klist1[0].name); } : /* int cc_load_count(cc) E.Inoue */ int cc_load_count(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->event_count; : /* int cc_load_qx(cc) E.Inoue */ int cc_load_qx(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg = cc->camac_qx; : /* int cc_head(cc) E.Inoue */ int cc_head(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ ptr_prev_head = cc->ptr_udata; : /* int cc_exchg_at(cc) E.Inoue */ int cc_exchg_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_int i; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ i = cc->a_reg; : /* int cc_swap_a(cc) E.Inoue */ int cc_swap_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register u_short temp; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ swap.longs = cc->a_reg; : /* int cc_bis32_at(cc) E.Inoue */ int cc_bis32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg |= cc->a_reg; : /* int cc_bis32_ta(cc) E.Inoue */ int cc_bis32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg |= cc->t_reg; : /* int cc_bis32_a(cc) E.Inoue */ int cc_bis32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg |= Tolong(1); : /* int cc_bis32_t(cc) E.Inoue */ int cc_bis32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg |= Tolong(1); : /* int cc_bic32_at(cc) E.Inoue */ int cc_bic32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg &= ~cc->a_reg; : /* int cc_bic32_ta(cc) E.Inoue */ int cc_bic32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg &= ~cc->t_reg; : /* int cc_bic32_a(cc) E.Inoue */ int cc_bic32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg &= ~Tolong(1); : /* int cc_bic32_t(cc) E.Inoue */ int cc_bic32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg &= ~Tolong(1); : /* int cc_add32_at(cc) E.Inoue */ int cc_add32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg += cc->a_reg; : /* int cc_add32_ta(cc) E.Inoue */ int cc_add32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg += cc->t_reg; : /* int cc_add32_a(cc) E.Inoue */ int cc_add32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg += Tolong(1); : /* int cc_add32_t(cc) E.Inoue */ int cc_add32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg += Tolong(1); : /* int cc_sub32_at(cc) E.Inoue */ int cc_sub32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg -= cc->a_reg; : /* int cc_sub32_ta(cc) E.Inoue */ int cc_sub32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg -= cc->t_reg; : /* int cc_sub32_a(cc) E.Inoue */ int cc_sub32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg -= Tolong(1); : /* int cc_sub32_t(cc) E.Inoue */ int cc_sub32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg -= Tolong(1); : /* int cc_mul32_at(cc) E.Inoue */ int cc_mul32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg *= cc->a_reg; : /* int cc_mul32_ta(cc) E.Inoue */ int cc_mul32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg *= cc->t_reg; : /* int cc_mul32_a(cc) E.Inoue */ int cc_mul32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->a_reg *= Tolong(1); : /* int cc_mul32_t(cc) E.Inoue */ int cc_mul32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->t_reg *= Tolong(1); : /* int cc_div32_at(cc) E.Inoue */ int cc_div32_at(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->a_reg == 0) : /* int cc_div32_ta(cc) E.Inoue */ int cc_div32_ta(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg == 0) : /* int cc_div32_a(cc) E.Inoue */ int cc_div32_a(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int i; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ if ((i = Tolong(1)) == 0) : /* int cc_div32_t(cc) E.Inoue */ int cc_div32_t(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ register int i; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ if ((i = Tolong(1)) == 0) : /* int cc_waitint(cc) E.Inoue */ int cc_waitint(int unit) /* struct cc_device *cc; E.inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ int s; u_long tick, timeout; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); mutex_enter(&cc->mutex); /* start MUTEX */ /* end */ cc->interrupt = 0; cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* lock out clock */ /* s = spl5(); E.Inoue */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; return 0; } /* mutex_enter(&cc->mutex); E.Inoue */ /* start MUTEX */ drv_getparm(LBOLT, &tick); : mutex_exit(&cc->mutex); /* end MUTEX */ /* splx(s); E.Inoue */ if (cc->interrupt & CC_INT_LAM) { : /* int cc_waitevent(cc) E.Inoue */ int cc_waitevent(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; /* end */ int s; u_long tick, timeout; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); mutex_enter(&cc->mutex); /* start MUTEX */ /* end */ cc->interrupt = 0; cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* lock out clock */ /* s = spl5(); E.Inoue */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; cc->event_count++; return 0; } /* mutex_enter(&cc->mutex); E.Inoue */ /* start MUTEX */ drv_getparm(LBOLT, &tick); : mutex_exit(&cc->mutex); /* end MUTEX */ /* splx(s); E.Inoue */ if (cc->interrupt & CC_INT_LAM) { : /* int cc_br(cc) E.Inoue */ int cc_br(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->ptr_list = cc->list_area + cc->ptr_list[1] - 1; : /* int cc_beq(cc) E.inoue */ int cc_beq(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg == Tolong(2)) { : /* int cc_bne(cc) E.Inoue */ int cc_bne(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg != Tolong(2)) { : /* int cc_bgt(cc) E.Inoue */ int cc_bgt(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg > Tolong(2)) { : /* int cc_bge(cc) E.inoue */ int cc_bge(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg >= Tolong(2)) { : /* int cc_blt(cc) E.Inoue */ int cc_blt(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg < Tolong(2)) { : /* int cc_ble(cc) E.Inoue */ int cc_ble(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg <= Tolong(2)) { : /* int cc_bbc(cc) E.Inoue */ int cc_bbc(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (!(cc->t_reg & (1 << Tolong(2)))) { : /* int cc_bbs(cc) E.inoue */ int cc_bbs(int unit) /* struct cc_device *cc; E.Inoue */ { /* E.Inoue */ struct cc_device *cc; cc = ddi_get_soft_state(cc_state,unit); /* end */ if (cc->t_reg & (1 << Tolong(2))) { : /******************************************************************** * klist.c 20-FEB-1992 Y.Takeuchi (T.I.T.) * * * * K2917's list processing * * for SPARC cc device driver K2917 K3922 * * * * 26-NOV-1992 Y.Takeuchi modify * * 5-MAR-1993 Y.Takeuchi modify for unified UNIX camlib * ********************************************************************/ /* kladd(cc, name) E.Inoue */ kladd(int unit, char *name) /* struct cc_device *cc; char *name; */ { /* E.Inoue */ struct cc_device *cc; /* end */ /* register struct K_REG *k = cc->k; */ register int i, code; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->status = 0; : instruction_call = instruction[code]; /* cc->status = (*instruction_call)(cc); next_instruction(cc); */ cc->status = (*instruction_call)(unit); next_instruction(unit); } : /* E.Inoue kldel(name) char *name; end */ /* E.Inoue */ kldel(int unit, char *name) /* End */ { struct cc_device *cc; register int i; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ /* same name check */ : /* E.Inoue klexe(cc, name) struct cc_device *cc; char *name; end */ /* E.Inoue */ klexe(int unit, char *name) /* End */ { /* E.Inoue */ struct cc_device *cc; /* End */ register dev_t dev = cc->dev; register struct uio *uio = cc->uio; register int *retlen = (int *)cc->ptr_udata; register int i, status; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->klist = CC_KLIST_YES; : /* E.Inoue klsave(cc, data) struct cc_device *cc; u_short *data; end */ /* E.Inoue */ klsave(int unit, u_short *data) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ register int i, j, ptr = 1; register u_short save; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ for (i = 0; i < cc->ptr_dir; i++) if (cc->klist1[i].name[0] != '\0') { : /* E.Inoue klload(cc, data) struct cc_device *cc; u_short *data; end */ /* E.Inoue */ klload(int unit, u_short *data) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ register int j, ptr = 1; /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ while (ptr <= data[0]) { : /* E.Inoue kl_stop(cc) struct cc_device *cc; end */ kl_stop(int unit) { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_HALT; : /* E.Inoue kl_read16(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_read16(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); : /* E.Inoue kl_read24(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_read24(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BIT24 | (cc->cur_crate << 8); : /* E.inoue kl_write16(cc) struct cc_device *cc; end */ /* E.inoue */ kl_write16(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_INLINE | CC_BIT16 | (cc->cur_crate << 8); : /* E.inoue kl_write24(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_write24(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_INLINE | CC_BIT24 | (cc->cur_crate << 8); : /* E.Inoue kl_ndt(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_ndt(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BIT16 | (cc->cur_crate << 8); : /* E.Inoue kl_qs16(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_qs16(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSTOP | (cc->cur_crate << 8); : /* E.Inoue kl_qs24(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_qs24(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSTOP | (cc->cur_crate << 8); : /* E.Inoue kl_as16(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_as16(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QSCAN | (cc->cur_crate << 8); : /* E.Inoue kl_as24(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_as24(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QSCAN | (cc->cur_crate << 8); : /* E.Inoue kl_igq16(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_igq16(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT16 | CC_QIGNO | (cc->cur_crate << 8); : /* E.Inoue kl_igq24(cc) struct cc_device *cc; end */ /* E.Inoue */ kl_igq24(int unit) /* end */ { struct cc_device *cc; /* register struct K_REG *k = cc->k; */ /* E.Inoue */ cc = ddi_get_soft_state(cc_state,unit); /* end */ cc->k->cmr = CC_AD | CC_BLOCK | CC_BIT24 | CC_QIGNO | (cc->cur_crate << 8); : onl50t[71]% (4-3). cc.cファイルをコンパイル、ロードし直す onl50t[364]% pwd /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6 onl50t[365]% ls Makefile cam3.c-org cc.c-Jul13-2000 cc.h README camasm/ cc.c-Jul13-2000A cc_common.h cam1* camlib.c cc.c-Jul13-2000B cc_config.h cam1.c camlib.h cc.c-Jul14-2000A forlib.c cam2* camlib.o cc.c-Jul14-2000B forlib.o cam2.f camlist/ cc.c-Jul17-2000A k2917.h cam3* camlist-kine/ cc.c-Jul17-2000B libcamac.a cam3.c cc cc.c-org script/ cam3.c-int cc.c cc.conf onl50t[366]% make clean \rm -f cc *.o libcamac.a cam1 cam2 cam3 *~ core onl50t[367]% make ./script/cc_build.sh [Building for sun4u] rm -f cc.o cc -O -c camlib.c -o camlib.o -I. cc -O -c forlib.c -o forlib.o -I. rm -f libcamac.a ar rcv libcamac.a camlib.o forlib.o a - camlib.o a - forlib.o ar: writing libcamac.a cc -O cam1.c -o cam1 -I. -L. -lcamac f77 -fast -O3 -u cam2.f -o cam2 -I. -L. -lcamac cam2.f: MAIN: cc -O cam3.c -o cam3 -I. -L. -lcamac onl50t[368]% onl50t# make unload ./script/cc_unload.sh [Removing CAMAC device driver] [Removing CAMAC device driver from system] [Deleting CAMAC device files] onl50t# make load ./script/cc_load.sh [Installing CAMAC device driver] [Adding CAMAC device driver to system] [Configuring CAMAC device driver] [Making CAMAC device files] sun4u onl50t# ls -l /dev/cc lrwxrwxrwx 1 root other 37 Jul 17 14:20 /dev/cc -> /devices/pci@1f,0/vme@5/cc@2d,ff00:cc onl50t# (5). KEKリスト処理の動作確認 一通り cc.cファイルを修正した。 ここで再度KEKリスト処理の動作を確認 する。 (5-1). camtest5c をコンパイル&実行(16/24ビットシングルアクション read/write) onl50t[382]% cat camtest4single.asm ; File name : camtest4single.asm ; Creation date : July 1992 ; Author : Y.Yasu, Online group, Physics department, KEK SW equ 3 ; CAMAC SWITCH REGISTER MEM equ 4 ; CAMAC BUFFER MEMORY MOUDLE INT equ 5 ; CAMAC INTERRUPT REGISTER LEN equ 10 ; 10 words ; MOVE #1,A SETCRATE A SETCRATE #0 GENZ GENC SETI REMI ; READ (0,SW,1) READ.l (0,SW,1) READ (0,SW,1),A MOVE A,(PTR)+ READ.l (0,SW,1),A MOVE.l A,(PTR)+ WRITE #0x5555,(16,SW,0) WRITE #0x80081,(16,SW,0) WRITE.l #0x80082,(16,SW,0) WRITE A,(16,SW,0) WRITE.l A,(16,SW,0) ; STOP end onl50t[383]% rm camtest4single.obj onl50t[384]% make camtest4single.obj ../camasm/camasm camtest4single.asm CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[385]% rm camtest5c onl50t[386]% make camtest5c cc -o camtest5c camtest5c.c -I.. -L.. -lcamac onl50t[387]% onl50t[387]% camtest5c CamReaLIST : OK lenlist = 36 list = 329 1 0 10a ef7a6080 CamLisExeWAIt : OK contents of iosb : iosb.status = fffffff6 iosb.ret_length = 6 iosb.s_reg = f iosb.devinfo = a000a0 contents of buffer : 5555 55 5555 5555 55 5555 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[388]% ox555555 とセットされているスイッチレジスタの SA=1 を読み出して アプリケーションバッファに正しく渡されている。 さらにこの値はスイッチ レジスタの SA=0 に書き込まれてスイッチレジスタの LED を正しい値で点灯 させている。 しかし、iosb.status は 0xfffffff6 = -10 になっている。 以前と同じ症状。 (5-2). camtest5c1 をコンパイル & 実行 (LAM 割り込み処理) onl50t[47]% cat camtest4int.asm ; File name : camtest4int.asm ; Creation date : July 1992 ; Author : Y.Yasu, Online group, Physics department, KEK ; Modified : June 2000, E.Inoue SW equ 3 ; CAMAC SWITCH REGISTER MEM equ 4 ; CAMAC BUFFER MEMORY MOUDLE INT equ 5 ; CAMAC INTERRUPT REGISTER LEN equ 10 ; 10 words ; SETCRATE #0 GENZ GENC SETI REMI ; ENBINT ; MOVE.l #1000,T MOVE.l #5,T ; NDT (26,INT,0) NDT (26,SW,0) LOOPIN1 WAITINT ; GENC ; NDT (9,INT,0) NDT (10,SW,0) MOVE.l T,A WRITE.l A,(16,SW,0) SUB #1,T BGT #0,LOOPIN1 LOAD COUNT MOVE.l A,(PTR)+ LOAD PTR MOVE.l A,(PTR)+ ; MOVE.l #1000,T MOVE.l #5,T LOOPIN2 WAITEVENT ; GENC ; NDT (9,INT,0) NDT (10,SW,0) MOVE.l T,A WRITE.l A,(16,SW,0) SUB #1,T BGT #0,LOOPIN2 LOAD COUNT MOVE.l A,(PTR)+ LOAD PTR MOVE.l A,(PTR)+ DSBINT ; STOP end onl50t[48]% onl50t[48]% rm camtest4int.obj onl50t[49]% make camtest4int.obj ../camasm/camasm camtest4int.asm CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[50]% onl50t[50]% rm camtest5c1 onl50t[51]% make camtest5c1 cc -o camtest5c1 camtest5c1.c -I.. -L.. -lcamac onl50t[52]% onl50t[52]% camtest5c1 CamReaLIST : OK lenlist = 52 list = 20b 0 10c 10d ef7a6080 CamLisExeWAIt : OK contents of iosb : iosb.status = fffffff5 iosb.ret_length = 0 iosb.s_reg = f iosb.devinfo = a000a0 contents of buffer : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[53]% camtest5c1 を起動すると同時に "list timeout" の iosb.status がが返されて camtest5c1 プログラムは終了した。 この間は一瞬なので、スイッチレジスタ の LAM ボタンを押す時間もなかった。 以前と同じ症状。 (5-3). camtest5c2 をコンパイル & 実行 (DMA) onl50t[45]% cat camtest4dma.asm ; File name : camtest4dma.asm ; Creation date : July 1992 ; Author : Y.Yasu, Online group, Physics department, KEK SW equ 3 ; CAMAC SWITCH REGISTER MEM equ 4 ; CAMAC BUFFER MEMORY MOUDLE LEN equ 10 ; 10 words ; SETCRATE #0 GENZ GENC SETI REMI NDT (9,MEM,0) MOVE #LEN,T MOVE #0,A LOOP WRITE A,(16,MEM,0) ADD #1,A SUB #1,T BGT #0,LOOP ; MOVE #1,A QS.l (0,SW,1),#1 QS.l (0,SW,1),A AS.l (0,SW,1),#1 AS.l (0,SW,0),A IGQ.l (0,SW,1),#1 IGQ.l (0,SW,1),A ; MOVE #LEN,A NDT (9,MEM,0) QS (0,MEM,0),#LEN NDT (9,MEM,0) QS (0,MEM,0),A NDT (9,MEM,0) AS (0,MEM,0),#LEN NDT (9,MEM,0) AS (0,MEM,0),A NDT (9,MEM,0) IGQ (0,MEM,0),#LEN NDT (9,MEM,0) IGQ (0,MEM,0),A ; ; STOP end onl50t[46]% onl50t[47]% rm camtest4dma.obj onl50t[48]% make camtest4dma.obj ../camasm/camasm camtest4dma.asm CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[49]% onl50t[49]% rm camtest5c2 onl50t[50]% make camtest5c2 cc -o camtest5c2 camtest5c2.c -I.. -L.. -lcamac onl50t[51]% onl50t[51]% camtest5c2 CamReaLIST : OK lenlist = 76 list = 20b 0 10c 10d ef7a6080 CamLisExeWAIt : OK contents of iosb : iosb.status = fffffff6 iosb.ret_length = 48 iosb.s_reg = f iosb.devinfo = 800080 contents of buffer : ff55 5555 ff55 5555 ff55 5555 ff00 0 ff55 5555 ff55 5555 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 onl50t[52]% ox555555 とセットされているスイッチレジスタの SA=1 および SA=0 を 読み出してアプリケーションバッファに正しく渡されている。 さらに メモリバッファに書き込んだデータを Qストップ、アドレススキャン、 イグノア Q の各モードで正しく読み出してアプリケーションバッファに正しく 渡されている。 しかし、iosb.status は 0xfffffff6 = -10 になっている。 以前と同じ症状。 (6). Kineticリスト処理の動作確認 (6-1). cam6.obj、cam6 をコンパイル & 実行 (シングルアクション read) onl50t[71]% pwd /export/home/onl50t/inoue/CAMAC/Driver/Kit-test/CAMAC-list/FORCE-50T-sol2.6/camlist-kine onl50t[72]% ls Makefile cam3* cam4.log cam6.c cam7a.asm Makefile.tmp cam3.c cam4.obj cam6.lis cam7a.lis cam0.c cam3.log cam4.tmp cam6.obj cam7a.obj cam1* cam4* cam5.c cam6a* cam7b.asm cam1.c cam4.asm cam6* cam6a.c cam7b.lis cam1.log cam4.c cam6.asm cam7* cam7b.obj cam1w.c cam4.lis cam6.asm-org cam7.c onl50t[73]% rm cam6 cam6.lis cam6.obj onl50t[74]% make cam6 cc -O cam6.c -o cam6 -I/usr/local/vme/camac/include -L/usr/local/vme/camac/lib -lcamac /usr/local/vme/camac/camasm/camasm cam6 a CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[75]% ls -l cam6* -rwxr-xr-x 1 inoue kek 14392 Jul 18 13:21 cam6* -rw-r--r-- 1 inoue kek 634 Jul 18 13:21 cam6.asm -rw-r--r-- 1 inoue kek 393 Jul 4 13:41 cam6.asm-org -rw-r--r-- 1 inoue kek 1835 Jul 5 09:49 cam6.c -rw-r--r-- 1 inoue kek 1415 Jul 18 13:21 cam6.lis -rw-r--r-- 1 inoue kek 70 Jul 18 13:21 cam6.obj -rwxr-xr-x 1 inoue kek 14060 Jul 4 16:29 cam6a* -rw-r--r-- 1 inoue kek 1471 Jul 4 13:41 cam6a.c onl50t[76]% cat cam6.obj 000D 0201 0620 0201 0620 031B 0620 000A 0201 0620 0201 0620 0100 onl50t[77]% cat cam6.lis CAMASM macro assembler F0 1: ***************************************************************** F0 1: * cam6.ASM 20-FEB-1992 Y.Takeuchi * F0 1: * Modified : 4-Jul-2000 E.Inoue * F0 1: * * F0 1: * camasm cam6 a * F0 1: ***************************************************************** F0 1: ;SW equ 11 ; Switch Register F0 1: SW equ 3 ; Switch Register F0 1: SCALER equ 6 ; CAMAC Scaler F0 1: ; F0 1: ; NDT (9,SCALER,1) F0 1: ; READ (0,SCALER,1) F0 1: ; READ (0,SCALER,1) F0 1: ; IGQ (0,SCALER,1),#10 F0 1: ; READ (0,SCALER,1) F0 1: ; READ (0,SCALER,1) F0 1: ; F0 1: ; NDT (10,SW,1) F0 1: 0201 0620 READ (0,SW,1) F0 3: 0201 0620 READ (0,SW,1) F0 5: 031B 0620 000A IGQ (0,SW,1),#10 F0 8: 0201 0620 READ (0,SW,1) F0 A: 0201 0620 READ (0,SW,1) F0 C: ; F0 C: 0100 STOP F0 D: end onl50t[78]% onl50t[79]% cam6 list length = 13 Now execute cam6.obj ... Freeze BAD TRAP: cpu=0 type=0x31 rp=0x3026d7a0 addr=0x0 mmu_fsr=0 x0 BAD TRAP occurred in module "cc" due to an illegal access to a user address. cam6: trap type = 0x31 pid=800, pc=0x60d06e20, sp=0x3026d830, tstate=0x9900001e00, context=0x59b g1-g7: 60e0c0d6, 0, 0, 7a0, 0, 0, 60cb9360 Begin traceback... sp = 3026d830 Called from 60d02ee4, fp=3026d898, args=0 3026d923 0 0 0 3019185c Called from 10088578, fp=3026d970, args=f00000 3026d9d8 3c11 0 3026da08 60d8c000 Called from 1002ec94, fp=3026da80, args=3 3 9e38 60cdb888 60ca8664 9e38 Called from 11d58, fp=effeb388, args=3 222e0 2 effebc74 effeb3d8 effeb3d4 End traceback... panic[cpu0]/thread=0x60cb9360: trap syncing file systems... 2 done 3182 static and sysmap kernel pages 32 dynamic kernel data pages 255 kernel-pageable pages 0 segkmap kernel pages 0 segvn kernel pages 100 current user process pages 3569 total pages (3569 chunks) dumping to vp 601de2ac, offset 480822 3569 total pages, dump succeeded rebooting... Resetting ... screen not found. Can't open input device. Keyboard not present. Using ttya for input and output. FORCE,CPU-50(UltraSPARC-IIi 300MHz), No Keyboard OpenBoot 3.10.8, 256 MB memory installed, Serial #9204337. Ethernet address 0:80:42:10:2:74, Host ID: 808c7271. Executing last command: boot Boot device: disk3:a File and args: 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: hme0 hme1. Hostname: onl50t Configuring the /devices directory FRCvme V2.3.1 VME Nexus ( Universe) NOTICE: VME: slavewin at vme=0x0, size=0x100000 space=0x302061f CAMAC device driver V1.4x, 1991-1993 by Y.TAKEUCHI (T.I.T.) cc0 at vme0: vme16d16 0xff00 VME level 4 vector 0xff sparc ipl 7 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 ufs filesystems /dev/rdsk/c0t3d0s5: is stable. /dev/rdsk/c0t3d0s4: is stable. /dev/rdsk/c0t3d0s7: is stable. /dev/rdsk/c0t3d0s3: is stable. checking for crash dump...System went down at Tue Jul 18 13:25:46 2000 Saving 3569 pages of image in vmcore.27 3569 pages saved. Processing modules: Done. Constructing Namelist file: /var/crash/onl50t/unix.27 Namelist file complete. add net default: gateway ICCFP1 NIS domainname is kek.jp starting rpc services: rpcbind keyserv done. Setting netmask of hme0 to 255.255.248.0 SUNW,hme1: Link Down - cable problem? Setting default interface for multicast: add net 224.0.0.0: gateway onl50t syslog service starting. Print services started. starting Kana-Kanji converters: cssd. volume management starting. Wnn6: Key License Server started.... Nihongo Multi Client Server (Wnn6 R2.30) Finished Reading Files The system is ready. onl50t console login: Kineticリスト処理でシングルアクション read の並びを実行する cam6プログラムを実行すると、CKEXEC()を実行時にフリーズし、システムは "BAD TRAP" を起こして panic、リブートしてしまう。 以前と同じ症状。 (6-2). cam6a の実行(Klist の実行) CKSAVE() でセーブされたリストを CKLOAD()で読み込んで実行する例題 プログラム。 cam6プログラムが異常終了したために CKSAVE()でうまくセーブ できなかったのでここではテストできない。 (6-3). cam7a.obj、cam7b.obj、cam7 をコンパイル & 実行(KEKリスト処理との混合) onl50t[49]% rm cam7 cam7a.lis cam7a.obj cam7b.lis cam7b.obj onl50t[50]% make cam7 cc -O cam7.c -o cam7 -I/usr/local/vme/camac/include -L/usr/local/vme/camac/lib -lcamac /usr/local/vme/camac/camasm/camasm cam7a a CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 /usr/local/vme/camac/camasm/camasm cam7b a CAMASM macro assembler V0.1 --- KEK online group --- Modified by Y.T Oct-1991 onl50t[51]% ls -l cam7* -rwxr-xr-x 1 inoue kek 14572 Jul 18 13:34 cam7* -rw-r--r-- 1 inoue kek 2021 Jul 4 13:41 cam7.c -rw-r--r-- 1 inoue kek 763 Jul 4 16:42 cam7a.asm -rw-r--r-- 1 inoue kek 1660 Jul 18 13:34 cam7a.lis -rw-r--r-- 1 inoue kek 27 Jul 18 13:34 cam7a.obj -rw-r--r-- 1 inoue kek 974 Jul 4 16:52 cam7b.asm -rw-r--r-- 1 inoue kek 1784 Jul 18 13:34 cam7b.lis -rw-r--r-- 1 inoue kek 90 Jul 18 13:34 cam7b.obj onl50t[52]% onl50t[52]% cat cam7a.obj 0004 0201 0620 0100 0000 onl50t[53]% cat cam7a.lis CAMASM macro assembler F0 1: ***************************************************************** F0 1: * cam7a.ASM 29-MAR-1992 Y.Takeuchi * F0 1: * Modified: 4-Jul-2000 E.Inoue * F0 1: * * F0 1: * camasm cam7a a * F0 1: ***************************************************************** F0 1: ;SW equ 11 ; Switch Register F0 1: SW equ 3 ; Switch Register F0 1: SCALER equ 6 ; CAMAC Scaler F0 1: ; F0 1: ; READ (0,SCALER,1) F0 1: ;; READ (0,SCALER,1) F0 1: ;; IGQ (0,SCALER,1),#3 F0 1: ;; READ (0,SCALER,1) F0 1: ;; READ (0,SCALER,1) F0 1: ;; IGQ (0,SCALER,1),#4 F0 1: ;; READ (0,SCALER,1) F0 1: ;; READ (0,SCALER,1) F0 1: ; F0 1: 0201 0620 READ (0,SW,1) F0 3: ; READ (0,SCALER,1) F0 3: ; IGQ (0,SCALER,1),#3 F0 3: ; READ (0,SCALER,1) F0 3: ; READ (0,SCALER,1) F0 3: ; IGQ (0,SCALER,1),#4 F0 3: ; READ (0,SCALER,1) F0 3: ; READ (0,SCALER,1) F0 3: ; F0 3: 0100 STOP F0 4: end onl50t[54]% onl50t[54]% cat cam7b.obj 0010 0209 062A 0201 0620 0201 0620 0329 0001 0000 0135 0201 0620 0201 0620 0100 0000 onl50t[55]% cat cam7b.lis CAMASM macro assembler F0 1: ***************************************************************** F0 1: * cam7b.ASM 29-MAR-1992 Y.Takeuchi * F0 1: * Modified: 4-Jul-2000 E.Inoue * F0 1: * * F0 1: * camasm cam7b a * F0 1: ***************************************************************** F0 1: ;SCALER equ 6 ; CAMAC Scaler F0 1: SW equ 3 ; CAMAC SW register F0 1: ; F0 1: ; NDT (9,SCALER,1) ; Clear scaler F0 1: ; READ (0,SCALER,1) ; Read scaler F0 1: ; READ (0,SCALER,1) ; Read scaler F0 1: ; MOVE #1,A ; Set Klist name to "test1" F0 1: ; LOAD TIMER ; Execute Klist F0 1: ; READ (0,SCALER,1) ; Read scaler F0 1: ; READ (0,SCALER,1) ; Read scaler F0 1: ; F0 1: 0209 062A NDT (10,SW,1) ; Clear LAM F0 3: 0201 0620 READ (0,SW,1) ; Read SW F0 5: 0201 0620 READ (0,SW,1) ; Read SW F0 7: 0329 0001 0000 MOVE #1,A ; Set Klist name to "test1" F0 A: 0135 LOAD TIMER ; Execute Klist F0 B: 0201 0620 READ (0,SW,1) ; Read SW F0 D: 0201 0620 READ (0,SW,1) ; Read SW F0 F: ; F0 F: 0100 STOP F0 10: end onl50t[56]% onl50t[56]% cam7 list length = 4 list length = 16 Now execute cam7b.obj ... Freeze CAMAC device driver V1.4x, 1991-1993 by Y.TAKEUCHI (T.I.T. ) cc0 at vme0: vme16d16 0xff00 VME level 4 vector 0xff sparc ipl 7 D TRAP: cpu=0 type=0x34 rp=0x30287738 addr=0x60e57fd2 mmu_fsr=0x0 cam7: alignment error: addr=0x60e57fd2 pid=376, pc=0x60d4ecf8, sp=0x302877c8, tstate=0x1e05, context=0x2b4 g1-g7: 6009df80, 0, f0, 7a0, 0, 0, 60ce94c0 Begin traceback... sp = 302877c8 Called from 60d4d4d4, fp=30287830, args=0 60e540d0 620 60dd40d2 4 60dd4000 Called from 60d4acf8, fp=30287898, args=0 60dd40b8 10 0 0 0 Called from 10088578, fp=30287970, args=35 302879d8 3c11 0 30287a10 60dd4000 Called from 1002ec94, fp=30287a80, args=3 3 9e58 60d0dc20 60cdccc4 9e58 Called from 11a44, fp=effeb388, args=3 22394 3 22358 effeb3d8 effeb3d4 End traceback... panic[cpu0]/thread=0x60ce94c0: trap syncing file systems... 3 done 3040 static and sysmap kernel pages 37 dynamic kernel data pages 189 kernel-pageable pages 0 segkmap kernel pages 0 segvn kernel pages 100 current user process pages 3366 total pages (3366 chunks) dumping to vp 601de2ac, offset 484070 3366 total pages, dump succeeded rebooting... Resetting ... screen not found. Can't open input device. Keyboard not present. Using ttya for input and output. FORCE,CPU-50(UltraSPARC-IIi 300MHz), No Keyboard OpenBoot 3.10.8, 256 MB memory installed, Serial #9204337. Ethernet address 0:80:42:10:2:74, Host ID: 808c7271. Executing last command: boot Boot device: disk3:a File and args: 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: hme0 hme1. Hostname: onl50t The system is coming up. Please wait. checking ufs filesystems /dev/rdsk/c0t3d0s5: is stable. /dev/rdsk/c0t3d0s4: is stable. /dev/rdsk/c0t3d0s7: is stable. /dev/rdsk/c0t3d0s3: is stable. checking for crash dump...System went down at Tue Jul 18 13:35:37 2000 Saving 3366 pages of image in vmcore.28 3366 pages saved. Processing modules: Done. Constructing Namelist file: /var/crash/onl50t/unix.28 Namelist file complete. add net default: gateway ICCFP1 NIS domainname is kek.jp starting rpc services: rpcbind keyserv done. Setting netmask of hme0 to 255.255.248.0 SUNW,hme1: Link Down - cable problem? Setting default interface for multicast: add net 224.0.0.0: gateway onl50t syslog service starting. Print services started. starting Kana-Kanji converters: cssd. volume management starting. Wnn6: Key License Server started.... Nihongo Multi Client Server (Wnn6 R2.30) Finished Reading Files The system is ready. onl50t console login: cam7プログラムは Kineticリスト処理と KEKリスト処理を混在して使う例題 プログラムである。 まず、CKADD()でシングルアクションを一回実行するリスト を 2917 のコマンドメモリに入れておく。 その後、KEKリスト処理で別のリスト をロードし、先のリストと合わせて実行するものである。 この例題では、CLEWAI()を実行時に panic、リブートしてしまった。 以前と同じ症状。 ---xxxx ここまでやった(継続中) --- (6). 項目タイトル (6-1). サブ項目タイトル (6-1-1). サブサブ項目タイトル