HIIのSave、Callback、Resetの流れ
UEFI HIIのSave flowを、browser state、callback action、RouteConfig、SetVariable、ActionRequest、reset処理から整理する。
BIOS Setupでuserがoptionを変更し、callbackのlogも出て、UI上の値も変わったのに、reboot後には元に戻ることがあります。逆に、userがまだ選択しただけなのにcallback内でNVRAMへ書いてしまい、その後Cancelしてもsettingが保存されてしまうこともあります。これはHIIのSave、Callback、Reset flowでよく起きる不具合です。
重要なのは、CallbackはSaveではない、Browser stateはNVRAMではない、Reset requiredはreset済みという意味ではないという点です。
全体の流れ
Open Setup page
-> Browser calls ExtractConfig or loads current VarStore data
-> User changes a Question
-> Browser updates browser state
-> Browser may call Callback with an action
-> User chooses Save
-> Browser calls RouteConfig
-> Driver validates and commits data
-> Driver may call SetVariable
-> Browser or driver requests reset if needed
この経路には、同じsettingの複数のコピーがあります。UI上の値、Browser state、driverのprivate data、NVRAM上のUEFI variable、そしてreboot後にboot pathが実際に読む値です。
誤解しやすいaction
名称はEDK IIやBrowser実装によって違いますが、source readingでは次の段階を分けて考える必要があります。
CHANGING userが値を変更しようとしている
CHANGED browser state上で値が変わった
SUBMITTED userがform/questionをsubmitまたはsaveした
RETRIEVE Browserが現在値を取りに行く
DEFAULT Browserがdefault valueを要求する
FORM_OPEN formが開かれた
FORM_CLOSE formが閉じられた
すべてのactionでNVRAMへ書くべきではありません。多くのprojectでは、callbackはvalidate、dynamic UI update、ActionRequestの設定に使われ、実際のcommitはRouteConfig()で行われます。
RouteConfigが実際のsave pathになることが多い
RouteConfig()は、Browserが新しいconfigurationをdriverへ戻す場所です。driverはconfig stringをparseし、bufferを更新し、policyをvalidateし、必要ならSetVariable()または別のbackend storageへ書きます。
callbackでは正しい値が見えているのにreboot後に失われる場合、まずRouteConfig()を確認します。RouteConfig()が正しく書いているのにboot後の動作が違う場合は、reboot後にそのsettingを読むconsumer側を疑います。
Reset flow
device enable、boot mode、SATA mode、Secure Boot policy、debug levelのようなsettingは、変更後にresetが必要になることがあります。driverまたはBrowserはActionRequestや同等のflagでresetを要求します。
ただし「resetが必要」というのはpolicy requestです。Platform側には、そのrequestを処理する経路が必要です。promptを表示する、reset flagを保持する、正しいタイミングでreset serviceを呼ぶ、user確認後にresetする、といった処理が必要になります。
実際のdebug例: Saveした値がreboot後に消える
Saveしたように見えるのに値が消える場合、次の順で確認します。
- form open時に
ExtractConfig()はどの値を返すか。 - どのcallback actionが、どの値で来ているか。
- user変更後のBrowser stateは正しいか。
- Save時に
RouteConfig()は呼ばれているか。 RouteConfig()はconfig stringを正しくparseしているか。SetVariable()のstatusは何か。- reboot後、
GetVariable()でどの値が読めるか。 - default、migration、policy codeが値を上書きしていないか。
Cancelしたのに値が残る場合は、callback内でNVRAMへ早く書きすぎている可能性が高いです。
Sourceを読むときのチェックポイント
HII save/callback/reset checklist
一時的なcallback、実際のcommit、reset requestを分けて確認する。
あると便利なlog
FormId / QuestionId
Callback Action
Browser value
Private data value
Config string from RouteConfig
Parsed value
SetVariable status
ActionRequest / reset required flag
Value before reboot
Value after reboot
Consumer-side value during boot
RouteConfigのlogがないと、Saveが本当に走ったのか判断しづらくなります。
Firmwareとsecurityの観点
UIから来た値をそのまま信用しない方が安全です。backend側でrange、enum、dependency、lock stateを確認してからcommitする必要があります。特に重要なsettingでは、callbackは調整点の一つであり、唯一のsecurity boundaryではありません。
関連ノート
この記事が役に立ったら
ファームウェア、BIOS/UEFI、組み込みシステムを学んでいる人に共有したり、作者を応援したりできます。
Nội dung liên quan
Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.
HII/VFR要素のチートシート
VFR/HIIの主要要素を、FormSet、Form、Question、OneOf、CheckBox、VarStore、DefaultStore、SuppressIf、GrayOutIfから整理する。
UEFI HII Architecture Overview
HIIの全体像: driver、package list、HII Database、Setup Browser、ConfigAccess、variable storageを整理します。
BIOS Setupとは: クラシックな青い画面からHIIと現代のNVRAMまで
現代のBIOS SetupはHII上に構築されている: VFR、VarStore、NVRAM。structの途中にフィールドを追加するとなぜシステムが壊れるのか、そして保存されない設定のデバッグ方法。
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.