HIIのSave、Callback、Resetの流れ

UEFI HIIのSave flowを、browser state、callback action、RouteConfig、SetVariable、ActionRequest、reset処理から整理する。

更新 約 4 分
Đọc bằng 日本語 Tiếng Việt English
HII Setup cover

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したように見えるのに値が消える場合、次の順で確認します。

  1. form open時にExtractConfig()はどの値を返すか。
  2. どのcallback actionが、どの値で来ているか。
  3. user変更後のBrowser stateは正しいか。
  4. Save時にRouteConfig()は呼ばれているか。
  5. RouteConfig()はconfig stringを正しくparseしているか。
  6. SetVariable()のstatusは何か。
  7. reboot後、GetVariable()でどの値が読めるか。
  8. 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.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.