[ TOP | Recently ]

1999-06-24 mach_init() のパラメタ


とか思ったら pmax/pmax/machdep.c の mach_init() は 6 つもパラメタ
受けてるぞ。謎。

/*
 * Initialize stack and call machine startup.
 */
	la	$3,start
	slt	$2,$3,sp
	bne	$2,$0,1f
	addu	$2,$3,-CALLFRAME_SIZ
	subu	$2,$3,sp
	slt	$2,$2,4096			# within 4kB of _start
	beq	$2,$0,2f
	addu	$2,$3,-CALLFRAME_SIZ
1:
	move	sp,$2
2:

遅延スロットに入る命令を考慮しつつ人間語に翻訳すると

if (start < sp) {
	sp = start - CALLFRAME_SIZ;
} else {
	tmp = start - sp;
	if (tmp < 4096)
		sp = start - CALLFRAME_SIZ;
}

か? ちなみに #define CALLFRAME_SIZ (4 * (4 + 2))。

start は 0x80001000 なので、つまり kernel が走ると同時に stack ptr は
0x80001000 - CALLFRAME_SIZ に設定される。

stack が kernel text 内にある場合は、kernel が使う memory 領域とかぶるので
やめさせる。当然 0x80000000 以下の場合もやめさせる。
唯一 0x80000000 〜 0x80001000 以内にあった場合にのみ、そのまま使う、と。

なんかよくわからんが...やっぱり news5000 の場合は kernel に渡された
sp はどっかいっちゃってるよなぁ...。pmax は bootloader が kernel を load
する時に、sp を 0x80000000〜0x80001000 の中に設定するんだなぁ。たぶん。
で、sp が壊されずに mach_init() までくるために引数が拾える、と。

さて、news5000 ではどうしよう?

#define	KERNEL_ARG_NUM	5
#define	KERNEL_ARG_SIZE	sizeof(int)*KERNEL_ARG_NUM

とかやって、mips/locore.S のあたまで、

#ifdef KERNEL_ARG_SIZE
	bcopy(sp,start-CALLFRAME_SIZ-KERNEL_ARG_SIZE,KERNEL_ARG_SIZE);
#endif

みたいにすればそこそこ綺麗?
機会があった時にでも曽のつく偉い人に質問しよう...


EOF