日記 (2008年06月)。
$Id: 200806.php,v 1.43 2012/01/27 07:02:11 isaki Exp $

2008/06/01 (日)
◎ [NetBSD/x68k] お勉強中メモ。 先週の (5/24の日記) は一部嘘。 x68k は sys/spl.h を include してない port なので、 spl*() はあのマクロではなく x68k/include/intr.h で自前で以下のように定義してある。 紛らわしいよう。
sys/arch/x68k/include/intr.h
     40 #define splsoftbio()    splraise1()
     41 #define splsoftclock()  splraise1()
     42 #define splsoftnet()    splraise1()
     43 #define splsoftserial() splraise1()
     44 #define splvm()         splraise5()
     45 #define splsched()      spl7()
     46 #define splhigh()       spl7()
なので、spl*() 関数の呼び出しでは makeiplcookie() + splraiseipl() は 呼ばれない。 ただし、makeiplcookie() は kern_mutex.c あたりから 呼ばれているので、こっちはこっちで必要。 でもって、splraiseN() は _splraise() へのマクロであり、 splraiseipl() は _splraise() を呼び出すので、両者の動作は一緒。
◎ [NetBSD/x68k] IPL_* について m68k 以外の port も眺めてみたけど、 わりと埓があかなさげ。 列挙型として使ってる port と、割り込みレベルか何かの意味付けを してると思われる (中身までは確認してない) port がざっと半々。 こういう時は MD 部分の対応指針みたいなのを示してほしいなあ。 あ、過去ログはまだ読んでないな…。 てめえ (MD) の事情に合わせて好きにしろやって言われると結局 どっちに向けて揃えていいんだか分からなくて、 しかもこんだけ port の数があるとなるべく揃えておかないと 大変だと思うんだけど。 エロい人は別にそんなこと大変じゃないから気にならないっていうあれだな。orz
◎ [NetBSD/x68k] ああ、それはそうと、カーネルが無事起動してる間に device_t だか aprint だかその辺もやっとかないと…。 もうちょい休みほすぃ。← おかしいな、休日のはずなんだが…
◎ [NetBSD/x68k] お勉強中メモ。 x68k の makeiplcookie() をインライン化するかどうかにあたり、 m68k の makeiplcookie() と ipl2psl_table[] の実装の違いを調べてみた。
port makeiplcookie() の場所 inline か 変換表の場所 変換表の型 変換表の名前 PSL_S を OR する場所
amigainclude/intr.hYmachdep.cintipl2spl_table表の中
cesficinclude/intr.hYisr.cintipl2spl_table表の中
luna68kinclude/intr.hYisr.cintipl2spl_table表の中
hp300include/intr.hYintr.cu_shorthp300_ipl2psl表の中
mac68kinclude/intr.hYintr.cu_shortmac68k_ipls表の中
atariatari/intr.cNintr.cintipl2psl_tablemakeiplcookie() の中
mvme68kmvme68k/machdep.cNmachdep.cintipl2psl_tablemakeiplcookie() の中
news68knews68k/isr.cNisr.cintipl2psl_tablemakeiplcookie() の中
next68knext68k/isr.cNisr.cintipl2psl_tablemakeiplcookie() の中
sun68ksun68k/isr.cNisr.cintipl2psl_tablemakeiplcookie() の中
x68kx68k/machdep.cNmachdep.cintipl2psl_tablemakeiplcookie() の中
3グループあるっぽい。 基本的には makeiplcookie() がインライン関数になっていれば 当然 makeiplcookie() の定義は include/intr.h にあるし、 PSL_S を OR するのも最初から ipl2psl_table[] の中に書いておくし、 ということか。 ただし、hp300 と mac68k という老舗組 (知らんけど) だけ微妙に雰囲気が違う、と。 で、残りは makeiplcookie() がインライン関数になってない組。 背景までは調べてないけど。

じゃー、インライン化する場合は x68k は amiga あたりに近づければええんかいな。 表の名前も ipl2psl_table[] から ipl2spl_table[] に 変えんといけんのかな。

◎ [NetBSD/x68k] はぅん、ipl_cookie_t の中身も違うのか…。
port メンバの名前 そいつの持ってる値
amiga_iplIPL
cesfic_iplIPL
luna68k_splPSL
hp300_pslPSL
mac68k_iplIPL
atari_pslPSL
mvme68k_pslPSL
news68k_pslPSL
next68k_pslPSL
sun68k_pslPSL
x68k_pslPSL
makeiplcookie() は IPL_* をそのままスルーして splraiseipl() で PSL に変換するグループ(水色) と、 makeiplcookie() で PSL に変換しておいて splraiseipl() のほうはスルーするグループ(背景色なし) とがあって、 インライン化されてるかどうかとは関係なさげ。 さらに luna68k だけネーミングルールが違うぉ。 相変わらず、どうしたらええんじゃ、これ。

2008/06/02 (月)
◎ Firefox はソフトウェアの更新を HTTPS で確認してるっぽいんだけど、 ウィルスバスターと Norton は定義ファイルの更新を HTTP (と FTP) で 確認してるっぽい。えーっと?

2008/06/04 (水)
◎ [カープ] 北海道での日ハム戦でダルビッシュと対戦 (試合は 4-2 で勝ち)。 ダルビッシュを市民球場で見たいがために登板日は 4月末から毎週のようにチェックしていて、 ダルビッシュはずっと中6日、毎週水曜日。 そして今日も投げたので 18日(水) の市民球場はそろそろ当確か。 そして、 会社でも家でもわりとみんなそわそわし始めた感じ。 義妹までどうやって会社休もうかとか言うてた。

2008/06/07 (土)
◎ [NetBSD/x68k] makeiplcookie() と splraiseipl() のどっちが ipl2psl_table[] の 変換をするかは、makeiplcookie() でやるのが本来みたいだな。 splraiseipl() に IPL_* → PSL_* 変換を 混ぜちゃうと m68k だと無駄っぽいからってんで makeiplcookie() に 分離したみたい。 そういや筒井さんにこないだそう言われてたな。 やっと意味が分かったよ。orz
◎ [NetBSD/x68k] splraiseipl() 付近の最適化され具合を アセンブリソースを眺めて遊んでみる。 呼び出し方にはたぶん以下の3つのパターンがあると思うので (いや、よう知らんけど)、色分けして対応をとってみる。
int
test(int ipl)
{
       int s;
       volatile ipl_cookie_t cookie;

       s = splvm();
       cookie = makeiplcookie(ipl);
       splraiseipl(cookie);
       return s;
}
まずは現状。特に makeiplcookie() の呼び出しがあほみたいに効率悪げ。
/* include/intr.h */
#define splsoftbio()    splraise1()
#define splsoftclock()  splraise1()
#define splsoftnet()    splraise1()
#define splsoftserial() splraise1()
#define splvm()         splraise5()
#define splsched()      spl7()
#define splhigh()       spl7()

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}
---
/* x68k/machdep.c */
static const int ipl2psl_table[] = {
       [IPL_NONE]       = PSL_IPL0,
       [IPL_SOFTBIO]    = PSL_IPL1,
       [IPL_SOFTCLOCK]  = PSL_IPL1,
       [IPL_SOFTNET]    = PSL_IPL1,
       [IPL_SOFTSERIAL] = PSL_IPL1,
       [IPL_VM]         = PSL_IPL5,
       [IPL_SCHED]      = PSL_IPL7,
};

ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl2psl_table[ipl] | PSL_S};
}
test:
       link.w %fp,#-8
       move.l %d3,-(%sp)
       move.l %d2,-(%sp)
       movw %sr,%d3
       cmp.w #((PSL_S|PSL_IPL5)-1),%d3
       jbhi .L87
       movw #(PSL_S|PSL_IPL5),%sr
.L87:

       move.l 8(%fp),-(%sp)
       lea (-6,%fp),%a0
       jbsr makeiplcookie
       move.w -6(%fp),-2(%fp)

       move.w -2(%fp),%d0
       and.l #65535,%d0
       movw %sr,%d2
       
addq.l #4,%sp
       cmp.w #((PSL_S|PSL_IPL7)-1),%d0
       jbhi .L89
       cmp.w %d0,%d2
       jbcc .L91
.L89:
       movw %d0,%sr
.L91:

       move.l %d3,%d0
       move.l -16(%fp),%d2
       move.l -12(%fp),%d3
       unlk %fp
       rts

makeiplcookie:
       pea (%fp)
       move.l %sp,%fp
       move.l 8(%fp),%d0
       lea ipl2psl_table,%a1
       move.l (%a1,%d0.l*4),%d0
       or.w #8192,%d0
       move.w %d0,(%a0)
       unlk %fp
       rts
とりあえず、素直にインラインにしてみた。 ここだけ見るとなんか makeiplcookie() をインラインにしない理由はなさげ。 makeiplcookie() を呼び出してスタック云々とか言ってる 間に、テーブルの演算くらい終わるよな。 そして、PSL_S を OR する演算が明らかに無駄。 あとほんとは _splraise() の引数も int じゃなくて uint16_t にして ほしい勢いだが。
/* include/intr.h */
static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl2psl_table[ipl] | PSL_S};
}

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}

#include <sys/spl.h>
---
/* x68k/machdep.c */
const int ipl2psl_table[] = {
       [IPL_NONE]       = PSL_IPL0,
       [IPL_SOFTBIO]    = PSL_IPL1,
       [IPL_SOFTCLOCK]  = PSL_IPL1,
       [IPL_SOFTNET]    = PSL_IPL1,
       [IPL_SOFTSERIAL] = PSL_IPL1,
       [IPL_VM]         = PSL_IPL5,
       [IPL_SCHED]      = PSL_IPL7,
};
test:
       link.w %fp,#-4
       move.l %d3,-(%sp)
       move.l %d2,-(%sp)

       move.l #PSL_S,%d1
       | 22 = (PSL_IPL5 * 4) + 2
       or.w ipl2psl_table+22,%d1
       movw %sr,%d3
       cmp.w #((PSL_S|PSL_IPL7)-1),%d1
       jbhi .L22
       cmp.w %d1,%d3
       jbcs .L22
.L24:

       move.l 8(%fp),%d0
       lea ipl2psl_table,%a0
       move.l (%a0,%d0.l*4),%d0
       or.w #PSL_S,%d0
       move.w %d0,-2(%fp)

       move.w -2(%fp),%d0
       | ここが _splraise(int) の int。
       and.l #65535,%d0
       movw %sr,%d2
       cmp.w #((PSL_S|PSL_IPL7)-1),%d0
       jbhi .L25
       cmp.w %d0,%d2
       jbcc .L27
.L25:
       movw %d0,%sr
       jbra .L27
.L22:
       movw %d1,%sr
       jbra .L24

.L27:
       move.l %d3,%d0
       move.l (%sp)+,%d2
       move.l (%sp)+,%d3
       unlk %fp
       rts
それを踏まえてもうちょい最適化。
/* include/intr.h */
static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
}

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}

#include <sys/spl.h>
---
/* x68k/machdep.c */
const uint16_t ipl2psl_table[] = {
       [IPL_NONE]       = PSL_S | PSL_IPL0,
       [IPL_SOFTBIO]    = PSL_S | PSL_IPL1,
       [IPL_SOFTCLOCK]  = PSL_S | PSL_IPL1,
       [IPL_SOFTNET]    = PSL_S | PSL_IPL1,
       [IPL_SOFTSERIAL] = PSL_S | PSL_IPL1,
       [IPL_VM]         = PSL_S | PSL_IPL5,
       [IPL_SCHED]      = PSL_S | PSL_IPL7,
};
test:
       link.w %fp,#-4
       move.l %d3,-(%sp)
       move.l %d2,-(%sp)
       clr.l %d1
       | 10 = (PSL_IPL5 * 2)
       move.w ipl2psl_table+10,%d1
       movw %sr,%d3
       cmp.w #((PSL_S|PSL_IPL7)-1),%d1
       jbhi .L22
       cmp.w %d1,%d3
       jbcs .L22
.L24:

       move.l 8(%fp),%d0
       lea ipl2psl_table,%a0
       move.w (%a0,%d0.l*2),%d0
       move.w %d0,-2(%fp)

       move.w -2(%fp),%d0
       | これだけ無駄なんだよなあ
       and.l #65535,%d0
       movw %sr,%d2
       cmp.w #((PSL_S|PSL_IPL7)-1),%d0
       jbhi .L25
       cmp.w %d0,%d2
       jbcc .L27
.L25:
       movw %d0,%sr
       jbra .L27
.L22:
       movw %d1,%sr
       jbra .L24

.L27:
       move.l %d3,%d0
       move.l (%sp)+,%d2
       move.l (%sp)+,%d3
       unlk %fp
       rts
番外。そもそも IPL_* が重複していいんなら、 こんくらいしちゃえって感じもしなくはないが…。
/* include/intr.h */
#define IPL_NONE       (PSL_S | PSL_IPL0)
#define IPL_SOFTBIO    (PSL_S | PSL_IPL1)
#define IPL_SOFTCLOCK  (PSL_S | PSL_IPL1)
#define IPL_SOFTNET    (PSL_S | PSL_IPL1)
#define IPL_SOFTSERIAL (PSL_S | PSL_IPL1)
#define IPL_VM         (PSL_S | PSL_IPL5)
#define IPL_SCHED      (PSL_S | PSL_IPL7)
#define IPL_HIGH       (PSL_S | PSL_IPL7)

static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl};
}

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}

#include <sys/spl.h>
test:
       link.w %fp,#-4
       move.l %d3,-(%sp)
       move.l %d2,-(%sp)
       movw %sr,%d3
       cmp.w #((PSL_S|PSL_IPL5)-1),%d3
       jbhi .L22
       movw #(PSL_S|PSL_IPL5),%sr
.L22:

       clr.l %d0
       move.w 10(%fp),%d0
       move.w %d0,-2(%fp)

       move.w -2(%fp),%d0
       and.l #65535,%d0
       movw %sr,%d2
       cmp.w #((PSL_S|PSL_IPL7)-1),%d0
       jbhi .L24
       cmp.w %d0,%d2
       jbcc .L26
.L24:
       movw %d0,%sr
.L26:

       move.l %d3,%d0
       move.l (%sp)+,%d2
       move.l (%sp)+,%d3
       unlk %fp
       rts
まあそれはさておき、比較すんの忘れたけど、sys/spl.h 使う 方法に変えると、splhigh() が単なる spl7() から splraise7() 相当に 変わるのでちょいと無駄な気はするなあ。 makeiplcookie() だけインライン化して、sys/spl.h を include せず 従来通り splhigh() とかは x68k/include/intr.h で define した ままにするっていうのが最強コンビだけど、それじゃ分かりにくいし。

2008/06/08 (日)
◎ [NetBSD/x68k] と思ったけど、mac68k 以外 (の m68k) は sys/spl.h を include してないんだったな。 ていうか、 sys/spl.h を使うっていう話と makeiplcookie() のインライン化ていう話は、 別なのな…。今ごろ気付いたよ。 てことで全部の間をとってこんな感じか。
/* include/intr.h */
#define splsoftbio()    splraise1()
#define splsoftclock()  splraise1()
#define splsoftnet()    splraise1()
#define splsoftserial() splraise1()
#define splvm()         splraise5()
#define splsched()      spl7()
#define splhigh()       spl7()

extern const int ipl2psl_table[];

static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
}

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}

---
/* x68k/machdep.c */
const int ipl2psl_table[] = {
       [IPL_NONE]       = PSL_S | PSL_IPL0,
       [IPL_SOFTBIO]    = PSL_S | PSL_IPL1,
       [IPL_SOFTCLOCK]  = PSL_S | PSL_IPL1,
       [IPL_SOFTNET]    = PSL_S | PSL_IPL1,
       [IPL_SOFTSERIAL] = PSL_S | PSL_IPL1,
       [IPL_VM]         = PSL_S | PSL_IPL5,
       [IPL_SCHED]      = PSL_S | PSL_IPL7,
};
しかし、これじゃあ、新しい亜種を増やしてしまうだけなので、 仕方ないので port-m68k@ あたりに聞いてみる。 誰でもいいのであの英語を解読してくれればいいけど。 [6/23 の日記へ続く]

2008/06/09 (月)
◎ [カープ] ソフトバンク戦。ルイスだったのでさくっと 6-1 で快勝。
◎ [Perfume] 昨日録画しといた NHK 渋谷エコライブの Perfume を見る。 ポリリズム、B.c.L. の他は 「ジェニーはご機嫌ななめ」と「チョコレイト・ディスコ」。 いい選曲だ。でもジェニーのあーちゃんコールは新コールに 混じって古参コールが聞こえてたので、あれはちょっと 後味悪いなあ。どっちでもいいけど統一しようよ。 あと、決めポーズを決めてる人を映せてないというぐだぐだな カメラ割りだったのが残念。 絶対スイッチャさんは打ち合わせもリハもしてないよな、あれは。

2008/06/10 (火)
◎ ぷっすまにゆかりん(福井裕佳梨)が出てた。 地上波で動くゆかりんを見たのはほんとに何年ぶりかしらん。 いつ見てもカワユス。

2008/06/11 (水)
◎ [アニメとか] アニメ (ストラトスフォー・アドヴァンス) の中の ニュース番組のシーンに、 新防衛システムの解説役として岡部いさくが出てきて、 アフレコも本人がやってて、なんか妙にテンションが上がってしまった。 いや、そういうディテールの追求の仕方というところで。
◎ 最近の NEWS23 は天気予報の CM 前に岡山さんに寄るシーンが 増えてきた。さすが分かってらっしゃる。(何

2008/06/12 (木)
◎ マイコン方面に手を出してみようと思い、AVR の本を買ってみた。 なかなか面白げ。

2008/06/14 (土)
◎ 月曜までにはやらなくていいと思ってた仕事が昨日になって 月曜までに出来てないといけないことが分かって、休日出勤中…。

2008/06/15 (日)
◎ [NetBSDとか] nozaki さんところ (めもがき:2008年6月6日分の下のほう) より。 <sys/gcq.h> は拙作の slhci(4) を 跡形なく書き直してくれた外人さんがその時一緒に創作したもの。 辺境の一デバイスドライバのために sys にヘッダファイル置くのも どうなん? ていう気もしたんだけども、 この辺ポリシーはワカンネ (ぉ。 あと queue とか list とかのアルゴリズムももっとワカンネ(コラ。 てことでわたくし無関係ではないのですがぐだぐだです。すみませそ。
◎ [航空] てことで、日曜だっつーのに夕方の飛行機で東京へ前入り。 広島空港で、搭乗予定の機体の到着が羽田空港混雑により 15分遅れたため 出発も5分遅れる。 で飛行機に乗ったら今度は、羽田空港混雑で羽田行きの離陸が制限されてる ということでしばらく離陸待ち。 ほー、着陸地の事情で離陸制限てのは初体験。 この時間に東京向きに乗ることは滅多にないからだけど。 しかし、羽田空港ってどんな状態だよ (きっちり2分ごとに1機が着陸する状態)。 D 滑走路マダー☆チンチン (他人事)。

2008/06/16 (月)
◎ [お天気] 東京駅朝9時発の東北新幹線。 今 6月なんだけど、山頂は雪なん?
◎ しかしあれだな、どれだけ準備しても 現地作業が何の問題もなく終わることって皆無だな。 それでもまあ想定の範囲内には終わって東京に夜9時頃には 帰ってこれた。 激眠たい。

2008/06/17 (火)
◎ 朝8時すぎ発の飛行機で広島に帰還。死ぬほど眠たい。
◎ [カープ] つーかダルビッシュの先発は完全に明日だと踏んで、 みんなで見に行く予定にしてたのが外れたので、朝から大騒ぎ。
◎ [カープ] で、日ハム戦。
会社の姉さんと内野で観戦。 こっちは ダルビッシュとは関係なく、1ヶ月以上前からえぷ氏のコネクションで チケットを貰っていたので、まあそれがダルビッシュに当たったのは それはそれで運がいいというか。
3回表だったかな、7時くらいなので、 もうただのデジカメ (Panasonic FX-9) では 明るさが足りないし、ピントも合わない。 写真はもちろんばりばりにトリミング。
マジ写真は撮れないのでネタ写真。 ネクストバッターで準備するダルビッシュを携帯で撮ろうと 群がる人の図。

試合のほうは 5点負けてる8回裏に連打で4点返すものの、結局 8-7 で負け。


2008/06/18 (水)
◎ [カープ] 今日の日ハム戦は見にいかなかったら、 前田健太が7回までノーヒットノーランていう快投で プロ初勝利。

ダルビッシュのプロ初登板は3年前の札幌ドームでの広島戦で、 8回まで 0点に抑えられてて、あわやプロ初登板・初先発・初完投・初完封勝利 ていう「役の名前長いよ」みたいなことに なりかけたところ、9回に新井と野村のソロホームラン2本で ダルビッシュをマウンドから降ろして、初完封も初完投も防いだという 苦い想い出(?) がある (2005/06/15 の日記参照)。

前田健太は2年目だし初登板でもないけども、8回無失点。 9回は永川にマウンドを譲ったからこちらも初完封でも初完投でも なかったけど、7回3アウトまでノーヒットノーランだから十分 借りは返せたんじゃないかしら。


2008/06/21 (土)
◎ [カープ] 楽天戦。雨で中止。立町まで行ったんだけどなあ。
◎ [Perfume] うぉっ。 かしゆかハァハァ。 広島での放送マダー。

2008/06/22 (日)
◎ [カープ] 楽天戦。
今日の中継は NHK。 二階席のカメラさん、えらい恐いところにおるんだけど…。
楽天の先発は岩隈だったけど6回まで投げて、7回からは リリーフで田中 (マー君) が出てきた。これはうひょー。 カープなんか相手に 岩隈 - 田中という日本代表候補先発クラスの豪華リレーが見れるとは。 田中は明日の先発だと予想してたのでこれはラッキー。

写真は外野席から光学3倍ズームで撮った写真をトリミングして この大きさにしたものなので、デジタル 8.8倍ズーム (合計 11.8倍) 相当になるんかな。

試合のほうは 3-1 で完敗。ルイスの調子が悪かったのもあるけど、 岩隈 - 田中のリレーじゃ1点取れただけでよしとするしか。 田中のプロ初リリーフ、プロ初セーブの試合が見れたので まあそれはそれでいいか。

◎ [カープ] 交流戦は上位4チームが残り1試合ずつ残して同率1位。 しかもその4チーム同士の対戦ていう、すごい確率。 日ハム - 阪神戦で日ハムが勝つと去年の順位により自力優勝だが、 日ハムが負けてしまい、ソフトバンク - 巨人戦の勝者が優勝、 引き分けると阪神が優勝っていう、これまたすごい状況で、 ソフトバンク - 巨人は 8回裏まで 2-2 の同点ていう 漫画の中でしか見たことないようなシチュエーション。 結局9回表にソフトバンクが1点勝ち越して、優勝。 ありえねー。

2008/06/23 (月)
◎ [NetBSD/x68k] [元ネタ (6/08)]。 やっと時間がとれたので、splraiseipl(9) を m68k 間で揃える話の続き。 port-m68k に質問投げかけてみた結果、以下のようにするべかということに。 筒井さんがいくつかの port はすでに commit されてるので、 x68k 部分も書いて commit。
/* include/intr.h */
#define splsoftbio()    splraise1()
#define splsoftclock()  splraise1()
#define splsoftnet()    splraise1()
#define splsoftserial() splraise1()
#define splvm()         splraise5()
#define splsched()      spl7()
#define splhigh()       spl7()

#define IPL_NONE        0
#define IPL_SOFTCLOCK   1
#define IPL_SOFTBIO     2
#define IPL_SOFTNET     3
#define IPL_SOFTSERIAL  4
#define IPL_VM          5
#define IPL_SCHED       6
#define IPL_HIGH        7
#define NIPL            8

extern const uint16_t ipl2psl_table[NIPL];

static inline ipl_cookie_t
makeiplcookie(ipl_t ipl)
{
       return (ipl_cookie_t){._psl = ipl2psl_table[ipl]};
}

static inline int
splraiseipl(ipl_cookie_t icookie)
{
       return _splraise(icookie._psl);
}
---
/* x68k/machdep.c */
const uint16_t ipl2psl_table[NIPL] = {
       [IPL_NONE]       = PSL_S | PSL_IPL0,
       [IPL_SOFTBIO]    = PSL_S | PSL_IPL1,
       [IPL_SOFTCLOCK]  = PSL_S | PSL_IPL1,
       [IPL_SOFTNET]    = PSL_S | PSL_IPL1,
       [IPL_SOFTSERIAL] = PSL_S | PSL_IPL1,
       [IPL_VM]         = PSL_S | PSL_IPL5,
       [IPL_SCHED]      = PSL_S | PSL_IPL7,
       [IPL_HIGH]       = PSL_S | PSL_IPL7,
};
◎ [NetBSDとか] atari、next68k、mvme68k は x68k と同じグループで 単純な変更だけで済むはずなのでさくっと書いてみる。 amiga と luna68k はちょっと面倒くさげ。
◎ [NetBSDとか] m68k 界隈は筒井さんのパッチのおかげで 2週間ぶりに -current の カーネルが起動するようになったので、 また、起動してる間にいろいろ片付けておかないと…。
◎ [NetBSDとか] NetBSD の intrnames と intrcnt についてここ数週間ほどちまちま調べてたメモ。 intrcnt[] は割り込みごとのカウンタで long 型の配列。 intrnames は intrcnt のそれぞれの割り込み名を示した文字列の並び。 1つずつは '\0' で終端していて、それを連続して並べたもの。 例えば、 intrcnt[0] が "supr" (スプリアス割り込み)、 intrcnt[1] が "lev1" (レベル1のオートベクタ割り込み) を 示している場合、intrnames は "supr\0lev1\0" のようになる。 20年前って感じ。
           先頭は "supr" で      2つ目は "lev1" で
           intrcnt[0] を使用。   intrcnt[1] を使用。
          +---+---+---+---+----+---+---+---+---+----+-
intrnames | s | u | p | r | \0 | l | e | v | 1 | \0 | ...
          +---+---+---+---+----+---+---+---+---+----+-
            |                    |
            |                    |   +-------+
            +----------------------> |       | intrcnt[0]
                                 |   +-------+
                                 +-> |       | intrcnt[1]
                                     +-------+
そういう構造なので intrcnt と intrnames は 後ろにスペースをおいとけば実行時に動的に増やすことも可能。 x68k の場合、intio_intr_establish() で割り込みを登録すると intrnames にエントリを (なければ) 追加するようになっている。 intrnames は 200バイト、intrcnt は 50バイト余分に確保してあるので、 そこまでは動的に増やせるという設計。 でも x68k/dev/intio.c の scan_intrnames() 見ると intrnames があふれないかのチェックはしてるけど、 intrcnt があふれないかのチェックはしてないように見えるな。 それに long 型の intrcnt[] の空きスペースが 50バイトて、あーた、 4 で割り切れないんだけど…。 という古きよき時代のコード。

実際には x68k の intrcnt は locore.s に固定で確保してあるのよりも intio_intr_establish() で空きスペースに動的に追加するほうが ほぼメインになっている。 で、うちの構成で vmstat -iv 見ると残り 3個 (実際は 2.5個かも?) の カウンタしか残ってないのな。 PRO とかでもうちょい拡張ボード載せると埋まるかなあ。

sys/ の下にこれを参照する人はいないので、 最初、デッドコードかとオモタけど、 vmstat と systat がこの構造を kvm(3) で直接参照している。 ということでキモいけど構造を改善することも不可。 だから、代わりに evcnt(9) 使えって話だな。なる。 そのため、vmstat とかは intrnames と evcnt(9) の両方の カウンタを表示するようになっているので、カーネル内が どっちかで統一されてても混在してても大丈夫、と。

てことで、x68k の intio(4) あたりも evcnt(9) 使うように変更してみた。 intrcnt 自体はまだ locore.s で使ってるので残してあるけど、 後ろの余分な領域を動的に割り当てる手法は廃止した。 あと、 vmstat で表示される名前が変わっちゃうけど、たぶん誰もそんなの 気にしてないよね。 そのうち device_xname() 使うようにもう一度変更する予定。

◎ [NetBSD/x68k] たぶんそれとは別件で FDD アクセスに行くとランプが赤になって モーター回したままカーネルが固まるっぽい。恐い恐い。 いつからだよ orz。 それに最後に FDD のアクセスがエラーにならなかったのは 何年前だろう。
◎ [NetBSD/x68k] sys/arch/x68k/dev/if_ne_neptune.c の ne_neptune_intr() の中に こんな風に
    220 static int
    221 ne_neptune_intr(void *arg)
    222 {
    223         spl4();                 /* XXX */

    224         return dp8390_intr(arg);
    225 }
ぼそっと spl4() とかって書いてあって、 昔からずっと疑問だったんだけど、こいつら(↓)の残骸なのかしらん。
sys/arch/x68k/dev/intio.c
    393 int
    394 intio_intr(struct frame *frame)
    395 {
    396         int vector = frame->f_vector / 4;
    397         extern int intrcnt[];
    398
    399 #if 0                           /* this is not correct now */
    400         /* CAUTION: HERE WE ARE IN SPLHIGH() */
    401         /* LOWER TO APPROPRIATE IPL AT VERY FIRST IN THE HANDLER!! */
    402 #endif
sys/arch/x68k/x68k/locore.s
    592 ENTRY_NOPROFILE(intiotrap)
    593         INTERRUPT_SAVEREG
    594 #if 0
    595         movw    #PSL_HIGHIPL,%sr        | XXX
    596 #endif

    597         pea     %sp@(16-(FR_HW))        | XXX
    598         jbsr    _C_LABEL(intio_intr)
intiotrap で splhigh() するようになったのは minoura_x68k_bus_h ブランチが出来た 1998年ってもう10年前…。

2008/06/24 (火)
◎ [NetBSD/x68k] 手もとのソースツリーで arch/x68k の下のデバイスを 片っ端から device_t/softc の分離中。 consinit() が絡まないデバイスは全部分離完了。 consinit() が絡むデバイスに手をつけると、カーネルに入ってすぐの ところでお亡くなりになる。 今見ると machdep.c あたりも眺める必要があるのな。 これはちょいと大変そう。

2008/06/25 (水)
◎ [NetBSD/x68k] device_t/softc 話は変更箇所やファイル数も多いので、 手もとのコードと本家が解離したまま 気付くとまた数ヵ月間カーネルが起動しない地獄に突入したりすると嫌なので、 動作確認したところだけさっさと commit してしまう。 動作確認できてないのは xcom、mha、xel。 あとは grf、ite、mfp あたりがまだ動かない。
◎ [NetBSD/x68k] と思ったら dmac あたりがまだ全然出来てなかった。 うーむ、しまった。 vs(4) じゃ動作確認にならんのか。
◎ [X680x0] 動作確認用に久しぶりに物置から PRO-II を引っ張り出してくる。 しまった、こいつは電源が壊れたから外付け ATX 電源仕様に してあって、その ATX 電源は会社に持ってったままだ。 で、掃除するために蓋開けてみたら、そういえば 基板直付けの電池も切れたから交換した跡があるな。

メモリ増設 (1MB → 10MB?)、 クロックアップ (10MHz → 12.5MHz)、 Xellent30 (68000 → 68EC030) 装備、さらに CPU 換装 (68EC030 → 68030)、 電源交換 (内蔵純正 → ATX 電源)、電池交換、 Nereid 2麻衣挿し。 大したことないつもりだったけど、わりと原型とどめてないような…。


2008/06/26 (木)
◎ [NetBSDとか] splraiseipl(9) 問題。 next68k、mvme68k は 筒井さんから looks OK の返事を頂いたので commit しといた。
◎ AVRWRT が届いた。 けど、ターゲットデバイスが認識できない状態。 ググっても「つないだら動いた」と 「動かん。もう寝る」という記事しか出てこないので これでは参考にならん。もう寝る。 しょっぱなからこれではちょいと厳しいな。 こんなことなら 2313 とかも一緒に買っとけばよかったかな。
◎ しかし春先の「とにかく物を捨てましょう」という掃除の本を 読んでやった部屋の掃除の時 (03/08 の日記)に、 よく、10年以上も使ってなかった コンデンサと抵抗の山 (1袋500円) を捨てなかったなーと、我ながら関心。 0.1uF のコンデンサとか LED と数百オームの抵抗がすぐに取り出せる。 あれ捨ててたら今ごろ発狂間違いなしだよ。 やっぱ物は捨てたらいかん (本の効果なし)。

2008/06/27 (金)
◎ [カープ] 巨人戦。 休みなので初めて平日の開門5分後に球場入りしてみた。 しかしみんな早くから来とるなあ。仕事はー?。

試合のほうは前田健太が7回1失点で 6-1 で快勝。 ハンカチ王子が話題になる1年前、 高校野球の話題の中心にいたのは2年生同士の駒苫の田中、PL の前田だからね。 写真は、試合終了後に外野にサインボールを投げに来た時の 前田健太。取り巻きのマスコミが多くてよく見えねえ。

◎ [カープ] 6月は5試合見に行って、2勝2敗1雨天中止。 今季通算は 16試合 9勝6敗1雨天中止。
◎ [写真] 今年の秋に廃止になるらしい 0系。 さすがに隣にこの車両が入ってきたらびっくりしたよ。 隣のホームでもやっぱりデジカメで撮ってる人がいた。

2008/06/28 (土)
◎ [NetBSDとか] splraiseipl(9) 問題。 atari も jdc@ さんから looks good のコメントを頂いたので commit しておく。 これで、意味もなくばらばらだった m68k の splraiseipl(9) 付近は amiga を除いて全部同じ形に統一。 めでたしめでたし。 amiga はちょっと面倒くさそう。

2008/06/29 (日)
◎ とりあえず情報が少なすぎて切り分けようがないので、 もっと情報の多い ChaN さんの AVRSP-COM ライタというのを作ってみた。 元にした回路図は ELM - AVRライタの製作(4種) の COMポート用ISPアダプタ回路。 で、裏面から見た配置図(?) がこれ(↓)。 太い線が裏のジャンパで、細い線が表のジャンパ。 tgif マンセー。 ちなみに 元の回路図には R6 が 2つあるので、図の下側のほうを R9 に変更。 結線が終わった後で、うちにあったシリアルケーブルがクロスだったことに 気付いてシリアルコネクタを付け直したけど、 最初から分かってたら R1、R7 を交差させなくてもよかったかも。
出来たのがこんな感じ。
久しぶりにこんな作業したら、 インチピッチの位置合わせもままならないくらい 下手になってて、自分でもびっくりした。 最初は R5、R6 はあんな風に表をリード線延ばすんではなくて 一旦裏に入れてから、交差する所だけ表を回すつもりだったんだけど、 急遽やめてこの図のように手抜きしたぐらい。
◎ で、出来上がったので早速 avrsp.exe 使って試してみるけど、 Device connection failed. とか言われる。 はぅん、昨日から1日がかりで作ったんだけど。
◎ 調べてみたところ、ターゲットの AVR がブレッドボードにしっかり ささらないみたいでどのピンも通電してなかった。あぅ、そら動かんよ orz。 4日かかってそんなオチなん?。 隣にさしたピンに通電してることは確認してたので、 その状態でチップにだけ通電してないとは思わなかったよ。 正直、スマンカッタ。
◎ [Perfume] あ、そういえば、11月の Perfume 武道館は落選。 抽選になってからの通算成績は2勝3敗。
◎ [NetBSD/x68k] NetBSD/x68k が FDD をアクセスするとささるようになってる件について。 とりあえずささってる付近に printf 入れてみたらささらなくなった (まだ別のエラーにはなるけど)。 なに? タイミング問題?。めんどくさそうだな。
◎ [NetBSD/x68k] 怪しげなところからソース辿ってて、もしやと思って LOCKDEBUG 入れてみたら、別の割り込み (powintr) 上がった瞬間に assert して ddb に落ちた。 うーん、また LOCKDEBUG か。マジマンドクセ。

2008/06/30 (月)
◎ AVR。ゲタ買ってきて噛ませたら、あっさり動いた。 まずは昨日作った自作のライタでデバイス情報を読み取ってみたところ。 AVRWRT でもデバイスは認識した。
◎ てことで、Hello World 代わりの LED チカチカ。 写真じゃ分からんけど(汗

AVRSP-COM は、 DOS 窓からコマンド叩くことになるけど、 プログラム修正しては書き込んでの動作が連続する場合には マウス使わずに出来るから昔人間にはこっちのほうがいいや。 それに、 書き込みモードとテストランモードが物理スイッチで切り替えられる のもしっくりくる。 ライタに POWER インジケータはつけたりちょいとアレンジしてみたけど、 今度はモード切り替えにも LED 付けてみよう。 結局こういうことが出来るから自作してよかったかも。

AVRWRT は書き込めはしたけどなぜか動作しなかった。 便利な GUI だからマウス操作が多くて面倒くさいし。 てことで、もうそれ以上は追求してない。 2100円だから自作しなくても買えば済むじゃんという 低い敷居を用意してくれただけで十分だったよ。 まりがとう。


井崎のホームページへ戻る
isaki@NetBSD.org