Handled mutexes

This commit is contained in:
Connor Wood
2017-07-22 10:06:20 +01:00
parent 8e98cdf971
commit b0b8a7e85d
4 changed files with 39 additions and 5 deletions

View File

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

View File

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

View File

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

View File

@@ -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");