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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
https://github.com/briansmith/ring/pull/1007
--- cargo-crates/ring-0.16.20/Cargo.toml.orig 2020-12-02 03:20:32.000000000 +0100
+++ cargo-crates/ring-0.16.20/Cargo.toml 2020-12-09 09:54:26.615745000 +0100
@@ -64,10 +64,10 @@ wasm32_c = []
version = "0.3.37"
features = ["Crypto", "Window"]
default-features = false
-[target."cfg(any(target_arch = \"x86\",target_arch = \"x86_64\", all(any(target_arch = \"aarch64\", target_arch = \"arm\"), any(target_os = \"android\", target_os = \"fuchsia\", target_os = \"linux\"))))".dependencies.spin]
+[target."cfg(any(target_arch = \"x86\",target_arch = \"x86_64\", all(any(target_arch = \"aarch64\", target_arch = \"arm\"), any(target_os = \"android\", target_os = \"freebsd\", target_os = \"fuchsia\", target_os = \"linux\"))))".dependencies.spin]
version = "0.5.2"
default-features = false
-[target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.libc]
+[target."cfg(any(target_os = \"android\", target_os = \"freebsd\", target_os = \"linux\"))".dependencies.libc]
version = "0.2.69"
default-features = false
--- cargo-crates/ring-0.16.20/src/cpu.rs.orig 2020-11-30 21:30:03.000000000 +0100
+++ cargo-crates/ring-0.16.20/src/cpu.rs 2020-12-09 09:53:52.469225000 +0100
@@ -31,7 +31,7 @@ pub(crate) fn features() -> Features {
target_arch = "x86_64",
all(
any(target_arch = "aarch64", target_arch = "arm"),
- any(target_os = "android", target_os = "fuchsia", target_os = "linux")
+ any(target_os = "android", target_os = "fuchsia", target_os = "freebsd", target_os = "linux")
)
))]
{
@@ -49,7 +49,7 @@ pub(crate) fn features() -> Features {
#[cfg(all(
any(target_arch = "aarch64", target_arch = "arm"),
- any(target_os = "android", target_os = "fuchsia", target_os = "linux")
+ any(target_os = "android", target_os = "fuchsia", target_os = "freebsd", target_os = "linux")
))]
{
arm::setup();
@@ -62,28 +62,58 @@ pub(crate) fn features() -> Features {
pub(crate) mod arm {
#[cfg(all(
- any(target_os = "android", target_os = "linux"),
+ any(target_os = "android", target_os = "freebsd", target_os = "linux"),
any(target_arch = "aarch64", target_arch = "arm")
))]
pub fn setup() {
use libc::c_ulong;
+ #[cfg(target_os = "freebsd")]
+ use libc::{c_int, c_void};
+ #[cfg(target_os = "freebsd")]
+ extern crate std;
// XXX: The `libc` crate doesn't provide `libc::getauxval` consistently
// across all Android/Linux targets, e.g. musl.
+ #[cfg(any(target_os = "android", target_os = "linux"))]
extern "C" {
fn getauxval(type_: c_ulong) -> c_ulong;
}
+ #[cfg(target_os = "freebsd")]
+ extern "C" {
+ fn elf_aux_info(aux: c_int, buf: *mut c_void, buflen: c_int) -> c_int;
+ }
+
+ #[cfg(not(target_os = "freebsd"))]
const AT_HWCAP: c_ulong = 16;
+ #[cfg(target_os = "freebsd")]
+ const AT_HWCAP: c_int = 25;
+
#[cfg(target_arch = "aarch64")]
const HWCAP_NEON: c_ulong = 1 << 1;
#[cfg(target_arch = "arm")]
const HWCAP_NEON: c_ulong = 1 << 12;
+ #[cfg(not(target_os = "freebsd"))]
let caps = unsafe { getauxval(AT_HWCAP) };
+ #[cfg(target_os = "freebsd")]
+ let caps: c_ulong = 0;
+
+ #[cfg(target_os = "freebsd")]
+ {
+ let buffer : *mut c_void = { let t: *const c_ulong = ∩︀ t} as *mut c_void;
+ unsafe {
+ let _ret = elf_aux_info(
+ AT_HWCAP,
+ buffer,
+ std::mem::size_of_val(&caps) as i32
+ );
+ }
+ }
+
// We assume NEON is available on AARCH64 because it is a required
// feature.
#[cfg(target_arch = "aarch64")]
@@ -100,11 +130,26 @@ pub(crate) mod arm {
#[cfg(target_arch = "arm")]
const OFFSET: c_ulong = 0;
- #[cfg(target_arch = "arm")]
+ #[cfg(target_os = "freebsd")]
+ let buffer : *mut c_void = { let t: *const c_ulong = ∩︀ t} as *mut c_void;
+
+ #[cfg(not(target_os = "freebsd"))]
let caps = {
const AT_HWCAP2: c_ulong = 26;
unsafe { getauxval(AT_HWCAP2) }
};
+
+ #[cfg(target_os = "freebsd")]
+ {
+ const AT_HWCAP2: c_int = 26;
+ unsafe {
+ let _ret = elf_aux_info(
+ AT_HWCAP2,
+ buffer,
+ std::mem::size_of_val(&caps) as i32
+ );
+ };
+ }
const HWCAP_AES: c_ulong = 1 << 0 + OFFSET;
const HWCAP_PMULL: c_ulong = 1 << 1 + OFFSET;
|