diff --git a/src/aml.rs b/src/aml.rs index 1cb0ccd..4dd510b 100644 --- a/src/aml.rs +++ b/src/aml.rs @@ -723,7 +723,7 @@ pub struct Interrupt { edge_triggered: bool, active_low: bool, shared: bool, - number: u32, + numbers: Vec, } impl Interrupt { @@ -733,14 +733,14 @@ impl Interrupt { edge_triggered: bool, active_low: bool, shared: bool, - number: u32, + numbers: Vec, ) -> Self { Interrupt { consumer, edge_triggered, active_low, shared, - number, + numbers, } } } @@ -748,14 +748,14 @@ impl Interrupt { impl Aml for Interrupt { fn to_aml_bytes(&self, sink: &mut dyn AmlSink) { sink.byte(EXTIRQDESC); /* Extended IRQ Descriptor */ - sink.word(6); + sink.word(2 + 4 * self.numbers.len() as u16); let flags = ((self.shared as u8) << 3) | ((self.active_low as u8) << 2) | ((self.edge_triggered as u8) << 1) | self.consumer as u8; sink.byte(flags); - sink.byte(1); /* count */ - sink.dword(self.number); + sink.byte(self.numbers.len() as u8); /* count */ + self.numbers.iter().for_each(|n| sink.dword(*n)); } } @@ -1698,7 +1698,7 @@ mod tests { &Name::new( "_CRS".into(), &ResourceTemplate::new(vec![ - &Interrupt::new(true, true, false, false, 4), + &Interrupt::new(true, true, false, false, vec![4]), &IO::new(0x3f8, 0x3f8, 0, 0x8), ]), ), @@ -1928,14 +1928,15 @@ mod tests { */ let interrupt_io_data = [ - 0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x16, 0x0A, 0x13, 0x89, 0x06, 0x00, 0x03, 0x01, - 0x04, 0x00, 0x00, 0x00, 0x47, 0x01, 0xF8, 0x03, 0xF8, 0x03, 0x00, 0x08, 0x79, 0x00, + 0x08, 0x5F, 0x43, 0x52, 0x53, 0x11, 0x1A, 0x0A, 0x17, 0x89, 0x0A, 0x00, 0x03, 0x02, + 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x47, 0x01, 0xF8, 0x03, 0xF8, 0x03, + 0x00, 0x08, 0x79, 0x00, ]; aml.clear(); Name::new( "_CRS".into(), &ResourceTemplate::new(vec![ - &Interrupt::new(true, true, false, false, 4), + &Interrupt::new(true, true, false, false, vec![4, 5]), &IO::new(0x3f8, 0x3f8, 0, 0x8), ]), )