浏览代码

Clean up the descriptor splitting code

Michael Melanson 4 年之前
父节点
当前提交
11cf635b83
共有 1 个文件被更改,包括 13 次插入11 次删除
  1. 13 11
      aml/src/resource.rs

+ 13 - 11
aml/src/resource.rs

@@ -73,7 +73,8 @@ fn resource_descriptor(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]), AmlErr
         * bytes contain the actual data items.
         */
         let descriptor_type = bytes[0].get_bits(0..7);
-        let length = LittleEndian::read_u16(&bytes[1..=2]) as usize + 2;
+        let length = LittleEndian::read_u16(&bytes[1..=2]) as usize;
+        let (descriptor_bytes, remaining_bytes)= bytes.split_at(length+3);
 
         let descriptor = match descriptor_type {
             0x01 => unimplemented!("24-bit Memory Range Descriptor"),
@@ -81,11 +82,11 @@ fn resource_descriptor(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]), AmlErr
             0x03 => unimplemented!("0x03 Reserved"),
             0x04 => unimplemented!("Vendor-defined Descriptor"),
             0x05 => unimplemented!("32-bit Memory Range Descriptor"),
-            0x06 => fixed_memory_descriptor(&bytes[0..length+2]),
-            0x07 => address_space_descriptor::<u32>(&bytes[0..length+2]),
-            0x08 => address_space_descriptor::<u16>(&bytes[0..length+2]),
-            0x09 => extended_interrupt_descriptor(&bytes[0..length+2]),
-            0x0a => address_space_descriptor::<u64>(&bytes[0..length+2]),
+            0x06 => fixed_memory_descriptor(descriptor_bytes),
+            0x07 => address_space_descriptor::<u32>(descriptor_bytes),
+            0x08 => address_space_descriptor::<u16>(descriptor_bytes),
+            0x09 => extended_interrupt_descriptor(descriptor_bytes),
+            0x0a => address_space_descriptor::<u64>(descriptor_bytes),
             0x0b => unimplemented!("Extended Address Space Descriptor"),
             0x0c => unimplemented!("GPIO Connection Descriptor"),
             0x0d => unimplemented!("Pin Function Descriptor"),
@@ -99,7 +100,7 @@ fn resource_descriptor(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]), AmlErr
             0x80..=0xff => unreachable!(),
         }?;
         
-        Ok((Some(descriptor), &bytes[length+1..]))
+        Ok((Some(descriptor), remaining_bytes))
     } else {
         /*
         * We're parsing a small descriptor. Byte 0 has the format:
@@ -124,14 +125,15 @@ fn resource_descriptor(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]), AmlErr
         */
         let descriptor_type = bytes[0].get_bits(3..=6);
         let length: usize = bytes[0].get_bits(0..=2) as usize;
+        let (descriptor_bytes, remaining_bytes) = bytes.split_at(length+1);
 
         let descriptor = match descriptor_type {
             0x00..=0x03 => Err(AmlError::ReservedResourceType),
-            0x04 => irq_format_descriptor(&bytes[0..=length]),
-            0x05 => dma_format_descriptor(&bytes[0..=length]),
+            0x04 => irq_format_descriptor(descriptor_bytes),
+            0x05 => dma_format_descriptor(descriptor_bytes),
             0x06 => unimplemented!("Start Dependent Functions Descriptor"),
             0x07 => unimplemented!("End Dependent Functions Descriptor"),
-            0x08 => io_port_descriptor(&bytes[0..=length]),
+            0x08 => io_port_descriptor(descriptor_bytes),
             0x09 => unimplemented!("Fixed Location IO Port Descriptor"),
             0x0A => unimplemented!("Fixed DMA Descriptor"),
             0x0B..=0x0D => Err(AmlError::ReservedResourceType),
@@ -140,7 +142,7 @@ fn resource_descriptor(bytes: &[u8]) -> Result<(Option<Resource>, &[u8]), AmlErr
             0x10..=0xFF => unreachable!()
         }?;
 
-        Ok((Some(descriptor), &bytes[length+1..]))
+        Ok((Some(descriptor), remaining_bytes))
     }
 }