panic: No BIOS smap info from loader!

研究室の端末 PC はほとんどが hp 製品で、PentiumD 以降のプロセッサは EM64T なので、FreeBSD/amd64 を動かそうと思って準備している (いまは FreeBSD/i386 だが、diskless なので、親玉サーバでユーザ環境を作って DHCP の設定を変えるだけだ)。

ところが、最新の dx7400 を除くモデル (PentiumD な dc7600 や、Core2Duo な dx7300) では FreeBSD/i386 は起動するものの、FreeBSD/amd64 は kernel panic してしまう。

SMAP、というのはキムタクのあれではなくて、BIOS からもらえる System Memory mAP なのだが、これが hp のちょっと前の世代のマシンではうまく取得できないらしく、google で探すとかなりいろいろでてくるのだが、解決した気配はない。わかったことは、
– FreeBSD/i386 なら起動する、というマシンは loader prompt で smap コマンドを叩いても、何も出ない。つまり、FreeBSD/i386 でもちゃんと取得できていない (loader は同じみたいだしね)
– FreeBSD/amd64 がちゃんと起動するマシンは smap コマンドを叩くとちゃんとリストが出る
ということだ。

で、この panic を出しているのは
– sys/amd64/amd64/machdep.c の 898 行めで、loader が取得した値をそのまま使っている
– 対応するところは i386 だと、sys/i386/i386/machdep.c の 1751 行めあたりで、loader に頼らずに自力で取りにいっている
というわけだ。

さあて、どうするか。
私物の ThinkPad の SMAP table はこんな感じ。

SMAP type=01 base=00000000_00000000 len=00000000_0009d800
SMAP type=02 base=00000000_0009d800 len=00000000_00002800
SMAP type=02 base=00000000_000d2000 len=00000000_00002000
SMAP type=02 base=00000000_000e0000 len=00000000_00020000
SMAP type=01 base=00000000_00100000 len=00000000_bf5b0000
SMAP type=03 base=00000000_bf6b0000 len=00000000_0001c000
SMAP type=04 base=00000000_bf6cc000 len=00000000_00034000
SMAP type=02 base=00000000_bf700000 len=00000000_00100000
SMAP type=02 base=00000000_bf800000 len=00000000_00800000
SMAP type=02 base=00000000_f0000000 len=00000000_04000000
SMAP type=02 base=00000000_fec00000 len=00000000_00010000
SMAP type=02 base=00000000_fed00000 len=00000000_00000400
SMAP type=02 base=00000000_fed14000 len=00000000_00004000
SMAP type=02 base=00000000_fed18000 len=00000000_00001000
SMAP type=02 base=00000000_fed19000 len=00000000_00001000
SMAP type=02 base=00000000_fed1c000 len=00000000_00004000
SMAP type=02 base=00000000_fed20000 len=00000000_00070000
SMAP type=02 base=00000000_fee00000 len=00000000_00001000
SMAP type=02 base=00000000_ff000000 len=00000000_01000000
SMAP type=01 base=00000001_00000000 len=00000000_3c000000

http://www.uruk.org/orig-grub/mem64mb.html に、int 15h:e820h の説明がある。
Linux を dx7300 で起動してみると、

BIOS-provided physical RAM map:
BIOS-e820: 00000000_00000000 - 00000000_0009fc00 (usable)
BIOS-e820: 00000000_0009fc00 - 00000000_000a0000 (reserved)
BIOS-e820: 00000000_000e8000 - 00000000_00100000 (reserved)
BIOS-e820: 00000000_00100000 - 00000000_7efb1d00 (usable)
BIOS-e820: 00000000_7efb1d00 - 00000000_7f000000 (reserved)
BIOS-e820: 00000000_f4000000 - 00000000_f8000000 (reserved)
BIOS-e820: 00000000_fec00000 - 00000000_fed40000 (reserved)
BIOS-e820: 00000000_fed45000 - 00000001_00000000 (reserved)

みたいにちゃんと SMAP が取れているので、loader を hack すればなんとかなるかな?

FreeBSDのサイトの当該エントリもある。

コメントを残す