Skip to content

Commit ca360cb

Browse files
rw-vancIsaacWoods
authored andcommitted
aml: add extra debug info on parsing error
1 parent dc11078 commit ca360cb

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

aml/src/lib.rs

+30-3
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ pub mod value;
6161

6262
pub use crate::{namespace::*, value::AmlValue};
6363

64-
use alloc::{boxed::Box, string::ToString};
64+
use alloc::{
65+
boxed::Box,
66+
format,
67+
string::{String, ToString},
68+
};
6569
use core::mem;
6670
use log::{error, warn};
6771
use misc::{ArgNum, LocalNum};
@@ -144,15 +148,38 @@ impl AmlContext {
144148
}
145149

146150
pub fn parse_table(&mut self, stream: &[u8]) -> Result<(), AmlError> {
151+
fn stream_context(stream: &[u8], err_buf: &[u8]) -> String {
152+
const BEFORE_LEN: usize = 4;
153+
const ABBREV_LEN: usize = 4;
154+
let abbreviated = if err_buf.len() >= ABBREV_LEN { &err_buf[..ABBREV_LEN] } else { err_buf };
155+
156+
if let Some(position) = (err_buf.as_ptr() as usize).checked_sub(stream.as_ptr() as usize) {
157+
if position <= stream.len() {
158+
let before = if position > BEFORE_LEN {
159+
&stream[position - BEFORE_LEN..position]
160+
} else {
161+
&stream[..position]
162+
};
163+
return format!(
164+
"position {:#X}: preceding {:X?}, buf {:X?}",
165+
position + 36,
166+
before,
167+
abbreviated
168+
);
169+
}
170+
}
171+
format!("buf {:X?}", abbreviated)
172+
}
173+
147174
if stream.len() == 0 {
148175
return Err(AmlError::UnexpectedEndOfStream);
149176
}
150177

151178
let table_length = PkgLength::from_raw_length(stream, stream.len() as u32).unwrap();
152179
match term_object::term_list(table_length).parse(stream, self) {
153180
Ok(_) => Ok(()),
154-
Err((_, _, Propagate::Err(err))) => {
155-
error!("Failed to parse AML stream. Err = {:?}", err);
181+
Err((err_buf, _, Propagate::Err(err))) => {
182+
error!("Failed to parse AML stream. Err = {:?}, {}", err, stream_context(stream, err_buf));
156183
Err(err)
157184
}
158185
Err((_, _, other)) => {

aml/src/test_utils.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,22 @@ impl Handler for TestHandler {
5050
unimplemented!()
5151
}
5252

53-
fn read_pci_u8(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16) -> u8 {
53+
fn read_pci_u8(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u8 {
5454
unimplemented!()
5555
}
56-
fn read_pci_u16(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16) -> u16 {
56+
fn read_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u16 {
5757
unimplemented!()
5858
}
59-
fn read_pci_u32(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16) -> u32 {
59+
fn read_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16) -> u32 {
6060
unimplemented!()
6161
}
62-
fn write_pci_u8(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16, _value: u8) {
62+
fn write_pci_u8(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u8) {
6363
unimplemented!()
6464
}
65-
fn write_pci_u16(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16, _value: u16) {
65+
fn write_pci_u16(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u16) {
6666
unimplemented!()
6767
}
68-
fn write_pci_u32(&self, _segment: u16, _bus: u8, device: u8, _function: u8, _offset: u16, _value: u32) {
68+
fn write_pci_u32(&self, _segment: u16, _bus: u8, _device: u8, _function: u8, _offset: u16, _value: u32) {
6969
unimplemented!()
7070
}
7171
fn stall(&self, _microseconds: u64) {

0 commit comments

Comments
 (0)