VIAのデュアルコア Nano X2 U4025搭載 ZBOX nano VD01 (3)
ZBOX nano VD01の起動しない問題、続々編です。
さて、panicした部分はどこかを見てみると、pci_make_tag関数の413行目もしくは420行目ということになります。
じゃぁ、その異常値をよこしたのは誰だということになります。
前回のデバッガのtraceの結果から、このpci_make_tagを呼んでいるのはAcpiOsReadPciConfigurationですから、そちらを参照してみます。すると、pci_make_tagを呼ぶ前に210行目でpci_make_tagと同様のチェックをしていることがわかります。
親であるAcpiOsReadPciConfigurationでは32未満であることをチェックしていますが、pci_make_tagでは16未満であることをチェックしています。したがって、何らかの理由でdeviceが16から31の状態となり、AcpiOsReadPciConfigurationのチェックは通過するものの、pci_make_tagのチェックで引っかかり、panic処理へ進んでいると想定されます。
それでは、なぜdeviceがおかしな値になっているのか、という所を追求しなければなりません。
ということで、より上位の関数を追っかけてみたものの、私の実力では、その原因を見つけることはできませんでした。
さて、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がおかしな値になっているのか、という所を追求しなければなりません。
ということで、より上位の関数を追っかけてみたものの、私の実力では、その原因を見つけることはできませんでした。
コメント(0件)
- TB-URL http://www.tokuda.net/diary/0764/tb/