()
| 228 | |
| 229 | #[cfg(target_os = "freebsd")] |
| 230 | pub fn get_smbios() -> Option<SmbiosStore> { |
| 231 | trace!("get_smbios() FreeBSD entry"); |
| 232 | // Get the SMBIOS entrypoint address from the kernel environment |
| 233 | let addr_hex = kenv_get("hint.smbios.0.mem").ok()?; |
| 234 | let addr_hex = addr_hex.trim_start_matches("0x"); |
| 235 | let addr = u64::from_str_radix(addr_hex, 16).unwrap(); |
| 236 | trace!("SMBIOS Entrypoint Addr: {} 0x{:x}", addr_hex, addr); |
| 237 | |
| 238 | let mut dev_mem = std::fs::File::open("/dev/mem").ok()?; |
| 239 | // Read enough bytes for either V2 (31 bytes) or V3 (24 bytes) entry point |
| 240 | let mut header_buf = [0u8; 32]; |
| 241 | dev_mem.seek(SeekFrom::Start(addr)).ok()?; |
| 242 | dev_mem.read_exact(&mut header_buf).ok()?; |
| 243 | |
| 244 | let entry = EntryPoint::search(&header_buf).ok()?; |
| 245 | let table_addr = entry.smbios_address(); |
| 246 | let table_len = entry.smbios_len() as usize; |
| 247 | |
| 248 | let mut table_data = vec![0u8; table_len]; |
| 249 | dev_mem.seek(SeekFrom::Start(table_addr)).ok()?; |
| 250 | dev_mem.read_exact(&mut table_data).ok()?; |
| 251 | |
| 252 | SmbiosStore::from_parts(&header_buf, table_data) |
| 253 | } |
| 254 | |
| 255 | #[cfg(feature = "uefi")] |
| 256 | pub fn get_smbios() -> Option<SmbiosStore> { |
no test coverage detected