@@ -11,6 +11,7 @@ use alloc::{
11
11
use core:: { ffi:: CStr , fmt:: Debug , ops:: RangeInclusive , ptr} ;
12
12
use std:: {
13
13
fs,
14
+ io:: { Read , Seek , SeekFrom } ,
14
15
os:: {
15
16
fd:: { AsRawFd , FromRawFd , OwnedFd } ,
16
17
raw:: c_void,
@@ -544,7 +545,7 @@ impl Default for IntelPTBuilder {
544
545
/// .inherit(false)
545
546
/// .perf_buffer_size(128 * PAGE_SIZE + PAGE_SIZE)
546
547
/// .unwrap()
547
- /// .perf_aux_buffer_size(2 * 1024 * 1024)
548
+ /// .perf_aux_buffer_size(4 * 1024 * 1024)
548
549
/// .unwrap()
549
550
/// .ip_filters(&[]);
550
551
/// assert_eq!(builder, IntelPTBuilder::default());
@@ -557,7 +558,7 @@ impl Default for IntelPTBuilder {
557
558
exclude_hv : true ,
558
559
inherit : false ,
559
560
perf_buffer_size : 128 * PAGE_SIZE + PAGE_SIZE ,
560
- perf_aux_buffer_size : 2 * 1024 * 1024 ,
561
+ perf_aux_buffer_size : 4 * 1024 * 1024 ,
561
562
ip_filters : Vec :: new ( ) ,
562
563
}
563
564
}
@@ -833,6 +834,28 @@ pub(crate) fn availability_in_linux() -> Result<(), String> {
833
834
}
834
835
}
835
836
837
+ /// Check if the `MSR IA32_VMX_MISC` has bit 14 set, which indicates that Intel PT is
838
+ /// available in VMX operations.
839
+ pub ( crate ) fn availability_in_vmx ( ) -> Result < bool , String > {
840
+ let error_prefix = "Failed to check for PT availability in VM operations: " ;
841
+ let mut msrs = fs:: OpenOptions :: new ( )
842
+ . read ( true )
843
+ . open ( "/dev/cpu/0/msr" )
844
+ . map_err ( |e| {
845
+ format ! (
846
+ "{error_prefix} Failed to open /dev/cpu/0/msr: {e} \
847
+ Make sure you have the `msr` kernel module loaded"
848
+ )
849
+ } ) ?;
850
+ msrs. seek ( SeekFrom :: Start ( 0x485 ) )
851
+ . map_err ( |e| format ! ( "{error_prefix} Failed to seek in /dev/cpu/0/msr: {e}" ) ) ?;
852
+ let mut buf = [ 0u8 ; 8 ] ;
853
+ msrs. read_exact ( & mut buf)
854
+ . map_err ( |e| format ! ( "{error_prefix} Failed to read MSR 0x485: {e}" ) ) ?;
855
+
856
+ Ok ( buf[ 1 ] & 0b0100_0000 != 0 )
857
+ }
858
+
836
859
fn new_perf_event_attr_intel_pt ( ) -> Result < perf_event_attr , Error > {
837
860
let type_ = match & * PERF_EVENT_TYPE {
838
861
Ok ( t) => Ok ( * t) ,
@@ -909,7 +932,7 @@ fn linux_version() -> Result<(usize, usize, usize), ()> {
909
932
let release = unsafe { CStr :: from_ptr ( uname_data. release . as_ptr ( ) ) } ;
910
933
let mut parts = release
911
934
. to_bytes ( )
912
- . split ( |& c| c == b'.' || c == b'-' )
935
+ . split ( |& c| matches ! ( c , b'.' | b'-' | b'+' ) )
913
936
. take ( 3 )
914
937
. map ( |s| String :: from_utf8_lossy ( s) . parse :: < usize > ( ) ) ;
915
938
if let ( Some ( Ok ( major) ) , Some ( Ok ( minor) ) , Some ( Ok ( patch) ) ) =
0 commit comments