[ TOP | Recently ]

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