diff --git a/perf-event-open-sys/Cargo.toml b/perf-event-open-sys/Cargo.toml index 9aa48ae..4028667 100644 --- a/perf-event-open-sys/Cargo.toml +++ b/perf-event-open-sys/Cargo.toml @@ -8,7 +8,7 @@ types and constants. license = "MIT OR Apache-2.0" authors = ["Sean Lynch ", "Jim Blandy "] repository = "https://github.com/Phantomical/perf-event.git" -edition = "2018" +edition = "2024" readme = "README.md" documentation = "https://docs.rs/perf-event-open-sys2/" keywords = ["linux", "perf"] diff --git a/perf-event-open-sys/regenerate.sh b/perf-event-open-sys/regenerate.sh index b233143..15f235f 100755 --- a/perf-event-open-sys/regenerate.sh +++ b/perf-event-open-sys/regenerate.sh @@ -93,6 +93,7 @@ function gen_bindings { --impl-debug --with-derive-default --no-prepend-enum-name + --wrap-unsafe-ops ) bindgen "${BINDGEN_ARGS[@]}" \ diff --git a/perf-event-open-sys/src/bindings_aarch64.rs b/perf-event-open-sys/src/bindings_aarch64.rs index 6b2e9d7..9cd3852 100644 --- a/perf-event-open-sys/src/bindings_aarch64.rs +++ b/perf-event-open-sys/src/bindings_aarch64.rs @@ -21,7 +21,7 @@ #![allow(deref_nullptr)] // `bindgen_test_layout` tests use bogus code #![allow(clippy::all)] -/* automatically generated by rust-bindgen 0.69.4 */ +/* automatically generated by rust-bindgen 0.69.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] @@ -121,11 +121,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -1394,7 +1394,70 @@ impl Default for perf_event_attr { } impl ::std::fmt::Debug for perf_event_attr { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}" , self . type_ , self . size , self . config , self . __bindgen_anon_1 , self . sample_type , self . read_format , self . disabled () , self . inherit () , self . pinned () , self . exclusive () , self . exclude_user () , self . exclude_kernel () , self . exclude_hv () , self . exclude_idle () , self . mmap () , self . comm () , self . freq () , self . inherit_stat () , self . enable_on_exec () , self . task () , self . watermark () , self . precise_ip () , self . mmap_data () , self . sample_id_all () , self . exclude_host () , self . exclude_guest () , self . exclude_callchain_kernel () , self . exclude_callchain_user () , self . mmap2 () , self . comm_exec () , self . use_clockid () , self . context_switch () , self . write_backward () , self . namespaces () , self . ksymbol () , self . bpf_event () , self . aux_output () , self . cgroup () , self . text_poke () , self . build_id () , self . inherit_thread () , self . remove_on_exec () , self . sigtrap () , self . __reserved_1 () , self . __bindgen_anon_2 , self . bp_type , self . __bindgen_anon_3 , self . __bindgen_anon_4 , self . branch_sample_type , self . sample_regs_user , self . sample_stack_user , self . clockid , self . sample_regs_intr , self . aux_watermark , self . sample_max_stack , self . __reserved_2 , self . aux_sample_size , self . __reserved_3 , self . sig_data , self . config3) + write!( + f, + "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}", + self.type_, + self.size, + self.config, + self.__bindgen_anon_1, + self.sample_type, + self.read_format, + self.disabled(), + self.inherit(), + self.pinned(), + self.exclusive(), + self.exclude_user(), + self.exclude_kernel(), + self.exclude_hv(), + self.exclude_idle(), + self.mmap(), + self.comm(), + self.freq(), + self.inherit_stat(), + self.enable_on_exec(), + self.task(), + self.watermark(), + self.precise_ip(), + self.mmap_data(), + self.sample_id_all(), + self.exclude_host(), + self.exclude_guest(), + self.exclude_callchain_kernel(), + self.exclude_callchain_user(), + self.mmap2(), + self.comm_exec(), + self.use_clockid(), + self.context_switch(), + self.write_backward(), + self.namespaces(), + self.ksymbol(), + self.bpf_event(), + self.aux_output(), + self.cgroup(), + self.text_poke(), + self.build_id(), + self.inherit_thread(), + self.remove_on_exec(), + self.sigtrap(), + self.__reserved_1(), + self.__bindgen_anon_2, + self.bp_type, + self.__bindgen_anon_3, + self.__bindgen_anon_4, + self.branch_sample_type, + self.sample_regs_user, + self.sample_stack_user, + self.clockid, + self.sample_regs_intr, + self.aux_watermark, + self.sample_max_stack, + self.__reserved_2, + self.aux_sample_size, + self.__reserved_3, + self.sig_data, + self.config3 + ) } } impl perf_event_attr { @@ -2108,6 +2171,7 @@ pub union perf_event_mmap_page__bindgen_ty_1 { pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] +#[repr(align(8))] #[derive(Debug, Default, Copy, Clone)] #[non_exhaustive] pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { @@ -2574,7 +2638,36 @@ impl Default for perf_event_mmap_page { } impl ::std::fmt::Debug for perf_event_mmap_page { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}" , self . version , self . compat_version , self . lock , self . index , self . offset , self . time_enabled , self . time_running , self . __bindgen_anon_1 , self . pmc_width , self . time_shift , self . time_mult , self . time_offset , self . time_zero , self . size , self . __reserved_1 , self . time_cycles , self . time_mask , self . __reserved , self . data_head , self . data_tail , self . data_offset , self . data_size , self . aux_head , self . aux_tail , self . aux_offset , self . aux_size) + write!( + f, + "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}", + self.version, + self.compat_version, + self.lock, + self.index, + self.offset, + self.time_enabled, + self.time_running, + self.__bindgen_anon_1, + self.pmc_width, + self.time_shift, + self.time_mult, + self.time_offset, + self.time_zero, + self.size, + self.__reserved_1, + self.time_cycles, + self.time_mask, + self.__reserved, + self.data_head, + self.data_tail, + self.data_offset, + self.data_size, + self.aux_head, + self.aux_tail, + self.aux_offset, + self.aux_size + ) } } #[repr(C)] diff --git a/perf-event-open-sys/src/bindings_riscv64gc.rs b/perf-event-open-sys/src/bindings_riscv64gc.rs index 891c120..2ea47cd 100644 --- a/perf-event-open-sys/src/bindings_riscv64gc.rs +++ b/perf-event-open-sys/src/bindings_riscv64gc.rs @@ -21,7 +21,7 @@ #![allow(deref_nullptr)] // `bindgen_test_layout` tests use bogus code #![allow(clippy::all)] -/* automatically generated by rust-bindgen 0.69.4 */ +/* automatically generated by rust-bindgen 0.69.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] @@ -121,11 +121,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -1394,7 +1394,70 @@ impl Default for perf_event_attr { } impl ::std::fmt::Debug for perf_event_attr { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}" , self . type_ , self . size , self . config , self . __bindgen_anon_1 , self . sample_type , self . read_format , self . disabled () , self . inherit () , self . pinned () , self . exclusive () , self . exclude_user () , self . exclude_kernel () , self . exclude_hv () , self . exclude_idle () , self . mmap () , self . comm () , self . freq () , self . inherit_stat () , self . enable_on_exec () , self . task () , self . watermark () , self . precise_ip () , self . mmap_data () , self . sample_id_all () , self . exclude_host () , self . exclude_guest () , self . exclude_callchain_kernel () , self . exclude_callchain_user () , self . mmap2 () , self . comm_exec () , self . use_clockid () , self . context_switch () , self . write_backward () , self . namespaces () , self . ksymbol () , self . bpf_event () , self . aux_output () , self . cgroup () , self . text_poke () , self . build_id () , self . inherit_thread () , self . remove_on_exec () , self . sigtrap () , self . __reserved_1 () , self . __bindgen_anon_2 , self . bp_type , self . __bindgen_anon_3 , self . __bindgen_anon_4 , self . branch_sample_type , self . sample_regs_user , self . sample_stack_user , self . clockid , self . sample_regs_intr , self . aux_watermark , self . sample_max_stack , self . __reserved_2 , self . aux_sample_size , self . __reserved_3 , self . sig_data , self . config3) + write!( + f, + "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}", + self.type_, + self.size, + self.config, + self.__bindgen_anon_1, + self.sample_type, + self.read_format, + self.disabled(), + self.inherit(), + self.pinned(), + self.exclusive(), + self.exclude_user(), + self.exclude_kernel(), + self.exclude_hv(), + self.exclude_idle(), + self.mmap(), + self.comm(), + self.freq(), + self.inherit_stat(), + self.enable_on_exec(), + self.task(), + self.watermark(), + self.precise_ip(), + self.mmap_data(), + self.sample_id_all(), + self.exclude_host(), + self.exclude_guest(), + self.exclude_callchain_kernel(), + self.exclude_callchain_user(), + self.mmap2(), + self.comm_exec(), + self.use_clockid(), + self.context_switch(), + self.write_backward(), + self.namespaces(), + self.ksymbol(), + self.bpf_event(), + self.aux_output(), + self.cgroup(), + self.text_poke(), + self.build_id(), + self.inherit_thread(), + self.remove_on_exec(), + self.sigtrap(), + self.__reserved_1(), + self.__bindgen_anon_2, + self.bp_type, + self.__bindgen_anon_3, + self.__bindgen_anon_4, + self.branch_sample_type, + self.sample_regs_user, + self.sample_stack_user, + self.clockid, + self.sample_regs_intr, + self.aux_watermark, + self.sample_max_stack, + self.__reserved_2, + self.aux_sample_size, + self.__reserved_3, + self.sig_data, + self.config3 + ) } } impl perf_event_attr { @@ -2108,6 +2171,7 @@ pub union perf_event_mmap_page__bindgen_ty_1 { pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] +#[repr(align(8))] #[derive(Debug, Default, Copy, Clone)] #[non_exhaustive] pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { @@ -2574,7 +2638,36 @@ impl Default for perf_event_mmap_page { } impl ::std::fmt::Debug for perf_event_mmap_page { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}" , self . version , self . compat_version , self . lock , self . index , self . offset , self . time_enabled , self . time_running , self . __bindgen_anon_1 , self . pmc_width , self . time_shift , self . time_mult , self . time_offset , self . time_zero , self . size , self . __reserved_1 , self . time_cycles , self . time_mask , self . __reserved , self . data_head , self . data_tail , self . data_offset , self . data_size , self . aux_head , self . aux_tail , self . aux_offset , self . aux_size) + write!( + f, + "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}", + self.version, + self.compat_version, + self.lock, + self.index, + self.offset, + self.time_enabled, + self.time_running, + self.__bindgen_anon_1, + self.pmc_width, + self.time_shift, + self.time_mult, + self.time_offset, + self.time_zero, + self.size, + self.__reserved_1, + self.time_cycles, + self.time_mask, + self.__reserved, + self.data_head, + self.data_tail, + self.data_offset, + self.data_size, + self.aux_head, + self.aux_tail, + self.aux_offset, + self.aux_size + ) } } #[repr(C)] diff --git a/perf-event-open-sys/src/bindings_x86_64.rs b/perf-event-open-sys/src/bindings_x86_64.rs index 5fcb24e..dd0143f 100644 --- a/perf-event-open-sys/src/bindings_x86_64.rs +++ b/perf-event-open-sys/src/bindings_x86_64.rs @@ -21,7 +21,7 @@ #![allow(deref_nullptr)] // `bindgen_test_layout` tests use bogus code #![allow(clippy::all)] -/* automatically generated by rust-bindgen 0.69.4 */ +/* automatically generated by rust-bindgen 0.69.1 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] @@ -121,11 +121,11 @@ impl __IncompleteArrayField { } #[inline] pub unsafe fn as_slice(&self, len: usize) -> &[T] { - ::std::slice::from_raw_parts(self.as_ptr(), len) + unsafe { ::std::slice::from_raw_parts(self.as_ptr(), len) } } #[inline] pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { - ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + unsafe { ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) } } } impl ::std::fmt::Debug for __IncompleteArrayField { @@ -1438,7 +1438,70 @@ impl Default for perf_event_attr { } impl ::std::fmt::Debug for perf_event_attr { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}" , self . type_ , self . size , self . config , self . __bindgen_anon_1 , self . sample_type , self . read_format , self . disabled () , self . inherit () , self . pinned () , self . exclusive () , self . exclude_user () , self . exclude_kernel () , self . exclude_hv () , self . exclude_idle () , self . mmap () , self . comm () , self . freq () , self . inherit_stat () , self . enable_on_exec () , self . task () , self . watermark () , self . precise_ip () , self . mmap_data () , self . sample_id_all () , self . exclude_host () , self . exclude_guest () , self . exclude_callchain_kernel () , self . exclude_callchain_user () , self . mmap2 () , self . comm_exec () , self . use_clockid () , self . context_switch () , self . write_backward () , self . namespaces () , self . ksymbol () , self . bpf_event () , self . aux_output () , self . cgroup () , self . text_poke () , self . build_id () , self . inherit_thread () , self . remove_on_exec () , self . sigtrap () , self . __reserved_1 () , self . __bindgen_anon_2 , self . bp_type , self . __bindgen_anon_3 , self . __bindgen_anon_4 , self . branch_sample_type , self . sample_regs_user , self . sample_stack_user , self . clockid , self . sample_regs_intr , self . aux_watermark , self . sample_max_stack , self . __reserved_2 , self . aux_sample_size , self . __reserved_3 , self . sig_data , self . config3) + write!( + f, + "perf_event_attr {{ type: {:?}, size: {:?}, config: {:?}, __bindgen_anon_1: {:?}, sample_type: {:?}, read_format: {:?}, disabled : {:?}, inherit : {:?}, pinned : {:?}, exclusive : {:?}, exclude_user : {:?}, exclude_kernel : {:?}, exclude_hv : {:?}, exclude_idle : {:?}, mmap : {:?}, comm : {:?}, freq : {:?}, inherit_stat : {:?}, enable_on_exec : {:?}, task : {:?}, watermark : {:?}, precise_ip : {:?}, mmap_data : {:?}, sample_id_all : {:?}, exclude_host : {:?}, exclude_guest : {:?}, exclude_callchain_kernel : {:?}, exclude_callchain_user : {:?}, mmap2 : {:?}, comm_exec : {:?}, use_clockid : {:?}, context_switch : {:?}, write_backward : {:?}, namespaces : {:?}, ksymbol : {:?}, bpf_event : {:?}, aux_output : {:?}, cgroup : {:?}, text_poke : {:?}, build_id : {:?}, inherit_thread : {:?}, remove_on_exec : {:?}, sigtrap : {:?}, __reserved_1 : {:?}, __bindgen_anon_2: {:?}, bp_type: {:?}, __bindgen_anon_3: {:?}, __bindgen_anon_4: {:?}, branch_sample_type: {:?}, sample_regs_user: {:?}, sample_stack_user: {:?}, clockid: {:?}, sample_regs_intr: {:?}, aux_watermark: {:?}, sample_max_stack: {:?}, __reserved_2: {:?}, aux_sample_size: {:?}, __reserved_3: {:?}, sig_data: {:?}, config3: {:?} }}", + self.type_, + self.size, + self.config, + self.__bindgen_anon_1, + self.sample_type, + self.read_format, + self.disabled(), + self.inherit(), + self.pinned(), + self.exclusive(), + self.exclude_user(), + self.exclude_kernel(), + self.exclude_hv(), + self.exclude_idle(), + self.mmap(), + self.comm(), + self.freq(), + self.inherit_stat(), + self.enable_on_exec(), + self.task(), + self.watermark(), + self.precise_ip(), + self.mmap_data(), + self.sample_id_all(), + self.exclude_host(), + self.exclude_guest(), + self.exclude_callchain_kernel(), + self.exclude_callchain_user(), + self.mmap2(), + self.comm_exec(), + self.use_clockid(), + self.context_switch(), + self.write_backward(), + self.namespaces(), + self.ksymbol(), + self.bpf_event(), + self.aux_output(), + self.cgroup(), + self.text_poke(), + self.build_id(), + self.inherit_thread(), + self.remove_on_exec(), + self.sigtrap(), + self.__reserved_1(), + self.__bindgen_anon_2, + self.bp_type, + self.__bindgen_anon_3, + self.__bindgen_anon_4, + self.branch_sample_type, + self.sample_regs_user, + self.sample_stack_user, + self.clockid, + self.sample_regs_intr, + self.aux_watermark, + self.sample_max_stack, + self.__reserved_2, + self.aux_sample_size, + self.__reserved_3, + self.sig_data, + self.config3 + ) } } impl perf_event_attr { @@ -2152,6 +2215,7 @@ pub union perf_event_mmap_page__bindgen_ty_1 { pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, } #[repr(C)] +#[repr(align(8))] #[derive(Debug, Default, Copy, Clone)] #[non_exhaustive] pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { @@ -2618,7 +2682,36 @@ impl Default for perf_event_mmap_page { } impl ::std::fmt::Debug for perf_event_mmap_page { fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - write ! (f , "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}" , self . version , self . compat_version , self . lock , self . index , self . offset , self . time_enabled , self . time_running , self . __bindgen_anon_1 , self . pmc_width , self . time_shift , self . time_mult , self . time_offset , self . time_zero , self . size , self . __reserved_1 , self . time_cycles , self . time_mask , self . __reserved , self . data_head , self . data_tail , self . data_offset , self . data_size , self . aux_head , self . aux_tail , self . aux_offset , self . aux_size) + write!( + f, + "perf_event_mmap_page {{ version: {:?}, compat_version: {:?}, lock: {:?}, index: {:?}, offset: {:?}, time_enabled: {:?}, time_running: {:?}, __bindgen_anon_1: {:?}, pmc_width: {:?}, time_shift: {:?}, time_mult: {:?}, time_offset: {:?}, time_zero: {:?}, size: {:?}, __reserved_1: {:?}, time_cycles: {:?}, time_mask: {:?}, __reserved: {:?}, data_head: {:?}, data_tail: {:?}, data_offset: {:?}, data_size: {:?}, aux_head: {:?}, aux_tail: {:?}, aux_offset: {:?}, aux_size: {:?} }}", + self.version, + self.compat_version, + self.lock, + self.index, + self.offset, + self.time_enabled, + self.time_running, + self.__bindgen_anon_1, + self.pmc_width, + self.time_shift, + self.time_mult, + self.time_offset, + self.time_zero, + self.size, + self.__reserved_1, + self.time_cycles, + self.time_mask, + self.__reserved, + self.data_head, + self.data_tail, + self.data_offset, + self.data_size, + self.aux_head, + self.aux_tail, + self.aux_offset, + self.aux_size + ) } } #[repr(C)] diff --git a/perf-event-open-sys/src/functions.rs b/perf-event-open-sys/src/functions.rs index ff556c0..64f3cac 100644 --- a/perf-event-open-sys/src/functions.rs +++ b/perf-event-open-sys/src/functions.rs @@ -42,14 +42,16 @@ pub unsafe fn perf_event_open( group_fd: c_int, flags: c_ulong, ) -> c_int { - libc::syscall( - bindings::__NR_perf_event_open as libc::c_long, - attrs as *const bindings::perf_event_attr, - pid, - cpu, - group_fd, - flags, - ) as c_int + unsafe { + libc::syscall( + bindings::__NR_perf_event_open as libc::c_long, + attrs as *const bindings::perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) as c_int + } } #[allow(dead_code, non_snake_case)] @@ -76,7 +78,7 @@ pub mod ioctls { ({ $name:ident, $ioctl:ident, $arg_type:ty }) => { #[allow(clippy::missing_safety_doc)] pub unsafe fn $name(fd: c_int, arg: $arg_type) -> c_int { - untyped_ioctl(fd, bindings::$ioctl, arg) + unsafe { untyped_ioctl(fd, bindings::$ioctl, arg) } } }; } @@ -97,9 +99,11 @@ pub mod ioctls { } unsafe fn untyped_ioctl(fd: c_int, ioctl: bindings::perf_event_ioctls, arg: A) -> c_int { - // Depending on the libc implementation this may cast to either - // - c_int (musl or android), or, - // - c_ulong (glibc) - libc::ioctl(fd, ioctl as _, arg) + unsafe { + // Depending on the libc implementation this may cast to either + // - c_int (musl or android), or, + // - c_ulong (glibc) + libc::ioctl(fd, ioctl as _, arg) + } } } diff --git a/perf-event/Cargo.toml b/perf-event/Cargo.toml index 662d90d..3ccaf86 100644 --- a/perf-event/Cargo.toml +++ b/perf-event/Cargo.toml @@ -5,7 +5,7 @@ description = "A Rust interface to Linux performance monitoring" license = "MIT OR Apache-2.0" authors = ["Sean Lynch ", "Jim Blandy "] repository = "https://github.com/Phantomical/perf-event.git" -edition = "2018" +edition = "2024" readme = "README.md" documentation = "https://docs.rs/perf-event2/" keywords = ["linux", "perf"] diff --git a/perf-event/examples/cpufreq.rs b/perf-event/examples/cpufreq.rs index b921011..a3f5e03 100644 --- a/perf-event/examples/cpufreq.rs +++ b/perf-event/examples/cpufreq.rs @@ -1,8 +1,8 @@ use std::process::ExitCode; use std::time::Duration; -use perf_event::events::x86::{Msr, MsrId}; use perf_event::Builder; +use perf_event::events::x86::{Msr, MsrId}; fn run() -> std::io::Result<()> { let tsc_event = Msr::new(MsrId::TSC)?; diff --git a/perf-event/examples/insns-for-pid.rs b/perf-event/examples/insns-for-pid.rs index a545df3..3fbaccb 100644 --- a/perf-event/examples/insns-for-pid.rs +++ b/perf-event/examples/insns-for-pid.rs @@ -2,8 +2,8 @@ use std::thread::sleep; use std::time::Duration; use libc::pid_t; -use perf_event::events::Hardware; use perf_event::Builder; +use perf_event::events::Hardware; fn main() -> std::io::Result<()> { let pid: pid_t = std::env::args() diff --git a/perf-event/examples/kprobe.rs b/perf-event/examples/kprobe.rs index ce58f85..04175ab 100644 --- a/perf-event/examples/kprobe.rs +++ b/perf-event/examples/kprobe.rs @@ -1,8 +1,8 @@ use std::process::ExitCode; use std::time::Duration; -use perf_event::events::KProbe; use perf_event::Builder; +use perf_event::events::KProbe; fn run() -> std::io::Result<()> { let func = "__x64_sys_write"; diff --git a/perf-event/examples/println.rs b/perf-event/examples/println.rs index b4eee64..f705fce 100644 --- a/perf-event/examples/println.rs +++ b/perf-event/examples/println.rs @@ -1,5 +1,5 @@ -use perf_event::events::Hardware; use perf_event::Builder; +use perf_event::events::Hardware; fn main() -> std::io::Result<()> { let mut counter = Builder::new(Hardware::INSTRUCTIONS).build()?; diff --git a/perf-event/src/builder.rs b/perf-event/src/builder.rs index fbb1fef..358e0f1 100644 --- a/perf-event/src/builder.rs +++ b/perf-event/src/builder.rs @@ -13,8 +13,8 @@ use perf_event_open_sys::bindings; use crate::events::{Event, EventData}; use crate::sys::bindings::perf_event_attr; use crate::{ - check_errno_syscall, sys, Clock, Counter, Group, ReadFormat, SampleBranchFlag, SampleFlag, - SampleSkid, + Clock, Counter, Group, ReadFormat, SampleBranchFlag, SampleFlag, SampleSkid, + check_errno_syscall, sys, }; /// A builder for [`Counter`]s. diff --git a/perf-event/src/events/dynamic.rs b/perf-event/src/events/dynamic.rs index 721b060..1e09234 100644 --- a/perf-event/src/events/dynamic.rs +++ b/perf-event/src/events/dynamic.rs @@ -4,8 +4,8 @@ use std::{fmt, io}; use perf_event_open_sys::bindings::perf_event_attr; -use crate::events::x86::Msr; use crate::events::Event; +use crate::events::x86::Msr; used_in_docs!(Msr); diff --git a/perf-event/src/events/x86/msr.rs b/perf-event/src/events/x86/msr.rs index c319e9c..6344740 100644 --- a/perf-event/src/events/x86/msr.rs +++ b/perf-event/src/events/x86/msr.rs @@ -3,8 +3,8 @@ use std::io; use c_enum::c_enum; use perf_event_open_sys::bindings; -use crate::events::{CachedPmuType, Event}; use crate::Builder; +use crate::events::{CachedPmuType, Event}; used_in_docs!(Builder); diff --git a/perf-event/src/lib.rs b/perf-event/src/lib.rs index 742b90b..8c16de9 100644 --- a/perf-event/src/lib.rs +++ b/perf-event/src/lib.rs @@ -245,8 +245,8 @@ impl Counter { /// # Examples /// Enable an individual counter: /// ``` - /// use perf_event::events::Hardware; /// use perf_event::Builder; + /// use perf_event::events::Hardware; /// /// let mut counter = Builder::new(Hardware::INSTRUCTIONS).build()?; /// counter.enable()?; @@ -302,8 +302,8 @@ impl Counter { /// # Examples /// Disable a single counter: /// ``` - /// use perf_event::events::Hardware; /// use perf_event::Builder; + /// use perf_event::events::Hardware; /// /// let mut counter = Builder::new(Hardware::INSTRUCTIONS).build()?; /// counter.enable()?; @@ -347,8 +347,8 @@ impl Counter { /// # Examples /// Reset a single counter /// ``` - /// use perf_event::events::Hardware; /// use perf_event::Builder; + /// use perf_event::events::Hardware; /// /// let mut counter = Builder::new(Hardware::INSTRUCTIONS).build()?; /// counter.enable()?; @@ -396,8 +396,8 @@ impl Counter { /// current process. If you do this early enough, you can then track what /// libraries your process is loading. /// ``` - /// use perf_event::events::Software; /// use perf_event::Builder; + /// use perf_event::events::Software; /// /// let mut sampler = Builder::new(Software::DUMMY) /// .mmap(true) @@ -462,8 +462,8 @@ impl Counter { /// /// # Example /// ``` - /// use perf_event::events::Hardware; /// use perf_event::Builder; + /// use perf_event::events::Hardware; /// /// let mut counter = Builder::new(Hardware::INSTRUCTIONS).enabled(true).build()?; /// diff --git a/perf-event/src/sampler.rs b/perf-event/src/sampler.rs index f99ee8e..0ca34d5 100644 --- a/perf-event/src/sampler.rs +++ b/perf-event/src/sampler.rs @@ -11,7 +11,7 @@ use crate::sys::bindings::{ __BindgenBitfieldUnit, perf_event_header, perf_event_mmap_page, perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 as MmapPageFlags, }; -use crate::{check_errno_syscall, data, Counter}; +use crate::{Counter, check_errno_syscall, data}; used_in_docs!(Hardware); @@ -384,25 +384,27 @@ impl PmcReadData { /// - `page` must point to a valid instance of [`perf_event_mmap_page`] /// - `page` must remain valid for the lifetime of this struct. pub unsafe fn new(page: *const perf_event_mmap_page) -> Self { - let seq = atomic_load(std::ptr::addr_of!((*page).lock), Ordering::Acquire); - barrier!(); - - let capabilities = read_once!((*page).__bindgen_anon_1.capabilities); - - Self { - page, - seq, - flags: { - let mut flags = MmapPageFlags::default(); - flags._bitfield_1 = __BindgenBitfieldUnit::new(capabilities.to_ne_bytes()); - flags - }, - enabled: read_once!((*page).time_enabled), - running: read_once!((*page).time_running), + unsafe { + let seq = atomic_load(std::ptr::addr_of!((*page).lock), Ordering::Acquire); + barrier!(); + + let capabilities = read_once!((*page).__bindgen_anon_1.capabilities); + + Self { + page, + seq, + flags: { + let mut flags = MmapPageFlags::default(); + flags._bitfield_1 = __BindgenBitfieldUnit::new(capabilities.to_ne_bytes()); + flags + }, + enabled: read_once!((*page).time_enabled), + running: read_once!((*page).time_running), - index: read_once!((*page).index), - count: read_once!((*page).offset), - has_pmc_value: false, + index: read_once!((*page).index), + count: read_once!((*page).offset), + has_pmc_value: false, + } } } @@ -779,17 +781,21 @@ macro_rules! impl_atomic { type Atomic = $atomic; unsafe fn store(ptr: *const Self, val: Self, order: Ordering) { - assert_same_size!(Self, Self::Atomic); + unsafe { + assert_same_size!(Self, Self::Atomic); - let ptr = ptr as *const Self::Atomic; - (*ptr).store(val, order) + let ptr = ptr as *const Self::Atomic; + (*ptr).store(val, order) + } } unsafe fn load(ptr: *const Self, order: Ordering) -> Self { - assert_same_size!(Self, Self::Atomic); + unsafe { + assert_same_size!(Self, Self::Atomic); - let ptr = ptr as *const Self::Atomic; - (*ptr).load(order) + let ptr = ptr as *const Self::Atomic; + (*ptr).load(order) + } } } }; @@ -806,7 +812,7 @@ impl_atomic!(i64, std::sync::atomic::AtomicI64); /// - `ptr` must be valid for writes. /// - `ptr` must be properly aligned. unsafe fn atomic_store(ptr: *const T, val: T, order: Ordering) { - T::store(ptr, val, order) + unsafe { T::store(ptr, val, order) } } /// Perform an atomic read from the value stored at `ptr`. @@ -815,7 +821,7 @@ unsafe fn atomic_store(ptr: *const T, val: T, order: Ordering) { /// - `ptr` must be valid for reads. /// - `ptr` must be properly aligned. unsafe fn atomic_load(ptr: *const T, order: Ordering) -> T { - T::load(ptr, order) + unsafe { T::load(ptr, order) } } /// Read a performance monitoring counter via the `rdpmc` instruction. @@ -829,36 +835,38 @@ unsafe fn atomic_load(ptr: *const T, order: Ordering) -> T { /// them will likely lead to a SIGINT or other such signal. #[cfg(any(target_arch = "x86_64", target_arch = "x86"))] unsafe fn rdpmc(index: u32) -> u64 { - // This saves a few instructions for 64-bit since LLVM doesn't realize - // that the top 32 bits of RAX:RDX are cleared otherwise. - #[cfg(target_arch = "x86_64")] - { - let lo: u64; - let hi: u64; - - std::arch::asm!( - "rdpmc", - in("ecx") index, - out("rax") lo, - out("rdx") hi - ); - - lo | (hi << u32::BITS) - } - - #[cfg(target_arch = "x86")] - { - let lo: u32; - let hi: u32; - - std::arch::asm!( - "rdpmc", - in("ecx") index, - out("eax") lo, - out("edx") hi - ); - - (lo as u64) | ((hi as u64) << u32::BITS) + unsafe { + // This saves a few instructions for 64-bit since LLVM doesn't realize + // that the top 32 bits of RAX:RDX are cleared otherwise. + #[cfg(target_arch = "x86_64")] + { + let lo: u64; + let hi: u64; + + std::arch::asm!( + "rdpmc", + in("ecx") index, + out("rax") lo, + out("rdx") hi + ); + + lo | (hi << u32::BITS) + } + + #[cfg(target_arch = "x86")] + { + let lo: u32; + let hi: u32; + + std::arch::asm!( + "rdpmc", + in("ecx") index, + out("eax") lo, + out("edx") hi + ); + + (lo as u64) | ((hi as u64) << u32::BITS) + } } } diff --git a/perf-event/tests/breakpoint.rs b/perf-event/tests/breakpoint.rs index 8a28da0..058aae8 100644 --- a/perf-event/tests/breakpoint.rs +++ b/perf-event/tests/breakpoint.rs @@ -1,5 +1,5 @@ -use perf_event::events::Breakpoint; use perf_event::Builder; +use perf_event::events::Breakpoint; // Need a function that will not be optimized away or inlined by the compiler. #[inline(never)] diff --git a/perf-event/tests/sampling/mmap.rs b/perf-event/tests/sampling/mmap.rs index 98a34fd..a4b7267 100644 --- a/perf-event/tests/sampling/mmap.rs +++ b/perf-event/tests/sampling/mmap.rs @@ -1,6 +1,6 @@ use nix::unistd::SysconfVar; -use perf_event::events::Software; use perf_event::Builder; +use perf_event::events::Software; use perf_event_open_sys::bindings; use super::Hex;