状況
手元に不安定なWindows 10 PCがある。週に何度かブルースクリーンを吐く。
で、イベントビューアでCPUにかかわるエラーWHEA-Logger
が多発してることがわかったので、BIOS設定からCPU Load-Line Calibration
を調整したらブルースクリーン出なくなったっぽい。
で、イベントビューアのWHEAってなんじゃそりゃと気になったので調べた。
WHEA is 何
Windows Hardware Error Architecture
EFIファームウェアは、ハードウェアで検出したエラーをOSにCPER(Common Platform Error Record)というしくみで報告する。 メモリのECCエラーとか、PCI-Expressのエラーとか、CPUのキャッシュの不具合とか、そういうのが対象っぽいです。
Windowsが受け取ったCEPRは、イベントビューアに"WHEA-Logger
"または"Kernel-WHEA
"として記録される。発生状況によって両方に記録されたり片方にしか記録されなかったりする。違いが謎。
(Windowsで理解できる形式のCEPRはWHEA-Logger、理解できない(未知の)CEPRはKernel-WHEAで記録している?)
で、イベントビューアにはCPERの生データのバイナリが記録されている。コイツを解析すれば、ハードウェア不具合のより詳しい状況がわかるはずである。
イベントログIDの例
- WHEA-Logger, EventID:19 … CPU内部のエラーっぽい
- Cache Hierarchy Error
- Internal parity error
CPERを読みたい
CPER(Common Platform Error Record)の形式はEFIの規格で制定されている。たぶん仕様書も公開されてる。なので読もうと思えば読める。
これはイベントビューアから持ってきたWHEAの生データ。
435045521002FFFFFFFF03000200000002000000680300000B060A00070115140000000000000000000000000000000000000000000000000000000000000000BDC407CF89B7184EB3C41F732CB57131B248949139377F4BA8F1E0062805C2A377C6CF4D86E2D60100000000000000000000000000000000000000000000000058010000C00000000003000001000000ADCC7698B447DB4BB65E16F193C4F3DB0000000000000000000000000000000002000000000000000000000000000000000000000000000018020000400000000003000000000000B0A03EDC44A19747B95B53FA242B6E1D0000000000000000000000000000000002000000000000000000000000000000000000000000000058020000100100000003000000000000011D1E8AF94257459C33565E5CC3F7E8000000000000000000000000000000000200000000000000000000000000000000000000000000005701000000000000000208000000000055060A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000B0000000000000055060A000008200BFFFBFA7FFFFBEBBF000000000000000000000000000000000000000000000000000000000000000002000000010000009853A8B9DCE4D6010B0000000000000000000000000000000000000000000000050001004000009000000000000000000000000000000000000000000B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
最初の4バイト43504552
はCPERシグネチャであり、ASCIIコードでCPER
と書かれとる。(PNGファイルは必ず 89 50 4E 47 臼NG
から始まる、みたいなやつですね)
ところで、CPUで起きたエラーは9876ccad-47b4-4bdb-b65e-16f193c4f3db
というGUIDと定義されている。
というわけで、このGUIDの頭4byteの並び順を変えてad cc 76 98
で目grepすると、ADCC7698B447DB4BB65E16F193C4F3DB
という、なんか似たようなバイト列が見つかり、CPUのエラーが発生したんだなあ、ということがわかる。
CPERを扱うプログラムはLinuxカーネルにも入ってるので、ソースコードを読めばいろいろわかる。
- https://github.com/torvalds/linux/blob/master/drivers/firmware/efi/cper-arm.c
- https://github.com/torvalds/linux/blob/master/drivers/firmware/efi/cper.c
- https://github.com/torvalds/linux/blob/master/drivers/firmware/efi/cper-x86.c
- https://github.com/torvalds/linux/blob/master/include/linux/cper.h
で、このCPERをパース(解読)できれば、WHEAイベントから詳しい情報を得られて故障部位の特定に役立つはずである。
なのでCPERを解読するプログラムがあるといいなあと思ったが、残念ながら見つからなかった。
故障診断に役立つはずなので、誰か作ってほしい。
UEFIの仕様書を読んだり、Linuxカーネルのソースコードを参考にすれば作れそうだが、私は面倒なのでやらない。