1999-07-21 interrupt 捕獲。exec init ...?
あははー。割り込み捕れたよ。
なんでこうも割り込み enable mask が方々にあるんだ...
というわけで、news5000 は一つの device の割り込みを
enable するのには、
1) MIPS の StatusRegister の INTMASK を enable 2) NEWS5000 の APBUS の該当スロット(?)の INTMASK を enable 3) そのデバイスの割り込みコントローラ(?)の MASK を enable 4) そのデバイスの割り込みマスクレジスタを enable
と、4個所もいじんなきゃならなかったのでした。
1,2,4 はやってたんだけど、3 をやってなかった。
で、ap_intr_establish を作って hardware trap から
それぞれのデバイスの割り込みハンドラを呼ばなきゃいけないんだけど、
これはめんどくさいので後まわし。
そんなことよりも、ほんとに packet receive と連動してるのか調べよう。
まず news5000_trap() の level0 割り込みの中で、いきなし snintr() を呼んでやるように仕込む。
level0 割り込みをかける奴は今のところ sonic しかいないので、まぁ、これで動くだろう。
snintr() の中で printf("#") とかやっといて、他の host から broadcast に向けて ping。
おー。ping に同期して '#' が表示されるよ。ばっちりじゃん。
つうわけで、そのまま dhcpd を用意して boot させる。
おぉ、init 読んでる...あ、sn0: receive buffers exhausted だと...。
割り込みおっついてないのかな? 石の叩き方がまずいのかも。
しかし nfs がしつこく retry してくれるから動かないわけではない。
ぐぁ。
init: copying out path `/sbin/init' 11 sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted sn0: receive buffers exhausted panic: init died (signal 0, exit 11) 800b792c+70 (c731b000,0,0,0) ra 8001bb88 sz 24 8001bb0c+7c (100,29,0,1) ra 8000b880 sz 32 8000b834+4c (100,b00,0,1) ra 8000b824 sz 104 8000b810+14 (100,b00,0,1) ra 800ac7ec sz 24 800ac64c+1a0 (100,b00,0,1) ra 800022b4 sz 176 mips3_SystemCall+d4 (100,b00,0,1) ra 430930 sz 0 PC 0x430930: not in kernel space 0+430930 (100,b00,0,1) ra 0 sz 0 User-level: pid 1 syncing disks... done rebooting...
落ちた。
0x430930 というのは、init の仮想アドレス?
mips-sony-netbsd-objdump -Dr /src/boot/negx/root/sbin/init して調べると...
430920: 3c1c0fbe lui $gp,0xfbe 430924: 279c8900 addiu $gp,$gp,-30464 430928: 0399e021 addu $gp,$gp,$t9 43092c: 24020001 li $v0,1 430930: 0000000c syscall 430934: 03e00008 jr $ra
syscall(1) だから、exit() か。
って、これはつまり sbin/init が exit() してるってことだよな。
grep exit sbin/init.c すると、
_exit(sig); _exit(0); _exit(1);
なので、きっと _exit(sig) で落ちてんだよなぁ。
panic させてるのは kern_exit.c の
void exit1(p, rv) register struct proc *p; int rv; { register struct proc *q, *nq; register struct vmspace *vm; if (p->p_pid == 1) panic("init died (signal %d, exit %d)", WTERMSIG(rv), WEXITSTATUS(rv));
ここだから...
panic: init died (signal 0, exit 11)
てのはつまり、signal 11 = SEGV で init が死んだ、ってことか? なんか嫌な落ち方。
まぁ、まだ tty も作ってないので何があってもおかしくないが...。
しかしまぁとにかく、init は exec できてて、user mode で init が実行できてはいる、
ってことだな。おじゃほう。
って、それ以前にこの init は
1999 6/25のsnapshot から拾ってきてて、tsubai@wapiko:/a/0625/src/sys/arch/newsmips/compile/GENERIC
の NetBSD-1.4D kernel 用。
つまり NetBSD1.4 で 1.4D の binary を実行しているわけで、それも不安のタネだ。
いや、userland を cross で作るのってめんどくさいし、
NetBSD1.4 の newsmips の binary が見つからなかったからこっから拾っただけなのですが :P
せっかくなので current とシンクロするかなぁ。
EOF