diff --git a/aya/include/linux_wrapper.h b/aya/include/linux_wrapper.h index f4127139..ad38547c 100644 --- a/aya/include/linux_wrapper.h +++ b/aya/include/linux_wrapper.h @@ -4,3 +4,8 @@ #include #include #include + +/* workaround the fact that bindgen can't parse the IOC macros */ +int AYA_PERF_EVENT_IOC_ENABLE = PERF_EVENT_IOC_ENABLE; +int AYA_PERF_EVENT_IOC_DISABLE = PERF_EVENT_IOC_DISABLE; +int AYA_PERF_EVENT_IOC_SET_BPF = PERF_EVENT_IOC_SET_BPF; \ No newline at end of file diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 949f2133..4485d988 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -2,13 +2,17 @@ use std::{ collections::HashMap, error::Error, fs, io, + os::raw::c_int, path::{Path, PathBuf}, }; use thiserror::Error; use crate::{ - generated::bpf_map_type::BPF_MAP_TYPE_PERF_EVENT_ARRAY, + generated::{ + bpf_map_type::BPF_MAP_TYPE_PERF_EVENT_ARRAY, AYA_PERF_EVENT_IOC_DISABLE, + AYA_PERF_EVENT_IOC_ENABLE, AYA_PERF_EVENT_IOC_SET_BPF, + }, maps::{Map, MapError, MapLock, MapRef, MapRefMut}, obj::{ btf::{Btf, BtfError}, @@ -24,10 +28,9 @@ use crate::{ pub(crate) const BPF_OBJ_NAME_LEN: usize = 16; -/* FIXME: these are arch dependent */ -pub(crate) const PERF_EVENT_IOC_ENABLE: libc::c_ulong = 9216; -pub(crate) const PERF_EVENT_IOC_DISABLE: libc::c_ulong = 9217; -pub(crate) const PERF_EVENT_IOC_SET_BPF: libc::c_ulong = 1074013192; +pub(crate) const PERF_EVENT_IOC_ENABLE: c_int = AYA_PERF_EVENT_IOC_ENABLE; +pub(crate) const PERF_EVENT_IOC_DISABLE: c_int = AYA_PERF_EVENT_IOC_DISABLE; +pub(crate) const PERF_EVENT_IOC_SET_BPF: c_int = AYA_PERF_EVENT_IOC_SET_BPF; pub unsafe trait Pod: Copy + 'static {} diff --git a/aya/src/generated/linux_bindings_aarch64.rs b/aya/src/generated/linux_bindings_aarch64.rs index 93dd109c..ecc46e26 100644 --- a/aya/src/generated/linux_bindings_aarch64.rs +++ b/aya/src/generated/linux_bindings_aarch64.rs @@ -1519,3 +1519,6 @@ pub struct ifinfomsg { pub ifi_flags: ::std::os::raw::c_uint, pub ifi_change: ::std::os::raw::c_uint, } +pub const AYA_PERF_EVENT_IOC_ENABLE: ::std::os::raw::c_int = 9216; +pub const AYA_PERF_EVENT_IOC_DISABLE: ::std::os::raw::c_int = 9217; +pub const AYA_PERF_EVENT_IOC_SET_BPF: ::std::os::raw::c_int = 1074013192; diff --git a/aya/src/generated/linux_bindings_x86_64.rs b/aya/src/generated/linux_bindings_x86_64.rs index 8e3c7f06..fc06f4e9 100644 --- a/aya/src/generated/linux_bindings_x86_64.rs +++ b/aya/src/generated/linux_bindings_x86_64.rs @@ -1518,3 +1518,6 @@ pub struct ifinfomsg { pub ifi_flags: ::std::os::raw::c_uint, pub ifi_change: ::std::os::raw::c_uint, } +pub const AYA_PERF_EVENT_IOC_ENABLE: ::std::os::raw::c_int = 9216; +pub const AYA_PERF_EVENT_IOC_DISABLE: ::std::os::raw::c_int = 9217; +pub const AYA_PERF_EVENT_IOC_SET_BPF: ::std::os::raw::c_int = 1074013192; diff --git a/aya/src/sys/mod.rs b/aya/src/sys/mod.rs index 9da2dc49..f525a3a1 100644 --- a/aya/src/sys/mod.rs +++ b/aya/src/sys/mod.rs @@ -36,7 +36,7 @@ pub(crate) enum Syscall<'a> { }, PerfEventIoctl { fd: c_int, - request: c_ulong, + request: c_int, arg: c_int, }, } diff --git a/aya/src/sys/perf_event.rs b/aya/src/sys/perf_event.rs index 536f8091..79a77284 100644 --- a/aya/src/sys/perf_event.rs +++ b/aya/src/sys/perf_event.rs @@ -79,7 +79,7 @@ pub(crate) fn perf_event_open_trace_point(id: u32) -> SysResult { }) } -pub(crate) fn perf_event_ioctl(fd: c_int, request: c_ulong, arg: c_int) -> SysResult { +pub(crate) fn perf_event_ioctl(fd: c_int, request: c_int, arg: c_int) -> SysResult { let call = Syscall::PerfEventIoctl { fd, request, arg }; #[cfg(not(test))] return syscall(call); diff --git a/xtask/src/codegen/aya.rs b/xtask/src/codegen/aya.rs index 678fd436..25817205 100644 --- a/xtask/src/codegen/aya.rs +++ b/xtask/src/codegen/aya.rs @@ -98,6 +98,8 @@ fn codegen_bindings(opts: &Options) -> Result<(), anyhow::Error> { // PERF "PERF_FLAG_.*", "PERF_EVENT_.*", + // see linux_wrapper.h, these are to workaround the IOC macros + "AYA_PERF_EVENT_.*", // NETLINK "NLMSG_ALIGNTO", "IFLA_XDP_FD",