mirror of https://github.com/aya-rs/aya
integration tests: add relocation tests
parent
b25a089819
commit
b2b9bd2edf
@ -0,0 +1,28 @@
|
|||||||
|
#include <linux/bpf.h>
|
||||||
|
#include <bpf/bpf_helpers.h>
|
||||||
|
|
||||||
|
char _license[] SEC("license") = "GPL";
|
||||||
|
|
||||||
|
struct {
|
||||||
|
__uint(type, BPF_MAP_TYPE_ARRAY);
|
||||||
|
__type(key, __u32);
|
||||||
|
__type(value, __u64);
|
||||||
|
__uint(max_entries, 2);
|
||||||
|
} RESULTS SEC(".maps");
|
||||||
|
|
||||||
|
static __u64
|
||||||
|
inc_cb(void *map, __u32 *key, void *val,
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
__u64 *value = val;
|
||||||
|
*value += 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEC("uprobe/test_text_64_64_reloc")
|
||||||
|
int test_text_64_64_reloc(struct pt_regs *ctx)
|
||||||
|
{
|
||||||
|
bpf_for_each_map_elem(&RESULTS, inc_cb, NULL, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
|||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::hint;
|
||||||
|
|
||||||
|
use aya_bpf::{
|
||||||
|
macros::{map, uprobe},
|
||||||
|
maps::Array,
|
||||||
|
programs::ProbeContext,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[map]
|
||||||
|
static mut RESULTS: Array<u64> = Array::with_max_entries(3, 0);
|
||||||
|
|
||||||
|
#[uprobe]
|
||||||
|
pub fn test_64_32_call_relocs(_ctx: ProbeContext) {
|
||||||
|
// this will link set_result and do a forward call
|
||||||
|
set_result(0, hint::black_box(1));
|
||||||
|
|
||||||
|
// set_result is already linked, this will just do the forward call
|
||||||
|
set_result(1, hint::black_box(2));
|
||||||
|
|
||||||
|
// this will link set_result_backward after set_result. Then will do a
|
||||||
|
// backward call to set_result.
|
||||||
|
set_result_backward(2, hint::black_box(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn set_result(index: u32, value: u64) {
|
||||||
|
unsafe {
|
||||||
|
if let Some(v) = RESULTS.get_ptr_mut(index) {
|
||||||
|
*v = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn set_result_backward(index: u32, value: u64) {
|
||||||
|
set_result(index, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(_info: &core::panic::PanicInfo) -> ! {
|
||||||
|
unsafe { core::hint::unreachable_unchecked() }
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
use std::{process::exit, time::Duration};
|
||||||
|
|
||||||
|
use aya::{
|
||||||
|
include_bytes_aligned,
|
||||||
|
programs::{ProgramError, UProbe},
|
||||||
|
Bpf,
|
||||||
|
};
|
||||||
|
use integration_test_macros::integration_test;
|
||||||
|
|
||||||
|
#[integration_test]
|
||||||
|
fn relocations() {
|
||||||
|
let bpf = load_and_attach(
|
||||||
|
"test_64_32_call_relocs",
|
||||||
|
include_bytes_aligned!("../../../../target/bpfel-unknown-none/release/relocations"),
|
||||||
|
);
|
||||||
|
|
||||||
|
trigger_relocations_program();
|
||||||
|
std::thread::sleep(Duration::from_millis(100));
|
||||||
|
|
||||||
|
let m = aya::maps::Array::<_, u64>::try_from(bpf.map("RESULTS").unwrap()).unwrap();
|
||||||
|
assert_eq!(m.get(&0, 0).unwrap(), 1);
|
||||||
|
assert_eq!(m.get(&1, 0).unwrap(), 2);
|
||||||
|
assert_eq!(m.get(&2, 0).unwrap(), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[integration_test]
|
||||||
|
fn text_64_64_reloc() {
|
||||||
|
let mut bpf = load_and_attach(
|
||||||
|
"test_text_64_64_reloc",
|
||||||
|
include_bytes_aligned!("../../../../target/bpfel-unknown-none/release/text_64_64_reloc.o"),
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut m = aya::maps::Array::<_, u64>::try_from(bpf.map_mut("RESULTS").unwrap()).unwrap();
|
||||||
|
m.set(0, 1, 0).unwrap();
|
||||||
|
m.set(1, 2, 0).unwrap();
|
||||||
|
|
||||||
|
trigger_relocations_program();
|
||||||
|
std::thread::sleep(Duration::from_millis(100));
|
||||||
|
|
||||||
|
assert_eq!(m.get(&0, 0).unwrap(), 2);
|
||||||
|
assert_eq!(m.get(&1, 0).unwrap(), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_and_attach(name: &str, bytes: &[u8]) -> Bpf {
|
||||||
|
let mut bpf = Bpf::load(bytes).unwrap();
|
||||||
|
|
||||||
|
let prog: &mut UProbe = bpf.program_mut(name).unwrap().try_into().unwrap();
|
||||||
|
if let Err(ProgramError::LoadError {
|
||||||
|
io_error,
|
||||||
|
verifier_log,
|
||||||
|
}) = prog.load()
|
||||||
|
{
|
||||||
|
println!("Failed to load program `{name}`: {io_error}. Verifier log:\n{verifier_log:#}");
|
||||||
|
exit(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
prog.attach(
|
||||||
|
Some("trigger_relocations_program"),
|
||||||
|
0,
|
||||||
|
"/proc/self/exe",
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
bpf
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
#[inline(never)]
|
||||||
|
pub extern "C" fn trigger_relocations_program() {}
|
Loading…
Reference in New Issue