|
|
@ -1,5 +1,5 @@
|
|
|
|
use aya::{
|
|
|
|
use aya::{
|
|
|
|
include_bytes_aligned, maps::AsyncPerfEventArray, programs::UProbe, util::online_cpus, Bpf,
|
|
|
|
include_bytes_aligned, maps::{AsyncPerfEventArray, HashMap}, programs::UProbe, util::online_cpus, Bpf,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
use aya_log::BpfLogger;
|
|
|
|
use aya_log::BpfLogger;
|
|
|
|
use bytes::BytesMut;
|
|
|
|
use bytes::BytesMut;
|
|
|
@ -29,7 +29,7 @@ pub extern "C" fn trigger_stack_argument(
|
|
|
|
a_3: u64,
|
|
|
|
a_3: u64,
|
|
|
|
a_4: u64,
|
|
|
|
a_4: u64,
|
|
|
|
a_5: u64,
|
|
|
|
a_5: u64,
|
|
|
|
//from arg6, stack_argument would be used
|
|
|
|
//in x86_64, from arg6, stack_argument would be used
|
|
|
|
a_6: u64,
|
|
|
|
a_6: u64,
|
|
|
|
a_7: i64,
|
|
|
|
a_7: i64,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
@ -40,9 +40,6 @@ async fn stack_argument() {
|
|
|
|
event_logger::init();
|
|
|
|
event_logger::init();
|
|
|
|
let mut bpf = Bpf::load(crate::STACK_ARGUMENT).unwrap();
|
|
|
|
let mut bpf = Bpf::load(crate::STACK_ARGUMENT).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
if let Err(e) = BpfLogger::init(&mut bpf) {
|
|
|
|
|
|
|
|
warn!("failed to initialize eBPF logger: {}", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
let prog: &mut UProbe = bpf
|
|
|
|
let prog: &mut UProbe = bpf
|
|
|
|
.program_mut("test_stack_argument")
|
|
|
|
.program_mut("test_stack_argument")
|
|
|
|
.unwrap()
|
|
|
|
.unwrap()
|
|
|
@ -51,34 +48,13 @@ async fn stack_argument() {
|
|
|
|
prog.load().unwrap();
|
|
|
|
prog.load().unwrap();
|
|
|
|
prog.attach(Some("trigger_stack_argument"), 0, "/proc/self/exe", None)
|
|
|
|
prog.attach(Some("trigger_stack_argument"), 0, "/proc/self/exe", None)
|
|
|
|
.unwrap();
|
|
|
|
.unwrap();
|
|
|
|
let mut perf_array = AsyncPerfEventArray::try_from(bpf.take_map("EVENTS").unwrap())?;
|
|
|
|
let mut args_map = HashMap::try_from(bpf.take_map("ARGS").unwrap())?;
|
|
|
|
for cpu_id in online_cpus()? {
|
|
|
|
trigger_stack_argument(0, 1, 2, 3, 4, 5, 6, 7);
|
|
|
|
let mut buf = perf_array.open(cpu_id, None)?;
|
|
|
|
|
|
|
|
perf_buffers.push(perf_array.open(cpu_id, None)?);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
task::spawn(async move {
|
|
|
|
|
|
|
|
let mut buffers = (0..10)
|
|
|
|
|
|
|
|
.map(|_| BytesMut::with_capacity(1024))
|
|
|
|
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loop {
|
|
|
|
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
|
|
|
|
let events = buf.read_events(&mut buffers).await.unwrap();
|
|
|
|
assert_eq!(args_map.keys().count(), 8);
|
|
|
|
for buf in buffers.iter_mut().take(events.read) {
|
|
|
|
for iter in args_map.iter(){
|
|
|
|
let ptr = buf.as_ptr() as *const Args;
|
|
|
|
let iter_v = iter.unwrap();
|
|
|
|
let data = unsafe { ptr.read_unaligned() };
|
|
|
|
assert_eq!(iter_v.0, iter_v.1);
|
|
|
|
assert_eq!(data.a_0, 0);
|
|
|
|
|
|
|
|
assert_eq!(data.a_1, 1);
|
|
|
|
|
|
|
|
assert_eq!(data.a_2, 2);
|
|
|
|
|
|
|
|
assert_eq!(data.a_3, 3);
|
|
|
|
|
|
|
|
assert_eq!(data.a_4, 4);
|
|
|
|
|
|
|
|
assert_eq!(data.a_5, 5);
|
|
|
|
|
|
|
|
assert_eq!(data.a_6, 6);
|
|
|
|
|
|
|
|
assert_eq!(data.a_7, 7);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
trigger_stack_argument(0, 1, 2, 3, 4, 5, 6, 7);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|