btf_relocations.rs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. use test_case::test_case;
  2. use aya::{maps::Array, programs::UProbe, util::KernelVersion, BpfLoader, Btf, Endianness};
  3. #[test_case("field", false, None, 2)]
  4. #[test_case("field", true, None, 1)]
  5. #[test_case("enum_unsigned_32", false, None, 0xAAAAAAAA)]
  6. #[test_case("enum_unsigned_32", true, None, 0xBBBBBBBB)]
  7. #[test_case("pointer", false, None, 42)]
  8. #[test_case("pointer", true, None, 21)]
  9. #[test_case("struct_flavors", false, None, 1)]
  10. #[test_case("struct_flavors", true, None, 1)]
  11. #[test_case("enum_signed_32", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0x7AAAAAAAi32 as u64)]
  12. #[test_case("enum_signed_32", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0x7BBBBBBBi32 as u64)]
  13. #[test_case("enum_unsigned_64", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), 0xAAAAAAAABBBBBBBB)]
  14. #[test_case("enum_unsigned_64", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), 0xCCCCCCCCDDDDDDDD)]
  15. #[test_case("enum_signed_64", false, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0xAAAAAAABBBBBBBBi64 as u64)]
  16. #[test_case("enum_signed_64", true, Some((KernelVersion::new(6, 0, 0), "https://github.com/torvalds/linux/commit/6089fb3")), -0xCCCCCCCDDDDDDDDi64 as u64)]
  17. fn relocation_tests(
  18. program: &str,
  19. with_relocations: bool,
  20. required_kernel_version: Option<(KernelVersion, &str)>,
  21. expected: u64,
  22. ) {
  23. if let Some((required_kernel_version, commit)) = required_kernel_version {
  24. let current_kernel_version = KernelVersion::current().unwrap();
  25. if current_kernel_version < required_kernel_version {
  26. eprintln!("skipping test on kernel {current_kernel_version:?}, support for {program} was added in {required_kernel_version:?}; see {commit}");
  27. return;
  28. }
  29. }
  30. let mut bpf = BpfLoader::new()
  31. .btf(
  32. with_relocations
  33. .then(|| Btf::parse(crate::RELOC_BTF, Endianness::default()).unwrap())
  34. .as_ref(),
  35. )
  36. .load(crate::RELOC_BPF)
  37. .unwrap();
  38. let program: &mut UProbe = bpf.program_mut(program).unwrap().try_into().unwrap();
  39. program.load().unwrap();
  40. program
  41. .attach(
  42. Some("trigger_btf_relocations_program"),
  43. 0,
  44. "/proc/self/exe",
  45. None,
  46. )
  47. .unwrap();
  48. trigger_btf_relocations_program();
  49. let output_map: Array<_, u64> = bpf.take_map("output_map").unwrap().try_into().unwrap();
  50. let key = 0;
  51. assert_eq!(output_map.get(&key, 0).unwrap(), expected)
  52. }
  53. #[no_mangle]
  54. #[inline(never)]
  55. pub extern "C" fn trigger_btf_relocations_program() {
  56. core::hint::black_box(trigger_btf_relocations_program);
  57. }