Skip to content

Commit 42c9a9e

Browse files
committed
Move IntegerSize back to mod.rs
1 parent 653f106 commit 42c9a9e

4 files changed

Lines changed: 27 additions & 39 deletions

File tree

src/aml/dsdt_info.rs

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/aml/mod.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
* - Fuzzing and guarantee panic-free interpretation
1717
*/
1818

19-
pub mod dsdt_info;
2019
pub mod namespace;
2120
pub mod object;
2221
pub 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+
}

src/aml/object.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::aml::{AmlError, Handle, Operation, dsdt_info::IntegerSize, op_region::OpRegion};
1+
use crate::aml::{AmlError, Handle, IntegerSize, Operation, op_region::OpRegion};
22
use alloc::{
33
borrow::Cow,
44
string::{String, ToString},
@@ -242,9 +242,7 @@ impl Object {
242242
})?),
243243
}
244244
}
245-
Object::BufferField { .. } => {
246-
self.read_buffer_field(integer_size)?.to_integer(integer_size)
247-
}
245+
Object::BufferField { .. } => self.read_buffer_field(integer_size)?.to_integer(integer_size),
248246
_ => Err(AmlError::InvalidOperationOnObject { op: Operation::ToInteger, typ: self.typ() })?,
249247
}
250248
}

tests/de_ref_of.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ DefinitionBlock ("", "SSDT", 2, "RSACPI", "DerefOf", 0x00000002) {
1717
Local0 = (DerefOf(\_SB.ADAT[0x09]))
1818
// This relies on subtraction rather than equality as logical ops on BufferFields don't work
1919
// yet.
20+
// TODO: Use logical ops for clarity, when available.
2021
return (Local0 - 0xaa)
2122
}
2223
}

0 commit comments

Comments
 (0)