1999-06-23 x_maxmem
mips の locore.S は、start() に渡された引数 4 つ
(a0,a1,a2,a3 レジスタ)
をそのまま保持して、mach_init() に渡す。
ので、mach_init(a,b,c,d) として受ければ、それは bootstrap が kernel に
渡した引数がそのまま 4 つ取りだせるのだが、この引数は news3400 と news5000 では
違ってた。
news3400 の場合は、
mach_init(x_boothowto,x_bootdev,x_bootname,x_maxmem)
なのだが、
news5000 の場合は、
mach_init(x_boothowto,x_bootdev,x_argv,x_argc)
となる(ようだ)。
となると NEWS5000 の ROM モニタで見える sysinfo 構造体へのポインタは
どうやって知るのか、っつーと、実は NEWS5000 の ROM モニタは kernel に
5 つの引数を渡していて、
start(x_boothowto,x_bootdev,x_argv,x_argc,sysinfo)
と5つ目に pointer が入っていた。
( 16(sp) から拾ってるから mips の場合これは 5th 引数)
が、mips/locore.S で有難くも余計なお世話的にスタックを自前で
設定しれくれているので、ROM モニタが kernel に渡した引数は
メモリの彼方へ。
う〜ん。
しょうがないので mips/mips/locore.S の start: の最初で
伝家の宝刀 #ifdef news5000 を持ちだして変数に格納しておくことにする。
汚いどいいよね。とりあえずだし。
これで、
sip = 0x9ff03270;
と非常にキモチワルイことをしなくてもよくなった。:)
で、mach_init() の中で sysinfo 構造体から maxmem を拾って x_maxmem に set する。
(ただし ROM モニタ用に一応 1M とっておく)
9ff03270: 00000002 9fc1f900 000003ee a0001000 ................ 9ff03280: a0300000 ffff8e80 ffffbfc0 00000000 .0.............. 9ff03290: 00000001 00000000 04000000 00004000 ..............@. 9ff032a0: 03ff0db8 bf881000 ffffb2c0 ffffbff8 ................ 9ff032b0: ffff9680 00000000 fffefe01 9fc26190 ..............a. 9ff032c0: fffdfc01 9fc26190 fffbf801 9fc26190 ......a.......a. 9ff032d0: fff7f001 9fc26190 ffefe001 9fc26190 ......a.......a. 9ff032e0: ffdfc001 9fc26190 ffbf8001 9fc26190 ......a.......a. 9ff032f0: ff7f0001 9fc26190 9fc261d4 0300ca00 ......a...a..... 9ff03300: 00000050 00000000 00000000 00000000 ...P............ 9ff03310: 536f6e79 00000000 00000000 00000000 Sony............ 9ff03320: 00000000 00000000 00000000 00000000 ................ 9ff03330: 00000000 00000000 00000000 00000000 ................ 9ff03340: 00000000 00000000 00000000 00000000 ................ 9ff03350: 00000000 00000000 00000000 00000000 ................
maxmem は +40 の 0x04000000 というやつ(だろう)。
この情報は /usr/include/apbus/sysinfo.h と
/usr/include/apbus/news/sysinfo.h に書いてるし、楽勝。
で、x_maxmem をちゃんと設定してやっただけで pmap_bootstrap で
止まらなくなった。ほんと? main まで来ちゃってんの?
恐る恐る kern/init_main.c の main() の中に kitt() をつっこむ。
あ、ほんとにここまで来てるよ...がーん(←喜べよ)
というわけで、なにがなんでも次は serial に文字を出そうと心に決める。
EOF