Oct 26, 1999 onl8v1: Solaris 7 cc ドライバのテスト. cc ドライバのデバッグ#01 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/CAMAC/ onl8v1-sol7/debug-step01.txt) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). SPARC CPU-8VT、Solaris7、VMEドライバが届いた。 (B). CPU-8VT に Solaris7 のシステムをインストールした。 (C). /etc の下の各設定、および /export/home の作成をやった。 (D). CPU-8VT に Solaris7用の VMEドライバ、FRCdrv-2.7(FRCvme v2.4.1) をインストールした。 (E). CPU-8VT(onl8v1) に ccドライバをインストールした。 "make load" を実行すると attach 時にエラーを起こす。 (2). ここでやるべきこと ccドライバプログラムをデバッグする。 "make load" を実行すると attach 時にエラーを起こす件について調べる。 (3). 症状確認(再掲) onl8v1# make load ./script/cc_load.sh [Installing CAMAC device driver] [Adding CAMAC device driver to system] drvconfig: Driver (cc) failed to attach Warning: Driver (cc) successfully added to system but failed to attach [Configuring CAMAC device driver] [Making CAMAC device files] sun4m onl8v1# ls -l /dev/cc lrwxrwxrwx 1 root other 3 Oct 14 14:49 /dev/cc -> :cc onl8v1# camac ドライバはシステムに付加されたが attach実行時に fail した。 camac スペシャル・ファイルが正しく作られていない。 "make load" コマンドを実行した時、コンソール上には次のメッセージが表示 された。 Oct 14 14:48:48 onl8v1 unix: /usr/kernel/drv/cc: undefined symbol 'spl5' Oct 14 14:48:48 onl8v1 unix: WARNING: mod_load: MT-unsafe module 'cc' rejected /var/adm/messagesファイル中の情報 : Oct 14 14:48:48 onl8v1 unix: pseudo-device: devinfo0 Oct 14 14:48:48 onl8v1 unix: devinfo0 is /pseudo/devinfo@0 Oct 14 14:48:48 onl8v1 unix: /usr/kernel/drv/cc: undefined symbol 'spl5' Oct 14 14:48:48 onl8v1 unix: WARNING: mod_load: MT-unsafe module 'cc' rejected Oct 14 14:48:58 onl8v1 unix: sysconfig0: LCA is XC4003 compatible : (4). undefined symbol 'spl5'" について調べる (4-1). spl5 使用している部分を調べる "make load" コマンドを実行した時にコンソール上に表示されたメッセージ で、"/usr/kernel/drv/cc: undefined symbol 'spl5'" に注目。 cc.cファイル 中で 'spl5'を使用している部分をチェック。 onl8v1[93]% pwd /export/home/onl8v1/inoue/CAMAC/Driver/FORCE-50T-sol2.6 onl8v1[94]% ls Makefile cam2.f camlib.o cc_common.h libcamac.a README cam3* cc cc_config.h script/ cam1* cam3.c cc.c forlib.c cam1.c camlib.c cc.conf forlib.o cam2* camlib.h cc.h k2917.h onl8v1[95]% grep spl5 * cc.c: s = spl5(); cc.c: s = spl5(); cc.c: s = spl5(); onl8v1[96]% (4-2). cc.cファイルを修正 onl8v1[96]% vi cc.c : static int cc_ioctl(dev_t dev, int cmd, int arg, int flag, cred_t *cred_p, int *rval_p) { : case CCIOC_WAIT_LAM : mutex_enter(&cc->mutex); /* start MUTEX */ cc->interrupt = 0; cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* lock out clock */ /* by E.Inoue s = spl5(); <---- すでにコメントアウトされている。 */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; return 0; } /* mutex_enter(&cc->mutex); */ /* start MUTEX */ /* E.Inoue cc->timeout_id = timeout(cc_timeout, (caddr_t)&unit, data * hz); */ cc->timeout_id = timeout(cc_timeout, (caddr_t)&unit, cc->data1 * hz); /* mutex_enter(&cc->mutex); */ /* start MUTEX */ /* wait interrupt */ /* cv_timedwait(&cc->cv, &cc->mutex, timeout); if (cc->interrupt == 0) cc->interrupt |= CC_INT_TIMEOUT; */ 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 */ /* by E.Inoue splx(s); <---- すでにコメントアウトされている。 */ : : int cc_waitint(cc) struct cc_device *cc; { int s; u_long tick, timeout; cc->interrupt = 0; cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* lock out clock */ /* E.Inoue s = spl5(); <---- コメントアウトする。 end */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; return 0; } mutex_enter(&cc->mutex); /* start MUTEX */ drv_getparm(LBOLT, &tick); #ifdef CC_SPARC_LIST_EXTENSION timeout = tick + cc->a_reg * hz; #else timeout = tick + CC_TIMEOUT_LAM * hz; #endif /* wait interrupt */ if (cv_timedwait(&cc->cv, &cc->mutex, timeout) == 0) cc->interrupt |= CC_INT_TIMEOUT; mutex_exit(&cc->mutex); /* end MUTEX */ /* E.Inoue splx(s); <---- コメントアウトする。 end */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; return 0; } else { return CC_STA_LIST_TIMEOUT; } } : : int cc_waitevent(cc) struct cc_device *cc; { int s; u_long tick, timeout; cc->interrupt = 0; cc->k->lamc = CC_INT_AUTO_CLEAR | CC_INT_ENABLE | intrpri; /* lock out clock */ /* E.Inoue s = spl5(); <---- コメントアウトする。 end */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; cc->event_count++; return 0; } mutex_enter(&cc->mutex); /* start MUTEX */ drv_getparm(LBOLT, &tick); #ifdef CC_SPARC_LIST_EXTENSION timeout = tick + cc->a_reg * hz; #else timeout = tick + CC_TIMEOUT_LAM * hz; #endif /* wait interrupt */ if (cv_timedwait(&cc->cv, &cc->mutex, timeout) == 0) cc->interrupt |= CC_INT_TIMEOUT; mutex_exit(&cc->mutex); /* end MUTEX */ /* E.Inoue splx(s); <---- コメントアウトする。 end */ if (cc->interrupt & CC_INT_LAM) { cc->interrupt &= ~CC_INT_LAM; cc->event_count++; return 0; } else { return CC_STA_LIST_TIMEOUT; } } : : "cc.c" 2933 lines, 75109 characters onl8v1[97]% spln() および splx() は Solaris2.x システムでは使えない。 すでに mutex lock を使用しているので、ここでは spln() および splx() を削除するだけで よい。 上記のようにコメントアウトした。 参考. spln() 関数は CPUレベルを n に設定する。 splx(s) 関数は CPUレベルを直前に格納してレベルに復元する。 (4-3). cc.cファイルを再コンパイル onl8v1[252]% make ./script/cc_build.sh [Building for sun4m] "cc.c", line 174: warning: initialization type mismatch "cc.c", line 945: warning: improper pointer/integer combination: arg #1 "cc.c", line 1021: warning: argument #1 is incompatible with prototype: prototype: pointer to function(pointer to void) returning void : "/usr/include/sys/systm.h", line 100 argument : pointer to function(pointer to char) returning void "cc.c", line 1021: warning: improper pointer/integer combination: op "=" "cc.c", line 1031: warning: improper pointer/integer combination: arg #1 "cc.c", line 2811: warning: argument #1 is incompatible with prototype: prototype: pointer to function(pointer to void) returning void : "/usr/include/sys/systm.h", line 100 argument : pointer to function(pointer to char) returning void "cc.c", line 2811: warning: improper pointer/integer combination: op "=" 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 onl8v1[253]% (4-4). "make load" を実行 onl8v1# make unload ./script/cc_unload.sh [Removing CAMAC device driver] [Removing CAMAC device driver from system] [Deleting CAMAC device files] onl8v1# make load ./script/cc_load.sh [Installing CAMAC device driver] [Adding CAMAC device driver to system] [Configuring CAMAC device driver] [Making CAMAC device files] sun4m onl8v1# onl8v1[253]% ls -l /dev/cc lrwxrwxrwx 1 root other 22 Oct 21 15:29 /dev/cc -> /devices15:29:11///:cc onl8v1[254]% この時、コンソール上には次のメッセージが表示された。 Oct 21 15:29:11 onl8v1 unix: CAMAC device driver V1.4x, 19 91-1993 by Y.TAKEUCHI (T.I.T.) Oct 21 15:29:11 onl8v1 unix: WARNING: cc_probe: inoue -- enter cc_attach routine drvconfig の実行時に起っていた "Driver (cc) failed to attach" は出なく なった。 /dev/cc のリンク先が何か変な感じ。 (4-5). /devices 以下のファイルをチェック onl8v1[269]% pwd /devices/iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00 onl8v1[270]% ls cc@2d,ff00:cc vmefdma@ad,0:vmefdma24d16 vmectl:vmectl vmefdma@ad,0:vmefdma24d32 vmedma@ad,0:vmedma16d16 vmefdma@ad,0:vmefdma24d8 vmedma@ad,0:vmedma16d32 vmefdma@ad,0:vmefdma24mblt vmedma@ad,0:vmedma16d8 vmefdma@ad,0:vmefdma32blt vmedma@ad,0:vmedma24blt vmefdma@ad,0:vmefdma32d16 vmedma@ad,0:vmedma24d16 vmefdma@ad,0:vmefdma32d32 vmedma@ad,0:vmedma24d32 vmefdma@ad,0:vmefdma32d8 vmedma@ad,0:vmedma24d8 vmefdma@ad,0:vmefdma32mblt vmedma@ad,0:vmedma24mblt vmeplus@ad,0:vme16d16 vmedma@ad,0:vmedma32blt vmeplus@ad,0:vme16d32 vmedma@ad,0:vmedma32d16 vmeplus@ad,0:vme16d8 vmedma@ad,0:vmedma32d32 vmeplus@ad,0:vme24blt vmedma@ad,0:vmedma32d8 vmeplus@ad,0:vme24d16 vmedma@ad,0:vmedma32mblt vmeplus@ad,0:vme24d32 vmedvma:vmedvma24 vmeplus@ad,0:vme24d8 vmedvma:vmedvma2432 vmeplus@ad,0:vme24mblt vmedvma:vmedvma32 vmeplus@ad,0:vme32blt vmefdma@ad,0:vmefdma16d16 vmeplus@ad,0:vme32d16 vmefdma@ad,0:vmefdma16d32 vmeplus@ad,0:vme32d32 vmefdma@ad,0:vmefdma16d8 vmeplus@ad,0:vme32d8 vmefdma@ad,0:vmefdma24blt vmeplus@ad,0:vme32mblt onl8v1[271]% ls -l cc* crw-rw-rw- 1 root sys 106, 0 Oct 21 15:29 cc@2d,ff00:cc onl8v1[272]% リンクが正しくできていないようだ。 システムをブートし直す。 # /usr/sbin/shutdown -i0 -g0 Shutdown started. Thu Oct 21 15:45:40 JST 1999 Do you want to continue? (y or n): y Changing to init state 0 - please wait Broadcast Message from root (console) on onl8v1 Thu Oct 21 15:45:41... THE SYSTEM onl8v1 IS BEING SHUT DOWN NOW ! ! ! Log off now or risk your files being damaged # INIT: New run level: 0 The system is coming down. Please wait. System services are now being stopped. Print services stopped. syslogd: going down on signal 15 umount: /kekfs busy The system is down. INIT: failed write of utmpx entry:"s0" INIT: failed write of utmpx entry:"fw" syncing file systems... done Program terminated Type help for more information ok ok boot -r Resetting ... screen not found. Can't open input device. Keyboard not present. Using tty for input and output. SPARC CPU-8VT, No Keyboard ROM Rev. 2.15.1, 64 MB memory installed, Serial #9172389. Ethernet address 0:80:42:b:85:a5, Host ID: 808bf5a5. Rebooting with command: -r Boot device: /iommu/sbus/espdma@5,8400000/esp@5,8800000/sd@3,0 File and args: - r SunOS Release 5.7 Version Generic_106541-06 [UNIX(R) System V Release 4.0] Copyright (c) 1983-1999, Sun Microsystems, Inc. configuring network interfaces: le0. Hostname: onl8v1 Configuring the /devices directory CAMAC device driver V1.4x, 1991-1993 by Y.TAKEUCHI (T.I.T.) WARNING: cc_probe: inoue -- enter cc_attach routine Configuring the /dev directory Configuring the /dev directory (compatibility devices) The system is coming up. Please wait. checking ufs filesystems /dev/rdsk/c0t3d0s7: is clean. NIS domainname is kek.jp starting rpc services: rpcbind keyserv done. Setting netmask of le0 to 255.255.248.0 Setting default interface for multicast: add net 224.0.0.0: gateway onl8v1 syslog service starting. Print services started. volume management starting. The system is ready. onl8v1 console login: /dev/ccスペシャルファイルをチェック。 onl8v1[33]% ls -l /dev/cc lrwxrwxrwx 1 root other 22 Oct 21 15:29 /dev/cc -> /devices15:29:1 1///:cc onl8v1[34]% NG. cc_load.shスクリプトをチェック。 onl8v1[41]% pwd /export/home/onl8v1/inoue/CAMAC/Driver/FORCE-50T-sol2.6/script onl8v1[42]% ls awk1.txt cc_build.gcc.sh* cc_link.sh* cc_unload.sh* awk2.txt cc_build.sh* cc_load.sh* onl8v1[43]% cat cc_load.sh #!/sbin/sh # # cc_load.sh 15-OCt-1993 Y.Takeuchi(T.I.T.) # # * 9-Jun-1999 E.Inoue modify for sun4u. # echo '[Installing CAMAC device driver]' cp cc /usr/kernel/drv/ cp cc.conf /usr/kernel/drv/ echo '[Adding CAMAC device driver to system]' add_drv -m '* 0666 root sys' cc echo '[Configuring CAMAC device driver]' drvconfig -r /devices echo '[Making CAMAC device files]' ARCH=`uname -m` #echo "ARCH=$ARCH" if [ $ARCH = "sun4d" ]; then echo 'sun4d' ln -s /devices/io-unit*/sbi*/sfvme*:cc /dev/cc elif [ $ARCH = "sun4m" ]; then echo 'sun4m' ./script/cc_link.sh elif [ $ARCH = "sun4c" ]; then echo 'sun4c' # ln -s /devices/sbus*/sfvme*:cc /dev/cc ln -s /devices/sbus*/sfvme@1,3ff000/cc@2d,ff00:cc /dev/cc elif [ $ARCH = "sun4u" ]; then echo 'sun4u' ./script/cc_link.sh fi onl8v1[44]% onl8v1[44]% onl8v1[44]% cat cc_link.sh #!/bin/csh # # cc_mknod.sh 18-OCT-1993 Y.Takeuchi(T.I.T.) # set CCDIR=`dmesg|grep 'cc0 is'|tail -1|awk '{print $3}'|awk -f script/awk1.txt` set CCNAM=`dmesg|grep 'cc0 is'|tail -1|awk '{print $3}'|awk -f script/awk2.txt` #set CCMAJOR = `modinfo | grep CAMAC | awk ' {print $4}'` echo "CCDIR=${CCDIR}" echo "CCNAM=${CCNAM}" #echo ${CCMAJOR} #mkdir -p ${CCDIR} #cd ${CCDIR} #mknod ${CCNAM} c ${CCMAJOR} 0 #chmod 666 ${CCNAM} if (${CCNAM} == "")then ln -s ${CCDIR}:cc /dev/cc else ln -s ${CCDIR}/${CCNAM}:cc /dev/cc endif onl8v1[45]% dmesgコマンドを実行。 onl8v1# dmesg Thu Oct 21 16:13:14 JST 1999 Oct 21 15:47:30 onl8v1 unix: , Oct 21 15:47:30 onl8v1 unix: SBus level 4 : Oct 21 15:47:35 onl8v1 unix: le1 is /iommu@0,10000000/sbus@0,10001000/ledma@5,84 00050/le@5,8c00040 : Oct 21 15:47:56 onl8v1 unix: cc0 is /iommu@0,10000000/sbus@0,10001000/VME@5,ffff e00/cc@2d,ff00 : onl8v1# Solaris2.6 が動作しているマシン上で dmesgコマンドを実行。 onlsun1[35]% dmesg Oct 21 16:15 SunOS Release 5.6 Version Generic [UNIX(R) System V Release 4.0] : le0 is /iommu@f,e0000000/sbus@f,e0001000/ledma@f,400010/le@f,c00000 : onlsun1[36]% Solaris7 では dmesgコマンドの実行出力には、各行の先頭部に日付けと時刻 が付加されている。 このために、dmesgコマンドの出力を元にして作った /dev/ccファイルが正しく作られなかったようだ。 (4-6). cc_link.shスクリプトを修正する onl8v1[146]% pwd /export/home/onl8v1/inoue/CAMAC/Driver/FORCE-50T-sol2.6/script onl8v1[147]% ls awk1.txt cc_build.sh* cc_load.sh* t1.sh* awk2.txt cc_link.sh* cc_unload.sh* t2.sh* cc_build.gcc.sh* cc_link.sh-org* t.sh* onl8v1[148]% vi cc_link.sh #!/bin/csh # # cc_mknod.sh 18-OCT-1993 Y.Takeuchi(T.I.T.) # set SYS57 = "5.7" set SYSNL = `uname -sr` if ( $SYSNL[2] == $SYS57 )then set CCDIR=`dmesg|grep 'cc0 is'|tail -1|awk '{print $8}'|awk -f script/awk1.txt` set CCNAM=`dmesg|grep 'cc0 is'|tail -1|awk '{print $8}'|awk -f script/awk2.txt` else set CCDIR=`dmesg|grep 'cc0 is'|tail -1|awk '{print $3}'|awk -f script/awk1.txt` set CCNAM=`dmesg|grep 'cc0 is'|tail -1|awk '{print $3}'|awk -f script/awk2.txt` #set CCMAJOR = `modinfo | grep CAMAC | awk ' {print $4}'` endif #echo "CCDIR=${CCDIR}" #echo "CCNAM=${CCNAM}" #echo ${CCMAJOR} #mkdir -p ${CCDIR} #cd ${CCDIR} #mknod ${CCNAM} c ${CCMAJOR} 0 #chmod 666 ${CCNAM} if (${CCNAM} == "")then ln -s ${CCDIR}:cc /dev/cc else ln -s ${CCDIR}/${CCNAM}:cc /dev/cc endif onl8v1[149]% (4-7). "make load" を実行する onl8v1# pwd /export/home/onl8v1/inoue/CAMAC/Driver/FORCE-50T-sol2.6 onl8v1# ls -l /dev/cc /dev/cc: No such file or directory onl8v1# make load ./script/cc_load.sh [Installing CAMAC device driver] [Adding CAMAC device driver to system] Driver (cc) is already installed. [Configuring CAMAC device driver] [Making CAMAC device files] sun4m onl8v1# ls -l /dev/cc lrwxrwxrwx 1 root other 69 Oct 22 10:01 /dev/cc -> /devices/iommu@0,10000000/sbus@0,10001000/VME@5,ffffe00/cc@2d,ff00:cc onl8v1# ok. /dev/ccスペシャルファイルは正しく作られた。 ---xxxx ( ここまでやった 継続中) --- (6). セクション (6-1). サブセクション (6-1-1). サブサブセクション