From b0b8a7e85d9e1eda9cdb5868b704f84c55c301ad Mon Sep 17 00:00:00 2001 From: Connor Wood Date: Sat, 22 Jul 2017 10:06:20 +0100 Subject: [PATCH] Handled mutexes --- src/acpi/aml/mod.rs | 3 ++- src/acpi/aml/type1opcode.rs | 35 +++++++++++++++++++++++++++++++++-- src/acpi/aml/type2opcode.rs | 3 ++- src/acpi/mod.rs | 3 ++- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/acpi/aml/mod.rs b/src/acpi/aml/mod.rs index 1edab51..7e37d08 100644 --- a/src/acpi/aml/mod.rs +++ b/src/acpi/aml/mod.rs @@ -34,7 +34,8 @@ pub enum AmlError { AmlInvalidOpCode, AmlValueError, AmlDeferredLoad, - AmlFatalError(u8, u16, AmlValue) + AmlFatalError(u8, u16, AmlValue), + AmlHardFatal } pub fn parse_aml_table(sdt: &'static Sdt) -> Result<(), AmlError> { diff --git a/src/acpi/aml/type1opcode.rs b/src/acpi/aml/type1opcode.rs index b09b868..adcb769 100644 --- a/src/acpi/aml/type1opcode.rs +++ b/src/acpi/aml/type1opcode.rs @@ -197,11 +197,42 @@ fn parse_def_release(data: &[u8], // TODO: Release if it is parser_opcode_extended!(data, 0x27); - let object = parse_super_name(&data[2..], ctx)?; + let obj = parse_super_name(&data[2..], ctx)?; + + let mut namespace = ctx.prelock(); + let mutex = ctx.get(obj.val.clone()); + + match mutex { + AmlValue::Mutex((sync_level, owner)) => { + if let Some(o) = owner { + if o == ctx.ctx_id { + ctx.modify(obj.val.clone(), AmlValue::Mutex((sync_level, None))); + } else { + return Err(AmlError::AmlHardFatal); + } + } + }, + AmlValue::OperationRegion { region, offset, len, accessor, accessed_by } => { + if let Some(o) = accessed_by { + if o == ctx.ctx_id { + ctx.modify(obj.val.clone(), AmlValue::OperationRegion { + region, + offset, + len, + accessor, + accessed_by: None + }); + } else { + return Err(AmlError::AmlHardFatal); + } + } + }, + _ => return Err(AmlError::AmlValueError) + } Ok(AmlParseType { val: AmlValue::None, - len: 2 + object.len + len: 2 + obj.len }) } diff --git a/src/acpi/aml/type2opcode.rs b/src/acpi/aml/type2opcode.rs index c91b3bd..7d889ec 100644 --- a/src/acpi/aml/type2opcode.rs +++ b/src/acpi/aml/type2opcode.rs @@ -1052,8 +1052,9 @@ fn parse_def_decrement(data: &[u8], parser_opcode!(data, 0x76); let obj = parse_super_name(&data[1..], ctx)?; + + let mut namespace = ctx.prelock(); let value = AmlValue::Integer(ctx.get(obj.val.clone()).get_as_integer()? - 1); - ctx.modify(obj.val, value.clone()); Ok(AmlParseType { diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 04112f3..39e2799 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -217,7 +217,8 @@ fn parse_sdt(sdt: &'static Sdt, active_table: &mut ActivePageTable) { Err(AmlError::AmlInvalidOpCode) => println!(": Invalid opcode"), Err(AmlError::AmlValueError) => println!(": Type constraints or value bounds not met"), Err(AmlError::AmlDeferredLoad) => println!(": Deferred load reached top level"), - Err(AmlError::AmlFatalError(_, _, _)) => println!(": Fatal error occurred") + Err(AmlError::AmlFatalError(_, _, _)) => println!(": Fatal error occurred"), + Err(AmlError::AmlHardFatal) => println!(": Fatal error occurred") }; } else { println!(": Unknown");