1use vm_memory::{Bytes, GuestAddress, GuestMemory};
8use zerocopy::little_endian::{U32, U64};
9use zerocopy::{Immutable, IntoBytes};
10
11use crate::{Result, Sdt, checksum};
12
13#[allow(dead_code)]
17#[repr(C, packed)]
25#[derive(Clone, Copy, Debug, Default, IntoBytes, Immutable)]
26pub struct Rsdp {
27 signature: [u8; 8],
28 checksum: u8,
29 oem_id: [u8; 6],
30 revision: u8,
31 rsdt_addr: U32,
32 length: U32,
33 xsdt_addr: U64,
34 extended_checksum: u8,
35 reserved: [u8; 3],
36}
37
38impl Rsdp {
39 pub fn new(oem_id: [u8; 6], xsdt_addr: u64) -> Self {
40 let mut rsdp = Rsdp {
41 signature: *b"RSD PTR ",
43 checksum: 0,
44 oem_id,
45 revision: 2,
46 rsdt_addr: U32::ZERO,
47 length: U32::new(std::mem::size_of::<Rsdp>().try_into().unwrap()),
48 xsdt_addr: U64::new(xsdt_addr),
49 extended_checksum: 0,
50 reserved: [0u8; 3],
51 };
52
53 rsdp.checksum = checksum(&[&rsdp.as_bytes()[..20]]);
54 rsdp.extended_checksum = checksum(&[rsdp.as_bytes()]);
55 rsdp
56 }
57}
58
59impl Sdt for Rsdp {
60 fn len(&self) -> usize {
61 self.as_bytes().len()
62 }
63
64 fn write_to_guest<M: GuestMemory>(&mut self, mem: &M, address: GuestAddress) -> Result<()> {
65 mem.write_slice(self.as_bytes(), address)?;
66 Ok(())
67 }
68}