2021年4月27日 星期二
iASL - ASL Optimizing Compiler and Disassembler
ACPICA
Errors, Warnings, and Remarks
-ve
只回報Error,忽略Warning及Remark。
編譯 DSDT0000.dsl時只回報 Error iasl.exe -ve DSDT0000.dsl
AML Disassembler
-d <f1 f2 ...>
反組譯 AML檔案回 ASL(*.dsl)
反組譯 DSDT0000.bin回 DSDT0000.dsl 的ASL檔案 iasl.exe -d DSDT0000.bin
-e <f1 f2 ...>
在反組譯AML時,會遇到有些 unresolve external control method,用以指定含有其
external control method的 AML檔
反組譯DSDT0000.bin時,指定 SSDT0000.bin及 SSD10000.bin為含有其
external control method的AML檔
iasl.exe -e SSDT0000.bin SSD10000.bin -d DSDT0000.bin
指定所有 SSD*.bin為含有DSDT0000.bin external control method的AML檔
iasl.exe -e SSD*.bin -d DSDT0000.bin
2021年4月13日 星期二
asl.exe - Microsoft ASL Compiler
microsoft-asl-compiler
Windows在使用 ACPI table時,不是每次都從記憶體存取,而是暫存在其登錄檔,透過登錄檔
來存取。可以透過 regedit登錄檔編輯程式來讀取修改 ACPI的登錄檔,其路徑為
Computer\HKEY_LOCAL_MACHINE\HARDWARE\ACPI
而 Microsoft的 WDK提供 asl.exe可以用來取出或取代其中的 ACPI table。
/tab=<TabSig>
將 <TabSig>的 AML反組譯回 ASL檔案,<TabSig>可從 regedit查詢。
取出 DSDT.asl
asl.exe /tab=DSDT
取出所有 ACPI table並存成 ACPI.txt
asl.exe /tab=*
/nologo
不印出logo banner的訊息。
Example 1: without /nologo
asl.exe /tab=DSDT
Output 1:
Microsoft ACPI Source Language Assembler Version 5.0.0NT
Copyright (c) 1996,2014 Microsoft Corporation
Compliant with the ACPI 5.0 Specification
Example 2: with /nologo
asl.exe /nologo /tab=DSDT
Output 2:
/c
將 table存成 .bin檔
取出 DSDT的 AML並存成 DSDT0000.bin
asl.exe /c /tab=DSDT
ACPI-table-load usage
只能用於已存在在系統中的ACPI table
/loadtable
將ACPI table load進 registry中
將 AMLFile load進 registry中
asl.exe /loadtable [-v] [-d] <AMLFile>
-v: verbose mode
-d: 移除先前所 load的 AML檔
在 Windows下修改及替換 DSDT或SSDT table
1. 以DSDT為例,先使用 asl.exe將 DSDT的 AML從 registry取出
asl.exe /tab=DSDT /c
會得到 DSDT0000.BIN。
2. 使用 ASL compiler iasl.exe將 DSDT0000.bin 反組譯。
iasl.exe -d DSDT0000.bin
若是反組譯成功,就會產生 DSDT0000.dsl的 ASL檔。
有時會遇到缺少 external control method的情況導致反組譯失敗,這時就可以使用 -e
參數來 include包含 external control method的 AML檔。
EX: Include SSD0及 SSD1
iasl.exe -e SSD00000.bin SSD10000.bin -d DSDT0000.bin
或是使用 -fe來 include描述 external control method的檔案。
3. 依照需求修改 DSDT0000.dsl
EX: 在 DSDT0000.dsl中加入 Serial port的定義
DefinitionBlock ("", "DSDT", 2, "ACRSYS", "ACRPRDCT", 0x00000000)
{
External (_GPE.HLVT, MethodObj) // 0 Arguments
External (_PR_.BGIA, UnknownObj)
External (_PR_.BGMA, UnknownObj)
External (_PR_.BGMS, UnknownObj)
......
Field (SERP, ByteAcc, NoLock, Preserve)
{
THRR, 8,
, 8,
, 8,
, 8,
, 8,
LSRR, 8,
MSRR, 8
}
Name (SS1, Zero)
Name (SS2, Zero)
......
4. 使用 iasl.exe compile修改過的DSDT0000.dsl
iasl.exe -ve DSDT0000.dsl
成功後就會產生 DSDT0000.aml。
-ve為忽略 warning及 remark,只顯示error。
5. 將DSDT0000.aml load到 registry
asl.exe /loadtable DSDT0000.aml
6. 啟動 Windows test mode
bcdedit /set testsigning on
重新開機以後就能生效。
2019年8月30日 星期五
General-Purpose Event (GPE)
本篇文章參考
ACPI Specification Version 6.3
Vol. 1: Intel® 200 and Z370 Series Chipset Families PCH
Vol. 2: Intel® 200 and Z370 Series Chipset Families PCH
Fixed ACPI Description Table (FADT)
| Field   | Byte Length   | Byte Offset   | Description   |
| Signature   | 4   | 0   | 'FACP'   |
| ......   | ......   | ......   | ......   |
| GPE0_BLK   | 4   | 80   |
GPE 0 Register Block 的 port address。 若不support,則值為0。 |
| GPE1_BLK   | 4   | 84   |
GPE 1 Register Block 的 port address。 若不support,則值為0。 |
| ......   | ......   | ......   | ......   |
| GPE0_BLK_LEN   | 1   | 92   |
GPE 0 Register Block 所decode 的bytes 長度。 其值必為2的正指數冪。 |
| GPE1_BLK_LEN   | 1   | 93   |
GPE 1 Register Block 所decode 的bytes 長度。 其值必為2的正指數冪。 |
| GPE1_BASE   | 1   | 94   |
GPE1 events在ACPI general-purpose event中 的offset。GPE0 events 的offset為0。 |
| ......   | ......   | ......   | ......   |
General-Purpose Event Register Blocks
ACPI spec在 FADT table定義了兩組 GPE register blocks:GPE 0與 GPE 1。register block包含 enable 與 status register (ex:GPE0_EN與 GPE0_STS),這兩個 register長度各佔 register block長度的 一半,所以 FADT中 register block的長度 GPE0_BLK_LEN與 GPE1_BLK_LEN必為 2的冪次。
使用RWEverything讀取GPE Register Block
從 FADT table 中可得 GPE0的 IO port addresss為 0x1880,和其使用的長度為 0x20。
與 Intel PCH spec對照,可從 PMC Controller (D31:F2)的 Offset 40-43h讀出 ACPI Base Address,用 RW讀出其值為 0x1801,bit 1代表為 IO space,所以其 IO address為 0x1800。
與 Spec中的 PMC I/O Based Register 對照,Offset 0x80為 GPE0 block register起始位置,跟 FADT table位置為0x1880 (0x1800 + 0x80) 符合。
再用RW 讀取IO address 0x1880,就可得出GPE0 Register Block位置。若要知道GPE register 每 個bit實際上對應的 GPIO pin,則需參考chipset的相關設定。
GPIO
配置 GPIO用以產生 SCI event
要將 GPIO配置成 GPE的 source,要先將 GPIO配置成可以產生 SCI。需先將 GPI General Purpose Event Enable設起來。
還要配置 Pad Configuration中的 GPIROUTSCI bit。
\_GPE
為ACPI predefined 的namespace,用以處理GPE register block中的General events。
使用RWEverything讀取\_GPE
以我所使用的主機板為例,\_GPE中定義了_E02 的Method,表示其為 handle GPE0_STS bit2 edge event的method。
2018年7月24日 星期二
[ACPI] ASL Operator
本篇文章參考
ACPI Specification Version 6.2 (Errata A)
ACPI Specification Version 5.1 (Errata B)
參考章節為CH19 ACPI Source Language(ASL) Reference
Add
Add(Addend1, Addend2, Result) => Integer將Addend1與Addend2相加存放到Result。
CreateWordField
CreateWordField(SourceBuffer, ByteIndex, WordFieldName)在SourceBuffer的ByteIndex Offset建立一個Word長度且名為WordFieldName的Object。
DerefOf
DerefOf(Source) => Object回傳Source所Reference的Object。
Device
Device(DeviceName) {TermList}建立一個名為DeviceName的Object,用以代表processor、bus或device等硬體。並會開啟一個name scope。
EISAID
EISAID(EisaIdString) => DWordConst將形式為"UUUNNNN"(U為大寫字母,N為十六進位數字)的文字字串轉換為4 byte長度的EISA ID數字編碼。
Field
Field (RegionName, AccessType, LockRule, UpdateRule) {FieldUnitList}可用以代表RegionName中的某段區塊資料。
AccessType為預設存取寬度,可為AnyAcc、ByteAcc、WordAcc、DWordAcc及QWordAcc。
FileUnitList的Entry可為下列幾種形式,
FieldUnitName, BitLength - Field Unit所使用的命名與長度。Field Unit用以代表某段資料。
Offect (ByteOffset) - 下個Field Unit的Offset。
Include
Include(FilePathName)引入其他ASL File。
Index
Index (Source, IndexNum, Destination) => ObjectReference取得 Source 中第 IndexNum項的 Reference。
如 Source為 Buffer,Index會回傳第IndexNum的byte的Reference。
如 Source為 String,Index會回傳第IndexNum的字元的Reference。
如 Source為 Package,Index會回傳第IndexNum的Object的Reference。
Method
Method (MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, ParameterTypes) {TermList}建立一個名為MethodName的control method,並會開啟一個name scope。
NumArgs代表Method的參數數量。為optional如不使用則代表此Method不使用參數,而最多可使用7個參數,參數分別reference到Arg0 - Arg6。
SerializeRule可填為Serialized或NotSerialized,Serialized代表此Method不會被其他thread同時存取,用以防止產生相同namespace object。若沒有指定則視為NotSerialized。
Name
Name(ObjectName, Object)建立名為ObjectName的Object,並且references到Object。
OperationRegion
OperationRegion(RegionName, RegionSpace, Offset, Length)宣告名為RegionName的Operation Region,配合Field Object用以讀取系統硬體空間。
PowerResource
PowerResource(ResourceName, SystemLevel, ResourceOrder) {ObjectList}宣告名為ResourceName的power resource。
Scope
Scope(Location) {ObjectList}宣告名為Location的namespace,並且ObjectList以Location為參考namespace。
或將目前namespace切換成已存在的namespace。
2018年7月17日 星期二
[ACPI] Device Configuration
本篇文章參考
ACPI Specification Version 6.2 (Errata A)
ACPI Specification Version 5.1 (Errata B)
參考章節為CH6 Device Configuration
OSPM 會根據 Configuration Object去管理操作相關的 Device,其大致分為幾個類型:
Device identification objects
_ADR (Address)
提供OSPM此裝置在所屬的Bus上的Address。| Bus   | Address Encoding   |
| PCI   |
High word - Device Number, Low word - Function Number   (ex: device 3, function 2 會是 0x00030002)   若要參照device的所有function,Function Number則使用0xFFFF |
| USB Ports   | Port Number (1-n )   |
Device configuration objects
_DIS (Disable)
用來 disable device。_PRT (PCI Routing Table)
回傳包含PCI interrupt mapping package列表的package。Device insertion and removal objects
_RMV (Status)
通知OSPM此裝置是否隨時都為可移除。_STA (Status)
回傳裝置的狀態,其狀態可為enabled、disabled和removal。若裝置的Object沒有_STA,則視為設起所有的return bit(present、enabled、shown in UI and functioning)。
Other Objects and Control Methods
_INI (Init)
用來對裝置進行特定的初始化操作,在OSPM加載description table時執行,會根據_STA來決定_INI是否及如何執行。2018年7月3日 星期二
PSPP (PCIe Speed Power Policy)
AGESA Interface Specification for Arch2008
BKDG for AMD Family 12h Processors
PSPP 是動態調整PCIe的Link Speed的使用策略,藉此來達到省電的效果,需有處理器的支援。
其透過 Driver及 Interrupt來使用 BIOS所提供的 ACPI method ALIB(ACPI ASL Library) 達成其在Runtime時的所需的功能。
ALIB
ALIB method是由幾組Function所構成的服務。ALIB (Arg0, Arg1)
Arg0
所要使用的Function的號碼。
Arg1
Function的輸入及輸出參數,會根據Function而有所不同。







