Skip to content

Conversation

@hawkw
Copy link
Member

@hawkw hawkw commented Jul 22, 2025

Currently, Hubris' Rust toolchain is pinned to nightly-2024-09-17,
which is from 10 months ago. This is kind of unfortunate, especially
because that nightly is too old to support the Rust 2024 edition, which
means we cannot update our dependencies on any crates where the latest
version is built with Rust 2024.

Beyond just updating the toolchain, there were some noteworthy changes:

In addition, there were a variety of unremarkable linting changes,
including slightly better dead code detection (which detected some new
dead code), and some annoying clippy nonsense.

Note that this branch requires oxidecomputer/idolatry#65, which updates
idol to generate code that doesn't emit warnings with the new
toolchain, and fixes some of the flash/RAM size regression in code
generated by idol.

Fixes #2165

@hawkw hawkw force-pushed the eliza/update-nightly branch from 7e1a8d9 to 68cd58a Compare July 22, 2025 20:18
hawkw added 6 commits July 23, 2025 10:05
Previously, we were getting the address of `static mut`s
(linker-provided addresses) using `NAME_OF_STATIC.as_ptr()`. This
creates a temporary shared reference to the mutable static, as
`[T]::as_ptr()` has an `&self` receiver. This can now be changed to use
`&raw const NAME_OF_STATIC`, which takes the address of the static
without creating a temporary shared reference.
Presumably this was meant to be publicly re-exported, and that's why
it's creating `dead_code` warnings. It appears nothing is currently
consuming it, since it wasn't publicly accessible, but I am assuming
that it will eventually be used outside of `stage0-handoff`. cc @lzrd am
I correct in this?
The `net` task itself doesn't use this enum, but its clients do. We
*could* change this up a bit to only generate it when building the
client, but other stuff in the `generate_socket_enum` already has
`#[allow(unused)]` on it, so I didn't think it was super important.
These will need to be pointed back at `main` when
oxidecomputer/idolatry#65 merges.
Cargo.toml Outdated
Comment on lines 151 to 152
idol = { git = "https://github.com/oxidecomputer/idolatry.git", default-features = false, branch = "eliza/nightly-2025-07-20" }
idol-runtime = { git = "https://github.com/oxidecomputer/idolatry.git", default-features = false, branch = "eliza/nightly-2025-07-20" }
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These should be pointed back at main when oxidecomputer/idolatry#65 merges.

@hawkw hawkw changed the title [WIP] update to nightly-2025-07-20 Update to nightly-2025-07-20 Jul 23, 2025
@hawkw
Copy link
Member Author

hawkw commented Jul 23, 2025

Note that commit ced6724 is a somewhat massive diff, as it fixes a huge amount of new Clippy lints, and therefore touches a lot of files. It may be useful to review the change prior to that commit to focus on the more substantial changes.

@hawkw hawkw marked this pull request as ready for review July 23, 2025 19:22
@hawkw hawkw requested review from cbiffle, flihp and labbott as code owners July 23, 2025 19:22
@hawkw
Copy link
Member Author

hawkw commented Jul 24, 2025

Thanks to @mkeeter, we now understand why the slightly less good debug info for HIFFY_FUNCTIONS is apparently load-bearing!

It turns out that in Humility, definitions is a map of DWARF...things...that don't have other more specific debug info.If something has a symbol or a source location, it gets put in a map called variables, and if it doesn't...that's right, it goes in the definitions hole. When humility hiffy goes to look up the HIFFY_FUNCTIONS symbol, it uses a method called HubrisArchive::lookup_definition, which (perhaps unsurprisingly) only looks at the definitions map:

    pub fn lookup_definition(&self, name: &str) -> Result<&HubrisGoff> {
        match self.definitions.get(name) {
            Some(goff) => Ok(goff),
            None => Err(anyhow!("definition {} not found", name)),
        }
    }

AS YOU CAN MAYBE BEGIN TO GUESS, this means that if it went in variables instead of definitions, Hiffy will just give up.

So why does it go in variables after the #[used] attribute change? Recall that the change makes #[used] into #[used(linker)] rather than #[used(compiler)] when making an ELF. So, the linker no longer believes that HIFFY_FUNCTIONS is unused, and doesn't optimize it out at link-time. This means that now there's a HIFFY_FUNCTIONS symbol in the program text as well as in the DWARF, and now humility's object loader hits the "yes, it has a symbol" case and puts it in variables rather than hitting the "no symbol" case and putting it in the definitions hole. So having better debug info for the thing makes our debugger break. That's so cool lol lmao.

As for fixing this, @mkeeter has opened a humility PR oxidecomputer/humility#554 to make humility's lookup_definitions function look in both definitions and variables, so it no longer cares whether the looked-up thing has a real symbol or not. Since humility hiffy is the only consumer of this method, and changing it fixes it, I'm not concerned that looking in both maps will break something else that expected a thing to not have a symbol. However, to avoid a Humility flag day where images built after the nightly update don't work with earlier versions of Humility, I'm going to leave commit 4caf107 in, which changes the HIFFY_FUNCTIONS static to #[used(compiler)]. That way, on older versions of Humility that only look in definitions, hiffy will still work.

@hawkw
Copy link
Member Author

hawkw commented Jul 24, 2025

As far as testing this change goes, thus far I've flashed a Cosmo and have confirmed that the host comes up when asked. Next I intend to test updating via faux-mgs but have thus far been struggling to figure out how the paris lab environment is actually set up.

@hawkw
Copy link
Member Author

hawkw commented Jul 24, 2025

Okay, after a bit of a misadventure with paris, I've flashed a Cosmo with the image from this branch and then updated it over the network back to the previous image. So that's reassuring!

console session testing with cosmo
eliza@lurch ~ $ pfexec humility -t cosmo-sp --archive build-cosmo-a-lab-image-default.zip flash
humility: WARNING: archive on command-line overriding archive in environment file
humility: attaching with chip set to "STM32H753ZITx"
humility: attached to 0483:3754:003F00164741500920383733 via ST-Link V3
humility: flash/archive mismatch; reflashing
humility: auxiliary flash data is already loaded in slot 14; skipping programming
humility: done with auxiliary flash
humility: flashing done
eliza@lurch ~ $ pfexec humility -t cosmo-sp --archive build-cosmo-a-lab-image-default.zip net ip
humility: WARNING: archive on command-line overriding archive in environment file
humility: attached to 0483:3754:003F00164741500920383733 via ST-Link V3
MAC address:  a8:40:25:04:06:43
IPv6 address: fe80::aa40:25ff:fe04:0643
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe04:064b]:11111' state
Jul 24 23:15:26.726 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 24 23:15:26.728 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:64b%3]:11111, interface: axf2, component: faux-mgs
Jul 24 23:15:26.734 INFO V2(SpStateV2 { hubris_archive_id: [109, 111, 90, 142, 250, 122, 151, 215], serial_number: [66, 82, 77, 49, 51, 50, 53, 48, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 1, base_mac_address: [168, 64, 37, 4, 6, 67], power_state: A2, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([25, 176, 174, 225, 18, 174, 244, 13, 20, 224, 181, 35, 96, 255, 140, 93, 208, 39, 168, 10, 52, 143, 62, 79, 242, 84, 8, 164, 132, 203, 54, 155]), slot_b_sha3_256_digest: Some([38, 246, 196, 196, 89, 7, 145, 180, 170, 104, 93, 208, 83, 71, 203, 154, 34, 17, 28, 126, 67, 244, 90, 137, 73, 72, 164, 237, 0, 215, 180, 95]) }) }), hubris archive: 6d6f5a8efa7a97d7
componentserial number: BRM13250003
:model: 913-0000023
revision: 1
 base MAC address: a8:40:25:04:06:43
power state: A2
faux-mgsRotStateV2 {
 active: A,
 persistent_boot_preference: A,
 pending_persistent_boot_preference: None,
 transient_boot_preference: None
 slot_a_sha3_256_digest: 19b0aee112aef40d14e0b52360ff8c5dd027a80a348f3e4ff25408a484cb369b,
 slot_b_sha3_256_digest: 26f6c4c4590791b4aa685dd05347cb9a22111c7e43f45a894948a4ed00d7b45f,
}

eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe04:064b]:11111' update sp 0 build-cosmo-a-lab-image-default-master.zip
Jul 24 23:16:22.473 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 24 23:16:22.474 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:64b%3]:11111, interface: axf2, component: faux-mgs
Jul 24 23:16:22.494 INFO generated update ID, id: d9d4d8c8-cfb7-4f07-ba85-50074f3aab27, component: faux-mgs
Jul 24 23:16:22.627 INFO starting SP update, sp_image_size: 688384, aux_flash_size: 1106756, aux_flash_chck: [144, 62, 165, 153, 126, 43, 184, 199, 177, 243, 151, 250, 240, 56, 171, 188, 223, 170, 249, 224, 181, 162, 68, 241, 196, 140, 5, 21, 249, 241, 45, 127], id: d9d4d8c8-cfb7-4f07-ba85-50074f3aab27, interface: axf2, component: faux-mgs
Jul 24 23:16:27.361 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 3 }, kind: SpResponse(Error(UpdateInProgress(Preparing(UpdatePreparationStatus { id: UpdateId([217, 212, 216, 200, 207, 183, 79, 7, 186, 133, 80, 7, 79, 58, 171, 39]), progress: Some(UpdatePreparationProgress { current: 0, total: 48 }) })))) }, interface: axf2, component: faux-mgs
Jul 24 23:16:27.362 INFO update preparing: 0/48, component: faux-mgs
Jul 24 23:16:27.867 INFO update preparation complete, update_id: d9d4d8c8-cfb7-4f07-ba85-50074f3aab27, interface: axf2, component: faux-mgs
Jul 24 23:16:28.365 INFO update in progress, total_size: 1795140, bytes_received: 1250522, component: faux-mgs
Jul 24 23:16:29.370 INFO update in progress, total_size: 1795140, bytes_received: 1525340, component: faux-mgs
Jul 24 23:16:30.650 INFO update complete, id: d9d4d8c8-cfb7-4f07-ba85-50074f3aab27, interface: axf2, component: faux-mgs
update complete
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe04:064b]:11111' reset
Jul 24 23:18:19.828 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 24 23:18:19.830 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:64b%3]:11111, interface: axf2, component: faux-mgs
Jul 24 23:18:19.830 INFO SP is prepared to reset, component: faux-mgs
reset complete
Jul 24 23:18:33.839 INFO SP reset complete, component: faux-mgs
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe04:064b]:11111' state
Jul 24 23:19:20.764 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 24 23:19:20.765 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:64b%3]:11111, interface: axf2, component: faux-mgs
Jul 24 23:19:20.771 INFO V2(SpStateV2 { hubris_archive_id: [94, 222, 137, 232, 184, 4, 87, 39], serial_number: [66, 82, 77, 49, 51, 50, 53, 48, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 1, base_mac_address: [168, 64, 37, 4, 6, 67], power_state: A2, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([25, 176, 174, 225, 18, 174, 244, 13, 20, 224, 181, 35, 96, 255, 140, 93, 208, 39, 168, 10, 52, 143, 62, 79, 242, 84, 8, 164, 132, 203, 54, 155]), slot_b_sha3_256_digest: Some([38, 246, 196, 196, 89, 7, 145, 180, 170, 104, 93, 208, 83, 71, 203, 154, 34, 17, 28, 126, 67, 244, 90, 137, 73, 72, 164, 237, 0, 215, 180, 95]) }) }), component: faux-mgs
hubris archive: 5ede89e8b8045727
serial number: BRM13250003
model: 913-0000023
revision: 1
base MAC address: a8:40:25:04:06:43
power state: A2
RotStateV2 {
 active: A,
 persistent_boot_preference: A,
 pending_persistent_boot_preference: None,
 transient_boot_preference: None
 slot_a_sha3_256_digest: 19b0aee112aef40d14e0b52360ff8c5dd027a80a348f3e4ff25408a484cb369b,
 slot_b_sha3_256_digest: 26f6c4c4590791b4aa685dd05347cb9a22111c7e43f45a894948a4ed00d7b45f,
}
eliza@lurch ~ $

@hawkw
Copy link
Member Author

hawkw commented Jul 25, 2025

further testing (sidecar): flashing the SP, checking that it's alive, unlocking the techport, discovering other SPs over the management network, and then updating it back to how it was before over the management network:

sidecar test session
eliza@lurch ~  $ 
humility: WARNING: archive on command-line overriding archive in environment file
humility: attaching with chip set to "STM32H753ZITx"
humility flash failed: Could not find probe 0483:374e:0028001E4741500720383733.

Because a serial number is present, this may be due to not running humility with permission to read USB device serial numbers; if not root already, run again as root?
eliza@lurch ~ $ humility --target sidecar-sp --archive build-sidecar-b-lab-image-default.zip flash
pfexec humility --target sidecar-sp --archive build-sidecar-b-lab-image-default.zip flash
humility: WARNING: archive on command-line overriding archive in environment file
humility: attaching with chip set to "STM32H753ZITx"
humility: attached to 0483:374e:0028001E4741500720383733 via ST-Link V3
humility: flash/archive mismatch; reflashing
humility: auxiliary flash data is already loaded in slot 0; skipping programming
humility: done with auxiliary flash
humility: flashing done
eliza@lurch ~ $ pfexec humility --target sidecar-sp --archive build-sidecar-b-lab-image-default.zip tasks
humility: WARNING: archive on command-line overriding archive in environment file
humility: attached to 0483:374e:0028001E4741500720383733 via ST-Link V3
system time = 43664
ID TASK                       GEN PRI STATE
 0 jefe                         0   0 recv, notif: fault timer(T+36)
 1 sys                          0   1 recv, notif: exti-wildcard-irq(irq6/irq7/irq8/irq9/irq10/irq23/irq40)
 2 rng_driver                   0   6 recv
 3 update_server                0   3 recv
 4 auxflash                     0   3 recv
 5 net                          0   5 recv, notif: eth-irq(irq61) wake-timer(T+356)
 6 control_plane_agent          0   7 recv, notif: socket usart-irq timer
 7 sprot                        0   4 recv
 8 udpecho                      0   6 notif: socket
 9 udpbroadcast                 0   6 notif: bit31(T+24)
10 monorail                     0   6 recv, notif: wake-timer(T+99)
11 i2c_driver                   0   2 recv
12 hiffy                        0   5 notif: bit31(T+217)
13 sensor                       0   4 recv
14 ecp5_mainboard               0   3 recv
15 ecp5_front_io                0   3 recv
16 transceivers                 0   6 recv, notif: socket timer(T+44)
17 packrat                      0   3 recv
18 sequencer                    0   4 recv, notif: timer(T+539)
19 thermal                      0   5 recv, notif: timer(T+444)
20 power                        0   6 recv, notif: timer(T+953)
21 validate                     0   5 recv
22 ignition                     0   5 recv, notif: timer(T+547)
23 vpd                          0   3 recv
24 dump_agent                   0   6 recv, notif: socket
25 idle                         0   8 RUNNING
26 udprpc                       0   6 notif: socket
eliza@lurch ~ $ pfexec humility --target sidecar-sp --archive build-sidecar-b-lab-image-default.zip net ip
humility: WARNING: archive on command-line overriding archive in environment file
humility: attached to 0483:374e:0028001E4741500720383733 via ST-Link V3
MAC address:  a8:40:25:05:05:00
IPv6 address: fe80::aa40:25ff:fe05:0500
eliza@lurch ~ $ pilot sp -i axf2 ls
MAC               SERIAL      TYPE    IMAGE            IP
a8:40:25:05:05:00 BRM44220006 sidecar c074c373ef5677d1 fe80::aa40:25ff:fe05:500
eliza@lurch ~ $ pilot sp -i axf2 exec -e 'monorail unlock --time 3600s' BRM44220006
Jul 25 18:06:33.247 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:06:33.252 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:06:33.274 INFO received challenge Trivial { timestamp: 187508 }, component: faux-mgs
done
eliza@lurch ~ $ pilot sp -i axf2 ls
MAC               SERIAL      TYPE    IMAGE            IP
0e:1d:2e:e3:e6:99 -           unknown 941d849f2bd9cee6 fe80::c1d:2eff:fee3:e69a
a8:40:25:04:06:43 BRM13250003 cosmo   5ede89e8b8045727 fe80::aa40:25ff:fe04:64b
a8:40:25:05:05:00 BRM44220006 sidecar c074c373ef5677d1 fe80::aa40:25ff:fe05:500
a8:40:25:06:01:02 BRM45220003 psc     dc52e0d8cc569f50 fe80::aa40:25ff:fe06:103
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe06:103]:11111' discover
Jul 25 18:08:40.409 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:08:40.410 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe06:103%3]:11111addr=[fe80::aa40:25ff:fe06:103%3]:11111, port=Two
, interface: axf2, component: faux-mgs
Jul 25 18:08:40.410 INFO SP discovered, port: Two, addr: [fe80::aa40:25ff:fe06:103%3]:11111, interface: axf2, component: faux-mgs
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe05:500]:11111' state
Jul 25 18:18:18.879 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:18:18.881 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:18:18.888hubris archive: c074c373ef5677d1
 serial number: BRM44220006
INFOmodel: 913-0000006
revision: 4
 base MAC address: a8:40:25:05:05:00
power state: A0
V2(SpStateV2 { hubris_archive_id: [192, 116, 195, 115, 239, 86, 119, 209], serial_number: [66, 82, 77, 52, 52, 50, 50, 48, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 4, base_mac_address: [168, 64, 37, 5, 5, 0], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([71, 120, 43, 183, 203, 145, 239, 203, 215, 117, 68, 168, 174, 28, 25, 170, 65, 242, 204, 116, 140, 38, 103, 68, 118, 71, 164, 36, 3, 189, 45, 23]), slot_b_sha3_256_digest: Some([245, 13, 96, 186, 5, 206, 160, 79, 137, 250, 183, 184, 70, 249, 173, 246, 137, 25, 91, 182, 226, 66, 106, 50, 117, 85, 119, 88, 78, 172, 150, 105]) }) })rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("47782bb7cb91efcbd77544a8ae1c19aa41f2cc748c2667447647a42403bd2d17"),
slot_b_sha3_256_digest: Some("f50d60ba05cea04f89fab7b846f9adf689195bb6e2426a32755577584eac9669"),
}

)
, component: faux-mgs
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe05:500]:11111' update sp 0 /gimlet/hubris/archives/build-sidecar-b-lab-image-default.zip
Jul 25 18:19:42.219 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:19:42.221 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:19:42.225 INFO generated update ID, id: 869268b3-82cd-4ba9-9a2a-86fb53427a25, component: faux-mgs
Jul 25 18:19:42.374 INFO starting SP update, sp_image_size: 719360, aux_flash_size: 1168916, aux_flash_chck: [185, 22, 164, 101, 114, 241, 9, 198, 155, 121, 14, 135, 124, 31, 187, 176, 94, 223, 201, 204, 27, 143, 202, 92, 102, 15, 157, 136, 46, 182, 33, 57], id: 869268b3-82cd-4ba9-9a2a-86fb53427a25, interface: axf2, component: faux-mgs
Jul 25 18:19:46.764 INFO update preparing: 0/48, component: faux-mgs
Jul 25 18:19:46.765 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 5 }, kind: SpResponse(UpdateStatus(Preparing(UpdatePreparationStatus { id: UpdateId([134, 146, 104, 179, 130, 205, 75, 169, 154, 42, 134, 251, 83, 66, 122, 37]), progress: Some(UpdatePreparationProgress { current: 0, total: 48 }) }))) }, interface: axf2, component: faux-mgs
Jul 25 18:19:46.765 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 5 }, kind: SpResponse(UpdateStatus(Preparing(UpdatePreparationStatus { id: UpdateId([134, 146, 104, 179, 130, 205, 75, 169, 154, 42, 134, 251, 83, 66, 122, 37]), progress: Some(UpdatePreparationProgress { current: 0, total: 48 }) }))) }, interface: axf2, component: faux-mgs
Jul 25 18:19:47.766 INFO aux flash scan complete, total_size: 1888276, found_match: true, component: faux-mgs
Jul 25 18:19:48.766 INFO update preparation complete, update_id: 869268b3-82cd-4ba9-9a2a-86fb53427a25, interface: axf2, component: faux-mgs
Jul 25 18:19:48.768 INFO update in progress, total_size: 1888276, bytes_received: 1169894, component: faux-mgs
Jul 25 18:19:49.773 INFO update in progress, total_size: 1888276, bytes_received: 1458404, component: faux-mgs
Jul 25 18:19:50.774 INFO update in progress, total_size: 1888276, bytes_received: 1754738, component: faux-mgs
Jul 25 18:19:51.550 INFO update complete, id: 869268b3-82cd-4ba9-9a2a-86fb53427a25, interface: axf2, component: faux-mgs
update complete
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe05:500]:11111' reset
Jul 25 18:23:52.068 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:23:52.069 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:23:52.070 INFO SP is prepared to reset, component: faux-mgs
Jul 25 18:23:52.076 WARN unexpected error when checking for watchdog support: SpError(Watchdog(Rot(DongleDetected))), interface: axf2, component:Error: Error response from SP: watchdog: RoT error: the SP programming dongle is connected
 faux-mgs
eliza@lurch ~ $ pfexec humility --target sidecar-sp --archive build-sidecar-b-lab-image-default.zip reset
humility: WARNING: archive on command-line overriding archive in environment file
humility: Opened 0483:374e:0028001E4741500720383733 via ST-Link V3
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe05:500]:11111' state
Jul 25 18:25:17.180 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:25:23.185 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Error: Error response from SP: monorail: management network is locked
eliza@lurch ~ $ pilot sp -i axf2 exec -e 'monorail unlock --time 3600s' BRM44220006

Jul 25 18:25:34.774 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:25:34.775 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:25:34.797 INFO received challenge Trivial { timestamp: 22474 }, component: faux-mgs
done
eliza@lurch ~ $ faux-mgs --interface axf2 --discovery-addr '[fe80::aa40:25ff:fe05:500]:11111' state
Jul 25 18:25:48.244 INFO creating SP handle on interface axf2, component: faux-mgs
Jul 25 18:25:48.245 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe05:500%3]:11111, interface: axf2, component: faux-mgs
Jul 25 18:25:48.252 INFO V2(SpStateV2 { hubris_archive_id: [174, 56, 179, 137, 68, 221, 32, 187], serial_number: [66, 82, 77, 52, 52, 50, 50, 48, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 4, base_mac_address: [168, 64, 37, 5, 5, 0], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([71, 120, 43, 183, 203, 145, 239, 203, 215, 117, 68, 168, 174, 28, 25, 170, 65, 242, 204, 116, 140, 38, 103, 68, 118, 71, 164, 36, 3, 189, 45, 23]), slot_b_sha3_256_digest: Some([245, 13, 96, 186, 5, 206, 160, 79, 137, 250, 183, 184, 70, 249, 173, 246, 137, 25, 91, 182, 226, 66, 106, 50, 117, 85, 119, 88, 78, 172, 150, 105]) }) }), component: faux-mgshubris archive: ae38b38944dd20bb

serial number: BRM44220006
model: 913-0000006
revision: 4
base MAC address: a8:40:25:05:05:00
power state: A0
rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("47782bb7cb91efcbd77544a8ae1c19aa41f2cc748c2667447647a42403bd2d17"),
slot_b_sha3_256_digest: Some("f50d60ba05cea04f89fab7b846f9adf689195bb6e2426a32755577584eac9669"),
}

)
eliza@lurch ~ $

@hawkw
Copy link
Member Author

hawkw commented Jul 28, 2025

Okay, I've done a similar round of testing on Gimlet, including that the system comes up to A0 and that the SP can be flashed back to a previous rev over the management network. Everything looks fine to me!

somewhat lengthy console session
eliza@castle ~ $ pilot sp ls
MAC               SERIAL      TYPE    IMAGE            IP
a8:40:25:04:02:02 BRM42220036 gimlet  3699e46b12a1db18 fe80::aa40:25ff:fe04:202
a8:40:25:04:02:47 BRM42220030 gimlet  3699e46b12a1db18 fe80::aa40:25ff:fe04:247
a8:40:25:05:07:00 BRM44220013 sidecar dcf1e97ab2e9971d fe80::aa40:25ff:fe05:700
a8:40:25:05:27:00 BRM31230004 sidecar 710e93a75e01c3c5 fe80::aa40:25ff:fe05:2700
a8:40:25:06:01:08 BRM11230017 psc     02babcfe6bda5b41 fe80::aa40:25ff:fe06:108
eliza@castle ~ $ export PILOT_RACK=london
eliza@castle ~ $ pilot sp exec -e 'update sp 0 build-gimlet-c-dev-image-default.zip' BRM42220036
Jul 28 17:28:37.488 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:28:37.491 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:28:37.495 INFO generated update ID, id: 8a556f30-7d2c-46dc-a0b4-edd59266876b, component: faux-mgs
Jul 28 17:28:37.567 INFO starting SP update, sp_image_size: 655616, aux_flash_size: 0, aux_flash_chck: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], id: 8a556f30-7d2c-46dc-a0b4-edd59266876b, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:28:42.400 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 3 }, kind: SpResponse(Error(UpdateInProgress(InProgress(UpdateInProgressStatus { id: UpdateId([138, 85, 111, 48, 125, 44, 70, 220, 160, 180, 237, 213, 146, 102, 135, 107]), bytes_received: 0, total_size: 655616 })))) }, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:28:42.405 INFO update in progress, total_size: 655616, bytes_received: 0, component: faux-mgs
Jul 28 17:28:42.412 INFO update preparation complete, update_id: 8a556f30-7d2c-46dc-a0b4-edd59266876b, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:28:43.474 INFO update in progress, total_size: 655616, bytes_received: 33252, component: faux-mgs
Jul 28 17:28:44.478 INFO update in progress, total_size: 655616, bytes_received: 263082, component: faux-mgs
Jul 28 17:28:45.541 INFO update in progress, total_size: 655616, bytes_received: 287532, component: faux-mgs
Jul 28 17:28:46.543 INFO update in progress, total_size: 655616, bytes_received: 580932, component: faux-mgs
Jul 28 17:28:47.127 INFO update complete, id: 8a556f30-7d2c-46dc-a0b4-edd59266876b, interface: london_sw0tp0, component: faux-mgs
update complete
eliza@castle ~ $ pilot sp exec -e 'reset' BRM42220036
Jul 28 17:29:01.983 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:29:01.985 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:29:01.986 INFO SP is prepared to reset, component: faux-mgs
Jul 28 17:29:01.991 INFO using watchdog during reset, watchdog_timeout_ms: 15000, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:29:03.993 INFO disabling watchdog, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:29:03.998 INFO SP reset complete, component: faux-mgs
reset complete
eliza@castle ~ $ pilot sp exec -e 'state' BRM42220036
Jul 28 17:29:23.816 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:29:23.818 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:29:23.824 INFO V2(SpStateV2 { hubris_archive_id: [30, 151, 15, 225, 90, 196, 103, 185], serial_number: [66, 82, 77, 52, 50, 50, 50, 48, 48, 51, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 6, base_mac_address: [168, 64, 37, 4, 2, 2], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([172, 141, 158, 28, 78, 136, 79, 143, 26, 187, 166, 228, 63, 95, 38, 218, 45, 229, 44, 159, 49, 103, 89, 34, 108, 141, 139, 42, 243, 39, 3, 160]), slot_b_sha3_256_digest: Some([199, 73, 138, 93, 79, 203, 253, 141, 202, 61, 61, 211, 109, 72, 13, 175, 77, 83, 108, 29, 129, 66, 87, 70, 250, 45, 198, 129, 175, 244, 56, 245]) }) })hubris archive: 1e970fe15ac467b9
serial number: BRM42220036
, model: 913-0000019
revision: 6
base MAC address: a8:40:25:04:02:02
power state: A0
rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("ac8d9e1c4e884f8f1abba6e43f5f26da2de52c9f316759226c8d8b2af32703a0"),
slot_b_sha3_256_digest: Some("c7498a5d4fcbfd8dca3d3dd36d480daf4d536c1d81425746fa2dc681aff438f5"),
}

component)
: faux-mgs
eliza@castle ~ $ pfexec humility --archive build-gimlet-c-dev-image-default.zip --ip 'fe80::aa40:25ff:fe04:202%3' tasks
humility: connecting to fe80::aa40:25ff:fe04:202%3
humility: reading tasks remotely; state may not be consistent
system time = unavailable-via-net
ID TASK                       GEN PRI STATE
 0 jefe                         ?   0 [cannot read supervisor memory]
 1 net                          0   5 recv, notif: eth-irq(irq61) wake-timer(T=469262)
 2 sys                          0   1 recv, notif: exti-wildcard-irq(irq6/irq7/irq8/irq9/irq10/irq23/irq40)
 3 spi2_driver                  0   3 recv
 4 i2c_driver                   0   3 recv
 5 spd                          0   2 notif: i2c1-irq(irq31/irq32)
 6 packrat                      0   1 recv
 7 thermal                      0   5 recv, notif: timer(T=469471)
 8 power                        0   6 recv, notif: timer(T=469752)
 9 hiffy                        0   5 notif: bit31(T=469267)
10 gimlet_seq                   0   4 recv, notif: timer(T=469288) vcore
11 gimlet_inspector             0   6 notif: socket
12 hash_driver                  0   2 recv
13 hf                           0   3 recv, notif: timer
14 update_server                0   3 recv
15 sensor                       0   4 recv
16 host_sp_comms                0   8 recv, notif: jefe-state-change usart-irq(irq82) multitimer(T=469606) control-plane-agent
17 udpecho                      0   6 notif: socket
18 udpbroadcast                 0   6 notif: bit31(T=469697)
19 control_plane_agent          0   7 recv, notif: usart-irq(irq37) socket timer
20 sprot                        0   4 recv
21 validate                     0   5 recv
22 vpd                          0   4 recv
23 user_leds                    0   2 recv, notif: timer
24 dump_agent                   0   6 wait: reply from jefe/gen0
25 sbrmi                        0   4 recv
26 idle                         0   9 ready
27 udprpc                       0   6 ready
eliza@castle ~ $ pfexec humility --archive build-gimlet-c-dev-image-default.zip --ip 'fe80::aa40:25ff:fe04:202%3' hiffy -c Sequencer.set_state -a state=A0
humility: connecting to fe80::aa40:25ff:fe04:202%3
Sequencer.set_state() => Err(IllegalTransition)
eliza@castle ~ $ pfexec humility --archive build-gimlet-c-dev-image-default.zip --ip 'fe80::aa40:25ff:fe04:202%3' hiffy -c Sequencer.set_state -a state=A2
humility: connecting to fe80::aa40:25ff:fe04:202%3
Sequencer.set_state() => Changed
eliza@castle ~ $ pfexec humility --archive build-gimlet-c-dev-image-default.zip --ip 'fe80::aa40:25ff:fe04:202%3' hiffy -c Sequencer.set_state -a state=A0
humility: connecting to fe80::aa40:25ff:fe04:202%3
Sequencer.set_state() => Changed
eliza@castle ~ $ pilot host ls
INTERFACE    IP                        SERIAL      IMAGE
london_host0 fe80::eaea:6aff:fe09:8567 BRM42220030 ci c65212d/dcce35b 2025-07-14 15:04
eliza@castle ~ $ pilot host ls
INTERFACE    IP                        SERIAL      IMAGE
london_host0 fe80::eaea:6aff:fe09:8567 BRM42220030 ci c65212d/dcce35b 2025-07-14 15:04
london_host1 fe80::eaea:6aff:fe09:865a BRM42220036 ci c65212d/dcce35b 2025-07-14 15:04
eliza@castle ~ $ wget https://github.com/oxidecomputer/hubris/releases/download/all-sp-v1.0.43/build-gimlet-c-dev-image-default.zip
--2025-07-28 17:45:27--  https://github.com/oxidecomputer/hubris/releases/download/all-sp-v1.0.43/build-gimlet-c-dev-image-default.zip
Resolving github.com... 140.82.116.4
Connecting to github.com|140.82.116.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://release-assets.githubusercontent.com/github-production-release-asset/252314296/77f46719-1c59-4ced-b510-cab3d0778936?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-07-28T18%3A25%3A58Z&rscd=attachment%3B+filename%3Dbuild-gimlet-c-dev-image-default.zip&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-07-28T17%3A25%3A48Z&ske=2025-07-28T18%3A25%3A58Z&sks=b&skv=2018-11-09&sig=e%2BTLFv9P%2BGI%2FzJCHkLgYXnEZQf1GRC%2BErCVoFk3fwPU%3D&jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1MzcyNTAyNywibmJmIjoxNzUzNzI0NzI3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ._DoSsf3VToKizByCDYMOC4RxWg1z7_kEvglqnbDW5E8&response-content-disposition=attachment%3B%20filename%3Dbuild-gimlet-c-dev-image-default.zip&response-content-type=application%2Foctet-stream [following]
--2025-07-28 17:45:27--  https://release-assets.githubusercontent.com/github-production-release-asset/252314296/77f46719-1c59-4ced-b510-cab3d0778936?sp=r&sv=2018-11-09&sr=b&spr=https&se=2025-07-28T18%3A25%3A58Z&rscd=attachment%3B+filename%3Dbuild-gimlet-c-dev-image-default.zip&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2025-07-28T17%3A25%3A48Z&ske=2025-07-28T18%3A25%3A58Z&sks=b&skv=2018-11-09&sig=e%2BTLFv9P%2BGI%2FzJCHkLgYXnEZQf1GRC%2BErCVoFk3fwPU%3D&jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsImV4cCI6MTc1MzcyNTAyNywibmJmIjoxNzUzNzI0NzI3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ._DoSsf3VToKizByCDYMOC4RxWg1z7_kEvglqnbDW5E8&response-content-disposition=attachment%3B%20filename%3Dbuild-gimlet-c-dev-image-default.zip&response-content-type=application%2Foctet-stream
Resolving release-assets.githubusercontent.com... 185.199.108.133, 185.199.110.133, 185.199.109.133, ...
Connecting to release-assets.githubusercontent.com|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5257203 (5.0M) [application/octet-stream]
Saving to: 'build-gimlet-c-dev-image-default.zip.1'

build-gimlet-c-dev-image-default.zip.1                    100%[===================================================================================================================================>]   5.01M  9.60MB/s    in 0.5s

2025-07-28 17:45:28 (9.60 MB/s) - 'build-gimlet-c-dev-image-default.zip.1' saved [5257203/5257203]

eliza@castle ~ $ pilot sp exec -e 'state' BRM42220036
Jul 28 17:45:42.415 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:45:42.417 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:45:42.423 INFO V2(SpStateV2 { hubris_archive_id: [30, 151, 15, 225, 90, 196, 103, 185], serial_number: [66, 82, 77, 52, 50, 50, 50, 48, 48, 51, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 6, base_mac_address: [168, 64, 37, 4, 2, 2], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([172, 141, 158, 28, 78, 136, 79, 143, 26, 187, 166, 228, 63, 95, 38, 218, 45, 229, 44, 159, 49, 103, 89, 34, 108, 141, 139, 42, 243, 39, 3, 160]), slot_b_sha3_256_digest: Some([199, 73, 138, 93, 79, 203, 253, 141, 202, 61, 61, 211, 109, 72, 13, 175, 77, 83, 108, 29, 129, 66, 87, 70, 250, 45, 198, 129, 175, 244, 56, 245]) }) }), component: faux-mgs
hubris archive: 1e970fe15ac467b9
serial number: BRM42220036
model: 913-0000019
revision: 6
base MAC address: a8:40:25:04:02:02
power state: A0
rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("ac8d9e1c4e884f8f1abba6e43f5f26da2de52c9f316759226c8d8b2af32703a0"),
slot_b_sha3_256_digest: Some("c7498a5d4fcbfd8dca3d3dd36d480daf4d536c1d81425746fa2dc681aff438f5"),
}

)
eliza@castle ~ $ pilot sp exec -e 'update sp 0 build-gimlet-c-dev-image-default.zip.1' BRM42220036
Jul 28 17:46:06.691 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:46:06.693 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:06.697 INFO generated update ID, id: ba20c8f1-64a1-4a26-ab17-ab45bd34309a, component: faux-mgs
Jul 28 17:46:06.771 INFO starting SP update, sp_image_size: 721152, aux_flash_size: 0, aux_flash_chck: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], id: ba20c8f1-64a1-4a26-ab17-ab45bd34309a, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:11.696 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 3 }, kind: SpResponse(Error(UpdateInProgress(InProgress(UpdateInProgressStatus { id: UpdateId([186, 32, 200, 241, 100, 161, 74, 38, 171, 23, 171, 69, 189, 52, 48, 154]), bytes_received: 0, total_size: 721152 })))) }, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:11.696 WARN ignoring unexpected RPC response, message: Message { header: Header { version: 19, message_id: 3 }, kind: SpResponse(Error(UpdateInProgress(InProgress(UpdateInProgressStatus { id: UpdateId([186, 32, 200, 241, 100, 161, 74, 38, 171, 23, 171, 69, 189, 52, 48, 154]), bytes_received: 0, total_size: 721152 })))) }, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:11.697 INFO update in progress, total_size: 721152, bytes_received: 0, component: faux-mgs
Jul 28 17:46:11.697 INFO update preparation complete, update_id: ba20c8f1-64a1-4a26-ab17-ab45bd34309a, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:12.700 INFO update in progress, total_size: 721152, bytes_received: 300246, component: faux-mgs
Jul 28 17:46:13.703 INFO update in progress, total_size: 721152, bytes_received: 622986, component: faux-mgs
Jul 28 17:46:14.451 INFO update complete, id: ba20c8f1-64a1-4a26-ab17-ab45bd34309a, interface: london_sw0tp0, component: faux-mgs
update complete
eliza@castle ~ $ pilot sp exec -e 'state' BRM42220036
Jul 28 17:46:20.986 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:46:20.988 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:20.995 INFO V2(SpStateV2 { hubris_archive_id: [30, 151, 15, 225, 90, 196, 103, 185], serial_number: [66, 82, 77, 52, 50, 50, 50, 48, 48, 51, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 6, base_mac_address: [168, 64, 37, 4, 2, 2], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([172, 141, 158, 28, 78, 136, 79, 143, 26, 187, 166, 228, 63, 95, 38, 218, 45, 229, 44, 159, 49, 103, 89, 34, 108, 141, 139, 42, 243, 39, 3, 160]), slot_b_sha3_256_digest: Some([199, 73, 138, 93, 79, 203, 253, 141, 202, 61, 61, 211, 109, 72, 13, 175, 77, 83, 108, 29, 129, 66, 87, 70, 250, 45, 198, 129, 175, 244, 56, 245]) }) }), component: faux-mgs
hubris archive: 1e970fe15ac467b9
serial number: BRM42220036
model: 913-0000019
revision: 6
base MAC address: a8:40:25:04:02:02
power state: A0
rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("ac8d9e1c4e884f8f1abba6e43f5f26da2de52c9f316759226c8d8b2af32703a0"),
slot_b_sha3_256_digest: Some("c7498a5d4fcbfd8dca3d3dd36d480daf4d536c1d81425746fa2dc681aff438f5"),
}

)
eliza@castle ~ $ pilot sp exec -e 'reset' BRM42220036
Jul 28 17:46:31.323 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:46:31.325 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:31.326 INFO SP is prepared to reset, component: faux-mgs
Jul 28 17:46:31.331 INFO using watchdog during reset, watchdog_timeout_ms: 15000, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:33.332 INFO disabling watchdog, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:33.337 INFO SP reset complete, component: faux-mgs
reset complete
eliza@castle ~ $ pilot sp exec -e 'state' BRM42220036
Jul 28 17:46:41.795 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 17:46:41.797 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:202%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 17:46:41.803 INFO V2(SpStateV2 { hubris_archive_id: [186, 222, 106, 146, 117, 207, 205, 253], serial_number: [66, 82, 77, 52, 50, 50, 50, 48, 48, 51, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], model: [57, 49, 51, 45, 48, 48, 48, 48, 48, 49, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], revision: 6, base_mac_address: [168, 64, 37, 4, 2, 2], power_state: A0, rot: Ok(RotStateV2 { active: A, persistent_boot_preference: A, pending_persistent_boot_preference: None, transient_boot_preference: None, slot_a_sha3_256_digest: Some([172, 141, 158, 28, 78, 136, 79, 143, 26, 187, 166, 228, 63, 95, 38, 218, 45, 229, 44, 159, 49, 103, 89, 34, 108, 141, 139, 42, 243, 39, 3, 160]), slot_b_sha3_256_digest: Some([199, 73, 138, 93, 79, 203, 253, 141, 202, 61, 61, 211, 109, 72, 13, 175, 77, 83, 108, 29, 129, 66, 87, 70, 250, 45, 198, 129, 175, 244, 56, 245]) }) }), component: faux-mgs
hubris archive: bade6a9275cfcdfd
serial number: BRM42220036
model: 913-0000019
revision: 6
base MAC address: a8:40:25:04:02:02
power state: A0
rot: Ok(RotStateV2 {
active: A,
persistent_boot_preference: A,
pending_persistent_boot_preference: None,
transient_boot_preference: None,
slot_a_sha3_256_digest: Some("ac8d9e1c4e884f8f1abba6e43f5f26da2de52c9f316759226c8d8b2af32703a0"),
slot_b_sha3_256_digest: Some("c7498a5d4fcbfd8dca3d3dd36d480daf4d536c1d81425746fa2dc681aff438f5"),
}

)
eliza@castle ~ $

(I also did some messing around with the Paris PSC on Friday but forgot to grab that and post it here)

@hawkw
Copy link
Member Author

hawkw commented Jul 28, 2025

Okay, I've also done a quick attempt at smoke-testing that the RoT works by flashing a Gimlet with a RoT image built from this branch, using verifier-cli to read the measurement log over IPCC, resetting the SP, and checking for a new measurement in the log. If I'm interpreting this output correctly, it seems to have worked --- @labbott, would you mind confirming?

RoT test console session
eliza@castle ~ $ export PILOT_RACK=london
eliza@castle ~ $ pilot op update -I BRM42220030 -p rot rot-a-signed.zip rot-b-signed.zip
Manifest {
    archive: "rot-a-signed.zip",
    image_id: "a3e5194ffada2e40",
    git_rev: "e43006089377332ef302caa42db8b3578f2d92a3",
    board: "oxide-rot-1",
    name: "oxide-rot-1",
    image: "a",
}

Manifest {
    archive: "rot-b-signed.zip",
    image_id: "8685a110d9fe94da",
    git_rev: "e43006089377332ef302caa42db8b3578f2d92a3",
    board: "oxide-rot-1",
    name: "oxide-rot-1",
    image: "b",
}


gimlet BRM42220030 needs image installed in slot B
gimlet BRM42220030 image installed in slot B
gimlet BRM42220030 needs slot B activated
gimlet BRM42220030 needs reset
eliza@castle ~ $ pilot host ls
INTERFACE    IP                        SERIAL      IMAGE
london_host0 fe80::eaea:6aff:fe09:8567 BRM42220030 ci c65212d/dcce35b 2025-07-14 15:04
london_host1 fe80::eaea:6aff:fe09:865a BRM42220036 ci c65212d/dcce35b 2025-07-14 15:04
eliza@castle ~ $ pilot host copy to -i verifier-cli -o /opt/oxide/verifier-cli BRM42220030
4294901764  BRM42220030        ok
eliza@castle ~ $ pilot host login BRM42220030

    #####
   ##   ##
  ##   # ##  ##   ##
  ##  #  ##   ## ##     Oxide Computer Company
  ## #   ##    ###      Engineering
   ##   ##    ## ##
    #####    ##   ##    Compute Sled

BRM42220030 # /opt/oxide/verifier-cli --interface ipcc log
{"index":0,"measurements":[{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]}
BRM42220030 # exit
logout
eliza@castle ~ $ pilot sp exec -e 'reset' BRM42220030
Jul 28 19:04:08.059 INFO creating SP handle on interface london_sw0tp0, component: faux-mgs
Jul 28 19:04:08.062 INFO initial discovery complete, addr: [fe80::aa40:25ff:fe04:247%3]:11111, interface: london_sw0tp0, component: faux-mgs
Jul 28 19:04:08.062 INFO SP is prepared to reset, component: faux-mgs
Jul 28 19:04:10.065 INFO SP reset complete, component: faux-mgs
reset complete
eliza@castle ~ $ pilot host copy to -i verifier-cli -o /opt/oxide/verifier-cli BRM42220030
4294901764  BRM42220030        ok
eliza@castle ~ $ pilot host login BRM42220030

    #####
   ##   ##
  ##   # ##  ##   ##
  ##  #  ##   ## ##     Oxide Computer Company
  ## #   ##    ###      Engineering
   ##   ##    ## ##
    #####    ##   ##    Compute Sled

BRM42220030 # /opt/oxide/verifier-cli --interface ipcc log
{"index":1,"measurements":[{"Sha3_256":[224,81,51,144,21,39,245,134,87,31,176,220,215,234,15,112,13,58,188,183,188,59,51,102,42,181,228,200,9,14,34,250]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"Sha3_256":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]}
BRM42220030 # exit
logout
eliza@castle ~ $

(Note that I snipped out a bit of me running pilot host ls over and over again waiting for it to come back after resetting the SP)

@thenewwazoo
Copy link

Oh hey! I stumbled upon this while poking at moving off nightly. I've only just read through this once, but it looks like there's a back-compat reason to need used(compiler). Totally naive suggestion: can the things be copied from hither to yon in order to avoid the old-Humility mismatch? Is moving off nightly entirely enough to declare a "Humility flag day"?

@thenewwazoo
Copy link

Fun! I rebased my work to move to nightly on this branch and it builds quite nicely. I obviously don't have production hardware to test upon, but I'm optimistic it's useful. :)

@hawkw hawkw enabled auto-merge (rebase) August 12, 2025 15:50
@hawkw hawkw requested a review from labbott August 12, 2025 15:53
//
// Round up here just to be safe
let rounded = ((cnt + 7) / 8) * 8;
let rounded = cnt.div_ceil(8) * 8;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is correct but spot check this to make sure we have done bytes to bits correctly?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

@thenewwazoo thenewwazoo Aug 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's equivalent in the main but if cnt is greater than usize::MAX - 7 the prior code panicks/overflows. div_ceil avoids that case by only adding to a value that's already been divided.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the move to the newer compiler imminent, I'd take a look at .next_multiple_of, myself.

@hawkw hawkw requested a review from labbott August 12, 2025 19:11
Copy link
Collaborator

@labbott labbott left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for doing this work, at this point I think we'll get more mileage out of merging and testing

@hawkw hawkw disabled auto-merge August 13, 2025 15:44
@hawkw hawkw enabled auto-merge (squash) August 13, 2025 15:46
@hawkw hawkw merged commit b35abba into master Aug 13, 2025
135 checks passed
@hawkw hawkw deleted the eliza/update-nightly branch August 13, 2025 15:54
thenewwazoo added a commit to thenewwazoo/hubris that referenced this pull request Aug 13, 2025
This commit makes a small number of updates necessary to adopt the
stable toolchain:
* Sets the stable toolchain as the default by config. Invoking nightly
  will require using `+nightly-2025-07-20` per oxidecomputer#2169.
* Removes references to nightly requirements in the FAQ, and adds a note
  about enabling stack size checking being the only thing that requires
  nightly.
* Removes code that passes the `-Z` flag to cargo to enable nightly
  features.
* Updates `#[naked]` and `asm!` usage to stable convention, which is
  `#[unsafe(naked)]` and `naked_asm!`. Any affected assembly sections
  are expected to diverge (which was previously handled by
  `options(noreturn)`) or end with a trap (in the case of `_start`).
* Replaces `used(linker)` with `used`, which is [equivalent].
* Adds a code path in the `dist` build task to build endoscope if the
  task being built has a name `drv_lpc55_swd`, upon which it depends.
  This is because [artifact dependencies] are not stable, but `lcp55-swd`
  depends on having the endoscope binary available to its build script.
* Gates stack size emission and check behind a `rustc_version` channel
  check. Passing `+nightly-2025-07-20` to `cargo` (when invoking xtask)
  will enable the check.

[equivalent]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/attrs/data_structures/enum.UsedBy.html
[artifact dependencies]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#artifact-dependencies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

we should probably update to a nightly toolchain that's not from 2024

5 participants