Skip to content

Commit 8959383

Browse files
committed
Introduce Interpreter::integer_size helper
1 parent ad184cb commit 8959383

1 file changed

Lines changed: 15 additions & 9 deletions

File tree

src/aml/mod.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,12 @@ where
401401
}
402402
}
403403

404+
/// Returns the size of an integer (in bytes) for the set of tables parsed so far. This depends
405+
/// on the revision of the initial DSDT.
406+
pub fn integer_size(&self) -> usize {
407+
if self.dsdt_revision >= 2 { 8 } else { 4 }
408+
}
409+
404410
fn do_execute_method(&self, mut context: MethodContext) -> Result<WrappedObject, AmlError> {
405411
/*
406412
* This is the main loop that executes operations. Every op is handled at the top-level of
@@ -1897,10 +1903,10 @@ where
18971903
* This is a particularly important place to respect the integer width as set
18981904
* by the DSDT revision.
18991905
*/
1900-
if self.dsdt_revision >= 2 {
1901-
(operand.leading_zeros() + 1) as u64
1902-
} else {
1903-
((operand as u32).leading_zeros() + 1) as u64
1906+
match self.integer_size() {
1907+
4 => ((operand as u32).leading_zeros() + 1) as u64,
1908+
8 => (operand.leading_zeros() + 1) as u64,
1909+
_ => unreachable!(),
19041910
}
19051911
}
19061912
}
@@ -2008,7 +2014,7 @@ where
20082014
let result = match *operand {
20092015
Object::Buffer(ref bytes) => Object::Buffer(bytes.clone()),
20102016
Object::Integer(value) => {
2011-
if self.dsdt_revision >= 2 {
2017+
if self.integer_size() == 8 {
20122018
Object::Buffer(value.to_le_bytes().to_vec())
20132019
} else {
20142020
Object::Buffer((value as u32).to_le_bytes().to_vec())
@@ -2214,9 +2220,9 @@ where
22142220
let result = match source1.typ() {
22152221
ObjectType::Integer => {
22162222
let source1 = source1.as_integer()?;
2217-
let source2 = source2.to_integer(if self.dsdt_revision >= 2 { 8 } else { 4 })?;
2223+
let source2 = source2.to_integer(self.integer_size())?;
22182224
let mut buffer = Vec::new();
2219-
if self.dsdt_revision >= 2 {
2225+
if self.integer_size() == 8 {
22202226
buffer.extend_from_slice(&source1.to_le_bytes());
22212227
buffer.extend_from_slice(&source2.to_le_bytes());
22222228
} else {
@@ -2227,7 +2233,7 @@ where
22272233
}
22282234
ObjectType::Buffer => {
22292235
let mut buffer = source1.as_buffer()?.to_vec();
2230-
buffer.extend(source2.to_buffer(if self.dsdt_revision >= 2 { 8 } else { 4 })?);
2236+
buffer.extend(source2.to_buffer(self.integer_size())?);
22312237
Object::Buffer(buffer).wrap()
22322238
}
22332239
_ => {
@@ -2431,7 +2437,7 @@ where
24312437
/// return either an `Integer` or `Buffer` as appropriate, guided by the size of the field
24322438
/// and expected integer size (as per the DSDT revision).
24332439
fn do_field_read(&self, field: &FieldUnit) -> Result<WrappedObject, AmlError> {
2434-
let needs_buffer = if self.dsdt_revision >= 2 { field.bit_length > 64 } else { field.bit_length > 32 };
2440+
let needs_buffer = field.bit_length > (self.integer_size() * 8);
24352441
let access_width_bits = field.flags.access_type_bytes()? * 8;
24362442

24372443
trace!("AML field read. Field = {:?}", field);

0 commit comments

Comments
 (0)