Skip to content

Commit fb2919c

Browse files
nathaniel-bennetttgross35
authored andcommitted
FreeBSD: Add ucontext_t, mcontext_t for all archs (rust-lang#3848)
[ gate ppc under `cfg(libc_align)` to meet msrv - Trevor ] (backport <rust-lang#3848>) (cherry picked from commit 2053d5b)
1 parent 7084470 commit fb2919c

File tree

8 files changed

+200
-25
lines changed

8 files changed

+200
-25
lines changed

libc-test/semver/freebsd-x86_64.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ _MC_HASSEGS
1313
fpreg
1414
fpreg32
1515
max_align_t
16-
mcontext_t
1716
reg
1817
reg32
19-
ucontext_t
2018
xmmreg

libc-test/semver/freebsd.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2020,6 +2020,7 @@ mallctl
20202020
mallctlbymib
20212021
mallctlnametomib
20222022
mallocx
2023+
mcontext_t
20232024
memmem
20242025
memrchr
20252026
memset_s
@@ -2350,13 +2351,14 @@ timer_t
23502351
timex
23512352
truncate
23522353
ttyname_r
2353-
uuidgen
2354+
ucontext_t
23542355
unmount
23552356
useconds_t
23562357
uselocale
23572358
utimensat
23582359
utmpx
23592360
utrace
2361+
uuidgen
23602362
vm_size_t
23612363
vmtotal
23622364
wait4

src/unix/bsd/freebsdlike/freebsd/arm.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,49 @@ pub type wchar_t = u32;
55
pub type time_t = i64;
66
pub type suseconds_t = i32;
77
pub type register_t = i32;
8+
pub type __greg_t = ::c_uint;
9+
pub type __gregset_t = [::__greg_t; 17];
10+
11+
s_no_extra_traits! {
12+
pub struct mcontext_t {
13+
pub __gregs: ::__gregset_t,
14+
pub mc_vfp_size: ::__size_t,
15+
pub mc_vfp_ptr: *mut ::c_void,
16+
pub mc_spare: [::c_uint; 33],
17+
}
18+
}
19+
20+
cfg_if! {
21+
if #[cfg(feature = "extra_traits")] {
22+
impl PartialEq for mcontext_t {
23+
fn eq(&self, other: &mcontext_t) -> bool {
24+
self.__gregs == other.__gregs &&
25+
self.mc_vfp_size == other.mc_vfp_size &&
26+
self.mc_vfp_ptr == other.mc_vfp_ptr &&
27+
self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b)
28+
}
29+
}
30+
impl Eq for mcontext_t {}
31+
impl ::fmt::Debug for mcontext_t {
32+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
33+
f.debug_struct("mcontext_t")
34+
.field("__gregs", &self.__gregs)
35+
.field("mc_vfp_size", &self.mc_vfp_size)
36+
.field("mc_vfp_ptr", &self.mc_vfp_ptr)
37+
.field("mc_spare", &self.mc_spare)
38+
.finish()
39+
}
40+
}
41+
impl ::hash::Hash for mcontext_t {
42+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
43+
self.__gregs.hash(state);
44+
self.mc_vfp_size.hash(state);
45+
self.mc_vfp_ptr.hash(state);
46+
self.mc_spare.hash(state);
47+
}
48+
}
49+
}
50+
}
851

952
// should be pub(crate), but that requires Rust 1.18.0
1053
cfg_if! {
@@ -16,5 +59,6 @@ cfg_if! {
1659
pub const _ALIGNBYTES: usize = 4 - 1;
1760
}
1861
}
62+
1963
pub const MAP_32BIT: ::c_int = 0x00080000;
2064
pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4

src/unix/bsd/freebsdlike/freebsd/mod.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,15 @@ s_no_extra_traits! {
16541654
_kf_cap_spare: u64,
16551655
pub kf_path: [::c_char; ::PATH_MAX as usize],
16561656
}
1657+
1658+
pub struct ucontext_t {
1659+
pub uc_sigmask: ::sigset_t,
1660+
pub uc_mcontext: ::mcontext_t,
1661+
pub uc_link: *mut ::ucontext_t,
1662+
pub uc_stack: ::stack_t,
1663+
pub uc_flags: ::c_int,
1664+
__spare__: [::c_int; 4],
1665+
}
16571666
}
16581667

16591668
cfg_if! {
@@ -2656,6 +2665,18 @@ cfg_if! {
26562665
self.kf_path.hash(state);
26572666
}
26582667
}
2668+
2669+
impl ::fmt::Debug for ucontext_t {
2670+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
2671+
f.debug_struct("ucontext_t")
2672+
.field("uc_sigmask", &self.uc_sigmask)
2673+
.field("uc_mcontext", &self.uc_mcontext)
2674+
.field("uc_link", &self.uc_link)
2675+
.field("uc_stack", &self.uc_stack)
2676+
.field("uc_flags", &self.uc_flags)
2677+
.finish()
2678+
}
2679+
}
26592680
}
26602681
}
26612682

src/unix/bsd/freebsdlike/freebsd/powerpc.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,72 @@ pub type time_t = i64;
66
pub type suseconds_t = i32;
77
pub type register_t = i32;
88

9+
cfg_if! {
10+
if #[cfg(libc_align)] {
11+
s_no_extra_traits! {
12+
#[repr(align(16))]
13+
pub struct mcontext_t {
14+
pub mc_vers: ::c_int,
15+
pub mc_flags: ::c_int,
16+
pub mc_onstack: ::c_int,
17+
pub mc_len: ::c_int,
18+
pub mc_avec: [u64; 64],
19+
pub mc_av: [u32; 2],
20+
pub mc_frame: [::register_t; 42],
21+
pub mc_fpreg: [u64; 33],
22+
pub mc_vsxfpreg: [u64; 32],
23+
}
24+
}
25+
}
26+
}
27+
28+
cfg_if! {
29+
if #[cfg(all(libc_align, feature = "extra_traits"))] {
30+
impl PartialEq for mcontext_t {
31+
fn eq(&self, other: &mcontext_t) -> bool {
32+
self.mc_vers == other.mc_vers &&
33+
self.mc_flags == other.mc_flags &&
34+
self.mc_onstack == other.mc_onstack &&
35+
self.mc_len == other.mc_len &&
36+
self.mc_avec == other.mc_avec &&
37+
self.mc_av == other.mc_av &&
38+
self.mc_frame == other.mc_frame &&
39+
self.mc_fpreg == other.mc_fpreg &&
40+
self.mc_vsxfpreg == other.mc_vsxfpreg
41+
}
42+
}
43+
impl Eq for mcontext_t {}
44+
impl ::fmt::Debug for mcontext_t {
45+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
46+
f.debug_struct("mcontext_t")
47+
.field("mc_vers", &self.mc_vers)
48+
.field("mc_flags", &self.mc_flags)
49+
.field("mc_onstack", &self.mc_onstack)
50+
.field("mc_len", &self.mc_len)
51+
.field("mc_avec", &self.mc_avec)
52+
.field("mc_av", &self.mc_av)
53+
.field("mc_frame", &self.mc_frame)
54+
.field("mc_fpreg", &self.mc_fpreg)
55+
.field("mc_vsxfpreg", &self.mc_vsxfpreg)
56+
.finish()
57+
}
58+
}
59+
impl ::hash::Hash for mcontext_t {
60+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
61+
self.mc_vers.hash(state);
62+
self.mc_flags.hash(state);
63+
self.mc_onstack.hash(state);
64+
self.mc_len.hash(state);
65+
self.mc_avec.hash(state);
66+
self.mc_av.hash(state);
67+
self.mc_frame.hash(state);
68+
self.mc_fpreg.hash(state);
69+
self.mc_vsxfpreg.hash(state);
70+
}
71+
}
72+
}
73+
}
74+
975
// should be pub(crate), but that requires Rust 1.18.0
1076
cfg_if! {
1177
if #[cfg(libc_const_size_of)] {

src/unix/bsd/freebsdlike/freebsd/powerpc64.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,72 @@ pub type time_t = i64;
66
pub type suseconds_t = i64;
77
pub type register_t = i64;
88

9+
cfg_if! {
10+
if #[cfg(libc_align)] {
11+
s_no_extra_traits! {
12+
#[repr(align(16))]
13+
pub struct mcontext_t {
14+
pub mc_vers: ::c_int,
15+
pub mc_flags: ::c_int,
16+
pub mc_onstack: ::c_int,
17+
pub mc_len: ::c_int,
18+
pub mc_avec: [u64; 64],
19+
pub mc_av: [u32; 2],
20+
pub mc_frame: [::register_t; 42],
21+
pub mc_fpreg: [u64; 33],
22+
pub mc_vsxfpreg: [u64; 32],
23+
}
24+
}
25+
}
26+
}
27+
28+
cfg_if! {
29+
if #[cfg(all(libc_align, feature = "extra_traits"))] {
30+
impl PartialEq for mcontext_t {
31+
fn eq(&self, other: &mcontext_t) -> bool {
32+
self.mc_vers == other.mc_vers &&
33+
self.mc_flags == other.mc_flags &&
34+
self.mc_onstack == other.mc_onstack &&
35+
self.mc_len == other.mc_len &&
36+
self.mc_avec == other.mc_avec &&
37+
self.mc_av == other.mc_av &&
38+
self.mc_frame == other.mc_frame &&
39+
self.mc_fpreg == other.mc_fpreg &&
40+
self.mc_vsxfpreg == other.mc_vsxfpreg
41+
}
42+
}
43+
impl Eq for mcontext_t {}
44+
impl ::fmt::Debug for mcontext_t {
45+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
46+
f.debug_struct("mcontext_t")
47+
.field("mc_vers", &self.mc_vers)
48+
.field("mc_flags", &self.mc_flags)
49+
.field("mc_onstack", &self.mc_onstack)
50+
.field("mc_len", &self.mc_len)
51+
.field("mc_avec", &self.mc_avec)
52+
.field("mc_av", &self.mc_av)
53+
.field("mc_frame", &self.mc_frame)
54+
.field("mc_fpreg", &self.mc_fpreg)
55+
.field("mc_vsxfpreg", &self.mc_vsxfpreg)
56+
.finish()
57+
}
58+
}
59+
impl ::hash::Hash for mcontext_t {
60+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
61+
self.mc_vers.hash(state);
62+
self.mc_flags.hash(state);
63+
self.mc_onstack.hash(state);
64+
self.mc_len.hash(state);
65+
self.mc_avec.hash(state);
66+
self.mc_av.hash(state);
67+
self.mc_frame.hash(state);
68+
self.mc_fpreg.hash(state);
69+
self.mc_vsxfpreg.hash(state);
70+
}
71+
}
72+
}
73+
}
74+
975
// should be pub(crate), but that requires Rust 1.18.0
1076
cfg_if! {
1177
if #[cfg(libc_const_size_of)] {

src/unix/bsd/freebsdlike/freebsd/x86.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,6 @@ s_no_extra_traits! {
4141
}
4242
}
4343

44-
s! {
45-
pub struct ucontext_t {
46-
pub uc_sigmask: ::sigset_t,
47-
pub uc_mcontext: ::mcontext_t,
48-
pub uc_link: *mut ::ucontext_t,
49-
pub uc_stack: ::stack_t,
50-
pub uc_flags: ::c_int,
51-
__spare__: [::c_int; 4],
52-
}
53-
}
54-
5544
// should be pub(crate), but that requires Rust 1.18.0
5645
cfg_if! {
5746
if #[cfg(libc_const_size_of)] {

src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -184,14 +184,3 @@ cfg_if! {
184184
}
185185
}
186186
}
187-
188-
s! {
189-
pub struct ucontext_t {
190-
pub uc_sigmask: ::sigset_t,
191-
pub uc_mcontext: ::mcontext_t,
192-
pub uc_link: *mut ::ucontext_t,
193-
pub uc_stack: ::stack_t,
194-
pub uc_flags: ::c_int,
195-
__spare__: [::c_int; 4],
196-
}
197-
}

0 commit comments

Comments
 (0)