Nevada b99 にしたので、 myk driver を build し直そうと思い ON Consolidation を取りにいってみると ON Consolidation 20081006 がリリースされていたので、これを使ってみようかと。
http://dlc.sun.com/osol/on/downloads/20081006/download 後、archive を展開して、Makefile.confgi の ONUTSDIR に ON Consolidationの PATH を設定して、何も考えずに make を実行
$ makeん?なんか、error で止まったよ?いままで、そんなことなかったのに・・・
gcc -c -O3 -D__INLINE__=inline -DGEM_GCC_RUNTIME -ffreestanding -U_NO_LONGLONG -D_KERNEL -U_ASM_INLINES -D_SYSCALL32 -D_SYSCALL32_IMPL -Dsun -D__sun -D__SVR4 -DC2_AUDIT -Wall -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare -Wno-parentheses -Wno-uninitialized -Wno-implicit-function-declaration -Wno-unused -Wno-trigraphs -Wno-char-subscripts -Wno-switch -Wno-format -Werror -Di86pc -DDEBUG -DDEBUG_LEVEL=1 -UGEM_DEBUG_LEVEL -I/export/onnv/usr/src/uts/common -DGEM_CONFIG_POLLING -DGEM_CONFIG_GLDv3 -DGEM_CONFIG_VLAN_HW -DGEM_CONFIG_CKSUM_OFFLOAD -DSOLARIS10 -Unotdef -UNEVER -UGEM_GCC_RUNTIME -UGEM_COMPAT -USANITY -UGEM_CONFIG_FMA -UMODULE -UGEM_CONFIG_RX_DIRECT -DGEM_CONFIG_TX_DIRECT -UOS_PUTBACK -UCONFIG_CKSUM_OFFLOAD -UCONFIG_LSO -DCONFIG_VLAN_HW -DVERSION='"2.6.2"' myk_gem.c -o i386/myk_gem.o
myk_gem.c:3519:28: macro "DDI_DEFINE_STREAM_OPS" requires 10 arguments, but only 9 given
myk_gem.c:3518: warning: type defaults to `int' in declaration of `DDI_DEFINE_STREAM_OPS'
myk_gem.c:3518: warning: data definition has no type or storage class
myk_gem.c:3598: error: `myk_ops' undeclared here (not in a function)
myk_gem.c:3598: error: initializer element is not constant
myk_gem.c:3598: error: (near initialization for `modldrv.drv_dev_ops')
*** Error code 1
make: Fatal error: Command failed for target `i386/myk_gem.o'
しかも、みたくない keyword が出てる気が・・・
myk_gem.c:3519:28: macro "DDI_DEFINE_STREAM_OPS" requires 10 arguments, but only 9 givenき、きた。きたよ DDI。
DDI という文字列見た瞬間、いつもなら、
DDI があらわれた!なのですが、今回は、
さとうはにげだした!
DDI があらわれた!こんな感じ。
さとうはにげだせなかった!
DDI のこうげき!
DDI のクリティカルヒット!
DDI のこうげきで 65535 ダメージ!
さとうはしんでしまった....
でも、メッセージをよく読むと、DDI_DEFINE_STREAM_OPS macro には 10個の argument が必要なんだけど、9 個しかないお?なんなの?しn(ry
って書いてありますね。リレイズかけてなかったけど、近くに Pixie がいるので、放置してたらもしかしたらレイズくれるかもくらいの感じですか(意味不明 (´∀`*)
で、myk_gem.c の問題の箇所を見てみると・・・
こんなんなってます。
#ifdef GEM_CONFIG_GLDv3GLDv3 対応させると使われる macro のようですね。
DDI_DEFINE_STREAM_OPS(myk_ops, nulldev, nulldev, mykattach, mykdetach,
nodev, NULL, D_MP, NULL);
でもって、9 個ですね。10 個にしないといけないのですが、どこに追加すればいいかわからない。
とりあえず、cvs.opensolaris.org で調べてみる。
keyword は、DDI_DEFINE_STREAM_OPS です。
みっけ。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/sys/devops.h#420この macro は、devops.h で定義されており history で見比べてみると、最後に XXquiesce ってものが追加されてますね。コメントには、PSARC 2008/382 Fast Reboot とあります。
#define DDI_DEFINE_STREAM_OPS(XXname, XXidentify, XXprobe, XXattach, XXdetach, XXreset, XXgetinfo, XXflag, XXstream_tab, XXquiesce) \
Fast Reboot 関連の追加変更が発生したのでしょうか。
よくわかりません(´・ω・`)
とにかく、最後に何か追加すればいいのですね!というわけで、myk_gem.c の問題箇所の最後に NULL を追加し、10 個にしてみるとめでたく myk driver が build できました。
動作も特に問題なく。
【やったー!】
でも、NULL オチだとちょっと悲しいので、もう少し調べてみました。
他の driver 類はどうなってるのかなと?適当な driver 名(rge とか nge とか)と DDI_DEFINE_STREAM_OPS を key に検索開始。
rge driver でみっけ。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/rge/rge_main.cなんか、rge_quiesce とかになってますね。nge とかでは、nge_quiesce となってたり。
DDI_DEFINE_STREAM_OPS(rge_dev_ops, nulldev, nulldev, rge_attach, rge_detach, nodev, NULL, D_MP, NULL, rge_quiesce);
rge_quiesce をおっかけると、quiesce(9E) なんて keyword とコメントに遭遇。
/*man -s 9E quiesce してみると、 device の interrupt 生成を抑止するための機能みたい。
1905 * quiesce(9E) entry point.
1906 *
1907 * This function is called when the system is single-threaded at high
1908 * PIL with preemption disabled. Therefore, this function must not be
1909 * blocked.
1910 *
1911 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
1912 * DDI_FAILURE indicates an error condition and should almost never happen.
1913 */
( ´_ゝ`)フーンって感じ(わかってない)でやり過ごし、その他、 murayama-san's driver である sfe (DP83815/DP83816/SiS900 Fast Ethernet MAC driver for Solaris) が統合されているので、そちらを見てみる。
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/sfe/sfe.cこちらでは、最後に ddi_quiesce_not_supported がついてますね。
2297 DDI_DEFINE_STREAM_OPS(sfe_ops, nulldev, nulldev, sfeattach, sfedetach,
2298 nodev, NULL, D_MP, NULL, ddi_quiesce_not_supported);
さらに、ddi_quiesce_not_supported をたどっていくと、
http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/os/sunddi.c#ddi_quiesce_not_supportedとのことで、DDI_FAILURE を返すのでつね。
8926 * Initialization function for drivers that should implement quiesce()
8927 * but haven't yet.
8928 */
8929 /* ARGSUSED */
8930 int
8931 ddi_quiesce_not_supported(dev_info_t *dip)
8932 {
8933 return (DDI_FAILURE);
8934 }
というわけで、quiesce に対応しているかどうかもわからないし、sfe driver も ddi_quiesce_not_supported になってるので、myk driver でも NULL ではなく ddi_quiesce_not_supported を追加することで探索を断念しました。
で、PSARC 2008/382 Fast Reboot ですが、これは、Nevada build 100 で追加される機能のようです。
PSARC 2008/382 Fast Rebootん?じゃ、ddi_quiesce_not_supported をセットした driver が存在すると、Fast Reboot 使えないのかな。。。
http://www.opensolaris.org/os/community/arc/caselog/2008/382/mail
あう(´・ω・`)
