pub struct ProgramBlob {
pub code: Vec<u8>,
pub regions: Regions,
pub ro_data: Vec<u8>,
pub rw_data: Vec<u8>,
pub endpoints: BTreeMap<u8, Endpoint>,
}Expand description
A self-contained PVM2 program: raw code plus the region geometry and initial contents a runtime needs to build its address space.
This is the personality-free artifact the linker emits. A
capability-based personality may wrap it — JAVM’s cap Image is
one such wrapping, adding cnode slots, content hashing and an SSZ
encoding — but nothing here knows about capabilities.
§Invariants
ProgramBlob::new establishes and ProgramBlob::validate
re-checks:
ro_data.len() == regions.ro_pages * PAGE_SIZErw_data.len() == regions.rw_pages * PAGE_SIZEcode.len() <= MAX_CODE_SIZEregions.data_end() <= ADDRESS_SPACE_END- at least one endpoint
Stack and heap have no backing bytes: they are zero-initialized.
Fields§
§code: Vec<u8>PVM2 bytecode, mapped read-only at
abi::CODE_BASE.
regions: RegionsPage counts for the four data regions.
ro_data: Vec<u8>Read-only region contents, exactly ro_pages * PAGE_SIZE bytes.
rw_data: Vec<u8>Read-write region contents, exactly rw_pages * PAGE_SIZE bytes.
endpoints: BTreeMap<u8, Endpoint>Exported entry points, keyed by endpoint index.
Implementations§
Source§impl ProgramBlob
impl ProgramBlob
Sourcepub fn new(
code: Vec<u8>,
regions: Regions,
ro_data: Vec<u8>,
rw_data: Vec<u8>,
endpoints: BTreeMap<u8, Endpoint>,
) -> Result<Self, InvalidProgram>
pub fn new( code: Vec<u8>, regions: Regions, ro_data: Vec<u8>, rw_data: Vec<u8>, endpoints: BTreeMap<u8, Endpoint>, ) -> Result<Self, InvalidProgram>
Build a blob, zero-extending ro_data/rw_data to their page
counts so the length invariants hold, then validate.
The linker hands over .rodata/.data+.bss buffers whose
lengths are whatever the ELF sections were; normalizing to whole
pages here is what makes encode/decode round-trip exactly.
Sourcepub fn validate(&self) -> Result<(), InvalidProgram>
pub fn validate(&self) -> Result<(), InvalidProgram>
Re-check the documented invariants.
Sourcepub fn region_data(&self, kind: RegionKind) -> Option<&[u8]>
pub fn region_data(&self, kind: RegionKind) -> Option<&[u8]>
The backing bytes for kind, or None for the zero-initialized
stack and heap regions.
Sourcepub fn memory_image(&self) -> Vec<u8>
pub fn memory_image(&self) -> Vec<u8>
Materialize the flat data image a runtime maps at
DATA_BASE: regions.data_extent() bytes, with each region’s
backing bytes at its offset and everything else zero.
Source§impl ProgramBlob
impl ProgramBlob
Sourcepub fn from_bytes(bytes: &[u8]) -> Result<Self, DecodeError>
pub fn from_bytes(bytes: &[u8]) -> Result<Self, DecodeError>
Parse bytes produced by ProgramBlob::to_bytes.
Rejects trailing bytes: a blob is a whole file, and silently ignoring a suffix would hide a truncated or concatenated write.
Trait Implementations§
Source§impl Clone for ProgramBlob
impl Clone for ProgramBlob
Source§fn clone(&self) -> ProgramBlob
fn clone(&self) -> ProgramBlob
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more