mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-02-08 12:41:35 +00:00
arch: provide OEM strings entry support in SMBIOS
Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
parent
cb18edb535
commit
964985bb5c
@ -826,7 +826,8 @@ pub fn configure_system(
|
|||||||
.write_obj((layout::EBDA_START.0 >> 4) as u16, layout::EBDA_POINTER)
|
.write_obj((layout::EBDA_START.0 >> 4) as u16, layout::EBDA_POINTER)
|
||||||
.map_err(Error::EbdaSetup)?;
|
.map_err(Error::EbdaSetup)?;
|
||||||
|
|
||||||
let size = smbios::setup_smbios(guest_mem, serial_number, uuid).map_err(Error::SmbiosSetup)?;
|
let size =
|
||||||
|
smbios::setup_smbios(guest_mem, serial_number, uuid, None).map_err(Error::SmbiosSetup)?;
|
||||||
|
|
||||||
// Place the MP table after the SMIOS table aligned to 16 bytes
|
// Place the MP table after the SMIOS table aligned to 16 bytes
|
||||||
let offset = GuestAddress(layout::SMBIOS_START).unchecked_add(size);
|
let offset = GuestAddress(layout::SMBIOS_START).unchecked_add(size);
|
||||||
|
@ -61,6 +61,7 @@ pub type Result<T> = result::Result<T, Error>;
|
|||||||
const SM3_MAGIC_IDENT: &[u8; 5usize] = b"_SM3_";
|
const SM3_MAGIC_IDENT: &[u8; 5usize] = b"_SM3_";
|
||||||
const BIOS_INFORMATION: u8 = 0;
|
const BIOS_INFORMATION: u8 = 0;
|
||||||
const SYSTEM_INFORMATION: u8 = 1;
|
const SYSTEM_INFORMATION: u8 = 1;
|
||||||
|
const OEM_STRINGS: u8 = 11;
|
||||||
const END_OF_TABLE: u8 = 127;
|
const END_OF_TABLE: u8 = 127;
|
||||||
const PCI_SUPPORTED: u64 = 1 << 7;
|
const PCI_SUPPORTED: u64 = 1 << 7;
|
||||||
const IS_VIRTUAL_MACHINE: u8 = 1 << 4;
|
const IS_VIRTUAL_MACHINE: u8 = 1 << 4;
|
||||||
@ -125,6 +126,16 @@ pub struct SmbiosSysInfo {
|
|||||||
pub family: u8,
|
pub family: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[repr(packed)]
|
||||||
|
#[derive(Default, Copy, Clone)]
|
||||||
|
struct SmbiosOemStrings {
|
||||||
|
r#type: u8,
|
||||||
|
length: u8,
|
||||||
|
handle: u16,
|
||||||
|
count: u8,
|
||||||
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[repr(packed)]
|
#[repr(packed)]
|
||||||
#[derive(Default, Copy, Clone)]
|
#[derive(Default, Copy, Clone)]
|
||||||
@ -138,6 +149,7 @@ pub struct SmbiosEndOfTable {
|
|||||||
unsafe impl ByteValued for Smbios30Entrypoint {}
|
unsafe impl ByteValued for Smbios30Entrypoint {}
|
||||||
unsafe impl ByteValued for SmbiosBiosInfo {}
|
unsafe impl ByteValued for SmbiosBiosInfo {}
|
||||||
unsafe impl ByteValued for SmbiosSysInfo {}
|
unsafe impl ByteValued for SmbiosSysInfo {}
|
||||||
|
unsafe impl ByteValued for SmbiosOemStrings {}
|
||||||
unsafe impl ByteValued for SmbiosEndOfTable {}
|
unsafe impl ByteValued for SmbiosEndOfTable {}
|
||||||
|
|
||||||
fn write_and_incr<T: ByteValued>(
|
fn write_and_incr<T: ByteValued>(
|
||||||
@ -168,6 +180,7 @@ pub fn setup_smbios(
|
|||||||
mem: &GuestMemoryMmap,
|
mem: &GuestMemoryMmap,
|
||||||
serial_number: Option<&str>,
|
serial_number: Option<&str>,
|
||||||
uuid: Option<&str>,
|
uuid: Option<&str>,
|
||||||
|
oem_strings: Option<&[&str]>,
|
||||||
) -> Result<u64> {
|
) -> Result<u64> {
|
||||||
let physptr = GuestAddress(SMBIOS_START)
|
let physptr = GuestAddress(SMBIOS_START)
|
||||||
.checked_add(mem::size_of::<Smbios30Entrypoint>() as u64)
|
.checked_add(mem::size_of::<Smbios30Entrypoint>() as u64)
|
||||||
@ -220,6 +233,25 @@ pub fn setup_smbios(
|
|||||||
curptr = write_and_incr(mem, 0u8, curptr)?;
|
curptr = write_and_incr(mem, 0u8, curptr)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(oem_strings) = oem_strings {
|
||||||
|
handle += 1;
|
||||||
|
|
||||||
|
let smbios_oemstrings = SmbiosOemStrings {
|
||||||
|
r#type: OEM_STRINGS,
|
||||||
|
length: mem::size_of::<SmbiosOemStrings>() as u8,
|
||||||
|
handle,
|
||||||
|
count: oem_strings.len() as u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
curptr = write_and_incr(mem, smbios_oemstrings, curptr)?;
|
||||||
|
|
||||||
|
for s in oem_strings {
|
||||||
|
curptr = write_string(mem, s, curptr)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
curptr = write_and_incr(mem, 0u8, curptr)?;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
handle += 1;
|
handle += 1;
|
||||||
let smbios_end = SmbiosEndOfTable {
|
let smbios_end = SmbiosEndOfTable {
|
||||||
@ -280,7 +312,7 @@ mod tests {
|
|||||||
fn entrypoint_checksum() {
|
fn entrypoint_checksum() {
|
||||||
let mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(SMBIOS_START), 4096)]).unwrap();
|
let mem = GuestMemoryMmap::from_ranges(&[(GuestAddress(SMBIOS_START), 4096)]).unwrap();
|
||||||
|
|
||||||
setup_smbios(&mem, None, None).unwrap();
|
setup_smbios(&mem, None, None, None).unwrap();
|
||||||
|
|
||||||
let smbios_ep: Smbios30Entrypoint = mem.read_obj(GuestAddress(SMBIOS_START)).unwrap();
|
let smbios_ep: Smbios30Entrypoint = mem.read_obj(GuestAddress(SMBIOS_START)).unwrap();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user