1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use plain::Plain;

#[derive(Clone, Copy, Debug)]
#[repr(packed)]
pub struct FmapArea {
    pub offset: u32,
    pub size: u32,
    pub name: [u8; 32],
    pub flags: u16,
}

#[derive(Clone, Copy, Debug)]
#[repr(packed)]
pub struct Fmap {
    pub signature: [u8; 8],
    pub ver_major: u8,
    pub ver_minor: u8,
    pub base: u64,
    pub size: u32,
    pub name: [u8; 32],
    pub nareas: u16,
}

impl Fmap {
    pub fn area(&self, i: u16) -> &FmapArea {
        unsafe {
            &*((self as *const Self).add(1) as *const FmapArea).add(i as usize)
        }
    }
}

unsafe impl Plain for Fmap {}