Coverage Report

Created: 2025-10-12 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vtpm-td/deps/spdm-rs/external/ring/src/cpu.rs
Line
Count
Source
1
// Copyright 2016 Brian Smith.
2
//
3
// Permission to use, copy, modify, and/or distribute this software for any
4
// purpose with or without fee is hereby granted, provided that the above
5
// copyright notice and this permission notice appear in all copies.
6
//
7
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
8
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
10
// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
15
/// A witness indicating that CPU features have been detected and cached.
16
///
17
/// TODO: Eventually all feature detection logic should be done through
18
/// functions that accept a `Features` parameter, to guarantee that nothing
19
/// tries to read the cached values before they are written.
20
///
21
/// This is a zero-sized type so that it can be "stored" wherever convenient.
22
#[derive(Copy, Clone)]
23
pub(crate) struct Features(());
24
25
#[inline(always)]
26
0
pub(crate) fn features() -> Features {
27
    // We don't do runtime feature detection on aarch64-apple-* as all AAarch64
28
    // features we use are available on every device since the first devices.
29
    #[cfg(any(
30
        target_arch = "x86",
31
        target_arch = "x86_64",
32
        all(
33
            any(target_arch = "aarch64", target_arch = "arm"),
34
            any(
35
                target_os = "android",
36
                target_os = "fuchsia",
37
                target_os = "linux",
38
                target_os = "windows"
39
            )
40
        )
41
    ))]
42
    {
43
        static INIT: spin::Once<()> = spin::Once::new();
44
0
        let () = INIT.call_once(|| {
45
            #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
46
            {
47
                prefixed_extern! {
48
                    fn OPENSSL_cpuid_setup();
49
                }
50
0
                unsafe {
51
0
                    OPENSSL_cpuid_setup();
52
0
                }
53
            }
54
55
            #[cfg(any(target_arch = "aarch64", target_arch = "arm"))]
56
            {
57
                unsafe { arm::initialize_OPENSSL_armcap_P() }
58
            }
59
0
        });
60
    }
61
62
0
    Features(())
63
0
}
64
65
pub mod arm;
66
pub mod intel;