VIAのデュアルコア Nano X2 U4025搭載 ZBOX nano VD01 (3)
2012/01/21(土) 15:49 NetBSD はてブ情報 はてブに登録 はてブ数

ZBOX nano VD01の起動しない問題、続々編です。

さて、panicした部分はどこかを見てみると、pci_make_tag関数の413行目もしくは420行目ということになります。
398 pci_make_tag(pci_chipset_tag_t pc, int bus, int device, int function)
399 {
中略
410 	switch (pci_mode) {
411 	case 1:
412 		if (bus >= 256 || device >= 32 || function >= 8)
413 			panic("%s: bad request", __func__);
414 
415 		tag.mode1 = PCI_MODE1_ENABLE |
416 			    (bus << 16) | (device << 11) | (function << 8);
417 		return tag;
418 	case 2:
419 		if (bus >= 256 || device >= 16 || function >= 8)
420 			panic("%s: bad request", __func__);
421 
中略
429 }
どちらの文か区別できればよいので、何も考えずにpanicに与えるメッセージをかえてみたところ、420行目のpanicが呼ばれていることがわかりました。つまり419行目のチェックに引っかかっており、変数bus, device, functionのいずれかが異常な値だということになります。

じゃぁ、その異常値をよこしたのは誰だということになります。

前回のデバッガのtraceの結果から、このpci_make_tagを呼んでいるのはAcpiOsReadPciConfigurationですから、そちらを参照してみます。すると、pci_make_tagを呼ぶ前に210行目でpci_make_tagと同様のチェックをしていることがわかります。
202 AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, UINT64 *Value,
203     UINT32 Width)
204 {
中略
210 	if (PciId->Bus >= 256 || PciId->Device >= 32 || PciId->Function >= 8)
211 		return AE_BAD_PARAMETER;
212 
213 	tag = pci_make_tag(acpi_softc->sc_pc, PciId->Bus, PciId->Device,
214 	    PciId->Function);
中略
235 }
このチェック内容を比較すると、bus, device, functionのうちdeviceだけがチェック項目に違いがあることがわかります。

親であるAcpiOsReadPciConfigurationでは32未満であることをチェックしていますが、pci_make_tagでは16未満であることをチェックしています。したがって、何らかの理由でdeviceが16から31の状態となり、AcpiOsReadPciConfigurationのチェックは通過するものの、pci_make_tagのチェックで引っかかり、panic処理へ進んでいると想定されます。

それでは、なぜdeviceがおかしな値になっているのか、という所を追求しなければなりません。

ということで、より上位の関数を追っかけてみたものの、私の実力では、その原因を見つけることはできませんでした。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/adiary.cgi/0764/tb/