Repository navigation
orchestrator: Move the SVN floor advance to the update agent's ask - #568
Merged
chrysh merged 3 commits intoOct 15, 2026
Merged
Conversation
chrysh
force-pushed
the
svn-floor-on-0x22
branch
5 times, most recently
from
October 15, 2026 09:02
aa3c420 to
41bf586
Compare
`Event::BootConfirmed` emitted `Effect::CommitSvnFloor`, so an eRoT-held floor moved as soon as the orchestrator decided the image was healthy. The advance is the update agent's to command, with UpdateSecurityRevision (PLDM 0x22); moving on the boot burns anti-rollback before anyone asked. `Event::SvnCommitRequest(id)` is that request arriving. `BootConfirmed` now closes the commit-or-lock window and records the component in `awaiting_floor_advance`; the matching `SvnCommitRequest` emits `CommitSvnFloor` and clears it. One for a component with nothing outstanding is dropped, so the floor takes the SVN once. No watchdog bounds the wait. An agent that never asks leaves the floor where it is, which is what the eRoT's own session does with `AwaitingFloorAdvance`; locking the platform because a remote agent stayed silent would be worse than losing anti-rollback coverage for one image. `CommitTimeout` still guards `pending_commit` alone, so commit-or-lock remains "the device has to boot". Entry to `Updating` and `Recovering` clears the outstanding advance the way it clears `pending_commit`. The SVN the floor would take is the driver's reading of the image the update verified, which a superseding update overwrites, so a late ask would otherwise advance the floor past an image that never booted. Assisted-by: Claude Opus 5 Signed-off-by: Christina Quast <christina.quast@9elements.com>
chrysh
force-pushed
the
svn-floor-on-0x22
branch
2 times, most recently
from
October 15, 2026 15:02
17be37c to
ef10d6f
Compare
Both scenarios treated the confirmed boot as the end of the update. The floor now waits for `Event::SvnCommitRequest`, so each main dispatches it after `BootConfirmed`, the way it already dispatches `BootConfirmed` itself after the device comes back up. The event stands in for the UpdateSecurityRevision exchange because no firmware device parks at `SvnCommitPending` yet: the pinned pldm-lib predates the FdOps callback that turns a received 0x22 into that status, and nothing reads the status and answers. GAPS.md records both halves. Assisted-by: Claude Opus 5 Signed-off-by: Christina Quast <christina.quast@9elements.com>
The machine doc lists what lives in shared storage and what each state answers, so it drifts the moment either changes. `awaiting_floor_advance` is the new flag, `BootConfirmed` no longer emits `CommitSvnFloor`, and `SvnCommitRequest` is what does. The `Ready` table was already missing `BootConfirmed` and `CommitTimeout`, both of which the state handles; they go in with the new rows. Assisted-by: Claude Opus 5 Signed-off-by: Christina Quast <christina.quast@9elements.com>
chrysh
force-pushed
the
svn-floor-on-0x22
branch
from
October 15, 2026 16:47
ef10d6f to
3a7ffdb
Compare
This was referenced Oct 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Builds on #565, merged into
ocp-global-demo-wip.Issue: 9elements#18
An eRoT-held anti-rollback floor moved on
Event::BootConfirmed, the momentthe orchestrator decided the updated image was healthy. That floor belongs to a
component that tracks no SVN of its own, and the agent commands the advance
with UpdateSecurityRevision (PLDM 0x22), so moving on the boot would burn
anti-rollback before the agent asked for it.
Event::SvnCommitRequest(id)is that request arriving. The floor it names isone the eRoT holds, so there is no device-side commit to wait for; what gates
the advance is the window
BootConfirmedopened.BootConfirmednow closes the commit-or-lock window and records thecomponent in
awaiting_floor_advance; the matchingSvnCommitRequestemitsCommitSvnFloorand clears it. An ask for a component with nothingoutstanding is dropped, so the floor takes the SVN once however many times
the agent asks.
Two design calls worth ratifying in review, both mirroring what the eRoT's own
session does rather than what the old
BootConfirmedpath did:No watchdog bounds the wait. An agent that never sends UpdateSecurityRevision
leaves the floor where it is, the way a confirmed self-update session sits at
AwaitingFloorAdvance. Locking the platform because a remote agent went quietcosts more than losing anti-rollback coverage for one image.
CommitTimeoutstill guards
pending_commitalone, so commit-or-lock stays "the device hasto boot".
An outstanding advance is voided by anything that puts the running image under
suspicion: entry to
UpdatingorRecovering, and gating the component out ofservice. The SVN the floor would take is the driver's reading of the image the
update verified, which a superseding update overwrites, so a late ask would
otherwise advance the floor past an image that never booted. The gating case
has its own test, checked against the failure it exists for.
The eRoT's own floor already behaved this way and is unchanged: the only thing
that writes it is
commit_self_svn_floor, which refuses a session that doesnot read
Committed. #565 is what gets a session there.What is still missing is in GAPS.md: no firmware device parks at
SvnCommitPending, so both update scenarios dispatchSvnCommitRequestthemselves, the way they already dispatch
BootConfirmed. Under that sit twopieces, neither in this PR. The pldm-lib FdOps callback that turns a received
0x22 into the status is not in the pinned revision (
c709ae4predates it, andit is not on pldm-lib
mainyet). The event-loop glue that reads the statusand answers is the other, for a device with
commit_svn_floorand for theeRoT's own floor with
commit_self_svn_floor.Tested:
bazel test //services/...passes 38/38 andbazel test --config=virt_ast10x0 //target/ast10x0/tests/integration/...passes 26/26.
./pw presubmitis green.