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