Note: REGISTER_ACPI_FN 的使用

在P-Code 里面, 同 A-Code 有一些讓 OEM 去Hook 的點, A Code透過所謂 ELINK/SDL Files, 統一所有Hooks 的點, 而且是機乎處處可OEM Hook! 但P-Code 沒有, 今天試了 REGISTER_ACPI_FN 的MACRO. 卻遇到一個莫名其妙的問題!

就是透過 Make.mak 將新增的檔案加入, 但是該檔案與某目錄下的檔案同名, 結果會造成 link 不到該 segments 的問題!看來P Code 的Build System 做的很玄奧, 讓我搞不懂它呀!

想要使用 REGISTER_ACPI_FN, 可以在Codebase 理面發現也有好幾個地方使用, 因此參考去寫出自己需要的功能並不是一件困難的事情!

使用上要注意 BCP.ASM 內是否將 “INSTALL_ACPI  ServiceName” 對應的Service已經選擇

不同的Service 通常也對應到不同Segments, 可以透過檢視 ACPI.INC 去找出 MACRO 中對應的關係

Service 目前看到的是有下列

  • ACPISAVETODISK
  • ACPIMCDINIT
  • ACPICSINIT
  • ACPISERVICES
  • ACPISERVICE32
  • ACPIMCDSERVICE
  • ACPIS2
  • ACPIS3
  • ACPIS4
  • ACPISBFSUPPORT
  • ACPIMP
  • ACPIVidExtension
  • ACPIS5SERVICES
  • ACPIS5PME
  • ACPIOPROMCHECK
  • ACPIIDE
  • ACPIPSTATE
  • ACPICSTATE
  • ACPISLEEPTRAP32
  • ACPIS3ATAPI
  • ACPIOSTYPE
  • ACPIMMTIMER
  • ACPIOEMS3
  • ACPIINSTALLED
  • ACPIMCFG
  • ACPICBA
  • ACPISTARTUP
  • ACPISLP20
  • ACPIPCIEHOTPLUG
  • ACPIUEFIS3

而當使用 REGISTER_ACPI_FN 實際上是去宣告一個Struct/Table, 讓ACPI Service 可以去Lookup 要Callback 的 OEM function

這種方法在 A Code 是當需要Create OEM SMI function 所採用的方法!

可以REGISTER_ACPI_EN如下

Segment POST

  • GET_REGISTER_BLOCK
  • INITIALIZE
  • ALLOC_NVS
  • RECLAIM_TABLE
  • ALLOCATE_RELAIM
  • APIC_ENTRY
  • MCFG_ENTRY
  • WAKE_FROM_S3

Segment SMM

  • PHOENIX_SERVICES
  • ENABLE
  • DISABLE
  • S5_SERVICES

Segment 32bit SMM

  • ENABLE32
  • DISABLE32
  • SAVE_CONFIG
  • RESTORE_CONFIG
  • SLEEP_TRAP32
  • UEFI_RESTORE_CONFIG_EARLY
  • UEFI_RESTORE_CONFIG_LATE
  • UEFI_RESTORE_CONFIG_AFTER

REGISTER_ACPI_FN 還有一個參數是 Priority, 用來決定執行順序, 分別是 CRITICAL, HIGH, MEDIUM, LOW

這次實驗是Register ENABLE32, DISABLE32, 去做 ACPI ENABLE/DISABLE 的Hook, 將某個 GPI/SMI 切換成 GPI/SCI.

 

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: