diff --git a/src/acpi/aml/dataobj.rs b/src/acpi/aml/dataobj.rs index ba6e0f0e8cba2291ea4e2481e87efe47e0fdef4f..a96f0215c44a65043c60e0647f2bf0751182f077 100644 --- a/src/acpi/aml/dataobj.rs +++ b/src/acpi/aml/dataobj.rs @@ -18,14 +18,14 @@ pub fn parse_data_obj(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_computational_data, parse_def_package, parse_def_var_package }; - + Err(AmlError::AmlInvalidOpCode) } @@ -38,13 +38,13 @@ pub fn parse_data_ref_obj(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_data_obj, parse_term_arg }; - + match parse_super_name(data, ctx) { Ok(res) => match res.val { AmlValue::String(s) => Ok(AmlParseType { @@ -66,7 +66,7 @@ pub fn parse_arg_obj(data: &[u8], len: 0 as usize }) } - + match data[0] { 0x68 ... 0x6E => Ok(AmlParseType { val: AmlValue::ObjectReference(ObjectReference::ArgObj(data[0] - 0x68)), @@ -85,7 +85,7 @@ pub fn parse_local_obj(data: &[u8], len: 0 as usize }) } - + match data[0] { 0x68 ... 0x6E => Ok(AmlParseType { val: AmlValue::ObjectReference(ObjectReference::LocalObj(data[0] - 0x60)), @@ -104,7 +104,7 @@ fn parse_computational_data(data: &[u8], len: 0 as usize }) } - + match data[0] { 0x0A => Ok(AmlParseType { val: AmlValue::Integer(data[1] as u64), diff --git a/src/acpi/aml/mod.rs b/src/acpi/aml/mod.rs index 9ec105c625a587713062f705f34636fc57c0efee..250f29f6aaa4716b61f4c9c50bbbc6987cd580ec 100644 --- a/src/acpi/aml/mod.rs +++ b/src/acpi/aml/mod.rs @@ -42,7 +42,7 @@ pub fn parse_aml_table(sdt: &Sdt) -> Result<Vec<String>, AmlError> { pub fn parse_aml_with_scope(sdt: &Sdt, scope: String) -> Result<Vec<String>, AmlError> { let data = sdt.data(); let mut ctx = AmlExecutionContext::new(scope); - + parse_term_list(data, &mut ctx)?; Ok(ctx.namespace_delta) diff --git a/src/acpi/aml/namedobj.rs b/src/acpi/aml/namedobj.rs index bd813a8edbdaf476c79c8721a5430fcc8ed22bf0..e91990c4c566e7155313ed4f1d4282207070f9a6 100644 --- a/src/acpi/aml/namedobj.rs +++ b/src/acpi/aml/namedobj.rs @@ -4,7 +4,7 @@ use collections::btree_map::BTreeMap; use super::AmlError; use super::parser::{ AmlParseType, ParseResult, AmlParseTypeGeneric, AmlExecutionContext, ExecutionState }; -use super::namespace::{AmlValue, ObjectReference, FieldSelector, Method, get_namespace_string, +use super::namespace::{AmlValue, FieldSelector, Method, get_namespace_string, Accessor, BufferField, FieldUnit, Processor, PowerResource, OperationRegion, Device, ThermalZone}; use super::namestring::{parse_name_string, parse_name_seg}; @@ -86,7 +86,7 @@ pub fn parse_named_obj(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_def_bank_field, @@ -122,12 +122,12 @@ fn parse_def_bank_field(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x87); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[2..])?; let data = &data[2 + pkg_length_len .. 2 + pkg_length]; - + let region_name = parse_name_string(data, ctx)?; let bank_name = parse_name_string(&data[2 + pkg_length_len + region_name.len .. 2 + pkg_length], ctx)?; @@ -177,15 +177,15 @@ fn parse_def_create_bit_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8D); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let name = parse_name_string(&data[1 + source_buf.len + bit_index.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), @@ -207,15 +207,15 @@ fn parse_def_create_byte_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8C); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let name = parse_name_string(&data[1 + source_buf.len + bit_index.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), @@ -237,15 +237,15 @@ fn parse_def_create_word_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8B); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let name = parse_name_string(&data[1 + source_buf.len + bit_index.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), @@ -267,15 +267,15 @@ fn parse_def_create_dword_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8A); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let name = parse_name_string(&data[1 + source_buf.len + bit_index.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), @@ -297,15 +297,15 @@ fn parse_def_create_qword_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8F); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let name = parse_name_string(&data[1 + source_buf.len + bit_index.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), @@ -327,22 +327,22 @@ fn parse_def_create_field(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x13); let source_buf = parse_term_arg(&data[2..], ctx)?; let bit_index = parse_term_arg(&data[2 + source_buf.len..], ctx)?; let num_bits = parse_term_arg(&data[2 + source_buf.len + bit_index.len..], ctx)?; let name = parse_name_string(&data[2 + source_buf.len + bit_index.len + num_bits.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::BufferField(BufferField { source_buf: Box::new(source_buf.val), index: Box::new(bit_index.val), length: Box::new(num_bits.val) }))?; - + Ok(AmlParseType { val: AmlValue::None, len: 2 + name.len + source_buf.len + bit_index.len + num_bits.len @@ -358,7 +358,7 @@ fn parse_def_data_region(data: &[u8], len: 0 as usize }) } - + // TODO: Find the actual offset and length, once table mapping is implemented parser_opcode_extended!(data, 0x88); @@ -374,8 +374,8 @@ fn parse_def_data_region(data: &[u8], offset: Box::new(AmlValue::IntegerConstant(0)), len: Box::new(AmlValue::IntegerConstant(0)), accessor: Accessor { - read: |x| 0 as u64, - write: |x, y| () + read: |_x| 0 as u64, + write: |_x, _y| () }, accessed_by: None }))?; @@ -395,11 +395,11 @@ fn parse_def_event(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x02); let name = parse_name_string(&data[2..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; ctx.add_to_namespace(local_scope_string, AmlValue::Event(0))?; @@ -418,16 +418,16 @@ fn parse_def_device(data: &[u8], len: 0 as usize }) } - + // TODO: How to handle local context deferreds parser_opcode_extended!(data, 0x82); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[2..])?; let name = parse_name_string(&data[2 + pkg_length_len .. 2 + pkg_length], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; let mut local_ctx = AmlExecutionContext::new(local_scope_string.clone()); - + parse_object_list(&data[2 + pkg_length_len + name.len .. 2 + pkg_length], &mut local_ctx)?; ctx.add_to_namespace(local_scope_string, AmlValue::Device(Device { @@ -450,7 +450,7 @@ fn parse_def_op_region(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x80); let name = parse_name_string(&data[2..], ctx)?; @@ -478,8 +478,8 @@ fn parse_def_op_region(data: &[u8], offset: Box::new(offset.val), len: Box::new(len.val), accessor: Accessor { - read: |x| 0 as u64, - write: |x, y| () + read: |_x| 0 as u64, + write: |_x, _y| () }, accessed_by: None }))?; @@ -499,7 +499,7 @@ fn parse_def_field(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x81); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[2..])?; @@ -544,7 +544,7 @@ fn parse_def_index_field(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x86); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[2..])?; @@ -596,14 +596,14 @@ fn parse_field_list(data: &[u8], len: 0 as usize }) } - + let mut current_offset: usize = 0; let mut field_offset: usize = 0; let mut connection = AmlValue::Uninitialized; while current_offset < data.len() { let res = parse_field_element(&data[current_offset..], ctx, selector.clone(), &mut connection, flags, &mut field_offset)?; - + match ctx.state { ExecutionState::EXECUTING => (), _ => return Ok(AmlParseType { @@ -611,7 +611,7 @@ fn parse_field_list(data: &[u8], len: 0 as usize }) } - + current_offset += res.len; } @@ -634,10 +634,10 @@ fn parse_field_element(data: &[u8], len: 0 as usize }) } - + let length = if let Ok(field) = parse_named_field(data, ctx) { let local_scope_string = get_namespace_string(ctx.scope.clone(), AmlValue::String(field.val.name.clone()))?; - + ctx.add_to_namespace(local_scope_string, AmlValue::FieldUnit(FieldUnit { selector: selector.clone(), connection: Box::new(connection.clone()), @@ -657,7 +657,7 @@ fn parse_field_element(data: &[u8], flags.access_type = AccessType::BufferAcc(field.val.access_attrib.clone()), ref a => flags.access_type = a.clone() } - + field.len } else if let Ok(field) = parse_connect_field(data, ctx) { *connection = field.val.clone(); @@ -665,15 +665,14 @@ fn parse_field_element(data: &[u8], } else { return Err(AmlError::AmlInvalidOpCode); }; - + Ok(AmlParseType { val: AmlValue::None, len: length }) } -fn parse_named_field(data: &[u8], - ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<NamedField>, AmlError> { +fn parse_named_field(data: &[u8], _ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<NamedField>, AmlError> { let (name_seg, name_seg_len) = parse_name_seg(&data[0..4])?; let name = match String::from_utf8(name_seg) { Ok(s) => s, @@ -687,8 +686,7 @@ fn parse_named_field(data: &[u8], }) } -fn parse_reserved_field(data: &[u8], - ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<usize>, AmlError> { +fn parse_reserved_field(data: &[u8], _ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<usize>, AmlError> { parser_opcode!(data, 0x00); let (length, length_len) = parse_pkg_length(&data[1..])?; @@ -698,8 +696,7 @@ fn parse_reserved_field(data: &[u8], }) } -fn parse_access_field(data: &[u8], - ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<AccessField>, AmlError> { +fn parse_access_field(data: &[u8], _ctx: &mut AmlExecutionContext) -> Result<AmlParseTypeGeneric<AccessField>, AmlError> { parser_opcode!(data, 0x01, 0x03); let flags_raw = data[1]; @@ -753,7 +750,7 @@ fn parse_connect_field(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x02); if let Ok(e) = parse_def_buffer(&data[1..], ctx) { @@ -779,7 +776,7 @@ fn parse_def_method(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x14); let (pkg_len, pkg_len_len) = parse_pkg_length(&data[1..])?; @@ -791,7 +788,7 @@ fn parse_def_method(data: &[u8], let sync_level = flags & 0xF0 >> 4; let term_list = &data[2 + pkg_len_len + name.len .. 1 + pkg_len]; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; ctx.add_to_namespace(local_scope_string, AmlValue::Method(Method { arg_count, @@ -815,13 +812,13 @@ fn parse_def_mutex(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x01); let name = parse_name_string(&data[2 ..], ctx)?; let flags = data[2 + name.len]; let sync_level = flags & 0x0F; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; ctx.add_to_namespace(local_scope_string, AmlValue::Mutex((sync_level, None)))?; @@ -840,13 +837,13 @@ fn parse_def_power_res(data: &[u8], len: 0 as usize }) } - + // TODO: How to handle local context deferreds parser_opcode_extended!(data, 0x84); let (pkg_len, pkg_len_len) = parse_pkg_length(&data[2..])?; let name = parse_name_string(&data[2 + pkg_len_len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; let system_level = data[2 + pkg_len_len + name.len]; @@ -855,7 +852,7 @@ fn parse_def_power_res(data: &[u8], let mut local_ctx = AmlExecutionContext::new(local_scope_string.clone()); parse_object_list(&data[5 + pkg_len_len + name.len .. 2 + pkg_len], &mut local_ctx)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::PowerResource(PowerResource { system_level, resource_order, @@ -877,14 +874,14 @@ fn parse_def_processor(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x83); let (pkg_len, pkg_len_len) = parse_pkg_length(&data[2..])?; let name = parse_name_string(&data[2 + pkg_len_len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - + let proc_id = data[2 + pkg_len_len + name.len]; let p_blk_addr: u32 = (data[3 + pkg_len_len + name.len] as u32) + ((data[4 + pkg_len_len + name.len] as u32) << 8) + @@ -917,17 +914,17 @@ fn parse_def_thermal_zone(data: &[u8], len: 0 as usize }) } - - parser_opcode_extended!(data, 0x85); - + + parser_opcode_extended!(data, 0x85); + let (pkg_len, pkg_len_len) = parse_pkg_length(&data[2..])?; let name = parse_name_string(&data[2 + pkg_len_len .. 2 + pkg_len], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; - let mut local_ctx = AmlExecutionContext::new(local_scope_string.clone()); + let mut local_ctx = AmlExecutionContext::new(local_scope_string.clone()); parse_object_list(&data[2 + pkg_len_len + name.len .. 2 + pkg_len], &mut local_ctx)?; - + ctx.add_to_namespace(local_scope_string, AmlValue::ThermalZone(ThermalZone { obj_list: local_ctx.namespace_delta.clone(), notify_methods: BTreeMap::new() @@ -948,7 +945,7 @@ fn parse_def_external(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x15); let object_name = parse_name_string(&data[1..], ctx)?; diff --git a/src/acpi/aml/namespace.rs b/src/acpi/aml/namespace.rs index 18eb7a34e49bd5362ff55d1c8a1a5ff4cb0d3ced..906713695cc1645ac7dd6b1152b1c201e205620d 100644 --- a/src/acpi/aml/namespace.rs +++ b/src/acpi/aml/namespace.rs @@ -163,7 +163,7 @@ impl AmlValue { _ => String::new() } } - + pub fn get_as_type(&self, t: AmlValue) -> Result<AmlValue, AmlError> { match t { AmlValue::None => Ok(AmlValue::None), @@ -229,7 +229,7 @@ impl AmlValue { if idx + len > buf.len() { return Err(AmlError::AmlValueError); } - + Ok(buf[idx .. idx + len].to_vec()) }, _ => Err(AmlError::AmlValueError) @@ -272,14 +272,14 @@ impl AmlValue { _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_event(&self) -> Result<u64, AmlError> { match *self { AmlValue::Event(ref e) => Ok(e.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_field_unit(&self) -> Result<FieldUnit, AmlError> { match *self { AmlValue::FieldUnit(ref e) => Ok(e.clone()), @@ -327,14 +327,14 @@ impl AmlValue { Err(AmlError::AmlValueError) }, AmlValue::String(ref s) => { - let mut s = s.clone()[0..8].to_string().to_uppercase(); + let s = s.clone()[0..8].to_string().to_uppercase(); let mut i: u64 = 0; for c in s.chars() { if !c.is_digit(16) { break; } - + i <<= 8; i += c.to_digit(16).unwrap() as u64; } @@ -372,21 +372,21 @@ impl AmlValue { _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_operation_region(&self) -> Result<OperationRegion, AmlError> { match *self { AmlValue::OperationRegion(ref p) => Ok(p.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_package(&self) -> Result<Vec<AmlValue>, AmlError> { match *self { AmlValue::Package(ref p) => Ok(p.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_string(&self) -> Result<String, AmlError> { match *self { AmlValue::String(ref s) => Ok(s.clone()), @@ -400,28 +400,28 @@ impl AmlValue { _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_power_resource(&self) -> Result<PowerResource, AmlError> { match *self { AmlValue::PowerResource(ref p) => Ok(p.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_processor(&self) -> Result<Processor, AmlError> { match *self { AmlValue::Processor(ref p) => Ok(p.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_raw_data_buffer(&self) -> Result<Vec<u8>, AmlError> { match *self { AmlValue::RawDataBuffer(ref p) => Ok(p.clone()), _ => Err(AmlError::AmlValueError) } } - + pub fn get_as_thermal_zone(&self) -> Result<ThermalZone, AmlError> { match *self { AmlValue::ThermalZone(ref p) => Ok(p.clone()), @@ -447,7 +447,7 @@ impl Method { pub fn get_namespace_string(current: String, modifier_v: AmlValue) -> Result<String, AmlError> { let mut modifier = modifier_v.get_as_string()?; - + if current.len() == 0 { return Ok(modifier); } @@ -455,7 +455,7 @@ pub fn get_namespace_string(current: String, modifier_v: AmlValue) -> Result<Str if modifier.len() == 0 { return Ok(current); } - + if modifier.starts_with("\\") { return Ok(modifier); } @@ -486,6 +486,6 @@ pub fn get_namespace_string(current: String, modifier_v: AmlValue) -> Result<Str if !namespace.ends_with("\\") { namespace.push('.'); } - + Ok(namespace + &modifier) } diff --git a/src/acpi/aml/namespacemodifier.rs b/src/acpi/aml/namespacemodifier.rs index a223f5c8ad72bd181819858b8ac756932386bd76..efdeff3f20ece1b62bd470a8b58fd836ec80a8a5 100644 --- a/src/acpi/aml/namespacemodifier.rs +++ b/src/acpi/aml/namespacemodifier.rs @@ -1,6 +1,6 @@ use super::AmlError; use super::parser::{AmlParseType, ParseResult, AmlExecutionContext, ExecutionState}; -use super::namespace::{AmlValue, ObjectReference, get_namespace_string}; +use super::namespace::{AmlValue, get_namespace_string}; use super::pkglength::parse_pkg_length; use super::namestring::parse_name_string; use super::termlist::parse_term_list; @@ -15,7 +15,7 @@ pub fn parse_namespace_modifier(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_alias_op, @@ -35,17 +35,17 @@ fn parse_alias_op(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x06); let source_name = parse_name_string(&data[1..], ctx)?; let alias_name = parse_name_string(&data[1 + source_name.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), source_name.val)?; let local_alias_string = get_namespace_string(ctx.scope.clone(), alias_name.val)?; ctx.add_to_namespace(local_scope_string, AmlValue::Alias(local_alias_string))?; - + Ok(AmlParseType { val: AmlValue::None, len: 1 + source_name.len + alias_name.len @@ -61,16 +61,16 @@ fn parse_name_op(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x08); - + let name = parse_name_string(&data[1..], ctx)?; let data_ref_obj = parse_data_ref_obj(&data[1 + name.len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val)?; ctx.add_to_namespace(local_scope_string, data_ref_obj.val)?; - + Ok(AmlParseType { val: AmlValue::None, len: 1 + name.len + data_ref_obj.len @@ -86,15 +86,15 @@ fn parse_scope_op(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x10); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[1..])?; let name = parse_name_string(&data[1 + pkg_length_len..], ctx)?; - + let local_scope_string = get_namespace_string(ctx.scope.clone(), name.val.clone())?; let containing_scope_string = ctx.scope.clone(); - + ctx.scope = local_scope_string; parse_term_list(&data[1 + pkg_length_len + name.len .. 1 + pkg_length], ctx)?; ctx.scope = containing_scope_string; diff --git a/src/acpi/aml/namestring.rs b/src/acpi/aml/namestring.rs index 8464b6ccf8fbf932c6ea5cf8607637ec4e0f47a9..81fee85316271b7f3e951cda5623a6320f190fb8 100644 --- a/src/acpi/aml/namestring.rs +++ b/src/acpi/aml/namestring.rs @@ -16,7 +16,7 @@ pub fn parse_name_string(data: &[u8], len: 0 as usize }) } - + let mut characters: Vec<u8> = vec!(); let mut starting_index: usize = 0; @@ -127,7 +127,7 @@ fn parse_multi_name_path(data: &[u8]) -> Result<(Vec<u8>, usize), AmlError> { let mut current_seg = 0; let mut characters: Vec<u8> = vec!(); let mut multi_len: usize = 2; - + while current_seg < seg_count { match parse_name_seg(&data[(current_seg as usize * 4) + 2 ..]) { Ok((mut v, len)) => { @@ -156,7 +156,7 @@ pub fn parse_super_name(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_simple_name, @@ -176,7 +176,7 @@ fn parse_debug_obj(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x31); Ok(AmlParseType { @@ -194,7 +194,7 @@ pub fn parse_simple_name(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_name_string, @@ -214,7 +214,7 @@ pub fn parse_target(data: &[u8], len: 0 as usize }) } - + if data[0] == 0x00 { Ok(AmlParseType { val: AmlValue::None, diff --git a/src/acpi/aml/parser.rs b/src/acpi/aml/parser.rs index 13c51a935e4b8883d7e609e84cba7261e09e2abc..0b95031ceb14e1ba5f9189ad8dc292b9d6cdc3cc 100644 --- a/src/acpi/aml/parser.rs +++ b/src/acpi/aml/parser.rs @@ -41,7 +41,7 @@ impl AmlExecutionContext { let id: u64 = *idptr; *idptr += 1; - + AmlExecutionContext { scope: scope, local_vars: [AmlValue::Uninitialized, @@ -69,11 +69,11 @@ impl AmlExecutionContext { pub fn wait_for_event(&mut self, event_ptr: AmlValue) -> Result<bool, AmlError> { let mut namespace_ptr = self.prelock(); - let mut namespace = match *namespace_ptr { + let namespace = match *namespace_ptr { Some(ref mut n) => n, None => return Err(AmlError::AmlHardFatal) }; - + let mutex_idx = match event_ptr { AmlValue::String(ref s) => s.clone(), AmlValue::ObjectReference(ref o) => match *o { @@ -103,12 +103,12 @@ impl AmlExecutionContext { pub fn signal_event(&mut self, event_ptr: AmlValue) -> Result<(), AmlError> { let mut namespace_ptr = self.prelock(); - let mut namespace = match *namespace_ptr { + let namespace = match *namespace_ptr { Some(ref mut n) => n, None => return Err(AmlError::AmlHardFatal) }; - + let mutex_idx = match event_ptr { AmlValue::String(ref s) => s.clone(), AmlValue::ObjectReference(ref o) => match *o { @@ -126,23 +126,22 @@ impl AmlExecutionContext { match mutex { AmlValue::Event(count) => { namespace.insert(mutex_idx, AmlValue::Event(count + 1)); - return Ok(()); }, _ => return Err(AmlError::AmlValueError) } Ok(()) } - + pub fn release_mutex(&mut self, mutex_ptr: AmlValue) -> Result<(), AmlError> { let id = self.ctx_id; - + let mut namespace_ptr = self.prelock(); - let mut namespace = match *namespace_ptr { + let namespace = match *namespace_ptr { Some(ref mut n) => n, None => return Err(AmlError::AmlHardFatal) }; - + let mutex_idx = match mutex_ptr { AmlValue::String(ref s) => s.clone(), AmlValue::ObjectReference(ref o) => match *o { @@ -156,7 +155,7 @@ impl AmlExecutionContext { Some(s) => s.clone(), None => return Err(AmlError::AmlValueError) }; - + match mutex { AmlValue::Mutex((sync_level, owner)) => { if let Some(o) = owner { @@ -177,7 +176,7 @@ impl AmlExecutionContext { if o == id { let mut new_region = region.clone(); new_region.accessed_by = None; - + namespace.insert(mutex_idx, AmlValue::OperationRegion(new_region)); return Ok(()); } else { @@ -192,10 +191,10 @@ impl AmlExecutionContext { } pub fn acquire_mutex(&mut self, mutex_ptr: AmlValue) -> Result<bool, AmlError> { - let id = self.ctx_id; - + let id = self.ctx_id; + let mut namespace_ptr = self.prelock(); - let mut namespace = match *namespace_ptr { + let namespace = match *namespace_ptr { Some(ref mut n) => n, None => return Err(AmlError::AmlHardFatal) }; @@ -212,17 +211,17 @@ impl AmlExecutionContext { Some(s) => s.clone(), None => return Err(AmlError::AmlValueError) }; - + match mutex { AmlValue::Mutex((sync_level, owner)) => { if owner == None { if sync_level < self.sync_level { return Err(AmlError::AmlValueError); } - + namespace.insert(mutex_idx, AmlValue::Mutex((sync_level, Some(id)))); self.sync_level = sync_level; - + return Ok(true); } }, @@ -243,7 +242,7 @@ impl AmlExecutionContext { pub fn add_to_namespace(&mut self, name: String, value: AmlValue) -> Result<(), AmlError> { let mut namespace = ACPI_TABLE.namespace.write(); - + if let Some(ref mut namespace) = *namespace { if let Some(obj) = namespace.get(&name) { match *obj { @@ -256,7 +255,7 @@ impl AmlExecutionContext { _ => return Err(AmlError::AmlValueError) } } - + self.namespace_delta.push(name.clone()); namespace.insert(name, value); @@ -339,10 +338,10 @@ impl AmlExecutionContext { if indices.len() != 1 { return Err(AmlError::AmlValueError); } - + let mut bytes = string.clone().into_bytes(); bytes[indices[0] as usize] = value.get_as_integer()? as u8; - + let string = String::from_utf8(bytes).unwrap(); Ok(AmlValue::String(string)) @@ -351,7 +350,7 @@ impl AmlExecutionContext { if indices.len() != 1 { return Err(AmlError::AmlValueError); } - + let mut b = b.clone(); b[indices[0] as usize] = value.get_as_integer()? as u8; @@ -373,7 +372,7 @@ impl AmlExecutionContext { if indices.len() < 0 { return Err(AmlError::AmlValueError); } - + let mut p = p.clone(); if indices.len() == 1 { @@ -381,7 +380,7 @@ impl AmlExecutionContext { } else { p[indices[0] as usize] = self.modify_index_core(p[indices[0] as usize].clone(), value, indices[1..].to_vec())?; } - + Ok(AmlValue::Package(p)) }, _ => return Err(AmlError::AmlValueError) @@ -470,8 +469,8 @@ impl AmlExecutionContext { if indices.len() != 1 { return Err(AmlError::AmlValueError); } - - let mut bytes = string.clone().into_bytes(); + + let bytes = string.clone().into_bytes(); Ok(AmlValue::Integer(bytes[indices[0] as usize] as u64)) }, AmlValue::Buffer(ref b) => { diff --git a/src/acpi/aml/pkglength.rs b/src/acpi/aml/pkglength.rs index b93939f0da8dac6301628475b07f120397b54cc9..b3cd39a675384fb6833ed795fb0e3bc1c8f706c9 100644 --- a/src/acpi/aml/pkglength.rs +++ b/src/acpi/aml/pkglength.rs @@ -20,6 +20,6 @@ pub fn parse_pkg_length(data: &[u8]) -> Result<(usize, usize), AmlError> { pkg_len += (data[1 + current_byte] as u32 * 16 * (256 as u32).pow(current_byte as u32)) as usize; current_byte += 1; } - + return Ok((pkg_len, count_bytes + 1)); } diff --git a/src/acpi/aml/termlist.rs b/src/acpi/aml/termlist.rs index 262f731263ddf59cbb92973016439d88e2ed1f29..75967a07dfa1accb02eb597642ecc0787105c7c0 100644 --- a/src/acpi/aml/termlist.rs +++ b/src/acpi/aml/termlist.rs @@ -19,12 +19,12 @@ pub fn parse_term_list(data: &[u8], len: 0 as usize }) } - + let mut current_offset: usize = 0; while current_offset < data.len() { let res = parse_term_obj(&data[current_offset..], ctx)?; - + match ctx.state { ExecutionState::EXECUTING => (), _ => return Ok(AmlParseType { @@ -32,7 +32,7 @@ pub fn parse_term_list(data: &[u8], len: data.len() }) } - + current_offset += res.len; } @@ -51,7 +51,7 @@ pub fn parse_term_arg(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_local_obj, @@ -72,12 +72,12 @@ pub fn parse_object_list(data: &[u8], len: 0 as usize }) } - + let mut current_offset: usize = 0; while current_offset < data.len() { let res = parse_object(&data[current_offset..], ctx)?; - + match ctx.state { ExecutionState::EXECUTING => (), _ => return Ok(AmlParseType { @@ -85,7 +85,7 @@ pub fn parse_object_list(data: &[u8], len: data.len() }) } - + current_offset += res.len; } @@ -104,7 +104,7 @@ fn parse_object(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_namespace_modifier, @@ -123,7 +123,7 @@ pub fn parse_method_invocation(data: &[u8], len: 0 as usize }) } - + let name = parse_name_string(data, ctx)?; let method = ctx.get(name.val.clone())?; @@ -131,15 +131,15 @@ pub fn parse_method_invocation(data: &[u8], AmlValue::None => return Err(AmlError::AmlDeferredLoad), _ => method.get_as_method()? }; - + let mut cur = 0; let mut params: Vec<AmlValue> = vec!(); let mut current_offset = name.len; - + while cur < method.arg_count { let res = parse_term_arg(&data[current_offset..], ctx)?; - + current_offset += res.len; cur += 1; @@ -161,7 +161,7 @@ fn parse_term_obj(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_namespace_modifier, diff --git a/src/acpi/aml/type1opcode.rs b/src/acpi/aml/type1opcode.rs index e5c702315118a13b799bfebed8b7826697f66325..3942ee13496f6cdfa7eb2d367bc69315e82fa88f 100644 --- a/src/acpi/aml/type1opcode.rs +++ b/src/acpi/aml/type1opcode.rs @@ -1,6 +1,6 @@ use super::AmlError; use super::parser::{AmlParseType, ParseResult, AmlExecutionContext, ExecutionState}; -use super::namespace::{AmlValue, ObjectReference, OperationRegion}; +use super::namespace::AmlValue; use super::pkglength::parse_pkg_length; use super::termlist::{parse_term_arg, parse_term_list}; use super::namestring::{parse_name_string, parse_super_name}; @@ -19,7 +19,7 @@ pub fn parse_type1_opcode(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_def_break, @@ -52,7 +52,7 @@ fn parse_def_break(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xA5); ctx.state = ExecutionState::BREAK; @@ -71,7 +71,7 @@ fn parse_def_breakpoint(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xCC); Ok(AmlParseType { @@ -89,7 +89,7 @@ fn parse_def_continue(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x9F); ctx.state = ExecutionState::CONTINUE; @@ -108,7 +108,7 @@ fn parse_def_noop(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xA3); Ok(AmlParseType { @@ -126,7 +126,7 @@ fn parse_def_fatal(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x32); let fatal_type = data[2]; @@ -145,7 +145,7 @@ fn parse_def_load(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x20); let name = parse_name_string(&data[2..], ctx)?; @@ -158,7 +158,7 @@ fn parse_def_load(data: &[u8], load_table(get_sdt_signature(sdt)); let delta = parse_aml_table(sdt)?; ctx.modify(ddb_handle_object.val, AmlValue::DDBHandle((delta, get_sdt_signature(sdt)))); - + Ok(AmlParseType { val: AmlValue::None, len: 2 + name.len + ddb_handle_object.len @@ -177,7 +177,7 @@ fn parse_def_notify(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x86); let object = parse_super_name(&data[1..], ctx)?; @@ -225,12 +225,12 @@ fn parse_def_release(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x27); let obj = parse_super_name(&data[2..], ctx)?; ctx.release_mutex(obj.val); - + Ok(AmlParseType { val: AmlValue::None, len: 2 + obj.len @@ -246,7 +246,7 @@ fn parse_def_reset(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x26); let object = parse_super_name(&data[2..], ctx)?; @@ -269,7 +269,7 @@ fn parse_def_signal(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x24); let object = parse_super_name(&data[2..], ctx)?; @@ -289,19 +289,19 @@ fn parse_def_sleep(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x22); let time = parse_term_arg(&data[2..], ctx)?; let timeout = time.val.get_as_integer()?; - + let (seconds, nanoseconds) = monotonic(); let starting_time_ns = nanoseconds + (seconds * 1000000000); - + loop { let (seconds, nanoseconds) = monotonic(); let current_time_ns = nanoseconds + (seconds * 1000000000); - + if current_time_ns - starting_time_ns > timeout as u64 * 1000000 { break; } @@ -322,19 +322,19 @@ fn parse_def_stall(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x21); let time = parse_term_arg(&data[2..], ctx)?; let timeout = time.val.get_as_integer()?; - + let (seconds, nanoseconds) = monotonic(); let starting_time_ns = nanoseconds + (seconds * 1000000000); - + loop { let (seconds, nanoseconds) = monotonic(); let current_time_ns = nanoseconds + (seconds * 1000000000); - + if current_time_ns - starting_time_ns > timeout as u64 * 1000 { break; } @@ -355,7 +355,7 @@ fn parse_def_unload(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x2A); let object = parse_super_name(&data[2..], ctx)?; @@ -384,12 +384,12 @@ fn parse_def_if_else(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xA0); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[1..])?; let if_condition = parse_term_arg(&data[1 + pkg_length_len .. 1 + pkg_length], ctx)?; - + let (else_length, else_length_len) = if data.len() > 1 + pkg_length && data[1 + pkg_length] == 0xA1 { parse_pkg_length(&data[2 + pkg_length..])? } else { @@ -417,7 +417,7 @@ fn parse_def_while(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xA2); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[1..])?; @@ -427,7 +427,7 @@ fn parse_def_while(data: &[u8], if predicate.val.get_as_integer()? == 0 { break; } - + parse_term_list(&data[1 + pkg_length_len + predicate.len .. 1 + pkg_length], ctx)?; match ctx.state { @@ -443,7 +443,7 @@ fn parse_def_while(data: &[u8], }) } } - + Ok(AmlParseType { val: AmlValue::None, len: 1 + pkg_length @@ -459,7 +459,7 @@ fn parse_def_return(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0xA4); let arg_object = parse_term_arg(&data[1..], ctx)?; diff --git a/src/acpi/aml/type2opcode.rs b/src/acpi/aml/type2opcode.rs index 37b3001da1382534cc5b1da8947b6a56edf94a65..ff7698c59ed850f529de56df9911a3a403e7366d 100644 --- a/src/acpi/aml/type2opcode.rs +++ b/src/acpi/aml/type2opcode.rs @@ -4,14 +4,14 @@ use collections::vec::Vec; use super::{AmlError, parse_aml_with_scope}; use super::parser::{AmlParseType, ParseResult, AmlExecutionContext, ExecutionState}; -use super::namespace::{AmlValue, ObjectReference, OperationRegion}; +use super::namespace::{AmlValue, ObjectReference}; use super::pkglength::parse_pkg_length; use super::termlist::{parse_term_arg, parse_method_invocation}; use super::namestring::{parse_super_name, parse_target, parse_name_string, parse_simple_name}; use super::dataobj::parse_data_ref_obj; use time::monotonic; -use acpi::{ACPI_TABLE, SDT_POINTERS}; +use acpi::SDT_POINTERS; #[derive(Debug, Clone)] pub enum MatchOpcode { @@ -32,7 +32,7 @@ pub fn parse_type2_opcode(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_def_increment, @@ -99,7 +99,7 @@ pub fn parse_type6_opcode(data: &[u8], len: 0 as usize }) } - + parser_selector! { data, ctx, parse_def_deref_of, @@ -120,7 +120,7 @@ pub fn parse_def_object_type(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x8E); parser_selector! { data, ctx, @@ -142,7 +142,7 @@ pub fn parse_def_package(data: &[u8], len: 0 as usize }) } - + // TODO: Handle deferred loads in here parser_opcode!(data, 0x12); @@ -157,7 +157,7 @@ pub fn parse_def_package(data: &[u8], elements.push(AmlValue::Uninitialized); } } - + Ok(AmlParseType { val: AmlValue::Package(elements), len: 1 + pkg_length @@ -173,7 +173,7 @@ pub fn parse_def_var_package(data: &[u8], len: 0 as usize }) } - + // TODO: Handle deferred loads in here parser_opcode!(data, 0x13); @@ -191,7 +191,7 @@ pub fn parse_def_var_package(data: &[u8], elements.push(AmlValue::Uninitialized); } } - + Ok(AmlParseType { val: AmlValue::Package(elements), len: 1 + pkg_length @@ -207,7 +207,7 @@ fn parse_package_elements_list(data: &[u8], len: 0 as usize }) } - + let mut current_offset: usize = 0; let mut elements: Vec<AmlValue> = vec!(); @@ -241,14 +241,14 @@ pub fn parse_def_buffer(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x11); let (pkg_length, pkg_length_len) = parse_pkg_length(&data[1..])?; let buffer_size = parse_term_arg(&data[1 + pkg_length_len..], ctx)?; let mut byte_list = data[1 + pkg_length_len + buffer_size.len .. 1 + pkg_length].to_vec().clone(); - byte_list.truncate(buffer_size.val.get_as_integer()? as usize); + byte_list.truncate(buffer_size.val.get_as_integer()? as usize); Ok(AmlParseType { val: AmlValue::Buffer(byte_list), @@ -265,7 +265,7 @@ fn parse_def_ref_of(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x71); let obj = parse_super_name(&data[1..], ctx)?; @@ -279,7 +279,7 @@ fn parse_def_ref_of(data: &[u8], AmlValue::ObjectReference(ref o) => o.clone(), _ => return Err(AmlError::AmlValueError) }; - + Ok(AmlParseType { val: AmlValue::ObjectReference(res), len: 1 + obj.len @@ -295,7 +295,7 @@ fn parse_def_deref_of(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x83); let obj = parse_term_arg(&data[1..], ctx)?; @@ -319,7 +319,7 @@ fn parse_def_acquire(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x23); let obj = parse_super_name(&data[1..], ctx)?; @@ -341,7 +341,7 @@ fn parse_def_acquire(data: &[u8], } else { let (seconds, nanoseconds) = monotonic(); let current_time_ns = nanoseconds + (seconds * 1000000000); - + if current_time_ns - starting_time_ns > timeout as u64 * 1000000 { return Ok(AmlParseType { val: AmlValue::Integer(1), @@ -362,15 +362,15 @@ fn parse_def_increment(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x75); let obj = parse_super_name(&data[1..], ctx)?; - - let mut namespace = ctx.prelock(); + + 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 { val: value, len: 1 + obj.len @@ -386,7 +386,7 @@ fn parse_def_index(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x88); let obj = parse_term_arg(&data[1..], ctx)?; @@ -395,7 +395,7 @@ fn parse_def_index(data: &[u8], let reference = AmlValue::ObjectReference(ObjectReference::Index(Box::new(obj.val), Box::new(idx.val))); ctx.modify(target.val, reference.clone()); - + Ok(AmlParseType { val: reference, len: 1 + obj.len + idx.len + target.len @@ -411,14 +411,14 @@ fn parse_def_land(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x90); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let result = if lhs.val.get_as_integer()? > 0 && rhs.val.get_as_integer()? > 0 { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + lhs.len + rhs.len @@ -434,14 +434,14 @@ fn parse_def_lequal(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x93); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let result = if lhs.val.get_as_integer()? == rhs.val.get_as_integer()? { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + lhs.len + rhs.len @@ -457,14 +457,14 @@ fn parse_def_lgreater(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x94); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let result = if lhs.val.get_as_integer()? > rhs.val.get_as_integer()? { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + lhs.len + rhs.len @@ -480,14 +480,14 @@ fn parse_def_lless(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x95); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let result = if lhs.val.get_as_integer()? < rhs.val.get_as_integer()? { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + lhs.len + rhs.len @@ -503,12 +503,12 @@ fn parse_def_lnot(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x92); let operand = parse_term_arg(&data[1..], ctx)?; let result = if operand.val.get_as_integer()? == 0 { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + operand.len @@ -524,14 +524,14 @@ fn parse_def_lor(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x91); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let result = if lhs.val.get_as_integer()? > 0 || rhs.val.get_as_integer()? > 0 { 1 } else { 0 }; - + Ok(AmlParseType { val: AmlValue::IntegerConstant(result), len: 1 + lhs.len + rhs.len @@ -547,7 +547,7 @@ fn parse_def_to_hex_string(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x98); let operand = parse_term_arg(&data[2..], ctx)?; @@ -588,7 +588,7 @@ fn parse_def_to_buffer(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x96); let operand = parse_term_arg(&data[2..], ctx)?; @@ -612,12 +612,12 @@ fn parse_def_to_bcd(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x29); let operand = parse_term_arg(&data[2..], ctx)?; let target = parse_target(&data[2 + operand.len..], ctx)?; - + let mut i = operand.val.get_as_integer()?; let mut result = 0; @@ -626,7 +626,7 @@ fn parse_def_to_bcd(data: &[u8], result += i % 10; i /= 10; } - + let result = AmlValue::Integer(result); ctx.modify(target.val, result.clone()); @@ -685,7 +685,7 @@ fn parse_def_to_integer(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x99); let operand = parse_term_arg(&data[2..], ctx)?; @@ -710,7 +710,7 @@ fn parse_def_to_string(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x9C); let operand = parse_term_arg(&data[1..], ctx)?; @@ -743,7 +743,7 @@ fn parse_def_subtract(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x74); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -753,7 +753,7 @@ fn parse_def_subtract(data: &[u8], let result = AmlValue::Integer(lhs.val.get_as_integer()? - rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -769,7 +769,7 @@ fn parse_def_size_of(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x87); let name = parse_super_name(&data[1..], ctx)?; @@ -781,7 +781,7 @@ fn parse_def_size_of(data: &[u8], AmlValue::Package(ref p) => p.len(), _ => return Err(AmlError::AmlValueError) }; - + Ok(AmlParseType { val: AmlValue::Integer(res as u64), len: 1 + name.len @@ -797,14 +797,14 @@ fn parse_def_store(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x70); let operand = parse_term_arg(&data[1..], ctx)?; let target = parse_super_name(&data[1 + operand.len..], ctx)?; ctx.modify(target.val.clone(), operand.val); - + Ok(AmlParseType { val: target.val, len: 1 + operand.len + target.len @@ -820,17 +820,17 @@ fn parse_def_or(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7D); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; - + let result = AmlValue::Integer(lhs.val.get_as_integer()? | rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -846,17 +846,17 @@ fn parse_def_shift_left(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x79); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; - + let result = AmlValue::Integer(lhs.val.get_as_integer()? >> rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -872,7 +872,7 @@ fn parse_def_shift_right(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7A); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -882,7 +882,7 @@ fn parse_def_shift_right(data: &[u8], let result = AmlValue::Integer(lhs.val.get_as_integer()? << rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -898,17 +898,17 @@ fn parse_def_add(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x72); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; - + let result = AmlValue::Integer(lhs.val.get_as_integer()? + rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -924,17 +924,17 @@ fn parse_def_and(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7B); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; - + let result = AmlValue::Integer(lhs.val.get_as_integer()? & rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -950,17 +950,17 @@ fn parse_def_xor(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7F); let lhs = parse_term_arg(&data[1..], ctx)?; let rhs = parse_term_arg(&data[1 + lhs.len..], ctx)?; let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; - + let result = AmlValue::Integer(lhs.val.get_as_integer()? ^ rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -976,7 +976,7 @@ fn parse_def_concat_res(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x84); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -993,7 +993,7 @@ fn parse_def_concat_res(data: &[u8], if buf1.len() >= 2 && buf1[buf1.len() - 2] == 0x79 { buf1 = buf1[0..buf1.len() - 2].to_vec(); } - + if buf2.len() >= 2 && buf2[buf2.len() - 2] == 0x79 { buf2 = buf2[0..buf2.len() - 2].to_vec(); } @@ -1009,10 +1009,10 @@ fn parse_def_concat_res(data: &[u8], checksum = (!checksum) + 1; buf1.push(checksum); - + let res = AmlValue::Buffer(buf1); ctx.modify(target.val, res.clone())?; - + Ok(AmlParseType { val: res, len: 1 + lhs.len + rhs.len + target.len @@ -1028,7 +1028,7 @@ fn parse_def_wait(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x25); let obj = parse_super_name(&data[2..], ctx)?; @@ -1052,7 +1052,7 @@ fn parse_def_wait(data: &[u8], } else { let (seconds, nanoseconds) = monotonic(); let current_time_ns = nanoseconds + (seconds * 1000000000); - + if current_time_ns - starting_time_ns > timeout as u64 * 1000000 { return Ok(AmlParseType { val: AmlValue::Integer(1), @@ -1073,7 +1073,7 @@ fn parse_def_cond_ref_of(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x12); let obj = parse_super_name(&data[2..], ctx)?; @@ -1094,7 +1094,7 @@ fn parse_def_cond_ref_of(data: &[u8], }; ctx.modify(target.val, AmlValue::ObjectReference(res)); - + Ok(AmlParseType { val: AmlValue::Integer(1), len: 1 + obj.len + target.len @@ -1110,7 +1110,7 @@ fn parse_def_copy_object(data: &[u8], len: 0 as usize }) } - + // TODO: Compute the result // TODO: Store the result parser_opcode!(data, 0x9D); @@ -1135,7 +1135,7 @@ fn parse_def_concat(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x73); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -1143,7 +1143,7 @@ fn parse_def_concat(data: &[u8], let target = parse_target(&data[1 + lhs.len + rhs.len..], ctx)?; let result = match lhs.val { - AmlValue::Integer(i) => { + AmlValue::Integer(_i) => { let j = AmlValue::Integer(rhs.val.get_as_integer()?); let mut first = lhs.val.get_as_buffer()?.clone(); @@ -1203,15 +1203,15 @@ fn parse_def_decrement(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x76); let obj = parse_super_name(&data[1..], ctx)?; - - let mut namespace = ctx.prelock(); + + let namespace = ctx.prelock(); let value = AmlValue::Integer(ctx.get(obj.val.clone())?.get_as_integer()? - 1); ctx.modify(obj.val, value.clone()); - + Ok(AmlParseType { val: value, len: 1 + obj.len @@ -1227,7 +1227,7 @@ fn parse_def_divide(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x78); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -1243,7 +1243,7 @@ fn parse_def_divide(data: &[u8], ctx.modify(target_remainder.val, AmlValue::Integer(remainder)); ctx.modify(target_quotient.val, AmlValue::Integer(quotient)); - + Ok(AmlParseType { val: AmlValue::Integer(quotient), len: 1 + lhs.len + rhs.len + target_remainder.len + target_quotient.len @@ -1259,7 +1259,7 @@ fn parse_def_find_set_left_bit(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x81); let operand = parse_term_arg(&data[2..], ctx)?; @@ -1267,7 +1267,7 @@ fn parse_def_find_set_left_bit(data: &[u8], let mut first_bit = 32; let mut test = operand.val.get_as_integer()?; - + while first_bit > 0{ if test & 0x8000000000000000 > 0 { break; @@ -1279,7 +1279,7 @@ fn parse_def_find_set_left_bit(data: &[u8], let result = AmlValue::Integer(first_bit); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + operand.len + target.len @@ -1295,7 +1295,7 @@ fn parse_def_find_set_right_bit(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x82); let operand = parse_term_arg(&data[2..], ctx)?; @@ -1303,7 +1303,7 @@ fn parse_def_find_set_right_bit(data: &[u8], let mut first_bit = 1; let mut test = operand.val.get_as_integer()?; - + while first_bit <= 32 { if test & 1 > 0 { break; @@ -1335,7 +1335,7 @@ fn parse_def_load_table(data: &[u8], len: 0 as usize }) } - + // TODO: Clean up parser_opcode_extended!(data, 0x1F); @@ -1359,13 +1359,13 @@ fn parse_def_load_table(data: &[u8], }; let sdt_signature = (sig_str, oem_str, oem_table_str); - + let sdt = ptrs.get(&sdt_signature); - + if let Some(sdt) = sdt { let hdl = parse_aml_with_scope(sdt, root_path.val.get_as_string()?)?; ctx.modify(parameter_path.val, parameter_data.val); - + return Ok(AmlParseType { val: AmlValue::DDBHandle((hdl, sdt_signature)), len: 2 + signature.len + oem_id.len + oem_table_id.len + root_path.len + parameter_path.len + parameter_data.len @@ -1388,11 +1388,11 @@ fn parse_def_match(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x28); - + let search_pkg = parse_term_arg(&data[1..], ctx)?; - + let first_operation = match data[1 + search_pkg.len] { 0 => MatchOpcode::MTR, 1 => MatchOpcode::MEQ, @@ -1414,7 +1414,7 @@ fn parse_def_match(data: &[u8], _ => return Err(AmlError::AmlParseError("DefMatch - Invalid Opcode")) }; let second_operand = parse_term_arg(&data[3 + search_pkg.len + first_operand.len..], ctx)?; - + let start_index = parse_term_arg(&data[3 + search_pkg.len + first_operand.len + second_operand.len..], ctx)?; let pkg = search_pkg.val.get_as_package()?; @@ -1532,7 +1532,7 @@ fn parse_def_from_bcd(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x28); let operand = parse_term_arg(&data[2..], ctx)?; @@ -1545,7 +1545,7 @@ fn parse_def_from_bcd(data: &[u8], if i & 0x0F > 10 { return Err(AmlError::AmlValueError); } - + result *= 10; result += i & 0x0F; i >>= 4; @@ -1554,7 +1554,7 @@ fn parse_def_from_bcd(data: &[u8], let result = AmlValue::Integer(result); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 2 + operand.len + target.len @@ -1570,7 +1570,7 @@ fn parse_def_mid(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x9E); let source = parse_term_arg(&data[1..], ctx)?; @@ -1580,7 +1580,7 @@ fn parse_def_mid(data: &[u8], let idx = index.val.get_as_integer()? as usize; let mut len = length.val.get_as_integer()? as usize; - + let result = match source.val { AmlValue::String(s) => { if idx > s.len() { @@ -1602,7 +1602,7 @@ fn parse_def_mid(data: &[u8], // Additionally, any type that can be converted to a buffer can also be converted to a // string, so no information is lost let b = source.val.get_as_buffer()?; - + if idx > b.len() { AmlValue::Buffer(vec!()) } else { @@ -1614,7 +1614,7 @@ fn parse_def_mid(data: &[u8], } } }; - + ctx.modify(target.val, result.clone()); Ok(AmlParseType { @@ -1632,7 +1632,7 @@ fn parse_def_mod(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x85); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -1646,7 +1646,7 @@ fn parse_def_mod(data: &[u8], let result = AmlValue::Integer(lhs.val.get_as_integer()? % rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -1662,7 +1662,7 @@ fn parse_def_multiply(data: &[u8], len: 0 as usize }) } - + // TODO: Handle overflow parser_opcode!(data, 0x77); @@ -1673,7 +1673,7 @@ fn parse_def_multiply(data: &[u8], let result = AmlValue::Integer(lhs.val.get_as_integer()? * rhs.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -1689,7 +1689,7 @@ fn parse_def_nand(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7C); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -1699,7 +1699,7 @@ fn parse_def_nand(data: &[u8], let result = AmlValue::Integer(!(lhs.val.get_as_integer()? & rhs.val.get_as_integer()?)); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -1715,7 +1715,7 @@ fn parse_def_nor(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x7E); let lhs = parse_term_arg(&data[1..], ctx)?; @@ -1725,7 +1725,7 @@ fn parse_def_nor(data: &[u8], let result = AmlValue::Integer(!(lhs.val.get_as_integer()? | rhs.val.get_as_integer()?)); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + lhs.len + rhs.len + target.len @@ -1741,7 +1741,7 @@ fn parse_def_not(data: &[u8], len: 0 as usize }) } - + parser_opcode!(data, 0x80); let operand = parse_term_arg(&data[1..], ctx)?; @@ -1750,7 +1750,7 @@ fn parse_def_not(data: &[u8], let result = AmlValue::Integer(!operand.val.get_as_integer()?); ctx.modify(target.val, result.clone()); - + Ok(AmlParseType { val: result, len: 1 + operand.len + target.len @@ -1766,12 +1766,12 @@ fn parse_def_timer(data: &[u8], len: 0 as usize }) } - + parser_opcode_extended!(data, 0x33); let (seconds, nanoseconds) = monotonic(); let monotonic_ns = nanoseconds + (seconds * 1000000000); - + Ok(AmlParseType { val: AmlValue::Integer(monotonic_ns), len: 2 as usize diff --git a/src/acpi/dmar/mod.rs b/src/acpi/dmar/mod.rs index 549f6869eab707c8993a7221ab38d0b7fddc9fee..d83c5056a1c2b1ee084d2163d982130f82410f85 100644 --- a/src/acpi/dmar/mod.rs +++ b/src/acpi/dmar/mod.rs @@ -5,7 +5,7 @@ use self::drhd::Drhd; use memory::Frame; use paging::{entry, ActivePageTable, PhysicalAddress}; -use super::{ACPI_TABLE, SDT_POINTERS, get_sdt, find_sdt, load_table, get_sdt_signature}; +use super::{find_sdt, load_table, get_sdt_signature}; pub mod drhd; @@ -28,7 +28,7 @@ impl Dmar { println!("Unable to find DMAR"); return; }; - + if let Some(dmar) = dmar { println!(" DMAR: {}: {}", dmar.addr_width, dmar.flags); @@ -50,7 +50,7 @@ impl Dmar { } } } - + pub fn new(sdt: &'static Sdt) -> Option<Dmar> { if &sdt.signature == b"DMAR" && sdt.data_len() >= 12 { //Not valid if no local address and flags let addr_width = unsafe { *(sdt.data_address() as *const u8) }; diff --git a/src/acpi/fadt.rs b/src/acpi/fadt.rs index 6dd82d867c3bee41e647900226992d2d09a7547e..c7be82ab4b4eeb596a6cbb26b48956b67b06929a 100644 --- a/src/acpi/fadt.rs +++ b/src/acpi/fadt.rs @@ -1,5 +1,4 @@ use core::{mem, ptr}; -use collections::string::String; use super::sdt::Sdt; use super::{ACPI_TABLE, SDT_POINTERS, get_sdt, find_sdt, get_sdt_signature, load_table}; @@ -97,7 +96,7 @@ impl Fadt { None } } - + pub fn init(active_table: &mut ActivePageTable) { let fadt_sdt = find_sdt("FACP"); let fadt = if fadt_sdt.len() == 1 { @@ -110,7 +109,7 @@ impl Fadt { if let Some(fadt) = fadt { println!(" FACP: {:X}", fadt.dsdt); - + let dsdt_sdt = get_sdt(fadt.dsdt as usize, active_table); let signature = get_sdt_signature(dsdt_sdt); diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs index d2e5ecfbde2cc3d7a45ceba2581947a07f2cd07f..551eb097af85635b7f28b45dd01d8009fe771f0b 100644 --- a/src/acpi/hpet.rs +++ b/src/acpi/hpet.rs @@ -6,7 +6,7 @@ use memory::Frame; use paging::{entry, ActivePageTable, PhysicalAddress, Page, VirtualAddress}; use super::sdt::Sdt; -use super::{ACPI_TABLE, SDT_POINTERS, get_sdt, find_sdt, load_table, get_sdt_signature}; +use super::{ACPI_TABLE, find_sdt, load_table, get_sdt_signature}; #[repr(packed)] #[derive(Clone, Copy, Debug, Default)] @@ -44,15 +44,15 @@ impl Hpet { println!("Unable to find HPET"); return; }; - + if let Some(hpet) = hpet { println!(" HPET: {:X}", hpet.hpet_number); - + let mut hpet_t = ACPI_TABLE.hpet.write(); *hpet_t = Some(hpet); } } - + pub fn new(sdt: &'static Sdt, active_table: &mut ActivePageTable) -> Option<Hpet> { if &sdt.signature == b"HPET" && sdt.length as usize >= mem::size_of::<Hpet>() { let s = unsafe { ptr::read((sdt as *const Sdt) as *const Hpet) }; @@ -71,7 +71,7 @@ impl GenericAddressStructure { let result = active_table.map_to(page, frame, entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE); result.flush(active_table); } - + pub unsafe fn read_u64(&self, offset: usize) -> u64{ volatile_load((self.address as usize + offset) as *const u64) } diff --git a/src/acpi/madt.rs b/src/acpi/madt.rs index c4f922a5a12be83c21f8b05356c4840c02e2422e..f22e56ecbad3336e5716c2779abf1c93de6aa2e7 100644 --- a/src/acpi/madt.rs +++ b/src/acpi/madt.rs @@ -4,20 +4,10 @@ use memory::{allocate_frames, Frame}; use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; use super::sdt::Sdt; -use super::{ACPI_TABLE, SDT_POINTERS, AP_STARTUP, TRAMPOLINE, find_sdt, load_table, get_sdt_signature}; +use super::{AP_STARTUP, TRAMPOLINE, find_sdt, load_table, get_sdt_signature}; use core::intrinsics::{atomic_load, atomic_store}; use core::sync::atomic::Ordering; -use collections::btree_map::BTreeMap; -use collections::string::String; -use collections::vec::Vec; -use alloc::boxed::Box; - -use syscall::io::{Io, Pio}; - -use spin::RwLock; - -use stop::kstop; use device::local_apic::LOCAL_APIC; use interrupt; @@ -41,7 +31,7 @@ impl Madt { println!("Unable to find MADT"); return; }; - + if let Some(madt) = madt { println!(" APIC: {:>08X}: {}", madt.local_address, madt.flags); @@ -148,7 +138,7 @@ impl Madt { } } } - + pub fn new(sdt: &'static Sdt) -> Option<Madt> { if &sdt.signature == b"APIC" && sdt.data_len() >= 8 { //Not valid if no local address and flags let local_address = unsafe { *(sdt.data_address() as *const u32) }; diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 8324f8e03526bdef0a9be818097e28320caea9bd..7d8a1a4c2234fa4f09f162c25940d91628a2ce4b 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -1,8 +1,6 @@ //! # ACPI //! Code to parse the ACPI tables -use core::intrinsics::{atomic_load, atomic_store}; -use core::sync::atomic::Ordering; use collections::btree_map::BTreeMap; use collections::string::String; use collections::vec::Vec; @@ -14,15 +12,12 @@ use spin::RwLock; use stop::kstop; -use device::local_apic::LOCAL_APIC; -use interrupt; -use memory::{allocate_frames, Frame}; +use memory::Frame; use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; -use start::{kstart_ap, CPU_COUNT, AP_READY}; -use self::dmar::{Dmar, DmarEntry}; +use self::dmar::Dmar; use self::fadt::Fadt; -use self::madt::{Madt, MadtEntry}; +use self::madt::Madt; use self::rsdt::Rsdt; use self::sdt::Sdt; use self::xsdt::Xsdt; @@ -30,7 +25,7 @@ use self::hpet::Hpet; use self::rxsdt::Rxsdt; use self::rsdp::RSDP; -use self::aml::{is_aml_table, parse_aml_table, AmlError, AmlValue}; +use self::aml::{parse_aml_table, AmlError, AmlValue}; pub mod hpet; mod dmar; @@ -97,7 +92,7 @@ fn init_namespace() { let mut namespace = ACPI_TABLE.namespace.write(); *namespace = Some(BTreeMap::new()); } - + let dsdt = find_sdt("DSDT"); if dsdt.len() == 1 { print!(" DSDT"); @@ -107,7 +102,7 @@ fn init_namespace() { println!("Unable to find DSDT"); return; }; - + let ssdts = find_sdt("SSDT"); for ssdt in ssdts { @@ -128,7 +123,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { let mut order = SDT_ORDER.write(); *order = Some(vec!()); } - + // Search for RSDP if let Some(rsdp) = RSDP::get_rsdp(active_table) { let rxsdt = get_sdt(rsdp.sdt_address(), active_table); @@ -146,12 +141,12 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { println!("UNKNOWN RSDT OR XSDT SIGNATURE"); return; }; - + rxsdt.map_all(active_table); - + for sdt_address in rxsdt.iter() { let sdt = unsafe { &*(sdt_address as *const Sdt) }; - + let signature = get_sdt_signature(sdt); if let Some(ref mut ptrs) = *(SDT_POINTERS.write()) { ptrs.insert(signature, sdt); @@ -171,7 +166,7 @@ pub unsafe fn init(active_table: &mut ActivePageTable) { pub fn set_global_s_state(state: u8) { if state == 5 { let fadt = ACPI_TABLE.fadt.read(); - + if let Some(ref fadt) = *fadt { let port = fadt.pm1a_control_block as u16; let mut val = 1 << 13; @@ -183,10 +178,10 @@ pub fn set_global_s_state(state: u8) { if let Ok(p) = s.get_as_package() { let slp_typa = p[0].get_as_integer().expect("SLP_TYPa is not an integer"); let slp_typb = p[1].get_as_integer().expect("SLP_TYPb is not an integer"); - + println!("Shutdown SLP_TYPa {:X}, SLP_TYPb {:X}", slp_typa, slp_typb); val |= slp_typa as u16; - + println!("Shutdown with ACPI outw(0x{:X}, 0x{:X})", port, val); Pio::<u16>::new(port).write(val); } @@ -202,7 +197,7 @@ pub static SDT_ORDER: RwLock<Option<Vec<SdtSignature>>> = RwLock::new(None); pub fn find_sdt(name: &str) -> Vec<&'static Sdt> { let mut sdts: Vec<&'static Sdt> = vec!(); - + if let Some(ref ptrs) = *(SDT_POINTERS.read()) { for (signature, sdt) in ptrs { if signature.0 == name { diff --git a/src/acpi/rsdp.rs b/src/acpi/rsdp.rs index 3e25ec05203cecd0f4e701a63797232b05eabcf8..9dfa5a937a0cf6a20b118c3cf713d59aee6c2571 100644 --- a/src/acpi/rsdp.rs +++ b/src/acpi/rsdp.rs @@ -1,4 +1,4 @@ -use memory::{allocate_frames, Frame}; +use memory::Frame; use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; /// RSDP @@ -18,10 +18,10 @@ pub struct RSDP { impl RSDP { /// Search for the RSDP - pub fn get_rsdp(active_table: &mut ActivePageTable) -> Option<RSDP> { + pub fn get_rsdp(active_table: &mut ActivePageTable) -> Option<RSDP> { let start_addr = 0xE0000; let end_addr = 0xFFFFF; - + // Map all of the ACPI RSDP space { let start_frame = Frame::containing_address(PhysicalAddress::new(start_addr)); @@ -35,7 +35,7 @@ impl RSDP { RSDP::search(start_addr, end_addr) } - + fn search(start_addr: usize, end_addr: usize) -> Option<RSDP> { for i in 0 .. (end_addr + 1 - start_addr)/16 { let rsdp = unsafe { &*((start_addr + i * 16) as *const RSDP) }; diff --git a/src/acpi/rxsdt.rs b/src/acpi/rxsdt.rs index 8c7278be60204f4ce13201b88abf2aa64278a639..9356b509ba6d327a1696c44d253a530118cffe31 100644 --- a/src/acpi/rxsdt.rs +++ b/src/acpi/rxsdt.rs @@ -13,11 +13,11 @@ pub trait Rxsdt { get_sdt(sdt, active_table); } } - + fn find(&self, signature: [u8; 4], oem_id: [u8; 6], oem_table_id: [u8; 8]) -> Option<&'static Sdt> { for sdt in self.iter() { let sdt = unsafe { &*(sdt as *const Sdt) }; - + if sdt.match_pattern(signature, oem_id, oem_table_id) { return Some(sdt); } diff --git a/src/acpi/sdt.rs b/src/acpi/sdt.rs index 67dee89ba26e989a64eaf80cb4758c4c3c4db488..ea856272f746f96e4022a834f9cc2f5d1c745177 100644 --- a/src/acpi/sdt.rs +++ b/src/acpi/sdt.rs @@ -35,7 +35,7 @@ impl Sdt { pub fn data(&self) -> &[u8] { unsafe { slice::from_raw_parts(self.data_address() as *const u8, self.data_len()) } } - + pub fn match_pattern(&self, signature: [u8; 4], oem_id: [u8; 6], oem_table_id: [u8; 8]) -> bool{ self.signature == signature && self.oem_id == oem_id && self.oem_table_id == oem_table_id } diff --git a/src/arch/x86_64/interrupt/exception.rs b/src/arch/x86_64/interrupt/exception.rs index 3822779acc5aa692ead9a489da967e2f9fe94e7c..257108ad7662de611edcd96a41ba0373b9e0bcfe 100644 --- a/src/arch/x86_64/interrupt/exception.rs +++ b/src/arch/x86_64/interrupt/exception.rs @@ -5,119 +5,140 @@ extern { fn ksignal(signal: usize); } -interrupt_stack!(divide_by_zero, stack, { - println!("Divide by zero fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(divide_by_zero, stack, { + println!("Divide by zero"); + stack.dump(); stack_trace(); ksignal(SIGFPE); }); interrupt_stack!(debug, stack, { - println!("Debug trap at {:>02X}:{:>016X}", stack.cs, stack.rip); + println!("Debug trap"); + stack.dump(); ksignal(SIGTRAP); }); interrupt_stack!(non_maskable, stack, { - println!("Non-maskable interrupt at {:>02X}:{:>016X}", stack.cs, stack.rip); + println!("Non-maskable interrupt"); + stack.dump(); }); interrupt_stack!(breakpoint, stack, { - println!("Breakpoint trap at {:>02X}:{:>016X}", stack.cs, stack.rip); + println!("Breakpoint trap"); + stack.dump(); ksignal(SIGTRAP); }); -interrupt_stack!(overflow, stack, { - println!("Overflow trap at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(overflow, stack, { + println!("Overflow trap"); + stack.dump(); + stack_trace(); ksignal(SIGFPE); }); -interrupt_stack!(bound_range, stack, { - println!("Bound range exceeded fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(bound_range, stack, { + println!("Bound range exceeded fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_stack!(invalid_opcode, stack, { - println!("Invalid opcode fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(invalid_opcode, stack, { + println!("Invalid opcode fault"); + stack.dump(); stack_trace(); ksignal(SIGILL); }); -interrupt_stack!(device_not_available, stack, { - println!("Device not available fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(device_not_available, stack, { + println!("Device not available fault"); + stack.dump(); stack_trace(); ksignal(SIGILL); }); -interrupt_error!(double_fault, stack, { - println!("Double fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(double_fault, stack, { + println!("Double fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_error!(invalid_tss, stack, { - println!("Invalid TSS fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(invalid_tss, stack, { + println!("Invalid TSS fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_error!(segment_not_present, stack, { - println!("Segment not present fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(segment_not_present, stack, { + println!("Segment not present fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_error!(stack_segment, stack, { - println!("Stack segment fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(stack_segment, stack, { + println!("Stack segment fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_error!(protection, stack, { - println!("Protection fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(protection, stack, { + println!("Protection fault"); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_error!(page, stack, { +interrupt_error_p!(page, stack, { let cr2: usize; asm!("mov rax, cr2" : "={rax}"(cr2) : : : "intel", "volatile"); - println!("Page fault: {:>02X}:{:>016X} at {:>02X}:{:>016X}", stack.code, cr2, stack.cs, stack.rip); + println!("Page fault: {:>016X}", cr2); + stack.dump(); stack_trace(); ksignal(SIGSEGV); }); -interrupt_stack!(fpu, stack, { - println!("FPU floating point fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(fpu, stack, { + println!("FPU floating point fault"); + stack.dump(); stack_trace(); ksignal(SIGFPE); }); -interrupt_error!(alignment_check, stack, { - println!("Alignment check fault: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(alignment_check, stack, { + println!("Alignment check fault"); + stack.dump(); stack_trace(); ksignal(SIGBUS); }); -interrupt_stack!(machine_check, stack, { - println!("Machine check fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(machine_check, stack, { + println!("Machine check fault"); + stack.dump(); stack_trace(); ksignal(SIGBUS); }); -interrupt_stack!(simd, stack, { - println!("SIMD floating point fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(simd, stack, { + println!("SIMD floating point fault"); + stack.dump(); stack_trace(); ksignal(SIGFPE); }); -interrupt_stack!(virtualization, stack, { - println!("Virtualization fault at {:>02X}:{:>016X}", stack.cs, stack.rip); +interrupt_stack_p!(virtualization, stack, { + println!("Virtualization fault"); + stack.dump(); stack_trace(); ksignal(SIGBUS); }); -interrupt_error!(security, stack, { - println!("Security exception: {:X} at {:>02X}:{:>016X}", stack.code, stack.cs, stack.rip); +interrupt_error_p!(security, stack, { + println!("Security exception"); + stack.dump(); stack_trace(); ksignal(SIGBUS); }); diff --git a/src/arch/x86_64/interrupt/trace.rs b/src/arch/x86_64/interrupt/trace.rs index a2997ada6180d9ffa46ea3e719e22d43365e0c63..c13aa5dc723334f2c29d74ebad7aac8ee5aef3d0 100644 --- a/src/arch/x86_64/interrupt/trace.rs +++ b/src/arch/x86_64/interrupt/trace.rs @@ -1,4 +1,4 @@ -use core::{mem, str}; +use core::mem; use goblin::elf::sym; use paging::{ActivePageTable, VirtualAddress}; diff --git a/src/arch/x86_64/macros.rs b/src/arch/x86_64/macros.rs index ff4f79cdd7bafce44bf66f53a6c0b453b911c9a0..4fa7fe45a375ab1f9fd5e334ea2f57c45a1814a7 100644 --- a/src/arch/x86_64/macros.rs +++ b/src/arch/x86_64/macros.rs @@ -15,6 +15,149 @@ macro_rules! println { ($fmt:expr, $($arg:tt)*) => (print!(concat!($fmt, "\n"), $($arg)*)); } +#[allow(dead_code)] +#[repr(packed)] +pub struct ScratchRegisters { + pub r11: usize, + pub r10: usize, + pub r9: usize, + pub r8: usize, + pub rsi: usize, + pub rdi: usize, + pub rdx: usize, + pub rcx: usize, + pub rax: usize, +} + +impl ScratchRegisters { + pub fn dump(&self) { + println!("RAX: {:>016X}", self.rax); + println!("RCX: {:>016X}", self.rcx); + println!("RDX: {:>016X}", self.rdx); + println!("RDI: {:>016X}", self.rdi); + println!("RSI: {:>016X}", self.rsi); + println!("R8: {:>016X}", self.r8); + println!("R9: {:>016X}", self.r9); + println!("R10: {:>016X}", self.r10); + println!("R11: {:>016X}", self.r11); + } +} + +macro_rules! scratch_push { + () => (asm!( + "push rax + push rcx + push rdx + push rdi + push rsi + push r8 + push r9 + push r10 + push r11" + : : : : "intel", "volatile" + )); +} + +macro_rules! scratch_pop { + () => (asm!( + "pop r11 + pop r10 + pop r9 + pop r8 + pop rsi + pop rdi + pop rdx + pop rcx + pop rax" + : : : : "intel", "volatile" + )); +} + +#[allow(dead_code)] +#[repr(packed)] +pub struct PreservedRegisters { + pub r15: usize, + pub r14: usize, + pub r13: usize, + pub r12: usize, + pub rbp: usize, + pub rbx: usize, +} + +impl PreservedRegisters { + pub fn dump(&self) { + println!("RBX: {:>016X}", self.rbx); + println!("RBP: {:>016X}", self.rbp); + println!("R12: {:>016X}", self.r12); + println!("R13: {:>016X}", self.r13); + println!("R14: {:>016X}", self.r14); + println!("R15: {:>016X}", self.r15); + } +} + +macro_rules! preserved_push { + () => (asm!( + "push rbx + push rbp + push r12 + push r13 + push r14 + push r15" + : : : : "intel", "volatile" + )); +} + +macro_rules! preserved_pop { + () => (asm!( + "pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx" + : : : : "intel", "volatile" + )); +} + +macro_rules! fs_push { + () => (asm!( + "push fs + mov rax, 0x18 + mov fs, ax" + : : : : "intel", "volatile" + )); +} + +macro_rules! fs_pop { + () => (asm!( + "pop fs" + : : : : "intel", "volatile" + )); +} + +#[allow(dead_code)] +#[repr(packed)] +pub struct IretRegisters { + pub rip: usize, + pub cs: usize, + pub rflags: usize, +} + +impl IretRegisters { + pub fn dump(&self) { + println!("RFLAG: {:>016X}", self.rflags); + println!("CS: {:>016X}", self.cs); + println!("RIP: {:>016X}", self.rip); + } +} + +macro_rules! iret { + () => (asm!( + "iretq" + : : : : "intel", "volatile" + )); +} + /// Create an interrupt function that can safely run rust code #[macro_export] macro_rules! interrupt { @@ -27,36 +170,16 @@ macro_rules! interrupt { } // Push scratch registers - asm!("push rax - push rcx - push rdx - push rdi - push rsi - push r8 - push r9 - push r10 - push r11 - push fs - mov rax, 0x18 - mov fs, ax" - : : : : "intel", "volatile"); + scratch_push!(); + fs_push!(); // Call inner rust function inner(); // Pop scratch registers and return - asm!("pop fs - pop r11 - pop r10 - pop r9 - pop r8 - pop rsi - pop rdi - pop rdx - pop rcx - pop rax - iretq" - : : : : "intel", "volatile"); + fs_pop!(); + scratch_pop!(); + iret!(); } }; } @@ -65,18 +188,16 @@ macro_rules! interrupt { #[repr(packed)] pub struct InterruptStack { pub fs: usize, - pub r11: usize, - pub r10: usize, - pub r9: usize, - pub r8: usize, - pub rsi: usize, - pub rdi: usize, - pub rdx: usize, - pub rcx: usize, - pub rax: usize, - pub rip: usize, - pub cs: usize, - pub rflags: usize, + pub scratch: ScratchRegisters, + pub iret: IretRegisters, +} + +impl InterruptStack { + pub fn dump(&self) { + self.iret.dump(); + self.scratch.dump(); + println!("FS: {:>016X}", self.fs); + } } #[macro_export] @@ -90,19 +211,8 @@ macro_rules! interrupt_stack { } // Push scratch registers - asm!("push rax - push rcx - push rdx - push rdi - push rsi - push r8 - push r9 - push r10 - push r11 - push fs - mov rax, 0x18 - mov fs, ax" - : : : : "intel", "volatile"); + scratch_push!(); + fs_push!(); // Get reference to stack variables let rsp: usize; @@ -112,18 +222,9 @@ macro_rules! interrupt_stack { inner(&mut *(rsp as *mut $crate::arch::x86_64::macros::InterruptStack)); // Pop scratch registers and return - asm!("pop fs - pop r11 - pop r10 - pop r9 - pop r8 - pop rsi - pop rdi - pop rdx - pop rcx - pop rax - iretq" - : : : : "intel", "volatile"); + fs_pop!(); + scratch_pop!(); + iret!(); } }; } @@ -132,19 +233,18 @@ macro_rules! interrupt_stack { #[repr(packed)] pub struct InterruptErrorStack { pub fs: usize, - pub r11: usize, - pub r10: usize, - pub r9: usize, - pub r8: usize, - pub rsi: usize, - pub rdi: usize, - pub rdx: usize, - pub rcx: usize, - pub rax: usize, + pub scratch: ScratchRegisters, pub code: usize, - pub rip: usize, - pub cs: usize, - pub rflags: usize, + pub iret: IretRegisters, +} + +impl InterruptErrorStack { + pub fn dump(&self) { + self.iret.dump(); + println!("CODE: {:>016X}", self.code); + self.scratch.dump(); + println!("FS: {:>016X}", self.fs); + } } #[macro_export] @@ -158,19 +258,8 @@ macro_rules! interrupt_error { } // Push scratch registers - asm!("push rax - push rcx - push rdx - push rdi - push rsi - push r8 - push r9 - push r10 - push r11 - push fs - mov rax, 0x18 - mov fs, ax" - : : : : "intel", "volatile"); + scratch_push!(); + fs_push!(); // Get reference to stack variables let rsp: usize; @@ -180,19 +269,111 @@ macro_rules! interrupt_error { inner(&*(rsp as *const $crate::arch::x86_64::macros::InterruptErrorStack)); // Pop scratch registers, error code, and return - asm!("pop fs - pop r11 - pop r10 - pop r9 - pop r8 - pop rsi - pop rdi - pop rdx - pop rcx - pop rax - add rsp, 8 - iretq" - : : : : "intel", "volatile"); + fs_pop!(); + scratch_pop!(); + asm!("add rsp, 8" : : : : "intel", "volatile"); + iret!(); + } + }; +} + +#[allow(dead_code)] +#[repr(packed)] +pub struct InterruptStackP { + pub fs: usize, + pub preserved: PreservedRegisters, + pub scratch: ScratchRegisters, + pub iret: IretRegisters, +} + +impl InterruptStackP { + pub fn dump(&self) { + self.iret.dump(); + self.scratch.dump(); + self.preserved.dump(); + println!("FS: {:>016X}", self.fs); + } +} + +#[macro_export] +macro_rules! interrupt_stack_p { + ($name:ident, $stack: ident, $func:block) => { + #[naked] + pub unsafe extern fn $name () { + #[inline(never)] + unsafe fn inner($stack: &mut $crate::arch::x86_64::macros::InterruptStackP) { + $func + } + + // Push scratch registers + scratch_push!(); + preserved_push!(); + fs_push!(); + + // Get reference to stack variables + let rsp: usize; + asm!("" : "={rsp}"(rsp) : : : "intel", "volatile"); + + // Call inner rust function + inner(&mut *(rsp as *mut $crate::arch::x86_64::macros::InterruptStackP)); + + // Pop scratch registers and return + fs_pop!(); + preserved_pop!(); + scratch_pop!(); + iret!(); + } + }; +} + +#[allow(dead_code)] +#[repr(packed)] +pub struct InterruptErrorStackP { + pub fs: usize, + pub preserved: PreservedRegisters, + pub scratch: ScratchRegisters, + pub code: usize, + pub iret: IretRegisters, +} + +impl InterruptErrorStackP { + pub fn dump(&self) { + self.iret.dump(); + println!("CODE: {:>016X}", self.code); + self.scratch.dump(); + self.preserved.dump(); + println!("FS: {:>016X}", self.fs); + } +} + +#[macro_export] +macro_rules! interrupt_error_p { + ($name:ident, $stack:ident, $func:block) => { + #[naked] + pub unsafe extern fn $name () { + #[inline(never)] + unsafe fn inner($stack: &$crate::arch::x86_64::macros::InterruptErrorStackP) { + $func + } + + // Push scratch registers + scratch_push!(); + preserved_push!(); + fs_push!(); + + // Get reference to stack variables + let rsp: usize; + asm!("" : "={rsp}"(rsp) : : : "intel", "volatile"); + + // Call inner rust function + inner(&*(rsp as *const $crate::arch::x86_64::macros::InterruptErrorStackP)); + + // Pop scratch registers, error code, and return + fs_pop!(); + preserved_pop!(); + scratch_pop!(); + asm!("add rsp, 8" : : : : "intel", "volatile"); + iret!(); } }; } diff --git a/src/arch/x86_64/paging/mapper.rs b/src/arch/x86_64/paging/mapper.rs index a815c16e97273e24d79842203454272af26b4af8..610683c9f14ff1fd2ba86d1f7188686524108477 100644 --- a/src/arch/x86_64/paging/mapper.rs +++ b/src/arch/x86_64/paging/mapper.rs @@ -98,9 +98,9 @@ impl Mapper { /// Map a page to a frame pub fn map_to(&mut self, page: Page, frame: Frame, flags: EntryFlags) -> MapperFlush { - let mut p3 = self.p4_mut().next_table_create(page.p4_index()); - let mut p2 = p3.next_table_create(page.p3_index()); - let mut p1 = p2.next_table_create(page.p2_index()); + let p3 = self.p4_mut().next_table_create(page.p4_index()); + let p2 = p3.next_table_create(page.p3_index()); + let p1 = p2.next_table_create(page.p2_index()); assert!(p1[page.p1_index()].is_unused(), "{:X}: Set to {:X}: {:?}, requesting {:X}: {:?}", @@ -119,9 +119,9 @@ impl Mapper { /// Update flags for a page pub fn remap(&mut self, page: Page, flags: EntryFlags) -> MapperFlush { - let mut p3 = self.p4_mut().next_table_mut(page.p4_index()).expect("failed to remap: no p3"); - let mut p2 = p3.next_table_mut(page.p3_index()).expect("failed to remap: no p2"); - let mut p1 = p2.next_table_mut(page.p2_index()).expect("failed to remap: no p1"); + let p3 = self.p4_mut().next_table_mut(page.p4_index()).expect("failed to remap: no p3"); + let p2 = p3.next_table_mut(page.p3_index()).expect("failed to remap: no p2"); + let p1 = p2.next_table_mut(page.p2_index()).expect("failed to remap: no p1"); let frame = p1[page.p1_index()].pointed_frame().expect("failed to remap: not mapped"); p1[page.p1_index()].set(frame, flags | entry::PRESENT); MapperFlush::new(page) diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs index d2995e654edfb5b838cbc1802c78682f7f02792c..7f1952bc78f005ebad953f2ce822fd287bdadcc1 100644 --- a/src/arch/x86_64/start.rs +++ b/src/arch/x86_64/start.rs @@ -15,8 +15,6 @@ use memory; use paging::{self, entry, Page, VirtualAddress}; use paging::mapper::MapperFlushAll; -use stop; - /// Test of zero values in BSS. static BSS_TEST_ZERO: usize = 0; /// Test of non-zero values in data. diff --git a/src/context/context.rs b/src/context/context.rs index 1cf5a900f8aa502d34a06e70f397995b1d7557ba..3eda179e49114288cf0b3151a4fd3ee278cea986 100644 --- a/src/context/context.rs +++ b/src/context/context.rs @@ -251,7 +251,7 @@ impl Context { /// Return the file descriptor number or None if no slot was found pub fn add_file_min(&self, file: FileDescriptor, min: usize) -> Option<FileHandle> { let mut files = self.files.lock(); - for (i, mut file_option) in files.iter_mut().enumerate() { + for (i, file_option) in files.iter_mut().enumerate() { if file_option.is_none() && i >= min { *file_option = Some(file); return Some(FileHandle::from(i)); diff --git a/src/context/file.rs b/src/context/file.rs index a5fd27724a20259060c0c31ee9288453cca653fa..9c19323e3eba7c47f458c5cec033263758a7404f 100644 --- a/src/context/file.rs +++ b/src/context/file.rs @@ -3,7 +3,6 @@ use alloc::arc::Arc; use spin::RwLock; use scheme::{self, SchemeId}; -use core::mem; use syscall::error::{Result, Error, EBADF}; use scheme::FileHandle; use context; diff --git a/src/elf.rs b/src/elf.rs index 240cf56e1fbe3abfa8f46eb58d9ea880bc180243..ac5cb774b3f0ba8e46b38c392219d051fe732ef0 100644 --- a/src/elf.rs +++ b/src/elf.rs @@ -2,8 +2,6 @@ use collections::String; -use core::str; - use goblin::elf::section_header::SHT_SYMTAB; #[cfg(target_arch = "x86")] diff --git a/src/memory/mod.rs b/src/memory/mod.rs index fb4275bdb45401622dd3d85c48a62e0aac0c272a..6ab6f0fb07928b9a0799d3dbdba2aef5d90e2718 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -72,7 +72,7 @@ static ALLOCATOR: Mutex<Option<RecycleAllocator<BumpAllocator>>> = Mutex::new(No /// Must be called once, and only once, pub unsafe fn init(kernel_start: usize, kernel_end: usize) { // Copy memory map from bootloader location - for (i, mut entry) in MEMORY_MAP.iter_mut().enumerate() { + for (i, entry) in MEMORY_MAP.iter_mut().enumerate() { *entry = *(0x500 as *const MemoryArea).offset(i as isize); if entry._type != MEMORY_AREA_NULL { println!("{:?}", entry); diff --git a/src/memory/recycle.rs b/src/memory/recycle.rs index 09325812cacdc58f69dc078d2ccd57b6cfac0b43..aa62350a23a064e33c71e5f4428c77fc75881973 100644 --- a/src/memory/recycle.rs +++ b/src/memory/recycle.rs @@ -33,7 +33,7 @@ impl<T: FrameAllocator> RecycleAllocator<T> { fn merge(&mut self, address: usize, count: usize) -> bool { for i in 0 .. self.free.len() { let changed = { - let mut free = &mut self.free[i]; + let free = &mut self.free[i]; if address + count * 4096 == free.0 { free.0 = address; free.1 += count; diff --git a/src/scheme/env.rs b/src/scheme/env.rs index 0f31b8e5314cf5bc403ac11db65be3b372da2bba..b846c44514e93ceba14ed8fbc24ffbd493c02d09 100644 --- a/src/scheme/env.rs +++ b/src/scheme/env.rs @@ -109,7 +109,7 @@ impl Scheme for EnvScheme { fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let data = handle.data.lock(); @@ -125,7 +125,7 @@ impl Scheme for EnvScheme { fn write(&self, id: usize, buffer: &[u8]) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let mut data = handle.data.lock(); @@ -147,7 +147,7 @@ impl Scheme for EnvScheme { fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let len = handle.data.lock().len(); handle.seek = match whence { diff --git a/src/scheme/initfs.rs b/src/scheme/initfs.rs index ff8ee9ed795375a5327f2e9ac1823c038e193ec5..cfae5de47ce3522341b52bc72369eaab10de32c0 100644 --- a/src/scheme/initfs.rs +++ b/src/scheme/initfs.rs @@ -90,7 +90,7 @@ impl Scheme for InitFsScheme { fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let mut i = 0; while i < buffer.len() && handle.seek < handle.data.len() { @@ -104,7 +104,7 @@ impl Scheme for InitFsScheme { fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; handle.seek = match whence { SEEK_SET => cmp::min(handle.data.len(), pos), diff --git a/src/scheme/sys/mod.rs b/src/scheme/sys/mod.rs index bcc5097d0604daac0090723164710a097cfdbcbc..22426f4498429eb7eae3e7ae08b346efb71fcbf8 100644 --- a/src/scheme/sys/mod.rs +++ b/src/scheme/sys/mod.rs @@ -124,7 +124,7 @@ impl Scheme for SysScheme { fn read(&self, id: usize, buffer: &mut [u8]) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; let mut i = 0; while i < buffer.len() && handle.seek < handle.data.len() { @@ -138,7 +138,7 @@ impl Scheme for SysScheme { fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> { let mut handles = self.handles.write(); - let mut handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; + let handle = handles.get_mut(&id).ok_or(Error::new(EBADF))?; handle.seek = match whence { SEEK_SET => cmp::min(handle.data.len(), pos), diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 2d265c05f77b39a149bb4bc58b409314263570c7..c9125c3e1db9a39a620207623743cf4f7e363c49 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -282,7 +282,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { // If not cloning files, dup to get a new number from scheme // This has to be done outside the context lock to prevent deadlocks if flags & CLONE_FILES == 0 { - for (_fd, mut file_option) in files.lock().iter_mut().enumerate() { + for (_fd, file_option) in files.lock().iter_mut().enumerate() { let new_file_option = if let Some(ref file) = *file_option { Some(FileDescriptor { description: Arc::clone(&file.description), @@ -402,9 +402,9 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { // Copy percpu mapping for cpu_id in 0..::cpu_count() { extern { - /// The starting byte of the thread data segment + // The starting byte of the thread data segment static mut __tdata_start: u8; - /// The ending byte of the thread BSS segment + // The ending byte of the thread BSS segment static mut __tbss_end: u8; } @@ -840,20 +840,20 @@ pub fn exit(status: usize) -> ! { context.id }; - /// Files must be closed while context is valid so that messages can be passed + // Files must be closed while context is valid so that messages can be passed for (fd, file_option) in close_files.drain(..).enumerate() { if let Some(file) = file_option { let _ = file.close(FileHandle::from(fd)); } } - /// PPID must be grabbed after close, as context switches could change PPID if parent exits + // PPID must be grabbed after close, as context switches could change PPID if parent exits let ppid = { let context = context_lock.read(); context.ppid }; - /// Transfer child processes to parent + // Transfer child processes to parent { let contexts = context::contexts(); for (_id, context_lock) in contexts.iter() { diff --git a/src/syscall/time.rs b/src/syscall/time.rs index bfe82ba9419949ff1d7aca824b9b58d7b7a32232..d4adaf23fd259b0152d431e99561ca19a415b6c6 100644 --- a/src/syscall/time.rs +++ b/src/syscall/time.rs @@ -32,7 +32,7 @@ pub fn nanosleep(req: &TimeSpec, rem_opt: Option<&mut TimeSpec>) -> Result<usize unsafe { context::switch(); } - if let Some(mut rem) = rem_opt { + if let Some(rem) = rem_opt { //TODO let current = time::monotonic(); rem.tv_sec = 0; rem.tv_nsec = 0;