[ TOP | Recently ]

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