-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathprobe.rs
51 lines (41 loc) · 1.69 KB
/
probe.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use crate::Arguments;
use probe_rs::{config::TargetSelector, DebugProbeSelector, Permissions, Probe, Session};
use stackdump_capture_probe::StackdumpCapturer;
use stackdump_trace::{
platform::cortex_m::CortexMPlatform, stackdump_core::device_memory::DeviceMemory,
};
use std::{error::Error, path::Path, time::Duration};
pub(crate) fn trace_probe(
elf_file: &Path,
probe_selector: Option<DebugProbeSelector>,
target_selector: TargetSelector,
core: Option<usize>,
args: &Arguments,
) -> Result<(), Box<dyn Error>> {
let elf_data = std::fs::read(elf_file)?;
let mut session = match probe_selector {
Some(selector) => Probe::open(selector)?.attach(target_selector, Permissions::default())?,
None => Session::auto_attach(target_selector, Permissions::default())?,
};
let mut core = session.core(core.unwrap_or(0))?;
let core_type = core.core_type();
let fpu_supported = core.fpu_support()?;
core.halt(Duration::from_secs(2))?;
let mut stackcapturer = StackdumpCapturer::new(&mut core);
let mut device_memory = DeviceMemory::new();
device_memory.add_register_data(stackcapturer.capture_core_registers()?);
if fpu_supported {
if let Some(fpu_registers) = stackcapturer.capture_fpu_registers()? {
device_memory.add_register_data(fpu_registers);
}
}
device_memory.add_memory_region(stackcapturer);
if core_type.is_cortex_m() {
let frames = stackdump_trace::platform::trace::<CortexMPlatform>(device_memory, &elf_data)?;
crate::print_frames(frames, args);
} else {
unimplemented!("Other tracing than on cortex-m is not yet implemented");
}
core.run()?;
Ok(())
}