summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDC <devnexen@gmail.com>2021-06-06 16:25:49 +0100
committerDC <devnexen@gmail.com>2021-06-07 23:26:38 +0100
commit783783d9af4e8bcf783f713f52374845ea70076b (patch)
tree88a05dea04611f203cf96599958705a9da66c043
parentf9ee729a53744048c1c529fefd28de3fd24faa5f (diff)
downloadrust-libc-783783d9af4e8bcf783f713f52374845ea70076b.tar.gz
dragonflybsd adding ucontext type
-rwxr-xr-xlibc-test/build.rs1
-rw-r--r--libc-test/semver/dragonfly.txt2
-rw-r--r--src/unix/bsd/freebsdlike/dragonfly/mod.rs141
3 files changed, 144 insertions, 0 deletions
diff --git a/libc-test/build.rs b/libc-test/build.rs
index a5d95f0380..276be49259 100755
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -1172,6 +1172,7 @@ fn test_dragonflybsd(target: &str) {
"syslog.h",
"termios.h",
"time.h",
+ "ucontext.h",
"ufs/ufs/quota.h",
"unistd.h",
"util.h",
diff --git a/libc-test/semver/dragonfly.txt b/libc-test/semver/dragonfly.txt
index aa429bd107..43e681dd61 100644
--- a/libc-test/semver/dragonfly.txt
+++ b/libc-test/semver/dragonfly.txt
@@ -1246,6 +1246,7 @@ lutimes
lwp_rtprio
lwpid_t
madvise
+mcontext_t
memmem
memrchr
memset_s
@@ -1379,6 +1380,7 @@ telldir
timex
truncate
ttyname_r
+ucontext_t
unmount
useconds_t
uselocale
diff --git a/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
index acaf13fe4e..b9bdafed4e 100644
--- a/src/unix/bsd/freebsdlike/dragonfly/mod.rs
+++ b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
@@ -25,6 +25,8 @@ pub type sem_t = *mut sem;
pub type cpuset_t = cpumask_t;
pub type cpu_set_t = cpumask_t;
+pub type register_t = ::c_long;
+
#[cfg_attr(feature = "extra_traits", derive(Debug))]
pub enum sem {}
impl ::Copy for sem {}
@@ -253,6 +255,51 @@ s_no_extra_traits! {
pub sigev_value: ::sigval,
__unused3: *mut ::c_void //actually a function pointer
}
+
+ pub struct mcontext_t {
+ pub mc_onstack: register_t,
+ pub mc_rdi: register_t,
+ pub mc_rsi: register_t,
+ pub mc_rdx: register_t,
+ pub mc_rcx: register_t,
+ pub mc_r8: register_t,
+ pub mc_r9: register_t,
+ pub mc_rax: register_t,
+ pub mc_rbx: register_t,
+ pub mc_rbp: register_t,
+ pub mc_r10: register_t,
+ pub mc_r11: register_t,
+ pub mc_r12: register_t,
+ pub mc_r13: register_t,
+ pub mc_r14: register_t,
+ pub mc_r15: register_t,
+ pub mc_xflags: register_t,
+ pub mc_trapno: register_t,
+ pub mc_addr: register_t,
+ pub mc_flags: register_t,
+ pub mc_err: register_t,
+ pub mc_rip: register_t,
+ pub mc_cs: register_t,
+ pub mc_rflags: register_t,
+ pub mc_rsp: register_t,
+ pub mc_ss: register_t,
+ pub mc_len: ::c_uint,
+ pub mc_fpformat: ::c_uint,
+ pub mc_ownedfp: ::c_uint,
+ __reserved: ::c_uint,
+ __unused: [::c_uint; 8],
+ pub mc_fpregs: [[::c_uint; 8]; 32],
+ }
+
+ pub struct ucontext_t {
+ pub uc_sigmask: ::sigset_t,
+ pub uc_mcontext: mcontext_t,
+ pub uc_link: *mut ucontext_t,
+ pub uc_stack: stack_t,
+ pub uc_cofunc: ::Option<unsafe extern "C" fn(uc: *mut ucontext_t, arg: *mut ::c_void)>,
+ pub uc_arg: *mut ::c_void,
+ __pad: [::c_int; 4],
+ }
}
cfg_if! {
@@ -452,6 +499,100 @@ cfg_if! {
self.sigev_value.hash(state);
}
}
+ impl PartialEq for mcontext_t {
+ fn eq(&self, other: &mcontext_t) -> bool {
+ self.mc_onstack == other.mc_onstack &&
+ self.mc_rdi == other.mc_rdi &&
+ self.mc_rsi == other.mc_rsi &&
+ self.mc_rdx == other.mc_rdx &&
+ self.mc_rcx == other.mc_rcx &&
+ self.mc_r8 == other.mc_r8 &&
+ self.mc_r9 == other.mc_r9 &&
+ self.mc_rax == other.mc_rax &&
+ self.mc_rbx == other.mc_rbx &&
+ self.mc_rbp == other.mc_rbp &&
+ self.mc_r10 == other.mc_r10 &&
+ self.mc_r11 == other.mc_r11 &&
+ self.mc_r12 == other.mc_r12 &&
+ self.mc_r13 == other.mc_r13 &&
+ self.mc_r14 == other.mc_r14 &&
+ self.mc_r15 == other.mc_r15 &&
+ self.mc_xflags == other.mc_xflags &&
+ self.mc_trapno == other.mc_trapno &&
+ self.mc_addr == other.mc_addr &&
+ self.mc_flags == other.mc_flags &&
+ self.mc_err == other.mc_err &&
+ self.mc_rip == other.mc_rip &&
+ self.mc_cs == other.mc_cs &&
+ self.mc_rflags == other.mc_rflags &&
+ self.mc_rsp == other.mc_rsp &&
+ self.mc_ss == other.mc_ss &&
+ self.mc_len == other.mc_len &&
+ self.mc_fpformat == other.mc_fpformat &&
+ self.mc_ownedfp == other.mc_ownedfp
+ // FIXME: self.mc_fpregs == other.mc_fpregs
+ }
+ }
+ impl Eq for mcontext_t {}
+ impl ::fmt::Debug for mcontext_t {
+ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
+ f.debug_struct("mcontext_t")
+ .field("mc_onstack", &self.mc_onstack)
+ .field("mc_rdi", &self.mc_rdi)
+ .field("mc_rsi", &self.mc_rsi)
+ .field("mc_rdx", &self.mc_rdx)
+ .field("mc_rcx", &self.mc_rcx)
+ .field("mc_r8", &self.mc_r8)
+ .field("mc_r9", &self.mc_r9)
+ .field("mc_rax", &self.mc_rax)
+ .field("mc_rbx", &self.mc_rbx)
+ .field("mc_rbp", &self.mc_rbp)
+ .field("mc_r10", &self.mc_r10)
+ .field("mc_r11", &self.mc_r11)
+ .field("mc_r12", &self.mc_r12)
+ .field("mc_r13", &self.mc_r13)
+ .field("mc_r14", &self.mc_r14)
+ .field("mc_r15", &self.mc_r15)
+ .field("mc_xflags", &self.mc_xflags)
+ .field("mc_trapno", &self.mc_trapno)
+ .field("mc_addr", &self.mc_addr)
+ .field("mc_flags", &self.mc_flags)
+ .field("mc_err", &self.mc_err)
+ .field("mc_rip", &self.mc_rip)
+ .field("mc_cs", &self.mc_cs)
+ .field("mc_rflags", &self.mc_rflags)
+ .field("mc_rsp", &self.mc_rsp)
+ .field("mc_ss", &self.mc_ss)
+ .field("mc_len", &self.mc_len)
+ .field("mc_fpformat", &self.mc_fpformat)
+ .field("mc_ownedfp", &self.mc_ownedfp)
+ // FIXME: .field("mc_fpregs", &self.mc_fpregs)
+ .finish()
+ }
+ }
+ impl PartialEq for ucontext_t {
+ fn eq(&self, other: &ucontext_t) -> bool {
+ self.uc_sigmask == other.uc_sigmask
+ && self.uc_mcontext == other.uc_mcontext
+ && self.uc_link == other.uc_link
+ && self.uc_stack == other.uc_stack
+ && self.uc_cofunc == other.uc_cofunc
+ && self.uc_arg == other.uc_arg
+ }
+ }
+ impl Eq for ucontext_t {}
+ impl ::fmt::Debug for ucontext_t {
+ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
+ f.debug_struct("ucontext_t")
+ .field("uc_sigmask", &self.uc_sigmask)
+ .field("uc_mcontext", &self.uc_mcontext)
+ .field("uc_link", &self.uc_link)
+ .field("uc_stack", &self.uc_stack)
+ .field("uc_cofunc", &self.uc_cofunc)
+ .field("uc_arg", &self.uc_arg)
+ .finish()
+ }
+ }
}
}