1616 * - Fuzzing and guarantee panic-free interpretation
1717 */
1818
19- pub mod dsdt_info;
2019pub mod namespace;
2120pub mod object;
2221pub mod op_region;
@@ -29,7 +28,6 @@ use crate::{
2928 Handle ,
3029 Handler ,
3130 PhysicalMapping ,
32- aml:: dsdt_info:: { DsdtInfo , IntegerSize } ,
3331 platform:: AcpiPlatform ,
3432 registers:: { FixedRegisters , Pm1ControlBit } ,
3533 sdt:: { SdtHeader , facs:: Facs , fadt:: Fadt } ,
@@ -108,7 +106,7 @@ where
108106 pub namespace : Spinlock < Namespace > ,
109107 pub object_token : Spinlock < ObjectToken > ,
110108 context_stack : Spinlock < Vec < MethodContext > > ,
111- dsdt_info : DsdtInfo ,
109+ integer_size : IntegerSize ,
112110 region_handlers : Spinlock < BTreeMap < RegionSpace , Box < dyn RegionHandler > > > ,
113111
114112 global_lock_mutex : Handle ,
@@ -144,7 +142,7 @@ where
144142 namespace : Spinlock :: new ( Namespace :: new ( global_lock_mutex) ) ,
145143 object_token : Spinlock :: new ( unsafe { ObjectToken :: create_interpreter_token ( ) } ) ,
146144 context_stack : Spinlock :: new ( Vec :: new ( ) ) ,
147- dsdt_info : DsdtInfo :: from_revision ( dsdt_revision) ,
145+ integer_size : IntegerSize :: from_revision ( dsdt_revision) ,
148146 region_handlers : Spinlock :: new ( BTreeMap :: new ( ) ) ,
149147 global_lock_mutex,
150148 registers,
@@ -1615,7 +1613,7 @@ where
16151613 let value = self . do_field_read ( field) ?;
16161614 context. last_op ( ) ?. arguments . push ( Argument :: Object ( value) ) ;
16171615 } else if let Object :: BufferField { .. } = * object {
1618- let value = object. read_buffer_field ( self . dsdt_info . integer_size ) ?;
1616+ let value = object. read_buffer_field ( self . integer_size ) ?;
16191617 context. last_op ( ) ?. arguments . push ( Argument :: Object ( value. wrap ( ) ) ) ;
16201618 } else {
16211619 context. last_op ( ) ?. arguments . push ( Argument :: Object ( object) ) ;
@@ -1865,8 +1863,8 @@ where
18651863 extract_args ! ( op[ 0 ..3 ] => [ Argument :: Object ( left) , Argument :: Object ( right) , Argument :: Object ( target) ] ) ;
18661864 let target2 = if op. op == Opcode :: Divide { Some ( & op. arguments [ 3 ] ) } else { None } ;
18671865
1868- let left = left. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( self . dsdt_info . integer_size ) ?;
1869- let right = right. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( self . dsdt_info . integer_size ) ?;
1866+ let left = left. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( self . integer_size ) ?;
1867+ let right = right. clone ( ) . unwrap_transparent_reference ( ) . to_integer ( self . integer_size ) ?;
18701868
18711869 let result = match op. op {
18721870 Opcode :: Add => left. wrapping_add ( right) ,
@@ -1909,7 +1907,7 @@ where
19091907 * This is a particularly important place to respect the integer width as set
19101908 * by the DSDT revision.
19111909 */
1912- match self . dsdt_info . integer_size {
1910+ match self . integer_size {
19131911 IntegerSize :: FourBytes => ( ( operand as u32 ) . leading_zeros ( ) + 1 ) as u64 ,
19141912 IntegerSize :: EightBytes => ( operand. leading_zeros ( ) + 1 ) as u64 ,
19151913 }
@@ -2019,7 +2017,7 @@ where
20192017 let result = match * operand {
20202018 Object :: Buffer ( ref bytes) => Object :: Buffer ( bytes. clone ( ) ) ,
20212019 Object :: Integer ( value) => {
2022- if self . dsdt_info . integer_size == IntegerSize :: EightBytes {
2020+ if self . integer_size == IntegerSize :: EightBytes {
20232021 Object :: Buffer ( value. to_le_bytes ( ) . to_vec ( ) )
20242022 } else {
20252023 Object :: Buffer ( ( value as u32 ) . to_le_bytes ( ) . to_vec ( ) )
@@ -2049,7 +2047,7 @@ where
20492047 extract_args ! ( op => [ Argument :: Object ( operand) , Argument :: Object ( target) ] ) ;
20502048 let operand = operand. clone ( ) . unwrap_transparent_reference ( ) ;
20512049
2052- let result = Object :: Integer ( operand. to_integer ( self . dsdt_info . integer_size ) ?) . wrap ( ) ;
2050+ let result = Object :: Integer ( operand. to_integer ( self . integer_size ) ?) . wrap ( ) ;
20532051 let result = self . do_store ( target. clone ( ) , result) ?;
20542052 context. contribute_arg ( Argument :: Object ( result) ) ;
20552053 context. retire_op ( op) ;
@@ -2190,9 +2188,9 @@ where
21902188 let result = match source1. typ ( ) {
21912189 ObjectType :: Integer => {
21922190 let source1 = source1. as_integer ( ) ?;
2193- let source2 = source2. to_integer ( self . dsdt_info . integer_size ) ?;
2191+ let source2 = source2. to_integer ( self . integer_size ) ?;
21942192 let mut buffer = Vec :: new ( ) ;
2195- if self . dsdt_info . integer_size == IntegerSize :: EightBytes {
2193+ if self . integer_size == IntegerSize :: EightBytes {
21962194 buffer. extend_from_slice ( & source1. to_le_bytes ( ) ) ;
21972195 buffer. extend_from_slice ( & source2. to_le_bytes ( ) ) ;
21982196 } else {
@@ -2203,7 +2201,7 @@ where
22032201 }
22042202 ObjectType :: Buffer => {
22052203 let mut buffer = source1. as_buffer ( ) ?. to_vec ( ) ;
2206- buffer. extend ( source2. to_buffer ( self . dsdt_info . integer_size ) ?) ;
2204+ buffer. extend ( source2. to_buffer ( self . integer_size ) ?) ;
22072205 Object :: Buffer ( buffer) . wrap ( )
22082206 }
22092207 _ => {
@@ -2441,7 +2439,7 @@ where
24412439 /// return either an `Integer` or `Buffer` as appropriate, guided by the size of the field
24422440 /// and expected integer size (as per the DSDT revision).
24432441 fn do_field_read ( & self , field : & FieldUnit ) -> Result < WrappedObject , AmlError > {
2444- let needs_buffer = field. bit_length > ( self . dsdt_info . integer_size as usize * 8 ) ;
2442+ let needs_buffer = field. bit_length > ( self . integer_size as usize * 8 ) ;
24452443 let access_width_bits = field. flags . access_type_bytes ( ) ? * 8 ;
24462444
24472445 trace ! ( "AML field read. Field = {:?}" , field) ;
@@ -3496,3 +3494,15 @@ pub enum AmlError {
34963494 /// state. More information may be given in the contained value.
34973495 InternalError ( String ) ,
34983496}
3497+
3498+ #[ derive( Debug , Clone , Copy , PartialEq ) ]
3499+ pub enum IntegerSize {
3500+ FourBytes = 4 ,
3501+ EightBytes = 8 ,
3502+ }
3503+
3504+ impl IntegerSize {
3505+ pub fn from_revision ( revision : u8 ) -> IntegerSize {
3506+ if revision >= 2 { IntegerSize :: EightBytes } else { IntegerSize :: FourBytes }
3507+ }
3508+ }
0 commit comments