pub const HYPERLIGHT_VERSION_SECTION: &str = ".note.hyperlight-version";
pub const HYPERLIGHT_NOTE_NAME: &str = "Hyperlight";
pub const HYPERLIGHT_NOTE_TYPE: u32 = 1;
const NOTE_HEADER_SIZE: usize = 3 * size_of::<u32>();
pub const fn padded_name_size(name_len_with_nul: usize) -> usize {
let desc_offset = NOTE_HEADER_SIZE + name_len_with_nul;
let padding = (8 - (desc_offset % 8)) % 8;
name_len_with_nul + padding
}
pub const fn padded_desc_size(desc_len_with_nul: usize) -> usize {
let padding = (8 - (desc_len_with_nul % 8)) % 8;
desc_len_with_nul + padding
}
#[repr(C, align(8))]
pub struct ElfNote<const NAME_SZ: usize, const DESC_SZ: usize> {
namesz: u32,
descsz: u32,
n_type: u32,
name: [u8; NAME_SZ],
desc: [u8; DESC_SZ],
}
unsafe impl<const N: usize, const D: usize> Sync for ElfNote<N, D> {}
impl<const NAME_SZ: usize, const DESC_SZ: usize> ElfNote<NAME_SZ, DESC_SZ> {
pub const fn new(name: &str, desc: &str, n_type: u32) -> Self {
assert!(
NAME_SZ == padded_name_size(name.len() + 1),
"NAME_SZ must equal padded_name_size(name.len() + 1)"
);
assert!(
DESC_SZ == padded_desc_size(desc.len() + 1),
"DESC_SZ must equal padded_desc_size(desc.len() + 1)"
);
assert!(
core::mem::offset_of!(Self, desc).is_multiple_of(8),
"desc is not 8-byte aligned"
);
assert!(
size_of::<Self>().is_multiple_of(8),
"total note size is not 8-byte aligned"
);
Self {
namesz: (name.len() + 1) as u32,
descsz: (desc.len() + 1) as u32,
n_type,
name: pad_str_to_array(name),
desc: pad_str_to_array(desc),
}
}
}
const fn pad_str_to_array<const N: usize>(s: &str) -> [u8; N] {
let bytes = s.as_bytes();
let mut result = [0u8; N];
let mut i = 0;
while i < bytes.len() {
result[i] = bytes[i];
i += 1;
}
result
}