Handled mutexes
This commit is contained in:
@@ -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> {
|
||||
|
||||
@@ -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
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user