Skip to content

Commit 594192f

Browse files
committed
Auto merge of #2356 - devnexen:fbsd_ucontext_aarch64, r=Amanieu
freebsd arm64 ucontext addition.
2 parents 865c9fa + 2e3999d commit 594192f

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

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

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,130 @@ cfg_if! {
1717
}
1818
}
1919

20+
s_no_extra_traits! {
21+
pub struct gpregs {
22+
pub gp_x: [::register_t; 30],
23+
pub gp_lr: ::register_t,
24+
pub gp_sp: ::register_t,
25+
pub gp_elr: ::register_t,
26+
pub gp_spsr: u32,
27+
pub gp_pad: ::c_int,
28+
}
29+
30+
pub struct fpregs {
31+
pub fp_q: u128,
32+
pub fp_sr: u32,
33+
pub fp_cr: u32,
34+
pub fp_flags: ::c_int,
35+
pub fp_pad: ::c_int,
36+
}
37+
38+
pub struct mcontext_t {
39+
pub mc_gpregs: gpregs,
40+
pub mc_fpregs: fpregs,
41+
pub mc_flags: ::c_int,
42+
pub mc_pad: ::c_int,
43+
pub mc_spare: [u64; 8],
44+
}
45+
}
46+
47+
cfg_if! {
48+
if #[cfg(feature = "extra_traits")] {
49+
impl PartialEq for gpregs {
50+
fn eq(&self, other: &gpregs) -> bool {
51+
self.gp_x.iter().zip(other.gp_x.iter()).all(|(a, b)| a == b) &&
52+
self.gp_lr == other.gp_lr &&
53+
self.gp_sp == other.gp_sp &&
54+
self.gp_elr == other.gp_elr &&
55+
self.gp_spsr == other.gp_spsr &&
56+
self.gp_pad == other.gp_pad
57+
}
58+
}
59+
impl Eq for gpregs {}
60+
impl ::fmt::Debug for gpregs {
61+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
62+
f.debug_struct("gpregs")
63+
.field("gp_x", &self.gp_x)
64+
.field("gp_lr", &self.gp_lr)
65+
.field("gp_sp", &self.gp_sp)
66+
.field("gp_elr", &self.gp_elr)
67+
.field("gp_spsr", &self.gp_spsr)
68+
.field("gp_pad", &self.gp_pad)
69+
.finish()
70+
}
71+
}
72+
impl ::hash::Hash for gpregs {
73+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
74+
self.gp_x.hash(state);
75+
self.gp_lr.hash(state);
76+
self.gp_sp.hash(state);
77+
self.gp_elr.hash(state);
78+
self.gp_spsr.hash(state);
79+
self.gp_pad.hash(state);
80+
}
81+
}
82+
impl PartialEq for fpregs {
83+
fn eq(&self, other: &fpregs) -> bool {
84+
self.fp_q == other.fp_q &&
85+
self.fp_sr == other.fp_sr &&
86+
self.fp_cr == other.fp_cr &&
87+
self.fp_flags == other.fp_flags &&
88+
self.fp_pad == other.fp_pad
89+
}
90+
}
91+
impl Eq for fpregs {}
92+
impl ::fmt::Debug for fpregs {
93+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
94+
f.debug_struct("fpregs")
95+
.field("fp_q", &self.fp_q)
96+
.field("fp_sr", &self.fp_sr)
97+
.field("fp_cr", &self.fp_cr)
98+
.field("fp_flags", &self.fp_flags)
99+
.field("fp_pad", &self.fp_pad)
100+
.finish()
101+
}
102+
}
103+
impl ::hash::Hash for fpregs {
104+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
105+
self.fp_q.hash(state);
106+
self.fp_sr.hash(state);
107+
self.fp_cr.hash(state);
108+
self.fp_flags.hash(state);
109+
self.fp_pad.hash(state);
110+
}
111+
}
112+
impl PartialEq for mcontext_t {
113+
fn eq(&self, other: &mcontext_t) -> bool {
114+
self.mc_gpregs == other.mc_gpregs &&
115+
self.mc_fpregs == other.mc_fpregs &&
116+
self.mc_flags == other.mc_flags &&
117+
self.mc_pad == other.mc_pad &&
118+
self.mc_spare.iter().zip(other.mc_spare.iter()).all(|(a, b)| a == b)
119+
}
120+
}
121+
impl Eq for mcontext_t {}
122+
impl ::fmt::Debug for mcontext_t {
123+
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
124+
f.debug_struct("mcontext_t")
125+
.field("mc_gpregs", &self.mc_gpregs)
126+
.field("mc_fpregs", &self.mc_fpregs)
127+
.field("mc_flags", &self.mc_flags)
128+
.field("mc_pad", &self.mc_pad)
129+
.field("mc_spare", &self.mc_spare)
130+
.finish()
131+
}
132+
}
133+
impl ::hash::Hash for mcontext_t {
134+
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
135+
self.mc_gpregs.hash(state);
136+
self.mc_fpregs.hash(state);
137+
self.mc_flags.hash(state);
138+
self.mc_pad.hash(state);
139+
self.mc_spare.hash(state);
140+
}
141+
}
142+
}
143+
}
144+
20145
pub const MAP_32BIT: ::c_int = 0x00080000;
21146
pub const MINSIGSTKSZ: ::size_t = 4096; // 1024 * 4

0 commit comments

Comments
 (0)