1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
Copyright 2025 The Hyperlight Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/// Module for checking invariant TSC support and reading the timestamp counter
use ;
/// Check if the processor supports invariant TSC
///
/// Returns true if CPUID.80000007H:EDX[8] is set, indicating invariant TSC support
// TODO: Remove this when MSRV is raised above 1.89.
// On Rust 1.89, __cpuid requires `unsafe`; on newer compilers it is safe and
// clippy flags these blocks as unnecessary.
/// Read the timestamp counter
///
/// This function provides a high-performance timestamp by reading the TSC.
/// Should only be used when invariant TSC is supported for reliable timing.
///
/// # Safety
/// This function uses unsafe assembly instructions but is safe to call.
/// However, the resulting timestamp is only meaningful if invariant TSC is supported.