ABL讀取XBL設定的標誌位

haha222發表於2024-09-02

高通啟用UEFI架構的bootloader,有些時候有些狀態值,需要ABL階段獲取.
上層思維總是以屬性來開端,實際上android 的setproperty和getproperty屬性對於uefi啟動流程是不可取的.

自己在修改這塊內容的舉例來簡單記錄下,
XBL setSetVariable 設定標誌位

include <Library/UefiRuntimeServicesTableLib.h>//匯入標頭檔案

...
...

Boolean EpStatus;
EpStatus = TRUE;
gRT->SetVariable (L"ModuleState", &gQcomTokenSpaceGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
(UINTN)sizeof(EpStatus), &EpStatus);

ABL程式碼端獲取值

include <Library/UefiRuntimeServicesTableLib.h>//匯入標頭檔案

...

BOOLEAN EpStatus;
UINTN VarSize = sizeof(BOOLEAN);
Status = gRT->GetVariable (L"ModuleState", &gQcomTokenSpaceGuid,
NULL, &VarSize, (UINT8*)&EpStatus);

EFI_RUNTIME_SERVICES 是關鍵,當然,我這邊使用的高通這個GUID有一個發現就是,這個值我猜測是存入了EMMC的rpmb分割槽,因為直接刷機此值得狀態還是存在的,這個地方還需要繼續驗證一下,也許日後能用到.
bootable\bootloader\edk2\MdePkg\Include\Library\UefiRuntimeServicesTableLib.h

ifndef UEFI_RUNTIME_SERVICES_TABLE_LIB_H

define UEFI_RUNTIME_SERVICES_TABLE_LIB_H

///
/// Cached copy of the EFI Runtime Services Table
///
extern EFI_RUNTIME_SERVICES *gRT;

endif

編譯xbl和abl,列印串列埠即可get到EpStatus的值.

這裡需要提到的是,我這邊用了QcomTokenSpace這個Protocol,
ABL的QcomModulePkg.dec和XBL的中均新增了相應的Protocol
[Guids.common]
gQcomTokenSpaceGuid = { 0x882f8c2b, 0x9646, 0x435f, { 0x8d, 0xe5, 0xf2, 0x08, 0xff, 0x80, 0xc1, 0xbd } }

更多的Uefi SetVariable和GetVariable函式的用法,可以參考
[https://edk2-docs.gitbook.io/edk-ii-uefi-driver-writer-s-guide/5_uefi_services/readme.2/525_getvariable_and_setvariable]

UEFI架構的理解還需要進一步的探究,目前只是皮毛的去解決問題.

相關文章