redox/arch/x86_64/src/acpi/xsdt.rs

42 lines
819 B
Rust
Raw Normal View History

2016-08-16 20:16:32 +02:00
use core::mem;
use super::sdt::Sdt;
2016-08-16 20:16:32 +02:00
#[derive(Debug)]
pub struct Xsdt(&'static Sdt);
2016-08-16 20:16:32 +02:00
impl Xsdt {
pub fn new(sdt: &'static Sdt) -> Option<Xsdt> {
2016-08-16 20:16:32 +02:00
if &sdt.signature == b"XSDT" {
Some(Xsdt(sdt))
2016-08-16 20:16:32 +02:00
} else {
None
}
}
pub fn iter(&self) -> XsdtIter {
XsdtIter {
2016-08-16 20:16:32 +02:00
sdt: self.0,
i: 0
}
}
}
pub struct XsdtIter {
sdt: &'static Sdt,
2016-08-16 20:16:32 +02:00
i: usize
}
impl Iterator for XsdtIter {
2016-08-16 20:16:32 +02:00
type Item = usize;
fn next(&mut self) -> Option<Self::Item> {
if self.i < self.sdt.data_len()/mem::size_of::<u64>() {
let item = unsafe { *(self.sdt.data_address() as *const u64).offset(self.i as isize) };
self.i += 1;
Some(item as usize)
} else {
None
}
}
}