@@ -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