Macro sel4_microkit::memory_region_symbol

source ·
macro_rules! memory_region_symbol {
    ($(#[$attrs:meta])* $symbol:ident: *mut [$ty:ty], n = $n:expr, bytes = $bytes:expr $(,)?) => { ... };
    ($(#[$attrs:meta])* $symbol:ident: *mut [$ty:ty], n = $n:expr $(,)?) => { ... };
    ($(#[$attrs:meta])* $symbol:ident: *mut $ty:ty, bytes = $bytes:expr $(,)?) => { ... };
    ($(#[$attrs:meta])* $symbol:ident: *mut $ty:ty $(,)?) => { ... };
}
Expand description

Declares a symbol via which the microkit tool can inject a memory region’s address, and returns the memory region’s address at runtime.

For more detail, see its definition.

The patching mechanism used by the microkit tool requires that the symbol be allocated space in the protection domain’s ELF file, so we delare the symbol as part of the .data section.

§Examples

let region_1 = unsafe {
    ExternallySharedRef::<'static, Foo>::new(
        memory_region_symbol!(region_1_addr: *mut Foo),
    )
};

let region_2 = unsafe {
    ExternallySharedRef::<'static, [u8]>::new_read_only(
        memory_region_symbol!(region_2_addr: *mut [u8], n = REGION_2_SIZE),
    )
};

§Note

The microkit tool requires memory region address symbols to be present in protection domain binaries. To prevent Rust from optimizing them out in cases where it is not used, add the unstable #[used(linker)] attribute. For example:

#![feature(used_with_arg)]

// might be optimized away if not used
memory_region_symbol!(region_addr: *mut Foo)

// won't be optimized away
memory_region_symbol! {
    #[used(linker)]
    region_addr: *mut Foo
}