Microsoft ASL Compiler (asl.exe) を使ってみる
今回は、Microsoft ASL Compiler (asl.exe) を使って、BIOS の ACPI テーブルを編集する手順をご紹介したいと思います。
Microsoft ASL Compiler (asl.exe) は、システム上の種々の ACPI テーブルの逆アセンブリ、ACPI Source Language (ASL) ファイルのコンパイル等の機能が含まれています。
Microsoft ASL compiler
https://msdn.microsoft.com/windows/hardware/drivers/bringup/microsoft-asl-compiler
(日本語訳 : https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn551195(v=vs.85).aspx)
これと、以下のサイトの GpioSampleKMDF.asl のサンプルを使います。
https://github.com/Microsoft/Windows-driver-samples/blob/master/gpio/samples/simdevice/kmdf/GpioSampleKMDF.asl
実際のファイルは、以下のサイトの右側の緑色の [Clone or Download] ボタンを押すと表示される [Download ZIP] ボタンで Windows-driver-samples-master.zipをダウンロードすると、Windows-driver-samples\gpio\samples\SimDevice\kmdf フォルダにあります。
https://github.com/Microsoft/Windows-driver-samples
今回は、例として、ターゲット PC としてWindows 10 (1607) x86の仮想マシンの BIOS の ACPI テーブルに、GpioSampleKMDF.asl サンプルの内容を追加して、デバイスマネージャでダミーデバイスが追加されるところまでをご紹介します。
(1) ターゲット PC 上で管理者権限のコマンドプロンプトを起動し、以下のコマンドでテストモードを有効状態にします。
bcdedit.exe -set testsigning on |
(2) ターゲット PC を再起動します。
(3) ターゲット PC に ASL Compiler (asl.exe) をコピーします。
asl.exe は Windows Driver Kit 10 (C:\Program Files (x86)\Windows Kits\10\Tools\<ARCH>\ACPIVerify) にあります。
(4) ターゲット PC の ACPI テーブルを、以下のコマンドで逆アセンブリします。
asl.exe /tab=dsdt |
カレントフォルダに dsdt.asl が生成されます。
なお、この時、念のため、先に (6) (asl.exe dsdt.asl) を実行して、問題なく dsdt.aml ができることを確認します。今回の仮想環境では、以下のエラーが出ました。
dsdt.asl:
2132: Return(Name(TBUF, Buffer(0x28) ^*** dsdt.asl(2132): error: expecting Symbol |
これは、asl.exe の不具合ではありません。逆アセンブリする対象のコードそのものに、これを正しく逆アセンブリできる情報が含まれないため、asl.exe としては可能な限り推測せざるを得ないためです。
この場合、以下のように変更すれば、エラーしません。(Returnの後に”()”をつけ、Name()の後の”}“をName()の前に持ってきます。)
While(Local0) { Store(0x84, Index(CRS_, Local1, )) Add(Local1, 0x2e, Local1) Decrement(Local0) } Return() } Name(TBUF, Buffer(0x28) { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x33, 0x44, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x55, 0x66, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x77, 0x88, 0xaa, 0xbb, 0xcc, 0xdd }) CreateQWordField(TBUF, 0x0, RMIN) |
以下のように表示されれば、カレントフォルダに dsdt.aml が生成されます。
>asl.exe dsdt.asl Microsoft ACPI Source Language Assembler Version 5.0.0NT Copyright (c) 1996,2014 Microsoft Corporation Compliant with the ACPI 5.0 Specification
dsdt.asl: asl(DSDT.AML): Image Size=13012, Image Checksum=0x1a |
また、先に (7) (asl.exe /loadtable dsdt.aml) も先に実行して OS 再起動しても問題ないことを確認しておきます。
(5) ASL ファイルにテスト用ダミーデバイスを追加するコードを追加します。
追加するコードは、\gpio\samples\simdevice\kmdf\GpioSampleKMDF.asl のサンプルから、Scope(\_SB) 内の内容全てを、dsdt.asl の既存の DefinitionBlock の末尾に追加します。(以下の黒字が既存の dsdt.asl のコードで、赤字が追加した GpioSampleKMDF.asl のコードです。)
// CreatorID=INTL CreatorRev=2.0.8230 // FileLength=13246 FileChkSum=0x92
DefinitionBlock("DSDT.AML", "DSDT", 0x01, "MSFTVM", "MSFTVM02", 0x00000002) { (略)
// // System Bus //
Scope (\_SB) {
// // Sample GPIO device //
Device(GPIO) { (略)
Method (_STA, 0x0, NotSerialized) { Return(0xf) } } } } } |
(6) (5) で編集された ASL ファイルを、以下のコマンドでコンパイルし、AML ファイルを生成します。
asl.exe dsdt.asl |
カレントフォルダに dsdt.aml が生成されます。
今回の環境では、コマンドプロンプト上に以下のように表示されました。
>asl.exe dsdt.asl Microsoft ACPI Source Language Assembler Version 5.0.0NT Copyright (c) 1996,2014 Microsoft Corporation Compliant with the ACPI 5.0 Specification
dsdt.asl: asl(DSDT.AML): Image Size=13346, Image Checksum=0x97 |
(7) ACPI テーブルを上書きします。
asl.exe /loadtable dsdt.aml |
今回の環境では、コマンドプロンプトに以下のように表示されました。
>asl.exe /loadtable dsdt.aml Microsoft ACPI Source Language Assembler Version 5.0.0NT Copyright (c) 1996,2014 Microsoft Corporation Compliant with the ACPI 5.0 Specification
Table overloading succeeded. This will only be active when testsigning is enabled. |
(8) ターゲット PC を再起動します。
(9) デバイスマネージャを開き、「不明なデバイス」が表示されていることを確認します。
通常は、BIOS の編集は BIOS メーカー様が実施されますが、BIOS メーカー様に依頼する前に、ACPI テーブルを変更した状態でのご自身のドライバの動作を確認したい時などに、上記の内容がお役に立てますと幸いです。
WDK サポートチーム 津田