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:
- 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
}
- 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
- 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.
There are a couple of guest-features that produce specific port values, e.g.:
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: 104A simple fix for this would be something like:
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:
.note.hyperlight-capabilitiesand add features with ABI versions, e.g.: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.