#![deny(improper_ctypes)]
pub use self::memory_map::*;
mod memory_map;
#[derive(Debug)]
#[repr(C)]
pub struct BootInfo {
pub memory_map: MemoryMap,
#[cfg(feature = "recursive_page_table")]
pub recursive_page_table_addr: u64,
#[cfg(feature = "map_physical_memory")]
pub physical_memory_offset: u64,
tls_template: TlsTemplate,
_non_exhaustive: u8, }
impl BootInfo {
#[allow(unused_variables)]
#[doc(hidden)]
pub fn new(
memory_map: MemoryMap,
tls_template: Option<TlsTemplate>,
recursive_page_table_addr: u64,
physical_memory_offset: u64,
) -> Self {
let tls_template = tls_template.unwrap_or(TlsTemplate {
start_addr: 0,
file_size: 0,
mem_size: 0,
});
BootInfo {
memory_map,
tls_template,
#[cfg(feature = "recursive_page_table")]
recursive_page_table_addr,
#[cfg(feature = "map_physical_memory")]
physical_memory_offset,
_non_exhaustive: 0,
}
}
pub fn tls_template(&self) -> Option<TlsTemplate> {
if self.tls_template.mem_size > 0 {
Some(self.tls_template)
} else {
None
}
}
#[cfg(feature = "recursive_page_table")]
pub fn recursive_index(&self) -> u16 {
((self.recursive_page_table_addr >> 12) & 0x1FF) as u16
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)]
pub struct TlsTemplate {
pub start_addr: u64,
pub file_size: u64,
pub mem_size: u64,
}
extern "C" {
fn _improper_ctypes_check_bootinfo(_boot_info: BootInfo);
}