Skip to content

Guest required capabilities may cause failures at runtime after restore #1863

Description

@simongdavies

There are a couple of guest-features that produce specific port values, e.g.:

#[cfg(feature = "trace_guest")]
TraceBatch = 104,

#[cfg(feature = "mem_profile")]
TraceMemoryAlloc = 105,

Right now if these are enabled and then restored in a host where those features are not enabled it will result in an error something like Invalid OutBAction value: 104

A simple fix for this would be something like:

OutBAction::TraceBatch => {
    #[cfg(feature = "trace_guest")]
    handle_trace_batch(...);

    Ok(())
}

OutBAction::TraceMemoryAlloc | OutBAction::TraceMemoryFree => {
    #[cfg(feature = "mem_profile")]
    handle_memory_profile_action(...)?;

    Ok(())
}

This would not work for any potential future feature where the guest depended on the host to do work, in such a case we would need to detect features in the guest and host and ensure that there was alignment when restoring, since rust does not enable runtime reflection of what features are enabled we would have to do something along these lines:

  1. Define a host function that lists capabilities
fn host_capabilities() -> CapabilitySet {
    let mut capabilities = CapabilitySet::core();

    if cfg!(feature = "trace_guest") {
        capabilities.insert(TRACE_BATCH_V1);
    }
    if cfg!(feature = "mem_profile") {
        capabilities.insert(MEM_PROFILE_V1);
    }

    capabilities
}
  1. Extend the existing elf metadata to add .note.hyperlight-capabilities and add features with ABI versions, e.g.:
hyperlight.outb.trace-batch.v1
hyperlight.outb.memory-profile.v1
  1. Then
  • At snapshot time query the guest binary elf headers and record the values as OCI snapshot configuration.
  • At restore validate that no required features are missing

If we implement this we might want to also validate when we initially load a guest binary. We might want to make this mechanism extensible by consumers of hyperlight.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions