一、ACPI source code ASL 编译流程
1. 初始化UEFI编译环境
edksetup.bat
2. 创建ASL源文件
终端执行以下命令生成 csdn.asl.
和csdnhw.asl
echo '
DefinitionBlock ("csdn.asl","DSDT",2,"ICSDN","PLATECSDN",3)
{
#include "csdnhw.asl"
} // end of DSDT
' >> csdn.asl
echo '
Scope (\_SB) {
Name(TEMP,0)
Device(csdndev) {
Name(_HID,EISAID("PNP0C03"))
#ifdef CSDN_ENABLE
Name(_UID,"CSDNRESV")
#endif
Method(_STA, 0)
{
Return (0)
}
}
}
' >> csdnhw.asl
3. 编译 ASL
1) 将ASL 预处理为.i 文件
Trim --asl-file -o csdn.i csdn.asl
2) 将.i 预处理为.iii 文件
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\vc\bin\amd64\cl.exe" /nologo /E /C /D CSDN_ENABLE csdn.i > csdn.iii
3) 将.iii 预处理为.iiii 文件
Trim --source-code -l -o csdn.iiii csdn.iii
4) 将 .iiii 文件 编译为.aml文件
C:\ASL\iasl.exe -vr -oi -so csdn.iiii
5) 将 .aml 打包成.raw文件
GenSec -s EFI_SECTION_RAW -o csdn.raw csdn.aml
6) 将 .raw 打包成.ffs文件
GenFfs -t EFI_FV_FILETYPE_FREEFORM -g B4BA6241-936C-4485-A483-9FA832C758CA -o B4BA6241-936C-4485-A483-9FA832C758CA.ffs -oi csdn.raw
这一步其实可以省略掉,因为ACPI raw
文件会最终和efi,ui,depex
文件打包为 ffs
. 参考如下定义:
[Rule.Common.DXE_RUNTIME_DRIVER.DRIVER_ACPITABLE]
FILE DRIVER = $(NAMED_GUID) {
DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex
PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi
RAW ACPI Optional |.acpi
RAW ASL Optional |.aml
UI STRING="$(MODULE_NAME)" Optional
VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER)
}
二、 ACPI Table Dump
1. For Linux OS
-
Install acpi-tools
rpm -ivh http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/acpica-tools-20180629-3.el8.x86_64.rpm
OR
wget http://mirrors.163.com/centos/8/BaseOS/x86_64/os/Packages/acpica-tools-20180629-3.el8.x86_64.rpm yum install acpica-tools-20160527-3.el7.x86_64.rpm
-
Dump all tables to xxx.dat
acpidump > alltables.dat
ORacpidump -o alltables.dat
-
Extract all tables from text dat file
# dump all tables from text output files, dsdt.dat, ssdt.dat
acpixtract -a alltables.dat
# gen xxx.dsl code from xxx.dat
iasl -d dsdt.dat
PS:
或者直接
# de-compile DSDT to DSDT.dsl
cp -R /sys/firmware/acpi/tables/* .
iasl -d DSDT
2. For Win OS
RWEverything
或者
acpidump.exe -b
( acpi windwos tool download link: https://acpica.org/downloads/binary-tools
)
3. For EFI SHELL
acpiDump.efi -b
( acpi efi tool download link: https://acpica.org/downloads/binary-tools
)
三、Install ACPI Table for FW
EFI_ACPI_TABLE_PROTOCOL *AcpiTable;
UINTN TableKey;
EFI_ACPI_DESCRIPTION_HEADER *Table.;
UINTN TableSize;
// 从efi所在的ffs中提取 aml section
Status = GetSectionFromFv (
&gEfiCallerIdGuid,
EFI_SECTION_RAW,
0,
(VOID **) &Table,
&TableSize
);
//获取Acpi protocol
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTable);
TableKey = 0;
CopyMem (Table->OemId, "CSDN " sizeof (Table->OemId) );
Status = AcpiTable->InstallAcpiTable (
AcpiTable,
Table,
TableSize,
&TableKey
);
以下图示展示了将一个自定义的ACPI table
安装进UEFI
并在UEFI shell dump
,具体效果如下:
Linux下AcpiDump具体效果如下:
四、Linux kernel create ACPI service flow
arch/x86/kernel/head64.S ->
arch/x86/kernel/head64.c:x86_64_start_kernel() ->
arch/x86/kernel/head64.c:x86_64_start_reservations ->
init/main.c:start_kernel() ->
arch/x86/kernel/setup.c:setup_arch() ->
acpi_boot_table_init() ->
acpi_table_init() ->
acpi_initialize_tables() ->
acpi_os_get_root_pointer() ->
acpi_find_root_pointer()