Implemented buffer field index modify

This commit is contained in:
Connor Wood
2017-08-19 15:10:47 +01:00
parent aa35967f72
commit d5d156a3d2

View File

@@ -1,6 +1,7 @@
use collections::string::String;
use collections::btree_map::BTreeMap;
use collections::vec::Vec;
use alloc::boxed::Box;
use spin::RwLockWriteGuard;
@@ -314,7 +315,7 @@ impl AmlExecutionContext {
}
}
fn modify_index_core(&self, obj: AmlValue, value: AmlValue, indices: Vec<u64>) -> Result<AmlValue, AmlError> {
fn modify_index_core(&mut self, obj: AmlValue, value: AmlValue, indices: Vec<u64>) -> Result<AmlValue, AmlError> {
match obj {
AmlValue::String(ref string) => {
if indices.len() != 1 {
@@ -338,6 +339,18 @@ impl AmlExecutionContext {
Ok(AmlValue::Buffer(b))
},
AmlValue::BufferField(ref b) => {
if indices.len() != 1 {
return Err(AmlError::AmlValueError);
}
let mut idx = indices[0];
idx += b.index.get_as_integer()?;
self.modify(AmlValue::ObjectReference(ObjectReference::Index(b.source_buf.clone(), Box::new(AmlValue::Integer(idx.clone())))), value);
Ok(AmlValue::BufferField(b.clone()))
},
AmlValue::Package(ref p) => {
if indices.len() < 0 {
return Err(AmlError::AmlValueError);
@@ -367,7 +380,13 @@ impl AmlExecutionContext {
self.modify_index(*c, value, indices)
},
_ => Err(AmlError::AmlValueError)
ObjectReference::ArgObj(_) => Err(AmlError::AmlValueError),
ObjectReference::LocalObj(i) => {
let v = self.local_vars[i as usize].clone();
self.local_vars[i as usize] = self.modify_index_core(v, value, indices)?;
Ok(())
}
},
_ => Err(AmlError::AmlValueError)
}